[
  {
    "path": ".eslintignore",
    "content": ".next/\ncoverage/\nnode_modules/\npublic/\nesm/\nlib/\ntmp/\ndist/\nout/\n*.d.ts\nlerna.json\nnpm-shrinkwrap.json\npackage.json\npackage-lock.json\ntsconfig.json"
  },
  {
    "path": ".eslintrc.js",
    "content": "module.exports = {\n  root: true,\n  extends: [\n    // these are relics of nimbus, we could definitely simplify + consolidate\n    './config-eslint/base.js',\n    './config-eslint/next.js',\n    './config-eslint/typescript.js',\n    './config-eslint/prettier.js',\n  ],\n  overrides: [\n    {\n      files: '*.test.{js,jsx,ts,tsx}',\n      plugins: ['@vitest'],\n      extends: ['plugin:@vitest/legacy-recommended'],\n      rules: {\n        'import/no-extraneous-dependencies': 'off',\n      },\n    },\n    {\n      files: ['**/vitest.config.ts', 'vitest.workspace.ts'],\n      env: {\n        node: true,\n      },\n      rules: {\n        'import/no-unresolved': ['error', { ignore: ['^vitest'] }],\n        'import/no-extraneous-dependencies': 'off',\n      },\n    },\n    {\n      files: '*.{js,jsx,ts,tsx}',\n      rules: {\n        'arrow-parens': 'off',\n        'consistent-return': 'off',\n        'import/prefer-default-export': 'off',\n        'linebreak-style': 'off',\n        'lines-between-class-members': 'off',\n        'no-console': 'off',\n        'no-nested-ternary': 'off',\n        'no-param-reassign': 'warn',\n        'no-restricted-syntax': 'off',\n        'no-use-before-define': 'off',\n        'no-useless-rename': 'off',\n        'object-curly-newline': 'off',\n        'operator-linebreak': 'off',\n        'promise/param-names': 'off',\n        'react/destructuring-assignment': 'off',\n        'react/forbid-prop-types': 'off',\n        'react/jsx-curly-brace-presence': 'off',\n        'react/jsx-filename-extension': 'off',\n        'react/jsx-no-literals': 'off',\n        'react/jsx-props-no-spreading': 'off',\n        'react/jsx-sort-default-props': 'off',\n        'react/jsx-sort-props': 'off',\n        'react/no-array-index-key': 'off',\n        'react/no-children-prop': 'off',\n        'react/react-in-jsx-scope': 'off', // Not needed with automatic JSX transform (React 16.14+)\n        'react/require-default-props': 'off',\n        'react/sort-comp': 'off',\n        'react/sort-prop-types': 'off',\n        'unicorn/catch-error-name': 'off',\n        'unicorn/no-fn-reference-in-iterator': 'off',\n        'unicorn/prefer-node-append': 'off',\n      },\n    },\n    {\n      files: './packages/visx-demo/**',\n      rules: {\n        'import/no-unresolved': [\n          'error',\n          {\n            ignore: ['^!!raw-loader!.*'],\n          },\n        ],\n        'import/no-webpack-loader-syntax': 'off',\n        'jsx-a11y/anchor-is-valid': 'off',\n        'jsx-a11y/label-has-associated-control': 'off',\n        'jsx-a11y/no-onchange': 'off',\n        'no-alert': 'off',\n        'no-param-reassign': 'off',\n        'react/button-has-type': 'off',\n        'react/no-danger': 'off',\n        'react/no-unescaped-entities': 'off',\n        'react/prop-types': 'off',\n        'react/state-in-constructor': 'off',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": ".github/workflows/pull_request.yml",
    "content": "name: Pull request\n\non:\n  pull_request:\n    branches: [master]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v2 # checkout visx + this commit\n      - uses: actions/setup-node@v2\n        with:\n          node-version: '22.21.1'\n\n      - name: Enable Corepack\n        run: corepack enable\n\n      - name: Get yarn cache directory path\n        id: yarn-cache-dir-path\n        run: echo \"dir=$(yarn config get cacheFolder)\" >> $GITHUB_OUTPUT\n      - uses: actions/cache@v4.3.0\n        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)\n        with:\n          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}\n          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-yarn-\n\n      - name: Install dependencies\n        run: yarn install --immutable\n\n      - name: Ensure TS references are up to date\n        run: yarn type:update-refs && git diff --exit-code\n\n      - name: Ensure we have no ESM-only dependencies\n        run: yarn vendor-check\n\n      - name: Build packages\n        run: yarn build\n\n      - name: Run tests\n        run: yarn test\n        env:\n          CI: true\n\n      - name: Generate docs\n        run: yarn docs:generate\n\n      - name: Run lint\n        run: yarn lint\n\n      - name: Build visx site without failure\n        run: yarn build\n        working-directory: './packages/visx-demo/'\n\n      # @TODO\n      # this fails on forks, we need to update workflow event type to `pull_request_target`\n      # but this needs security review\n      # https://docs.github.com/en/actions/reference/events-that-trigger-workflows#pull_request_target\n      - name: Report package sizes\n        run: yarn build:sizes && yarn check:sizes\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n          PR_NUMBER: ${{ github.event.pull_request.number }}\n          GITHUB_REPOSITORY: $GITHUB_REPOSITORY\n          GITHUB_ACTOR: $GITHUB_ACTOR\n"
  },
  {
    "path": ".github/workflows/push.yml",
    "content": "name: Push\n\non:\n  push:\n    branches: [master]\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n    permissions:\n      contents: write       # Needed for git push operations\n      id-token: write       # Required for OIDC trusted publishing\n      pull-requests: write  # Needed to post release comments on PRs\n    steps:\n      - uses: actions/checkout@v2 # checkout visx + this commit\n        with:\n          # pulls all commits (needed for lerna to correctly release only changed packages)\n          fetch-depth: '0'\n      - uses: actions/setup-node@v2\n        with:\n          node-version: '22.21.1'\n          registry-url: 'https://registry.npmjs.org'\n\n      - name: Enable Corepack\n        run: corepack enable\n\n      - name: Get yarn cache directory path\n        id: yarn-cache-dir-path\n        run: echo \"dir=$(yarn config get cacheFolder)\" >> $GITHUB_OUTPUT\n      - uses: actions/cache@v4.3.0\n        id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)\n        with:\n          path: ${{ steps.yarn-cache-dir-path.outputs.dir }}\n          key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }}\n          restore-keys: |\n            ${{ runner.os }}-yarn-\n\n      - name: Install dependencies\n        run: yarn install --immutable\n\n      - name: Build packages\n        run: yarn build\n\n      - name: Generate docs\n        run: yarn docs:generate\n\n      - name: Commit package sizes\n        if: github.repository_owner == 'airbnb'\n        # note: `git diff-index --quiet HEAD`\n        #       has exit code 0 if there are changes vs HEAD, else nothing to commit\n        run: |\n          yarn build:sizes\n          git config user.name github-actions\n          git config user.email github-actions@github.com\n          git add .\n          git diff-index --quiet HEAD || git commit -m \"build(${GITHUB_SHA}): auto-commit package sizes\"\n          git push\n\n      - name: Release\n        if: github.repository_owner == 'airbnb'\n        # the following configurations are needed for lerna to\n        #   - have git credentials for committing tags\n        #   - use OIDC trusted publishing for npm (no token required)\n        run: |\n          git config user.name github-actions\n          git config user.email github-actions@github.com\n          yarn build:release\n        env:\n          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Build and deploy gallery\n        # below we\n        # - setup git credentials provided via actions/checkout@v2\n        # - initialize gh-pages-branch as an orphan branch so we don't build history\n        # - checkout the current commit and create gh-pages-root-dir/ as a new worktree\n        #   - outside that directory HEAD is detached at $GITHUB_SHA\n        #   - within that directory we are on the gh-pages-branch we just initialized\n        #     *worktree initialization should be in a root dir, otherwise the worktree inherits nested directories\n        # - build the static next.js site and copy the output into gh-pages-root-dir/\n        #   - we can't output directly into gh-pages-root-dir/ because next wipes the folder including .git\n        # - commit the demo site within gh-pages-root-dir/ onto the gh-pages-branch\n        # - push gh-pages-branch to visx as gh-pages. we overwrite history every time so it must be forced\n        run: |\n          git config user.name github-actions\n          git config user.email github-actions@github.com\n          git checkout --orphan gh-pages-branch\n          git reset --hard\n          touch .nojekyll\n          git add .nojekyll\n          git commit -m \"bot(${GITHUB_SHA}): initialize gh-pages branch\"\n          git checkout \"$GITHUB_SHA\"\n          git worktree add gh-pages-root-dir gh-pages-branch\n          cd ./packages/visx-demo/\n          yarn build\n          mv -v out/* ../../gh-pages-root-dir/\n          cd ../../gh-pages-root-dir/\n          touch CNAME\n          echo \"visx.airbnb.tech\" > CNAME\n          git add .\n          git commit -m \"bot(${GITHUB_SHA}): build gh-pages\"\n          git push -f \"https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY.git\" HEAD:gh-pages\n"
  },
  {
    "path": ".gitignore",
    "content": ".DS_Store\n*.DS_Store\n\n# Logs\nlogs/\n*.log\n\n# Cache\n.bundle/\n.eslintcache/\n.idea/\n.next/\n.npm/\n.nx/\n.vscode/\n\n# Directories\nbuild/\ncoverage/\ndist/\nesm/\nlib/\nnode_modules/\ntmp/\n\n# Custom\n*.min.js\n*.map\n\n# Configs (provided by Nimbus)\n.babelrc\n*.tsbuildinfo\nwebpack.config.js\n\n# Lock files\nnpm-shrinkwrap.json\npackage-lock.json\n\n# Yarn 4\n.yarn/*\n!.yarn/patches\n!.yarn/plugins\n!.yarn/releases\n!.yarn/sdks\n!.yarn/versions\n.pnp.*\n\n# Generated files\npackages/visx-demo/src/generated/\n"
  },
  {
    "path": ".npmignore",
    "content": ".DS_Store\n\n# Logs\nlogs/\n*.log\n\n# Cache\n.eslintcache/\n.idea/\n.npm/\n.next/\n.vscode/\n.yarnclean\n\n# Directories\nbuild/\ncoverage/\ndist/\npublic/\nnode_modules/\ntmp/\n\n# Custom\n*.min.js\n*.map\n\n# Configs\n.babelrc\n.dockerignore\n.eslintignore\n.eslintrc.js\n.flowconfig\n.gitattributes\n.gitignore\n.npmrc\n.prettierignore\n.yarnc\nbabel.config.js\ndangerfile.ts\njest.config.js\nprettier.config.js\ntsconfig.eslint.json\ntsconfig.json\ntsconfig.options.json\n*.tsbuildinfo\nwebpack.config.js\n"
  },
  {
    "path": ".npmrc",
    "content": "package-lock=false\n@visx:registry=https://registry.npmjs.org"
  },
  {
    "path": ".nvmrc",
    "content": "20\n"
  },
  {
    "path": ".prettierignore",
    "content": ".next/\ncoverage/\nnode_modules/\npublic/\nesm/\nlib/\ntmp/\ndist/\nout/\n*.d.ts\nlerna.json\nnpm-shrinkwrap.json\npackage.json\npackage-lock.json\ntsconfig.json\ntsconfig.eslint.json\ntsconfig.options.json\nCHANGELOG.md\n/.nx/workspace-data"
  },
  {
    "path": ".yarnrc.yml",
    "content": "enableGlobalCache: false\n\nnodeLinker: node-modules\n\nlogFilters:\n  - pattern: \"* doesn't provide react (*)*\"\n    level: \"discard\"\n  - pattern: \"* doesn't provide react-dom (*)*\"\n    level: \"discard\"\n  - pattern: \"* doesn't provide @react-spring/web (*)*\"\n    level: \"discard\"\n  - pattern: \"* doesn't provide webpack (*)*\"\n    level: \"discard\"\n  - pattern: \"Some peer dependencies are incorrectly met*\"\n    level: \"discard\"\n"
  },
  {
    "path": "ATTRIBUTION.md",
    "content": "[Fossa Attribution File](https://app.fossa.io/reports/dd5850c1-1d4e-4759-9e3e-563f83945bbd)\n"
  },
  {
    "path": "CHANGELOG.md",
    "content": "# Changelog\n- [v3.12.0](#v3120)\n- [v3.11.0](#v3110)\n- [v3.10.4](#v3104)\n- [v3.10.3](#v3103)\n- [v3.10.2](#v3102)\n- [v3.10.1](#v3101)\n- [v3.10.0](#v3100)\n- [v3.9.0](#v390)\n<details>\n  <summary>Older Releases...</summary>\n  <ul>\n  <li><a href=\"#v380\">v3.8.0</a></li>\n  <li><a href=\"#v370\">v3.7.0</a></li>\n  <li><a href=\"#v361\">v3.6.1</a></li>\n  <li><a href=\"#v360\">v3.6.0</a></li>\n  <li><a href=\"#v351\">v3.5.1</a></li>\n  <li><a href=\"#v350\">v3.5.0</a></li>\n  <li><a href=\"#v341\">v3.4.1</a></li>\n  <li><a href=\"#v340\">v3.4.0</a></li>\n  <li><a href=\"#v330\">v3.3.0</a></li>\n  <li><a href=\"#v321\">v3.2.1</a></li>\n  <li><a href=\"#v320\">v3.2.0</a></li>\n  <li><a href=\"#v313\">v3.1.3</a></li>\n  <li><a href=\"#v312\">v3.1.2</a></li>\n  <li><a href=\"#v311\">v3.1.1</a></li>\n  <li><a href=\"#v310\">v3.1.0</a></li>\n  <li><a href=\"#v302\">v3.0.2</a></li>\n  <li><a href=\"#v301\">v3.0.1</a></li>\n  <li><a href=\"#v300\">v3.0.0</a></li>\n  <li><a href=\"#v2180\">v2.18.0</a></li>\n  <li><a href=\"#v2170\">v2.17.0</a></li>\n  <li><a href=\"#v2161\">v2.16.1</a></li>\n  <li><a href=\"#v2160\">v2.16.0</a></li>\n  <li><a href=\"#v2151\">v2.15.1</a></li>\n  <li><a href=\"#v2150\">v2.15.0</a></li>\n  <li><a href=\"#v2140\">v2.14.0</a></li>\n  <li><a href=\"#v2130\">v2.13.0</a></li>\n  <li><a href=\"#v2122\">v2.12.2</a></li>\n  <li><a href=\"#v2121\">v2.12.1</a></li>\n  <li><a href=\"#v2120\">v2.12.0</a></li>\n  <li><a href=\"#v2111\">v2.11.1</a></li>\n  <li><a href=\"#v2110\">v2.11.0</a></li>\n  <li><a href=\"#v2102\">v2.10.2</a></li>\n  <li><a href=\"#v2101\">v2.10.1</a></li>\n  <li><a href=\"#v2100\">v2.10.0</a></li>\n  <li><a href=\"#v292\">v2.9.2</a></li>\n  <li><a href=\"#v291\">v2.9.1</a></li>\n  <li><a href=\"#v290\">v2.9.0</a></li>\n  <li><a href=\"#v280\">v2.8.0</a></li>\n  <li><a href=\"#v271\">v2.7.1</a></li>\n  <li><a href=\"#v270\">v2.7.0</a></li>\n  <li><a href=\"#v261\">v2.6.1</a></li>\n  <li><a href=\"#v260\">v2.6.0</a></li>\n  <li><a href=\"#v250\">v2.5.0</a></li>\n  <li><a href=\"#v241\">v2.4.1</a></li>\n  <li><a href=\"#v240\">v2.4.0</a></li>\n  <li><a href=\"#v230\">v2.3.0</a></li>\n  <li><a href=\"#v222\">v2.2.2</a></li>\n  <li><a href=\"#v221\">v2.2.1</a></li>\n  <li><a href=\"#v220\">v2.2.0</a></li>\n  <li><a href=\"#v212\">v2.1.2</a></li>\n  <li><a href=\"#v211\">v2.1.1</a></li>\n  <li><a href=\"#v210\">v2.1.0</a></li>\n  <li><a href=\"#v1181\">v1.18.1</a></li>\n  <li><a href=\"#v1180\">v1.18.0</a></li>\n  <li><a href=\"#v1171\">v1.17.1</a></li>\n  <li><a href=\"#v1170\">v1.17.0</a></li>\n  <li><a href=\"#v1161\">v1.16.1</a></li>\n  <li><a href=\"#v1160\">v1.16.0</a></li>\n  <li><a href=\"#v1150\">v1.15.0</a></li>\n  <li><a href=\"#v1141\">v1.14.1</a></li>\n  <li><a href=\"#v1140\">v1.14.0</a></li>\n  <li><a href=\"#v1130\">v1.13.0</a></li>\n  <li><a href=\"#v1120\">v1.12.0</a></li>\n  <li><a href=\"#v1112\">v1.11.2</a></li>\n  <li><a href=\"#v1111\">v1.11.1</a></li>\n  <li><a href=\"#v1110\">v1.11.0</a></li>\n  <li><a href=\"#v1101\">v1.10.1</a></li>\n  <li><a href=\"#v1100\">v1.10.0</a></li>\n  <li><a href=\"#v191\">v1.9.1</a></li>\n  <li><a href=\"#v190\">v1.9.0</a></li>\n  <li><a href=\"#v180\">v1.8.0</a></li>\n  <li><a href=\"#v174\">v1.7.4</a></li>\n  <li><a href=\"#v173\">v1.7.3</a></li>\n  <li><a href=\"#v172\">v1.7.2</a></li>\n  <li><a href=\"#v171\">v1.7.1</a></li>\n  <li><a href=\"#v170\">v1.7.0</a></li>\n  <li><a href=\"#v161\">v1.6.1</a></li>\n  <li><a href=\"#v160\">v1.6.0</a></li>\n  <li><a href=\"#v150\">v1.5.0</a></li>\n  <li><a href=\"#v140\">v1.4.0</a></li>\n  <li><a href=\"#v130\">v1.3.0</a></li>\n  <li><a href=\"#v120\">v1.2.0</a></li>\n  <li><a href=\"#v110\">v1.1.0</a></li>\n  <li><a href=\"#v100\">v1.0.0</a></li>\n  <li><a href=\"#v00199\">v0.0.199</a></li>\n  <li><a href=\"#v00198\">v0.0.198</a></li>\n  <li><a href=\"#v00197\">v0.0.197</a></li>\n  <li><a href=\"#v00196\">v0.0.196</a></li>\n  <li><a href=\"#v00195\">v0.0.195</a></li>\n  <li><a href=\"#v00194\">v0.0.194</a></li>\n  <li><a href=\"#v00193\">v0.0.193</a></li>\n  <li><a href=\"#v00192\">v0.0.192</a></li>\n  <li><a href=\"#v00191\">v0.0.191</a></li>\n  <li><a href=\"#v00190\">v0.0.190</a></li>\n  <li><a href=\"#v00189\">v0.0.189</a></li>\n  <li><a href=\"#v00188\">v0.0.188</a></li>\n  <li><a href=\"#v00187\">v0.0.187</a></li>\n  <li><a href=\"#v00186\">v0.0.186</a></li>\n  <li><a href=\"#v00185\">v0.0.185</a></li>\n  <li><a href=\"#v00184\">v0.0.184</a></li>\n  <li><a href=\"#v00183\">v0.0.183</a></li>\n  <li><a href=\"#v00182\">v0.0.182</a></li>\n  <li><a href=\"#v00181\">v0.0.181</a></li>\n  <li><a href=\"#v00180\">v0.0.180</a></li>\n  <li><a href=\"#v00179\">v0.0.179</a></li>\n  <li><a href=\"#v00178\">v0.0.178</a></li>\n  <li><a href=\"#v00177\">v0.0.177</a></li>\n  <li><a href=\"#v00176\">v0.0.176</a></li>\n  <li><a href=\"#v00175\">v0.0.175</a></li>\n  <li><a href=\"#v00174\">v0.0.174</a></li>\n  <li><a href=\"#v00173\">v0.0.173</a></li>\n  <li><a href=\"#v00172\">v0.0.172</a></li>\n  <li><a href=\"#v00171\">v0.0.171</a></li>\n  <li><a href=\"#v00170\">v0.0.170</a></li>\n  <li><a href=\"#v00169\">v0.0.169</a></li>\n  <li><a href=\"#v00168\">v0.0.168</a></li>\n  <li><a href=\"#v00167\">v0.0.167</a></li>\n  <li><a href=\"#v00166\">v0.0.166</a></li>\n  <li><a href=\"#v00165\">v0.0.165</a></li>\n  <li><a href=\"#v00164\">v0.0.164</a></li>\n  <li><a href=\"#v00163\">v0.0.163</a></li>\n  <li><a href=\"#v00162\">v0.0.162</a></li>\n  <li><a href=\"#v00161\">v0.0.161</a></li>\n  <li><a href=\"#v00160\">v0.0.160</a></li>\n  <li><a href=\"#v00159\">v0.0.159</a></li>\n  <li><a href=\"#v00158\">v0.0.158</a></li>\n  <li><a href=\"#v00157\">v0.0.157</a></li>\n  <li><a href=\"#v00156\">v0.0.156</a></li>\n  <li><a href=\"#v00155\">v0.0.155</a></li>\n  <li><a href=\"#v00154\">v0.0.154</a></li>\n  <li><a href=\"#v00153\">v0.0.153</a></li>\n  <li><a href=\"#v00152\">v0.0.152</a></li>\n  <li><a href=\"#v00151\">v0.0.151</a></li>\n  <li><a href=\"#v00150\">v0.0.150</a></li>\n  <li><a href=\"#v00149\">v0.0.149</a></li>\n  <li><a href=\"#v00148\">v0.0.148</a></li>\n  <li><a href=\"#v00147\">v0.0.147</a></li>\n  <li><a href=\"#v00146\">v0.0.146</a></li>\n  <li><a href=\"#v00145\">v0.0.145</a></li>\n  <li><a href=\"#v00144\">v0.0.144</a></li>\n  <li><a href=\"#v00143\">v0.0.143</a></li>\n  <li><a href=\"#v00142\">v0.0.142</a></li>\n  <li><a href=\"#v00141\">v0.0.141</a></li>\n  <li><a href=\"#v00140\">v0.0.140</a></li>\n  <li><a href=\"#v00139\">v0.0.139</a></li>\n  <li><a href=\"#v00138\">v0.0.138</a></li>\n  <li><a href=\"#v00137\">v0.0.137</a></li>\n  <li><a href=\"#v00136\">v0.0.136</a></li>\n  <li><a href=\"#v00135\">v0.0.135</a></li>\n  <li><a href=\"#v00134\">v0.0.134</a></li>\n  <li><a href=\"#v00133\">v0.0.133</a></li>\n  <li><a href=\"#v00132\">v0.0.132</a></li>\n  <li><a href=\"#v00131\">v0.0.131</a></li>\n  <li><a href=\"#v00130\">v0.0.130</a></li>\n  <li><a href=\"#v00129\">v0.0.129</a></li>\n  <li><a href=\"#v00128\">v0.0.128</a></li>\n  <li><a href=\"#v00127\">v0.0.127</a></li>\n  <li><a href=\"#v00126\">v0.0.126</a></li>\n  <li><a href=\"#v00125\">v0.0.125</a></li>\n  <li><a href=\"#v00124\">v0.0.124</a></li>\n  <li><a href=\"#v00123\">v0.0.123</a></li>\n  <li><a href=\"#v00122\">v0.0.122</a></li>\n  <li><a href=\"#v00121\">v0.0.121</a></li>\n  <li><a href=\"#v00120\">v0.0.120</a></li>\n  <li><a href=\"#v00114\">v0.0.114</a></li>\n  <li><a href=\"#v00113\">v0.0.113</a></li>\n  <li><a href=\"#v00112\">v0.0.112</a></li>\n</ul>\n</details>\n\n------\n# v3.12.0 (2024-11-07)\n\n#### :rocket: Enhancements\n\n- feat(sankey): add @visx/sankey [#1880](https://github.com/airbnb/visx/pull/1880)\n\n### :memo: Documentation\n\n- Fix small error in the code example in the \"Theming\" section [#1863](https://github.com/airbnb/visx/pull/1863)\n  \n#### :trophy: Contributors\n- [jacksonhardaker](https://github.com/jacksonhardaker)\n- [maurer2](https://github.com/maurer2)\n\n# v3.11.0 (2024-05-29)\n\n#### :rocket: Enhancements\n\n- feat(xychart): improve performance when hovering with tooltip [#1842](https://github.com/airbnb/visx/pull/1842)\n\n### :memo: Documentation\n\n- feat(xychart): improve performance when hovering with tooltip [#1842](https://github.com/airbnb/visx/pull/1842)\n  \n#### :trophy: Contributors\n- [nikaspran](https://github.com/nikaspran)\n\n# v3.10.4 (2024-05-24)\n\n#### :bug: Bug Fix\n\n- brush: fix brush jumping around after mouseup [#1836](https://github.com/airbnb/visx/pull/1836)\n  \n#### :trophy: Contributors\n- [tfineberg4](https://github.com/tfineberg4)\n\n# v3.10.3 (2024-05-20)\n\n#### :bug: Bug Fix\n\n- Fix LegendThreshold [#1831](https://github.com/airbnb/visx/pull/1831)\n  \n#### :trophy: Contributors\n- [ZachBarbre](https://github.com/ZachBarbre)\n\n# v3.10.2 (2024-03-09)\n\n#### :bug: Bug Fix\n\n- fix: explicit type exports in @visx/responsive [#1809](https://github.com/airbnb/visx/pull/1809)\n  \n#### :trophy: Contributors\n- [paolostyle](https://github.com/paolostyle)\n\n# v3.10.1 (2024-03-08)\n\n#### Uncategorized\n\n- Revert \"new(axis): add shapeRendering prop to Axis\" [#1808](https://github.com/airbnb/visx/pull/1808)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v3.10.0 (2024-03-08)\n\n#### :rocket: Enhancements\n\n- fix: Improve typing in @visx/responsive enhancers [#1783](https://github.com/airbnb/visx/pull/1783)\n\n#### :bug: Bug Fix\n\n- fix: Improve typing in @visx/responsive enhancers [#1783](https://github.com/airbnb/visx/pull/1783)\n  \n#### :trophy: Contributors\n- [paolostyle](https://github.com/paolostyle)\n\n# v3.9.0 (2024-03-04)\n\n#### :rocket: Enhancements\n\n- new(axis): add shapeRendering prop to Axis [#1739](https://github.com/airbnb/visx/pull/1739)\n\n#### :bug: Bug Fix\n\n- internal: specify node js version [#1796](https://github.com/airbnb/visx/pull/1796)\n- docs: remove broken links from 'In the wild' [#1800](https://github.com/airbnb/visx/pull/1800)\n\n### :memo: Documentation\n\n- docs: remove broken links from 'In the wild' [#1800](https://github.com/airbnb/visx/pull/1800)\n- Adds to \"in the wild\", new site using visx/drag [#1799](https://github.com/airbnb/visx/pull/1799)\n\n### :house:  Internal\n\n- internal: specify node js version [#1796](https://github.com/airbnb/visx/pull/1796)\n  \n#### :trophy: Contributors\n- [BrianCurrie](https://github.com/BrianCurrie)\n- [Lonami](https://github.com/Lonami)\n- [mcioffi](https://github.com/mcioffi)\n- [sleonia](https://github.com/sleonia)\n\n# v3.8.0 (2024-01-25)\n\n#### :rocket: Enhancements\n\n- fix(axis): include defaultTextProps in Axis labelProps [#1791](https://github.com/airbnb/visx/pull/1791)\n  \n#### :trophy: Contributors\n- [RyKilleen](https://github.com/RyKilleen)\n\n# v3.7.0 (2024-01-23)\n\n#### :rocket: Enhancements\n\n- fix: radial bars demo import in CodeSandbox [#1786](https://github.com/airbnb/visx/pull/1786)\n- feat(xychart): print console.info only in dev mode [#1792](https://github.com/airbnb/visx/pull/1792)\n- feat(demo): add radial bars demo using Arc [#1785](https://github.com/airbnb/visx/pull/1785)\n\n#### :bug: Bug Fix\n\n- fix: radial bars demo import in CodeSandbox [#1786](https://github.com/airbnb/visx/pull/1786)\n- fix: typo in DragITile description [#1779](https://github.com/airbnb/visx/pull/1779)\n\n### :memo: Documentation\n\n- fix: typo in DragITile description [#1779](https://github.com/airbnb/visx/pull/1779)\n- docs: add ridge line chart with KDE to 'in the wild' [#1781](https://github.com/airbnb/visx/pull/1781)\n  \n#### :trophy: Contributors\n- [adamzuch](https://github.com/adamzuch)\n- [jmssnr](https://github.com/jmssnr)\n- [sleonia](https://github.com/sleonia)\n\n# v3.6.1 (2023-12-15)\n\n#### :bug: Bug Fix\n\n- fix(brush): fix issue 'update was scheduled' warning on resetOnEnd #1465 [#1778](https://github.com/airbnb/visx/pull/1778)\n  \n#### :trophy: Contributors\n- [dsdevgit](https://github.com/dsdevgit)\n\n# v3.6.0 (2023-12-07)\n\n#### :rocket: Enhancements\n\n- feat(brush): disable drag overlay [#1744](https://github.com/airbnb/visx/pull/1744)\n  \n#### :trophy: Contributors\n- [Onxi95](https://github.com/Onxi95)\n\n# v3.5.1 (2023-11-17)\n\n#### :bug: Bug Fix\n\n- fix: correctly pass through offset from AnimatedGridRows/Columns [#1769](https://github.com/airbnb/visx/pull/1769)\n\n### :memo: Documentation\n\n- docs: add Superstardle in the wild [#1768](https://github.com/airbnb/visx/pull/1768)\n  \n#### :trophy: Contributors\n- [henrinormak](https://github.com/henrinormak)\n- [mcioffi](https://github.com/mcioffi)\n\n# v3.5.0 (2023-11-13)\n\n#### :rocket: Enhancements\n\n- new(geo, vendor): add `d3-geo@3` to `visx-vendor`, support `geoPath.digits(n)` [#1767](https://github.com/airbnb/visx/pull/1767)\n\n### :memo: Documentation\n\n- Add to \"In the wild\" [#1765](https://github.com/airbnb/visx/pull/1765)\n  \n#### :trophy: Contributors\n- [kachkaev](https://github.com/kachkaev)\n- [physicianfyi](https://github.com/physicianfyi)\n\n# v3.4.1 (2023-10-26)\n\n#### :bug: Bug Fix\n\n- visx-axis AxisRenderer.tsx: resolve circular dependency [#1762](https://github.com/airbnb/visx/pull/1762)\n  \n#### :trophy: Contributors\n- [ithrforu](https://github.com/ithrforu)\n\n# v3.4.0 (2023-10-10)\n\n#### :rocket: Enhancements\n\n- feat(axis): Expose innerRef prop on the various Axis components [#1749](https://github.com/airbnb/visx/pull/1749)\n  \n#### :trophy: Contributors\n- [SheaJanke](https://github.com/SheaJanke)\n\n# v3.3.0 (2023-07-11)\n\n#### :rocket: Enhancements\n\n- Create new @visx/delaunay package [#1678](https://github.com/airbnb/visx/pull/1678)\n\n#### :bug: Bug Fix\n\n- Fix glyph positioning in the xychart demo.  [#1730](https://github.com/airbnb/visx/pull/1730)\n  \n#### :trophy: Contributors\n- [SheaJanke](https://github.com/SheaJanke)\n\n# v3.2.1 (2023-07-06)\n\n#### :bug: Bug Fix\n\n- fix(xychart): Cleanup async function in TooltipProvider [#1728](https://github.com/airbnb/visx/pull/1728)\n  \n#### :trophy: Contributors\n- [SheaJanke](https://github.com/SheaJanke)\n\n# v3.2.0 (2023-06-29)\n\n#### :bug: Bug Fix\n\n- fix: vendor esm-only packages [#1716](https://github.com/airbnb/visx/pull/1716)\n- vendor: add files entry to package.json [#1724](https://github.com/airbnb/visx/pull/1724)\n- docs(xychart): fix typo [#1714](https://github.com/airbnb/visx/pull/1714)\n\n### :memo: Documentation\n\n- docs(xychart): fix typo [#1714](https://github.com/airbnb/visx/pull/1714)\n\n### :house:  Internal\n\n- fix: vendor esm-only packages [#1716](https://github.com/airbnb/visx/pull/1716)\n- github: update @octokit/openapi-types to fix release script [#1722](https://github.com/airbnb/visx/pull/1722)\n- github: fix release types and logic [#1723](https://github.com/airbnb/visx/pull/1723)\n  \n#### :trophy: Contributors\n- [sshsphere](https://github.com/sshsphere)\n- [williaster](https://github.com/williaster)\n\n# v3.1.3 (2023-06-28)\n\n#### :bug: Bug Fix\n\n- docs(in the wild): remove broken app link [#1688](https://github.com/airbnb/visx/pull/1688)\n- fix(xychart): extra space in version definition, that prevents 18.2.0 version t… [#1686](https://github.com/airbnb/visx/pull/1686)\n\n### :memo: Documentation\n\n- docs(zoom): update handlePinch type description [#1685](https://github.com/airbnb/visx/pull/1685)\n- docs(in the wild): remove broken app link [#1688](https://github.com/airbnb/visx/pull/1688)\n  \n#### :trophy: Contributors\n- [codejunkienick](https://github.com/codejunkienick)\n- [deni](https://github.com/deni)\n- [jrozbicki](https://github.com/jrozbicki)\n\n# v3.1.2 (2023-03-22)\n\n#### :bug: Bug Fix\n\n- fix(tooltip): handle SSR in useTooltipInPortal [#1672](https://github.com/airbnb/visx/pull/1672)\n  \n#### :trophy: Contributors\n- [korompaiistvan](https://github.com/korompaiistvan)\n\n# v3.1.1 (2023-03-22)\n\n#### :bug: Bug Fix\n\n- fix(zoom): prevent wheel interfering with pinch [#1639](https://github.com/airbnb/visx/pull/1639)\n  \n#### :trophy: Contributors\n- [kiliancs](https://github.com/kiliancs)\n\n# v3.1.0 (2023-03-08)\n\n#### :rocket: Enhancements\n\n- feat(axis): support object type tickLabelProp [#1662](https://github.com/airbnb/visx/pull/1662)\n  \n#### :trophy: Contributors\n- [Robin-Hoodie](https://github.com/Robin-Hoodie)\n\n# v3.0.2 (2023-03-07)\n\n#### :bug: Bug Fix\n\n- fix(demo/sandboxes, xychart): Convert '@visx/.../src/...' to '@visx/.../lib/...' [#1660](https://github.com/airbnb/visx/pull/1660)\n\n### :memo: Documentation\n\n- docs: Add Fig Stats to In the wild [#1652](https://github.com/airbnb/visx/pull/1652)\n  \n#### :trophy: Contributors\n- [SheaJanke](https://github.com/SheaJanke)\n- [VojtechVidra](https://github.com/VojtechVidra)\n\n# v3.0.1 (2023-02-13)\n\n#### :bug: Bug Fix\n\n- fix(demo): fix missing API documentation [#1648](https://github.com/airbnb/visx/pull/1648)\n\n### :memo: Documentation\n\n- fix(demo): fix missing API documentation [#1648](https://github.com/airbnb/visx/pull/1648)\n\n### :house:  Internal\n\n- Delete ROADMAP.md [#1628](https://github.com/airbnb/visx/pull/1628)\n  \n#### :trophy: Contributors\n- [jonambas](https://github.com/jonambas)\n- [williaster](https://github.com/williaster)\n\n# v3.0.0 (2023-01-06)\n\n#### :boom: Breaking Changes\n\n- security: Revert \"Revert breaking \"deps(scale): bump `d3-interpolate` and `d3-scale`\"\" [#1621](https://github.com/airbnb/visx/pull/1621)\n- breaking(annotation): remove `deprecated/LinePathAnnotation` [#1620](https://github.com/airbnb/visx/pull/1620)\n- breaking(responsive, xychart): require ResizeObserver or polyfill [#1622](https://github.com/airbnb/visx/pull/1622)\n\n### :house: Internal\n\n- internal(github/workflows): add tsconfig + demo site build checks [#1626](https://github.com/airbnb/visx/pull/1626)\n- deps(demo): upgrade to next@11 [#1627](https://github.com/airbnb/visx/pull/1627)\n\n#### :trophy: Contributors\n- [jreyes33](https://github.com/jreyes33)\n- [williaster](https://github.com/williaster)\n\n# v2.18.0 (2023-01-03)\n\n#### :bug: Bug Fix\n\n- fix(demo/pages/docs): use relative imports to fix API docs [#1612](https://github.com/airbnb/visx/pull/1612)\n- Revert breaking \"deps(scale): bump `d3-interpolate` and `d3-scale`\" [#1619](https://github.com/airbnb/visx/pull/1619)\n\n### :memo: Documentation\n\n- fix(demo/pages/docs): use relative imports to fix API docs [#1612](https://github.com/airbnb/visx/pull/1612)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.17.0 (2022-12-22)\n\n#### :bug: Bug Fix\n\n- deps(scale): bump `d3-interpolate` and `d3-scale` [#1578](https://github.com/airbnb/visx/pull/1578)\n\n### :house:  Internal\n\n- internal: migrate off nimbus [#1609](https://github.com/airbnb/visx/pull/1609)\n  \n#### :trophy: Contributors\n- [jreyes33](https://github.com/jreyes33)\n- [williaster](https://github.com/williaster)\n\n# v2.16.1 (2022-12-20)\n\n#### :bug: Bug Fix\n\n- fix(demo/radar):  uneven data elements renders spokes and web out of sync [#1599](https://github.com/airbnb/visx/pull/1599)\n- fix(brush): update brush start/end on window resize [#1606](https://github.com/airbnb/visx/pull/1606)\n\n### :memo: Documentation\n\n- docs(xychart): fix typo [#1594](https://github.com/airbnb/visx/pull/1594)\n\n### :house:  Internal\n\n- internal(github-actions): add github release script [#1585](https://github.com/airbnb/visx/pull/1585)\n  \n#### :trophy: Contributors\n- [datananda](https://github.com/datananda)\n- [gammaflauge](https://github.com/gammaflauge)\n- [valMn](https://github.com/valMn)\n- [williaster](https://github.com/williaster)\n\n# v2.16.0 (2022-10-19)\n\n#### :bug: Bug Fix\n\n- fix(tooltip, bounds): replace findDOMNode with refs for TooltipWithBounds [#1583](https://github.com/airbnb/visx/pull/1583)\n  \n#### :trophy: Contributors\n- [0xmax](https://github.com/0xmax)\n\n# v2.15.1 (2022-10-13)\n\n#### :bug: Bug Fix\n\n- fix(mock-data): add missing bitcoinPrice to index.ts [#1582](https://github.com/airbnb/visx/pull/1582)\n  \n#### :trophy: Contributors\n- [filiprejmus](https://github.com/filiprejmus)\n\n# v2.15.0 (2022-10-04)\n\n#### :rocket: Enhancements\n\n- new(tooltip): provide isFlippedVertically and isFlippedHorizontally context [#1355](https://github.com/airbnb/visx/pull/1355)\n  \n#### :trophy: Contributors\n- [taksuparth](https://github.com/taksuparth)\n\n# v2.14.0 (2022-10-03)\n\n#### :rocket: Enhancements\n\n- feat(axis): add an ability to specify different paddings for the start and the end of the axis [#1574](https://github.com/airbnb/visx/pull/1574)\n  \n#### :trophy: Contributors\n- [andreykrupskii](https://github.com/andreykrupskii)\n\n# v2.13.0 (2022-09-06)\n\n#### :rocket: Enhancements\n\n- Include visx/threshold in visx/visx [#1563](https://github.com/airbnb/visx/pull/1563)\n  \n#### :trophy: Contributors\n- [DantrazTrev](https://github.com/DantrazTrev)\n\n# v2.12.2 (2022-08-03)\n\n#### :bug: Bug Fix\n\n- fix(text, shape): Hide generated text element from assistive technologies [#1551](https://github.com/airbnb/visx/pull/1551)\n  \n#### :trophy: Contributors\n- [thomashoggard](https://github.com/thomashoggard)\n\n# v2.12.1 (2022-07-07)\n\n#### :bug: Bug Fix\n\n- fix(brush): resize brush selection when chart resizes [#1536](https://github.com/airbnb/visx/pull/1536)\n  \n#### :trophy: Contributors\n- [lucassarcanjo](https://github.com/lucassarcanjo)\n\n# v2.12.0 (2022-07-06)\n\n#### :rocket: Enhancements\n\n- feat(brush): add renderBrushHandle [#1495](https://github.com/airbnb/visx/pull/1495)\n  \n#### :trophy: Contributors\n- [arnthor-agustsson](https://github.com/arnthor-agustsson)\n\n# v2.11.1 (2022-06-29)\n\n#### :bug: Bug Fix\n\n- fix(demo,shape): fix SplitLinePath key [#1531](https://github.com/airbnb/visx/pull/1531)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.11.0 (2022-06-28)\n\n#### :rocket: Enhancements\n\n- feat(xychart): support onPointerDown event [#1440](https://github.com/airbnb/visx/pull/1440)\n  \n#### :trophy: Contributors\n- [abusada](https://github.com/abusada)\n\n# v2.10.2 (2022-06-28)\n\n### :house:  Internal\n\n- chore: Update deps for react-spring to specific target [#1530](https://github.com/airbnb/visx/pull/1530)\n  \n#### :trophy: Contributors\n- [ed-g-c](https://github.com/ed-g-c)\n\n# v2.10.1 (2022-06-08)\n\n#### :bug: Bug Fix\n\n- fix(brush): vertical brush with useWindowMoveEvents [#1522](https://github.com/airbnb/visx/pull/1522)\n  \n#### :trophy: Contributors\n- [kangaechigai](https://github.com/kangaechigai)\n\n# v2.10.0 (2022-05-03)\n\n#### :rocket: Enhancements\n\n- deps: Update to support React 18 [#1483](https://github.com/airbnb/visx/pull/1483)\n- new(react-spring): add tickLineProps to AnimatedTicks [#1490](https://github.com/airbnb/visx/pull/1490)\n- feat(xychart): add colorAccessor to LineSeries [#1489](https://github.com/airbnb/visx/pull/1489)\n\n### :memo: Documentation\n\n- docs: add WHO in the wild [#1486](https://github.com/airbnb/visx/pull/1486)\n  \n#### :trophy: Contributors\n- [artidata](https://github.com/artidata)\n- [Gaya](https://github.com/Gaya)\n- [Zenith00](https://github.com/Zenith00)\n\n# v2.9.2 (2022-04-28)\n\n#### :bug: Bug Fix\n\n- fix(xychart, react-spring): fix duplicate key warning in Axis/Grid [#1485](https://github.com/airbnb/visx/pull/1485)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.9.1 (2022-04-27)\n\n#### :bug: Bug Fix\n\n- fix(xychart): fix typo [#1460](https://github.com/airbnb/visx/pull/1460)\n\n### :memo: Documentation\n\n- docs: Add https://augora.fr to \"In the wild\" section [#1443](https://github.com/airbnb/visx/pull/1443)\n  \n#### :trophy: Contributors\n- [goldenivan](https://github.com/goldenivan)\n- [tetsugi](https://github.com/tetsugi)\n\n# v2.9.0 (2022-01-27)\n\n#### :rocket: Enhancements\n\n- new(annotation): add HtmlLabel demo, add containterStyle prop [#1424](https://github.com/airbnb/visx/pull/1424)\n\n### :memo: Documentation\n\n- new(annotation): add HtmlLabel demo, add containterStyle prop [#1424](https://github.com/airbnb/visx/pull/1424)\n\n### :house:  Internal\n\n- new(annotation): add HtmlLabel demo, add containterStyle prop [#1424](https://github.com/airbnb/visx/pull/1424)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.8.0 (2022-01-26)\n\n### :house:  Internal\n\n- deps: replace resize-observer-polyfill with @juggle/resize-observer [#1422](https://github.com/airbnb/visx/pull/1422)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.7.1 (2022-01-24)\n\n#### Uncategorized\n\n- fix(responsive): remove global ResizeObserver type declaration [#1423](https://github.com/airbnb/visx/pull/1423)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.7.0 (2022-01-21)\n\n#### :rocket: Enhancements\n\n- Annotation label <foreignobject> render [#1383](https://github.com/airbnb/visx/pull/1383)\n  \n#### :trophy: Contributors\n- [valtism](https://github.com/valtism)\n\n# v2.6.1 (2022-01-20)\n\n#### :bug: Bug Fix\n\n- fix(zoom): avoid 2x scale invocations on wheel end [#1420](https://github.com/airbnb/visx/pull/1420)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.6.0 (2022-01-20)\n\n#### :rocket: Enhancements\n\n- new(drag): Add restrictToPath as a Drag parameter [#1379](https://github.com/airbnb/visx/pull/1379)\n\n### :memo: Documentation\n\n- Removed $ sign from Usage in Readme [#1397](https://github.com/airbnb/visx/pull/1397)\n  \n#### :trophy: Contributors\n- [DantrazTrev](https://github.com/DantrazTrev)\n- [valtism](https://github.com/valtism)\n\n# v2.5.0 (2021-11-11)\n\n#### :rocket: Enhancements\n\n- new(drag): add options to restrict <Drag> area and control snapToPointer behaviour [#1368](https://github.com/airbnb/visx/pull/1368)\n  \n#### :trophy: Contributors\n- [valtism](https://github.com/valtism)\n\n# v2.4.1 (2021-11-11)\n\n#### :bug: Bug Fix\n\n- fix(responsive): fix shallow equality check on default array value for ParentSize [#1370](https://github.com/airbnb/visx/pull/1370)\n  \n#### :trophy: Contributors\n- [dylanmoz](https://github.com/dylanmoz)\n\n# v2.4.0 (2021-11-10)\n\n#### :rocket: Enhancements\n\n- new(xychart): distinguish nearestDatum in renderGlyph [#1294](https://github.com/airbnb/visx/pull/1294)\n- new(shape/BarRounded): export useBarRounded, support render functions [#1097](https://github.com/airbnb/visx/pull/1097)\n- new(xychart/BarSeries,BarGroup,BarStack): add support for bar radius [#1098](https://github.com/airbnb/visx/pull/1098)\n\n#### :bug: Bug Fix\n\n- Update Readme.md [#1372](https://github.com/airbnb/visx/pull/1372)\n\n### :memo: Documentation\n\n- Update Readme.md [#1372](https://github.com/airbnb/visx/pull/1372)\n  \n#### :trophy: Contributors\n- [AryanBeezadhur](https://github.com/AryanBeezadhur)\n- [Janpot](https://github.com/Janpot)\n- [williaster](https://github.com/williaster)\n\n# v2.3.0 (2021-11-02)\n\n#### :rocket: Enhancements\n\n- new(text): Add 'shrink-only' option to 'scaleToFit' [#1362](https://github.com/airbnb/visx/pull/1362)\n  \n#### :trophy: Contributors\n- [kyythane](https://github.com/kyythane)\n\n# v2.2.2 (2021-10-27)\n\n#### :bug: Bug Fix\n\n- fix(tooltip): mount TooltipWithBounds before adding transform [#1367](https://github.com/airbnb/visx/pull/1367)\n- fix(zoom): better handling of simultaneous drag and scale [#1361](https://github.com/airbnb/visx/pull/1361)\n\n### :memo: Documentation\n\n- docs: add note about dangers of rendering divs within svg [#1354](https://github.com/airbnb/visx/pull/1354)\n- docs(scale): Add note on scaleLog domain not containing 0 [#1363](https://github.com/airbnb/visx/pull/1363)\n- docs(tooltip): remove incorrect handler from readme example [#1366](https://github.com/airbnb/visx/pull/1366)\n  \n#### :trophy: Contributors\n- [amhunt](https://github.com/amhunt)\n- [kangaechigai](https://github.com/kangaechigai)\n- [valtism](https://github.com/valtism)\n- [whalderman](https://github.com/whalderman)\n\n# v2.2.1 (2021-10-13)\n\n#### :bug: Bug Fix\n\n- Round up instead of down on text width within Label to avoid unnecessary wrapping [#1353](https://github.com/airbnb/visx/pull/1353)\n  \n#### :trophy: Contributors\n- [dylanmoz](https://github.com/dylanmoz)\n\n# v2.2.0 (2021-10-13)\n\n#### :rocket: Enhancements\n\n- Allow specifying zIndex for tooltip portals [#1346](https://github.com/airbnb/visx/pull/1346)\n  \n#### :trophy: Contributors\n- [kangaechigai](https://github.com/kangaechigai)\n\n# v2.1.2 (2021-10-11)\n\n### :house:  Internal\n\n- deps: bump all dev config [#1301](https://github.com/airbnb/visx/pull/1301)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.1.1 (2021-09-10)\n\n### :house:  Internal\n\n- deps: bump lodash throughout [#1341](https://github.com/airbnb/visx/pull/1341)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v2.1.0 (2021-08-17)\n\n#### :rocket: Enhancements\n\n- deps: update to react-spring@9 [#1277](https://github.com/airbnb/visx/pull/1277)\n- new(zoom): add pinch and zoom support [#1305](https://github.com/airbnb/visx/pull/1305)\n- new(demo/geo-albers/usa): use all 4 colors in the map [#1314](https://github.com/airbnb/visx/pull/1314)\n- new(wordcloud): add @visx/wordcloud [#1311](https://github.com/airbnb/visx/pull/1311)\n\n#### :bug: Bug Fix\n\n- fix(scripts/performRelease): fix alpha release logic [#1310](https://github.com/airbnb/visx/pull/1310)\n\n### :boom:  Breaking Changes\n\n- deps: update to react-spring@9 [#1277](https://github.com/airbnb/visx/pull/1277)\n- [deps] Upgrade to react v17 and react-testing-library [#1268](https://github.com/airbnb/visx/pull/1268)\n- breaking(visx/visx): export by package namespace [#1121](https://github.com/airbnb/visx/pull/1121)\n\n### :house:  Internal\n\n- fix(scripts/performRelease): fix alpha release logic [#1310](https://github.com/airbnb/visx/pull/1310)\n  \n#### :trophy: Contributors\n- [craciuncezar](https://github.com/craciuncezar)\n- [gazcn007](https://github.com/gazcn007)\n- [kenfehling](https://github.com/kenfehling)\n- [robsutcliffe](https://github.com/robsutcliffe)\n- [tonyneel923](https://github.com/tonyneel923)\n- [williaster](https://github.com/williaster)\n\n# v1.18.1 (2021-07-21)\n\n#### :bug: Bug Fix\n\n- fix(brush, drag): call start callbacks consistently, support mobile [#1286](https://github.com/airbnb/visx/pull/1286)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v1.18.0 (2021-07-21)\n\n#### :rocket: Enhancements\n\n- new(xychart/tooltip): add renderGlyph property [#1255](https://github.com/airbnb/visx/pull/1255)\n  \n#### :trophy: Contributors\n- [Janpot](https://github.com/Janpot)\n\n# v1.17.1 (2021-07-20)\n\n#### :bug: Bug Fix\n\n- fix: remove @types/classnames [#1281](https://github.com/airbnb/visx/pull/1281)\n  \n#### :trophy: Contributors\n- [Janpot](https://github.com/Janpot)\n\n# v1.17.0 (2021-07-08)\n\n#### :rocket: Enhancements\n\n- new(axis): enable customization of tickLineProps [#1211](https://github.com/airbnb/visx/pull/1211)\n  \n#### :trophy: Contributors\n- [LoiKos](https://github.com/LoiKos)\n\n# v1.16.1 (2021-07-07)\n\n#### :bug: Bug Fix\n\n- fix(xychart): support fragment and array type children of stacks/groups [#1259](https://github.com/airbnb/visx/pull/1259)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v1.16.0 (2021-07-02)\n\n#### :rocket: Enhancements\n\n- feat(shape): add more segmentation for SplitLinePath [#1261](https://github.com/airbnb/visx/pull/1261)\n\n#### :bug: Bug Fix\n\n- feat(shape): add more segmentation for SplitLinePath [#1261](https://github.com/airbnb/visx/pull/1261)\n  \n#### :trophy: Contributors\n- [kristw](https://github.com/kristw)\n\n# v1.15.0 (2021-07-01)\n\n#### :rocket: Enhancements\n\n- feat(brush): add using widows move events with brush [#1164](https://github.com/airbnb/visx/pull/1164)\n  \n#### :trophy: Contributors\n- [d3x42](https://github.com/d3x42)\n\n# v1.14.1 (2021-07-01)\n\n#### :bug: Bug Fix\n\n- fix(zoom): fix provided zoom interface [#1257](https://github.com/airbnb/visx/pull/1257)\n\n### :memo: Documentation\n\n- Add Data 2 the People to In the Wild list [#1256](https://github.com/airbnb/visx/pull/1256)\n  \n#### :trophy: Contributors\n- [boy51](https://github.com/boy51)\n- [schillerk](https://github.com/schillerk)\n\n# v1.14.0 (2021-06-25)\n\n#### :rocket: Enhancements\n\n- feat(scale): support rounding for symlog [#1252](https://github.com/airbnb/visx/pull/1252)\n- feat(animatedaxis): add tickComponent support (#977) [#1228](https://github.com/airbnb/visx/pull/1228)\n\n#### :bug: Bug Fix\n\n- build: skip release workflow when in forked repo [#1251](https://github.com/airbnb/visx/pull/1251)\n\n### :house:  Internal\n\n- build: skip release workflow when in forked repo [#1251](https://github.com/airbnb/visx/pull/1251)\n- build: run happo on push [#1254](https://github.com/airbnb/visx/pull/1254)\n  \n#### :trophy: Contributors\n- [johnathanludwig](https://github.com/johnathanludwig)\n- [kristw](https://github.com/kristw)\n- [williaster](https://github.com/williaster)\n\n# v1.13.0 (2021-06-16)\n\n#### :rocket: Enhancements\n\n- new(geo): pass projection to child override, add U.S.A. demo [#1236](https://github.com/airbnb/visx/pull/1236)\n\n#### :bug: Bug Fix\n\n- new(geo): pass projection to child override, add U.S.A. demo [#1236](https://github.com/airbnb/visx/pull/1236)\n\n### :memo: Documentation\n\n- docs(xychart): fix typos [#1232](https://github.com/airbnb/visx/pull/1232)\n  \n#### :trophy: Contributors\n- [danielimmke](https://github.com/danielimmke)\n- [johnathanludwig](https://github.com/johnathanludwig)\n\n# v1.12.0 (2021-06-03)\n\n#### :rocket: Enhancements\n\n- new(shape): support dynamic fill directly in Pie [#1225](https://github.com/airbnb/visx/pull/1225)\n  \n#### :trophy: Contributors\n- [iampueroo](https://github.com/iampueroo)\n\n# v1.11.2 (2021-05-21)\n\n#### :bug: Bug Fix\n\n- fix(xychart/Tooltip): bail early when tooltip is closed [#1213](https://github.com/airbnb/visx/pull/1213)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v1.11.1 (2021-05-19)\n\n#### :bug: Bug Fix\n\n- fix(scale): upgrade d3-time to v2.4 for d3-scale compatibility [#1219](https://github.com/airbnb/visx/pull/1219)\n\n### :memo: Documentation\n\n- docs(shape): fix docs fror BarGroup, BarGroupHorizontal, and BarStack [#1212](https://github.com/airbnb/visx/pull/1212)\n  \n#### :trophy: Contributors\n- [Pringels](https://github.com/Pringels)\n- [williaster](https://github.com/williaster)\n\n# v1.11.0 (2021-05-13)\n\n#### :rocket: Enhancements\n\n- new(@visx/zoom): adjust drag move to take optional offset [#1180](https://github.com/airbnb/visx/pull/1180)\n\n#### :bug: Bug Fix\n\n- new(@visx/zoom): adjust drag move to take optional offset [#1180](https://github.com/airbnb/visx/pull/1180)\n  \n#### :trophy: Contributors\n- [boy51](https://github.com/boy51)\n\n# v1.10.1 (2021-05-12)\n\n#### :bug: Bug Fix\n\n- fix(responsive): don't call resize.cancel if we never initialised [#1208](https://github.com/airbnb/visx/pull/1208)\n\n#### Uncategorized\n\n- Update pull_request.yml [#1209](https://github.com/airbnb/visx/pull/1209)\n  \n#### :trophy: Contributors\n- [ahixon](https://github.com/ahixon)\n- [williaster](https://github.com/williaster)\n\n# v1.10.0 (2021-05-03)\n\n#### :rocket: Enhancements\n\n- fix(@visx/text) Bad size measurements in Firefox [#1175](https://github.com/airbnb/visx/pull/1175)\n\n#### :bug: Bug Fix\n\n- fix(@visx/text) Bad size measurements in Firefox [#1175](https://github.com/airbnb/visx/pull/1175)\n\n#### Uncategorized\n\n- Update push.yml [#1195](https://github.com/airbnb/visx/pull/1195)\n  \n#### :trophy: Contributors\n- [vovakulikov](https://github.com/vovakulikov)\n- [williaster](https://github.com/williaster)\n\n# v1.9.1 (2021-04-22)\n\n#### :bug: Bug Fix\n\n- fix(grid,xychart): account for scale bandwidth in offsets [#1181](https://github.com/airbnb/visx/pull/1181)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v1.9.0 (2021-04-16)\n\n#### :rocket: Enhancements\n\n- fix(visx/annotation) Improve label positioning, add maxWidth [#1127](https://github.com/airbnb/visx/pull/1127)\n\n#### :bug: Bug Fix\n\n- fix(visx/annotation) Improve label positioning, add maxWidth [#1127](https://github.com/airbnb/visx/pull/1127)\n\n### :memo: Documentation\n\n- development(contributing): update docs to rebuild single packages [#1170](https://github.com/airbnb/visx/pull/1170)\n  \n#### :trophy: Contributors\n- [vovakulikov](https://github.com/vovakulikov)\n- [williaster](https://github.com/williaster)\n\n# v1.8.0 (2021-04-15)\n\n#### :rocket: Enhancements\n\n- new(shape/Polygon): add optional 'points' override [#1156](https://github.com/airbnb/visx/pull/1156)\n  \n#### :trophy: Contributors\n- [jakeisnt](https://github.com/jakeisnt)\n\n# v1.7.4 (2021-04-13)\n\n#### :bug: Bug Fix\n\n- fix(brush): use PointerEvents instead of MouseEvents  [#1155](https://github.com/airbnb/visx/pull/1155)\n  \n#### :trophy: Contributors\n- [RemaaBdair](https://github.com/RemaaBdair)\n\n# v1.7.3 (2021-04-06)\n\n#### :bug: Bug Fix\n\n- fix(xychart): onPointerUp fires twice [#1135](https://github.com/airbnb/visx/pull/1135)\n\n### :memo: Documentation\n\n- docs: Add Pry to In the Wild list [#1115](https://github.com/airbnb/visx/pull/1115)\n  \n#### :trophy: Contributors\n- [valtism](https://github.com/valtism)\n- [vovakulikov](https://github.com/vovakulikov)\n\n# v1.7.2 (2021-03-18)\n\n#### :bug: Bug Fix\n\n- fix(tooltip, annotation): bump react-use-measure to ^2.0.4. fixes #1091 [#1116](https://github.com/airbnb/visx/pull/1116)\n  \n#### :trophy: Contributors\n- [hshoff](https://github.com/hshoff)\n\n# v1.7.1 (2021-03-17)\n\n#### :bug: Bug Fix\n\n- fix(xychart/TooltipProvider): handles NaNs in nearestDatum logic [#1112](https://github.com/airbnb/visx/pull/1112)\n\n### :house:  Internal\n\n- internal(workflows/release): add next dist-tag, fix lerna releases [#1107](https://github.com/airbnb/visx/pull/1107)\n- fix(workflows/push): fix yaml syntax [#1108](https://github.com/airbnb/visx/pull/1108)\n- fix(scripts/performRelease): add comment, fix typo [#1113](https://github.com/airbnb/visx/pull/1113)\n  \n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n# v1.7.0 (2021-03-12)\n\n#### :rocket: Enhancements\n\n- Export types in @visx/text [#1106](https://github.com/airbnb/visx/pull/1106)\n\n#### :bug: Bug Fix\n\n- fix(xychart/Tooltip): don't render glyph for null data [#1102](https://github.com/airbnb/visx/pull/1102)\n- fix(shape, xychart): default LinePath strokeLinecap to round [#1105](https://github.com/airbnb/visx/pull/1105)\n\n### :house:  Internal\n\n- deps(lerna): bump to 3.22.0 [#1103](https://github.com/airbnb/visx/pull/1103)\n  \n#### :trophy: Contributors\n- [ConneXNL](https://github.com/ConneXNL)\n- [williaster](https://github.com/williaster)\n\n# v1.6.1 (2021-03-08)\n\n#### :bug: Bug Fix\n\n- fix(network): string type in node/linkComponent [#1078](https://github.com/airbnb/visx/pull/1078)\n- fix(xychart/Axis): export AxisScale type, set default Scale generic [#1094](https://github.com/airbnb/visx/pull/1094)\n\n### :memo: Documentation\n\n- fix(network): string type in node/linkComponent [#1078](https://github.com/airbnb/visx/pull/1078)\n\n### :house:  Internal\n\n- build(happo): decrease compare threshold [#1088](https://github.com/airbnb/visx/pull/1088)\n- new(workflows/push): automate releases [#1073](https://github.com/airbnb/visx/pull/1073)\n  \n#### :trophy: Contributors\n- [jraymakers](https://github.com/jraymakers)\n- [williaster](https://github.com/williaster)\n\n# v1.6.0\n#### :rocket:  Enhancements\n\n- [xychart] add x/y0Accessor functions to support AreaSeries bands [#1071](https://github.com/airbnb/visx/pull/1071)\n\n#### :bug: Bug Fix\n\n- [xychart] make AnnotationLabel's make dataKey optional [#1072](https://github.com/airbnb/visx/pull/1072)\n- [annotation] account for fontFamily in Label styles so Text uses it in its size calculations [#1072](https://github.com/airbnb/visx/pull/1072)\n\n#### :trophy: Contributors\n- [williaster](https://github.com/williaster)\n\n```\nChanges\n - @visx/annotation: 1.5.0 => 1.6.0\n - @visx/demo: 1.5.0 => 1.6.0\n - @visx/visx: 1.5.0 => 1.6.0\n - @visx/xychart: 1.5.0 => 1.6.0\n```\n\n# v1.5.0\n#### :rocket:  Enhancements\n\n- [grid] add GridPolar, GridAngle, and GridRadial [#1007](https://github.com/airbnb/visx/pull/1007)\n- [mock-data] add stable randomness [#1033](https://github.com/airbnb/visx/pull/1033)\n- [xychart] add AreaStack [#1019](https://github.com/airbnb/visx/pull/1019) closes [#994](https://github.com/airbnb/visx/pull/994)\n- [visx/visx] export @visx/xychart package [#1043](https://github.com/airbnb/visx/pull/1043) closes [#974](https://github.com/airbnb/visx/pull/974)\n- [axis] pass all tick values in tickLabelProps signature [#1044](https://github.com/airbnb/visx/pull/1044)\n\n#### :bug: Bug Fix\n\n- [xychart] improve Tooltip positioning with missing data [#1068](https://github.com/airbnb/visx/pull/1068) closes [#1054](https://github.com/airbnb/visx/pull/1054)\n- [xychart] make Tooltip postion robust to container changes [#1045](https://github.com/airbnb/visx/pull/1045) closes [#983](https://github.com/airbnb/visx/pull/983)\n- [xychart] fix scales for BarStack offset [#1019](https://github.com/airbnb/visx/pull/1019)\n- [xychart] add SVGPathElement props to BaseAreaSeries lineProps [#1046](https://github.com/airbnb/visx/pull/1046)\n\n### :memo: Documentation\n\n- sync code of conduct with Airbnb [#1013](https://github.com/airbnb/visx/pull/1013)\n- [demo/*] respect prefersReducedMotion [#1037](https://github.com/airbnb/visx/pull/1037)\n- [demo/barstack] improve Tooltip positining logic [#1018](https://github.com/airbnb/visx/pull/1018) closes [#1018](https://github.com/airbnb/visx/pull/1018)\n- [demo/xychart] add AreaStack, stackOffset control [#1020](https://github.com/airbnb/visx/pull/1020)\n- [in the wild] add eft.monster [#1010](https://github.com/airbnb/visx/pull/1010)\n\n### :house:  Internal\n\n- [testing] add happo for screenshot testing [#1030](https://github.com/airbnb/visx/pull/1030)\n- [xychart/areastack] add tests [#1036](https://github.com/airbnb/visx/pull/1036)\n- [CI] add package size checks + auto gallery deploy [#1048](https://github.com/airbnb/visx/pull/1048)\n\n#### :trophy: Contributors\n\n- [sarathps93](https://github.com/sarathps93)\n- [codenomial](https://github.com/codenomial)\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @visx/annotation: 1.4.0 => 1.5.0\n - @visx/axis: 1.4.0 => 1.5.0\n - @visx/demo: 1.4.0 => 1.5.0\n - @visx/grid: 1.4.0 => 1.5.0\n - @visx/mock-data: 1.0.0 => 1.5.0\n - @visx/react-spring: 1.4.0 => 1.5.0\n - @visx/tooltip: 1.3.0 => 1.5.0\n - @visx/visx: 1.4.0 => 1.5.0\n - @visx/xychart: 1.4.0 => 1.5.0\n```\n\n# v1.4.0\n\n#### :rocket:  Enhancements\n\n- [xychart] make `event` in `EventHandlerParams` optional [#972](https://github.com/airbnb/visx/pull/972)\n- [xychart] add `colorAccessor` to relevant series [#1005](https://github.com/airbnb/visx/pull/1005), closes [#996](https://github.com/airbnb/visx/pull/996)\n- [xychart] include zero in scale domains by default [#1008](https://github.com/airbnb/visx/pull/1008)\n\n#### :bug: Bug Fix\n\n- [xychart] fix scale options not applied in XYChart [#987](https://github.com/airbnb/visx/pull/987), closes [#986](https://github.com/airbnb/visx/pull/986)\n- [xychart] expose more AnnotationLineSubject types, fix `strokeWidth` application [#991](https://github.com/airbnb/visx/pull/991)\n- [annotation] fix application of object type `Label` `props.backgroundPadding`, add default `anchorLineStroke` [#989](https://github.com/airbnb/visx/pull/989)\n- [stats] fix handling of `0` in `BoxPlot` `valueScale` [#993](https://github.com/airbnb/visx/pull/993)\n- [xychart] enable style overflow in crosshairs [#997](https://github.com/airbnb/visx/pull/997)\n\n### :memo: Documentation\n\n- [xychart] add advanced usage sandbox examples [#972](https://github.com/airbnb/visx/pull/972)\n- [xychart] fix missing </details> [#972](https://github.com/airbnb/visx/pull/972)\n- [annotation] add docs for Label [#989](https://github.com/airbnb/visx/pull/989)\n\n#### :trophy: Contributors\n\n- [Janpot](https://github.com/Janpot)\n- [rsbh](https://github.com/rsbh)\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @visx/annotation: 1.3.0 => 1.4.0\n - @visx/axis: 1.3.0 => 1.4.0\n - @visx/brush: 1.3.0 => 1.4.0\n - @visx/demo: 1.3.0 => 1.4.0\n - @visx/grid: 1.3.0 => 1.4.0\n - @visx/legend: 1.3.0 => 1.4.0\n - @visx/marker: 1.3.0 => 1.4.0\n - @visx/react-spring: 1.3.0 => 1.4.0\n - @visx/scale: 1.3.0 => 1.4.0\n - @visx/shape: 1.3.0 => 1.4.0\n - @visx/stats: 1.3.0 => 1.4.0\n - @visx/threshold: 1.3.0 => 1.4.0\n - @visx/visx: 1.3.0 => 1.4.0\n - @visx/xychart: 1.3.0 => 1.4.0\n```\n\n# v1.3.0\n\n#### :rocket:  Enhancements\n\n- [responsive] Add ParentSizeModern, withParentSizeModern that don't add ResizeObserver polyfill [#925](https://github.com/airbnb/visx/pull/925) \n- [scale] add scaleRadial [#958](https://github.com/airbnb/visx/pull/958)\n- [text] add useText hook, refactor Text to use it [#946](https://github.com/airbnb/visx/pull/946)\n- [event] support FocusEvents in localPoint [#956](https://github.com/airbnb/visx/pull/956)\n- [xychart] release package [#965](https://github.com/airbnb/visx/pull/965)\n- [xychart] add PointerEvent handlers to XYChart, all Series [#947](https://github.com/airbnb/visx/pull/947)\n- [xychart] add support for FocusEvents [#959](https://github.com/airbnb/visx/pull/959)\n- [xychart] integrate Annotations [#938](https://github.com/airbnb/visx/pull/938)\n\n#### :bug: Bug Fix\n\n- [shape] set y0 when it equals zero [#955](https://github.com/airbnb/visx/pull/955)\n\n### :memo: Documentation\n\n- [xychart] add README and /docs/xychart to demo site [#963](https://github.com/airbnb/visx/pull/963)\n- [demo] fix view demo hover pointer style [#929](https://github.com/airbnb/visx/pull/929)\n- [tooltip] fix offsetTop documentation [#970](https://github.com/airbnb/visx/pull/970)\n\n### :house:  Internal\n\n- [xychart] add FocusEvent tests [#962](https://github.com/airbnb/visx/pull/962)\n- [xychart] add PointerEvent tests [#952](https://github.com/airbnb/visx/pull/952)\n- [xychart] add Annotations tests [#948](https://github.com/airbnb/visx/pull/948)\n\n#### :trophy: Contributors\n\n- [koddsson](https://github.com/koddsson)\n- [susiwen8](https://github.com/susiwen8)\n- [sarathps93](https://github.com/sarathps93)\n- [cristianmartinez](https://github.com/cristianmartinez)\n- [jfuchs](https://github.com/jfuchs)\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @visx/annotation: 1.2.0 => 1.3.0\n - @visx/axis: 1.2.0 => 1.3.0\n - @visx/brush: 1.2.0 => 1.3.0\n - @visx/demo: 1.2.0 => 1.3.0\n - @visx/drag: 1.2.0 => 1.3.0\n - @visx/event: 1.0.0 => 1.3.0\n - @visx/grid: 1.2.0 => 1.3.0\n - @visx/legend: 1.1.0 => 1.3.0\n - @visx/marker: 1.2.0 => 1.3.0\n - @visx/react-spring: 1.2.0 => 1.3.0\n - @visx/responsive: 1.1.0 => 1.3.0\n - @visx/scale: 1.1.0 => 1.3.0\n - @visx/shape: 1.2.0 => 1.3.0\n - @visx/stats: 1.1.0 => 1.3.0\n - @visx/text: 1.1.0 => 1.3.0\n - @visx/threshold: 1.2.0 => 1.3.0\n - @visx/tooltip: 1.1.0 => 1.3.0\n - @visx/visx: 1.2.0 => 1.3.0\n - @visx/xychart: 1.2.0 => 1.3.0\n - @visx/zoom: 1.0.0 => 1.3.0\n```\n\n# v1.2.0\n\n#### :rocket:  Enhancements\n\n- [brush] expose updateBrush method via innerRef [#934](https://github.com/airbnb/visx/pull/934), closes [#577](https://github.com/airbnb/visx/pull/577)\n- [annotation] add new Annotation components (Annotation, EditableAnnotation, Label, CircleSubject, LineSubject) [#907](https://github.com/airbnb/visx/pull/907)\n- [drag] add useDrag hook [#902](https://github.com/airbnb/visx/pull/902)\n- [drag] allow x,y,dx,dy overrides in useDrag + Drag [#906](https://github.com/airbnb/visx/pull/906), closes [#905](https://github.com/airbnb/visx/pull/905)\n- [annotation] add canEditSubject, canEditLabel to EditableAnnotation [#919](https://github.com/airbnb/visx/pull/919)\n- [xychart (unpublished)] make DataProvider optional [#913](https://github.com/airbnb/visx/pull/913)\n- [xychart (unpublished)] expose curve types in BaseAreaSeries, BaseLineSeries [#899](https://github.com/airbnb/visx/pull/899)\n- [xychart (unpublished)] handle rendering + tweening missing values [#898](https://github.com/airbnb/visx/pull/898)\n- [xychart (unpublished)] add (Animated)GlyphSeries [#885](https://github.com/airbnb/visx/pull/885)\n- [xychart (unpublished)] add AreaSeries + AnimatedAreaSeries [#878](https://github.com/airbnb/visx/pull/878)\n- [xychart (unpublished)] add AnimatedLineSeries [#874](https://github.com/airbnb/visx/pull/874)\n- [xychart (unpublished)] add Animated(BarSeries, BarStack, BarGroup) [#873](https://github.com/airbnb/visx/pull/873)\n\n#### :bug: Bug Fix\n\n- [shape] conditionally render Arc without data [#937](https://github.com/airbnb/visx/pull/937)\n\n### :memo: Documentation\n\n- [demo/annotation] add annotation demo [#909](https://github.com/airbnb/visx/pull/909)\n- [demo] visx rebrand, move to github pages [#890](https://github.com/airbnb/visx/pull/890), fixes [#850](https://github.com/airbnb/visx/pull/850) [#861](https://github.com/airbnb/visx/pull/861)\n- [in the wild] add tokenizedbtc [#931](https://github.com/airbnb/visx/pull/931)\n\n### :house:  Internal\n\n- [deps] next@9.5.4 [#915](https://github.com/airbnb/visx/pull/915), [#916](https://github.com/airbnb/visx/pull/916)\n- [ci] remove .travis.yml [#891](https://github.com/airbnb/visx/pull/891)\n- [xychart (unpublished)] add Annotation tests [#912](https://github.com/airbnb/visx/pull/912)\n- [xychart (unpublished)] add missing data tests [#900](https://github.com/airbnb/visx/pull/900)\n\n#### :trophy: Contributors\n\n- [peterwiebe](https://github.com/peterwiebe)\n- [sakulstra](https://github.com/sakulstra)\n- [hshoff](https://github.com/hshoff)\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @visx/annotation: 1.1.0 => 1.2.0\n - @visx/axis: 1.1.0 => 1.2.0\n - @visx/brush: 1.1.0 => 1.2.0\n - @visx/demo: 1.1.0 => 1.2.0\n - @visx/drag: 1.0.0 => 1.2.0\n - @visx/grid: 1.1.0 => 1.2.0\n - @visx/marker: 1.1.0 => 1.2.0\n - @visx/react-spring: 1.1.0 => 1.2.0\n - @visx/shape: 1.1.0 => 1.2.0\n - @visx/threshold: 1.1.0 => 1.2.0\n - @visx/visx: 1.1.0 => 1.2.0\n - @visx/xychart: 1.1.0 => 1.2.0 (private)\n```\n\n# v1.1.0\n\n#### :rocket:  Enhancements\n\n- [scale] bump `@types/d3-scale` to `^3.1.0` [#856](https://github.com/airbnb/visx/pull/856) closes [#855](https://github.com/airbnb/visx/pull/855)\n- [shape] set `Line` shapeRendering to `crispEdges` if rectilinear [#840](https://github.com/airbnb/visx/pull/840)\n- [network] apply fill & radius to DefaultNode [#859](https://github.com/airbnb/visx/pull/859)\n- [tooltip] add `applyPositionStyle` prop so users don't have to set absolute positioning when `unstyled=true` [#857](https://github.com/airbnb/visx/pull/857)\n- [responsive] add `initialWidth` and `initialHeight` to `withParentSize` [#836](https://github.com/airbnb/visx/pull/836) closes [#554](https://github.com/airbnb/visx/pull/554)\n- [responsive] add `ignoreDimensions` prop to optimize re-renders [#834](https://github.com/airbnb/visx/pull/834) closes [#247](https://github.com/airbnb/visx/pull/247)\n- [xychart (unpublished)] add BarSeries [#808](https://github.com/airbnb/visx/pull/808)\n- [xychart (unpublished)] add BarGroup [#870](https://github.com/airbnb/visx/pull/870) [#871](https://github.com/airbnb/visx/pull/871)\n- [xychart (unpublished)] add BarStack [#865](https://github.com/airbnb/visx/pull/865) [#866](https://github.com/airbnb/visx/pull/866)\n- [xychart (unpublished)] add EventEmitterContext, TooltipContext [#825](https://github.com/airbnb/visx/pull/825)\n- [xychart (unpublished)] add Tooltip [#852](https://github.com/airbnb/visx/pull/852)\n\n#### :bug: Bug Fix\n\n- [tooltip] fix `TooltipWithBounds` overlowing its parent on small screens [#837](https://github.com/airbnb/visx/pull/837) closes [#466](https://github.com/airbnb/visx/pull/466)\n- [tooltip] fix `TooltipWithBounds` positioning when `unstyled=true` [#828](https://github.com/airbnb/visx/pull/828)\n- [stats] don't throw when first and third quartile are equal [#841](https://github.com/airbnb/visx/pull/841) closes [#427](https://github.com/airbnb/visx/pull/427)\n- [stats] update min/max to handle no outliers case [#853](https://github.com/airbnb/visx/pull/853) closes [#851](https://github.com/airbnb/visx/pull/851)\n- [text] render 0 as number [#814](https://github.com/airbnb/visx/pull/814) fixes [#813](https://github.com/airbnb/visx/pull/813)\n- [shape] render LinkHorizontalStep horizontally not vertically [#847](https://github.com/airbnb/visx/pull/847) closes [#820](https://github.com/airbnb/visx/pull/820)\n- [axis] fix `tickLabelProps` when `hideZero=true` [#818](https://github.com/airbnb/visx/pull/818) fixes [#815](https://github.com/airbnb/visx/pull/815)\n- [demo/areas] handle non-zero margins [#877](https://github.com/airbnb/visx/pull/877)\n\n#### :house:  Internal\n\n- [responsive] refactor `ParentSize` to function component [#834](https://github.com/airbnb/visx/pull/834)\n- [text] improve test coverage [#833](https://github.com/airbnb/visx/pull/833)\n- [pattern] remove code duplication [#838](https://github.com/airbnb/visx/pull/838)\n\n#### :memo: Documentation\n\n- [in the wild] add Wall Street Journal: Americans Familiarize Themselves with the Word ‘Forbearance’ [#843](https://github.com/airbnb/visx/pull/843)\n- [in the wild] add dollar-to-food-emoji [#860](https://github.com/airbnb/visx/pull/860)\n- [in the wild] remove deadlinks, add Taiwan Real-time Air Quality Index [#867](https://github.com/airbnb/visx/pull/867) \n- [project readme] fix typos [#826](https://github.com/airbnb/visx/pull/826)\n\n#### :trophy: Contributors\n\n- [birjolaxew](https://github.com/birjolaxew)\n- [wyze](https://github.com/wyze)\n- [shannonrothe](https://github.com/shannonrothe)\n- [anastasiia-gontarieva](https://github.com/anastasiia-gontarieva)\n- [kmiyashiro](https://github.com/kmiyashiro)\n- [LethalPants](https://github.com/LethalPants)\n- [rayshan](https://github.com/rayshan)\n- [kanhegaonkarsaurabh](https://github.com/kanhegaonkarsaurabh)\n- [tombarton](https://github.com/tombarton)\n- [gmlwo530](https://github.com/gmlwo530)\n- [ArvinH](https://github.com/ArvinH)\n- [singhanurag05](https://github.com/singhanurag05)\n- [androiddevnotes](https://github.com/androiddevnotes)\n- [ilariaventurini](https://github.com/ilariaventurini)\n- [kristw](https://github.com/kristw)\n- [hshoff](https://github.com/hshoff)\n- [williaster](https://github.com/williaster)\n\n```Changes:\nChanges:\n - @visx/annotation: 1.0.0 => 1.1.0\n - @visx/axis: 1.0.0 => 1.1.0\n - @visx/brush: 1.0.0 => 1.1.0\n - @visx/demo: 1.0.0 => 1.1.0\n - @visx/grid: 1.0.0 => 1.1.0\n - @visx/legend: 1.0.0 => 1.1.0\n - @visx/marker: 1.0.0 => 1.1.0\n - @visx/network: 1.0.0 => 1.1.0\n - @visx/pattern: 1.0.0 => 1.1.0\n - @visx/react-spring: 1.0.0 => 1.1.0\n - @visx/responsive: 1.0.0 => 1.1.0\n - @visx/scale: 1.0.0 => 1.1.0\n - @visx/shape: 1.0.0 => 1.1.0\n - @visx/stats: 1.0.0 => 1.1.0\n - @visx/text: 1.0.0 => 1.1.0\n - @visx/threshold: 1.0.0 => 1.1.0\n - @visx/tooltip: 1.0.0 => 1.1.0\n - @visx/visx: 1.0.0 => 1.1.0\n - @visx/xychart: 1.0.0 => 1.1.0 (private)\n```\n\n# v1.0.0\n\n### :house:  Internal\n\n- project renamed from `vx` => `visx`, migrated from `hshoff/vx` => `airbnb/visx` [#802](https://github.com/airbnb/visx/issues/802), [#803](https://github.com/airbnb/visx/issues/803)\n\n### :memo: Documentation\n\n- Demo site migrated from https://vx-demo.now.sh/ => https://airbnb.io/visx [#804](https://github.com/airbnb/visx/issues/804)\n- Demo site re-brand\n\n### :boom:  Breaking Changes\n\n- [all packages] `vx-...` `className`s are renamed to `visx-...` [#803](https://github.com/airbnb/visx/issues/803)\n- [demo] existing codesandbox links which reference `vx-demo` directory structure will break [#803](https://github.com/airbnb/visx/issues/803)\n- [tooltip] `className=\"vx-tooltip-portal\"` => `visx-tooltip` (so as not to be confused with the new `TooltipInPortal`) [#803](https://github.com/airbnb/visx/issues/803)\n\n#### :bug: Bug Fix\n\n- [demo] fix `/axis` codesandbox dependency [#799](https://github.com/airbnb/visx/pull/799)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n- [williaster](https://github.com/williaster)\n\n```Changes:\n@vx/*@0.0.199 => @visx/*@1.0.0\n```\n\n# v0.0.199\n\n### :boom:  Breaking Changes\n\n- [scale] Deprecate `rangeRound` field in the input of `scaleLinear()`, `scaleLog()`, `scalePoint()`, `scalePower()`, `scaleSqrt()`, `scaleTime()` and `scaleUtc()`. [#766](https://github.com/hshoff/vx/pull/766)\n    Instead of\n    ```ts\n    scaleLinear({ rangeRound: xxx })\n    ```\n    Do this instead\n    ```ts\n    scaleLinear({ range: xxx, round: true });\n    ```\n- [scale] Deprecate `ticks` and `tickFormat` in the input of `scaleQuantize()`. It was not really doing anything anyway as both `scale.ticks()` and `scale.tickFormat()` do not mutate the scale. [#766](https://github.com/hshoff/vx/pull/766)\n- [scale] Remove `scale.type` field that was attached to the d3 scales. [#766](https://github.com/hshoff/vx/pull/766)\n- [grid] `@vx/grid` components now accept D3 Scale as generic type instead of `ScaleInput`. Developers should not expect to specify this generic type as it can be inferred from the passed scale. [#775](https://github.com/hshoff/vx/pull/775)\n- [grid] Renames `GridColumnProps` => `GridColumnsProps` (+`s`) to match `GridRowsProps`. [#787](https://github.com/hshoff/vx/pull/787)\n- [legend] Update generic types for legend components. [#777](https://github.com/hshoff/vx/pull/777)\n- [marker] remove old [`<Marker />`](https://github.com/hshoff/vx/blob/v0.0.198/packages/vx-marker/src/markers/Marker.tsx#L72-L98) implementation of a Line and some Text. [#783](https://github.com/hshoff/vx/pull/783)\n\n### :rocket:  Enhancements\n\n- [scale] new functions & New fields for the scale configs. [#766](https://github.com/hshoff/vx/pull/766)\n- [scale] add meta scale types. [#770](https://github.com/hshoff/vx/pull/770)\n- [scale] Add fallback overload for createScale. [#791](https://github.com/hshoff/vx/pull/791)\n- [scale]  add new types: `AnyD3Scale`, `InferD3ScaleOutput`, `InferD3ScaleDiscreteInput`, `InferD3ScaleThresholdInput` and `ScaleInput`. Add new utilities functions: `getTicks`, `coerceNumber` and `toString`. [#773](https://github.com/hshoff/vx/pull/773)\n- [scale] add reverse field to scale config. This will reverse the range. Useful when the ranges are programmatically supplied to the scale factories such as in XYChart and developers want easy way to reverse the dynamic range. [#780](https://github.com/hshoff/vx/pull/780)\n- [legend] exports `@vx/legend` shapes from the `index` for convenience / non-deep imports. [#772](https://github.com/hshoff/vx/pull/772)\n- [grid] adds `children` prop to `GridRows` + `GridColumns` to support animated rendering. [#787](https://github.com/hshoff/vx/pull/787)\n- [shape] add `<BarRounded />` shape. [#774](https://github.com/hshoff/vx/pull/774)\n- [shape] Create new factory functions for `d3-shape` and export as part of `vx/shape` (`arc`, `area`, `line`, `pie`, `radialLine`),\nsimilar to `vx/scale` has factories for `d3-scale`. [#776](https://github.com/hshoff/vx/pull/776)\n- [shape] add `SplitLinePath` component to `@vx/shape` that allows you to create a line path split into multiple smaller line paths that can be styled independently. [#778](https://github.com/hshoff/vx/pull/778)\n- [axis] consistent and compatible typings across `vx/scale` and `vx/axis`. More fields passed to child render props of `Axis`. [#773](https://github.com/hshoff/vx/pull/773)\n- [axis] `Axis` is refactored to accept a `ticksComponent` which allows us to animate them. [#779](https://github.com/hshoff/vx/pull/779)\n- [axis] adds a third argument `values` to `tickFormat(value, index, values)` so that format logic can more easily leverage all ticks (because `numTicks` is approximate, lib consumers do not know how many tick values exist _a priori_). [#779](https://github.com/hshoff/vx/pull/779)\n- [marker] add new [`<Marker />`](https://github.com/hshoff/vx/compare/harry-svg-marker?expand=1#diff-7a829322360dc21940b608c760087e29R32-R42) that matches actual SVG [`<marker>`](https://github.com/hshoff/vx/blob/v0.0.198/packages/vx-marker/src/markers/Marker.tsx#L72-L98). [#783](https://github.com/hshoff/vx/pull/783)\n- [marker] add `<MarkerArrow />`, `<MarkerCross />`, `<MarkerX />`, `<MarkerCircle />`, `<MarkerLine />`. [#783](https://github.com/hshoff/vx/pull/783)\n- [react-spring] adds a new package `@vx/react-spring` that includes `react-spring` as a `peerDep` and can be a home for things that depend on `react-spring`. [#779](https://github.com/hshoff/vx/pull/779)\n- [react-spring] Adds an `<AnimatedAxis />` and `<AnimatedTicksRender />` in `@vx/react-spring`. [#779](https://github.com/hshoff/vx/pull/779)\n- [react-spring] updates the `vx-demo/axis` demo to use `<AnimatedAxis />`. [#779](https://github.com/hshoff/vx/pull/779)\n- [react-spring] adds `AnimatedGridRows` + `AnimatedGridColumns`. [#787](https://github.com/hshoff/vx/pull/787)\n- [react-spring] modularizes `AnimatedTicks/useAnimatedTicksConfig` to `spring-configs/useAnimatedLineTransitionConfig` so it can power both animated tick + grid lines. [#787](https://github.com/hshoff/vx/pull/787)\n- [react-spring] adds `animationTrajectory=outside | inside | min | max` to `AnimatedAxis` and `AnimatedGridRows/Columns`. [#787](https://github.com/hshoff/vx/pull/787)\n\n#### :bug: Bug Fix\n\n- [responsive] exclude `enableDebounceLeadingCall` prop being passed into `div`. [#763](https://github.com/hshoff/vx/pull/763)\n- [responsive] fix prettier format. [#764](https://github.com/hshoff/vx/pull/764)\n- [text] fix warning for NaN or invalid values are passed as x or y. [#790](https://github.com/hshoff/vx/pull/790)\n\n### :memo: Documentation\n\n- [scale] Improve documentation of the fields in scale configs. [#766](https://github.com/hshoff/vx/pull/766)\n\n### :house:  Internal\n\n- [scale] rewrite individual scale factory with composition of shared operators. This ensure order of operators and simplified code. [#766](https://github.com/hshoff/vx/pull/766)\n- [scale] add 100+ unit tests to make this `vx/scale` package has 100% test coverage. [#766](https://github.com/hshoff/vx/pull/766)\n- [stats] use updated @vx/scale types. [#770](https://github.com/hshoff/vx/pull/770)\n- [legend] extract defaultDomain helper. [#777](https://github.com/hshoff/vx/pull/777)\n- [demo] updated curves demo to use new `<Marker>`. [#783](https://github.com/hshoff/vx/pull/783)\n- [demo] updates the `/axis` demo to include `AnimatedGrid*` and a `animationTrajectory` config. [#787](https://github.com/hshoff/vx/pull/787)\n- [jest] ignore vx-demo, vx-vx code coverage. [#784](https://github.com/hshoff/vx/pull/784)\n- [annotation] 100% coverage. [#784](https://github.com/hshoff/vx/pull/784)\n- [bounds] 100% coverage. [#784](https://github.com/hshoff/vx/pull/784)\n- [brush] add utils test. [#786](https://github.com/hshoff/vx/pull/786)\n- [event] add tests. [#786](https://github.com/hshoff/vx/pull/786)\n- [test] add tests for vx/grid, vx/zoom, vx/threshold, vx/shape. [#793](https://github.com/hshoff/vx/pull/793)\n\n#### :trophy: Contributors\n\n- [robinsoncol](https://github.com/robinsoncol)\n- [kristw](https://github.com/kristw)\n- [williaster](https://github.com/williaster)\n- [hshoff](https://github.com/hshoff)\n\n```Changes:\n - @vx/annotation: 0.0.198 => 0.0.199\n - @vx/axis: 0.0.198 => 0.0.199\n - @vx/bounds: 0.0.198 => 0.0.199\n - @vx/brush: 0.0.198 => 0.0.199\n - @vx/chord: 0.0.198 => 0.0.199\n - @vx/clip-path: 0.0.198 => 0.0.199\n - @vx/curve: 0.0.198 => 0.0.199\n - @vx/demo: 0.0.198 => 0.0.199\n - @vx/drag: 0.0.198 => 0.0.199\n - @vx/event: 0.0.198 => 0.0.199\n - @vx/geo: 0.0.198 => 0.0.199\n - @vx/glyph: 0.0.198 => 0.0.199\n - @vx/gradient: 0.0.198 => 0.0.199\n - @vx/grid: 0.0.198 => 0.0.199\n - @vx/group: 0.0.198 => 0.0.199\n - @vx/heatmap: 0.0.198 => 0.0.199\n - @vx/hierarchy: 0.0.198 => 0.0.199\n - @vx/legend: 0.0.198 => 0.0.199\n - @vx/marker: 0.0.198 => 0.0.199\n - @vx/mock-data: 0.0.198 => 0.0.199\n - @vx/network: 0.0.198 => 0.0.199\n - @vx/pattern: 0.0.198 => 0.0.199\n - @vx/point: 0.0.198 => 0.0.199\n - @vx/react-spring: 0.0.198 => 0.0.199\n - @vx/responsive: 0.0.198 => 0.0.199\n - @vx/scale: 0.0.198 => 0.0.199\n - @vx/shape: 0.0.198 => 0.0.199\n - @vx/stats: 0.0.198 => 0.0.199\n - @vx/text: 0.0.198 => 0.0.199\n - @vx/threshold: 0.0.198 => 0.0.199\n - @vx/tooltip: 0.0.198 => 0.0.199\n - @vx/voronoi: 0.0.198 => 0.0.199\n - @vx/vx: 0.0.198 => 0.0.199\n - @vx/xychart: 0.0.0 => 0.0.199 (private)\n - @vx/zoom: 0.0.198 => 0.0.199\n ```\n \n# v0.0.198\n\n#### :rocket: Enhancements\n- feat(tooltip): add Portal and useTooltipInPortal [#756](https://github.com/hshoff/vx/pull/756) \n- feat(responsive): add leading option to resize debounce [#754](https://github.com/hshoff/vx/pull/754)\n- feat(axis): use numTicks when falling back on scale.domain [#752](https://github.com/hshoff/vx/pull/752)\n- feat(pattern): add diagonal right to left pattern [#744](https://github.com/hshoff/vx/pull/744)\n- feat(legend): add Line shape, legendLabelProps, and more props in renderShape [#749](https://github.com/hshoff/vx/pull/749)\n\n#### 💥 Breaking Changes\n- feat(responsive): resize debounce now defaults to true which will result in an additional render  [#754](https://github.com/hshoff/vx/pull/754)\n- feat(tooltip): add `offsetLeft/Top` to `TooltipProps`, making `TooltipProps === TooltipWithBoundsProps`, adds additional `10px` of padding to `Tooltip` `left/top` [#756](https://github.com/hshoff/vx/pull/756)\n\n#### :bug: Bug Fix\n- fix(responsive): remove debounced calls after unmounnt [#558](https://github.com/hshoff/vx/pull/558)\n\n#### :house: Internal\n- (demo): add static export deploys [#741](https://github.com/hshoff/vx/pull/741)\n\n#### :trophy: Contributors\n- [claisne](https://github.com/claisne)\n- [dennisja](https://github.com/dennisja)\n- [hshoff](https://github.com/hshoff)\n- [Pringels](https://github.com/Pringels)\n- [williaster](https://github.com/williaster)\n\n```\nChanges: \n - @vx/annotation: 0.0.197 => 0.0.198\n - @vx/axis: 0.0.197 => 0.0.198\n - @vx/bounds: 0.0.197 => 0.0.198\n - @vx/brush: 0.0.197 => 0.0.198\n - @vx/chord: 0.0.197 => 0.0.198\n - @vx/clip-path: 0.0.197 => 0.0.198\n - @vx/curve: 0.0.197 => 0.0.198\n - @vx/demo: 0.0.197 => 0.0.198\n - @vx/drag: 0.0.197 => 0.0.198\n - @vx/event: 0.0.197 => 0.0.198\n - @vx/geo: 0.0.197 => 0.0.198\n - @vx/glyph: 0.0.197 => 0.0.198\n - @vx/gradient: 0.0.197 => 0.0.198\n - @vx/grid: 0.0.197 => 0.0.198\n - @vx/group: 0.0.197 => 0.0.198\n - @vx/heatmap: 0.0.197 => 0.0.198\n - @vx/hierarchy: 0.0.197 => 0.0.198\n - @vx/legend: 0.0.197 => 0.0.198\n - @vx/marker: 0.0.197 => 0.0.198\n - @vx/mock-data: 0.0.197 => 0.0.198\n - @vx/network: 0.0.197 => 0.0.198\n - @vx/pattern: 0.0.197 => 0.0.198\n - @vx/point: 0.0.197 => 0.0.198\n - @vx/responsive: 0.0.197 => 0.0.198\n - @vx/scale: 0.0.197 => 0.0.198\n - @vx/shape: 0.0.197 => 0.0.198\n - @vx/stats: 0.0.197 => 0.0.198\n - @vx/text: 0.0.197 => 0.0.198\n - @vx/threshold: 0.0.197 => 0.0.198\n - @vx/tooltip: 0.0.197 => 0.0.198\n - @vx/voronoi: 0.0.197 => 0.0.198\n - @vx/vx: 0.0.197 => 0.0.198\n - @vx/zoom: 0.0.197 => 0.0.198\n```\n\n# v0.0.197\n\n#### :rocket: Enhancements\n\n- feat(tooltip): add unstyled prop to TooltipWithBounds [#721](https://github.com/hshoff/vx/pull/721)\n- perf(tooltip): use useCallback in useTooltip [#668](https://github.com/hshoff/vx/pull/668)\n\n#### :bug: Bug Fix\n\n- fix(zoom): fix zoom.dragMove on touchmove event y-coord [#725](https://github.com/hshoff/vx/pull/725)\n\n#### :memo: Documentation\n\n- feat(demo): new documentation, codesandbox examples [#732](https://github.com/hshoff/vx/pull/732) [#731](https://github.com/hshoff/vx/pull/731) [#730](https://github.com/hshoff/vx/pull/730) [#729](https://github.com/hshoff/vx/pull/729) [#727](https://github.com/hshoff/vx/pull/727) [#720](https://github.com/hshoff/vx/pull/720)[#720](https://github.com/hshoff/vx/pull/720) [#719](https://github.com/hshoff/vx/pull/719) [#718](https://github.com/hshoff/vx/pull/718) [#717](https://github.com/hshoff/vx/pull/717) [#716](https://github.com/hshoff/vx/pull/716) [#715](https://github.com/hshoff/vx/pull/715) [#714](https://github.com/hshoff/vx/pull/714) [#713](https://github.com/hshoff/vx/pull/713) [#712](https://github.com/hshoff/vx/pull/712) [#711](https://github.com/hshoff/vx/pull/711) [#710](https://github.com/hshoff/vx/pull/710) [#709](https://github.com/hshoff/vx/pull/709) [#708](https://github.com/hshoff/vx/pull/708) [#707](https://github.com/hshoff/vx/pull/707) [#706](https://github.com/hshoff/vx/pull/706) [#705](https://github.com/hshoff/vx/pull/705) [#704](https://github.com/hshoff/vx/pull/704) [#703](https://github.com/hshoff/vx/pull/703) [#702](https://github.com/hshoff/vx/pull/702) [#701](https://github.com/hshoff/vx/pull/701) [#700](https://github.com/hshoff/vx/pull/700) [#699](https://github.com/hshoff/vx/pull/699) [#698](https://github.com/hshoff/vx/pull/698) [#697](https://github.com/hshoff/vx/pull/697) [#696](https://github.com/hshoff/vx/pull/696) [#695](https://github.com/hshoff/vx/pull/695) [#694](https://github.com/hshoff/vx/pull/694) [#693](https://github.com/hshoff/vx/pull/693) [#692](https://github.com/hshoff/vx/pull/692) [#691](https://github.com/hshoff/vx/pull/691) [#690](https://github.com/hshoff/vx/pull/690) [#689](https://github.com/hshoff/vx/pull/689) [#688](https://github.com/hshoff/vx/pull/688) [#687](https://github.com/hshoff/vx/pull/687) [#686](https://github.com/hshoff/vx/pull/686) [#685](https://github.com/hshoff/vx/pull/685) [#684](https://github.com/hshoff/vx/pull/684) [#683](https://github.com/hshoff/vx/pull/683) [#682](https://github.com/hshoff/vx/pull/682) [#681](https://github.com/hshoff/vx/pull/681) [#680](https://github.com/hshoff/vx/pull/680) [#679](https://github.com/hshoff/vx/pull/679) [#678](https://github.com/hshoff/vx/pull/678) [#677](https://github.com/hshoff/vx/pull/677) [#676](https://github.com/hshoff/vx/pull/676) [#675](https://github.com/hshoff/vx/pull/675) [#674](https://github.com/hshoff/vx/pull/674) [#673](https://github.com/hshoff/vx/pull/673) [#672](https://github.com/hshoff/vx/pull/672) [#671](https://github.com/hshoff/vx/pull/671) [#670](https://github.com/hshoff/vx/pull/670) [#679](https://github.com/hshoff/vx/pull/669)\n\n#### :house: Internal\n\n- deps(root): bump yarn.lock, add @types/webpack [#740](https://github.com/hshoff/vx/pull/740)\n- fix(demo/package.json): lock next.js version [#740](https://github.com/hshoff/vx/pull/740)\n- fix(demo): prettier config updated so lots of minor style updates [#740](https://github.com/hshoff/vx/pull/740)\n- fix(demo/next.config.js): fix invalid webpack config error [#740](https://github.com/hshoff/vx/pull/740)\n- fix(demo/pages): routes are case sensitive (`/Docs` => `/docs`) [#740](https://github.com/hshoff/vx/pull/740)\n- feat(demo/gallery): gallery filter persists on query param `?pkg` instead of local state [#740](https://github.com/hshoff/vx/pull/740)\n\n#### :trophy: Contributors\n\n- [dennisja](https://github.com/dennisja)\n- [vodoleev-vladislav](https://github.com/vodoleev-vladislav)\n- [williaster](https://github.com/williaster)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges: \n - @vx/annotation: 0.0.196 => 0.0.197\n - @vx/axis: 0.0.196 => 0.0.197\n - @vx/bounds: 0.0.196 => 0.0.197\n - @vx/brush: 0.0.196 => 0.0.197\n - @vx/chord: 0.0.196 => 0.0.197\n - @vx/clip-path: 0.0.196 => 0.0.197\n - @vx/curve: 0.0.196 => 0.0.197\n - @vx/demo: 0.0.196 => 0.0.197\n - @vx/drag: 0.0.196 => 0.0.197\n - @vx/event: 0.0.196 => 0.0.197\n - @vx/geo: 0.0.196 => 0.0.197\n - @vx/glyph: 0.0.196 => 0.0.197\n - @vx/gradient: 0.0.196 => 0.0.197\n - @vx/grid: 0.0.196 => 0.0.197\n - @vx/group: 0.0.196 => 0.0.197\n - @vx/heatmap: 0.0.196 => 0.0.197\n - @vx/hierarchy: 0.0.196 => 0.0.197\n - @vx/legend: 0.0.196 => 0.0.197\n - @vx/marker: 0.0.196 => 0.0.197\n - @vx/mock-data: 0.0.196 => 0.0.197\n - @vx/network: 0.0.196 => 0.0.197\n - @vx/pattern: 0.0.196 => 0.0.197\n - @vx/point: 0.0.196 => 0.0.197\n - @vx/responsive: 0.0.196 => 0.0.197\n - @vx/scale: 0.0.196 => 0.0.197\n - @vx/shape: 0.0.196 => 0.0.197\n - @vx/stats: 0.0.196 => 0.0.197\n - @vx/text: 0.0.196 => 0.0.197\n - @vx/threshold: 0.0.196 => 0.0.197\n - @vx/tooltip: 0.0.196 => 0.0.197\n - @vx/voronoi: 0.0.196 => 0.0.197\n - @vx/vx: 0.0.196 => 0.0.197\n - @vx/zoom: 0.0.16 =>  0.0.19\n```\n\n# v0.0.196\n\n#### :trophy: Contributors\n\n- [dennisja](https://github.com/dennisja)\n- [maryschmidt](https://github.com/maryschmidt)\n- [williaster](https://github.com/williaster)\n\n#### :rocket: Enhancements\n\n- [brush] Add initialBrushPosition [#618](https://github.com/hshoff/vx/pull/618), fix in [#667](https://github.com/hshoff/vx/pull/667)\n\n#### 💥 Breaking Changes\n- [tooltip] Add ability to remove tooltip default styles [#666](https://github.com/hshoff/vx/pull/666). If styles were applied previously, you will also need to spread `defaultStyles`:\n\n```jsx\n// before\nimport { Tooltip } from '@vx/tooltip';\n...\n<Tooltip style={{ color: myCustomColor }} />\n\n// after\nimport { Tooltip, defaultStyles } from '@vx/tooltip';\n...\n<Tooltip style={{ ...defaultStyles, color: myCustomColor }} />\n```\n\n#### :memo: Documentation\n\n- [demo] Several demos refactored to link out to codesandbox\n\n```\nChanges:\n - @vx/annotation: 0.0.195 => 0.0.196\n - @vx/axis: 0.0.195 => 0.0.196\n - @vx/bounds: 0.0.195 => 0.0.196\n - @vx/brush: 0.0.195 => 0.0.196\n - @vx/chord: 0.0.195 => 0.0.196\n - @vx/clip-path: 0.0.195 => 0.0.196\n - @vx/curve: 0.0.195 => 0.0.196\n - @vx/demo: 0.0.195 => 0.0.196\n - @vx/drag: 0.0.195 => 0.0.196\n - @vx/event: 0.0.195 => 0.0.196\n - @vx/geo: 0.0.195 => 0.0.196\n - @vx/glyph: 0.0.195 => 0.0.196\n - @vx/gradient: 0.0.195 => 0.0.196\n - @vx/grid: 0.0.195 => 0.0.196\n - @vx/group: 0.0.195 => 0.0.196\n - @vx/heatmap: 0.0.195 => 0.0.196\n - @vx/hierarchy: 0.0.195 => 0.0.196\n - @vx/legend: 0.0.195 => 0.0.196\n - @vx/marker: 0.0.195 => 0.0.196\n - @vx/mock-data: 0.0.195 => 0.0.196\n - @vx/network: 0.0.195 => 0.0.196\n - @vx/pattern: 0.0.195 => 0.0.196\n - @vx/point: 0.0.195 => 0.0.196\n - @vx/responsive: 0.0.195 => 0.0.196\n - @vx/scale: 0.0.195 => 0.0.196\n - @vx/shape: 0.0.195 => 0.0.196\n - @vx/stats: 0.0.195 => 0.0.196\n - @vx/text: 0.0.195 => 0.0.196\n - @vx/threshold: 0.0.195 => 0.0.196\n - @vx/tooltip: 0.0.195 => 0.0.196\n - @vx/voronoi: 0.0.195 => 0.0.196\n - @vx/vx: 0.0.195 => 0.0.196\n - @vx/zoom: 0.0.195 => 0.0.196\n```\n\n# v0.0.195\n\n#### :trophy: Contributors\n\n- [ptmx](https://github.com/ptmx) PR [#631](https://github.com/hshoff/vx/pull/631)\n\n#### :rocket: Enhancements\n\n- [tooltip] `useTooltip` hook added\n\n#### :boom: Breaking Changes\n\n- [tooltip] internally introduces `useState`, requires bumping the `peerDep` for react to `^16.8.0-0`\n\n#### :memo: Documentation\n\n- [tooltip] add `useState` to readme, add advice on HOC vs hooks\n- [demo] Rewrite the `BarStack` demo to use `useTooltip` instead of `withTooltip`\n\n```\nChanges:\n - @vx/annotation: 0.0.194 => 0.0.195\n - @vx/axis: 0.0.194 => 0.0.195\n - @vx/bounds: 0.0.194 => 0.0.195\n - @vx/brush: 0.0.194 => 0.0.195\n - @vx/chord: 0.0.194 => 0.0.195\n - @vx/clip-path: 0.0.194 => 0.0.195\n - @vx/curve: 0.0.194 => 0.0.195\n - @vx/demo: 0.0.194 => 0.0.195\n - @vx/drag: 0.0.194 => 0.0.195\n - @vx/event: 0.0.194 => 0.0.195\n - @vx/geo: 0.0.194 => 0.0.195\n - @vx/glyph: 0.0.194 => 0.0.195\n - @vx/gradient: 0.0.194 => 0.0.195\n - @vx/grid: 0.0.194 => 0.0.195\n - @vx/group: 0.0.194 => 0.0.195\n - @vx/heatmap: 0.0.194 => 0.0.195\n - @vx/hierarchy: 0.0.194 => 0.0.195\n - @vx/legend: 0.0.194 => 0.0.195\n - @vx/marker: 0.0.194 => 0.0.195\n - @vx/mock-data: 0.0.194 => 0.0.195\n - @vx/network: 0.0.194 => 0.0.195\n - @vx/pattern: 0.0.194 => 0.0.195\n - @vx/point: 0.0.194 => 0.0.195\n - @vx/responsive: 0.0.194 => 0.0.195\n - @vx/scale: 0.0.194 => 0.0.195\n - @vx/shape: 0.0.194 => 0.0.195\n - @vx/stats: 0.0.194 => 0.0.195\n - @vx/text: 0.0.194 => 0.0.195\n - @vx/threshold: 0.0.194 => 0.0.195\n - @vx/tooltip: 0.0.194 => 0.0.195\n - @vx/voronoi: 0.0.194 => 0.0.195\n - @vx/vx: 0.0.194 => 0.0.195\n - @vx/zoom: 0.0.194 => 0.0.195\n```\n\n# v0.0.194\n\n#### :trophy: Contributors\n\n- [ptmx](https://github.com/ptmx)\n- [dennisja](https://github.com/dennisja)\n- [gillesdemey](https://github.com/gillesdemey)\n- [mitchellwarr](https://github.com/mitchellwarr)\n- [williaster](https://github.com/williaster)\n\n#### :rocket: Enhancements\n\n- [brush] Add resetOnEnd prop [#614](https://github.com/hshoff/vx/pull/614)\n- [tooltip] Add hook for custom Tooltip container to support SVG tooltips [#610](https://github.com/hshoff/vx/pull/610)\n- [scale] Add sqrtScale [#615](https://github.com/hshoff/vx/pull/615)\n\n#### :bug: Bug Fix\n\n- [zoom] Don't use stale zoom constraint prop [#578](https://github.com/hshoff/vx/pull/578)\n- [responsive] Don't render withParentSize base component until size is known [#621](https://github.com/hshoff/vx/pull/621)\n\n```\nChanges:\n - @vx/annotation: 0.0.193 => 0.0.194\n - @vx/axis: 0.0.193 => 0.0.194\n - @vx/bounds: 0.0.193 => 0.0.194\n - @vx/brush: 0.0.193 => 0.0.194\n - @vx/chord: 0.0.193 => 0.0.194\n - @vx/clip-path: 0.0.193 => 0.0.194\n - @vx/curve: 0.0.193 => 0.0.194\n - @vx/demo: 0.0.193 => 0.0.194\n - @vx/drag: 0.0.193 => 0.0.194\n - @vx/event: 0.0.193 => 0.0.194\n - @vx/geo: 0.0.193 => 0.0.194\n - @vx/glyph: 0.0.193 => 0.0.194\n - @vx/gradient: 0.0.193 => 0.0.194\n - @vx/grid: 0.0.193 => 0.0.194\n - @vx/group: 0.0.193 => 0.0.194\n - @vx/heatmap: 0.0.193 => 0.0.194\n - @vx/hierarchy: 0.0.193 => 0.0.194\n - @vx/legend: 0.0.193 => 0.0.194\n - @vx/marker: 0.0.193 => 0.0.194\n - @vx/mock-data: 0.0.193 => 0.0.194\n - @vx/network: 0.0.193 => 0.0.194\n - @vx/pattern: 0.0.193 => 0.0.194\n - @vx/point: 0.0.193 => 0.0.194\n - @vx/responsive: 0.0.193 => 0.0.194\n - @vx/scale: 0.0.193 => 0.0.194\n - @vx/shape: 0.0.193 => 0.0.194\n - @vx/stats: 0.0.193 => 0.0.194\n - @vx/text: 0.0.193 => 0.0.194\n - @vx/threshold: 0.0.193 => 0.0.194\n - @vx/tooltip: 0.0.193 => 0.0.194\n - @vx/voronoi: 0.0.193 => 0.0.194\n - @vx/vx: 0.0.193 => 0.0.194\n - @vx/zoom: 0.0.193 => 0.0.194\n```\n\n# v0.0.193\n\nSee the [TypeScript project](https://github.com/hshoff/vx/projects/2) for a full list of issues + PRs.\n\n#### :trophy: Contributors\n\n- [williaster](https://github.com/williaster)\n- [hshoff](https://github.com/hshoff)\n- [Rudeg](https://github.com/Rudeg)\n- [diagramatics](https://github.com/diagramatics)\n- [geekplux](https://github.com/geekplux)\n- [dennisja](https://github.com/dennisja)\n\n#### :rocket: Enhancements\n- [@vx/*] \n  - **all** packages re-written in TypeScript and export types under `lib/index.d.ts`\n  - Many misc bug fixes with improved type safety, most `propTypes` are likely stricter now\n- [brush] `@vx/brush` now exports a working `Brush` component :tada:\n- [demo] \n  - all gallery demos re-written with `react` `hooks` + types\n  - new `@vx/brush` demo is added\n\n#### :memo: Documentation\n- [@vx/*] **all** components in all packages now have full doc strings. *note*: these is not yet reflected on the docs site.\n\n#### :boom: Breaking Changes\n- [boxplot] `@vx/boxplot` deprecated in favor of `@vx/stats` [#561](https://github.com/hshoff/vx/pull/561)\n- [mock-data] `radius` and `distance` values in the `@vx/mock-data` `exoplanet` dataset were updated from strings to numbers to remove the need for consumers to coerce to numbers themselves [#579](https://github.com/hshoff/vx/pull/579)\n- [drag] [#499](https://github.com/hshoff/vx/pull/499)\n  - now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` \n  - Empty parent `<g>` wrapper around Drag `children` was replaced with a `React.Fragment` which removes a DOM element.\n- [pattern] `PatternOrientation` is no longer the default export of `@vx/patterns/lib/constants` and is instead a named export. PatternOrientation is still used as the export name if importing from the index: `import { PatternOrientation } from '@vx/pattern'` [#503](https://github.com/hshoff/vx/pull/503)\n- [shape] [#507](https://github.com/hshoff/vx/pull/507)\n  - now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` \n  - the `Arc` `centroid` prop was removed as it was not functional (it was called as if it was an `arc.centroid()` configuration parameter, but in reality the `.centroid` method is for returning the centroid of a datum.\n  - the `Area` component is no longer wrapped in an empty `<g>` element\n  - `order` and `offset` props for `Stack`, `BarStack`, `BarStackHorizontal`, and `AreaStack` previously supported `string`, `array`, or `function`s. Only the `string` prop was functional, and only the enumerated string presets are now allowed.\n- [voronoi] now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` [#512](https://github.com/hshoff/vx/pull/512)\n- [network] [#535](https://github.com/hshoff/vx/pull/535)\n  -  now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` \n  - `<Nodes />` inner node wrapper `<g>` element className changed to singular (vx-network-nodes => vx-network-node) and outer wrapper `<g>` was replaced with a React.Fragment\n  - `<Links />` inner link wrapper `<g>` element className changed to singular (vx-network-links => vx-network-link) and outer wrapper `<g>` was replaced with a React.Fragment \n- [glyph] [#518](https://github.com/hshoff/vx/pull/518)\n  - now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` \n  - (non-functional) `children` prop removed from `GlyphDot` component \n- [heatmap] now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` [#520](https://github.com/hshoff/vx/pull/520)\n- [hierarchy] now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` [#524](https://github.com/hshoff/vx/pull/524)\n- [threshold] makes the `Threshold` `id` prop required [#533](https://github.com/hshoff/vx/pull/533)\n- [geo] now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15` [#537](https://github.com/hshoff/vx/pull/537)\n- [legend] [#551](https://github.com/hshoff/vx/pull/551)\n  - now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15`  \n  - the following directory structures were changed which will break deep imports: `src/legends/* => src/*`\n- [stats] [#570](https://github.com/hshoff/vx/pull/570)\n  - now has a peerDep `react@^16.3` for `React.Fragment`, dropping support for `react@^15`  \n  - the following directory structures were changed which will break deep imports\n    - `src/violinplot/ViolinPlot.jsx => src/ViolinPlot.tsx`\n    - `src/boxplot/BoxPlot.jsx => src/BoxPlot.tsx`\n\n#### :house: Internal\n- add `TypeScript` build support to monorepo [#488](https://github.com/hshoff/vx/pull/488)\n- [text] Remove deprecated lifecycles used in Text [#576](https://github.com/hshoff/vx/pull/576)\n\n```\nChanges:\n - @vx/annotation: 0.0.192 => 0.0.193\n - @vx/axis: 0.0.192 => 0.0.193\n - @vx/bounds: 0.0.192 => 0.0.193\n - @vx/brush: 0.0.192 => 0.0.193\n - @vx/chord: 0.0.192 => 0.0.193\n - @vx/clip-path: 0.0.192 => 0.0.193\n - @vx/curve: 0.0.192 => 0.0.193\n - @vx/demo: 0.0.192 => 0.0.193\n - @vx/drag: 0.0.192 => 0.0.193\n - @vx/event: 0.0.192 => 0.0.193\n - @vx/geo: 0.0.192 => 0.0.193\n - @vx/glyph: 0.0.192 => 0.0.193\n - @vx/gradient: 0.0.192 => 0.0.193\n - @vx/grid: 0.0.192 => 0.0.193\n - @vx/group: 0.0.192 => 0.0.193\n - @vx/heatmap: 0.0.192 => 0.0.193\n - @vx/hierarchy: 0.0.192 => 0.0.193\n - @vx/legend: 0.0.192 => 0.0.193\n - @vx/marker: 0.0.192 => 0.0.193\n - @vx/mock-data: 0.0.192 => 0.0.193\n - @vx/network: 0.0.192 => 0.0.193\n - @vx/pattern: 0.0.192 => 0.0.193\n - @vx/point: 0.0.192 => 0.0.193\n - @vx/responsive: 0.0.192 => 0.0.193\n - @vx/scale: 0.0.192 => 0.0.193\n - @vx/shape: 0.0.192 => 0.0.193\n - @vx/stats: 0.0.192 => 0.0.193\n - @vx/text: 0.0.192 => 0.0.193\n - @vx/threshold: 0.0.192 => 0.0.193\n - @vx/tooltip: 0.0.192 => 0.0.193\n - @vx/voronoi: 0.0.192 => 0.0.193\n - @vx/vx: 0.0.192 => 0.0.193\n - @vx/zoom: 0.0.192 => 0.0.193\n```\n\n# v0.0.192\n\nSee [#484](https://github.com/hshoff/vx/pull/484) for details.\n\n#### :boom: Breaking Changes\n\n- [breaking] Deprecate `build/` and `dist/`, use `lib/` and `esm/` instead\n- [breaking] Deprecate umd builds\n\n#### :house: Internal\n\n- use `babel` not `rollup`\n- use `yarn` not `npm`\n  - this will enable `workspaces` so that we can push all config to the root instead of duplicating across every package as is the case now\n- Stricter linting rules (e.g., `.jsx` required for `React` files)\n\n#### :trophy: Contributors\n\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @vx/annotation: 0.0.190 => 0.0.192\n - @vx/axis: 0.0.191 => 0.0.192\n - @vx/bounds: 0.0.189 => 0.0.192\n - @vx/boxplot: 0.0.190 => 0.0.192\n - @vx/brush: 0.0.189 => 0.0.192\n - @vx/chord: 0.0.189 => 0.0.192\n - @vx/clip-path: 0.0.189 => 0.0.192\n - @vx/curve: 0.0.189 => 0.0.192\n - @vx/demo: 0.0.191 => 0.0.192\n - @vx/drag: 0.0.189 => 0.0.192\n - @vx/event: 0.0.189 => 0.0.192\n - @vx/geo: 0.0.190 => 0.0.192\n - @vx/glyph: 0.0.190 => 0.0.192\n - @vx/gradient: 0.0.189 => 0.0.192\n - @vx/grid: 0.0.190 => 0.0.192\n - @vx/group: 0.0.190 => 0.0.192\n - @vx/heatmap: 0.0.190 => 0.0.192\n - @vx/hierarchy: 0.0.190 => 0.0.192\n - @vx/legend: 0.0.190 => 0.0.192\n - @vx/marker: 0.0.190 => 0.0.192\n - @vx/mock-data: 0.0.189 => 0.0.192\n - @vx/network: 0.0.190 => 0.0.192\n - @vx/pattern: 0.0.189 => 0.0.192\n - @vx/point: 0.0.189 => 0.0.192\n - @vx/responsive: 0.0.189 => 0.0.192\n - @vx/scale: 0.0.190 => 0.0.192\n - @vx/shape: 0.0.190 => 0.0.192\n - @vx/stats: 0.0.190 => 0.0.192\n - @vx/text: 0.0.191 => 0.0.192\n - @vx/threshold: 0.0.190 => 0.0.192\n - @vx/tooltip: 0.0.189 => 0.0.192\n - @vx/voronoi: 0.0.190 => 0.0.192\n - @vx/vx: 0.0.191 => 0.0.192\n - @vx/zoom: 0.0.189 => 0.0.192\n```\n\n# v0.0.191\n\nSee [#487](https://github.com/hshoff/vx/pull/487) for details.\n\n#### :boom: Breaking Changes\n\n- [text] peerDep `react@^16.3`, deprecate react 15\n- [text] prefix lifecycle methods with `UNSAFE_`\n- [axis] peerDep `react@^16.3`, deprecate react 15 due to @vx/text dep\n- [demo] use react 16.9\n- [demo] prefix lifecycle methods with `UNSAFE_`\n\n#### :house: Internal\n\n- [internal] update deps: coveralls, lint-staged, marked\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/axis: 0.0.190 => 0.0.191\n - @vx/demo: 0.0.190 => 0.0.191\n - @vx/text: 0.0.190 => 0.0.191\n - @vx/vx: 0.0.190 => 0.0.191\n ```\n\n# v0.0.190\n\n#### 💥 Breaking Changes\n\n- [scale] [d3-scale 2.2.2 changed](https://github.com/d3/d3-scale/issues/117) the behavior of a collapsed domain. See [this comment](https://github.com/hshoff/vx/issues/473#issuecomment-508203310) for how to handle the updated behavior. [#477](https://github.com/hshoff/vx/pull/477)\n- [text] Don't split strings rendered by `<Text />` when encountering a set of non-breaking space characters. [#460](https://github.com/hshoff/vx/pull/460)\n\n#### :rocket: Enhancements\n\n- [group] add innerRef prop. [#480](https://github.com/hshoff/vx/pull/480)\n- [scale] bump d3-scale dep to `^2.2.2` for scaleSymlog. [#477](https://github.com/hshoff/vx/pull/477)\n- [scale] add scaleSymlog. [#470](https://github.com/hshoff/vx/pull/470)\n\n#### :bug: Bug Fix\n\n- [stats] fix horizontal boxplot in @vx/stats. [#476](https://github.com/hshoff/vx/pull/476)\n- [boxplot] fix horizontal boxplot in @vx/boxplot. [#472](https://github.com/hshoff/vx/pull/472)\n- [heatmap] remove `bin.x0`. The x0 offset is accounted for in `bin.x`. [#475](https://github.com/hshoff/vx/pull/475)\n\n#### :memo: Documentation\n\n- [docs][group] add innerRef prop. [#480](https://github.com/hshoff/vx/pull/480)\n- [axis] fix `tickLabelProps()` prop default args for docs. [#478](https://github.com/hshoff/vx/pull/478)\n- [glyph] remove outdated readme description. [#478](https://github.com/hshoff/vx/pull/478)\n- [docs] run doc:gen script. [#478](https://github.com/hshoff/vx/pull/478)\n\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n- [robsco-git](https://github.com/robsco-git)\n- [LambStack](https://github.com/LambStack)\n- [mmarkelov](https://github.com/mmarkelov)\n\n```\nChanges:\n - @vx/annotation: 0.0.189 => 0.0.190\n - @vx/axis: 0.0.189 => 0.0.190\n - @vx/boxplot: 0.0.189 => 0.0.190\n - @vx/demo: 0.0.189 => 0.0.190\n - @vx/geo: 0.0.189 => 0.0.190\n - @vx/glyph: 0.0.189 => 0.0.190\n - @vx/grid: 0.0.189 => 0.0.190\n - @vx/group: 0.0.189 => 0.0.190\n - @vx/heatmap: 0.0.189 => 0.0.190\n - @vx/hierarchy: 0.0.189 => 0.0.190\n - @vx/legend: 0.0.189 => 0.0.190\n - @vx/marker: 0.0.189 => 0.0.190\n - @vx/network: 0.0.189 => 0.0.190\n - @vx/scale: 0.0.189 => 0.0.190\n - @vx/shape: 0.0.189 => 0.0.190\n - @vx/stats: 0.0.189 => 0.0.190\n - @vx/text: 0.0.189 => 0.0.190\n - @vx/threshold: 0.0.189 => 0.0.190\n - @vx/voronoi: 0.0.189 => 0.0.190\n - @vx/vx: 0.0.189 => 0.0.190\n ```\n\n# v0.0.189\n\n#### :boom: Breaking Changes\n\n- [shape] `<Arc />` and `<Pie pieValue={} />` props now check for `!== undefined`. Before `0` wouldn't set the prop to `0` because `if (0)` is `false`. This is only a breaking change if you were passing `0` before and happy with `<Arc />` treating that as `undefined` and using d3.arc() defaults. [#464](https://github.com/hshoff/vx/pull/464)\n- [zoom] make wheel event active by default. fixes Chrome 73 scroll intervention warning. [#456](https://github.com/hshoff/vx/pull/456)\n  + To keep the default behavior before Chrome 73 and remove console warnings in Chrome 73, **remove**: \n    ```diff\n    <MyComponent\n    - onWheel={zoom.handleWheel}\n    />\n    ```\n  + To make the onWheel events passive, **add**:\n    ```diff\n    <Zoom\n    + passive={true}\n    >\n      {zoom => {\n        return (\n          <MyComponent\n    +      onWheel={zoom.handleWheel}\n          /> \n        );\n      }}\n    </Zoom>\n    ```\n\n#### :rocket: Enhancements\n\n- [responsive][shape][text][geo] update `innerRef` propType to include PropType.object. [#446](https://github.com/hshoff/vx/pull/446)\n\n#### :bug: Bug Fix\n\n- [text] move Babel dependencies to dev only. [#461](https://github.com/hshoff/vx/pull/461)\n- [shape] `<Arc />` now respects `0` as an allowed prop value. [#464](https://github.com/hshoff/vx/pull/464)\n- [shape] `<Pie />`  `pieValue` now respects `0` as an allowed prop value. [#464](https://github.com/hshoff/vx/pull/464)\n\n#### :memo: Documentation\n\n- [docs] update docs. [#446](https://github.com/hshoff/vx/pull/446)\n- [glyph] fixes outdated `@vx/glyph` examples in the readme docs. [#454](https://github.com/hshoff/vx/pull/454)\n\n#### :house: Internal\n\n- [internal] fix jest code coverage, update jest, move to `babel.config.js` + `jest.config.js`. [#439](https://github.com/hshoff/vx/pull/439)\n- [internal] babel preset env target `explorer` => `ie`. [#446](https://github.com/hshoff/vx/pull/446)\n- [internal] babel preset env target remove `ucandroid`. [#446](https://github.com/hshoff/vx/pull/446)\n- [shape] add more `<Arc />` tests. [#464](https://github.com/hshoff/vx/pull/464)\n- [shape] convert `Arc.test` from `CRLF` => `LF`. [#464](https://github.com/hshoff/vx/pull/464)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n- [milesj](https://github.com/milesj)\n\n```\nChanges:\n - @vx/annotation: 0.0.184 => 0.0.189\n - @vx/axis: 0.0.184 => 0.0.189\n - @vx/bounds: 0.0.182 => 0.0.189\n - @vx/boxplot: 0.0.183 => 0.0.189\n - @vx/brush: 0.0.182 => 0.0.189\n - @vx/chord: 0.0.183 => 0.0.189\n - @vx/clip-path: 0.0.183 => 0.0.189\n - @vx/curve: 0.0.182 => 0.0.189\n - @vx/demo: 0.0.188 => 0.0.189\n - @vx/drag: 0.0.183 => 0.0.189\n - @vx/event: 0.0.182 => 0.0.189\n - @vx/geo: 0.0.187 => 0.0.189\n - @vx/glyph: 0.0.183 => 0.0.189\n - @vx/gradient: 0.0.183 => 0.0.189\n - @vx/grid: 0.0.184 => 0.0.189\n - @vx/group: 0.0.183 => 0.0.189\n - @vx/heatmap: 0.0.183 => 0.0.189\n - @vx/hierarchy: 0.0.183 => 0.0.189\n - @vx/legend: 0.0.183 => 0.0.189\n - @vx/marker: 0.0.184 => 0.0.189\n - @vx/mock-data: 0.0.185 => 0.0.189\n - @vx/network: 0.0.183 => 0.0.189\n - @vx/pattern: 0.0.183 => 0.0.189\n - @vx/point: 0.0.182 => 0.0.189\n - @vx/responsive: 0.0.188 => 0.0.189\n - @vx/scale: 0.0.182 => 0.0.189\n - @vx/shape: 0.0.184 => 0.0.189\n - @vx/stats: 0.0.183 => 0.0.189\n - @vx/text: 0.0.183 => 0.0.189\n - @vx/threshold: 0.0.184 => 0.0.189\n - @vx/tooltip: 0.0.184 => 0.0.189\n - @vx/voronoi: 0.0.183 => 0.0.189\n - @vx/vx: 0.0.188 => 0.0.189\n - @vx/zoom: 0.0.185 => 0.0.189\n```\n\n# v0.0.188\n\n#### :bug: Bug Fix\n\n- [responsive] add debounceTime back to prevent it spreading on children through restProps. [#437](https://github.com/hshoff/vx/pull/437)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.187 => 0.0.188\n - @vx/responsive: 0.0.186 => 0.0.188\n - @vx/vx: 0.0.187 => 0.0.188\n ```\n\n# v0.0.187\n\n#### :rocket: Enhancements\n\n- [geo] add `<CustomProjection projection={someProjectionFunction} />`. [#434](https://github.com/hshoff/vx/pull/434)\n\n#### :memo: Documentation\n\n- [demo] add `<CustomProjection />` tile. [#434](https://github.com/hshoff/vx/pull/434)\n\n#### :house: Internal\n\n- [geo] add `<CustomProjection />` test. [#435](https://github.com/hshoff/vx/pull/435)\n\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.186 => 0.0.187\n - @vx/geo: 0.0.184 => 0.0.187\n - @vx/vx: 0.0.186 => 0.0.187\n ```\n\n# v0.0.186\n\n#### :memo: Documentation\n\n- [demo] cleanup DragII demo. [#424](https://github.com/hshoff/vx/pull/424)\n- [demo] fixed broken BarStacks example. Bar Stack Horizontal example works correct, but BarStack for some reason uses `({ barStacks })` instead of `barStacks`. [#423](https://github.com/hshoff/vx/pull/423)\n\n#### :bug: Bug Fix\n\n- [responsive] `<ParentSize />` replace `for..of` with `forEach()` to fix IE11 error without having to sham `Symbol`. More info: https://github.com/hshoff/vx/issues/258 [#428](https://github.com/hshoff/vx/pull/428)\n\n#### :trophy: Contributors\n\n- [EugeneDraitsev](https://github.com/EugeneDraitsev)\n- [dennisja](https://github.com/dennisja)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.185 => 0.0.186\n - @vx/responsive: 0.0.184 => 0.0.186\n - @vx/vx: 0.0.185 => 0.0.186\n ```\n\n# v0.0.185\n\n#### :rocket: Enhancements\n\n- [zoom] add `<Zoom />`. [#418](https://github.com/hshoff/vx/pull/418)\n- [mock data] add `genPhyllotaxis()`. [#418](https://github.com/hshoff/vx/pull/418)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.184 => 0.0.185\n - @vx/mock-data: 0.0.182 => 0.0.185\n - @vx/vx: 0.0.184 => 0.0.185\n - @vx/zoom: 0.0.182 => 0.0.185\n ```\n\n# v0.0.184\n\n#### :rocket: Enhancements\n\n- [geo] add `albersUsa` projection in d3-geo to @vx/geo. [#415](https://github.com/hshoff/vx/pull/415)\n- [geo] add `equalEarth` projection in d3-geo to @vx/geo. [#407](https://github.com/hshoff/vx/pull/407)\n\n#### :bug: Bug Fix\n\n- [shape] fix proptype for LinePath `defined` prop. Should use `oneOfType` rather than `oneOf`. [#414](https://github.com/hshoff/vx/pull/414)\n- [demo] remove unnecessary destructuring of props in demo code. [#409](https://github.com/hshoff/vx/pull/409)\n- [responsive] fix proptype for ScaleSVG `children` prop. [#408](https://github.com/hshoff/vx/pull/408)\n\n#### :memo: Documentation\n\n- [tooltip] fix tooltip docs. [#403](https://github.com/hshoff/vx/pull/403)\n\n#### :trophy: Contributors\n\n- [lorenries](https://github.com/lorenries)\n- [spiderbites](https://github.com/spiderbites)\n- [pajkicdj](https://github.com/pajkicdj)\n- [mmarkelov](https://github.com/mmarkelov)\n- [dennisja](https://github.com/dennisja)\n\n```\nChanges:\n - @vx/annotation: 0.0.183 => 0.0.184\n - @vx/axis: 0.0.183 => 0.0.184\n - @vx/demo: 0.0.183 => 0.0.184\n - @vx/geo: 0.0.183 => 0.0.184\n - @vx/grid: 0.0.183 => 0.0.184\n - @vx/marker: 0.0.183 => 0.0.184\n - @vx/responsive: 0.0.183 => 0.0.184\n - @vx/shape: 0.0.183 => 0.0.184\n - @vx/threshold: 0.0.183 => 0.0.184\n - @vx/tooltip: 0.0.182 => 0.0.184\n - @vx/vx: 0.0.183 => 0.0.184\n```\n\n# v0.0.183\n\n#### :rocket: Enhancements\n\n- [responsive] add `innerRef` prop to `<ScaleSVG />`. [#393](https://github.com/hshoff/vx/pull/393)\n\n#### :memo: Documentation\n\n- [docs] use [react-docgen](https://github.com/reactjs/react-docgen) to generate docs from prop-types and comments. [#399](https://github.com/hshoff/vx/pull/399)\n- [responsive][docs] add innerRef prop docs. [#400](https://github.com/hshoff/vx/pull/400)\n- [threshold][docs] update `clipAboveTo` and `clipBelowTo` prop types to `number|func`. [#401](https://github.com/hshoff/vx/pull/401)\n\n#### :house: Internal\n\n- [docs] add script to sync files -> docs -> readme -> [vx-demo.now.sh/docs](https://vx-demo.now.sh/docs). [#399](https://github.com/hshoff/vx/pull/399)\n\n\n#### :trophy: Contributors\n\n- [dagda1](https://github.com/dagda1)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.182 => 0.0.183\n - @vx/axis: 0.0.182 => 0.0.183\n - @vx/boxplot: 0.0.182 => 0.0.183\n - @vx/chord: 0.0.182 => 0.0.183\n - @vx/clip-path: 0.0.182 => 0.0.183\n - @vx/demo: 0.0.182 => 0.0.183\n - @vx/drag: 0.0.182 => 0.0.183\n - @vx/geo: 0.0.182 => 0.0.183\n - @vx/glyph: 0.0.182 => 0.0.183\n - @vx/gradient: 0.0.182 => 0.0.183\n - @vx/grid: 0.0.182 => 0.0.183\n - @vx/group: 0.0.182 => 0.0.183\n - @vx/heatmap: 0.0.182 => 0.0.183\n - @vx/hierarchy: 0.0.182 => 0.0.183\n - @vx/legend: 0.0.182 => 0.0.183\n - @vx/marker: 0.0.182 => 0.0.183\n - @vx/network: 0.0.182 => 0.0.183\n - @vx/pattern: 0.0.182 => 0.0.183\n - @vx/responsive: 0.0.182 => 0.0.183\n - @vx/shape: 0.0.182 => 0.0.183\n - @vx/stats: 0.0.182 => 0.0.183\n - @vx/text: 0.0.182 => 0.0.183\n - @vx/threshold: 0.0.182 => 0.0.183\n - @vx/voronoi: 0.0.182 => 0.0.183\n - @vx/vx: 0.0.182 => 0.0.183\n```\n\n# v0.0.182\n\n#### :bug: Bug Fix\n\n- [tooltip] fractional pixel values can sometimes lead to shaky rendering when using Firefox. [#389](https://github.com/hshoff/vx/pull/389)\n\n#### :memo: Documentation\n\n- [gallery] add `<BarStackHorizontal />` example code back. [#387](https://github.com/hshoff/vx/pull/387)\n- [readme] add a new demo of a project using vx components. [#391](https://github.com/hshoff/vx/pull/391)\n\n#### :house: Internal\n\n- [internal] upgrade to [babel@7](https://babeljs.io/docs/en/v7-migration.html). [#387](https://github.com/hshoff/vx/pull/387)\n\n#### :trophy: Contributors\n\n- [abradley](https://github.com/abradley)\n- [JayWelsh](https://github.com/JayWelsh)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.181 => 0.0.182\n - @vx/axis: 0.0.181 => 0.0.182\n - @vx/bounds: 0.0.165 => 0.0.182\n - @vx/boxplot: 0.0.181 => 0.0.182\n - @vx/brush: 0.0.179 => 0.0.182\n - @vx/chord: 0.0.166 => 0.0.182\n - @vx/clip-path: 0.0.165 => 0.0.182\n - @vx/curve: 0.0.165 => 0.0.182\n - @vx/demo: 0.0.181 => 0.0.182\n - @vx/drag: 0.0.179 => 0.0.182\n - @vx/event: 0.0.179 => 0.0.182\n - @vx/geo: 0.0.181 => 0.0.182\n - @vx/glyph: 0.0.181 => 0.0.182\n - @vx/gradient: 0.0.165 => 0.0.182\n - @vx/grid: 0.0.181 => 0.0.182\n - @vx/group: 0.0.170 => 0.0.182\n - @vx/heatmap: 0.0.181 => 0.0.182\n - @vx/hierarchy: 0.0.181 => 0.0.182\n - @vx/legend: 0.0.181 => 0.0.182\n - @vx/marker: 0.0.181 => 0.0.182\n - @vx/mock-data: 0.0.179 => 0.0.182\n - @vx/network: 0.0.179 => 0.0.182\n - @vx/pattern: 0.0.179 => 0.0.182\n - @vx/point: 0.0.165 => 0.0.182\n - @vx/responsive: 0.0.179 => 0.0.182\n - @vx/scale: 0.0.179 => 0.0.182\n - @vx/shape: 0.0.181 => 0.0.182\n - @vx/stats: 0.0.181 => 0.0.182\n - @vx/text: 0.0.179 => 0.0.182\n - @vx/threshold: 0.0.181 => 0.0.182\n - @vx/tooltip: 0.0.179 => 0.0.182\n - @vx/voronoi: 0.0.181 => 0.0.182\n - @vx/vx: 0.0.181 => 0.0.182\n - @vx/zoom: 0.0.165 => 0.0.182\n```\n\n# v0.0.181\n\nFor a summary and before + after of changes please see: https://github.com/hshoff/vx/pull/383\n\n#### :boom: Breaking Changes\n\n- [glyph][breaking] rm additionalProps, add children as fn \n- [shape][breaking] rm additionalProps, add children as fn \n- [geo][breaking] rm additionalProps, add children as fn \n- [heatmap][breaking] rm additionalProps, add children as fn \n- [stats][breaking] rm additionalProps, add children as fn \n- [boxplot][breaking] rm additionalProps, add children as fn \n- [voronoi][breaking] rm additionalProps, add children as fn \n- [legend][breaking] rm additionalProps, add children as fn \n\n#### :house: Internal\n\n- [demo] update gallery tile examples to new apis\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.179 => 0.0.181\n - @vx/axis: 0.0.179 => 0.0.181\n - @vx/boxplot: 0.0.170 => 0.0.181\n - @vx/demo: 0.0.180 => 0.0.181\n - @vx/geo: 0.0.179 => 0.0.181\n - @vx/glyph: 0.0.179 => 0.0.181\n - @vx/grid: 0.0.180 => 0.0.181\n - @vx/heatmap: 0.0.179 => 0.0.181\n - @vx/hierarchy: 0.0.179 => 0.0.181\n - @vx/legend: 0.0.179 => 0.0.181\n - @vx/marker: 0.0.179 => 0.0.181\n - @vx/shape: 0.0.179 => 0.0.181\n - @vx/stats: 0.0.179 => 0.0.181\n - @vx/threshold: 0.0.179 => 0.0.181\n - @vx/voronoi: 0.0.170 => 0.0.181\n - @vx/vx: 0.0.180 => 0.0.181\n```\n\n# v0.0.180\n\n#### :rocket: Enhancements\n\n- [grid] allow passing in `tickValues` prop to both Columns and Rows, to render grid lines at specific values. [#376](https://github.com/hshoff/vx/pull/376)\n- [grid] allow passing in `rowTickValues` prop and `columnTickValues` prop to Grid. [#376](https://github.com/hshoff/vx/pull/376)\n- [grid] update vx-grid's Readme.md to reflect the changes above.[#376](https://github.com/hshoff/vx/pull/376)\n\n#### :bug: Bug Fix\n\n- [grid] updates `strokeWidth` `propTypes` in the `@vx/grid` components to allow numbers in addition to strings. [#380](https://github.com/hshoff/vx/pull/380)\n\n#### :trophy: Contributors\n\n- [robinsoncol](https://github.com/robinsoncol)\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @vx/demo: 0.0.179 => 0.0.180\n - @vx/grid: 0.0.179 => 0.0.180\n - @vx/vx: 0.0.179 => 0.0.180\n ```\n\n# v0.0.179\n\n#### :boom: Breaking Changes\n\n- [vx] there's a possibility that new prop type checks might not be as care free as before. [#371](https://github.com/hshoff/vx/pull/371)\n\n#### :rocket: Enhancements\n\n- [vx] add missing `propTypes` to all components. [#371](https://github.com/hshoff/vx/pull/371)\n\n#### :house: Internal\n\n- [vx] add `.eslintrc`. [#371](https://github.com/hshoff/vx/pull/371)\n- [vx] fix all eslint errors + warnings. [#371](https://github.com/hshoff/vx/pull/371)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.178 => 0.0.179\n - @vx/axis: 0.0.178 => 0.0.179\n - @vx/brush: 0.0.165 => 0.0.179\n - @vx/demo: 0.0.178 => 0.0.179\n - @vx/drag: 0.0.165 => 0.0.179\n - @vx/event: 0.0.165 => 0.0.179\n - @vx/geo: 0.0.170 => 0.0.179\n - @vx/glyph: 0.0.170 => 0.0.179\n - @vx/grid: 0.0.178 => 0.0.179\n - @vx/heatmap: 0.0.173 => 0.0.179\n - @vx/hierarchy: 0.0.170 => 0.0.179\n - @vx/legend: 0.0.178 => 0.0.179\n - @vx/marker: 0.0.178 => 0.0.179\n - @vx/mock-data: 0.0.165 => 0.0.179\n - @vx/network: 0.0.172 => 0.0.179\n - @vx/pattern: 0.0.165 => 0.0.179\n - @vx/responsive: 0.0.177 => 0.0.179\n - @vx/scale: 0.0.178 => 0.0.179\n - @vx/shape: 0.0.178 => 0.0.179\n - @vx/stats: 0.0.178 => 0.0.179\n - @vx/text: 0.0.175 => 0.0.179\n - @vx/threshold: 0.0.178 => 0.0.179\n - @vx/tooltip: 0.0.165 => 0.0.179\n - @vx/vx: 0.0.178 => 0.0.179\n```\n\n# v0.0.178\n\n#### :rocket: Enhancements\n\n- [scale] add `type` property. [#367](https://github.com/hshoff/vx/pull/367)\n- [legend] add optional `flex` prop for overriding `flex` css property to `<LegendLabel />`. [#370](https://github.com/hshoff/vx/pull/370)\n- [shape] add support for non-scaleBand scales to `<BarStack />` and `<BarStackHorizontal />`. [#368](https://github.com/hshoff/vx/pull/368)\n\n#### :bug: Bug Fix\n\n- [legend] allow overriding flex property to fix [IE flexbox bug](https://stackoverflow.com/questions/39192995/flex-container-wont-expand-to-fit-content-in-ie). IE 11 does not seem to expand to minimum content width when flex-basis is 0px (this is the case when using the shorthand `flex: 1`). [#370](https://github.com/hshoff/vx/pull/370)\n\n#### :trophy: Contributors\n\n- [jdmoody](https://github.com/jdmoody)\n- [lucafalasco](https://github.com/lucafalasco)\n\n```\nChanges:\n - @vx/annotation: 0.0.176 => 0.0.178\n - @vx/axis: 0.0.176 => 0.0.178\n - @vx/demo: 0.0.177 => 0.0.178\n - @vx/grid: 0.0.176 => 0.0.178\n - @vx/legend: 0.0.170 => 0.0.178\n - @vx/marker: 0.0.176 => 0.0.178\n - @vx/scale: 0.0.165 => 0.0.178\n - @vx/shape: 0.0.176 => 0.0.178\n - @vx/stats: 0.0.170 => 0.0.178\n - @vx/threshold: 0.0.176 => 0.0.178\n - @vx/vx: 0.0.177 => 0.0.178\n```\n\n# v0.0.177\n\n#### :rocket: Enhancements\n\n- [responsive] add rest props to `<ParentSize />` wrapper internal div. [#363](https://github.com/hshoff/vx/pull/363), [#365](https://github.com/hshoff/vx/pull/365)\n\n#### :trophy: Contributors\n\n- [giulioz](https://github.com/giulioz)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.176 => 0.0.177\n - @vx/responsive: 0.0.175 => 0.0.177\n - @vx/vx: 0.0.176 => 0.0.177\n```\n\n# v0.0.176\n\n#### :bug: Bug Fix\n\n- [shape] fix for `<Polygon />` rest props\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.175 => 0.0.176\n - @vx/axis: 0.0.175 => 0.0.176\n - @vx/demo: 0.0.175 => 0.0.176\n - @vx/grid: 0.0.175 => 0.0.176\n - @vx/marker: 0.0.175 => 0.0.176\n - @vx/shape: 0.0.175 => 0.0.176\n - @vx/threshold: 0.0.175 => 0.0.176\n - @vx/vx: 0.0.175 => 0.0.176\n ```\n\n# v0.0.175\n\n#### :boom: Breaking Changes\n\n- [responsive] Rewrite withParentSize using ResizeObserver. `withParentSize()` changed `windowResizeDebounceTime` prop to `debounceTime` to match `<ParentSize />`. [#348](https://github.com/hshoff/vx/pull/348)\n\n#### :bug: Bug Fix\n\n- [axis] fix `labelTransform` function in *@vx/axis* to correctly align the axis label when different values for the scale's *range* are specified, in particular when it does not start (or end) with a 0. [#349](https://github.com/hshoff/vx/pull/349)\n- [text] change measurement svg `display: none` =>  `position: absolute` and position the svg offscreen. [#358](https://github.com/hshoff/vx/pull/358)\n\n#### :rocket: Enhancements\n\n- [shape] add `<Polygon />` component. [#355](https://github.com/hshoff/vx/pull/355)\n\n#### :memo: Documentation\n\n- [demo] update /boxplot example code. [#354](https://github.com/hshoff/vx/pull/354)\n- [demo] add /polygons example. [#355](https://github.com/hshoff/vx/pull/355)\n\n#### :house: Internal\n\n- [dev] add linting. [#346](https://github.com/hshoff/vx/pull/346)\n\n#### :trophy: Contributors\n\n- [lucafalasco](https://github.com/lucafalasco)\n- [marcofugaro](https://github.com/marcofugaro)\n- [geekplux](https://github.com/geekplux)\n- [ezy](https://github.com/ezy)\n- [dagda1](https://github.com/dagda1)\n- [mmartinsky](https://github.com/mmartinsky)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.171 => 0.0.175\n - @vx/axis: 0.0.173 => 0.0.175\n - @vx/demo: 0.0.174 => 0.0.175\n - @vx/grid: 0.0.171 => 0.0.175\n - @vx/marker: 0.0.171 => 0.0.175\n - @vx/responsive: 0.0.172 => 0.0.175\n - @vx/shape: 0.0.171 => 0.0.175\n - @vx/text: 0.0.173 => 0.0.175\n - @vx/threshold: 0.0.174 => 0.0.175\n - @vx/vx: 0.0.173 => 0.0.175\n```\n\n# v0.0.174\n\n#### :rocket: Enhancements\n\n- [threshold] add id prop for unique clip-path ids. [#342](https://github.com/hshoff/vx/pull/342)\n\n#### :memo: Documentation\n\n- [demo] update heatmap example code to match new api. [#340](https://github.com/hshoff/vx/pull/340)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.173 => 0.0.174\n - @vx/threshold: 0.0.171 => 0.0.174\n```\n\n# v0.0.173\n\n#### :boom: Breaking Changes\n\n- [heatmap] simplify `heatmap` API. [#332](https://github.com/hshoff/vx/pull/332)\n\n#### :rocket: Enhancements\n\n- [text] add innerRef prop. [#339](https://github.com/hshoff/vx/pull/339)\n\n#### :memo: Documentation\n\n- [docs] add code coverage demo to readme. [#337](https://github.com/hshoff/vx/pull/337)\n\n#### :trophy: Contributors\n\n- [jens-ox](https://github.com/jens-ox)\n- [ezy](https://github.com/ezy)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/axis: 0.0.171 => 0.0.173\n - @vx/demo: 0.0.172 => 0.0.173\n - @vx/heatmap: 0.0.170 => 0.0.173\n - @vx/text: 0.0.165 => 0.0.173\n - @vx/vx: 0.0.172 => 0.0.173\n ```\n\n# v0.0.172\n\n#### :bug: Bug Fix\n\n- [responsive] Avoid `ResizeObserver` loop limit exceeded. The issues surfaces on Chrome version >=64. [#335](https://github.com/hshoff/vx/pull/335)\n\n#### :memo: Documentation\n\n- [network] remove unrelated docs from readme. [#330](https://github.com/hshoff/vx/pull/330)\n\n#### :trophy: Contributors\n\n- [kristw](https://github.com/kristw)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.171 => 0.0.172\n - @vx/network: 0.0.170 => 0.0.172\n - @vx/responsive: 0.0.165 => 0.0.172\n - @vx/vx: 0.0.171 => 0.0.172\n```\n\n# v0.0.171\n\n#### :bug: Bug Fix\n\n- [shape] `<Pie />` allow null sort callbacks. `<Pie pieSort={null} pieSortValues={null} />` isn't ignored. [#327](https://github.com/hshoff/vx/pull/327)\n\n#### :trophy: Contributors\n\n- [Gosha](https://github.com/Gosha)\n\n```\nChanges:\n - @vx/annotation: 0.0.170 => 0.0.171\n - @vx/axis: 0.0.170 => 0.0.171\n - @vx/demo: 0.0.170 => 0.0.171\n - @vx/grid: 0.0.170 => 0.0.171\n - @vx/marker: 0.0.170 => 0.0.171\n - @vx/shape: 0.0.170 => 0.0.171\n - @vx/threshold: 0.0.170 => 0.0.171\n - @vx/vx: 0.0.170 => 0.0.171\n ```\n\n# v0.0.170\n\n#### :rocket: Enhancements\n\n- [shape] add `<BarGroupHorizontal />` component. [#320](https://github.com/hshoff/vx/pull/320)\n- [shape] add optional `y0` prop to `<AreaClosed />` for custom area fills. [#319](https://github.com/hshoff/vx/pull/319)\n\n#### :bug: Bug Fix\n\n- [group] <possibly breaking change> fix `<Group />` classname. should be `vx-group`, not `cx-group`. [#316](https://github.com/hshoff/vx/pull/316)\n\n#### :memo: Documentation\n\n- [docs] run readme docs sync. [#325](https://github.com/hshoff/vx/pull/325)\n- [stats] update `@vx/stats` readme name to stats. [#324](https://github.com/hshoff/vx/pull/324)\n- [shape] add docs for `<BarGroup />` and `<BarGroupHorizontal />`. [#320](https://github.com/hshoff/vx/pull/320)\n\n#### :trophy: Contributors\n\n- [sdd](https://github.com/sdd)\n- [rjatkinson2](https://github.com/rjatkinson2)\n- [spiderbites](https://github.com/spiderbites)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.168 => 0.0.170\n - @vx/axis: 0.0.168 => 0.0.170\n - @vx/boxplot: 0.0.165 => 0.0.170\n - @vx/demo: 0.0.169 => 0.0.170\n - @vx/geo: 0.0.166 => 0.0.170\n - @vx/glyph: 0.0.165 => 0.0.170\n - @vx/grid: 0.0.169 => 0.0.170\n - @vx/group: 0.0.165 => 0.0.170\n - @vx/heatmap: 0.0.166 => 0.0.170\n - @vx/hierarchy: 0.0.165 => 0.0.170\n - @vx/legend: 0.0.167 => 0.0.170\n - @vx/marker: 0.0.168 => 0.0.170\n - @vx/network: 0.0.165 => 0.0.170\n - @vx/shape: 0.0.168 => 0.0.170\n - @vx/stats: 0.0.165 => 0.0.170\n - @vx/threshold: 0.0.168 => 0.0.170\n - @vx/voronoi: 0.0.165 => 0.0.170\n - @vx/vx: 0.0.169 => 0.0.170\n ```\n\n# v0.0.169\n\n#### :bug: Bug Fix\n\n- [grid] include `build/` dir in package. [#315](https://github.com/hshoff/vx/pull/315)\n\n#### :trophy: Contributors\n\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @vx/demo: 0.0.168 => 0.0.169\n - @vx/grid: 0.0.168 => 0.0.169\n - @vx/vx: 0.0.168 => 0.0.169\n ```\n\n# v0.0.168\n\n#### :rocket: Enhancements\n\n- [shape] add optional render function as child of `<Pie />` to allow more fine grained control of rendering. [#311](https://github.com/hshoff/vx/pull/311)\n\n#### :trophy: Contributors\n\n- [psachs21](https://github.com/psachs21)\n\n```\nChanges:\n - @vx/annotation: 0.0.166 => 0.0.168\n - @vx/axis: 0.0.166 => 0.0.168\n - @vx/demo: 0.0.167 => 0.0.168\n - @vx/grid: 0.0.166 => 0.0.168\n - @vx/marker: 0.0.166 => 0.0.168\n - @vx/shape: 0.0.166 => 0.0.168\n - @vx/threshold: 0.0.166 => 0.0.168\n - @vx/vx: 0.0.167 => 0.0.168\n```\n\n# v0.0.167\n\n#### :bug: Bug Fix\n\n- [legend] spread style prop on rect legend shape. [#313](https://github.com/hshoff/vx/pull/313)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/demo: 0.0.166 => 0.0.167\n - @vx/legend: 0.0.165 => 0.0.167\n - @vx/vx: 0.0.166 => 0.0.167\n```\n\n# v0.0.166\n\n#### :rocket: Enhancements\n\n- [chord] add `@vx/chord` - `<Chord />`, `<Ribbon />`. [#308](https://github.com/hshoff/vx/pull/308)\n- [demo][shape] add chord demo, fix prop types. [#308](https://github.com/hshoff/vx/pull/308)\n- [shape] updated accessors to pass all the arguments from D3 for LinePath, AreaClosed, and Area. [#309](https://github.com/hshoff/vx/pull/309)\n- [heatmap] add index + yBin to heatmap circle/rect. [#307](https://github.com/hshoff/vx/pull/307)\n- [geo] add Natural Earth (1) projection. [#304](https://github.com/hshoff/vx/pull/304)\n\n#### :memo: Documentation\n\n- [shape] Updated documentation for LinePath and AreaClosed. [#309](https://github.com/hshoff/vx/pull/309)\n\n#### :trophy: Contributors\n \n- [davidandrus](https://github.com/davidandrus)\n- [JacquiManzi](https://github.com/JacquiManzi)\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.165 => 0.0.166\n - @vx/axis: 0.0.165 => 0.0.166\n - @vx/chord: 0.0.1 => 0.0.166\n - @vx/demo: 0.0.165 => 0.0.166\n - @vx/geo: 0.0.165 => 0.0.166\n - @vx/grid: 0.0.165 => 0.0.166\n - @vx/heatmap: 0.0.165 => 0.0.166\n - @vx/marker: 0.0.165 => 0.0.166\n - @vx/shape: 0.0.165 => 0.0.166\n - @vx/threshold: 0.0.165 => 0.0.166\n - @vx/vx: 0.0.165 => 0.0.166\n ```\n\n# v0.0.165\n\n#### :rocket: Enhancements\n\n- [text] export getStringWidth() util. [#301](https://github.com/hshoff/vx/pull/301)\n\n#### :house: Internal\n\n- [build] use [rollup](http://rollupjs.org/) for build [#298](https://github.com/hshoff/vx/pull/298)\n  - adds `dist/vx-{name}.{umd,es}.js` files\n  - adds `module` field to `package.json` that points to `dist/vx-{name}.es.js` for bundlers that support it (webpack, rollup, etc)\n  - `main` field points to `dist/vx-{name}.umd.js`\n  - removes [`react-fatigue-dev`](https://github.com/tj/react-fatigue-dev) + Makefile build (means you can build on windows now)\n  - build targets  `\"android\": 30, \"chrome\": 35, \"edge\": 14, \"explorer\": 9, \"firefox\": 52, \"safari\": 8, \"ucandroid\": 1` (matching [airbnb-babel-preset](https://github.com/airbnb/babel-preset-airbnb/blob/master/index.js#L9-L17))\n  - keeps `build/` with `cjs` babel build files for [deep paths](https://github.com/hshoff/vx/issues/143#issuecomment-367649444) (no breaking changes 🤞)\n  \n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.165-beta.1 => 0.0.165\n - @vx/axis: 0.0.165-beta.1 => 0.0.165\n - @vx/bounds: 0.0.165-beta.1 => 0.0.165\n - @vx/boxplot: 0.0.165-beta.1 => 0.0.165\n - @vx/brush: 0.0.165-beta.1 => 0.0.165\n - @vx/clip-path: 0.0.165-beta.1 => 0.0.165\n - @vx/curve: 0.0.165-beta.1 => 0.0.165\n - @vx/demo: 0.0.165-beta.1 => 0.0.165\n - @vx/drag: 0.0.165-beta.1 => 0.0.165\n - @vx/event: 0.0.165-beta.1 => 0.0.165\n - @vx/geo: 0.0.165-beta.1 => 0.0.165\n - @vx/glyph: 0.0.165-beta.1 => 0.0.165\n - @vx/gradient: 0.0.165-beta.1 => 0.0.165\n - @vx/grid: 0.0.165-beta.1 => 0.0.165\n - @vx/group: 0.0.165-beta.1 => 0.0.165\n - @vx/heatmap: 0.0.165-beta.1 => 0.0.165\n - @vx/hierarchy: 0.0.165-beta.1 => 0.0.165\n - @vx/legend: 0.0.165-beta.1 => 0.0.165\n - @vx/marker: 0.0.165-beta.1 => 0.0.165\n - @vx/mock-data: 0.0.165-beta.1 => 0.0.165\n - @vx/network: 0.0.165-beta.1 => 0.0.165\n - @vx/pattern: 0.0.165-beta.1 => 0.0.165\n - @vx/point: 0.0.165-beta.1 => 0.0.165\n - @vx/responsive: 0.0.165-beta.1 => 0.0.165\n - @vx/scale: 0.0.165-beta.1 => 0.0.165\n - @vx/shape: 0.0.165-beta.1 => 0.0.165\n - @vx/stats: 0.0.165-beta.1 => 0.0.165\n - @vx/text: 0.0.165-beta.1 => 0.0.165\n - @vx/threshold: 0.0.165-beta.1 => 0.0.165\n - @vx/tooltip: 0.0.165-beta.1 => 0.0.165\n - @vx/voronoi: 0.0.165-beta.1 => 0.0.165\n - @vx/vx: 0.0.165-beta.1 => 0.0.165\n - @vx/zoom: 0.0.165-beta.1 => 0.0.165\n```\n\n# v0.0.164\n\n#### :rocket: Enhancements\n\n- [shape] Add support for `startAngle` and `endAngle` props in the `Pie` component. [#292](https://github.com/hshoff/vx/pull/292)\n- [shape] Add support for `pieSortValues` prop. This maps to d3’s `pie.sortValues()` which lets you sort by extracted values instead of data. [#292](https://github.com/hshoff/vx/pull/292)\n\n#### :bug: Bug Fix\n\n- [shape] Add _actual_ support for `startAngle` and `endAngle` props in the `Pie` component. [#292](https://github.com/hshoff/vx/pull/292)\n- [shape] Check for `!= null` for numeric props in `Pie` component. [#292](https://github.com/hshoff/vx/pull/292)\n\n#### :memo: Documentation\n\n- [shape] Fix `LineRadial` link. [#297](https://github.com/hshoff/vx/pull/297)\n- [shape] Make `<code>` inside headings bigger than `<code>` inside paragraphs so components headings are actually clearer as such… [#297](https://github.com/hshoff/vx/pull/297)\n- [shape] Add Pie documentation. [#297](https://github.com/hshoff/vx/pull/297)\n\n#### :white_check_mark: Tests\n\n- [shape] Add tests for sort callbacks in the `Pie` component. [#292](https://github.com/hshoff/vx/pull/292)\n\n#### :trophy: Contributors\n\n- [yuchi](https://github.com/yuchi)\n\n```\nChanges:\n - @vx/annotation: 0.0.162 => 0.0.164\n - @vx/axis: 0.0.162 => 0.0.164\n - @vx/demo: 0.0.163 => 0.0.164\n - @vx/grid: 0.0.162 => 0.0.164\n - @vx/marker: 0.0.162 => 0.0.164\n - @vx/shape: 0.0.162 => 0.0.164\n - @vx/threshold: 0.0.162 => 0.0.164\n - @vx/vx: 0.0.163 => 0.0.164\n ```\n\n# v0.0.163\n\n#### :bug: Bug Fix\n\n- [tooltip] don't pass `getRects` func prop from `withBoundingRects` to `Tooltip` [#290](https://github.com/hshoff/vx/pull/290)\n\n#### :trophy: Contributors\n\n- [williaster](https://github.com/williaster)\n\n```\nChanges:\n - @vx/demo: 0.0.162 => 0.0.163\n - @vx/tooltip: 0.0.161 => 0.0.163\n - @vx/vx: 0.0.162 => 0.0.163\n```\n\n# v0.0.162\n\n#### :rocket: Enhancements\n\n- [threshold] add `<Threshold />` [#285](https://github.com/hshoff/vx/pull/285)\n- [grid] add support for band scales [#282](https://github.com/hshoff/vx/pull/282)\n- [shape] <Area /> now supports function as children [#285](https://github.com/hshoff/vx/pull/285)\n\n#### :memo: Documentation\n\n- [demo] add /threshold demo [#285](https://github.com/hshoff/vx/pull/285)\n- [demo] demo band scale grid on /barstack [#282](https://github.com/hshoff/vx/pull/282)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```\nChanges:\n - @vx/annotation: 0.0.161 => 0.0.162\n - @vx/axis: 0.0.161 => 0.0.162\n - @vx/demo: 0.0.161 => 0.0.162\n - @vx/grid: 0.0.161 => 0.0.162\n - @vx/marker: 0.0.161 => 0.0.162\n - @vx/shape: 0.0.161 => 0.0.162\n - @vx/threshold: 0.0.1 => 0.0.162\n - @vx/vx: 0.0.161 => 0.0.162\n```\n\n# v0.0.161\n\n#### :boom: Breaking Changes\n\n- [scale] Removed color scales, recommend users to use [`d3-scale-chromatic`](https://github.com/d3/d3-scale-chromatic), following d3's lead in release [5.0.0](https://github.com/d3/d3/releases/tag/v5.0.0). [#270](https://github.com/hshoff/vx/pull/270)\n- [scale] The following files/tests/documentation are no longer part of `@vx/scale`: `schemeCategory10`, `schemeCategory20`, `schemeCategory20b`, `schemeCategory20c`. [#270](https://github.com/hshoff/vx/pull/270)\n\n#### :rocket: Enhancements\n\n- [tooltip] adds an optional `containerProps` as a second HOC \"config\" argument of `withTooltip(BaseComponent [, containerProps])`. This exposes a hook to enable users to customize any props on the container element. [#272](https://github.com/hshoff/vx/pull/272)\n- [tooltip] sets `width` and `height` to `inherit` by default on the container. I'm kind of on the edge with this and am open to removing it because it may be an edge case, but my reasoning is as follows: if a user is combining `withTooltip` and a responsive component like `ParentSize` like this example, they'll have to update the `withTooltip` container `div` to also have full width/height so this would be a \"smart default\". [#272](https://github.com/hshoff/vx/pull/272)\n  \n#### :memo: Documentation\n\n- [scale] Added a section on color scales, which goes over how one would use `d3-scale-chromatic` with `vx/scale`. [#270](https://github.com/hshoff/vx/pull/270)\n- [tooltip] Adds a readme for `@vx/tooltip` components + enhancer. [#272](https://github.com/hshoff/vx/pull/272)\n- [demo] add `<AxisRight />` to /axis demo tile. [#280](https://github.com/hshoff/vx/pull/280)\n- [demo] update vx-demo.now.sh doc pages. [#281](https://github.com/hshoff/vx/pull/281)\n\n#### :house: Internal\n\n- Add configuration for [Prettier](https://prettier.io) and format the existing codebase. [#275](https://github.com/hshoff/vx/pull/275)\n- Add pre-commit hook to format changed files before commits. [#275](https://github.com/hshoff/vx/pull/275)\n- [docs] fix `npm run docs` script. [#281](https://github.com/hshoff/vx/pull/281)\n\n#### :trophy: Contributors\n\n- [sto3psl](https://github.com/sto3psl)\n- [williaster](https://github.com/williaster)\n- [trainorpj](https://github.com/trainorpj)\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.160 => 0.0.161\n - @vx/axis: 0.0.160 => 0.0.161\n - @vx/bounds: 0.0.153 => 0.0.161\n - @vx/boxplot: 0.0.153 => 0.0.161\n - @vx/brush: 0.0.153 => 0.0.161\n - @vx/clip-path: 0.0.153 => 0.0.161\n - @vx/curve: 0.0.153 => 0.0.161\n - @vx/demo: 0.0.160 => 0.0.161\n - @vx/drag: 0.0.157 => 0.0.161\n - @vx/event: 0.0.153 => 0.0.161\n - @vx/geo: 0.0.153 => 0.0.161\n - @vx/glyph: 0.0.153 => 0.0.161\n - @vx/gradient: 0.0.153 => 0.0.161\n - @vx/grid: 0.0.160 => 0.0.161\n - @vx/group: 0.0.153 => 0.0.161\n - @vx/heatmap: 0.0.153 => 0.0.161\n - @vx/hierarchy: 0.0.153 => 0.0.161\n - @vx/legend: 0.0.154 => 0.0.161\n - @vx/marker: 0.0.160 => 0.0.161\n - @vx/mock-data: 0.0.153 => 0.0.161\n - @vx/network: 0.0.153 => 0.0.161\n - @vx/pattern: 0.0.153 => 0.0.161\n - @vx/point: 0.0.153 => 0.0.161\n - @vx/responsive: 0.0.158 => 0.0.161\n - @vx/scale: 0.0.153 => 0.0.161\n - @vx/shape: 0.0.160 => 0.0.161\n - @vx/stats: 0.0.153 => 0.0.161\n - @vx/text: 0.0.159 => 0.0.161\n - @vx/tooltip: 0.0.160 => 0.0.161\n - @vx/voronoi: 0.0.153 => 0.0.161\n - @vx/vx: 0.0.160 => 0.0.161\n - @vx/zoom: 0.0.153 => 0.0.161\n```\n\n# v0.0.160\n\n#### :boom: Breaking Changes\n\n- [shape] `<Link* />` components now use `...additionalProps()` everywhere for consistency. So function props get passed data. example: `onClick={event => // stuff}` becomes `onClick={data => event => // stuff}` and now you can stroke/fill/attr based on data `stroke={({ target }) => target.data.children ? 'yellow' : 'blue' }. [#265](https://github.com/hshoff/vx/pull/265)\n\n#### :rocket: Enhancements\n\n- [shape] export link path generators. fixes: [#263](https://github.com/hshoff/vx/issues/263). [#265](https://github.com/hshoff/vx/pull/265)\n- [shape] add optional `path` prop so you can pass in path generator function instead of creating the generator every render. [#265](https://github.com/hshoff/vx/pull/265)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.158 => 0.0.160\n - @vx/axis: 0.0.159 => 0.0.160\n - @vx/demo: 0.0.159 => 0.0.160\n - @vx/grid: 0.0.158 => 0.0.160\n - @vx/marker: 0.0.158 => 0.0.160\n - @vx/shape: 0.0.158 => 0.0.160\n - @vx/tooltip: 0.0.158 => 0.0.160\n - @vx/vx: 0.0.159 => 0.0.160\n```\n\n# v0.0.159\n\n#### :rocket: Enhancements\n\n- [axis] By default `<Axis />` components now use `@vx/text` to render tick labels. This enables multi line labels and scaling text to fit in a certain amount of space. [#260](https://github.com/hshoff/vx/pull/260)\n\nExample:\n```jsx\n<Axis \n  {...axisProps}\n  tickLabelProps = (tickValue, index) => ({\n    textAnchor: 'middle',\n    verticalAnchor: 'middle',\n    width: 100,\n    scaleToFit: true\n  })\n/>\n```\n\n- [axis] `<Axis />` components got a new prop `tickComponent` to enable rendering of custom ticks. With this prop one can completely customize ticks without having to create a new custom `<Axis />` component. [#260](https://github.com/hshoff/vx/pull/260)\n\nExample:\n```jsx\n<Axis\n  {...axisProps}\n  tickComponent={({ x, y, formattedValue }) => (\n    <g>\n      <circle cx={x} cy={y} r={2} fill='rebeccapurple' />\n      <text x={x + 4} y={y}>{formattedValue}</text>\n    </g>\n  )}\n/>\n```\n\n`tickComponent` accepts a function and gets called with the following attribute:\n```js\ntickComponent({ x, y, formattedValue, ...tickLabelPropsObj })\n```\n\n#### :memo: Documentation\n\n- [axis] update `@vx/axis` documentation. [#260](https://github.com/hshoff/vx/pull/260)\n- [demo] fix bargroup example code. [#250](https://github.com/hshoff/vx/pull/250)\n- [demo] fix barstack example code. [#249](https://github.com/hshoff/vx/pull/249)\n- [text] fix readme.md of `@vx/text` package. [#257](https://https://github.com/hshoff/vx/pull/257)\n\n#### :trophy: Contributors\n\n - [bulat-f](https://github.com/bulat-f)\n - [sto3psl](https://github.com/sto3psl)\n - [browniefed](https://github.com/browniefed)\n\n```bash\nChanges:\n - @vx/axis: 0.0.158 => 0.0.159\n - @vx/demo: 0.0.158 => 0.0.159\n - @vx/text: 0.0.153 => 0.0.159\n - @vx/vx: 0.0.158 => 0.0.159\n ```\n\n# v0.0.158\n\n#### :rocket: Enhancements\n\n- [responsive] add debounceTime prop to `<ParentSize />` with a default of 300ms. [#241](https://github.com/hshoff/vx/pull/241)\n- [tooltip] `<TooltipWithBounds />` now also reconsiders window bounds [#240](https://github.com/hshoff/vx/pull/240)\n\n#### :house: Internal\n\n- [demo] fix streamgraph transparent fill [#242](https://github.com/hshoff/vx/pull/242)\n\n#### :trophy: Contributors\n\n- [AlexJuarez](https://github.com/AlexJuarez)\n- [manuelrocha88](https://github.com/manuelrocha88)\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.153 => 0.0.158\n - @vx/axis: 0.0.153 => 0.0.158\n - @vx/demo: 0.0.157 => 0.0.158\n - @vx/grid: 0.0.153 => 0.0.158\n - @vx/marker: 0.0.153 => 0.0.158\n - @vx/responsive: 0.0.153 => 0.0.158\n - @vx/shape: 0.0.153 => 0.0.158\n - @vx/tooltip: 0.0.153 => 0.0.158\n - @vx/vx: 0.0.157 => 0.0.158\n```\n\n# v0.0.157\n\n#### :rocket: Enhancements\n\n- [drag] remove `svg` prop. This was causing hacky problems like calling `forceUpdate` in `cDM`. `localPoint()` now finds svg from the event argument [#233](https://github.com/hshoff/vx/pull/233)\n\n#### :memo: Documentation\n\n- [demo] update drag demos, add `touch-action: none` on drag demos so no scrolling when dragging [#233](https://github.com/hshoff/vx/pull/233)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/demo: 0.0.156 => 0.0.157\n - @vx/drag: 0.0.156 => 0.0.157\n - @vx/vx: 0.0.156 => 0.0.157\n```\n\n# v0.0.156\n\n#### :rocket: Enhancements\n\n- [drag] add `resetOnStart` prop (default to false). When true, it will reset drag `x,y` to the start point from the mousedown/touchstart event and `dx,dy` to 0 on drag start [#231](https://github.com/hshoff/vx/pull/231)\n\n#### :memo: Documentation\n\n- [demo] add /drag-ii demo of a drawboard made with drag [#231](https://github.com/hshoff/vx/pull/231)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/demo: 0.0.155 => 0.0.156\n - @vx/drag: 0.0.155 => 0.0.156\n - @vx/vx: 0.0.155 => 0.0.156\n```\n\n# v0.0.155\n\n#### :rocket: Enhancements\n\n- [drag] add `<Drag />` component + demo [#229](https://github.com/hshoff/vx/pull/229)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/demo: 0.0.154 => 0.0.155\n - @vx/drag: 0.0.153 => 0.0.155\n - @vx/vx: 0.0.154 => 0.0.155\n```\n\n# v0.0.154\n\n#### :rocket: Enhancements\n\n- [legend] make legend items clickable, add `<LegendItem />` propTypes, add click test [#227](https://github.com/hshoff/vx/pull/227)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/demo: 0.0.153 => 0.0.154\n - @vx/legend: 0.0.153 => 0.0.154\n - @vx/vx: 0.0.153 => 0.0.154\n```\n\n# v0.0.153\n\n#### :house: Internal\n\n- [internal] add sideEffects: false to pkg for webpack 4 [#225](https://github.com/hshoff/vx/pull/225)\n\n#### :trophy: Contributors\n\n- [hshoff](https://github.com/hshoff)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.147 => 0.0.153\n - @vx/axis: 0.0.152 => 0.0.153\n - @vx/bounds: 0.0.147 => 0.0.153\n - @vx/boxplot: 0.0.143 => 0.0.153\n - @vx/brush: 0.0.143 => 0.0.153\n - @vx/clip-path: 0.0.143 => 0.0.153\n - @vx/curve: 0.0.143 => 0.0.153\n - @vx/demo: 0.0.152 => 0.0.153\n - @vx/drag: 0.0.143 => 0.0.153\n - @vx/event: 0.0.143 => 0.0.153\n - @vx/geo: 0.0.150 => 0.0.153\n - @vx/glyph: 0.0.143 => 0.0.153\n - @vx/gradient: 0.0.143 => 0.0.153\n - @vx/grid: 0.0.147 => 0.0.153\n - @vx/group: 0.0.143 => 0.0.153\n - @vx/heatmap: 0.0.143 => 0.0.153\n - @vx/hierarchy: 0.0.144 => 0.0.153\n - @vx/legend: 0.0.143 => 0.0.153\n - @vx/marker: 0.0.147 => 0.0.153\n - @vx/mock-data: 0.0.147 => 0.0.153\n - @vx/network: 0.0.143 => 0.0.153\n - @vx/pattern: 0.0.143 => 0.0.153\n - @vx/point: 0.0.143 => 0.0.153\n - @vx/responsive: 0.0.152 => 0.0.153\n - @vx/scale: 0.0.152 => 0.0.153\n - @vx/shape: 0.0.147 => 0.0.153\n - @vx/stats: 0.0.152 => 0.0.153\n - @vx/text: 0.0.152 => 0.0.153\n - @vx/tooltip: 0.0.148 => 0.0.153\n - @vx/voronoi: 0.0.143 => 0.0.153\n - @vx/vx: 0.0.152 => 0.0.153\n - @vx/zoom: 0.0.143 => 0.0.153\n```\n\n# v0.0.152\n\n#### :rocket: Enhancements\n\n- [text] add `fontWeight` option to vx-text demo [#215](https://github.com/hshoff/vx/pull/215)\n\n#### :memo: Documentation\n\n- [demo] add vx-text tile and update /text demo [#214](https://github.com/hshoff/vx/pull/214)\n- [responsive] add description and example of each component and enhancer [#217](https://github.com/hshoff/vx/pull/217)\n\n#### :bug: Bug Fix\n\n- [text] fix memoized `getStringWidth` ignoring styles [#215](https://github.com/hshoff/vx/pull/215)\n- [text] remove default width and height from measurement SVG [#219](https://github.com/hshoff/vx/pull/219)\n- [scale] fix scalePower api to take in exponent instead of base [#223](https://github.com/hshoff/vx/pull/223)\n\n#### :house: Internal\n\n- [travis] fix for travis failing for timing out when [not receiving output for 10min](https://docs.travis-ci.com/user/common-build-problems/#Build-times-out-because-no-output-was-received) [#224](https://github.com/hshoff/vx/pull/224)\n- [vx][test] fix `@vx/vx` text test. It was looking for `TextOutline` export which was removed with the [new `@vx/text`](https://github.com/hshoff/vx/pull/208) [#224](https://github.com/hshoff/vx/pull/224)\n- [axis] bump `prop-types` dep and use `^` [#224](https://github.com/hshoff/vx/pull/224)\n\n#### :trophy: Contributors\n\n- [techniq](https://github.com/techniq)\n- [hshoff](https://github.com/hshoff)\n- [katerineknox](https://github.com/katerineknox)\n- [crcarlo](https://github.com/crcarlo)\n\n```bash\nChanges:\n - @vx/axis: 0.0.151 => 0.0.152\n - @vx/demo: 0.0.151 => 0.0.152\n - @vx/responsive: 0.0.151 => 0.0.152\n - @vx/scale: 0.0.151 => 0.0.152\n - @vx/stats: 0.0.151 => 0.0.152\n - @vx/text: 0.0.151 => 0.0.152\n - @vx/vx: 0.0.151 => 0.0.152\n```\n\n# v0.0.151\n\n- ignore this one, v0.0.152 includes what v0.0.151 was supposed be. i messed up the publish.\n\n```bash\nChanges:\n - @vx/axis: 0.0.147 => 0.0.151\n - @vx/demo: 0.0.150 => 0.0.151\n - @vx/responsive: 0.0.150 => 0.0.151\n - @vx/scale: 0.0.143 => 0.0.151\n - @vx/stats: 0.0.148 => 0.0.151\n - @vx/text: 0.0.150 => 0.0.151\n - @vx/vx: 0.0.150 => 0.0.151\n```\n\n# v0.0.150\n\n#### :boom: Breaking Changes\n\n- [text] Removes `<TextWrap>`, `<TextOutline>` and `<TextBackground>` components, which were incomplete [#208](https://github.com/hshoff/vx/pull/208)\n\n#### :rocket: Enhancements\n\n- [geo] Added pointRadius and fixed center [#213](https://github.com/hshoff/vx/pull/213)\n- [text] Add new `<Text>`, with the following features\n  - Word-wrapping (when width prop is defined)\n  - Vertical alignment (verticalAnchor prop)\n  - Rotation (angle prop)\n  - Scale-to-fit text (scaleToFit prop)\n\n#### :bug: Bug Fix\n\n- [geo] Fixed center typo [#213](https://github.com/hshoff/vx/pull/213)\n\n#### :memo: Documentation\n\n- [responsive] Backticks import not working so, copy paste broken [#212](https://github.com/hshoff/vx/pull/212)\n\n#### :house: Internal\n\n- [text] Update `vx-text` author to @techniq [#210](https://github.com/hshoff/vx/pull/210)\n\n```bash\nChanges:\n - @vx/demo: 0.0.149 => 0.0.150\n - @vx/geo: 0.0.143 => 0.0.150\n - @vx/responsive: 0.0.149 => 0.0.150\n - @vx/text: 0.0.143 => 0.0.150\n - @vx/vx: 0.0.149 => 0.0.150\n```\n\n# v0.0.149\n\n#### :rocket: Enhancements\n\n- [responsive] bump `resize-observer-polyfill` [#206](https://github.com/hshoff/vx/pull/206)\n\n#### :bug: Bug Fix\n\n- [demo] add overflow hidden on flex: 1 `<ParentSize />` parents [#206](https://github.com/hshoff/vx/pull/206)\n\n```bash\nChanges:\n - @vx/demo: 0.0.148 => 0.0.149\n - @vx/responsive: 0.0.147 => 0.0.149\n - @vx/vx: 0.0.148 => 0.0.149\n```\n\n# v0.0.148\n\n#### :bug: Bug Fix\n\n- [stats] [boxplot] fix container props calculation [#203](https://github.com/hshoff/vx/pull/203)\n- [tooltip] fix tootlip with bounds offset [#204](https://github.com/hshoff/vx/pull/204)\n\n```bash\nChanges:\n - @vx/demo: 0.0.147 => 0.0.148\n - @vx/stats: 0.0.147 => 0.0.148\n - @vx/tooltip: 0.0.147 => 0.0.148\n - @vx/vx: 0.0.147 => 0.0.148\n ```\n\n# v0.0.147\n\n#### :boom: Breaking Changes\n\n- [shape] deep links to `@vx/shape/shapes/Link{Horizontal, Vertical, Radial}.js` => `@vx/shape/shapes/link/diagonal/Link{Horizontal, Vertical, Radial}.js`. [#194](https://github.com/hshoff/vx/pull/194)\n\n#### :rocket: Enhancements\n\n- [tooltip] add offset props to `<TooltipWithBounds />`. [#193](https://github.com/hshoff/vx/pull/193)\n- [shape] Add support for step, curve, and line links. [#194](https://github.com/hshoff/vx/pull/194)\n- [responsive] add `<ParentSize />` component. [#198](https://github.com/hshoff/vx/pull/198)\n- [stats] added vx-stats for statistic related glyphs (boxplot and violinplot). [#197](https://github.com/hshoff/vx/pull/197) **note:** `@vx/boxplot` is deprecated in favor of `@vx/stats` in a future release `@vx/boxplot` will be removed\n\n#### :house: Internal\n\n- [demo] update gallery tiles to use `<ParentSize />`. [#198](https://github.com/hshoff/vx/pull/198)\n- [demo] add /responsive gallery tile + page. [#198](https://github.com/hshoff/vx/pull/198)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.146 => 0.0.147\n - @vx/axis: 0.0.146 => 0.0.147\n - @vx/bounds: 0.0.143 => 0.0.147\n - @vx/demo: 0.0.146 => 0.0.147\n - @vx/grid: 0.0.146 => 0.0.147\n - @vx/marker: 0.0.146 => 0.0.147\n - @vx/mock-data: 0.0.144 => 0.0.147\n - @vx/responsive: 0.0.143 => 0.0.147\n - @vx/shape: 0.0.146 => 0.0.147\n - @vx/stats: 0.0.143 => 0.0.147\n - @vx/tooltip: 0.0.143 => 0.0.147\n - @vx/vx: 0.0.146 => 0.0.147\n```\n\n# v0.0.146\n\n#### :rocket: Enhancements\n\n- [shape] add `<BarStackHorizontal />` [#185](https://github.com/hshoff/vx/pull/185)\n\n#### :memo: Documentation\n\n- [demo] add `<BarStackHorizontal />` [#185](https://github.com/hshoff/vx/pull/185)\n- [demo] tile updates [#186](https://github.com/hshoff/vx/pull/186)\n\n#### :house: Internal\n\n- [shape] remove build/index.js [#186](https://github.com/hshoff/vx/pull/186)\n\n\n```bash\nChanges:\n - @vx/annotation: 0.0.145 => 0.0.146\n - @vx/axis: 0.0.145 => 0.0.146\n - @vx/demo: 0.0.145 => 0.0.146\n - @vx/grid: 0.0.145 => 0.0.146\n - @vx/marker: 0.0.145 => 0.0.146\n - @vx/shape: 0.0.145 => 0.0.146\n - @vx/vx: 0.0.145 => 0.0.146\n```\n\n# v0.0.145\n\n#### :rocket: Enhancements\n\n- [shape] add `<Area />` and tests [#183](https://github.com/hshoff/vx/pull/183)\n- [demo] add Radar chart [#180](https://github.com/hshoff/vx/pull/180)\n- [axis] add additional tests [#161](https://github.com/hshoff/vx/pull/161)\n\n#### :bug: Bug Fix\n\n- [axis] less restrictive tickValue propTypes [#184](https://github.com/hshoff/vx/pull/184)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.144 => 0.0.145\n - @vx/axis: 0.0.144 => 0.0.145\n - @vx/demo: 0.0.144 => 0.0.145\n - @vx/grid: 0.0.144 => 0.0.145\n - @vx/marker: 0.0.144 => 0.0.145\n - @vx/shape: 0.0.144 => 0.0.145\n - @vx/vx: 0.0.144 => 0.0.145\n```\n\n# v0.0.144\n\n#### 💥 Breaking Changes\n\n- [shape] `<Arc />` renamed `<Pie />`, new `<Arc />` not dependent on d3-shape pie generator. [#179](https://github.com/hshoff/vx/pull/179)\n\n#### 🚀 Enhancements\n\n- [demo] add `<Pack />` and `<Treemap />` demo tiles + pages. [#179](https://github.com/hshoff/vx/pull/179)\n- [mock] add exoplanets, planets, and shakespeare mocks. [#179](https://github.com/hshoff/vx/pull/179)\n\n#### 🐛 Bug Fix\n\n- [hierarchy] rename `<Partition />` classnames from `vx-pack` => `vx-partition`. [#179](https://github.com/hshoff/vx/pull/179)\n- [hierarchy] export partition, treemap, and pack from index. [#179](https://github.com/hshoff/vx/pull/179)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.143 => 0.0.144\n - @vx/axis: 0.0.143 => 0.0.144\n - @vx/demo: 0.0.143 => 0.0.144\n - @vx/grid: 0.0.143 => 0.0.144\n - @vx/hierarchy: 0.0.143 => 0.0.144\n - @vx/marker: 0.0.143 => 0.0.144\n - @vx/mock-data: 0.0.143 => 0.0.144\n - @vx/shape: 0.0.143 => 0.0.144\n - @vx/vx: 0.0.143 => 0.0.144\n```\n\n# v0.0.143\n\n#### :boom: Breaking Changes\n\n- [hierarchy] `<Tree />` & `<Cluster />` now only pass `data` as an argument to the child render function [#173](https://github.com/hshoff/vx/pull/173)\n\n#### :rocket: Enhancement\n\n- [hierarchy] add `<Pack />`, `<Partition />`, & `<Treemap />` [#173](https://github.com/hshoff/vx/pull/173)\n\n#### :house: Internal\n\n- [deps][tests] use react 16 dev dep, enzyme 3, jest 21. fix tests. [#178](https://github.com/hshoff/vx/pull/178)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.142 => 0.0.143\n - @vx/axis: 0.0.142 => 0.0.143\n - @vx/bounds: 0.0.141 => 0.0.143\n - @vx/boxplot: 0.0.140 => 0.0.143\n - @vx/brush: 0.0.140 => 0.0.143\n - @vx/clip-path: 0.0.140 => 0.0.143\n - @vx/curve: 0.0.140 => 0.0.143\n - @vx/demo: 0.0.142 => 0.0.143\n - @vx/drag: 0.0.140 => 0.0.143\n - @vx/event: 0.0.141 => 0.0.143\n - @vx/geo: 0.0.140 => 0.0.143\n - @vx/glyph: 0.0.140 => 0.0.143\n - @vx/gradient: 0.0.140 => 0.0.143\n - @vx/grid: 0.0.142 => 0.0.143\n - @vx/group: 0.0.140 => 0.0.143\n - @vx/heatmap: 0.0.140 => 0.0.143\n - @vx/hierarchy: 0.0.141 => 0.0.143\n - @vx/legend: 0.0.141 => 0.0.143\n - @vx/marker: 0.0.142 => 0.0.143\n - @vx/mock-data: 0.0.136 => 0.0.143\n - @vx/network: 0.0.140 => 0.0.143\n - @vx/pattern: 0.0.140 => 0.0.143\n - @vx/point: 0.0.136 => 0.0.143\n - @vx/responsive: 0.0.140 => 0.0.143\n - @vx/scale: 0.0.140 => 0.0.143\n - @vx/shape: 0.0.142 => 0.0.143\n - @vx/text: 0.0.140 => 0.0.143\n - @vx/tooltip: 0.0.141 => 0.0.143\n - @vx/voronoi: 0.0.140 => 0.0.143\n - @vx/vx: 0.0.142 => 0.0.143\n - @vx/zoom: 0.0.140 => 0.0.143\n```\n\n# v0.0.142\n\n#### :rocket: Enhancement\n\n- [shape] add innerRef prop to shapes [#168](https://github.com/hshoff/vx/pull/168)\n\n### :memo: Documentation\n\n- [demo] fix typo on /, fix areas tile details [#169](https://github.com/hshoff/vx/pull/169)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.141 => 0.0.142\n - @vx/axis: 0.0.141 => 0.0.142\n - @vx/demo: 0.0.141 => 0.0.142\n - @vx/grid: 0.0.141 => 0.0.142\n - @vx/marker: 0.0.141 => 0.0.142\n - @vx/shape: 0.0.141 => 0.0.142\n - @vx/vx: 0.0.141 => 0.0.142\n```\n\n# v0.0.141\n\n#### :rocket: Enhancement\n\n- [hierarchy] add render prop to `<Tree />` + `<Cluster />` [#163](https://github.com/hshoff/vx/pull/163)\n- [axis] render prop for axis, full control over rendering [#165](https://github.com/hshoff/vx/pull/165)\n- [event] add touch event support to localPoint(), find owner svg for single arity call  [#167](https://github.com/hshoff/vx/pull/167)\n\n#### :bug: Bug Fix\n\n- [shape] fix typo in stack order enum [#164](https://github.com/hshoff/vx/pull/164)\n- [legend] fix legend threshold [#166](https://github.com/hshoff/vx/pull/166)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.140 => 0.0.141\n - @vx/axis: 0.0.140 => 0.0.141\n - @vx/bounds: 0.0.140 => 0.0.141\n - @vx/demo: 0.0.140 => 0.0.141\n - @vx/event: 0.0.140 => 0.0.141\n - @vx/grid: 0.0.140 => 0.0.141\n - @vx/hierarchy: 0.0.140 => 0.0.141\n - @vx/legend: 0.0.140 => 0.0.141\n - @vx/marker: 0.0.140 => 0.0.141\n - @vx/shape: 0.0.140 => 0.0.141\n - @vx/tooltip: 0.0.140 => 0.0.141\n - @vx/vx: 0.0.140 => 0.0.141\n ```\n\n# v0.0.140\n  \n### :house: Internal\n  - [deps] add react 16 as peer dep, use react-test-renderer [#155](https://github.com/hshoff/vx/pull/155)\n\n```bash\nChanges:\n - @vx/annotation: 0.0.139 => 0.0.140\n - @vx/axis: 0.0.139 => 0.0.140\n - @vx/bounds: 0.0.137 => 0.0.140\n - @vx/boxplot: 0.0.136 => 0.0.140\n - @vx/brush: 0.0.136 => 0.0.140\n - @vx/clip-path: 0.0.136 => 0.0.140\n - @vx/curve: 0.0.136 => 0.0.140\n - @vx/demo: 0.0.139 => 0.0.140\n - @vx/drag: 0.0.136 => 0.0.140\n - @vx/event: 0.0.136 => 0.0.140\n - @vx/geo: 0.0.136 => 0.0.140\n - @vx/glyph: 0.0.136 => 0.0.140\n - @vx/gradient: 0.0.136 => 0.0.140\n - @vx/grid: 0.0.139 => 0.0.140\n - @vx/group: 0.0.136 => 0.0.140\n - @vx/heatmap: 0.0.136 => 0.0.140\n - @vx/hierarchy: 0.0.139 => 0.0.140\n - @vx/legend: 0.0.139 => 0.0.140\n - @vx/marker: 0.0.139 => 0.0.140\n - @vx/network: 0.0.136 => 0.0.140\n - @vx/pattern: 0.0.136 => 0.0.140\n - @vx/responsive: 0.0.136 => 0.0.140\n - @vx/scale: 0.0.136 => 0.0.140\n - @vx/shape: 0.0.139 => 0.0.140\n - @vx/text: 0.0.136 => 0.0.140\n - @vx/tooltip: 0.0.137 => 0.0.140\n - @vx/voronoi: 0.0.136 => 0.0.140\n - @vx/vx: 0.0.139 => 0.0.140\n - @vx/zoom: 0.0.136 => 0.0.140\n```\n\n# v0.0.139\n\n#### :rocket: Enhancement\n  \n  - [shape] add `<Stack />` for streamgraphs and other fun + exciting things [#153](https://github.com/hshoff/vx/pull/153)\n  \n#### :bug: Bug Fix\n\n  - [legend] fix legend style prop [#151](https://github.com/hshoff/vx/pull/151)\n  - [hierarchy] fix name collisions [#147](https://github.com/hshoff/vx/pull/147)\n\n### :memo: Documentation\n  - [hierarchy] update links and descriptions in readme [#148](https://github.com/hshoff/vx/pull/148)\n  \n```bash\nChanges:\n - @vx/annotation: 0.0.136 => 0.0.139\n - @vx/axis: 0.0.138 => 0.0.139\n - @vx/demo: 0.0.138 => 0.0.139\n - @vx/grid: 0.0.136 => 0.0.139\n - @vx/hierarchy: 0.0.138 => 0.0.139\n - @vx/legend: 0.0.136 => 0.0.139\n - @vx/marker: 0.0.136 => 0.0.139\n - @vx/shape: 0.0.136 => 0.0.139\n - @vx/vx: 0.0.138 => 0.0.139\n```\n\n# v0.0.138\n\n### :boom: Breaking Changes\n\n  - [axis] improve `@vx/axis` api, update docs [#142](https://github.com/hshoff/vx/pull/142)\n\n### :memo: Documentation\n  - [hierarchy] add readme for vx/hierarchy [#136](https://github.com/hshoff/vx/pull/136)\n  \n### :house: Internal\n  - [vx][pkg] bump lerna 2.0.0-beta.38 => 2.1.2 [#145](https://github.com/hshoff/vx/pull/145)\n\n```bash\nChanges:\n - @vx/axis: 0.0.136 => 0.0.138\n - @vx/demo: 0.0.137 => 0.0.138\n - @vx/hierarchy: 0.0.136 => 0.0.138\n - @vx/vx: 0.0.137 => 0.0.138\n```\n\n# v0.0.137\n\n- [vx] add one stop install pkg @vx/vx [#131](https://github.com/hshoff/vx/pull/131)\n- [bounds] move react-dom to peerDeps [#132](https://github.com/hshoff/vx/pull/132)\n\n```bash\nChanges:\n- @vx/bounds: 0.0.136 => 0.0.137\n- @vx/demo: 0.0.136 => 0.0.137\n- @vx/tooltip: 0.0.136 => 0.0.137\n- @vx/vx: 1.0.0 => 0.0.137\n```\n\n# v0.0.136\n\n- [all] add package-lock=false to .npmrc fixes [#93](https://github.com/hshoff/vx/issues/93) [#129](https://github.com/hshoff/vx/pull/129)\n- [demo][docs] sync vx-demo site documentation with packages [#125](https://github.com/hshoff/vx/pull/125)\n- [gradient][pattern] fix typos [#121](https://github.com/hshoff/vx/pull/121)\n- [demo] updated geo + network tiles [#120](https://github.com/hshoff/vx/pull/120)\n- [event] add touch point [#116](https://github.com/hshoff/vx/pull/116)\n- [gradient] Add minimal rendering tests [#114](https://github.com/hshoff/vx/pull/114)\n\n```bash\nChanges:\n- @vx/annotation: 0.0.131 => 0.0.136\n- @vx/axis: 0.0.134 => 0.0.136\n- @vx/bounds: 0.0.129 => 0.0.136\n- @vx/boxplot: 0.0.131 => 0.0.136\n- @vx/brush: 0.0.127 => 0.0.136\n- @vx/clip-path: 0.0.127 => 0.0.136\n- @vx/curve: 0.0.127 => 0.0.136\n- @vx/demo: 0.0.135 => 0.0.136\n- @vx/drag: 0.0.127 => 0.0.136\n- @vx/event: 0.0.127 => 0.0.136\n- @vx/geo: 0.0.135 => 0.0.136\n- @vx/glyph: 0.0.127 => 0.0.136\n- @vx/gradient: 0.0.129 => 0.0.136\n- @vx/grid: 0.0.131 => 0.0.136\n- @vx/group: 0.0.127 => 0.0.136\n- @vx/heatmap: 0.0.127 => 0.0.136\n- @vx/hierarchy: 0.0.127 => 0.0.136\n- @vx/legend: 0.0.127 => 0.0.136\n- @vx/marker: 0.0.131 => 0.0.136\n- @vx/mock-data: 0.0.135 => 0.0.136\n- @vx/network: 0.0.135 => 0.0.136\n- @vx/pattern: 0.0.127 => 0.0.136\n- @vx/point: 0.0.127 => 0.0.136\n- @vx/responsive: 0.0.127 => 0.0.136\n- @vx/scale: 0.0.127 => 0.0.136\n- @vx/shape: 0.0.131 => 0.0.136\n- @vx/text: 0.0.127 => 0.0.136\n- @vx/tooltip: 0.0.134 => 0.0.136\n- @vx/voronoi: 0.0.127 => 0.0.136\n- @vx/zoom: 0.0.127 => 0.0.136\n```\n\n# v0.0.135\n\n- [geo] add graticule [#111](https://github.com/hshoff/vx/pull/111)\n- [network] add @vx/network [#113](https://github.com/hshoff/vx/pull/113)\n- [demo] fix invalid JSX [#118](https://github.com/hshoff/vx/pull/118)\n- [network][geo][demo] polish for v0.0.135 [#119](https://github.com/hshoff/vx/pull/119)\n\n```bash\nChanges:\n- @vx/demo: 0.0.134 => 0.0.135\n- @vx/geo: 0.0.134 => 0.0.135\n- @vx/mock-data: 0.0.127 => 0.0.135\n- @vx/network: 0.0.127 => 0.0.135\n```\n\n# v0.0.134\n\n- [axis] make ticks more customizable [#109](https://github.com/hshoff/vx/pull/109)\n- [tooltip] add `<TooltipWithBounds />` and PropTypes to `@vx/tooltip` exports [#108](https://github.com/hshoff/vx/pull/108)\n- [demo] use @vx/geo version in deps [#106](https://github.com/hshoff/vx/pull/106)\n\n\n```bash\nChanges:\n- @vx/axis: 0.0.133 => 0.0.134\n- @vx/demo: 0.0.133 => 0.0.134\n- @vx/tooltip: 0.0.133 => 0.0.134\n```\n\n\n# v0.0.133\n\n- ignore this version, lerna got into a bad state.\n\n```bash\nChanges:\n- @vx/axis: 0.0.131 => 0.0.133\n- @vx/demo: 0.0.132 => 0.0.133\n- @vx/tooltip: 0.0.127 => 0.0.133\n```\n\n# v0.0.132\n\n- [geo] add package geo [#105](https://github.com/hshoff/vx/pull/105)\n\n```bash\nChanges:\n- @vx/demo: 0.0.131 => 0.0.132\n- @vx/geo: 0.0.132 => 0.0.132\n```\n\n# v0.0.131\n\n- [shape] LinePath.defined should default to true [#101](https://github.com/hshoff/vx/pull/101)\n- [boxplot] add docs [#102](https://github.com/hshoff/vx/pull/102)\n- [shape] add x-value mouseover to area demo [#103](https://github.com/hshoff/vx/pull/103)\n- [grid] add styles and restProps support for grid lines [#103](https://github.com/hshoff/vx/pull/103)\n\n```bash\nChanges:\n- @vx/annotation: 0.0.130 => 0.0.131\n- @vx/axis: 0.0.130 => 0.0.131\n- @vx/boxplot: 0.0.127 => 0.0.131\n- @vx/demo: 0.0.130 => 0.0.131\n- @vx/grid: 0.0.130 => 0.0.131\n- @vx/marker: 0.0.130 => 0.0.131\n- @vx/shape: 0.0.130 => 0.0.131\n```\n\n# v0.0.130\n\n- [shape] Add tests for Arc, AreaClosed, & Line, fix AreaClosed error [#95](https://github.com/hshoff/vx/pull/95)\n- [Axis] Add tests to Axis.test.js [#94](https://github.com/hshoff/vx/pull/94)\n\n```bash\nChanges:\n- @vx/annotation: 0.0.127 => 0.0.130\n- @vx/axis: 0.0.127 => 0.0.130\n- @vx/demo: 0.0.129 => 0.0.130\n- @vx/grid: 0.0.127 => 0.0.130\n- @vx/marker: 0.0.127 => 0.0.130\n- @vx/shape: 0.0.127 => 0.0.130\n```\n\n# v0.0.129\n\n- [gradient] add <RadialGradient /> [#90](https://github.com/hshoff/vx/pull/90)\n- [bounds] add `@vx/bounds` package with `withBoundingRects()` HOC  [#91](https://github.com/hshoff/vx/pull/91)\n\n```bash\nChanges:\n- @vx/bounds: 0.0.128 => 0.0.129\n- @vx/demo: 0.0.128 => 0.0.129\n- @vx/gradient: 0.0.128 => 0.0.129\n```\n\n# v0.0.128\n\n- ignore this one, `lerna publish` failed midway through\n\n```bash\nChanges:\n- @vx/bounds: 0.0.0 => 0.0.128\n- @vx/demo: 0.0.127 => 0.0.128\n- @vx/gradient: 0.0.127 => 0.0.128\n```\n\n# v0.0.127\n\n- [boxplot] add `@vx/boxplot` [#89](https://github.com/hshoff/vx/pull/89)\n- [mock data] add `genBoxPlot()` [#89](https://github.com/hshoff/vx/pull/89)\n- [tooltip] fix pass through style and restProps [#89](https://github.com/hshoff/vx/pull/89)\n- [shape] fix BarStack.test.js [#88](https://github.com/hshoff/vx/pull/88)\n\n```bash\nChanges:\n- @vx/annotation: 0.0.126 => 0.0.127\n- @vx/axis: 0.0.126 => 0.0.127\n- @vx/boxplot: 1.0.0 => 0.0.127\n- @vx/brush: 0.0.126 => 0.0.127\n- @vx/clip-path: 0.0.126 => 0.0.127\n- @vx/curve: 0.0.126 => 0.0.127\n- @vx/demo: 0.0.126 => 0.0.127\n- @vx/drag: 0.0.126 => 0.0.127\n- @vx/event: 0.0.126 => 0.0.127\n- @vx/glyph: 0.0.126 => 0.0.127\n- @vx/gradient: 0.0.126 => 0.0.127\n- @vx/grid: 0.0.126 => 0.0.127\n- @vx/group: 0.0.126 => 0.0.127\n- @vx/heatmap: 0.0.126 => 0.0.127\n- @vx/hierarchy: 0.0.126 => 0.0.127\n- @vx/legend: 0.0.126 => 0.0.127\n- @vx/marker: 0.0.126 => 0.0.127\n- @vx/mock-data: 0.0.126 => 0.0.127\n- @vx/pattern: 0.0.126 => 0.0.127\n- @vx/point: 0.0.126 => 0.0.127\n- @vx/responsive: 0.0.126 => 0.0.127\n- @vx/scale: 0.0.126 => 0.0.127\n- @vx/shape: 0.0.126 => 0.0.127\n- @vx/text: 0.0.126 => 0.0.127\n- @vx/tooltip: 0.0.126 => 0.0.127\n- @vx/voronoi: 0.0.126 => 0.0.127\n- @vx/zoom: 0.0.126 => 0.0.127\n```\n\n# v0.0.126\n\n- [tooltip] add @vx/tooltip [#87](https://github.com/hshoff/vx/pull/87)\n- [glyph] put classname on the <path> not on <g> [#87](https://github.com/hshoff/vx/pull/87)\n- [mock data] add mock/bitcoinPrice [#87](https://github.com/hshoff/vx/pull/87)\n- [demo] add tooltip demo to dots and barstack, add legend to barstack [#87](https://github.com/hshoff/vx/pull/87)\n- [shape] update `data` passed to each bar in <BarStack /> [#87](https://github.com/hshoff/vx/pull/87)\n\n# v0.0.125\n\n- ignore this one, `lerna publish` failed midway through\n\n# v0.0.124\n\n- [glyph] add remaining d3 symbols [#84](https://github.com/hshoff/vx/pull/84) + [#81](https://github.com/hshoff/vx/pull/81)\n- [gradient] add horizontal linear gradients, make more flexible [#82](https://github.com/hshoff/vx/pull/82)\n- [axis] export orientation constants [#80](https://github.com/hshoff/vx/pull/80)\n- [legend] fix proptypes check on shape prop [#82](https://github.com/hshoff/vx/pull/82)\n\n```bash\nChanges:\n- @vx/axis: 0.0.120 => 0.0.124\n- @vx/demo: 0.0.123 => 0.0.124\n- @vx/glyph: 0.0.121 => 0.0.124\n- @vx/gradient: 0.0.120 => 0.0.124\n- @vx/legend: 0.0.121 => 0.0.124\n```\n\n# v0.0.123\n\n- add `@vx/voronoi` [#78](https://github.com/hshoff/vx/pull/78)\n\n```bash\nChanges:\n- @vx/demo: 0.0.122 => 0.0.123\n- @vx/voronoi: 1.0.0 => 0.0.123\n```\n\n# v0.0.122\n\n- ignore this one, I ran `lerna publish --exact` before `lerna bootstrap` and it failed to publish, but managed to increment versions and couldn't figure how to \"undo\" it so rolling foward to v0.0.123\n\n```bash\nChanges:\n- @vx/demo: 0.0.122 => 0.0.122\n- @vx/voronoi: 0.0.0 => 0.0.122\n```\n\n# v0.0.121\n\n- add `@vx/legend` [#77](https://github.com/hshoff/vx/pull/77)\n- add `scaleQuantize`, `scaleQuantile`, `scaleThreshold`\n- added `GlyphCross` but it's not working yet\n\n```bash\nChanges:\n- @vx/demo: 0.0.120 => 0.0.121\n- @vx/glyph: 0.0.120 => 0.0.121\n- @vx/legend: 1.0.0 => 0.0.121\n- @vx/scale: 0.0.117 => 0.0.121\n```\n\n# v0.0.120\n\n- moved `react` to peerDep & devDep [#75](https://github.com/hshoff/vx/pull/75)\n- add missing `restProps` + `additionalProps` to shape & glyph [#76](https://github.com/hshoff/vx/pull/76)\n- set AreaClosed `y0` to the range's start not `0` [#45](https://github.com/hshoff/vx/pull/74)\n- add strokeDashoffset prop to LinePath [#70](https://github.com/hshoff/vx/pull/70)\n- replace lodash per-method packages with scoped imports [#66](https://github.com/hshoff/vx/pull/66)\n- add tests for pattern circles [#63](https://github.com/hshoff/vx/pull/63)\n- add @vx/clip-path [#61](https://github.com/hshoff/vx/pull/61)\n- fix axis label transform [#59](https://github.com/hshoff/vx/pull/59)\n\n```bash\nChanges:\n- @vx/annotation: 0.0.119 => 0.0.120\n- @vx/axis: 0.0.119 => 0.0.120\n- @vx/brush: 0.0.114 => 0.0.120\n- @vx/clip-path: 0.0.0 => 0.0.120\n- @vx/demo: 0.0.119 => 0.0.120\n- @vx/drag: 0.0.114 => 0.0.120\n- @vx/glyph: 0.0.114 => 0.0.120\n- @vx/gradient: 0.0.112 => 0.0.120\n- @vx/grid: 0.0.119 => 0.0.120\n- @vx/group: 0.0.114 => 0.0.120\n- @vx/heatmap: 0.0.116 => 0.0.120\n- @vx/hierarchy: 0.0.119 => 0.0.120\n- @vx/marker: 0.0.119 => 0.0.120\n- @vx/pattern: 0.0.112 => 0.0.120\n- @vx/responsive: 0.0.115 => 0.0.120\n- @vx/shape: 0.0.119 => 0.0.120\n- @vx/text: 0.0.114 => 0.0.120\n```\n\n\n# v0.0.114\n\n### @vx/shape\n\n  - added `<BarGroup />` & `<BarStack />` [#39](https://github.com/hshoff/vx/pull/39)\n  \n### general\n\n  - added jest + enzyme tests & travis + coveralls ci\n\n# v0.0.113\n\n### @vx/axis\n\n  - axis labels and tickLabels are now passed in as components [#31](https://github.com/hshoff/vx/pull/31) &bull; [example diff](https://github.com/hshoff/vx/pull/31/files#diff-427e08aaa7d707f2374af36902ff0e15)\n  \n### @vx/group\n\n  - added `transform` prop [#31](https://github.com/hshoff/vx/pull/31)\n\n# v0.0.112\n\n### @vx/curve, @vx/point, @vx/mock-data, @vx/annotation, @vx/group, @vx/pattern, @vx/gradient, @vx/glyph\n\n  - added tests with jest + enzyme [#30](https://github.com/hshoff/vx/pull/30)\n\n### @vx/annotation, @vx/pattern\n\n  - added prop-types [#30](https://github.com/hshoff/vx/pull/30)\n"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "content": "# Contributor Covenant Code of Conduct\n\nAirbnb has adopted a Code of Conduct that we expect project participants to adhere to. Please\n[read the full Code of Conduct text](https://airbnb.io/codeofconduct/) so that you can understand\nwhat actions will and will not be tolerated. Report violations to the maintainers of this project or\nto [opensource-conduct@airbnb.com](mailto:opensource-conduct@airbnb.com).\n\nReports sent to [opensource-conduct@airbnb.com](mailto:opensource-conduct@airbnb.com) are received\nby Airbnb's open source code of conductmoderation team, which is composed of Airbnb employees. All\ncommunications are private and confidential.\n"
  },
  {
    "path": "CONTRIBUTING.md",
    "content": "# Contributing\n\nContributions welcome! Please follow the [code of conduct](./CODE_OF_CONDUCT.md).\n\n## Overview\n\n[Yarn workspaces](https://yarnpkg.com/lang/en/docs/workspaces/) are used to manage dependencies and\nbuild config across packages in the umbrella `visx` monorepo, and\n[lerna](https://github.com/lerna/lerna/) is used to manage versioning.\n\n## Project structure\n\n```\nvisx/\n  lerna.json\n  package.json\n  packages/\n    visx-package-1/\n      src/\n      test/\n      build/\n      package.json\n      ...\n    visx-package-2/\n      ...\n    ...\n```\n\n## Local development\n\nRun the following to setup your local dev environment:\n\n```sh\n# Install `yarn`, alternatives at https://yarnpkg.com/en/docs/install\ncurl -o- -L https://yarnpkg.com/install.sh | bash\n\n# Clone or fork `visx`\ngit clone git@github.com:airbnb/visx.git # or your fork\ncd visx\n\n# install dependencies, and have `yarn` symlink within-`visx` dependencies\nyarn\n\n# build packages and generate types for local development\nyarn build\n```\n\n#### Rebuild specific package(s)\n\nUpon modification of a single `package` you can run the following to rebuild it. Note that you can\nspecify multiple packages to build this way, and optionally append `--watch` to continuously watch\nfor changes.\n\n```sh\n# build the specified package(s) as cjs + esm versions\n# example `PKG=@visx/axis yarn babel:pkg`\nPKG=@visx/{package[,package]} yarn babel:pkg\n\n# generate d.ts(definition files) the specified package(s)\n# and rebuild any other packages the specified package(s) depend on\n# example `PKG=@visx/axis yarn type:pkg`\nPKG=@visx/{package[,package]} yarn type:pkg\n```\n\nfrom the `visx` monorepo root to re-build the package with your changes.\n\n#### Running demo pages\n\nYou can use the local [`next.js`](https://nextjs.org) dev server within `packages/visx-demo` to view\nand iterate on your changes in the gallery. From the `packages/visx-demo` folder run `yarn dev` to\nstart the next server which (if correctly sym-linked) will also watch for changes you make to other\npackages (upon re-building them, see above section).\n\n#### Config generation\n\n`visx` uses [`@airbnb/nimbus`](https://github.com/airbnb/nimbus) to generate build configuration for\n`eslint`, `prettier`, `jest`, `babel`, and `typescript`.\n"
  },
  {
    "path": "LICENSE",
    "content": "MIT License\n\nCopyright (c) 2017-2018 Harrison Shoff\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "PULL_REQUEST_TEMPLATE.md",
    "content": "#### :boom: Breaking Changes\n\n-\n\n#### :rocket: Enhancements\n\n-\n\n#### :memo: Documentation\n\n-\n\n#### :bug: Bug Fix\n\n-\n\n#### :house: Internal\n\n-\n"
  },
  {
    "path": "README.md",
    "content": "<p align=\"center\">\n  <img src=\"./assets/visx-geometry.png\" />\n</p>\n\n<p align=\"center\">\n  <a title=\"npm version\" href=\"https://www.npmjs.com/~visx\">\n    <img src=\"https://img.shields.io/npm/v/@visx/demo.svg?style=flat-square\" />\n  </a>\n  <a title=\"@visx/shape npm downloads\" href=\"https://www.npmjs.com/package/@visx/shape\">\n    <img src=\"https://img.shields.io/npm/dm/@visx/shape.svg?style=flat-square\" />\n  </a>\n  <a href=\"https://lerna.js.org/\" alt=\"lerna\">\n     <img src=\"https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg\"/>\n  </a>\n</p>\n\n### visx\n\nvisx is a collection of reusable low-level visualization components. visx combines the power of d3\nto generate your visualization with the benefits of react for updating the DOM.\n\n<br />\n\n<p align=\"center\">\n  <strong>\n    <a href=\"https://airbnb.io/visx\">Docs</a>\n  </strong>\n  &bull;\n  <strong>\n    <a href=\"https://airbnb.io/visx/gallery\">Gallery</a>\n  </strong>\n  &bull;\n  <strong>\n    <a href=\"https://medium.com/vx-code/getting-started-with-vx-1756bb661410\">Blog</a>\n  </strong>\n  &bull;\n  <strong>\n    <a href=\"https://github.com/airbnb/visx/discussions\">Discussions</a>\n  </strong>\n  &bull;\n  <strong>\n    <a href=\"./CHANGELOG.md\">Changelog</a>\n  </strong>\n  &bull;\n  <strong>\n    <a href=\"https://medium.com/vx-code/getting-started-with-vx-1756bb661410\">Getting started tutorial</a>\n  </strong>\n</p>\n\n<p align=\"center\">\n  <a href=\"https://airbnb.io/visx/gallery\">\n    <img src=\"./assets/visx-gallery.png\" />\n  </a>\n</p>\n\n## Usage\n\nLet's make a simple bar graph.\n\nFirst we'll install the relevant packages:\n\n```bash\nnpm install --save @visx/mock-data @visx/group @visx/shape @visx/scale\n```\n\n<img src=\"./assets/simplebar.png\" height=\"150\" />\n\n```javascript\nimport React from 'react';\nimport { letterFrequency } from '@visx/mock-data';\nimport { Group } from '@visx/group';\nimport { Bar } from '@visx/shape';\nimport { scaleLinear, scaleBand } from '@visx/scale';\n\n// We'll use some mock data from `@visx/mock-data` for this.\nconst data = letterFrequency;\n\n// Define the graph dimensions and margins\nconst width = 500;\nconst height = 500;\nconst margin = { top: 20, bottom: 20, left: 20, right: 20 };\n\n// Then we'll create some bounds\nconst xMax = width - margin.left - margin.right;\nconst yMax = height - margin.top - margin.bottom;\n\n// We'll make some helpers to get at the data we want\nconst x = (d) => d.letter;\nconst y = (d) => +d.frequency * 100;\n\n// And then scale the graph by our data\nconst xScale = scaleBand({\n  range: [0, xMax],\n  round: true,\n  domain: data.map(x),\n  padding: 0.4,\n});\nconst yScale = scaleLinear({\n  range: [yMax, 0],\n  round: true,\n  domain: [0, Math.max(...data.map(y))],\n});\n\n// Compose together the scale and accessor functions to get point functions\nconst compose = (scale, accessor) => (data) => scale(accessor(data));\nconst xPoint = compose(xScale, x);\nconst yPoint = compose(yScale, y);\n\n// Finally we'll embed it all in an SVG\nfunction BarGraph(props) {\n  return (\n    <svg width={width} height={height}>\n      {data.map((d, i) => {\n        const barHeight = yMax - yPoint(d);\n        return (\n          <Group key={`bar-${i}`}>\n            <Bar\n              x={xPoint(d)}\n              y={yMax - barHeight}\n              height={barHeight}\n              width={xScale.bandwidth()}\n              fill=\"#fc2e1c\"\n            />\n          </Group>\n        );\n      })}\n    </svg>\n  );\n}\n\n// ... somewhere else, render it ...\n// <BarGraph />\n```\n\nFor more examples using `visx`, check out the [gallery](https://airbnb.io/visx/gallery).\n\n## Motivation\n\n**Goal**\n\nThe goal is to create a library of components you can use to make both your own reusable chart\nlibrary or your slick custom one-off chart. visx is largely unopinionated and is meant to be built\nupon. Keep your bundle sizes down and use only the packages you need.\n\n**How?**\n\nUnder the hood, visx is using d3 for the calculations and math. If you're creating your own awesome\nchart library on top of visx, it's easy to create a component api that hides d3 entirely. Meaning\nyour team could create charts as easily as using reusable react components.\n\n**But why?**\n\nMixing two mental models for updating the DOM is never a good time. Copy and pasting d3 code into\n`componentDidMount()` is just that. This collection of components lets you easily build your own\nreusable visualization charts or library without having to learn d3. No more selections or\n`enter()`/`exit()`/`update()`.\n\n## In the wild\n\n- [williaster/data-ui](https://github.com/williaster/data-ui)\n  ([Demo](https://williaster.github.io/data-ui/))\n- [dylanmoz/trello](https://github.com/DylanMoz/dylanmoz.github.io/blob/source/src/pages/trello/TrelloGraph.js)\n  ([Demo](http://dylanmoz.github.io/trello/))\n  ([How to Make Beautiful Graphs With vx and React-Motion](https://devblog.classy.org/how-to-make-beautiful-graphs-with-vx-and-react-motion-6ffe7aecf6f3))\n- [gkunthara/Crypto-Chart](https://github.com/gkunthara/Crypto-Chart)\n  ([Tutorial](https://medium.com/@georgekunthara/after-the-tutorial-the-first-react-app-4dce6645634e))\n- Collapsible tree with [`react-move`](https://github.com/react-tools/react-move) by\n  [@techniq](https://github.com/techniq) ([Demo](https://codesandbox.io/s/n3w687vmqj))\n  ([Radial demo](https://codesandbox.io/s/vmqwrkl395))\n  ([More info](https://github.com/airbnb/visx/issues/162#issuecomment-335029517))\n- Bitcoin 30-day price by [@hshoff](https://github.com/hshoff)\n  ([Github](https://github.com/hshoff/viewsource#1-bitcoin-price-chart))\n  ([YouTube](https://www.youtube.com/watch?v=oeE2tuspdHg))\n- Ethereum candlestick chart by [@hshoff](https://github.com/hshoff)\n  ([Github](https://github.com/hshoff/viewsource#2-ethereum-candlestick-chart))\n- Song data visualization through spotify by [@bother7](https://github.com/bother7)\n  ([Github](https://github.com/bother7/spotalyzer_frontend))\n- Investment Calculator ([website](https://investmentcalculator.io/))\n- Animation with [`react-spring`](https://github.com/drcmda/react-spring/) by\n  [@drcmda](https://github.com/drcmda) ([Demo](https://codesandbox.io/embed/j3x61vjz5v))\n- Code Coverage Dashboard by [@ezy](https://github.com/ezy)\n  ([Github](https://github.com/ezy/code-coverage-dashboard))\n- Ethereum Portfolio Toolkit by [@JayWelsh](https://github.com/JayWelsh)\n  ([Demo](https://cryptocape.com/)) ([Github](https://github.com/JayWelsh/CryptoCape))\n- Family tree by [@vkallore](https://github.com/vkallore)\n  ([Github](https://github.com/vkallore/d3-vx-family-tree))\n- South African Coronavirus Data Visuals by [@JayWelsh](https://github.com/JayWelsh)\n  ([Demo](https://coronamap.co.za/)) ([Github](https://github.com/JayWelsh/coronamap))\n- [CNN: Tracking America's Recovery](https://www.cnn.com/business/us-economic-recovery-coronavirus)\n- [Wall Street Journal: Americans Familiarize Themselves with the Word ‘Forbearance’](https://blogs.wsj.com/dailyshot/2020/04/13/the-daily-shot-americans-familiarize-themselves-with-the-word-forbearance/)\n  by [@rayshan](https://github.com/rayshan)\n  ([Demo](https://finance.shan.io/recessions-bear-markets-compared))\n- Dollar to food emoji caculator by [@gmlwo530](https://github.com/gmlwo530)\n  ([Demo](https://dollar-to-food-emoji.web.app/))\n  ([Github](https://github.com/gmlwo530/dollar-to-food-emoji))\n- [zh-TW] Taiwan Real-time Air Quality Index by\n  [@ArvinH](https://github.com/ArvinH)([Demo](https://codesandbox.io/s/simpleradar-aqi-with-tooltip-select-data-react-spring-item3?file=/Radar.tsx))([Tutorial](https://blog.arvinh.info/tech/datavis-visx))\n- tokenized BTC on ethereum stacked chart with brush by [@sakulstra](https://github.com/sakulstra)\n- [Escape From Tarkov Ammo Chart](https://eft.monster/) by\n  [@codenomial](https://github.com/codenomial)\n- [Pry](https://pry.co) Finance for Founders (dashboard by [@valtism](https://github.com/valtism))\n- [Data 2 the People](https://www.data2thepeople.org/) Donation Efficacy Analysis for Downballot\n  Races ([Demo](https://donate.data2thepeople.org/))\n  ([Github](https://github.com/Data-2-the-People/skyfall/blob/master/components/Scatterplot.jsx))\n- [Augora](https://augora.fr) Display information of french deputies\n  ([Demo](https://augora.fr/statistiques))([Github](https://github.com/Augora/Augora))\n- WHO Coronavirus (COVID-19) Dashboard is built on top of `vx`, earlier version of `visx`.\n  ([Demo](https://covid19.who.int/))\n- [Fig Stats](https://fig-stats.com) - Figma community plugin & widget analytics\n- [Physician.FYI](https://physician.fyi) - Explore physicians' disciplinary history\n- [Index by Superstardle](https://index.superstardle.com),\n  [Salaries by Superstardle](https://salaries.superstardle.com), &\n  [Pack'Em by Superstardle](https://playoffs.superstardle.com) - Explore professional sports teams\n  and superstars in the world of underdogs, salaries, and playoff performances.\n- Ridgeline chart visualizing shuffling probabilities by [@jmssnr](https://github.com/jmssnr)\n  ([Demo](https://shuffling-probability.vercel.app/))\n  ([Github](https://github.com/jmssnr/shuffling-probability))\n- [UCSF Data Library](https://datalibrary.ucsf.edu) - Landing page for disease research tools\n  ([Github](https://github.com/mountetna/monoetna/tree/master/vesta/ui))\n\nHave a project that's using `visx`? Open a pull request and we'll add it to the list.\n\n## FAQ\n\n1. What does `visx` stand for?\n\n   > visx stands for visualization components.\n\n1. Do you plan on supporting animation/transitions?\n\n   > A common criticism of visx is it doesn't have animation baked in, but this was a conscious\n   > choice. It's a powerful feature to not bake it in.\n   >\n   > Imagine your app already bundles `react-motion`, adding a hypothetical `@visx/animation` is\n   > bloat. Since visx is react, it already supports all react animation libs.\n   >\n   > Charting libraries are like style guides. Each org or app will eventually want full control\n   > over their own implementation.\n   >\n   > visx makes this easier for everyone. No need to reinvent the wheel each time.\n   >\n   > more info: https://github.com/airbnb/visx/issues/6\n   >\n   > examples:\n   >\n   > - Collapsible tree with [`react-move`](https://github.com/react-tools/react-move) by\n   >   [@techniq](https://github.com/techniq) ([Demo](https://codesandbox.io/s/n3w687vmqj))\n   >   ([Radial demo](https://codesandbox.io/s/vmqwrkl395))\n   > - Animation with `react-spring` by [@drcmda](https://github.com/drcmda)\n   >   ([Demo](https://codesandbox.io/embed/j3x61vjz5v))\n\n1. Do I have to use every package to make a chart?\n\n   > nope! pick and choose the packages you need.\n\n1. Can I use this to create my own library of charts for my team?\n\n   > Please do.\n\n1. Does visx work with [preact](https://preactjs.com/)?\n\n   > yup! need to alias `react` + `react-dom` and use `preact-compat`.\n\n1. I like using d3.\n\n   > Me too.\n\n## Development\n\nPlease see [CONTRIBUTING.md](./CONTRIBUTING.md)\n\n:v:\n\n[MIT](./LICENSE)\n"
  },
  {
    "path": "babel.config.js",
    "content": "const esm = process.env.ESM;\n\nconst envOptions = {\n  loose: false,\n  modules: esm ? false : 'commonjs',\n  shippedProposals: true,\n  targets: {\n    browsers: [\n      'chrome >= 108',\n      'edge >= 108',\n      'firefox >= 133',\n      'safari >= 15.6',\n      'ios_saf >= 15.6',\n      'samsung >= 27',\n    ],\n  },\n  bugfixes: false,\n};\n\nconst presets = [\n  ['@babel/preset-env', envOptions],\n  ['@babel/preset-react', { runtime: 'automatic', useBuiltIns: true, useSpread: true }],\n  '@babel/preset-typescript',\n];\n\nconst plugins = [];\n\nconst ignore = [\n  'coverage/',\n  'public/',\n  'esm/',\n  'lib/',\n  'tmp/',\n  'dist/',\n  '*.d.ts',\n  '__tests__',\n  '__mocks__',\n];\n\nswitch (process.env.NODE_ENV) {\n  case 'test': {\n    envOptions.modules = 'commonjs';\n    envOptions.targets = { node: 'current' };\n    plugins.push('babel-plugin-dynamic-import-node');\n    break;\n  }\n\n  case 'development':\n  case 'production':\n  default: {\n    break;\n  }\n}\n\nmodule.exports = {\n  ignore,\n  plugins,\n  presets,\n};\n"
  },
  {
    "path": "config-eslint/base.js",
    "content": "const EXTS = ['.ts', '.tsx', '.js', '.jsx', '.json'];\nconst EXTS_GROUP = '{ts,tsx,js,jsx}';\nconst ASSET_EXT_PATTERN = /\\.(ttf|eot|otf|svg|woff|woff2|mp3|png|jpg|jpeg|gif|ico)$/;\n\nmodule.exports = {\n  parser: '@babel/eslint-parser',\n\n  parserOptions: {\n    requireConfigFile: false,\n  },\n\n  extends: ['airbnb', 'plugin:jsx-a11y/recommended'],\n\n  plugins: ['import', 'react', 'react-hooks'],\n\n  globals: {\n    // Metrics and analytics providers\n    ga: 'readonly',\n    // Mostly for easier compatibility between browsers, workers, etc\n    global: 'readonly',\n    // Mostly references to `process.env.NODE_ENV`\n    process: 'readonly',\n  },\n\n  env: {\n    browser: true,\n    node: false,\n  },\n\n  reportUnusedDisableDirectives: true,\n\n  settings: {\n    propWrapperFunctions: ['forbidExtraProps', 'exact', 'Object.freeze'],\n    'import/ignore': ['node_modules', '\\\\.json$', ASSET_EXT_PATTERN.source],\n    'import/extensions': EXTS,\n    'import/resolver': {\n      node: {\n        extensions: EXTS,\n      },\n    },\n  },\n\n  rules: {\n    'react-hooks/exhaustive-deps': 'error',\n    'react-hooks/rules-of-hooks': 'error',\n  },\n\n  overrides: [\n    {\n      files: [`*.test.${EXTS_GROUP}`],\n      plugins: [],\n      globals: {\n        // vitest globals\n        describe: 'readonly',\n        it: 'readonly',\n        test: 'readonly',\n        expect: 'readonly',\n        assert: 'readonly',\n        vitest: 'readonly',\n        vi: 'readonly',\n        beforeAll: 'readonly',\n        beforeEach: 'readonly',\n        afterAll: 'readonly',\n        afterEach: 'readonly',\n        // other globals\n        jsdom: 'readonly',\n      },\n      env: {\n        node: true,\n      },\n      rules: {\n        'max-classes-per-file': 'off',\n        'no-magic-numbers': 'off',\n        'sort-keys': 'off',\n\n        // REACT\n        'react/function-component-definition': 'off',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "config-eslint/next.js",
    "content": "const EXTS_GROUP = '{ts,tsx,js,jsx}';\n\nmodule.exports = {\n  parser: '@babel/eslint-parser',\n\n  plugins: ['promise', 'unicorn'],\n\n  rules: {\n    // Not enabled in Airbnb\n    'default-param-last': 'error',\n    'func-name-matching': [\n      'error',\n      'always',\n      {\n        considerPropertyDescriptor: true,\n        includeCommonJSModuleExports: false,\n      },\n    ],\n    'jsx-quotes': ['error', 'prefer-double'],\n    'multiline-comment-style': 'off',\n    'multiline-ternary': ['error', 'never'],\n    'no-constant-condition': 'error',\n    'no-constructor-return': 'error',\n    'no-div-regex': 'error',\n    'no-dupe-else-if': 'error',\n    'no-implicit-coercion': 'error',\n    'no-import-assign': 'error',\n    'no-native-reassign': 'error',\n    'no-negated-condition': 'error',\n    'no-setter-return': 'error',\n    'no-useless-call': 'error',\n    'prefer-exponentiation-operator': 'error',\n    'prefer-regex-literals': 'error',\n    'require-atomic-updates': 'error',\n\n    // Replaced with new proposals\n    'react/jsx-props-no-spreading': 'off',\n    'react/state-in-constructor': 'off',\n    'react/static-property-placement': 'off',\n\n    // IMPORT\n    'import/default': 'error',\n    'import/namespace': 'error',\n    'import/no-unused-modules': 'off', // Super broken at the moment\n    'import/imports-first': 'error',\n\n    // PROMISE\n    'promise/no-callback-in-promise': 'error',\n    'promise/no-new-statics': 'error',\n    'promise/no-promise-in-callback': 'error',\n    'promise/no-return-in-finally': 'error',\n    'promise/no-return-wrap': ['error', { allowReject: true }],\n    'promise/param-names': 'error',\n    'promise/valid-params': 'error',\n\n    // REACT\n    'react/destructuring-assignment': 'off', // Broken with class properties\n    'react/forbid-prop-types': ['error', { forbid: ['any', 'array'] }],\n    'react/jsx-handler-names': [\n      'error',\n      {\n        eventHandlerPrefix: 'handle',\n        eventHandlerPropPrefix: 'on',\n      },\n    ],\n    'react/jsx-key': 'error',\n    'react/jsx-no-literals': 'error',\n    'react/jsx-no-useless-fragment': 'error',\n    'react/jsx-no-script-url': 'error',\n    'react/jsx-sort-default-props': [\n      'error',\n      {\n        ignoreCase: true,\n      },\n    ],\n    'react/jsx-sort-props': [\n      'error',\n      {\n        callbacksLast: true,\n        shorthandFirst: true,\n        noSortAlphabetically: true,\n        reservedFirst: true,\n      },\n    ],\n    'react/no-did-mount-set-state': 'error',\n    'react/no-direct-mutation-state': 'error',\n    'react/no-unknown-property': [\n      2,\n      {\n        ignore: ['jsx', 'global'], // used by next\n      },\n    ],\n    'react/sort-comp': 'off',\n    'react/sort-prop-types': [\n      'error',\n      {\n        ignoreCase: true,\n        callbacksLast: true,\n        requiredFirst: false,\n        sortShapeProp: true,\n      },\n    ],\n\n    // UNICORN\n    'unicorn/better-regex': 'error',\n    'unicorn/catch-error-name': 'error',\n    'unicorn/consistent-function-scoping': 'error',\n    'unicorn/custom-error-definition': 'error',\n    'unicorn/error-message': 'error',\n    'unicorn/escape-case': 'error',\n    'unicorn/explicit-length-check': 'error',\n    'unicorn/filename-case': 'off',\n    'unicorn/import-index': 'error',\n    'unicorn/new-for-builtins': 'error',\n    'unicorn/no-abusive-eslint-disable': 'off',\n    'unicorn/no-array-instanceof': 'error',\n    'unicorn/no-hex-escape': 'error',\n    'unicorn/no-fn-reference-in-iterator': 'error',\n    'unicorn/no-for-loop': 'error',\n    'unicorn/no-new-buffer': 'error',\n    'unicorn/no-process-exit': 'error',\n    'unicorn/no-zero-fractions': 'error',\n    'unicorn/number-literal-case': 'error',\n    'unicorn/prefer-add-event-listener': 'error',\n    'unicorn/prefer-dataset': 'error',\n    'unicorn/prefer-event-key': 'error',\n    'unicorn/prefer-flat-map': 'error',\n    'unicorn/prefer-includes': 'error',\n    'unicorn/prefer-modern-dom-apis': 'error',\n    'unicorn/prefer-negative-index': 'error',\n    'unicorn/prefer-node-append': 'error',\n    'unicorn/prefer-node-remove': 'error',\n    'unicorn/prefer-starts-ends-with': 'error',\n    'unicorn/prefer-string-slice': 'error',\n    'unicorn/prefer-spread': 'off', // Currently broken\n    'unicorn/prefer-text-content': 'error',\n    'unicorn/prefer-trim-start-end': 'error',\n    'unicorn/prefer-type-error': 'error',\n    'unicorn/throw-new-error': 'error',\n  },\n\n  overrides: [\n    {\n      files: [`*.test.${EXTS_GROUP}`],\n      rules: {\n        'unicorn/no-fn-reference-in-iterator': 'off',\n        'unicorn/consistent-function-scoping': 'off',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "config-eslint/prettier.js",
    "content": "module.exports = {\n  extends: ['prettier'],\n\n  plugins: ['prettier'],\n\n  rules: {\n    'prettier/prettier': 'error',\n  },\n};\n"
  },
  {
    "path": "config-eslint/typescript.js",
    "content": "const EXTS_GROUP = '{ts,tsx,js,jsx}';\n\n// In TS, all arguments are required for type information,\n// so we need to override the base JS setting.\nconst noUnused = { vars: 'all', args: 'none', ignoreRestSiblings: true };\n\nconst project = 'tsconfig.eslint.json';\n\nmodule.exports = {\n  settings: {\n    'import/parsers': {\n      '@typescript-eslint/parser': ['.ts', '.tsx'],\n    },\n  },\n\n  parserOptions: {\n    project,\n  },\n\n  overrides: [\n    {\n      files: ['*.{ts,tsx}'],\n\n      parser: '@typescript-eslint/parser',\n\n      plugins: ['@typescript-eslint'],\n\n      rules: {\n        'func-call-spacing': 'off',\n        'no-restricted-globals': 'off',\n        'no-unused-vars': 'off',\n\n        // IMPORT (Conflicts with TS patterns)\n        'no-duplicate-imports': 'off', // Disabled in favor of import/no-duplicates\n        'import/export': 'off', // TypeScript allows same name for type and value exports\n        'import/extensions': [\n          'error',\n          'never',\n          {\n            json: 'always',\n          },\n        ],\n        'import/named': 'off',\n        'import/no-cycle': 'off',\n        'import/no-duplicates': 'error', // Handles TS type/value namespace separation\n        'import/no-named-as-default': 'off',\n        'import/no-extraneous-dependencies': [\n          'error',\n          {\n            devDependencies: [\n              `test/**/*.${EXTS_GROUP}`,\n              `tests/**/*.${EXTS_GROUP}`,\n              `**/*.test.${EXTS_GROUP}`,\n              `**/jest.config.${EXTS_GROUP}`,\n              `**/webpack.config.${EXTS_GROUP}`,\n              `**/webpack.config.*.${EXTS_GROUP}`,\n            ],\n            optionalDependencies: false,\n          },\n        ],\n\n        // REACT (We dont use prop types)\n        'react/default-props-match-prop-types': 'off',\n        'react/jsx-filename-extension': [\n          'error',\n          {\n            extensions: ['.tsx'],\n          },\n        ],\n        'react/no-unused-prop-types': 'off',\n        'react/prop-types': 'off',\n        'react/require-default-props': 'off',\n\n        // UNICORN\n        'unicorn/no-fn-reference-in-iterator': 'off',\n\n        // TYPESCRIPT\n        '@typescript-eslint/adjacent-overload-signatures': 'error',\n        '@typescript-eslint/await-thenable': 'error',\n        '@typescript-eslint/camelcase': 'off', // broken\n        '@typescript-eslint/class-name-casing': 'off', // broken\n        '@typescript-eslint/consistent-type-assertions': [\n          'error',\n          { assertionStyle: 'as', objectLiteralTypeAssertions: 'allow-as-parameter' },\n        ],\n        '@typescript-eslint/consistent-type-exports': ['error', { fixMixedExportsWithInlineTypeSpecifier: true }],\n        '@typescript-eslint/consistent-type-imports': ['error', { prefer: 'type-imports' }],\n        '@typescript-eslint/explicit-function-return-type': 'off', // Allow inferrence\n        '@typescript-eslint/func-call-spacing': ['error', 'never'],\n        '@typescript-eslint/member-delimiter-style': 'error',\n        '@typescript-eslint/member-ordering': 'off', // Prefer react/sort-comp\n        '@typescript-eslint/no-array-constructor': 'error',\n        '@typescript-eslint/no-empty-function': 'off', // Default props are usually empty\n        '@typescript-eslint/no-empty-interface': 'error',\n        '@typescript-eslint/no-explicit-any': [\n          'warn',\n          { fixToUnknown: false, ignoreRestArgs: true },\n        ],\n        '@typescript-eslint/no-extra-parens': 'error',\n        '@typescript-eslint/no-for-in-array': 'error',\n        '@typescript-eslint/no-misused-new': 'error',\n        '@typescript-eslint/no-misused-promises': 'error',\n        '@typescript-eslint/no-require-imports': 'error',\n        '@typescript-eslint/no-unnecessary-boolean-literal-compare': 'error',\n        '@typescript-eslint/no-unsafe-call': 'warn',\n        '@typescript-eslint/no-unsafe-member-access': 'warn',\n        '@typescript-eslint/no-unsafe-return': 'warn',\n        '@typescript-eslint/no-unused-vars': ['error', noUnused],\n        '@typescript-eslint/no-use-before-define': 'error',\n        '@typescript-eslint/prefer-as-const': 'error',\n        '@typescript-eslint/prefer-for-of': 'error',\n        '@typescript-eslint/prefer-namespace-keyword': 'error',\n        '@typescript-eslint/prefer-nullish-coalescing': 'off', // Lots of false positives\n        '@typescript-eslint/prefer-optional-chain': 'error',\n        '@typescript-eslint/promise-function-async': 'off', // Conflicts with other async rules\n        '@typescript-eslint/require-await': 'error',\n        '@typescript-eslint/switch-exhaustiveness-check': 'error',\n        '@typescript-eslint/triple-slash-reference': 'error',\n        '@typescript-eslint/type-annotation-spacing': 'error',\n        '@typescript-eslint/unified-signatures': 'error',\n      },\n    },\n  ],\n};\n"
  },
  {
    "path": "lerna.json",
    "content": "{\n  \"packages\": [\n    \"packages/*\"\n  ],\n  \"version\": \"4.0.1-alpha.0\",\n  \"command\": {\n    \"publish\": {\n      \"allowBranch\": \"master\"\n    }\n  },\n  \"$schema\": \"node_modules/lerna/schemas/lerna-schema.json\"\n}"
  },
  {
    "path": "package.json",
    "content": "{\n  \"name\": \"@visx/root\",\n  \"license\": \"MIT\",\n  \"version\": \"0.0.0\",\n  \"description\": \"Low-level visualization components\",\n  \"keywords\": [\n    \"react\",\n    \"d3\",\n    \"visualization\",\n    \"visx\",\n    \"charts\"\n  ],\n  \"engines\": {\n    \"node\": \">=22.0.0\",\n    \"yarn\": \">=4.0.0\"\n  },\n  \"contributors\": [\n    {\n      \"name\": \"Harrison Shoff\",\n      \"url\": \"https://github.com/hshoff\"\n    },\n    {\n      \"name\": \"Chris Williams\",\n      \"url\": \"https://github.com/williaster\"\n    },\n    {\n      \"name\": \"Krist Wongsuphasawat\",\n      \"url\": \"https://github.com/kristw\"\n    }\n  ],\n  \"private\": true,\n  \"scripts\": {\n    \"build:vendor\": \"yarn run ts ./packages/visx-vendor/scripts/buildVendor\",\n    \"babel\": \"yarn run babel:cjs && yarn run babel:esm\",\n    \"babel:cjs\": \"lerna exec --ignore '@visx/{demo,vendor}' --parallel -- babel --root-mode upward --delete-dir-on-start src/ --out-dir lib --extensions .ts,.tsx\",\n    \"babel:esm\": \"ESM=true lerna exec --ignore '@visx/{demo,vendor}' --parallel -- babel --root-mode upward --delete-dir-on-start src/ --out-dir esm --extensions .ts,.tsx\",\n    \"babel:pkg\": \"lerna exec --scope $PKG -- babel --root-mode upward --delete-dir-on-start src/ --out-dir lib --extensions .ts,.tsx && lerna exec --scope $PKG -- ESM=true babel --root-mode upward --delete-dir-on-start src/ --out-dir esm --extensions .ts,.tsx\",\n    \"build\": \"yarn run build:vendor && yarn run babel && yarn run type\",\n    \"build:sizes\": \"yarn run ts ./scripts/computeBuildSizes.ts\",\n    \"build:release\": \"yarn run ts ./scripts/performRelease/index.ts\",\n    \"dev:demo\": \"yarn run docs:generate && yarn workspace @visx/demo dev\",\n    \"check:sizes\": \"yarn run ts ./scripts/compareBuildSizes.ts\",\n    \"clean\": \"rm -rf ./packages/**/{lib,esm}\",\n    \"docs:generate\": \"yarn run ts ./scripts/generateDocs.ts\",\n    \"format\": \"lerna exec --parallel -- prettier --write --ignore-path ../../.prettierignore .\",\n    \"lint\": \"eslint packages/ --quiet\",\n    \"lint:fix\": \"yarn run lint --fix\",\n    \"postinstall\": \"yarn run ts ./scripts/postInstall.ts\",\n    \"prepare-release\": \"git checkout master && git pull --rebase origin master && lerna updated\",\n    \"release\": \"yarn run prepare-release && lerna publish --exact\",\n    \"setup\": \"yarn run build\",\n    \"test\": \"yarn run vitest run\",\n    \"test:watch\": \"yarn run vitest watch\",\n    \"vitest\": \"vitest\",\n    \"vitest:ui\": \"vitest --ui\",\n    \"ts\": \"ts-node --project ./tsconfig.node.json\",\n    \"type\": \"yarn type:clean && yarn type:build\",\n    \"type:build\": \"lerna exec -- tsc --build\",\n    \"type:clean\": \"find . -type f -name 'tsconfig.tsbuildinfo' -delete\",\n    \"type:pkg\": \"lerna exec --scope $PKG -- tsc --build --verbose\",\n    \"type:update-refs\": \"yarn run ts ./scripts/updateTsReferences.ts\",\n    \"vendor-check\": \"yarn run ts ./packages/visx-vendor/scripts/flagVendorRequirements.ts\"\n  },\n  \"devDependencies\": {\n    \"@babel/cli\": \"^7.26.4\",\n    \"@babel/core\": \"^7.26.0\",\n    \"@babel/eslint-parser\": \"^7.25.9\",\n    \"@babel/preset-env\": \"^7.26.0\",\n    \"@babel/preset-react\": \"^7.26.3\",\n    \"@babel/preset-typescript\": \"^7.26.0\",\n    \"@octokit/openapi-types\": \"18.0.0\",\n    \"@octokit/rest\": \"18.1.0\",\n    \"@testing-library/dom\": \"^10.4.0\",\n    \"@testing-library/jest-dom\": \"^6.6.0\",\n    \"@testing-library/react\": \"^16.1.0\",\n    \"@testing-library/user-event\": \"^13.5.0\",\n    \"@types/jsdom\": \"27.0.0\",\n    \"@types/node\": \"^22.10.2\",\n    \"@types/react\": \"^19.0.0\",\n    \"@types/react-dom\": \"^19.0.0\",\n    \"@typescript-eslint/eslint-plugin\": \"^8.18.1\",\n    \"@typescript-eslint/parser\": \"^8.18.1\",\n    \"@vitest/coverage-v8\": \"4\",\n    \"@vitest/eslint-plugin\": \"^1.4.0\",\n    \"@vitest/ui\": \"4\",\n    \"airbnb-js-shims\": \"^2.2.1\",\n    \"chalk\": \"4.1.0\",\n    \"eslint\": \"^8.57.0\",\n    \"eslint-config-airbnb\": \"^19.0.4\",\n    \"eslint-config-prettier\": \"^8.5.0\",\n    \"eslint-plugin-import\": \"^2.26.0\",\n    \"eslint-plugin-jsx-a11y\": \"^6.6.1\",\n    \"eslint-plugin-prettier\": \"^4.2.1\",\n    \"eslint-plugin-promise\": \"^6.1.1\",\n    \"eslint-plugin-react\": \"^7.31.11\",\n    \"eslint-plugin-react-hooks\": \"^4.6.0\",\n    \"eslint-plugin-unicorn\": \"^45.0.2\",\n    \"fast-glob\": \"3.2.5\",\n    \"filesize\": \"6.1.0\",\n    \"jsdom\": \"27.0.0\",\n    \"lerna\": \"^9.0.0\",\n    \"prettier\": \"^2.8.1\",\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\",\n    \"react-dom\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\",\n    \"timezone-mock\": \"^1.1.0\",\n    \"ts-node\": \"^10.9.1\",\n    \"typescript\": \"^5.7.0\",\n    \"vitest\": \"4\"\n  },\n  \"packageManager\": \"yarn@4.10.3\",\n  \"workspaces\": {\n    \"packages\": [\n      \"./packages/*\"\n    ]\n  },\n  \"resolutions\": {\n    \"react\": \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\",\n    \"@types/react\": \"^19.0.0\",\n    \"@types/react-dom\": \"^19.0.0\"\n  }\n}\n"
  },
  {
    "path": "packages/sizes.json",
    "content": "{\"visx-annotation\":{\"esm\":19643,\"lib\":23755},\"visx-axis\":{\"esm\":13359,\"lib\":18132},\"visx-bounds\":{\"esm\":1493,\"lib\":1915},\"visx-brush\":{\"esm\":41994,\"lib\":44001},\"visx-chord\":{\"esm\":1901,\"lib\":2683},\"visx-clip-path\":{\"esm\":1507,\"lib\":2713},\"visx-curve\":{\"esm\":351,\"lib\":2594},\"visx-delaunay\":{\"esm\":1466,\"lib\":2489},\"visx-demo\":{\"esm\":0,\"lib\":0},\"visx-drag\":{\"esm\":9053,\"lib\":11025},\"visx-event\":{\"esm\":3548,\"lib\":5257},\"visx-geo\":{\"esm\":8057,\"lib\":11674},\"visx-glyph\":{\"esm\":7192,\"lib\":11421},\"visx-gradient\":{\"esm\":6872,\"lib\":11581},\"visx-grid\":{\"esm\":9592,\"lib\":12892},\"visx-group\":{\"esm\":499,\"lib\":1030},\"visx-heatmap\":{\"esm\":3490,\"lib\":4564},\"visx-hierarchy\":{\"esm\":8639,\"lib\":13458},\"visx-legend\":{\"esm\":14799,\"lib\":20754},\"visx-marker\":{\"esm\":3822,\"lib\":6120},\"visx-mock-data\":{\"esm\":325638,\"lib\":330728},\"visx-network\":{\"esm\":3058,\"lib\":5105},\"visx-pattern\":{\"esm\":7349,\"lib\":10317},\"visx-point\":{\"esm\":776,\"lib\":1901},\"visx-react-spring\":{\"esm\":8697,\"lib\":11009},\"visx-responsive\":{\"esm\":9041,\"lib\":11514},\"visx-sankey\":{\"esm\":2498,\"lib\":3894},\"visx-scale\":{\"esm\":18819,\"lib\":30918},\"visx-shape\":{\"esm\":51809,\"lib\":74614},\"visx-stats\":{\"esm\":9249,\"lib\":10690},\"visx-text\":{\"esm\":5953,\"lib\":7453},\"visx-threshold\":{\"esm\":2064,\"lib\":2758},\"visx-tooltip\":{\"esm\":9173,\"lib\":13672},\"visx-vendor\":{\"esm\":2974,\"lib\":3226},\"visx-visx\":{\"esm\":1538,\"lib\":3999},\"visx-voronoi\":{\"esm\":1298,\"lib\":2088},\"visx-wordcloud\":{\"esm\":1987,\"lib\":2995},\"visx-xychart\":{\"esm\":125113,\"lib\":155595},\"visx-zoom\":{\"esm\":12499,\"lib\":14835}}"
  },
  {
    "path": "packages/visx-annotation/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-annotation/Readme.md",
    "content": "# @visx/annotation\n\n<p>\n  <a title=\"@visx/annotation npm downloads\" href=\"https://www.npmjs.com/package/@visx/annotation\">\n    <img src=\"https://img.shields.io/npm/dm/@visx/annotation.svg?style=flat-square\" />\n  </a>\n</p>\n\nSVG `Annotation`s enable you to label points, thresholds, or regions of a visualization to provide\nadditional context to for your chart consumer. This package is heavily inspired by\n[Susie Lu](https://github.com/susielu/)'s\n[`react-annotation`](https://github.com/susielu/react-annotation) library.\n\nEach annotation consists of three (optional) parts:\n\n1. `Subject` (`CircleSubject`, `LineSubject`, more 🔜) – what part of a chart is being annotated\n   (point, line, region)\n\n2. `Label` – the text component for the annotation. Handles SVG text wrapping using `@visx/text`,\n   and supports `title` and `subtitle` customization as well as vertical & horizontal anchors /\n   alignment\n\n3. `Connector` – line connecting a subject and label\n\nThe `Annotation` or `EditableAnnotation` component wrappers allow you to compose these components\nand simplify their individual positioning:\n\n```tsx\n<EditableAnnotation\n  x={subjectX}\n  y={subjectY}\n  dx={labelDx} // x offset of label from subject\n  dy={labelDy} // y offset of label from subject\n  onDragEnd={({ x, y, dx, dy }) => ...}\n>\n  <Connector />\n  <CircleSubject />\n  <Label title=\"Context about this point\" subtitle=\"More deets\">\n</EditableAnnotation>\n```\n\nComponents can also be used in isolation, in which case you must specify exact positions for each\nitem:\n\n```tsx\n() => (\n  <g>\n    <Connector x={subjectX} y={subjectY} dx={labelDx} dy={labelDy} />\n    <CircleSubject x={subjectX} y={subjectY} />\n    <Label x={subjectX + labelDx} y={subjectY + labelDy} title=\"...\">\n  </g>\n)\n```\n\n##### ⚠️ `ResizeObserver` dependency\n\nThe `Label` component relies on `ResizeObserver`s for auto-sizing. If you need a polyfill, you can\neither polute the `window` object or inject it cleanly through props:\n\n```tsx\nimport { ResizeObserver } from 'your-favorite-polyfill';\n\nfunction App() {\n  return <Label resizeObserverPolyfill={ResizeObserver} {...} />\n```\n\n## Installation\n\n```\nnpm install --save @visx/annotation\n```\n"
  },
  {
    "path": "packages/visx-annotation/package.json",
    "content": "{\n  \"name\": \"@visx/annotation\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx annotation\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/drag\": \"workspace:*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/text\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\",\n    \"react-use-measure\": \"^2.0.4\"\n  },\n  \"devDependencies\": {\n    \"@juggle/resize-observer\": \"^3.3.1\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/Annotation.tsx",
    "content": "import { useMemo, type ReactNode } from 'react';\nimport AnnotationContext from '../context/AnnotationContext';\nimport type { AnnotationContextType } from '../types';\n\nexport type AnnotationProps = Pick<AnnotationContextType, 'x' | 'y' | 'dx' | 'dy'> & {\n  /** Annotation children (Subject, Label, Connector) */\n  children: ReactNode;\n};\n\nexport default function Annotation({ x, y, dx, dy, children }: AnnotationProps) {\n  const value = useMemo(() => ({ x, y, dx, dy }), [x, y, dx, dy]);\n  return <AnnotationContext.Provider value={value}>{children}</AnnotationContext.Provider>;\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/CircleSubject.tsx",
    "content": "import { useContext, type SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { AnnotationContextType } from '../types';\nimport AnnotationContext from '../context/AnnotationContext';\n\nexport type CircleSubjectProps = Pick<AnnotationContextType, 'x' | 'y'> & {\n  /** Optional className to apply to CircleSubject in addition to 'visx-annotation-subject'. */\n  className?: string;\n  /** Color of CircleSubject. */\n  stroke?: string;\n  /** Radius of CircleSubject. */\n  radius?: number;\n};\n\nexport default function CircleSubject({\n  className,\n  x: propsX,\n  y: propsY,\n  stroke = '#222',\n  radius = 16,\n  ...restProps\n}: CircleSubjectProps & Omit<SVGProps<SVGCircleElement>, keyof CircleSubjectProps>) {\n  // if props are provided, they take precedence over context\n  const annotationContext = useContext(AnnotationContext);\n\n  return (\n    <circle\n      className={cx('visx-annotation-subject', 'visx-annotation-subject-circle', className)}\n      cx={propsX || annotationContext.x}\n      cy={propsY || annotationContext.y}\n      r={radius}\n      fill=\"transparent\"\n      pointerEvents=\"none\"\n      stroke={stroke}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/Connector.tsx",
    "content": "import { useContext, type SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { AnnotationContextType } from '../types';\nimport AnnotationContext from '../context/AnnotationContext';\n\n// @TODO\n// add end marker support\n\nexport type ConnectorProps = Pick<AnnotationContextType, 'x' | 'y' | 'dx' | 'dy'> & {\n  /** Optional className to apply to container in addition to 'visx-annotation-connector'. */\n  className?: string;\n  /** Connector type. */\n  type?: 'line' | 'elbow';\n  /** Color of the connector line. */\n  stroke?: string;\n  /** Optional additional props. */\n  pathProps?: SVGProps<SVGPathElement>;\n};\n\nexport default function Connector({\n  className,\n  x: propsX,\n  y: propsY,\n  dx: propsDx,\n  dy: propsDy,\n  type = 'elbow',\n  stroke = '#222',\n  pathProps,\n}: ConnectorProps) {\n  // if props are provided, they take precedence over context\n  const annotationContext = useContext(AnnotationContext);\n  const x0 = propsX == null ? annotationContext.x ?? 0 : propsX;\n  const y0 = propsY == null ? annotationContext.y ?? 0 : propsY;\n  const dx = propsDx == null ? annotationContext.dx ?? 0 : propsDx;\n  const dy = propsDy == null ? annotationContext.dy ?? 0 : propsDy;\n  let x1: number = x0; // only used with elbow type\n  let y1: number = y0;\n  const x2 = x0 + dx;\n  const y2 = y0 + dy;\n\n  if (type === 'elbow') {\n    // if dx < dy, find the intesection of y=x or y=-x from subject, with vertical line to label\n    if (Math.abs(dx) <= Math.abs(dy)) {\n      // target line is vertical x = x2\n      x1 = x2;\n      // intersection with y=x line (if dy > 0) or y=x (if dy < 0)\n      const sign = dy > 0 ? 1 : -1;\n      y1 = y0 + sign * Math.abs(x1 - x0);\n    }\n    // if dx > dy, find the intesection of y=x or y=-x from subject, with horizontal line to label\n    else {\n      // target line is horizontal y = y2\n      y1 = y2;\n      // find intersection with y=-x line (if dx > 0) or y=x (if dx < 0)\n      const sign = dx > 0 ? 1 : -1;\n      x1 = x0 + sign * Math.abs(y1 - y0);\n    }\n  }\n\n  return (\n    <path\n      className={cx('visx-annotation-connector', className)}\n      strokeWidth={1}\n      stroke={stroke}\n      fill=\"transparent\"\n      pointerEvents=\"none\"\n      d={`M${x0},${y0}${type === 'elbow' ? `L${x1},${y1}` : ''}L${x2},${y2}`}\n      {...pathProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/EditableAnnotation.tsx",
    "content": "/* eslint-disable react/jsx-handler-names */\nimport { useCallback, useRef } from 'react';\nimport type { SVGProps, ReactNode, MouseEvent, TouchEvent } from 'react';\nimport type { UseDrag, HandlerArgs as DragHandlerArgs } from '@visx/drag';\nimport { useDrag } from '@visx/drag';\nimport type { AnnotationContextType } from '../types';\nimport Annotation from './Annotation';\n\nexport type EditableAnnotationProps = Pick<AnnotationContextType, 'x' | 'y' | 'dx' | 'dy'> & {\n  /** Width of the possible drag canvas (e.g., SVG container). */\n  width: number;\n  /** Height of the possible drag canvas (e.g., SVG container). */\n  height: number;\n  /** Annotation children (Subject, Label, Connector) */\n  children: ReactNode;\n  /** Whether the Label position (dx, dy) is editable. */\n  canEditLabel?: boolean;\n  /** Whether the Subject position (x, y) is editable. */\n  canEditSubject?: boolean;\n  /** Optional circle props to set on the subject drag handle. */\n  subjectDragHandleProps?: SVGProps<SVGCircleElement>;\n  /** Optional circle props to set on the label drag handle. */\n  labelDragHandleProps?: SVGProps<SVGCircleElement>;\n  /** Callback invoked on drag start. */\n  onDragStart?: ({ x, y, dx, dy, event }: HandlerArgs) => void;\n  /** Callback invoked on drag move. */\n  onDragMove?: ({ x, y, dx, dy, event }: HandlerArgs) => void;\n  /** Callback invoked on drag end. */\n  onDragEnd?: ({ x, y, dx, dy, event }: HandlerArgs) => void;\n};\n\nexport type HandlerArgs = {\n  x: number;\n  y: number;\n  dx: number;\n  dy: number;\n  event: MouseEvent | TouchEvent;\n};\n\nconst defaultDragHandleProps = {\n  r: 10,\n  fill: 'transparent',\n  stroke: '#777',\n  strokeDasharray: '4,2',\n  strokeWidth: 2,\n};\n\nexport default function EditableAnnotation({\n  canEditLabel = true,\n  canEditSubject = true,\n  children,\n  dx: labelDx = 0,\n  dy: labelDy = 0,\n  height,\n  labelDragHandleProps,\n  onDragEnd,\n  onDragMove,\n  onDragStart,\n  subjectDragHandleProps,\n  width,\n  x: subjectX = 0,\n  y: subjectY = 0,\n}: EditableAnnotationProps) {\n  // chicken before the egg, we need these to reference drag state\n  // in drag callbacks which are defined before useDrag() state is available\n  const subjectDragRef = useRef<UseDrag | undefined>(undefined);\n  const labelDragRef = useRef<UseDrag | undefined>(undefined);\n\n  const handleDragStart = useCallback(\n    ({ event }: DragHandlerArgs) => {\n      if (onDragStart) {\n        onDragStart({\n          event,\n          x: subjectX + (subjectDragRef.current?.dx ?? 0),\n          y: subjectY + (subjectDragRef.current?.dy ?? 0),\n          dx: labelDx + (labelDragRef.current?.dx ?? 0),\n          dy: labelDy + (labelDragRef.current?.dy ?? 0),\n        });\n      }\n    },\n    [labelDx, labelDy, onDragStart, subjectX, subjectY],\n  );\n\n  const handleDragMove = useCallback(\n    ({ event }: DragHandlerArgs) => {\n      if (onDragMove) {\n        onDragMove({\n          event,\n          x: subjectX + (subjectDragRef.current?.dx ?? 0),\n          y: subjectY + (subjectDragRef.current?.dy ?? 0),\n          dx: labelDx + (labelDragRef.current?.dx ?? 0),\n          dy: labelDy + (labelDragRef.current?.dy ?? 0),\n        });\n      }\n    },\n    [labelDx, labelDy, onDragMove, subjectX, subjectY],\n  );\n\n  const handleDragEnd = useCallback(\n    ({ event }: DragHandlerArgs) => {\n      if (onDragEnd) {\n        onDragEnd({\n          event,\n          x: subjectX + (subjectDragRef.current?.dx ?? 0),\n          y: subjectY + (subjectDragRef.current?.dy ?? 0),\n          dx: labelDx + (labelDragRef.current?.dx ?? 0),\n          dy: labelDy + (labelDragRef.current?.dy ?? 0),\n        });\n      }\n    },\n    [labelDx, labelDy, onDragEnd, subjectX, subjectY],\n  );\n\n  const subjectDrag = useDrag({\n    onDragStart: handleDragStart,\n    onDragMove: handleDragMove,\n    onDragEnd: handleDragEnd,\n    x: subjectX,\n    y: subjectY,\n  });\n\n  const labelDrag = useDrag({\n    onDragStart: handleDragStart,\n    onDragMove: handleDragMove,\n    onDragEnd: handleDragEnd,\n    x: labelDx,\n    y: labelDy,\n  });\n\n  // enable referencing these in the callbacks defined before useDrag is called\n  subjectDragRef.current = subjectDrag;\n  labelDragRef.current = labelDrag;\n\n  return (\n    <>\n      <Annotation\n        x={subjectX + subjectDrag.dx}\n        y={subjectY + subjectDrag.dy}\n        dx={labelDx + labelDrag.dx}\n        dy={labelDy + labelDrag.dy}\n      >\n        {children}\n      </Annotation>\n      {subjectDrag.isDragging && (\n        <rect\n          width={width}\n          height={height}\n          onMouseMove={subjectDrag.dragMove}\n          onMouseUp={subjectDrag.dragEnd}\n          fill=\"transparent\"\n        />\n      )}\n      {canEditSubject && (\n        <circle\n          cx={subjectX}\n          cy={subjectY}\n          transform={`translate(${subjectDrag.dx},${subjectDrag.dy})`}\n          onMouseMove={subjectDrag.dragMove}\n          onMouseUp={subjectDrag.dragEnd}\n          onMouseDown={subjectDrag.dragStart}\n          onTouchStart={subjectDrag.dragStart}\n          onTouchMove={subjectDrag.dragMove}\n          onTouchEnd={subjectDrag.dragEnd}\n          cursor={subjectDrag.isDragging ? 'grabbing' : 'grab'}\n          {...defaultDragHandleProps}\n          {...subjectDragHandleProps}\n        />\n      )}\n      {labelDrag.isDragging && (\n        <rect\n          width={width}\n          height={height}\n          onMouseMove={labelDrag.dragMove}\n          onMouseUp={labelDrag.dragEnd}\n          fill=\"transparent\"\n        />\n      )}\n      {canEditLabel && (\n        <circle\n          cx={subjectX + subjectDrag.dx + labelDx}\n          cy={subjectY + subjectDrag.dy + labelDy}\n          transform={`translate(${labelDrag.dx},${labelDrag.dy})`}\n          onMouseMove={labelDrag.dragMove}\n          onMouseUp={labelDrag.dragEnd}\n          onMouseDown={labelDrag.dragStart}\n          onTouchStart={labelDrag.dragStart}\n          onTouchMove={labelDrag.dragMove}\n          onTouchEnd={labelDrag.dragEnd}\n          cursor={labelDrag.isDragging ? 'grabbing' : 'grab'}\n          {...defaultDragHandleProps}\n          {...labelDragHandleProps}\n        />\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/HtmlLabel.tsx",
    "content": "import { useContext, useMemo } from 'react';\nimport type { ReactNode, CSSProperties } from 'react';\nimport cx from 'classnames';\nimport useMeasure from 'react-use-measure';\nimport { Group } from '@visx/group';\nimport AnnotationContext from '../context/AnnotationContext';\nimport AnchorLine from './LabelAnchorLine';\nimport type { LabelProps } from './Label';\n\nconst wrapperStyle = { display: 'inline-block' };\n\nexport type HtmlLabelProps = Pick<\n  LabelProps,\n  | 'anchorLineStroke'\n  | 'className'\n  | 'horizontalAnchor'\n  | 'resizeObserverPolyfill'\n  | 'showAnchorLine'\n  | 'verticalAnchor'\n  | 'x'\n  | 'y'\n> & {\n  /** Pass in a custom element as the label to style as you like. Renders inside a <foreignObject>, be aware that most non-browser SVG renderers will not render HTML <foreignObject>s. See: https://github.com/airbnb/visx/issues/1173#issuecomment-1014380545.  */\n  children?: ReactNode;\n  /** Optional styles to apply to the HTML container. */\n  containerStyle?: CSSProperties;\n};\nexport default function HtmlLabel({\n  anchorLineStroke = '#222',\n  children,\n  className,\n  containerStyle,\n  horizontalAnchor: propsHorizontalAnchor,\n  resizeObserverPolyfill,\n  showAnchorLine = true,\n  verticalAnchor: propsVerticalAnchor,\n  x: propsX,\n  y: propsY,\n}: HtmlLabelProps) {\n  // we must measure the rendered title + subtitle to compute container height\n  const [labelRef, titleBounds] = useMeasure({\n    polyfill: resizeObserverPolyfill,\n  });\n  const { width, height } = titleBounds;\n\n  // if props are provided, they take precedence over context\n  const { x = 0, y = 0, dx = 0, dy = 0 } = useContext(AnnotationContext);\n\n  // offset container position based on horizontal + vertical anchor\n  const horizontalAnchor =\n    propsHorizontalAnchor || (Math.abs(dx) < Math.abs(dy) ? 'middle' : dx > 0 ? 'start' : 'end');\n  const verticalAnchor =\n    propsVerticalAnchor || (Math.abs(dx) > Math.abs(dy) ? 'middle' : dy > 0 ? 'start' : 'end');\n\n  const containerCoords = useMemo(() => {\n    let adjustedX: number = propsX == null ? x + dx : propsX;\n    let adjustedY: number = propsY == null ? y + dy : propsY;\n\n    if (horizontalAnchor === 'middle') adjustedX -= width / 2;\n    if (horizontalAnchor === 'end') adjustedX -= width;\n    if (verticalAnchor === 'middle') adjustedY -= height / 2;\n    if (verticalAnchor === 'end') adjustedY -= height;\n\n    return { x: adjustedX, y: adjustedY };\n  }, [propsX, x, dx, propsY, y, dy, horizontalAnchor, verticalAnchor, width, height]);\n\n  return (\n    <Group\n      top={containerCoords.y}\n      left={containerCoords.x}\n      pointerEvents=\"none\"\n      className={cx('visx-annotationlabel', className)}\n    >\n      <foreignObject width={width} height={height} overflow=\"visible\">\n        <div\n          ref={labelRef}\n          style={containerStyle ? { ...wrapperStyle, ...containerStyle } : wrapperStyle}\n        >\n          {children}\n        </div>\n      </foreignObject>\n      {showAnchorLine && (\n        <AnchorLine\n          anchorLineOrientation={Math.abs(dx) > Math.abs(dy) ? 'vertical' : 'horizontal'}\n          anchorLineStroke={anchorLineStroke}\n          verticalAnchor={verticalAnchor}\n          horizontalAnchor={horizontalAnchor}\n          width={width}\n          height={height}\n        />\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/Label.tsx",
    "content": "import { useContext, useMemo } from 'react';\nimport type { SVGProps, CSSProperties } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { TextProps } from '@visx/text';\nimport { Text, useText } from '@visx/text';\nimport type { Options as UseMeasureOptions } from 'react-use-measure';\nimport useMeasure from 'react-use-measure';\nimport AnnotationContext from '../context/AnnotationContext';\nimport AnchorLine from './LabelAnchorLine';\n\nexport type LabelProps = {\n  /** Stroke color of anchor line. */\n  anchorLineStroke?: string;\n  /** Background color of label. */\n  backgroundFill?: string;\n  /** Padding of text from background. */\n  backgroundPadding?: number | { top?: number; right?: number; bottom?: number; left?: number };\n  /** Additional props to be passed to background SVGRectElement. */\n  backgroundProps?: SVGProps<SVGRectElement>;\n  /** Optional className to apply to container in addition to 'visx-annotation-label'. */\n  className?: string;\n  /** Color of title and subtitle text. */\n  fontColor?: string;\n  /** Whether the label is horizontally anchored to the start, middle, or end of its x position. */\n  horizontalAnchor?: TextProps['textAnchor'];\n  /** Optionally inject a ResizeObserver polyfill, else this *must* be globally available. */\n  resizeObserverPolyfill?: UseMeasureOptions['polyfill'];\n  /** Whether to render a line indicating label text anchor. */\n  showAnchorLine?: boolean;\n  /** Whether to render a label background. */\n  showBackground?: boolean;\n  /** Optional subtitle. */\n  subtitle?: string;\n  /** Optional title font size. */\n  subtitleFontSize?: TextProps['fontSize'];\n  /** Optional title font weight. */\n  subtitleFontWeight?: TextProps['fontWeight'];\n  /** The vertical offset of the subtitle from the title. */\n  subtitleDy?: number;\n  /** Optional subtitle Text props (to override color, etc.). */\n  subtitleProps?: Partial<TextProps>;\n  /** Optional title. */\n  title?: string;\n  /** Optional title font size. */\n  titleFontSize?: TextProps['fontSize'];\n  /** Optional title font weight. */\n  titleFontWeight?: TextProps['fontWeight'];\n  /** Optional title Text props (to override color, etc.). */\n  titleProps?: Partial<TextProps>;\n  /** Whether the label is vertically anchored to the start, middle, or end of its y position. */\n  verticalAnchor?: TextProps['verticalAnchor'];\n  /** Width of annotation, including background, for text wrapping. */\n  width?: number;\n  /** Max width of annotation, including background, for text wrapping. */\n  maxWidth?: number;\n  /** Left offset of entire AnnotationLabel, if not specified uses x + dx from Annotation. */\n  x?: number;\n  /** Top offset of entire AnnotationLabel, if not specified uses y + dy from Annotation. */\n  y?: number;\n};\n\nconst DEFAULT_PADDING = { top: 12, right: 12, bottom: 12, left: 12 };\n\nfunction getCompletePadding(padding: LabelProps['backgroundPadding']) {\n  if (typeof padding === 'undefined') return DEFAULT_PADDING;\n  if (typeof padding === 'number') {\n    return { top: padding, right: padding, bottom: padding, left: padding };\n  }\n  return { ...DEFAULT_PADDING, ...padding };\n}\n\nexport default function Label({\n  anchorLineStroke = '#222',\n  backgroundFill = '#eaeaea',\n  backgroundPadding,\n  backgroundProps,\n  className,\n  fontColor = '#222',\n  horizontalAnchor: propsHorizontalAnchor,\n  resizeObserverPolyfill,\n  showAnchorLine = true,\n  showBackground = true,\n  subtitle,\n  subtitleDy = 4,\n  subtitleFontSize = 12,\n  subtitleFontWeight = 200,\n  subtitleProps,\n  title,\n  titleFontSize = 16,\n  titleFontWeight = 600,\n  titleProps,\n  verticalAnchor: propsVerticalAnchor,\n  width: propWidth,\n  maxWidth = 125,\n  x: propsX,\n  y: propsY,\n}: LabelProps) {\n  // we must measure the rendered html content to compute container height\n  const [titleRef, titleBounds] = useMeasure({\n    polyfill: resizeObserverPolyfill,\n  });\n  const [subtitleRef, subtitleBounds] = useMeasure({\n    polyfill: resizeObserverPolyfill,\n  });\n\n  const padding = useMemo(() => getCompletePadding(backgroundPadding), [backgroundPadding]);\n\n  // if props are provided, they take precedence over context\n  const { x = 0, y = 0, dx = 0, dy = 0 } = useContext(AnnotationContext);\n  const height = Math.floor(\n    padding.top + padding.bottom + (titleBounds.height ?? 0) + (subtitleBounds.height ?? 0),\n  );\n\n  const { wordsByLines: titleWordsByLine } = useText({\n    children: title,\n    verticalAnchor: 'start',\n    capHeight: titleFontSize,\n    fontSize: titleFontSize,\n    fontWeight: titleFontWeight,\n    fontFamily: titleProps?.fontFamily,\n    width: maxWidth,\n    ...titleProps,\n  });\n\n  const { wordsByLines: subtitleWordsByLine } = useText({\n    children: subtitle,\n    verticalAnchor: 'start',\n    capHeight: subtitleFontSize,\n    fontSize: subtitleFontSize,\n    fontWeight: subtitleFontWeight,\n    fontFamily: subtitleProps?.fontFamily,\n    width: maxWidth,\n    ...subtitleProps,\n  });\n\n  const titleMeasuredWidth = titleWordsByLine.reduce(\n    (maxTitleWidth, line) => Math.max(maxTitleWidth, line.width ?? 0),\n    0,\n  );\n\n  const subtitleMeasuredWidth = subtitleWordsByLine.reduce(\n    (maxSubtitleWidth, line) => Math.max(maxSubtitleWidth, line.width ?? 0),\n    0,\n  );\n\n  const textMeasuredWidth = Math.ceil(\n    Math.min(maxWidth, Math.max(titleMeasuredWidth, subtitleMeasuredWidth)),\n  );\n  const measuredWidth = padding.right + padding.left + textMeasuredWidth;\n  const width = propWidth ?? measuredWidth;\n  const innerWidth = width - padding.left - padding.right;\n\n  // offset container position based on horizontal + vertical anchor\n  const horizontalAnchor =\n    propsHorizontalAnchor || (Math.abs(dx) < Math.abs(dy) ? 'middle' : dx > 0 ? 'start' : 'end');\n  const verticalAnchor =\n    propsVerticalAnchor || (Math.abs(dx) > Math.abs(dy) ? 'middle' : dy > 0 ? 'start' : 'end');\n\n  const containerCoords = useMemo(() => {\n    let adjustedX: number = propsX == null ? x + dx : propsX;\n    let adjustedY: number = propsY == null ? y + dy : propsY;\n\n    if (horizontalAnchor === 'middle') adjustedX -= width / 2;\n    if (horizontalAnchor === 'end') adjustedX -= width;\n    if (verticalAnchor === 'middle') adjustedY -= height / 2;\n    if (verticalAnchor === 'end') adjustedY -= height;\n\n    return { x: adjustedX, y: adjustedY };\n  }, [propsX, x, dx, propsY, y, dy, horizontalAnchor, verticalAnchor, width, height]);\n\n  const titleFontFamily = titleProps?.fontFamily;\n  const titleStyle = useMemo(\n    () => ({\n      fontSize: titleFontSize,\n      fontWeight: titleFontWeight,\n      fontFamily: titleFontFamily,\n    }),\n    [titleFontSize, titleFontWeight, titleFontFamily],\n  ) as CSSProperties;\n\n  const subtitleFontFamily = subtitleProps?.fontFamily;\n  const subtitleStyle = useMemo(\n    () => ({\n      fontSize: subtitleFontSize,\n      fontWeight: subtitleFontWeight,\n      fontFamily: subtitleFontFamily,\n    }),\n    [subtitleFontSize, subtitleFontWeight, subtitleFontFamily],\n  ) as CSSProperties;\n\n  return !title && !subtitle ? null : (\n    <Group\n      top={containerCoords.y}\n      left={containerCoords.x}\n      pointerEvents=\"none\"\n      className={cx('visx-annotationlabel', className)}\n      opacity={titleBounds.height === 0 && subtitleBounds.height === 0 ? 0 : 1}\n    >\n      {showBackground && (\n        <rect\n          className=\"visx-annotationlabel-background\"\n          fill={backgroundFill}\n          x={0}\n          y={0}\n          width={width}\n          height={height}\n          {...backgroundProps}\n        />\n      )}\n      {showAnchorLine && (\n        <AnchorLine\n          anchorLineOrientation={Math.abs(dx) > Math.abs(dy) ? 'vertical' : 'horizontal'}\n          anchorLineStroke={anchorLineStroke}\n          verticalAnchor={verticalAnchor}\n          horizontalAnchor={horizontalAnchor}\n          width={width}\n          height={height}\n        />\n      )}\n      {title && (\n        <Text\n          innerTextRef={titleRef}\n          fill={fontColor}\n          verticalAnchor=\"start\"\n          x={padding.left + (titleProps?.textAnchor === 'middle' ? innerWidth / 2 : 0)}\n          y={padding.top}\n          width={innerWidth}\n          capHeight={titleFontSize} // capHeight should match fontSize, used for first line line height\n          style={titleStyle} // used for size calculation\n          {...titleProps}\n        >\n          {title}\n        </Text>\n      )}\n      {subtitle && (\n        <Text\n          innerTextRef={subtitleRef}\n          fill={fontColor}\n          verticalAnchor=\"start\"\n          x={padding.left + (subtitleProps?.textAnchor === 'middle' ? innerWidth / 2 : 0)}\n          y={padding.top + (titleBounds.height ?? 0)}\n          dy={title ? subtitleDy : 0}\n          width={innerWidth}\n          capHeight={subtitleFontSize} // capHeight should match fontSize, used for first line line height\n          style={subtitleStyle} // used for size calculation\n          {...subtitleProps}\n        >\n          {subtitle}\n        </Text>\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/LabelAnchorLine.tsx",
    "content": "import type { TextProps } from '@visx/text';\n\ninterface AnchorLineProps {\n  anchorLineOrientation: 'horizontal' | 'vertical';\n  verticalAnchor: TextProps['verticalAnchor'];\n  horizontalAnchor: TextProps['textAnchor'];\n  anchorLineStroke: string;\n  width: number;\n  height: number;\n}\n\nexport default function AnchorLine({\n  anchorLineOrientation,\n  anchorLineStroke,\n  verticalAnchor,\n  horizontalAnchor,\n  width,\n  height,\n}: AnchorLineProps) {\n  const backgroundOutline = { stroke: anchorLineStroke, strokeWidth: 2 };\n\n  return (\n    <>\n      {anchorLineOrientation === 'horizontal' && verticalAnchor === 'start' && (\n        <line {...backgroundOutline} x1={0} x2={width} y1={0} y2={0} />\n      )}\n      {anchorLineOrientation === 'horizontal' && verticalAnchor === 'end' && (\n        <line {...backgroundOutline} x1={0} x2={width} y1={height} y2={height} />\n      )}\n      {anchorLineOrientation === 'vertical' && horizontalAnchor === 'start' && (\n        <line {...backgroundOutline} x1={0} x2={0} y1={0} y2={height} />\n      )}\n      {anchorLineOrientation === 'vertical' && horizontalAnchor === 'end' && (\n        <line {...backgroundOutline} x1={width} x2={width} y1={0} y2={height} />\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/components/LineSubject.tsx",
    "content": "import { useContext } from 'react';\nimport type { SVGProps } from 'react';\nimport cx from 'classnames';\nimport AnnotationContext from '../context/AnnotationContext';\n\nexport type LineSubjectProps = {\n  /** Optional className to apply to LineSubject in addition to 'visx-annotation-subject'. */\n  className?: string;\n  /** Color of LineSubject. */\n  stroke?: string;\n  /** strokeWidth of LineSubject. */\n  strokeWidth?: number;\n  /** Orientation of line. */\n  orientation?: 'vertical' | 'horizontal';\n  /** x position of LineSubject (for vertical LineSubjects). */\n  x?: number;\n  /** y position of LineSubject (for horizontal LineSubjects). */\n  y?: number;\n  /** The minimum coordinate of the line. */\n  min: number;\n  /** The maximum coordinate of the line. */\n  max: number;\n};\n\nexport default function LineSubject({\n  className,\n  x: propsX,\n  y: propsY,\n  orientation = 'vertical',\n  min,\n  max,\n  stroke = '#222',\n  ...restProps\n}: LineSubjectProps & Omit<SVGProps<SVGLineElement>, keyof LineSubjectProps>) {\n  // if props are provided, they take precedence over context\n  const annotationContext = useContext(AnnotationContext);\n  const lineIsVertical = orientation === 'vertical';\n\n  return (\n    <line\n      className={cx('visx-annotation-subject', 'visx-annotation-subject-line', className)}\n      x1={lineIsVertical ? propsX || annotationContext.x : min}\n      x2={lineIsVertical ? propsX || annotationContext.x : max}\n      y1={lineIsVertical ? min : propsY || annotationContext.y}\n      y2={lineIsVertical ? max : propsY || annotationContext.y}\n      fill=\"transparent\"\n      pointerEvents=\"none\"\n      stroke={stroke}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-annotation/src/context/AnnotationContext.tsx",
    "content": "import { createContext } from 'react';\nimport type { AnnotationContextType } from '../types';\n\nconst AnnotationContext = createContext<AnnotationContextType>({});\n\nexport default AnnotationContext;\n"
  },
  {
    "path": "packages/visx-annotation/src/index.ts",
    "content": "// @visx/annotation\nexport { default as Connector } from './components/Connector';\nexport { default as Label } from './components/Label';\nexport { default as HtmlLabel } from './components/HtmlLabel';\nexport { default as CircleSubject } from './components/CircleSubject';\nexport { default as LineSubject } from './components/LineSubject';\nexport { default as Annotation } from './components/Annotation';\nexport { default as EditableAnnotation } from './components/EditableAnnotation';\nexport { default as AnnotationContext } from './context/AnnotationContext';\n\nexport type * from './types';\nexport type { AnnotationProps } from './components/Annotation';\nexport type { CircleSubjectProps } from './components/CircleSubject';\nexport type { ConnectorProps } from './components/Connector';\nexport type { EditableAnnotationProps } from './components/EditableAnnotation';\nexport type { HtmlLabelProps } from './components/HtmlLabel';\nexport type { LabelProps } from './components/Label';\nexport type { LineSubjectProps } from './components/LineSubject';\n"
  },
  {
    "path": "packages/visx-annotation/src/types/index.ts",
    "content": "export type AnnotationContextType = {\n  /** x position of the Subject. */\n  x?: number;\n  /** y position of the Subject. */\n  y?: number;\n  /** x delta of the Label from the Subject. */\n  dx?: number;\n  /** y delta of the Label from the Subject. */\n  dy?: number;\n};\n"
  },
  {
    "path": "packages/visx-annotation/test/Annotation.test.tsx",
    "content": "import { render } from '@testing-library/react';\nimport React, { useContext } from 'react';\nimport { Annotation } from '../src';\nimport AnnotationContext from '../src/context/AnnotationContext';\n\ndescribe('<Annotation />', () => {\n  it('should be defined', () => {\n    expect(Annotation).toBeDefined();\n  });\n  it('should provide AnnotationContext', () => {\n    expect.assertions(1);\n    const annotation = { x: -50, y: 100, dx: 1000, dy: 7 };\n    function AnnotationChild() {\n      const annotationContext = useContext(AnnotationContext);\n      expect(annotationContext).toEqual(annotation);\n      return null;\n    }\n\n    render(\n      <Annotation {...annotation}>\n        <AnnotationChild />\n      </Annotation>,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-annotation/test/CircleSubject.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { CircleSubject } from '../src';\n\ndescribe('<CircleSubject />', () => {\n  it('should be defined', () => {\n    expect(CircleSubject).toBeDefined();\n  });\n\n  it('should render a circle', () => {\n    const { container } = render(\n      <svg>\n        <CircleSubject x={10} y={10} />\n      </svg>,\n    );\n\n    const circle = container.querySelector('circle');\n    expect(circle).toBeInTheDocument();\n    expect(circle).toHaveAttribute('cx', '10');\n    expect(circle).toHaveAttribute('cy', '10');\n  });\n});\n"
  },
  {
    "path": "packages/visx-annotation/test/Connector.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Connector } from '../src';\n\ndescribe('<Connector />', () => {\n  it('should be defined', () => {\n    expect(Connector).toBeDefined();\n  });\n\n  it('should render a path', () => {\n    const { container } = render(\n      <svg width={100} height={100}>\n        <Connector />\n      </svg>,\n    );\n    expect(container.querySelector('path')).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-annotation/test/EditableAnnotation.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport EditableAnnotation from '../src/components/EditableAnnotation';\nimport { addMock, removeMock } from './svgMock';\n\ndescribe('<EditableAnnotation />', () => {\n  type EditableAnnotationProps = React.ComponentProps<typeof EditableAnnotation>;\n\n  const defaultProps: EditableAnnotationProps = {\n    width: 100,\n    height: 100,\n    x: 0,\n    y: 0,\n    dx: 0,\n    dy: 0,\n    children: <div data-testid=\"child-content\">Child content</div>,\n  };\n\n  function renderComponent(props?: Partial<EditableAnnotationProps>) {\n    return render(\n      <svg>\n        <EditableAnnotation {...defaultProps} {...props} />\n      </svg>,\n    );\n  }\n\n  beforeEach(() => {\n    vi.clearAllMocks();\n    addMock();\n  });\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(() => renderComponent()).not.toThrow();\n  });\n\n  it('should render two resize handles by default', () => {\n    const { container } = renderComponent();\n    const circles = container.querySelectorAll('circle');\n    expect(circles).toHaveLength(2);\n  });\n\n  it('should render one resize handle if canEditLabel is false', () => {\n    const { container } = renderComponent({ canEditLabel: false });\n    const circles = container.querySelectorAll('circle');\n    expect(circles).toHaveLength(1);\n  });\n\n  it('should render one resize handle if canEditSubject is false', () => {\n    const { container } = renderComponent({ canEditSubject: false });\n    const circles = container.querySelectorAll('circle');\n    expect(circles).toHaveLength(1);\n  });\n\n  it('should render children content', () => {\n    const { getByTestId } = renderComponent();\n    expect(getByTestId('child-content')).toBeInTheDocument();\n  });\n\n  it('should render with correct initial positions', () => {\n    const { container } = renderComponent({\n      x: 10,\n      y: 20,\n      dx: 30,\n      dy: 40,\n    });\n\n    const circles = container.querySelectorAll('circle');\n    const [subjectHandle, labelHandle] = Array.from(circles);\n\n    expect(subjectHandle).toHaveAttribute('cx', '10');\n    expect(subjectHandle).toHaveAttribute('cy', '20');\n    expect(labelHandle).toHaveAttribute('cx', '40'); // x + dx\n    expect(labelHandle).toHaveAttribute('cy', '60'); // y + dy\n  });\n});\n"
  },
  {
    "path": "packages/visx-annotation/test/HtmlLabel.test.tsx",
    "content": "import React from 'react';\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { render } from '@testing-library/react';\n\nimport { HtmlLabel } from '../src';\n\ndescribe('<HtmlLabel />', () => {\n  it('should render HTML content', () => {\n    const { container } = render(\n      <svg>\n        <HtmlLabel resizeObserverPolyfill={ResizeObserver}>\n          <h1>Hello, HTML</h1>\n        </HtmlLabel>\n      </svg>,\n    );\n    const h1Element = container.querySelector('h1');\n    expect(h1Element).not.toBeNull();\n  });\n});\n"
  },
  {
    "path": "packages/visx-annotation/test/Label.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { Label } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\ndescribe('<Label />', () => {\n  const renderLabel = (props: React.ComponentProps<typeof Label>) =>\n    render(\n      <svg>\n        <Label {...props} />\n      </svg>,\n    );\n\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(Label).toBeDefined();\n  });\n\n  it('should render title text', async () => {\n    const { findByText } = renderLabel({\n      title: 'title',\n      resizeObserverPolyfill: ResizeObserver,\n    });\n    expect(await findByText('title')).toBeInTheDocument();\n  });\n\n  it('should render subtitle text', async () => {\n    const { findByText } = renderLabel({\n      title: 'title',\n      subtitle: 'subtitle',\n      resizeObserverPolyfill: ResizeObserver,\n    });\n    expect(await findByText('subtitle')).toBeInTheDocument();\n  });\n\n  it('should render background', () => {\n    const { container } = renderLabel({\n      title: 'title',\n      showBackground: true,\n      resizeObserverPolyfill: ResizeObserver,\n    });\n    const rect = container.querySelector('rect');\n    expect(rect).toBeInTheDocument();\n  });\n\n  it('should render anchor line', () => {\n    const { container } = renderLabel({\n      title: 'title',\n      showAnchorLine: true,\n      resizeObserverPolyfill: ResizeObserver,\n    });\n    const line = container.querySelector('line');\n    expect(line).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-annotation/test/LineSubject.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { LineSubject } from '../src';\n\ndescribe('<LineSubject />', () => {\n  it('should be defined', () => {\n    expect(LineSubject).toBeDefined();\n  });\n\n  it('should render a line', () => {\n    const { container } = render(\n      <svg width={100} height={100}>\n        <LineSubject min={0} max={100} x={50} y={50} />\n      </svg>,\n    );\n    const lineElement = container.querySelector('line');\n    expect(lineElement).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-annotation/test/svgMock.ts",
    "content": "// @ts-expect-error\nlet originalFn: typeof SVGElement.prototype.getComputedTextLength;\n\n/**\n * JSDom does not implement getComputedTextLength()\n * so this function add mock implementation for testing.\n */\nexport function addMock() {\n  // @ts-expect-error\n  originalFn = SVGElement.prototype.getComputedTextLength;\n\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = function getComputedTextLength() {\n    // Make every character 10px wide\n    return (this.textContent?.length ?? 0) * 10;\n  };\n}\n\n/**\n * Remove mock from addMock()\n */\nexport function removeMock() {\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = originalFn;\n}\n"
  },
  {
    "path": "packages/visx-annotation/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-annotation/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-drag\"\n    },\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-text\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-annotation/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/annotation',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-annotation/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/annotation': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-axis/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-axis/Readme.md",
    "content": "# @visx/axis\n\n<p>\n  <a title=\"@visx/axis npm downloads\" href=\"https://www.npmjs.com/package/@visx/axis\">\n    <img src=\"https://img.shields.io/npm/dm/@visx/axis.svg?style=flat-square\" />\n  </a>\n</p>\n\nAn axis component consists of a line with ticks, tick labels, and an axis label that helps viewers\ninterpret your graph.\n\nYou can use one of the 4 pre-made axes, or you can create your own based on the `<Axis />` element.\nNote that the `@visx/react-spring` package exports an `AnimatedAxis` variant with animated ticks.\n\n## Installation\n\n```\nnpm install --save @visx/axis\n```\n"
  },
  {
    "path": "packages/visx-axis/package.json",
    "content": "{\n  \"name\": \"@visx/axis\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx axis\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/point\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"@visx/text\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-axis/src/axis/Axis.tsx",
    "content": "import cx from 'classnames';\nimport { Group } from '@visx/group';\nimport { getTicks, coerceNumber } from '@visx/scale';\nimport type { SharedAxisProps, AxisScale } from '../types';\nimport AxisRenderer from './AxisRenderer';\nimport getTickPosition from '../utils/getTickPosition';\nimport getTickFormatter from '../utils/getTickFormatter';\nimport createPoint from '../utils/createPoint';\nimport type { OrientationType } from '../constants/orientation';\nimport Orientation from '../constants/orientation';\nimport getAxisRangePaddingConfig from '../utils/getAxisRangePaddingConfig';\n\nexport type AxisProps<Scale extends AxisScale> = SharedAxisProps<Scale> & {\n  orientation?: OrientationType;\n};\n\nexport default function Axis<Scale extends AxisScale>({\n  children = AxisRenderer,\n  axisClassName,\n  hideAxisLine = false,\n  hideTicks = false,\n  hideZero = false,\n  innerRef,\n  left = 0,\n  numTicks = 10,\n  orientation = Orientation.bottom,\n  rangePadding = 0,\n  scale,\n  tickFormat,\n  tickLength = 8,\n  tickValues,\n  top = 0,\n  ...restProps\n}: AxisProps<Scale>) {\n  const format = tickFormat ?? getTickFormatter(scale);\n\n  const isLeft = orientation === Orientation.left;\n  const isTop = orientation === Orientation.top;\n  const horizontal = isTop || orientation === Orientation.bottom;\n\n  const tickPosition = getTickPosition(scale);\n  const tickSign = isLeft || isTop ? -1 : 1;\n\n  const range = scale.range();\n  const rangePaddingConfig = getAxisRangePaddingConfig(rangePadding);\n\n  const axisFromPoint = createPoint(\n    { x: Number(range[0]) + 0.5 - rangePaddingConfig.start, y: 0 },\n    horizontal,\n  );\n  const axisToPoint = createPoint(\n    { x: Number(range[range.length - 1]) + 0.5 + rangePaddingConfig.end, y: 0 },\n    horizontal,\n  );\n\n  const filteredTickValues = (tickValues ?? getTicks(scale, numTicks))\n    .filter((value) => !hideZero || (value !== 0 && value !== '0'))\n    .map((value, index) => ({ value, index }));\n\n  const ticks = filteredTickValues.map(({ value, index }) => {\n    const scaledValue = coerceNumber(tickPosition(value));\n\n    return {\n      value,\n      index,\n      from: createPoint({ x: scaledValue, y: 0 }, horizontal),\n      to: createPoint({ x: scaledValue, y: tickLength * tickSign }, horizontal),\n      formattedValue: format(value, index, filteredTickValues),\n    };\n  });\n\n  return (\n    <Group className={cx('visx-axis', axisClassName)} innerRef={innerRef} top={top} left={left}>\n      {children({\n        ...restProps,\n        axisFromPoint,\n        axisToPoint,\n        hideAxisLine,\n        hideTicks,\n        hideZero,\n        horizontal,\n        numTicks,\n        orientation,\n        rangePadding,\n        scale,\n        tickFormat: format,\n        tickLength,\n        tickPosition,\n        tickSign,\n        ticks,\n      })}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-axis/src/axis/AxisBottom.tsx",
    "content": "import cx from 'classnames';\nimport Axis from './Axis';\nimport Orientation from '../constants/orientation';\nimport type { SharedAxisProps, AxisScale } from '../types';\n\nexport const bottomTickLabelProps = {\n  dy: '0.25em',\n  fill: '#222',\n  fontFamily: 'Arial',\n  fontSize: 10,\n  textAnchor: 'middle',\n} as const;\n\nexport default function AxisBottom<Scale extends AxisScale>({\n  axisClassName,\n  labelOffset = 8,\n  tickLength = 8,\n  tickLabelProps,\n  ...restProps\n}: SharedAxisProps<Scale>) {\n  const tickLabelPropsFinal =\n    typeof tickLabelProps === 'function'\n      ? tickLabelProps\n      : {\n          ...bottomTickLabelProps,\n          ...tickLabelProps,\n        };\n\n  return (\n    <Axis\n      axisClassName={cx('visx-axis-bottom', axisClassName)}\n      labelOffset={labelOffset}\n      orientation={Orientation.bottom}\n      tickLabelProps={tickLabelPropsFinal}\n      tickLength={tickLength}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-axis/src/axis/AxisLeft.tsx",
    "content": "import cx from 'classnames';\nimport Axis from './Axis';\nimport Orientation from '../constants/orientation';\nimport type { SharedAxisProps, AxisScale } from '../types';\n\nexport const leftTickLabelProps = {\n  dx: '-0.25em',\n  dy: '0.25em',\n  fill: '#222',\n  fontFamily: 'Arial',\n  fontSize: 10,\n  textAnchor: 'end',\n} as const;\n\nexport default function AxisLeft<Scale extends AxisScale>({\n  axisClassName,\n  labelOffset = 36,\n  tickLength = 8,\n  tickLabelProps,\n  ...restProps\n}: SharedAxisProps<Scale>) {\n  const tickLabelPropsFinal =\n    typeof tickLabelProps === 'function'\n      ? tickLabelProps\n      : {\n          ...leftTickLabelProps,\n          ...tickLabelProps,\n        };\n  return (\n    <Axis\n      axisClassName={cx('visx-axis-left', axisClassName)}\n      labelOffset={labelOffset}\n      orientation={Orientation.left}\n      tickLabelProps={tickLabelPropsFinal}\n      tickLength={tickLength}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-axis/src/axis/AxisRenderer.tsx",
    "content": "import cx from 'classnames';\nimport { Line } from '@visx/shape';\nimport { Text } from '@visx/text';\n\nimport type { TextProps } from '@visx/text';\nimport getLabelTransform from '../utils/getLabelTransform';\nimport Orientation from '../constants/orientation';\nimport type { AxisRendererProps, AxisScale } from '../types';\nimport Ticks from './Ticks';\n\nconst defaultTextProps: Partial<TextProps> = {\n  textAnchor: 'middle',\n  fontFamily: 'Arial',\n  fontSize: 10,\n  fill: '#222',\n};\n\nexport default function AxisRenderer<Scale extends AxisScale>({\n  axisFromPoint,\n  axisLineClassName,\n  axisToPoint,\n  hideAxisLine,\n  hideTicks,\n  horizontal,\n  label = '',\n  labelClassName,\n  labelOffset = 14,\n  labelProps,\n  orientation = Orientation.bottom,\n  scale,\n  stroke = '#222',\n  strokeDasharray,\n  strokeWidth = 1,\n  tickClassName,\n  tickComponent,\n  tickLineProps,\n  tickLabelProps,\n  tickLength = 8,\n  tickStroke = '#222',\n  tickTransform,\n  ticks,\n  ticksComponent = Ticks,\n}: AxisRendererProps<Scale>) {\n  const combinedLabelProps = {\n    ...defaultTextProps,\n    ...labelProps,\n  };\n  const tickLabelPropsDefault = {\n    ...defaultTextProps,\n    ...(typeof tickLabelProps === 'object' ? tickLabelProps : null),\n  };\n  // compute the max tick label size to compute label offset\n  const allTickLabelProps = ticks.map(({ value, index }) =>\n    typeof tickLabelProps === 'function'\n      ? tickLabelProps(value, index, ticks)\n      : tickLabelPropsDefault,\n  );\n  const maxTickLabelFontSize = Math.max(\n    10,\n    ...allTickLabelProps.map((props) => (typeof props.fontSize === 'number' ? props.fontSize : 0)),\n  );\n  return (\n    <>\n      {ticksComponent({\n        hideTicks,\n        horizontal,\n        orientation,\n        scale,\n        tickClassName,\n        tickComponent,\n        tickLabelProps: allTickLabelProps,\n        tickStroke,\n        tickTransform,\n        ticks,\n        strokeWidth,\n        tickLineProps,\n      })}\n\n      {!hideAxisLine && (\n        <Line\n          className={cx('visx-axis-line', axisLineClassName)}\n          from={axisFromPoint}\n          to={axisToPoint}\n          stroke={stroke}\n          strokeWidth={strokeWidth}\n          strokeDasharray={strokeDasharray}\n        />\n      )}\n\n      {label && (\n        <Text\n          className={cx('visx-axis-label', labelClassName)}\n          {...getLabelTransform({\n            labelOffset,\n            labelProps: combinedLabelProps,\n            orientation,\n            range: scale.range(),\n            tickLabelFontSize: maxTickLabelFontSize,\n            tickLength,\n          })}\n          {...combinedLabelProps}\n        >\n          {label}\n        </Text>\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-axis/src/axis/AxisRight.tsx",
    "content": "import cx from 'classnames';\nimport Axis from './Axis';\nimport Orientation from '../constants/orientation';\nimport type { SharedAxisProps, AxisScale } from '../types';\n\nexport type AxisRightProps<Scale extends AxisScale> = SharedAxisProps<Scale>;\n\nexport const rightTickLabelProps = {\n  dx: '0.25em',\n  dy: '0.25em',\n  fill: '#222',\n  fontFamily: 'Arial',\n  fontSize: 10,\n  textAnchor: 'start',\n} as const;\n\nexport default function AxisRight<Scale extends AxisScale>({\n  axisClassName,\n  labelOffset = 36,\n  tickLength = 8,\n  tickLabelProps,\n  ...restProps\n}: AxisRightProps<Scale>) {\n  const tickLabelPropsFinal =\n    typeof tickLabelProps === 'function'\n      ? tickLabelProps\n      : {\n          ...rightTickLabelProps,\n          ...tickLabelProps,\n        };\n  return (\n    <Axis\n      axisClassName={cx('visx-axis-right', axisClassName)}\n      labelOffset={labelOffset}\n      orientation={Orientation.right}\n      tickLabelProps={tickLabelPropsFinal}\n      tickLength={tickLength}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-axis/src/axis/AxisTop.tsx",
    "content": "import cx from 'classnames';\nimport Axis from './Axis';\nimport Orientation from '../constants/orientation';\nimport type { SharedAxisProps, AxisScale } from '../types';\n\nexport type AxisTopProps<Scale extends AxisScale> = SharedAxisProps<Scale>;\n\nexport const topTickLabelProps = {\n  dy: '-0.75em',\n  fill: '#222',\n  fontFamily: 'Arial',\n  fontSize: 10,\n  textAnchor: 'middle',\n} as const;\n\nexport default function AxisTop<Scale extends AxisScale>({\n  axisClassName,\n  labelOffset = 8,\n  tickLength = 8,\n  tickLabelProps,\n  ...restProps\n}: AxisTopProps<Scale>) {\n  const tickLabelPropsFinal =\n    typeof tickLabelProps === 'function'\n      ? tickLabelProps\n      : {\n          ...topTickLabelProps,\n          ...tickLabelProps,\n        };\n  return (\n    <Axis\n      axisClassName={cx('visx-axis-top', axisClassName)}\n      labelOffset={labelOffset}\n      orientation={Orientation.top}\n      tickLabelProps={tickLabelPropsFinal}\n      tickLength={tickLength}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-axis/src/axis/Ticks.tsx",
    "content": "import cx from 'classnames';\nimport { Line } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { Text } from '@visx/text';\n\nimport Orientation from '../constants/orientation';\nimport type { TicksRendererProps, AxisScale } from '../types';\n\nexport default function Ticks<Scale extends AxisScale>({\n  hideTicks,\n  horizontal,\n  orientation,\n  tickClassName,\n  tickComponent,\n  tickLabelProps: allTickLabelProps,\n  tickStroke = '#222',\n  tickTransform,\n  ticks,\n  strokeWidth,\n  tickLineProps,\n}: TicksRendererProps<Scale>) {\n  return ticks.map(({ value, index, from, to, formattedValue }) => {\n    const tickLabelProps = allTickLabelProps[index] ?? {};\n    const tickLabelFontSize = Math.max(\n      10,\n      (typeof tickLabelProps.fontSize === 'number' && tickLabelProps.fontSize) || 0,\n    );\n\n    const tickYCoord =\n      to.y + (horizontal && orientation !== Orientation.top ? tickLabelFontSize : 0);\n\n    return (\n      <Group\n        key={`visx-tick-${value}-${index}`}\n        className={cx('visx-axis-tick', tickClassName)}\n        transform={tickTransform}\n      >\n        {!hideTicks && (\n          <Line\n            from={from}\n            to={to}\n            stroke={tickStroke}\n            strokeWidth={strokeWidth}\n            strokeLinecap=\"square\"\n            {...tickLineProps}\n          />\n        )}\n        {tickComponent ? (\n          tickComponent({\n            ...tickLabelProps,\n            x: to.x,\n            y: tickYCoord,\n            formattedValue,\n          })\n        ) : (\n          <Text x={to.x} y={tickYCoord} {...tickLabelProps}>\n            {formattedValue}\n          </Text>\n        )}\n      </Group>\n    );\n  });\n}\n"
  },
  {
    "path": "packages/visx-axis/src/constants/orientation.ts",
    "content": "import type { ValueOf } from '@visx/scale';\n\nconst Orientation = {\n  top: 'top',\n  left: 'left',\n  right: 'right',\n  bottom: 'bottom',\n} as const;\n\nexport type OrientationType = ValueOf<typeof Orientation>;\n\nexport default Orientation;\n"
  },
  {
    "path": "packages/visx-axis/src/index.ts",
    "content": "// @visx/axis\nexport { default as Axis } from './axis/Axis';\nexport type { AxisProps } from './axis/Axis';\nexport { default as AxisLeft } from './axis/AxisLeft';\nexport { default as AxisRight } from './axis/AxisRight';\nexport { default as AxisTop } from './axis/AxisTop';\nexport { default as AxisBottom } from './axis/AxisBottom';\nexport { default as Orientation } from './constants/orientation';\n\nexport type * from './types';\n"
  },
  {
    "path": "packages/visx-axis/src/types.ts",
    "content": "import type { D3Scale, NumberLike, ScaleInput, ValueOf } from '@visx/scale';\nimport type { TextProps } from '@visx/text';\nimport type { ReactNode, Ref, SVGProps } from 'react';\nimport type Orientation from './constants/orientation';\n\n// In order to plot values on an axis, output of the scale must be number.\n// Some scales return undefined.\nexport type AxisScaleOutput = number | NumberLike | undefined;\n\n/** A catch-all type for scales that are compatible with axis */\nexport type AxisScale<Output extends AxisScaleOutput = AxisScaleOutput> =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  D3Scale<Output, any, any>;\ntype LineProps = Omit<SVGProps<SVGLineElement>, 'to' | 'from' | 'ref'>;\n\ntype FormattedValue = string | undefined;\n\nexport type TickFormatter<T> = (\n  value: T,\n  index: number,\n  values: { value: T; index: number }[],\n) => FormattedValue;\n\nexport type TickLabelProps<T> =\n  | Partial<TextProps>\n  | ((value: T, index: number, values: { value: T; index: number }[]) => Partial<TextProps>);\n\nexport type TickRendererProps = Partial<TextProps> & {\n  x: number;\n  y: number;\n  formattedValue: FormattedValue;\n};\n\nexport type TicksRendererProps<Scale extends AxisScale> = {\n  tickLabelProps: Partial<TextProps>[];\n} & Pick<\n  AxisRendererProps<Scale>,\n  | 'hideTicks'\n  | 'horizontal'\n  | 'orientation'\n  | 'scale'\n  | 'tickClassName'\n  | 'tickComponent'\n  | 'tickStroke'\n  | 'tickTransform'\n  | 'ticks'\n  | 'strokeWidth'\n  | 'tickLineProps'\n>;\n\nexport type CommonProps<Scale extends AxisScale> = {\n  /** The class name applied to the axis line element. */\n  axisLineClassName?: string;\n  /**  If true, will hide the axis line. */\n  hideAxisLine?: boolean;\n  /** If true, will hide the ticks (but not the tick labels). */\n  hideTicks?: boolean;\n  /** If true, will hide the '0' value tick and tick label. */\n  hideZero?: boolean;\n  /** The text for the axis label. */\n  label?: string;\n  /** The class name applied to the axis label text element. */\n  labelClassName?: string;\n  /** Pixel offset of the axis label (does not include tick label font size, which is accounted for automatically)  */\n  labelOffset?: number;\n  /** Props applied to the axis label component. */\n  labelProps?: Partial<TextProps>;\n  /** The number of ticks wanted for the axis (note this is approximate)  */\n  numTicks?: number;\n  /** Placement of the axis */\n  orientation?: ValueOf<typeof Orientation>;\n  /** Pixel padding to apply to axis sides. */\n  rangePadding?: number | { start?: number; end?: number };\n  /** The color for the stroke of the lines. */\n  stroke?: string;\n  /** The pixel value for the width of the lines. */\n  strokeWidth?: number | string;\n  /** The pattern of dashes in the stroke. */\n  strokeDasharray?: string;\n  /** Props to be applied to individual tick lines. */\n  tickLineProps?: LineProps;\n  /** The class name applied to each tick group. */\n  tickClassName?: string;\n  /** Override the component used to render tick labels (instead of <Text /> from @visx/text). */\n  tickComponent?: (tickRendererProps: TickRendererProps) => ReactNode;\n  /** Override the component used to render all tick lines and labels. */\n  ticksComponent?: (tickRendererProps: TicksRendererProps<Scale>) => ReactNode;\n  /** A [d3 formatter](https://github.com/d3/d3-scale/blob/master/README.md#continuous_tickFormat) for the tick text. */\n  tickFormat?: TickFormatter<ScaleInput<Scale>>;\n  /** Either an object with the props for all tick labels or a function that returns props for a given tick label. */\n  tickLabelProps?: TickLabelProps<ScaleInput<Scale>>;\n  /** The length of the tick lines. */\n  tickLength?: number;\n  /** The color for the tick's stroke value. */\n  tickStroke?: string;\n  /** A custom SVG transform value to be applied to each tick group. */\n  tickTransform?: string;\n};\n\ninterface Point {\n  x: number;\n  y: number;\n}\n\nexport type ComputedTick<Scale extends AxisScale> = {\n  value: ScaleInput<Scale>;\n  index: number;\n  from: Point;\n  to: Point;\n  formattedValue: FormattedValue;\n};\n\nexport type AxisRendererProps<Scale extends AxisScale> = CommonProps<Scale> & {\n  /** Start point of the axis line */\n  axisFromPoint: Point;\n  /** End point of the axis line */\n  axisToPoint: Point;\n  /** Whether this axis is horizontal */\n  horizontal: boolean;\n  /** A [d3](https://github.com/d3/d3-scale) or [visx](https://github.com/airbnb/visx/tree/master/packages/visx-scale) scale function. */\n  scale: Scale;\n  /** Function to compute tick position along the axis from tick value */\n  tickPosition: (value: ScaleInput<Scale>) => AxisScaleOutput;\n  /** Axis coordinate sign, -1 for left or top orientation. */\n  tickSign: 1 | -1;\n  /** Computed ticks with positions and formatted value */\n  ticks: ComputedTick<Scale>[];\n};\n\nexport type SharedAxisProps<Scale extends AxisScale> = CommonProps<Scale> & {\n  /** The class name applied to the outermost axis group element. */\n  axisClassName?: string;\n  /** A left pixel offset applied to the entire axis. */\n  left?: number;\n  /** The ref to the outermost axis group element. */\n  innerRef?: Ref<SVGGElement>;\n  /** A [d3](https://github.com/d3/d3-scale) or [visx](https://github.com/airbnb/visx/tree/master/packages/visx-scale) scale function. */\n  scale: Scale;\n  /** An array of values that determine the number and values of the ticks. Falls back to `scale.ticks()` or `.domain()`. */\n  tickValues?: ScaleInput<Scale>[];\n  /** A top pixel offset applied to the entire axis. */\n  top?: number;\n  /** For more control over rendering or to add event handlers to datum, pass a function as children. */\n  children?: (renderProps: AxisRendererProps<Scale>) => ReactNode;\n};\n"
  },
  {
    "path": "packages/visx-axis/src/utils/createPoint.ts",
    "content": "import { Point } from '@visx/point';\n\nexport default function createPoint({ x, y }: Partial<Point>, horizontal: boolean) {\n  return new Point(horizontal ? { x, y } : { x: y, y: x });\n}\n"
  },
  {
    "path": "packages/visx-axis/src/utils/getAxisRangePaddingConfig.ts",
    "content": "import type { SharedAxisProps } from '../types';\n\nexport const defaultAxisRangePadding = 0;\n\nexport default function getAxisRangePaddingConfig(\n  originalRangePadding: SharedAxisProps<never>['rangePadding'] = defaultAxisRangePadding,\n) {\n  return typeof originalRangePadding === 'number'\n    ? { start: originalRangePadding, end: originalRangePadding }\n    : { start: defaultAxisRangePadding, end: defaultAxisRangePadding, ...originalRangePadding };\n}\n"
  },
  {
    "path": "packages/visx-axis/src/utils/getLabelTransform.ts",
    "content": "import type { TextProps } from '@visx/text';\nimport type { OrientationType } from '../constants/orientation';\nimport Orientation from '../constants/orientation';\nimport type { AxisScaleOutput } from '../types';\n\nexport interface TransformArgs {\n  labelOffset: number;\n  labelProps: Partial<TextProps>;\n  orientation: OrientationType;\n  range: AxisScaleOutput[];\n  tickLabelFontSize: number;\n  tickLength: number;\n}\n\nexport default function getLabelTransform({\n  labelOffset,\n  labelProps,\n  orientation,\n  range,\n  tickLabelFontSize,\n  tickLength,\n}: TransformArgs) {\n  const sign = orientation === Orientation.left || orientation === Orientation.top ? -1 : 1;\n\n  let x;\n  let y;\n  let transform;\n\n  if (orientation === Orientation.top || orientation === Orientation.bottom) {\n    const yBottomOffset =\n      orientation === Orientation.bottom && typeof labelProps.fontSize === 'number'\n        ? labelProps.fontSize\n        : 0;\n\n    x = (Number(range[0]) + Number(range[range.length - 1])) / 2;\n    y = sign * (tickLength + labelOffset + tickLabelFontSize + yBottomOffset);\n  } else {\n    x = sign * ((Number(range[0]) + Number(range[range.length - 1])) / 2);\n    y = -(tickLength + labelOffset);\n    transform = `rotate(${sign * 90})`;\n  }\n\n  return { x, y, transform };\n}\n"
  },
  {
    "path": "packages/visx-axis/src/utils/getTickFormatter.ts",
    "content": "import type { ScaleInput } from '@visx/scale';\nimport { toString } from '@visx/scale';\nimport type { TickFormatter, AxisScale } from '../types';\n\n/**\n * Returns a tick position for the given tick value\n */\nexport default function getTickFormatter<Scale extends AxisScale>(scale: Scale) {\n  // Broaden type before using 'xxx' in s as typeguard.\n  const s = scale as AxisScale;\n\n  // For point or band scales,\n  // have to add offset to make the tick centered.\n  if ('tickFormat' in s) {\n    return s.tickFormat() as TickFormatter<ScaleInput<Scale>>;\n  }\n\n  return toString as TickFormatter<ScaleInput<Scale>>;\n}\n"
  },
  {
    "path": "packages/visx-axis/src/utils/getTickPosition.ts",
    "content": "import type { ScaleInput } from '@visx/scale';\nimport type { AxisScale, AxisScaleOutput } from '../types';\n\n/**\n * Create a function that returns a tick position for the given tick value\n */\nexport default function getTickPosition<Scale extends AxisScale>(\n  scale: Scale,\n  align: 'start' | 'center' | 'end' = 'center',\n) {\n  // Broaden type before using 'xxx' in s as typeguard.\n  const s = scale as AxisScale;\n\n  // For point or band scales,\n  // have to add offset to make the tick at center or end.\n  if (align !== 'start' && 'bandwidth' in s) {\n    let offset = s.bandwidth();\n    if (align === 'center') offset /= 2;\n    if (s.round()) offset = Math.round(offset);\n    return (d: ScaleInput<Scale>) => {\n      const scaledValue = s(d);\n\n      return typeof scaledValue === 'number' ? scaledValue + offset : scaledValue;\n    };\n  }\n\n  return scale as (d: ScaleInput<Scale>) => AxisScaleOutput;\n}\n"
  },
  {
    "path": "packages/visx-axis/test/Axis.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { scaleBand, scaleLinear } from '@visx/scale';\nimport { Axis } from '../src';\nimport type { AxisRendererProps } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\nconst axisProps = {\n  orientation: 'left' as const,\n  scale: scaleLinear({\n    range: [10, 0],\n    round: true,\n    domain: [0, 10],\n  }),\n  label: 'test axis',\n};\n\ndescribe('<Axis />', () => {\n  beforeEach(() => {\n    vi.clearAllMocks();\n    addMock();\n  });\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(Axis).toBeDefined();\n  });\n\n  it('should render with class .visx-axis', () => {\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} />\n      </svg>,\n    );\n    const axis = container.querySelector('.visx-axis');\n    expect(axis).toBeInTheDocument();\n  });\n\n  it('should call children function with required args', () => {\n    // eslint-disable-next-line\n    const mockFn = vi.fn(({ }) => null);\n    render(\n      <svg>\n        <Axis {...axisProps}>{mockFn}</Axis>\n      </svg>,\n    );\n\n    const args = mockFn.mock.calls[0][0] as AxisRendererProps<typeof axisProps.scale>;\n    expect(args.axisFromPoint).toBeDefined();\n    expect(args.axisToPoint).toBeDefined();\n    expect(args.horizontal).toBeDefined();\n    expect(args.tickSign).toBeDefined();\n    expect(args.numTicks).toBeDefined();\n    expect(args.label).toBeDefined();\n    expect(args.rangePadding).toBeDefined();\n    expect(args.tickLength).toBeDefined();\n    expect(args.tickFormat).toBeDefined();\n    expect(args.tickPosition).toBeDefined();\n    expect(args.ticks).toBeDefined();\n    expect(Object.keys(args.ticks[0])).toEqual(['value', 'index', 'from', 'to', 'formattedValue']);\n  });\n\n  it('should set user-specified class names', () => {\n    const { container } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          axisClassName=\"axis-test-class\"\n          axisLineClassName=\"axisline-test-class\"\n          labelClassName=\"label-test-class\"\n          tickClassName=\"tick-test-class\"\n        />\n      </svg>,\n    );\n\n    expect(container.querySelector('.visx-axis.axis-test-class')).toBeInTheDocument();\n    expect(container.querySelector('.visx-axis-line.axisline-test-class')).toBeInTheDocument();\n    expect(container.querySelector('.visx-axis-label.label-test-class')).toBeInTheDocument();\n    expect(container.querySelector('.visx-axis-tick.tick-test-class')).toBeInTheDocument();\n  });\n\n  it('should pass the output of tickLabelProps to tick labels', () => {\n    const tickProps = { fontSize: 50, fill: 'magenta' };\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} tickLabelProps={() => tickProps} />\n      </svg>,\n    );\n\n    const tickLabels = container.querySelectorAll('text');\n    expect(tickLabels.length).toBeGreaterThan(0);\n    expect(tickLabels[0]).toHaveAttribute('font-size', '50');\n    expect(tickLabels[0]).toHaveAttribute('fill', 'magenta');\n  });\n\n  it('should call the tickLabelProps func with correct signature', () => {\n    // eslint-disable-next-line\n    const tickLabelPropsSpy = vi.fn(({ }, { }, { }) => ({}));\n    render(\n      <svg>\n        <Axis {...axisProps} tickLabelProps={tickLabelPropsSpy} />\n      </svg>,\n    );\n\n    const firstCall = tickLabelPropsSpy.mock.calls[0];\n    expect(typeof firstCall[0]).toBe('number');\n    expect(typeof firstCall[1]).toBe('number');\n    expect(Array.isArray(firstCall[2])).toBe(true);\n  });\n\n  it('should pass labelProps to the axis label', () => {\n    const labelProps = { fontSize: 50, fill: 'magenta' };\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} labelProps={labelProps} />\n      </svg>,\n    );\n\n    const label = container.querySelector('.visx-axis-label');\n    expect(label).toHaveAttribute('font-size', '50');\n    expect(label).toHaveAttribute('fill', 'magenta');\n  });\n\n  it('should handle hideZero prop correctly', () => {\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} hideZero={false} />\n      </svg>,\n    );\n\n    const { container: hiddenContainer } = render(\n      <svg>\n        <Axis {...axisProps} hideZero />\n      </svg>,\n    );\n\n    const allLines = container.querySelectorAll('.visx-axis-tick line');\n    const hiddenZero = hiddenContainer.querySelectorAll('.visx-axis-tick line');\n\n    expect(hiddenZero.length).toBeGreaterThan(0);\n    expect(allLines).toHaveLength(hiddenZero.length + 1);\n  });\n\n  it('should handle axis line visibility', () => {\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} hideAxisLine={false} />\n      </svg>,\n    );\n    expect(container.querySelector('.visx-axis-line')).toBeInTheDocument();\n\n    const { container: hiddenContainer } = render(\n      <svg>\n        <Axis {...axisProps} hideAxisLine />\n      </svg>,\n    );\n    expect(hiddenContainer.querySelector('.visx-axis-line')).not.toBeInTheDocument();\n  });\n\n  it('should handle ticks visibility', () => {\n    const { container: visible } = render(\n      <svg>\n        <Axis {...axisProps} hideTicks={false} />\n      </svg>,\n    );\n    expect(visible.querySelectorAll('.visx-axis-tick line').length).toBeGreaterThan(0);\n\n    const { container: hidden } = render(\n      <svg>\n        <Axis {...axisProps} hideTicks />\n      </svg>,\n    );\n    const ticks = hidden.querySelectorAll('.visx-axis-tick line');\n    expect(ticks).toHaveLength(0);\n  });\n\n  it('should render specified tick values', () => {\n    const { container: empty } = render(\n      <svg>\n        <Axis {...axisProps} tickValues={[]} />\n      </svg>,\n    );\n    expect(empty.querySelectorAll('.visx-axis-tick')).toHaveLength(0);\n\n    const { container: single } = render(\n      <svg>\n        <Axis {...axisProps} tickValues={[2]} />\n      </svg>,\n    );\n    expect(single.querySelectorAll('.visx-axis-tick')).toHaveLength(1);\n\n    const { container: multiple } = render(\n      <svg>\n        <Axis {...axisProps} tickValues={[0, 1, 2, 3, 4, 5, 6]} />\n      </svg>,\n    );\n    expect(multiple.querySelectorAll('.visx-axis-tick')).toHaveLength(7);\n  });\n\n  it('should format ticks correctly', () => {\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} tickValues={[0]} tickFormat={() => 'test!!!'} />\n      </svg>,\n    );\n\n    const tickText = container.querySelector('.visx-axis-tick text');\n    expect(tickText).toHaveTextContent('test!!!');\n  });\n\n  it('should provide tick index to tickFormat function', () => {\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} tickValues={[9]} tickFormat={(val, i) => `index-${i}`} />\n      </svg>,\n    );\n\n    const tickText = container.querySelector('.visx-axis-tick text');\n    expect(tickText).toHaveTextContent('index-0');\n  });\n\n  it('should handle tick styling', () => {\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} tickValues={[0]} strokeWidth={2} />\n      </svg>,\n    );\n\n    const tickLines = container.querySelectorAll('line');\n    expect(tickLines.length).toBeGreaterThan(0);\n    expect(tickLines[0]).toHaveAttribute('stroke-width', '2');\n    expect(tickLines[0]).toHaveAttribute('stroke-linecap', 'square');\n  });\n\n  it('should handle band scales', () => {\n    const { container } = render(\n      <svg>\n        <Axis\n          orientation=\"bottom\"\n          scale={scaleBand({\n            range: [10, 0],\n            round: true,\n            domain: ['a', 'b'],\n          })}\n          tickStroke=\"blue\"\n        />\n      </svg>,\n    );\n\n    const lines = container.querySelectorAll('line');\n    expect(lines.length).toBeGreaterThan(0);\n\n    const firstLine = lines[0];\n    const secondLine = lines[1];\n\n    expect(firstLine).toHaveAttribute('x1', '8');\n    expect(firstLine).toHaveAttribute('y1', '0');\n    expect(firstLine).toHaveAttribute('x2', '8');\n    expect(firstLine).toHaveAttribute('y2', '8');\n\n    expect(secondLine).toHaveAttribute('x1', '3');\n    expect(secondLine).toHaveAttribute('y1', '0');\n    expect(secondLine).toHaveAttribute('x2', '3');\n    expect(secondLine).toHaveAttribute('y2', '8');\n  });\n\n  it('should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGGElement>();\n    const { container } = render(\n      <svg>\n        <Axis {...axisProps} innerRef={fakeRef} />\n      </svg>,\n    );\n\n    const axisElement = container.querySelector('g.visx-axis');\n    expect(fakeRef.current).toBe(axisElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/AxisBottom.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { scaleLinear } from '@visx/scale';\nimport { AxisBottom } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\nconst axisProps = {\n  scale: scaleLinear({\n    range: [10, 0],\n    round: true,\n    domain: [0, 10],\n  }),\n};\n\ndescribe('<AxisBottom />', () => {\n  const renderAxis = (props = {}) =>\n    render(\n      <svg>\n        <AxisBottom {...axisProps} {...props} />\n      </svg>,\n    );\n\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(AxisBottom).toBeDefined();\n  });\n\n  it('should render without crashing', () => {\n    const { container } = renderAxis();\n    const axis = container.querySelector('.visx-axis');\n    expect(axis).toBeInTheDocument();\n  });\n\n  it('should render with default class names', () => {\n    const { container } = renderAxis();\n    const axis = container.querySelector('.visx-axis');\n    expect(axis).toHaveClass('visx-axis-bottom');\n  });\n\n  it('should render with custom props', () => {\n    const customProps = {\n      axisClassName: 'axis-test-class',\n      axisLineClassName: 'axisline-test-class',\n      labelClassName: 'label-test-class',\n      tickClassName: 'tick-test-class',\n      labelOffset: 3,\n      tickLength: 15,\n    };\n\n    const { container } = renderAxis(customProps);\n    const axis = container.querySelector('.visx-axis');\n    expect(axis).toHaveClass('axis-test-class');\n    expect(container.querySelector('.axisline-test-class')).toBeInTheDocument();\n    expect(container.querySelector('.tick-test-class')).toBeInTheDocument();\n  });\n\n  it('should render label correctly', () => {\n    const label = 'test label';\n    const { getByText } = renderAxis({ label });\n    expect(getByText(label)).toBeInTheDocument();\n  });\n\n  it('should render with different labelOffsets', () => {\n    const { container } = renderAxis({ labelOffset: 50, label: 'test' });\n    const label = container.querySelector('.visx-axis-label');\n    expect(label?.getAttribute('y')).toBe('78');\n  });\n\n  it('should have default tickLength of 8', () => {\n    const { container } = renderAxis();\n    const ticks = container.querySelectorAll('.visx-axis-tick line');\n    ticks.forEach((tick) => {\n      expect(tick).toHaveAttribute('y2', '8');\n    });\n  });\n\n  it('should set custom tickLength', () => {\n    const tickLength = 15;\n    const { container } = renderAxis({ tickLength });\n    const ticks = container.querySelectorAll('.visx-axis-tick line');\n    ticks.forEach((tick) => {\n      expect(tick).toHaveAttribute('y2', '15');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/AxisLeft.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { scaleLinear } from '@visx/scale';\nimport { AxisLeft } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\nconst axisProps = {\n  scale: scaleLinear({\n    range: [10, 0],\n    round: true,\n    domain: [0, 10],\n  }),\n};\n\ndescribe('<AxisLeft />', () => {\n  const renderAxis = (props = {}) =>\n    render(\n      <svg>\n        <AxisLeft {...axisProps} {...props} />\n      </svg>,\n    );\n\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(AxisLeft).toBeDefined();\n  });\n\n  it('should render with correct class', () => {\n    const { container } = renderAxis();\n    expect(container.querySelector('.visx-axis-left')).toBeInTheDocument();\n  });\n\n  it('should apply custom class names', () => {\n    const axisClassName = 'axis-test-class';\n    const axisLineClassName = 'axisline-test-class';\n    const labelClassName = 'label-test-class';\n    const tickClassName = 'tick-test-class';\n\n    const { container } = renderAxis({\n      label: 'Test Label',\n      axisClassName,\n      axisLineClassName,\n      labelClassName,\n      tickClassName,\n    });\n\n    expect(container.querySelector(`g.${axisClassName}`)).toBeInTheDocument();\n    expect(container.querySelector(`line.${axisLineClassName}`)).toBeInTheDocument();\n    expect(container.querySelector(`text.${labelClassName}`)).toBeInTheDocument();\n    expect(container.querySelector(`g.${tickClassName}`)).toBeInTheDocument();\n  });\n\n  it('should rotate label by default', () => {\n    const { container } = renderAxis({\n      label: 'Test Label',\n    });\n    const label = container.querySelector('text.visx-axis-label');\n    expect(label).toHaveAttribute('transform', 'rotate(-90)');\n  });\n\n  it('should use default labelOffset of 36', () => {\n    const { container } = renderAxis({\n      label: 'Test Label',\n    });\n    const label = container.querySelector('.visx-axis-label');\n    expect(label?.getAttribute('y')).toBe('-44');\n    expect(label?.getAttribute('x')).toBe('-5');\n  });\n\n  it('should apply custom labelOffset', () => {\n    const labelOffset = 3;\n    const { container } = renderAxis({\n      label: 'Test Label',\n      labelOffset,\n    });\n    const label = container.querySelector('.visx-axis-label');\n    expect(label?.getAttribute('y')).toBe('-11');\n    expect(label?.getAttribute('x')).toBe('-5');\n  });\n\n  it('should use default tickLength', () => {\n    const { container } = renderAxis();\n    const tick = container.querySelector('.visx-axis-tick line');\n    expect(tick).toHaveAttribute('x2', '-8');\n  });\n\n  it('should set custom tickLength', () => {\n    const tickLength = 15;\n    const { container } = renderAxis({ tickLength });\n    const tick = container.querySelector('.visx-axis-tick line');\n    expect(tick).toHaveAttribute('x2', `-${tickLength}`);\n  });\n\n  it('should render label text', () => {\n    const label = 'test';\n    const { getAllByText } = renderAxis({ label });\n    const elements = getAllByText(label);\n    expect(elements.length).toBeGreaterThan(0);\n    expect(elements[0]).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/AxisRight.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { scaleLinear } from '@visx/scale';\nimport { AxisRight } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\nconst axisProps = {\n  scale: scaleLinear({\n    range: [10, 0],\n    round: true,\n    domain: [0, 10],\n  }),\n};\n\ndescribe('<AxisRight />', () => {\n  const renderAxis = (props = {}) =>\n    render(\n      <svg>\n        <AxisRight {...axisProps} {...props} />\n      </svg>,\n    );\n\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(AxisRight).toBeDefined();\n  });\n\n  it('should render with default props', () => {\n    const { container } = renderAxis();\n    const axis = container.querySelector('.visx-axis-right');\n    expect(axis).toBeInTheDocument();\n\n    // Default props are reflected in rendered output\n    const ticks = container.querySelectorAll('.visx-axis-tick');\n    expect(ticks.length).toBeGreaterThan(0);\n  });\n\n  it('should apply custom class names', () => {\n    const customProps = {\n      axisClassName: 'axis-test-class',\n      axisLineClassName: 'axisline-test-class',\n      labelClassName: 'label-test-class',\n      tickClassName: 'tick-test-class',\n    };\n\n    const { container } = renderAxis(customProps);\n    expect(container.querySelector('.axis-test-class')).toBeInTheDocument();\n    expect(container.querySelector('.axisline-test-class')).toBeInTheDocument();\n    expect(container.querySelector('.tick-test-class')).toBeInTheDocument();\n  });\n\n  it('should render label correctly', () => {\n    const label = 'test';\n    const { container } = renderAxis({ label });\n\n    const labelElement = container.querySelector('.visx-axis-label');\n    expect(labelElement).toHaveTextContent(label);\n  });\n\n  it('should rotate label by default', () => {\n    const { container } = renderAxis({\n      label: 'Test Label',\n    });\n    const label = container.querySelector('text.visx-axis-label');\n    expect(label).toHaveAttribute('transform', 'rotate(90)');\n  });\n\n  it('should use default labelOffset of 36', () => {\n    const { container } = renderAxis({\n      label: 'Test Label',\n    });\n    const label = container.querySelector('.visx-axis-label');\n    expect(label?.getAttribute('y')).toBe('-44');\n    expect(label?.getAttribute('x')).toBe('5');\n  });\n\n  it('should apply custom labelOffset', () => {\n    const labelOffset = 3;\n    const { container } = renderAxis({\n      label: 'Test Label',\n      labelOffset,\n    });\n    const label = container.querySelector('.visx-axis-label');\n    expect(label?.getAttribute('y')).toBe('-11');\n    expect(label?.getAttribute('x')).toBe('5');\n  });\n\n  it('should use default tickLength', () => {\n    const { container } = renderAxis();\n    const tick = container.querySelector('.visx-axis-tick line');\n    expect(tick).toHaveAttribute('x2', '8');\n  });\n\n  it('should set custom tickLength', () => {\n    const tickLength = 15;\n    const { container } = renderAxis({ tickLength });\n    const tick = container.querySelector('.visx-axis-tick line');\n    expect(tick).toHaveAttribute('x2', `${tickLength}`);\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/AxisTop.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { AxisTop } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\nconst axisProps = {\n  scale: scaleLinear({\n    range: [10, 0],\n    round: true,\n    domain: [0, 10],\n  }),\n};\n\ndescribe('<AxisTop />', () => {\n  const renderInSVG = (children: React.ReactElement) => render(<svg>{children}</svg>);\n\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(AxisTop).toBeDefined();\n  });\n\n  it('should render with class .visx-axis-top', () => {\n    const { container } = renderInSVG(<AxisTop {...axisProps} />);\n    const axis = container.querySelector('.visx-axis');\n    expect(axis).toHaveClass('visx-axis-top');\n  });\n\n  it('should set user-specified class names', () => {\n    const axisClassName = 'axis-test-class';\n    const axisLineClassName = 'axisline-test-class';\n    const labelClassName = 'label-test-class';\n    const tickClassName = 'tick-test-class';\n\n    const { container } = renderInSVG(\n      <AxisTop\n        {...axisProps}\n        axisClassName={axisClassName}\n        axisLineClassName={axisLineClassName}\n        labelClassName={labelClassName}\n        tickClassName={tickClassName}\n        label=\"test\"\n      />,\n    );\n\n    const axis = container.querySelector('.visx-axis');\n    expect(axis).toHaveClass('axis-test-class');\n    expect(axis).toHaveClass('visx-axis-top');\n\n    const axisLine = container.querySelector('.visx-axis-line');\n    expect(axisLine).toHaveClass(axisLineClassName);\n\n    const label = container.querySelector('.visx-axis-label');\n    expect(label).toHaveClass(labelClassName);\n\n    const tick = container.querySelector('.visx-axis-tick');\n    expect(tick).toHaveClass(tickClassName);\n  });\n\n  it('should render with default labelOffset of 8', () => {\n    const { container } = renderInSVG(<AxisTop {...axisProps} label=\"test label\" />);\n    const label = container.querySelector('.visx-axis-label');\n    expect(label?.getAttribute('y')).toBe('-26');\n  });\n\n  it('should render with custom labelOffset', () => {\n    const labelOffset = 3;\n    const { container } = renderInSVG(\n      <AxisTop {...axisProps} label=\"test label\" labelOffset={labelOffset} />,\n    );\n\n    const label = container.querySelector('.visx-axis-label');\n    expect(label?.getAttribute('y')).toBe('-21');\n  });\n\n  it('should render ticks with default length of 8', () => {\n    const { container } = renderInSVG(<AxisTop {...axisProps} />);\n    const ticks = container.querySelectorAll('.visx-axis-tick line.visx-line');\n    ticks.forEach((tick) => {\n      const y1 = Math.abs(parseFloat(tick.getAttribute('y1') || '0'));\n      const y2 = Math.abs(parseFloat(tick.getAttribute('y2') || '0'));\n      expect(Math.abs(y2 - y1)).toBe(8);\n    });\n  });\n\n  it('should render ticks with custom length', () => {\n    const tickLength = 15;\n    const { container } = renderInSVG(<AxisTop {...axisProps} tickLength={tickLength} />);\n    const ticks = container.querySelectorAll('.visx-axis-tick line.visx-line');\n    ticks.forEach((tick) => {\n      const y1 = Math.abs(parseFloat(tick.getAttribute('y1') || '0'));\n      const y2 = Math.abs(parseFloat(tick.getAttribute('y2') || '0'));\n      expect(Math.abs(y2 - y1)).toBe(tickLength);\n    });\n  });\n\n  it('should render label text', () => {\n    const label = 'test';\n    const { getByText } = renderInSVG(<AxisTop {...axisProps} label={label} />);\n\n    expect(getByText(label)).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/Orientation.test.ts",
    "content": "import { Orientation } from '../src';\n\ndescribe('Orientation', () => {\n  it('should have keys for top/right/bottom/left', () => {\n    expect(Orientation).toEqual({\n      top: expect.any(String),\n      right: expect.any(String),\n      bottom: expect.any(String),\n      left: expect.any(String),\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/scales.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport {\n  scaleBand,\n  scaleLinear,\n  scaleLog,\n  scaleOrdinal,\n  scalePoint,\n  scalePower,\n  scaleQuantile,\n  scaleQuantize,\n  scaleSymlog,\n  scaleThreshold,\n  scaleTime,\n  scaleUtc,\n} from '@visx/scale';\nimport { Axis } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\nconst axisProps = {\n  orientation: 'left' as const,\n  label: 'test axis',\n};\n\ndescribe('Axis scales', () => {\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should render with scaleBand', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleBand({\n            range: [10, 0],\n            round: true,\n            domain: ['a', 'b', 'c'],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleLinear', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleLinear({\n            range: [10, 0],\n            round: true,\n            domain: [0, 10],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleLog', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleLog({\n            range: [10, 0],\n            round: true,\n            domain: [1, 10, 100, 1000],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleOrdinal', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleOrdinal({\n            range: [0, 10],\n            domain: ['a', 'b', 'c'],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scalePoint', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scalePoint({\n            range: [0, 10],\n            round: true,\n            domain: ['a', 'b', 'c'],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scalePower', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scalePower({\n            range: [1, 2, 3, 4, 5],\n            domain: [1, 10, 100, 1000, 10000],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleQuantile', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleQuantile({\n            range: [0, 2, 4, 6, 8, 10],\n            domain: [1, 10, 100, 1000, 10000],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleQuantize', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleQuantize({\n            range: [1, 10],\n            domain: [1, 10],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleSymlog', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleSymlog({\n            range: [1, 10],\n            domain: [1, 10],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleThreshold', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleThreshold({\n            range: [1, 10],\n            domain: [1, 10],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleTime', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleTime({\n            range: [1, 10],\n            domain: [new Date('2020-01-01'), new Date('2020-01-05')],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n\n  it('should render with scaleUtc', () => {\n    const { getByText } = render(\n      <svg>\n        <Axis\n          {...axisProps}\n          scale={scaleUtc({\n            range: [1, 10],\n            domain: [new Date('2020-01-01'), new Date('2020-01-05')],\n          })}\n        />\n      </svg>,\n    );\n    expect(getByText('test axis')).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/svgMock.ts",
    "content": "// @ts-expect-error\nlet originalFn: typeof SVGElement.prototype.getComputedTextLength;\n\n/**\n * JSDom does not implement getComputedTextLength()\n * so this function add mock implementation for testing.\n */\nexport function addMock() {\n  // @ts-expect-error\n  originalFn = SVGElement.prototype.getComputedTextLength;\n\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = function getComputedTextLength() {\n    // Make every character 10px wide\n    return (this.textContent?.length ?? 0) * 10;\n  };\n}\n\n/**\n * Remove mock from addMock()\n */\nexport function removeMock() {\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = originalFn;\n}\n"
  },
  {
    "path": "packages/visx-axis/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-axis/test/utils/getAxisRangePaddingConfig.test.ts",
    "content": "import getAxisRangePaddingConfig, {\n  defaultAxisRangePadding,\n} from '../../src/utils/getAxisRangePaddingConfig';\n\ndescribe('getAxisRangePaddingConfig(rangePadding)', () => {\n  it('should return default range padding config', () => {\n    const actualResult = getAxisRangePaddingConfig();\n    const expectedResult = { start: defaultAxisRangePadding, end: defaultAxisRangePadding };\n    expect(actualResult).toEqual(expectedResult);\n  });\n\n  it('should support range padding as a number', () => {\n    const actualResult = getAxisRangePaddingConfig(8);\n    const expectedResult = { start: 8, end: 8 };\n    expect(actualResult).toEqual(expectedResult);\n  });\n\n  it('should support range padding as a config object', () => {\n    const testCases = [\n      { input: { start: 5 }, expectedResult: { start: 5, end: defaultAxisRangePadding } },\n      { input: { end: 10 }, expectedResult: { start: defaultAxisRangePadding, end: 10 } },\n      { input: { start: 15, end: 5 }, expectedResult: { start: 15, end: 5 } },\n    ];\n    testCases.forEach(({ input, expectedResult }) => {\n      const actualResult = getAxisRangePaddingConfig(input);\n      expect(actualResult).toEqual(expectedResult);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/test/utils/getTickPosition.test.ts",
    "content": "import { scaleLinear, scaleBand } from '@visx/scale';\nimport getTickPosition from '../../src/utils/getTickPosition';\n\ndescribe('getTickPosition(scale, align)', () => {\n  describe('scales without band', () => {\n    it('return center position', () => {\n      const position = getTickPosition(scaleLinear({ domain: [0, 10], range: [0, 100] }));\n      expect(position(5)).toBe(50);\n    });\n  });\n  describe('scales with band', () => {\n    describe('align', () => {\n      const scale = scaleBand({ domain: ['a', 'b', 'c'], range: [0, 100] });\n\n      it('default to center', () => {\n        expect(getTickPosition(scale)('b')).toBe(50);\n      });\n      it('center', () => {\n        expect(getTickPosition(scale, 'center')('b')).toBe(50);\n      });\n      it('start', () => {\n        expect((getTickPosition(scale, 'start')('b') as number).toFixed(2)).toBe('33.33');\n      });\n      it('end', () => {\n        expect((getTickPosition(scale, 'end')('b') as number).toFixed(2)).toBe('66.67');\n      });\n    });\n    describe('with rounding', () => {\n      const scale = scaleBand({ domain: ['a', 'b', 'c'], range: [0, 100], round: true });\n\n      it('center', () => {\n        expect(getTickPosition(scale, 'center')('b')).toBe(51);\n      });\n      it('start', () => {\n        expect(getTickPosition(scale, 'start')('b')).toBe(34);\n      });\n      it('end', () => {\n        expect(getTickPosition(scale, 'end')('b')).toBe(67);\n      });\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-axis/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-point\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    },\n    {\n      \"path\": \"../visx-text\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-axis/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/axis',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-axis/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/axis': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-bounds/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-bounds/Readme.md",
    "content": "# @visx/bounds\n\n<p>\n  <a title=\"@visx/bounds npm downloads\" href=\"https://www.npmjs.com/package/@visx/bounds\">\n    <img src=\"https://img.shields.io/npm/dm/@visx/bounds.svg?style=flat-square\" />\n  </a>\n</p>\n\n```\nnpm install --save @visx/bounds\n```\n\n### `withBoundingRects` HOC\n\nIt's often useful to determine whether elements (e.g., tooltips) overflow the bounds of their parent\ncontainer and adjust positioning accordingly. The `withBoundingRects` higher-order component is\nmeant to simplify this computation by passing in a component's bounding rect as well as its\n_parent's_ bounding rect.\n\n### Example usage\n\nExample usage with a `<Tooltip />` component\n\n```tsx\nimport React from 'react';\nimport { withBoundingRects, WithBoundingRectsProps } from '@visx/bounds';\n\ntype TooltipProps = WithBoundingRectsProps & {\n  left: number;\n  top: number;\n  children?: React.ReactNode;\n};\n\nfunction Tooltip({ left: initialLeft, top: initialTop, rect, parentRect, children }: TooltipProps) {\n  let left = initialLeft;\n  let top = initialTop;\n\n  if (rect && parentRect) {\n    left = rect.right > parentRect.right ? left - rect.width : left;\n    top = rect.bottom > parentRect.bottom ? top - rect.height : top;\n  }\n\n  return <div style={{ top, left, ...myTheme }}>{children}</div>;\n}\n\nexport default withBoundingRects(Tooltip);\n```\n"
  },
  {
    "path": "packages/visx-bounds/package.json",
    "content": "{\n  \"name\": \"@visx/bounds\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"Utilities to make your life with bounding boxes better\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"Chris Williams @williaster\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@types/react-dom\": \"*\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\",\n    \"react-dom\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-bounds/src/enhancers/withBoundingRects.tsx",
    "content": "/* eslint react/no-did-mount-set-state: 0 */\nimport { PureComponent, createRef } from 'react';\nimport type { ComponentClass, ComponentType, RefObject } from 'react';\n\nconst emptyRect = {\n  top: 0,\n  right: 0,\n  bottom: 0,\n  left: 0,\n  width: 0,\n  height: 0,\n};\n\ntype rectShape = {\n  top: number;\n  right: number;\n  bottom: number;\n  left: number;\n  width: number;\n  height: number;\n};\n\nexport type WithBoundingRectsProps = {\n  getRects?: () => { rect: rectShape; parentRect: rectShape };\n  rect?: rectShape;\n  parentRect?: rectShape;\n  nodeRef?: RefObject<HTMLElement>;\n};\n\nexport default function withBoundingRects<Props extends object = {}>(\n  BaseComponent: ComponentType<Props>,\n): ComponentClass<Props> {\n  return class WrappedComponent extends PureComponent<Props> {\n    static displayName = `withBoundingRects(${BaseComponent.displayName || ''})`;\n    node: HTMLElement | undefined | null;\n    nodeRef: RefObject<HTMLElement | null>;\n    constructor(props: Props) {\n      super(props);\n      this.state = {\n        rect: undefined,\n        parentRect: undefined,\n      };\n      this.nodeRef = createRef();\n      this.getRects = this.getRects.bind(this);\n    }\n\n    componentDidMount() {\n      this.node = this.nodeRef?.current || null;\n      this.setState(() => this.getRects());\n    }\n\n    getRects() {\n      if (!this.node) return this.state;\n\n      const { node } = this;\n      const parentNode = node.parentNode as HTMLElement | null;\n\n      const rect = node.getBoundingClientRect ? node.getBoundingClientRect() : emptyRect;\n\n      const parentRect = parentNode?.getBoundingClientRect\n        ? parentNode.getBoundingClientRect()\n        : emptyRect;\n\n      return { rect, parentRect };\n    }\n\n    render() {\n      return (\n        <BaseComponent\n          nodeRef={this.nodeRef}\n          getRects={this.getRects}\n          {...this.state}\n          {...this.props}\n        />\n      );\n    }\n  };\n}\n"
  },
  {
    "path": "packages/visx-bounds/src/index.ts",
    "content": "// @visx/bounds\nimport type { WithBoundingRectsProps as WithBoundingRectsPropsType } from './enhancers/withBoundingRects';\n\nexport { default as withBoundingRects } from './enhancers/withBoundingRects';\n\nexport type WithBoundingRectsProps = WithBoundingRectsPropsType;\n"
  },
  {
    "path": "packages/visx-bounds/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-bounds/test/withBoundingRects.test.tsx",
    "content": "/* eslint-disable jsx-a11y/no-static-element-interactions */\n/* eslint-disable jsx-a11y/click-events-have-key-events */\nimport { vi } from 'vitest';\nimport type { ReactNode } from 'react';\nimport React from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport fireEvent from '@testing-library/user-event';\nimport { withBoundingRects } from '../src';\nimport '@testing-library/jest-dom';\n\ntype RectShape = {\n  top?: number;\n  right?: number;\n  bottom?: number;\n  left?: number;\n  width?: number;\n  height?: number;\n};\n\nconst emptyRect = {\n  top: 0,\n  right: 0,\n  bottom: 0,\n  left: 0,\n};\n\nconst mockRect = {\n  top: 50,\n  left: 50,\n  bottom: 0,\n  right: 0,\n};\n\ntype BoundingRectsComponentProps = {\n  rect?: RectShape;\n  parentRect?: RectShape;\n  getRects?: () => DOMRect;\n  children?: ReactNode;\n  nodeRef?: React.RefObject<HTMLDivElement>;\n  otherProps?: object;\n};\n\n// Component created for testing purpose\nfunction BoundingRectsComponent({\n  rect,\n  parentRect,\n  getRects,\n  children,\n  nodeRef,\n  ...otherProps\n}: BoundingRectsComponentProps) {\n  const parentRectStyle = {\n    top: parentRect?.top,\n    left: parentRect?.left,\n    bottom: parentRect?.bottom,\n    right: parentRect?.right,\n  };\n\n  const rectStyle = {\n    top: rect?.top,\n    left: rect?.left,\n    bottom: rect?.bottom,\n    right: rect?.right,\n  };\n\n  return (\n    <div data-testid=\"BoundingRectsComponentParent\" style={parentRectStyle}>\n      <div\n        ref={nodeRef}\n        data-testid=\"BoundingRectsComponent\"\n        style={rectStyle}\n        onClick={() => getRects?.()}\n      >\n        {children}\n        {JSON.stringify(otherProps)}\n      </div>\n    </div>\n  );\n}\n\nconst Component = () => null;\n\ndescribe('withBoundingRects()', () => {\n  beforeAll(() => {\n    // mock getBoundingClientRect\n    vi.spyOn(Element.prototype, 'getBoundingClientRect').mockImplementation(() => ({\n      ...mockRect,\n      x: 0,\n      y: 0,\n      width: 100,\n      height: 100,\n      toJSON: vi.fn(),\n    }));\n  });\n\n  test('it should be defined', () => {\n    expect(withBoundingRects).toBeDefined();\n  });\n\n  test('it should pass rect, parentRect, and getRect props to the wrapped component', async () => {\n    const HOC = withBoundingRects(BoundingRectsComponent);\n    const { getByTestId } = render(<HOC />);\n\n    // getBoundingClientRect should be called twice, once for the component, and once for its parent\n    await waitFor(() => expect(Element.prototype.getBoundingClientRect).toHaveBeenCalledTimes(2));\n\n    const RenderedComponent = getByTestId('BoundingRectsComponent');\n    const RenderedComponentParent = getByTestId('BoundingRectsComponentParent');\n\n    const expectedStyle = `top: ${mockRect.top}px; bottom: ${mockRect.bottom}px; left: ${mockRect.left}px; right: ${mockRect.right}px;`;\n    expect(RenderedComponent).toHaveStyle(expectedStyle);\n    expect(RenderedComponentParent).toHaveStyle(expectedStyle);\n\n    fireEvent.click(RenderedComponent);\n    // upon onClick time, getBoundingClientRect should be called extra 2 times\n    expect(Element.prototype.getBoundingClientRect).toHaveBeenCalledTimes(4);\n  });\n\n  test('it should pass additional props to the wrapped component', () => {\n    const HOC = withBoundingRects(BoundingRectsComponent);\n    // @ts-expect-error\n    const { getByText } = render(<HOC bananas=\"are yellow\" />);\n    expect(getByText('are yellow', { exact: false })).toBeInTheDocument();\n  });\n\n  test('it should not render if no node', () => {\n    const HOC = withBoundingRects(Component);\n    const { container } = render(<HOC />);\n    expect(container.innerHTML).toHaveLength(0);\n  });\n\n  test('it should set rect and parentRect to empty state if no getBoundingClient()', () => {\n    (Element.prototype.getBoundingClientRect as unknown) = null;\n    const HOC = withBoundingRects(BoundingRectsComponent);\n    const { getByTestId } = render(<HOC />);\n    const RenderedComponent = getByTestId('BoundingRectsComponent');\n    const RenderedComponentParent = getByTestId('BoundingRectsComponentParent');\n    expect(RenderedComponent).toHaveStyle(emptyRect);\n    expect(RenderedComponentParent).toHaveStyle(emptyRect);\n  });\n});\n"
  },
  {
    "path": "packages/visx-bounds/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-bounds/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/bounds',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-bounds/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/bounds': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-brush/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-brush/Readme.md",
    "content": "# @visx/brush\n\n<a title=\"@visx/brush npm downloads\" href=\"https://www.npmjs.com/package/@visx/brush\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/brush.svg?style=flat-square\" />\n</a>\n\nA brush allows you to select a sub-region of your chart or axis.\n\n## Installation\n\n```\nnpm install --save @visx/brush\n```\n"
  },
  {
    "path": "packages/visx-brush/package.json",
    "content": "{\n  \"name\": \"@visx/brush\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx brush\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"d3\",\n    \"react\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@visx/drag\": \"workspace:*\",\n    \"@visx/event\": \"workspace:*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-brush/src/BaseBrush.tsx",
    "content": "import { Component } from 'react';\nimport type { PointerEvent, SVGProps, ReactNode } from 'react';\nimport { Group } from '@visx/group';\nimport type { HandlerArgs as DragArgs } from '@visx/drag';\nimport { Drag } from '@visx/drag';\n\nimport type { BrushHandleRenderProps } from './BrushHandle';\nimport BrushHandle from './BrushHandle';\nimport BrushCorner from './BrushCorner';\nimport BrushSelection from './BrushSelection';\nimport BrushOverlay from './BrushOverlay';\nimport type {\n  MarginShape,\n  Point,\n  BrushShape,\n  ResizeTriggerAreas,\n  PartialBrushStartEnd,\n  BrushingType,\n  BrushPageOffset,\n} from './types';\nimport { debounce, getPageCoordinates } from './utils';\n\ntype PointerHandlerEvent = PointerEvent<SVGRectElement>;\n\nexport type BaseBrushProps = {\n  brushDirection?: 'horizontal' | 'vertical' | 'both';\n  initialBrushPosition?: PartialBrushStartEnd;\n  width: number;\n  height: number;\n  left: number;\n  top: number;\n  inheritedMargin?: MarginShape;\n  onChange?: (state: BaseBrushState) => void;\n  handleSize: number;\n  resizeTriggerAreas?: ResizeTriggerAreas[];\n  onBrushStart?: (start: BaseBrushState['start']) => void;\n  onBrushEnd?: (state: BaseBrushState) => void;\n  selectedBoxStyle: SVGProps<SVGRectElement>;\n  onMouseLeave?: (event: PointerHandlerEvent) => void;\n  onMouseUp?: (event: PointerHandlerEvent) => void;\n  onMouseMove?: (event: PointerHandlerEvent) => void;\n  onClick?: (event: PointerHandlerEvent) => void;\n  clickSensitivity: number;\n  disableDraggingSelection: boolean;\n  disableDraggingOverlay?: boolean;\n  resetOnEnd?: boolean;\n  useWindowMoveEvents?: boolean;\n  renderBrushHandle?: (props: BrushHandleRenderProps) => ReactNode;\n};\n\nexport type BaseBrushState = BrushShape & {\n  activeHandle: ResizeTriggerAreas | null;\n  isBrushing: boolean;\n  brushPageOffset?: BrushPageOffset;\n  brushingType?: BrushingType;\n};\n\nexport type UpdateBrush =\n  | BaseBrushState\n  | ((prevState: Readonly<BaseBrushState>, props: Readonly<BaseBrushProps>) => BaseBrushState);\n\nexport default class BaseBrush extends Component<BaseBrushProps, BaseBrushState> {\n  constructor(props: BaseBrushProps) {\n    super(props);\n    const { initialBrushPosition } = props;\n    const extent = initialBrushPosition\n      ? this.getExtent(initialBrushPosition.start, initialBrushPosition.end)\n      : {\n          x0: -1,\n          x1: -1,\n          y0: -1,\n          y1: -1,\n        };\n    this.state = {\n      start: { x: Math.max(0, extent.x0), y: Math.max(0, extent.y0) },\n      end: { x: Math.max(0, extent.x1), y: Math.max(0, extent.y1) },\n      extent,\n      bounds: {\n        x0: 0,\n        x1: this.props.width,\n        y0: 0,\n        y1: this.props.height,\n      },\n      isBrushing: false,\n      brushingType: undefined,\n      activeHandle: null,\n    };\n  }\n\n  private mouseUpTime: number = 0;\n  private mouseDownTime: number = 0;\n\n  static defaultProps = {\n    brushDirection: 'both',\n    inheritedMargin: {\n      left: 0,\n      top: 0,\n      right: 0,\n      bottom: 0,\n    },\n    onChange: null,\n    handleSize: 4,\n    resizeTriggerAreas: ['left', 'right'],\n    onBrushStart: null,\n    onBrushEnd: null,\n    onMouseLeave: null,\n    onMouseUp: null,\n    onMouseMove: null,\n    onClick: null,\n    disableDraggingSelection: false,\n    disableDraggingOverlay: false,\n    clickSensitivity: 200,\n    resetOnEnd: false,\n    initialBrushPosition: null,\n    useWindowMoveEvents: false,\n    renderBrushHandles: null,\n  };\n\n  getIdleState = () => {\n    const { width, height } = this.props;\n    return {\n      start: { x: 0, y: 0 },\n      end: { x: 0, y: 0 },\n      extent: {\n        x0: -1,\n        x1: -1,\n        y0: -1,\n        y1: -1,\n      },\n      bounds: {\n        x0: 0,\n        x1: width,\n        y0: 0,\n        y1: height,\n      },\n      isBrushing: false,\n      brushPageOffset: undefined,\n      activeHandle: null,\n      brushingType: undefined,\n    };\n  };\n\n  componentDidUpdate(prevProps: BaseBrushProps) {\n    if (this.props.width !== prevProps.width || this.props.height !== prevProps.height) {\n      this.setState((prevBrush: BaseBrushState) => {\n        let { start, end, extent } = prevBrush;\n\n        if (!(extent.x0 === -1 && extent.x1 === -1 && extent.y0 === -1 && extent.y1 === -1)) {\n          const widthRatio = this.props.width / prevProps.width;\n          const heightRatio = this.props.height / prevProps.height;\n\n          start = {\n            x: widthRatio * extent.x0,\n            y: heightRatio * extent.y0,\n          };\n\n          end = {\n            x: widthRatio * extent.x1,\n            y: heightRatio * extent.y1,\n          };\n\n          extent = this.getExtent(start, end);\n        }\n\n        return {\n          start,\n          end,\n          extent,\n          bounds: {\n            x0: 0,\n            x1: this.props.width,\n            y0: 0,\n            y1: this.props.height,\n          },\n        };\n      });\n    }\n  }\n\n  componentDidMount() {\n    if (this.props.useWindowMoveEvents) {\n      window.addEventListener('mouseup', this.handleWindowPointerUp);\n      window.addEventListener('mousemove', this.debouncedHandleWindowPointerMove);\n    }\n  }\n\n  componentWillUnmount() {\n    if (this.props.useWindowMoveEvents) {\n      window.removeEventListener('mouseup', this.handleWindowPointerUp);\n      window.removeEventListener('mousemove', this.debouncedHandleWindowPointerMove);\n    }\n  }\n\n  handleWindowPointerUp = () => {\n    const { useWindowMoveEvents, onBrushEnd, resetOnEnd } = this.props;\n    const { brushingType } = this.state;\n\n    if (useWindowMoveEvents && brushingType) {\n      this.updateBrush((prevBrush: BaseBrushState) => {\n        const { start, end, extent } = prevBrush;\n\n        start.x = Math.min(extent.x0, extent.x1);\n        start.y = Math.min(extent.y0, extent.y0);\n        end.x = Math.max(extent.x0, extent.x1);\n        end.y = Math.max(extent.y0, extent.y1);\n\n        let newState = {\n          ...prevBrush,\n          activeHandle: null,\n          isBrushing: false,\n          brushingType: undefined,\n        };\n\n        if (onBrushEnd) {\n          onBrushEnd(newState);\n        }\n\n        if (resetOnEnd) {\n          newState = {\n            ...newState,\n            ...this.getIdleState(),\n          };\n        }\n\n        return newState;\n      });\n    }\n  };\n\n  handleWindowPointerMove = (event: MouseEvent) => {\n    const { useWindowMoveEvents } = this.props;\n    const { brushingType, isBrushing, brushPageOffset, start } = this.state;\n\n    if (!useWindowMoveEvents || !isBrushing) return;\n\n    /* We use event page coordinates to calculate the offset between the initial pointer position and\n       the current pointer position so Brush could be resized/moved relatively. */\n    const offsetX = event.pageX - (brushPageOffset?.pageX || 0);\n    const offsetY = event.pageY - (brushPageOffset?.pageY || 0);\n\n    if (['left', 'right', 'top', 'bottom'].includes(brushingType ?? '')) {\n      this.updateBrush((prevBrush: BaseBrushState) => {\n        const { x: x0, y: y0 } = prevBrush.start;\n        const { x: x1, y: y1 } = prevBrush.end;\n\n        return {\n          ...prevBrush,\n          isBrushing: true,\n          extent: {\n            ...prevBrush.extent,\n            ...this.getExtent(\n              {\n                x:\n                  brushingType === 'left'\n                    ? Math.min(Math.max(x0 + offsetX, prevBrush.bounds.x0), prevBrush.bounds.x1)\n                    : x0,\n                y:\n                  brushingType === 'top'\n                    ? Math.min(Math.max(y0 + offsetY, prevBrush.bounds.y0), prevBrush.bounds.y1)\n                    : y0,\n              },\n              {\n                x:\n                  brushingType === 'right'\n                    ? Math.min(Math.max(x1 + offsetX, prevBrush.bounds.x0), prevBrush.bounds.x1)\n                    : x1,\n                y:\n                  brushingType === 'bottom'\n                    ? Math.min(Math.max(y1 + offsetY, prevBrush.bounds.y0), prevBrush.bounds.y1)\n                    : y1,\n              },\n            ),\n          },\n        };\n      });\n    }\n\n    if (brushingType === 'move') {\n      this.updateBrush((prevBrush: BaseBrushState) => {\n        const { x: x0, y: y0 } = prevBrush.start;\n        const { x: x1, y: y1 } = prevBrush.end;\n        const validDx =\n          offsetX > 0\n            ? Math.min(offsetX, prevBrush.bounds.x1 - x1)\n            : Math.max(offsetX, prevBrush.bounds.x0 - x0);\n\n        const validDy =\n          offsetY > 0\n            ? Math.min(offsetY, prevBrush.bounds.y1 - y1)\n            : Math.max(offsetY, prevBrush.bounds.y0 - y0);\n\n        return {\n          ...prevBrush,\n          isBrushing: true,\n          extent: {\n            ...prevBrush.extent,\n            x0: x0 + validDx,\n            y0: y0 + validDy,\n            x1: x1 + validDx,\n            y1: y1 + validDy,\n          },\n        };\n      });\n    }\n\n    if (brushingType === 'select') {\n      this.updateBrush((prevBrush: BaseBrushState) => {\n        const { x: x0, y: y0 } = prevBrush.start;\n        const newEnd = {\n          x: Math.min(Math.max(x0 + offsetX, prevBrush.bounds.x0), prevBrush.bounds.x1),\n          y: Math.min(Math.max(y0 + offsetY, prevBrush.bounds.y0), prevBrush.bounds.y1),\n        };\n        const extent = this.getExtent(start, newEnd);\n\n        const newState = {\n          ...prevBrush,\n          end: newEnd,\n          extent,\n        };\n\n        return newState;\n      });\n    }\n  };\n\n  debouncedHandleWindowPointerMove = debounce(this.handleWindowPointerMove, 1);\n\n  getExtent = (start: Partial<Point>, end: Partial<Point>) => {\n    const { brushDirection, width, height } = this.props;\n    const x0 = brushDirection === 'vertical' ? 0 : Math.min(start.x || 0, end.x || 0);\n    const x1 = brushDirection === 'vertical' ? width : Math.max(start.x || 0, end.x || 0);\n    const y0 = brushDirection === 'horizontal' ? 0 : Math.min(start.y || 0, end.y || 0);\n    const y1 = brushDirection === 'horizontal' ? height : Math.max(start.y || 0, end.y || 0);\n\n    return {\n      x0,\n      x1,\n      y0,\n      y1,\n    };\n  };\n\n  handleDragStart = (draw: DragArgs) => {\n    const { onBrushStart, left, top, inheritedMargin, useWindowMoveEvents } = this.props;\n    const marginLeft = inheritedMargin?.left ? inheritedMargin.left : 0;\n    const marginTop = inheritedMargin?.top ? inheritedMargin.top : 0;\n    const start = {\n      x: (draw.x || 0) + draw.dx - left - marginLeft,\n      y: (draw.y || 0) + draw.dy - top - marginTop,\n    };\n    const end = { ...start };\n\n    if (onBrushStart) {\n      onBrushStart(start);\n    }\n\n    this.updateBrush((prevBrush: BaseBrushState) => ({\n      ...prevBrush,\n      start,\n      end,\n      extent: {\n        x0: -1,\n        x1: -1,\n        y0: -1,\n        y1: -1,\n      },\n      isBrushing: true,\n      brushingType: 'select',\n      brushPageOffset: useWindowMoveEvents ? getPageCoordinates(draw.event) : undefined,\n    }));\n  };\n\n  handleBrushStart = (drag: DragArgs) => {\n    const { onBrushStart, left, top, inheritedMargin } = this.props;\n\n    if (onBrushStart) {\n      const marginLeft = inheritedMargin?.left ? inheritedMargin.left : 0;\n      const marginTop = inheritedMargin?.top ? inheritedMargin.top : 0;\n      const start = {\n        x: (drag.x || 0) + drag.dx - left - marginLeft,\n        y: (drag.y || 0) + drag.dy - top - marginTop,\n      };\n      onBrushStart(start);\n    }\n  };\n\n  handleDragMove = (drag: DragArgs) => {\n    const { left, top, inheritedMargin, useWindowMoveEvents } = this.props;\n    if (!drag.isDragging || useWindowMoveEvents) return;\n    const marginLeft = inheritedMargin?.left || 0;\n    const marginTop = inheritedMargin?.top || 0;\n    const end = {\n      x: (drag.x || 0) + drag.dx - left - marginLeft,\n      y: (drag.y || 0) + drag.dy - top - marginTop,\n    };\n    this.updateBrush((prevBrush: BaseBrushState) => {\n      const { start } = prevBrush;\n      const extent = this.getExtent(start, end);\n      return {\n        ...prevBrush,\n        end,\n        extent,\n      };\n    });\n  };\n\n  handleDragEnd = () => {\n    const { onBrushEnd, resetOnEnd, useWindowMoveEvents } = this.props;\n\n    if (!useWindowMoveEvents) {\n      this.updateBrush((prevBrush: BaseBrushState) => {\n        const { extent } = prevBrush;\n        let newState = {\n          ...prevBrush,\n          start: {\n            x: extent.x0,\n            y: extent.y0,\n          },\n          end: {\n            x: extent.x1,\n            y: extent.y1,\n          },\n          isBrushing: false,\n          brushingType: undefined,\n          activeHandle: null,\n        };\n\n        if (onBrushEnd) {\n          onBrushEnd(newState);\n        }\n\n        if (resetOnEnd) {\n          newState = {\n            ...newState,\n            ...this.getIdleState(),\n          };\n        }\n\n        return newState;\n      });\n    }\n  };\n\n  getBrushWidth = () => {\n    const { extent } = this.state;\n    const { x0, x1 } = extent;\n\n    return Math.max(Math.max(x0, x1) - Math.min(x0, x1), 0);\n  };\n\n  getBrushHeight = () => {\n    const { extent } = this.state;\n    const { y1, y0 } = extent;\n\n    return Math.max(Math.max(y0, y1) - Math.min(y0, y1), 0);\n  };\n\n  handles = (): Partial<{\n    [key in ResizeTriggerAreas]: {\n      x: number;\n      y: number;\n      height: number;\n      width: number;\n    };\n  }> => {\n    const { handleSize } = this.props;\n    const { extent } = this.state;\n    const { x0, x1, y0, y1 } = extent;\n    const offset = handleSize / 2;\n    const width = this.getBrushWidth();\n    const height = this.getBrushHeight();\n\n    return {\n      top: {\n        x: x0 - offset,\n        y: y0 - offset,\n        height: handleSize,\n        width: width + handleSize,\n      },\n      bottom: {\n        x: x0 - offset,\n        y: y1 - offset,\n        height: handleSize,\n        width: width + handleSize,\n      },\n      right: {\n        x: x1 - offset,\n        y: y0 - offset,\n        height: height + handleSize,\n        width: handleSize,\n      },\n      left: {\n        x: x0 - offset,\n        y: y0 - offset,\n        height: height + handleSize,\n        width: handleSize,\n      },\n    };\n  };\n\n  corners = (): Partial<{\n    [key in ResizeTriggerAreas]: {\n      x: number;\n      y: number;\n      width: number;\n      height: number;\n    };\n  }> => {\n    const { handleSize } = this.props;\n    const { extent } = this.state;\n    const { x0, x1, y0, y1 } = extent;\n    const offset = handleSize / 2;\n    const width = handleSize;\n    const height = handleSize;\n\n    return {\n      topLeft: {\n        x: Math.min(x0, x1) - offset,\n        y: Math.min(y0, y1) - offset,\n        width,\n        height,\n      },\n      topRight: {\n        x: Math.max(x0, x1) - offset,\n        y: Math.min(y0, y1) - offset,\n        width,\n        height,\n      },\n      bottomLeft: {\n        x: Math.min(x0, x1) - offset,\n        y: Math.max(y0, y1) - offset,\n        width,\n        height,\n      },\n      bottomRight: {\n        x: Math.max(x0, x1) - offset,\n        y: Math.max(y0, y1) - offset,\n        width,\n        height,\n      },\n    };\n  };\n\n  updateBrush = (updater: UpdateBrush) => {\n    const { onChange } = this.props;\n    this.setState(updater, () => {\n      if (onChange) {\n        onChange(this.state);\n      }\n    });\n  };\n\n  reset = () => this.updateBrush(() => this.getIdleState());\n\n  handleBrushingTypeChange = (type?: BrushingType, brushPageOffset?: BrushPageOffset) => {\n    this.updateBrush((prevBrush: BaseBrushState) => {\n      const next = {\n        ...prevBrush,\n        brushingType: type,\n        isBrushing: type !== undefined,\n      };\n\n      if (brushPageOffset || type === undefined) {\n        next.brushPageOffset = brushPageOffset;\n      }\n\n      return next;\n    });\n  };\n\n  render() {\n    const { start, end } = this.state;\n    const {\n      top,\n      left,\n      width: stageWidth,\n      height: stageHeight,\n      onMouseLeave,\n      onMouseUp,\n      onMouseMove,\n      onBrushEnd,\n      onClick,\n      resizeTriggerAreas,\n      selectedBoxStyle,\n      disableDraggingSelection,\n      disableDraggingOverlay,\n      clickSensitivity,\n      useWindowMoveEvents,\n      renderBrushHandle,\n    } = this.props;\n\n    const { brushingType } = this.state;\n\n    const handles = this.handles();\n    const corners = this.corners();\n    const width = this.getBrushWidth();\n    const height = this.getBrushHeight();\n    const resizeTriggerAreaSet = new Set(resizeTriggerAreas);\n\n    return (\n      <Group className=\"visx-brush\" top={top} left={left}>\n        {disableDraggingOverlay ? (\n          <BrushOverlay\n            width={stageWidth}\n            height={stageHeight}\n            onClick={(event) => {\n              const duration = this.mouseUpTime - this.mouseDownTime;\n              if (onClick && duration < clickSensitivity) onClick(event);\n            }}\n            style={{ cursor: 'default' }}\n          />\n        ) : (\n          <Drag\n            width={stageWidth}\n            height={stageHeight}\n            resetOnStart\n            onDragStart={this.handleDragStart}\n            onDragMove={this.handleDragMove}\n            onDragEnd={this.handleDragEnd}\n            isDragging={useWindowMoveEvents ? brushingType === 'select' : undefined}\n          >\n            {({ dragStart, isDragging, dragMove, dragEnd }) => (\n              <BrushOverlay\n                width={stageWidth}\n                height={stageHeight}\n                onDoubleClick={() => this.reset()}\n                onClick={(event: PointerHandlerEvent) => {\n                  const duration = this.mouseUpTime - this.mouseDownTime;\n                  if (onClick && duration < clickSensitivity) onClick(event);\n                }}\n                onPointerDown={(event: PointerHandlerEvent) => {\n                  this.mouseDownTime = Date.now();\n                  dragStart(event);\n                }}\n                onPointerLeave={(event: PointerHandlerEvent) => {\n                  if (onMouseLeave) onMouseLeave(event);\n                }}\n                onPointerMove={(event: PointerHandlerEvent) => {\n                  if (!isDragging && onMouseMove) onMouseMove(event);\n                  if (isDragging) dragMove(event);\n                }}\n                onPointerUp={(event: PointerHandlerEvent) => {\n                  this.mouseUpTime = Date.now();\n                  if (onMouseUp) onMouseUp(event);\n                  dragEnd(event);\n                }}\n                style={{ cursor: 'crosshair' }}\n              />\n            )}\n          </Drag>\n        )}\n\n        {/* selection */}\n        {start && end && (\n          <BrushSelection\n            updateBrush={this.updateBrush}\n            width={width}\n            height={height}\n            stageWidth={stageWidth}\n            stageHeight={stageHeight}\n            brush={this.state}\n            disableDraggingSelection={disableDraggingSelection}\n            onBrushEnd={onBrushEnd}\n            onBrushStart={this.handleBrushStart}\n            onMouseLeave={onMouseLeave}\n            onMouseMove={onMouseMove}\n            onMouseUp={onMouseUp}\n            onMoveSelectionChange={this.handleBrushingTypeChange}\n            onClick={onClick}\n            selectedBoxStyle={selectedBoxStyle}\n            isControlled={useWindowMoveEvents}\n            isDragInProgress={useWindowMoveEvents ? brushingType === 'move' : undefined}\n          />\n        )}\n        {/* handles */}\n        {start &&\n          end &&\n          (Object.keys(handles) as ResizeTriggerAreas[])\n            .filter((handleKey) => resizeTriggerAreaSet.has(handleKey))\n            .map((handleKey) => {\n              const handle = handles[handleKey];\n\n              return (\n                handle && (\n                  <BrushHandle\n                    key={`handle-${handleKey}`}\n                    type={handleKey}\n                    handle={handle}\n                    stageWidth={stageWidth}\n                    stageHeight={stageHeight}\n                    updateBrush={this.updateBrush}\n                    brush={this.state}\n                    onBrushStart={this.handleBrushStart}\n                    onBrushEnd={onBrushEnd}\n                    isControlled={useWindowMoveEvents}\n                    isDragInProgress={useWindowMoveEvents ? brushingType === handleKey : undefined}\n                    onBrushHandleChange={this.handleBrushingTypeChange}\n                    renderBrushHandle={renderBrushHandle}\n                  />\n                )\n              );\n            })}\n        {/* corners */}\n        {start &&\n          end &&\n          (Object.keys(corners) as ResizeTriggerAreas[])\n            .filter((cornerKey) => resizeTriggerAreaSet.has(cornerKey))\n            .map((cornerKey) => {\n              const corner = corners[cornerKey];\n\n              return (\n                corner && (\n                  <BrushCorner\n                    key={`corner-${cornerKey}`}\n                    type={cornerKey}\n                    brush={this.state}\n                    updateBrush={this.updateBrush}\n                    stageWidth={stageWidth}\n                    stageHeight={stageHeight}\n                    corner={corner}\n                    onBrushEnd={onBrushEnd}\n                  />\n                )\n              );\n            })}\n      </Group>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/visx-brush/src/Brush.tsx",
    "content": "import { Component } from 'react';\nimport type { MutableRefObject, ReactNode, SVGProps } from 'react';\nimport type { BaseBrushProps, BaseBrushState } from './BaseBrush';\nimport BaseBrush from './BaseBrush';\nimport type { BrushHandleRenderProps } from './BrushHandle';\nimport type {\n  Bounds,\n  PartialBrushStartEnd,\n  MarginShape,\n  Point,\n  ResizeTriggerAreas,\n  Scale,\n} from './types';\nimport { scaleInvert, getDomainFromExtent } from './utils';\n\nconst SAFE_PIXEL = 2;\nconst DEFAULT_COLOR = 'steelblue';\n\nexport type BrushProps = {\n  /** Style object for the Brush selection rect. */\n  selectedBoxStyle: SVGProps<SVGRectElement>;\n  /** x-coordinate scale. */\n  xScale: Scale;\n  /** y-coordinate scale. */\n  yScale: Scale;\n  /** Brush stage height. */\n  height: number;\n  /** Brush stage width. */\n  width: number;\n  /** Callback invoked on a change in Brush bounds. */\n  onChange?: (bounds: Bounds | null) => void;\n  /** Callback invoked on initialization of a Brush (not Brush move). */\n  onBrushStart?: BaseBrushProps['onBrushStart'];\n  /** Callback invoked on mouse up when a Brush size is being updated. */\n  onBrushEnd?: (bounds: Bounds | null) => void;\n  /** Callback invoked on mouse move in Brush stage when *not* dragging. */\n  onMouseMove?: BaseBrushProps['onMouseMove'];\n  /** Callback invoked on mouse leave from Brush stage when *not* dragging. */\n  onMouseLeave?: BaseBrushProps['onMouseLeave'];\n  /** Callback invoked on Brush stage click. */\n  onClick?: BaseBrushProps['onClick'];\n  /** Margin subtracted from Brush stage dimensions. */\n  margin?: MarginShape;\n  /** Allowed directions for Brush dimensional change. */\n  brushDirection?: 'vertical' | 'horizontal' | 'both';\n  /** Initial start and end position of the Brush. */\n  initialBrushPosition?: PartialBrushStartEnd;\n  /** Array of rect sides and corners which should be resizeable / can trigger a Brush size change. */\n  resizeTriggerAreas?: ResizeTriggerAreas[];\n  /** What is being brushed, used for margin subtraction. */\n  brushRegion?: 'xAxis' | 'yAxis' | 'chart';\n  /** Orientation of yAxis if `brushRegion=yAxis`. */\n  yAxisOrientation?: 'left' | 'right';\n  /** Orientation of xAxis if `brushRegion=xAxis`. */\n  xAxisOrientation?: 'top' | 'bottom';\n  /** Whether movement of Brush should be disabled. */\n  disableDraggingSelection: boolean;\n  /** Whether changing Brush size and position by clicking overlay should be disabled. */\n  disableDraggingOverlay?: boolean;\n  /** Whether to reset the Brush on drag end. */\n  resetOnEnd?: boolean;\n  /** Size of Brush handles, applies to all `resizeTriggerAreas`. */\n  handleSize: number;\n  /** Reference to the BaseBrush component. */\n  innerRef?: MutableRefObject<BaseBrush | null>;\n  /** Prevent drag end on mouse leaving from brush stage. */\n  useWindowMoveEvents?: boolean;\n  /** Render function for custom brush handles. */\n  renderBrushHandle?: (props: BrushHandleRenderProps) => ReactNode;\n};\n\nclass Brush extends Component<BrushProps> {\n  static defaultProps = {\n    xScale: null,\n    yScale: null,\n    onChange: null,\n    height: 0,\n    width: 0,\n    selectedBoxStyle: {\n      fill: DEFAULT_COLOR,\n      fillOpacity: 0.2,\n      stroke: DEFAULT_COLOR,\n      strokeWidth: 1,\n      strokeOpacity: 0.8,\n    },\n    margin: {\n      top: 0,\n      left: 0,\n      right: 0,\n      bottom: 0,\n    },\n    handleSize: 4,\n    brushDirection: 'horizontal',\n    initialBrushPosition: null,\n    resizeTriggerAreas: ['left', 'right'],\n    brushRegion: 'chart',\n    yAxisOrientation: 'right',\n    xAxisOrientation: 'bottom',\n    onBrushStart: null,\n    onBrushEnd: null,\n    disableDraggingSelection: false,\n    resetOnEnd: false,\n    onMouseMove: null,\n    onMouseLeave: null,\n    onClick: null,\n    useWindowMoveEvents: false,\n    renderBrushHandles: null,\n  };\n\n  handleChange = (brush: BaseBrushState) => {\n    const { onChange } = this.props;\n    if (!onChange) return;\n    const { x0 } = brush.extent;\n    if (typeof x0 === 'undefined' || x0 < 0) {\n      onChange(null);\n\n      return;\n    }\n    const domain = this.convertRangeToDomain(brush);\n    onChange(domain);\n  };\n\n  convertRangeToDomain(brush: BaseBrushState) {\n    const { xScale, yScale } = this.props;\n    const { x0, x1, y0, y1 } = brush.extent;\n\n    const xDomain = getDomainFromExtent(xScale, x0 || 0, x1 || 0, SAFE_PIXEL);\n    const yDomain = getDomainFromExtent(yScale, y0 || 0, y1 || 0, SAFE_PIXEL);\n\n    const domain: Bounds = {\n      x0: xDomain.start || 0,\n      x1: xDomain.end || 0,\n      xValues: xDomain.values,\n      y0: yDomain.start || 0,\n      y1: yDomain.end || 0,\n      yValues: yDomain.values,\n    };\n\n    return domain;\n  }\n\n  handleBrushStart = (point: Point) => {\n    const { onBrushStart } = this.props;\n    if (!onBrushStart) return;\n    const { x, y } = point;\n    const { xScale, yScale } = this.props;\n    const invertedX = scaleInvert(xScale, x);\n    const invertedY = scaleInvert(yScale, y);\n    onBrushStart({\n      x:\n        'invert' in xScale && typeof xScale.invert !== 'undefined'\n          ? invertedX\n          : xScale.domain()[invertedX],\n      y:\n        'invert' in yScale && typeof yScale.invert !== 'undefined'\n          ? invertedY\n          : yScale.domain()[invertedY],\n    });\n  };\n\n  handleBrushEnd = (brush: BaseBrushState) => {\n    const { onBrushEnd } = this.props;\n    if (!onBrushEnd) return;\n    const { x0 } = brush.extent;\n    if (typeof x0 === 'undefined' || x0 < 0) {\n      onBrushEnd(null);\n      return;\n    }\n    const domain = this.convertRangeToDomain(brush);\n    onBrushEnd(domain);\n  };\n\n  render() {\n    const {\n      xScale,\n      yScale,\n      height,\n      width,\n      margin,\n      brushDirection,\n      initialBrushPosition,\n      innerRef,\n      resizeTriggerAreas,\n      brushRegion,\n      yAxisOrientation,\n      xAxisOrientation,\n      selectedBoxStyle,\n      disableDraggingSelection,\n      disableDraggingOverlay,\n      resetOnEnd,\n      onMouseLeave,\n      onMouseMove,\n      onClick,\n      handleSize,\n      useWindowMoveEvents,\n      renderBrushHandle,\n    } = this.props;\n    if (!xScale || !yScale) return null;\n\n    let brushRegionWidth;\n    let brushRegionHeight;\n    let left;\n    let top;\n    const marginLeft = margin?.left ? margin.left : 0;\n    const marginTop = margin?.top ? margin.top : 0;\n    const marginRight = margin?.right ? margin.right : 0;\n    const marginBottom = margin?.bottom ? margin.bottom : 0;\n\n    if (brushRegion === 'chart') {\n      left = 0;\n      top = 0;\n      brushRegionWidth = width;\n      brushRegionHeight = height;\n    } else if (brushRegion === 'yAxis') {\n      top = 0;\n      brushRegionHeight = height;\n      if (yAxisOrientation === 'right') {\n        left = width;\n        brushRegionWidth = marginRight;\n      } else {\n        left = -marginLeft;\n        brushRegionWidth = marginLeft;\n      }\n    } else {\n      left = 0;\n      brushRegionWidth = width;\n      if (xAxisOrientation === 'bottom') {\n        top = height;\n        brushRegionHeight = marginBottom;\n      } else {\n        top = -marginTop;\n        brushRegionHeight = marginTop;\n      }\n    }\n\n    return (\n      <BaseBrush\n        width={brushRegionWidth}\n        height={brushRegionHeight}\n        left={left}\n        top={top}\n        brushDirection={brushDirection}\n        disableDraggingSelection={disableDraggingSelection}\n        disableDraggingOverlay={disableDraggingOverlay}\n        handleSize={handleSize}\n        inheritedMargin={margin}\n        initialBrushPosition={initialBrushPosition}\n        ref={innerRef}\n        resetOnEnd={resetOnEnd}\n        resizeTriggerAreas={resizeTriggerAreas}\n        selectedBoxStyle={selectedBoxStyle}\n        onBrushEnd={this.handleBrushEnd}\n        onBrushStart={this.handleBrushStart}\n        onChange={this.handleChange}\n        onClick={onClick}\n        onMouseLeave={onMouseLeave}\n        onMouseMove={onMouseMove}\n        useWindowMoveEvents={useWindowMoveEvents}\n        renderBrushHandle={renderBrushHandle}\n      />\n    );\n  }\n}\n\nexport default Brush;\n"
  },
  {
    "path": "packages/visx-brush/src/BrushCorner.tsx",
    "content": "/* eslint react/jsx-handler-names: 0 */\nimport { Component } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { HandlerArgs as DragArgs } from '@visx/drag';\nimport { Drag } from '@visx/drag';\nimport type { BaseBrushState as BrushState, UpdateBrush } from './BaseBrush';\nimport type { ResizeTriggerAreas } from './types';\n\nexport type BrushCornerProps = {\n  stageWidth: number;\n  stageHeight: number;\n  brush: BrushState;\n  updateBrush: (update: UpdateBrush) => void;\n  onBrushEnd?: (brush: BrushState) => void;\n  type: ResizeTriggerAreas;\n  style?: CSSProperties;\n  corner: { x: number; y: number; width: number; height: number };\n};\n\nexport type BrushCornerState = {};\n\nexport default class BrushCorner extends Component<BrushCornerProps, BrushCornerState> {\n  static defaultProps = {\n    style: {},\n  };\n\n  cornerDragMove = (drag: DragArgs) => {\n    const { updateBrush, type } = this.props;\n    if (!drag.isDragging) return;\n\n    updateBrush((prevBrush: Readonly<BrushState>) => {\n      const { start, end } = prevBrush;\n\n      const xMax = Math.max(start.x, end.x);\n      const xMin = Math.min(start.x, end.x);\n      const yMax = Math.max(start.y, end.y);\n      const yMin = Math.min(start.y, end.y);\n\n      let moveX = 0;\n      let moveY = 0;\n\n      switch (type) {\n        case 'topRight':\n          moveX = xMax + drag.dx;\n          moveY = yMin + drag.dy;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              x0: Math.max(Math.min(moveX, start.x), prevBrush.bounds.x0),\n              x1: Math.min(Math.max(moveX, start.x), prevBrush.bounds.x1),\n              y0: Math.max(Math.min(moveY, end.y), prevBrush.bounds.y0),\n              y1: Math.min(Math.max(moveY, end.y), prevBrush.bounds.y1),\n            },\n          };\n\n        case 'topLeft':\n          moveX = xMin + drag.dx;\n          moveY = yMin + drag.dy;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              x0: Math.max(Math.min(moveX, end.x), prevBrush.bounds.x0),\n              x1: Math.min(Math.max(moveX, end.x), prevBrush.bounds.x1),\n              y0: Math.max(Math.min(moveY, end.y), prevBrush.bounds.y0),\n              y1: Math.min(Math.max(moveY, end.y), prevBrush.bounds.y1),\n            },\n          };\n\n        case 'bottomLeft':\n          moveX = xMin + drag.dx;\n          moveY = yMax + drag.dy;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              x0: Math.max(Math.min(moveX, end.x), prevBrush.bounds.x0),\n              x1: Math.min(Math.max(moveX, end.x), prevBrush.bounds.x1),\n              y0: Math.max(Math.min(moveY, start.y), prevBrush.bounds.y0),\n              y1: Math.min(Math.max(moveY, start.y), prevBrush.bounds.y1),\n            },\n          };\n        case 'bottomRight':\n          moveX = xMax + drag.dx;\n          moveY = yMax + drag.dy;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              x0: Math.max(Math.min(moveX, start.x), prevBrush.bounds.x0),\n              x1: Math.min(Math.max(moveX, start.x), prevBrush.bounds.x1),\n              y0: Math.max(Math.min(moveY, start.y), prevBrush.bounds.y0),\n              y1: Math.min(Math.max(moveY, start.y), prevBrush.bounds.y1),\n            },\n          };\n        // BrushCorner skips edges use BrushHandle for those\n        case 'top':\n        case 'right':\n        case 'bottom':\n        case 'left':\n        default:\n          return prevBrush;\n      }\n    });\n  };\n\n  cornerDragEnd = () => {\n    const { updateBrush, onBrushEnd } = this.props;\n\n    updateBrush((prevBrush: Readonly<BrushState>) => {\n      const { start, end, extent } = prevBrush;\n      start.x = Math.min(extent.x0, extent.x1);\n      start.y = Math.min(extent.y0, extent.y0);\n      end.x = Math.max(extent.x0, extent.x1);\n      end.y = Math.max(extent.y0, extent.y1);\n      const nextBrush = {\n        ...prevBrush,\n        start,\n        end,\n        activeHandle: null,\n        domain: {\n          x0: Math.min(start.x, end.x),\n          x1: Math.max(start.x, end.x),\n          y0: Math.min(start.y, end.y),\n          y1: Math.max(start.y, end.y),\n        },\n      };\n      if (onBrushEnd) {\n        onBrushEnd(nextBrush);\n      }\n\n      return nextBrush;\n    });\n  };\n\n  render() {\n    const { type, brush, stageWidth, stageHeight, style: styleProp, corner } = this.props;\n    const cursor =\n      styleProp?.cursor ||\n      (type === 'topLeft' || type === 'bottomRight' ? 'nwse-resize' : 'nesw-resize');\n    const pointerEvents = brush.activeHandle || brush.isBrushing ? 'none' : 'all';\n\n    return (\n      <Drag\n        width={stageWidth}\n        height={stageHeight}\n        onDragMove={this.cornerDragMove}\n        onDragEnd={this.cornerDragEnd}\n        resetOnStart\n      >\n        {({ dragMove, dragEnd, dragStart, isDragging }) => (\n          <g>\n            {isDragging && (\n              <rect\n                fill=\"transparent\"\n                width={stageWidth}\n                height={stageHeight}\n                style={{ cursor }}\n                onPointerMove={dragMove}\n                onPointerUp={dragEnd}\n              />\n            )}\n            <rect\n              fill=\"transparent\"\n              onPointerDown={dragStart}\n              onPointerMove={dragMove}\n              onPointerUp={dragEnd}\n              className={`visx-brush-corner-${type}`}\n              style={{ cursor, pointerEvents, ...styleProp }}\n              {...corner}\n            />\n          </g>\n        )}\n      </Drag>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/visx-brush/src/BrushHandle.tsx",
    "content": "/* eslint react/jsx-handler-names: 0 */\nimport { Component } from 'react';\nimport type { ReactNode } from 'react';\nimport type { HandlerArgs as DragArgs } from '@visx/drag';\nimport { Drag } from '@visx/drag';\nimport type { BaseBrushState as BrushState, UpdateBrush } from './BaseBrush';\nimport type { BrushPageOffset, BrushingType, ResizeTriggerAreas } from './types';\nimport { getPageCoordinates } from './utils';\n\ntype HandleProps = {\n  x: number;\n  y: number;\n  width: number;\n  height: number;\n};\n\nexport type BrushHandleProps = {\n  stageWidth: number;\n  stageHeight: number;\n  brush: BrushState;\n  updateBrush: (update: UpdateBrush) => void;\n  onBrushStart?: (brush: DragArgs) => void;\n  onBrushEnd?: (brush: BrushState) => void;\n  type: ResizeTriggerAreas;\n  handle: HandleProps;\n  isControlled?: boolean;\n  isDragInProgress?: boolean;\n  onBrushHandleChange?: (type?: BrushingType, options?: BrushPageOffset) => void;\n  renderBrushHandle?: (props: BrushHandleRenderProps) => ReactNode;\n};\n\nexport type BrushHandleRenderProps = HandleProps & {\n  /** if brush extent is not active this prop is set to false */\n  isBrushActive: boolean;\n  className: string;\n};\n\n/** BrushHandle's are placed along the bounds of the brush and handle Drag events which update the passed brush. */\nexport default class BrushHandle extends Component<BrushHandleProps> {\n  handleDragStart = (drag: DragArgs) => {\n    const { onBrushHandleChange, type, onBrushStart } = this.props;\n\n    if (onBrushHandleChange) {\n      onBrushHandleChange(type, getPageCoordinates(drag.event));\n    }\n    if (onBrushStart) {\n      onBrushStart(drag);\n    }\n  };\n\n  handleDragMove = (drag: DragArgs) => {\n    const { updateBrush, type, isControlled } = this.props;\n    if (!drag.isDragging || isControlled) return;\n\n    updateBrush((prevBrush: BrushState) => {\n      const { start, end } = prevBrush;\n      let move = 0;\n      const xMax = Math.max(start.x, end.x);\n      const xMin = Math.min(start.x, end.x);\n      const yMax = Math.max(start.y, end.y);\n      const yMin = Math.min(start.y, end.y);\n      switch (type) {\n        case 'right':\n          move = xMax + drag.dx;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              x0: Math.max(Math.min(move, start.x), prevBrush.bounds.x0),\n              x1: Math.min(Math.max(move, start.x), prevBrush.bounds.x1),\n            },\n          };\n        case 'left':\n          move = xMin + drag.dx;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              x0: Math.min(move, end.x),\n              x1: Math.max(move, end.x),\n            },\n          };\n        case 'bottom':\n          move = yMax + drag.dy;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              y0: Math.min(move, start.y),\n              y1: Math.max(move, start.y),\n            },\n          };\n        case 'top':\n          move = yMin + drag.dy;\n          return {\n            ...prevBrush,\n            activeHandle: type,\n            extent: {\n              ...prevBrush.extent,\n              y0: Math.min(move, end.y),\n              y1: Math.max(move, end.y),\n            },\n          };\n        // BrushHandle skips corners use BrushCorner for those\n        case 'topLeft':\n        case 'topRight':\n        case 'bottomLeft':\n        case 'bottomRight':\n        default:\n          return prevBrush;\n      }\n    });\n  };\n\n  handleDragEnd = () => {\n    const { updateBrush, onBrushEnd, onBrushHandleChange, isControlled } = this.props;\n\n    if (!isControlled) {\n      updateBrush((prevBrush: BrushState) => {\n        const { start, end, extent } = prevBrush;\n        start.x = Math.min(extent.x0, extent.x1);\n        start.y = Math.min(extent.y0, extent.y0);\n        end.x = Math.max(extent.x0, extent.x1);\n        end.y = Math.max(extent.y0, extent.y1);\n        const nextBrush: BrushState = {\n          ...prevBrush,\n          start,\n          end,\n          activeHandle: null,\n          isBrushing: false,\n          extent: {\n            x0: Math.min(start.x, end.x),\n            x1: Math.max(start.x, end.x),\n            y0: Math.min(start.y, end.y),\n            y1: Math.max(start.y, end.y),\n          },\n        };\n        if (onBrushEnd) {\n          onBrushEnd(nextBrush);\n        }\n\n        return nextBrush;\n      });\n    }\n\n    if (onBrushHandleChange) {\n      onBrushHandleChange();\n    }\n  };\n\n  render() {\n    const {\n      stageWidth,\n      stageHeight,\n      brush,\n      type,\n      handle,\n      isControlled,\n      isDragInProgress,\n      renderBrushHandle,\n    } = this.props;\n    const { x, y, width, height } = handle;\n    const cursor = type === 'right' || type === 'left' ? 'ew-resize' : 'ns-resize';\n    return (\n      <Drag\n        width={stageWidth}\n        height={stageHeight}\n        onDragStart={this.handleDragStart}\n        onDragMove={this.handleDragMove}\n        onDragEnd={this.handleDragEnd}\n        resetOnStart\n        isDragging={isControlled ? isDragInProgress : undefined}\n      >\n        {({ dragStart, dragEnd, dragMove, isDragging }) => (\n          <g>\n            {/** capture mouse events while dragging */}\n            {isDragging && (\n              <rect\n                fill=\"transparent\"\n                width={stageWidth}\n                height={stageHeight}\n                style={{ cursor }}\n                onPointerMove={dragMove}\n                onPointerUp={isControlled ? undefined : dragEnd}\n                onPointerLeave={isControlled ? undefined : dragEnd}\n              />\n            )}\n            {!renderBrushHandle && (\n              <rect\n                x={x}\n                y={y}\n                width={width}\n                height={height}\n                fill=\"transparent\"\n                className={`visx-brush-handle-${type}`}\n                onPointerDown={dragStart}\n                onPointerMove={dragMove}\n                onPointerUp={isControlled ? undefined : dragEnd}\n                style={{\n                  cursor,\n                  pointerEvents: !!brush.activeHandle || !!brush.isBrushing ? 'none' : 'all',\n                }}\n              />\n            )}\n            {renderBrushHandle && (\n              <g\n                onPointerDown={dragStart}\n                onPointerMove={dragMove}\n                onPointerUp={isControlled ? undefined : dragEnd}\n              >\n                {renderBrushHandle({\n                  ...this.props.handle,\n                  height: stageHeight,\n                  className: `visx-brush-handle-${type}`,\n\n                  isBrushActive: brush.extent.x0 !== -1 && brush.extent.x1 !== -1,\n                })}\n              </g>\n            )}\n          </g>\n        )}\n      </Drag>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/visx-brush/src/BrushOverlay.tsx",
    "content": "import type { CSSProperties, PointerEvent } from 'react';\nimport { Bar } from '@visx/shape';\n\ntype BrushOverlayProps = {\n  width: number;\n  height: number;\n  style?: CSSProperties;\n  onClick?: (event: PointerEvent<SVGRectElement>) => void;\n  onDoubleClick?: (event: PointerEvent<SVGRectElement>) => void;\n  onPointerDown?: (event: PointerEvent<SVGRectElement>) => void;\n  onPointerLeave?: (event: PointerEvent<SVGRectElement>) => void;\n  onPointerMove?: (event: PointerEvent<SVGRectElement>) => void;\n  onPointerUp?: (event: PointerEvent<SVGRectElement>) => void;\n};\n\nexport default function BrushOverlay(props: BrushOverlayProps) {\n  return <Bar className=\"visx-brush-overlay\" fill=\"transparent\" x={0} y={0} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-brush/src/BrushSelection.tsx",
    "content": "/* eslint react/jsx-handler-names: 0 */\nimport { Component } from 'react';\nimport type { SVGProps, PointerEvent } from 'react';\nimport type { HandlerArgs as DragArgs } from '@visx/drag';\nimport { Drag } from '@visx/drag';\n\nimport type { BaseBrushState as BrushState, UpdateBrush } from './BaseBrush';\nimport type { BrushPageOffset, BrushingType } from './types';\nimport { getPageCoordinates } from './utils';\n\nconst DRAGGING_OVERLAY_STYLES = { cursor: 'move' };\n\ntype PointerHandler = (event: PointerEvent<SVGRectElement>) => void;\n\nexport type BrushSelectionProps = {\n  width: number;\n  height: number;\n  stageWidth: number;\n  stageHeight: number;\n  brush: BrushState;\n  updateBrush: (update: UpdateBrush) => void;\n  onMoveSelectionChange?: (type?: BrushingType, options?: BrushPageOffset) => void;\n  onBrushStart?: (brush: DragArgs) => void;\n  onBrushEnd?: (brush: BrushState) => void;\n  disableDraggingSelection: boolean;\n  onMouseLeave: PointerHandler;\n  onMouseMove: PointerHandler;\n  onMouseUp: PointerHandler;\n  onClick: PointerHandler;\n  selectedBoxStyle: SVGProps<SVGRectElement>;\n  isControlled?: boolean;\n  isDragInProgress?: boolean;\n};\n\nexport default class BrushSelection extends Component<\n  BrushSelectionProps & Omit<SVGProps<SVGRectElement>, keyof BrushSelectionProps>\n> {\n  static defaultProps = {\n    onMouseLeave: null,\n    onMouseUp: null,\n    onMouseMove: null,\n    onClick: null,\n  };\n\n  selectionDragStart = (drag: DragArgs) => {\n    const { onMoveSelectionChange, onBrushStart } = this.props;\n\n    if (onMoveSelectionChange) {\n      onMoveSelectionChange('move', getPageCoordinates(drag.event));\n    }\n    if (onBrushStart) {\n      onBrushStart(drag);\n    }\n  };\n\n  selectionDragMove = (drag: DragArgs) => {\n    const { updateBrush, isControlled } = this.props;\n\n    if (isControlled) return;\n\n    updateBrush((prevBrush: BrushState) => {\n      const { x: x0, y: y0 } = prevBrush.start;\n      const { x: x1, y: y1 } = prevBrush.end;\n      const validDx =\n        drag.dx > 0\n          ? Math.min(drag.dx, prevBrush.bounds.x1 - x1)\n          : Math.max(drag.dx, prevBrush.bounds.x0 - x0);\n\n      const validDy =\n        drag.dy > 0\n          ? Math.min(drag.dy, prevBrush.bounds.y1 - y1)\n          : Math.max(drag.dy, prevBrush.bounds.y0 - y0);\n\n      return {\n        ...prevBrush,\n        isBrushing: true,\n        extent: {\n          ...prevBrush.extent,\n          x0: x0 + validDx,\n          x1: x1 + validDx,\n          y0: y0 + validDy,\n          y1: y1 + validDy,\n        },\n      };\n    });\n  };\n\n  selectionDragEnd = () => {\n    const { updateBrush, onBrushEnd, onMoveSelectionChange, isControlled } = this.props;\n\n    if (!isControlled) {\n      updateBrush((prevBrush: BrushState) => {\n        const nextBrush = {\n          ...prevBrush,\n          isBrushing: false,\n          start: {\n            ...prevBrush.start,\n            x: Math.min(prevBrush.extent.x0, prevBrush.extent.x1),\n            y: Math.min(prevBrush.extent.y0, prevBrush.extent.y1),\n          },\n          end: {\n            ...prevBrush.end,\n            x: Math.max(prevBrush.extent.x0, prevBrush.extent.x1),\n            y: Math.max(prevBrush.extent.y0, prevBrush.extent.y1),\n          },\n        };\n        if (onBrushEnd) {\n          onBrushEnd(nextBrush);\n        }\n        return nextBrush;\n      });\n    }\n\n    if (onMoveSelectionChange) {\n      onMoveSelectionChange();\n    }\n  };\n\n  render() {\n    const {\n      width,\n      height,\n      stageWidth,\n      stageHeight,\n      brush,\n      disableDraggingSelection,\n      onMouseLeave,\n      onMouseMove,\n      onMouseUp,\n      onClick,\n      selectedBoxStyle,\n      isControlled,\n      isDragInProgress,\n    } = this.props;\n\n    return (\n      <Drag\n        width={width}\n        height={height}\n        resetOnStart\n        onDragStart={this.selectionDragStart}\n        onDragMove={this.selectionDragMove}\n        onDragEnd={this.selectionDragEnd}\n        isDragging={isControlled ? isDragInProgress : undefined}\n      >\n        {({ isDragging, dragStart, dragEnd, dragMove }) => (\n          <g>\n            {isDragging && (\n              <rect\n                width={stageWidth}\n                height={stageHeight}\n                fill=\"transparent\"\n                onPointerUp={isControlled ? undefined : dragEnd}\n                onPointerMove={dragMove}\n                onPointerLeave={isControlled ? undefined : dragEnd}\n                style={DRAGGING_OVERLAY_STYLES}\n              />\n            )}\n            <rect\n              x={Math.min(brush.extent.x0, brush.extent.x1)}\n              y={Math.min(brush.extent.y0, brush.extent.y1)}\n              width={width}\n              height={height}\n              className=\"visx-brush-selection\"\n              onPointerDown={disableDraggingSelection ? undefined : dragStart}\n              onPointerLeave={(event) => {\n                if (onMouseLeave) onMouseLeave(event);\n              }}\n              onPointerMove={(event) => {\n                dragMove(event);\n                if (onMouseMove) onMouseMove(event);\n              }}\n              onPointerUp={(event) => {\n                if (!isControlled) {\n                  dragEnd(event);\n                }\n                if (onMouseUp) onMouseUp(event);\n              }}\n              onClick={(event) => {\n                if (onClick) onClick(event as PointerEvent<SVGRectElement>);\n              }}\n              style={{\n                pointerEvents: brush.isBrushing || brush.activeHandle ? 'none' : 'all',\n                cursor: disableDraggingSelection ? undefined : 'move',\n              }}\n              {...selectedBoxStyle}\n            />\n          </g>\n        )}\n      </Drag>\n    );\n  }\n}\n"
  },
  {
    "path": "packages/visx-brush/src/index.ts",
    "content": "// @visx/brush\nexport { default as Brush } from './Brush';\n\nexport type * from './types';\nexport type { BrushProps } from './Brush';\nexport type { BaseBrushProps, BaseBrushState, UpdateBrush } from './BaseBrush';\nexport type { BrushCornerProps } from './BrushCorner';\nexport type { BrushHandleProps, BrushHandleRenderProps } from './BrushHandle';\nexport type { BrushSelectionProps } from './BrushSelection';\n"
  },
  {
    "path": "packages/visx-brush/src/types.ts",
    "content": "import type { D3Scale, NumberLike } from '@visx/scale';\n\nexport type Point = {\n  x: number;\n  y: number;\n};\n\nexport type Bounds = {\n  x0: number;\n  x1: number;\n  xValues?: unknown[];\n  y0: number;\n  y1: number;\n  yValues?: unknown[];\n};\n\nexport interface MarginShape {\n  top?: number;\n  left?: number;\n  right?: number;\n  bottom?: number;\n}\n\nexport interface BrushShape extends BrushStartEnd {\n  extent: Bounds;\n  bounds: Bounds;\n}\n\nexport interface BrushStartEnd {\n  start: Point;\n  end: Point;\n}\n\nexport interface PartialBrushStartEnd {\n  start: Partial<Point>;\n  end: Partial<Point>;\n}\n\nexport type ResizeTriggerAreas =\n  | 'left'\n  | 'right'\n  | 'top'\n  | 'bottom'\n  | 'topLeft'\n  | 'topRight'\n  | 'bottomLeft'\n  | 'bottomRight';\n\nexport type BrushingType = 'move' | 'select' | ResizeTriggerAreas;\nexport type BrushPageOffset = {\n  pageX?: number;\n  pageY?: number;\n};\n\n// In order to plot values on a brush, output of the scale must be number.\n// Some scales return undefined.\ntype BrushScaleOutput = number | NumberLike | undefined;\n\n/** A catch-all type for scales that are compatible with axis */\nexport type Scale<Output extends BrushScaleOutput = BrushScaleOutput> =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  D3Scale<Output, any, any>;\n"
  },
  {
    "path": "packages/visx-brush/src/utils.ts",
    "content": "import type { MouseTouchOrPointerEvent } from '@visx/drag';\nimport type { PointerEvent } from 'react';\nimport type { Scale } from './types';\n\nexport function scaleInvert(scale: Scale, value: number) {\n  // Test if the scale is an ordinalScale or not,\n  // Since an ordinalScale doesn't support invert function.\n  if ('invert' in scale && typeof scale.invert !== 'undefined') {\n    return scale.invert(value).valueOf();\n  }\n  const [start, end] = scale.range() as number[];\n  let i = 0;\n  // ordinal should have step\n  const step = 'step' in scale && typeof scale.step !== 'undefined' ? scale.step() : 1;\n  const width = (step * (end - start)) / Math.abs(end - start);\n  if (width > 0) {\n    while (value > start + width * (i + 1)) {\n      i += 1;\n    }\n  } else {\n    while (value < start + width * (i + 1)) {\n      i += 1;\n    }\n  }\n\n  return i;\n}\n\nexport function getDomainFromExtent(\n  scale: Scale,\n  start: number,\n  end: number,\n  tolerentDelta: number,\n) {\n  let domain;\n  const invertedStart = scaleInvert(scale, start + (start < end ? -tolerentDelta : tolerentDelta));\n  const invertedEnd = scaleInvert(scale, end + (end < start ? -tolerentDelta : tolerentDelta));\n  const minValue = Math.min(invertedStart, invertedEnd);\n  const maxValue = Math.max(invertedStart, invertedEnd);\n  if ('invert' in scale && typeof scale.invert !== 'undefined') {\n    domain = {\n      start: minValue,\n      end: maxValue,\n    };\n  } else {\n    const values = [];\n    const scaleDomain = scale.domain();\n    for (let i = minValue; i <= maxValue; i += 1) {\n      values.push(scaleDomain[i]);\n    }\n    domain = {\n      values,\n    };\n  }\n\n  return domain;\n}\n\nexport function getPageCoordinates(event: MouseTouchOrPointerEvent) {\n  if (typeof window !== 'undefined' && window.TouchEvent && event instanceof TouchEvent) {\n    return {\n      pageX: event.touches[0].pageX,\n      pageY: event.touches[0].pageY,\n    };\n  }\n  const pointerEvent = event as PointerEvent;\n  return {\n    pageX: pointerEvent.pageX,\n    pageY: pointerEvent.pageY,\n  };\n}\n\n// Tweaked from https://dev.to/cantem/how-to-write-a-debounce-function-1bdf\nexport function debounce<T extends Function>(func: T, delay: number): (...args: any[]) => void {\n  let timeoutId: ReturnType<typeof setTimeout>;\n  return function debouncedFn(this: unknown, ...args: unknown[]) {\n    clearTimeout(timeoutId);\n    timeoutId = setTimeout(() => {\n      func.apply(this, args);\n    }, delay);\n  };\n}\n"
  },
  {
    "path": "packages/visx-brush/test/Brush.test.tsx",
    "content": "import { Brush } from '../src';\n\ndescribe('<Brush />', () => {\n  test('it should be defined', () => {\n    expect(Brush).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-brush/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-brush/test/utils.test.ts",
    "content": "import { createScale } from '@visx/scale';\nimport { getDomainFromExtent, scaleInvert } from '../src/utils';\n\ndescribe('getDomainFromExtent()', () => {\n  test('it should return { start, end } if scale.invert', () => {\n    const scale = createScale({ domain: [0, 10], range: [2, 4] });\n    const start = 0;\n    const end = 1;\n    const tolerentDelta = 0.5;\n    const result = getDomainFromExtent(scale, start, end, tolerentDelta);\n    expect(result.start).toBeDefined();\n    expect(result.end).toBeDefined();\n    expect(result.start).toEqual(scale.invert(start - tolerentDelta));\n    expect(result.end).toEqual(scale.invert(end + tolerentDelta));\n  });\n\n  test('it should handle start > end', () => {\n    const scale = createScale({ domain: [0, 10], range: [2, 4] });\n    const start = 1;\n    const end = 0;\n    const tolerentDelta = 0.5;\n    const result = getDomainFromExtent(scale, start, end, tolerentDelta);\n    expect(result.start).toEqual(scale.invert(end - tolerentDelta));\n    expect(result.end).toEqual(scale.invert(start + tolerentDelta));\n  });\n\n  test('it should return { values } for band scales', () => {\n    const scale = createScale({\n      type: 'band',\n      domain: ['a', 'b', 'c'],\n      range: [1.1, 3.5],\n      round: false,\n    });\n    const domain = scale.domain();\n    const start = 0;\n    const end = 1;\n    const tolerentDelta = 0.5;\n    const result = getDomainFromExtent(scale, start, end, tolerentDelta);\n    expect(result.values).toBeDefined();\n    expect(result.values).toEqual([domain[0]]);\n  });\n});\n\ndescribe('scaleInvert()', () => {\n  test('it should return scale.invert(value) if scale.invert', () => {\n    const scale = createScale({ domain: [0, 10], range: [2, 4] });\n    const value = 3;\n    const result = scaleInvert(scale, value);\n    expect(result).toEqual(scale.invert(value));\n  });\n\n  test('it should return the index of domain item for scales without invert (like band)', () => {\n    const scale = createScale({\n      type: 'band',\n      domain: ['a', 'b', 'c'],\n      range: [1.1, 3.5],\n      round: false,\n    });\n    const value = 3;\n    const result = scaleInvert(scale, value);\n    expect(result).toBe(2);\n  });\n\n  test('it should handle band scales where end < start', () => {\n    const scale = createScale({\n      type: 'band',\n      domain: ['a', 'b', 'c'],\n      range: [20, 1],\n      round: false,\n    });\n    const value = 3;\n    const result = scaleInvert(scale, value);\n    expect(result).toBe(2);\n  });\n});\n"
  },
  {
    "path": "packages/visx-brush/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-drag\"\n    },\n    {\n      \"path\": \"../visx-event\"\n    },\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-brush/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/brush',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-brush/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/brush': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-chord/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-chord/Readme.md",
    "content": "# @visx/chord\n\n<a title=\"@visx/chord npm downloads\" href=\"https://www.npmjs.com/package/@visx/chord\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/chord.svg?style=flat-square\" />\n</a>\n\nChord diagrams show directed relationships among a group of entities in a radial layout.\n\n## Installation\n\n```\nnpm install --save @visx/chord\n```\n"
  },
  {
    "path": "packages/visx-chord/package.json",
    "content": "{\n  \"name\": \"@visx/chord\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx group\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\",\n    \"svg\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/d3-chord\": \"^1.0.9\",\n    \"@types/react\": \"*\",\n    \"classnames\": \"^2.3.1\",\n    \"d3-chord\": \"^1.0.4\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-chord/src/Chord.tsx",
    "content": "import type { ReactNode } from 'react';\nimport type { Chords } from 'd3-chord';\nimport { chord as d3chord } from 'd3-chord';\n\ntype DefaultSortComporator = (a: number, b: number) => number;\n\nexport type ChordProps = {\n  /** Square data matrix of size n×n, where the matrix represents the directed flow amongst a network (a complete digraph) of `n` nodes. The given matrix must be an array of length `n`, where each element `matrix[i]` is an array of `n` numbers, where each `matrix[i][j]` represents the flow from the `ith` node in the network to the `jth` node. Each number `matrix[i][j]` must be nonnegative, though it can be zero if there is no flow from node `i` to node `j`. */\n  matrix: number[][];\n  /** Sets the pad angle between adjacent groups to the specified number in radians. */\n  padAngle?: number;\n  /** Comparator used to sort the groups by their total outflow. */\n  sortGroups?: DefaultSortComporator | null;\n  /** Comparator used to sort the subgroups corresponding to `matrix[i][0 … n - 1]` for a given group i by their total outflow. */\n  sortSubgroups?: DefaultSortComporator | null;\n  /** Comparator used to sort the chords by their combined flow; this only affects the `z-order` of the chords. */\n  sortChords?: DefaultSortComporator | null;\n  /** Child render function, passed the configured chords. */\n  children: (chords: { chords: Chords }) => ReactNode;\n};\n\nexport default function Chord({\n  matrix,\n  padAngle,\n  sortGroups,\n  sortSubgroups,\n  sortChords,\n  children,\n}: ChordProps) {\n  const chord = d3chord();\n  if (padAngle) chord.padAngle(padAngle);\n  if (sortGroups) chord.sortGroups(sortGroups);\n  if (sortSubgroups) chord.sortSubgroups(sortSubgroups);\n  if (sortChords) chord.sortChords(sortChords);\n  const chords = chord(matrix);\n  if (children) return <>{children({ chords })}</>;\n\n  // so react-docgen picks it up\n  return <g />;\n}\n"
  },
  {
    "path": "packages/visx-chord/src/Ribbon.tsx",
    "content": "import type { SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Chord, ChordSubgroup } from 'd3-chord';\nimport { ribbon as d3ribbon } from 'd3-chord';\n\ntype NumAccessor = (d: ChordSubgroup) => number;\n\nexport type RibbonProps = {\n  /** Chord for which to render a ribbon. */\n  chord: Chord;\n  /** Sets the source accessor (defaults to chord.source). */\n  source?: (d: Chord) => ChordSubgroup;\n  /** Sets the target accessor (defaults to chord.source). */\n  target?: (d: Chord) => ChordSubgroup;\n  /** Sets the radius or radius accessor for the ribbon generator. */\n  radius?: number | NumAccessor;\n  /** Sets the start angle or start angle accessor for the ribbon generator. */\n  startAngle?: number | NumAccessor;\n  /** Sets the end angle or end angle accessor for the ribbon generator. */\n  endAngle?: number | NumAccessor;\n  /** Override the default rendering of a chord `<path />`. */\n  children?: ({ path }: { path: string | null }) => string | undefined;\n  /** Classname to apply to the rendered `<path />`. */\n  className?: string;\n};\n\n/** This is a workaround for TypeScript not inferring the correct method overload */\nfunction setNumberOrNumberAccessor(\n  func: (d: number | NumAccessor) => void,\n  value: number | NumAccessor,\n) {\n  if (typeof value === 'number') func(value);\n  else func(value);\n}\n\nexport default function Ribbon({\n  chord,\n  source,\n  target,\n  radius,\n  startAngle,\n  endAngle,\n  children,\n  className,\n  ...restProps\n}: Omit<SVGProps<SVGPathElement>, keyof RibbonProps> & RibbonProps) {\n  const ribbon = d3ribbon<unknown, Chord, ChordSubgroup>();\n  if (source) ribbon.source(source);\n  if (target) ribbon.target(target);\n  if (radius) setNumberOrNumberAccessor(ribbon.radius, radius);\n  if (startAngle) setNumberOrNumberAccessor(ribbon.startAngle, startAngle);\n  if (endAngle) setNumberOrNumberAccessor(ribbon.endAngle, endAngle);\n  const path = ribbon(chord) as unknown as string | null;\n  if (children) return <>{children({ path })}</>;\n\n  return <path className={cx('visx-ribbon', className)} d={path || ''} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-chord/src/index.ts",
    "content": "// @visx/chord\nexport { default as Chord } from './Chord';\nexport { default as Ribbon } from './Ribbon';\n\nexport type { ChordProps } from './Chord';\nexport type { RibbonProps } from './Ribbon';\n"
  },
  {
    "path": "packages/visx-chord/test/Chord.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport { Chord } from '../src';\n\nconst matrix = [\n  [11975, 5871, 8916, 2868],\n  [1951, 10048, 2060, 6171],\n  [8010, 16145, 8090, 8045],\n  [1013, 990, 940, 6907],\n];\n\ndescribe('<Chord />', () => {\n  test('it should be defined', () => {\n    expect(Chord).toBeDefined();\n  });\n\n  test('it should call children as a function with required args', () => {\n    const children = vi.fn();\n    render(<Chord matrix={matrix} children={children} />);\n    expect(children.mock.calls).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-chord/test/Ribbon.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport { chord as d3Chord } from 'd3-chord';\nimport { Ribbon } from '../src';\n\nconst matrix = [\n  [11975, 5871, 8916, 2868],\n  [1951, 10048, 2060, 6171],\n  [8010, 16145, 8090, 8045],\n  [1013, 990, 940, 6907],\n];\n\nconst chords = d3Chord()(matrix);\n\ndescribe('<Ribbon />', () => {\n  test('it should be defined', () => {\n    expect(Ribbon).toBeDefined();\n  });\n\n  test('it should call children as a function with required args', () => {\n    const children = vi.fn(() => 'test');\n    render(<Ribbon chord={chords[0]} children={children} />);\n    const args = (children.mock.calls[0] as { path?: unknown }[])[0];\n    expect(children.mock.calls).toHaveLength(1);\n    expect(args.path).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-chord/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-chord/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-chord/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/chord',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-chord/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/chord': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-clip-path/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-clip-path/Readme.md",
    "content": "# @visx/clip-path\n\n<a title=\"@visx/clip-path npm downloads\" href=\"https://www.npmjs.com/package/@visx/clip-path\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/clip-path.svg?style=flat-square\" />\n</a>\n\nReact utilities for defining `<clipPath>` SVG elements, with or without data, to be clip masks for\nother SVG elements by using their `clip-path` property.\n\n## Installation\n\n```\nnpm install --save @visx/clip-path\n```\n"
  },
  {
    "path": "packages/visx-clip-path/package.json",
    "content": "{\n  \"name\": \"@visx/clip-path\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx clip-path\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\",\n    \"svg\"\n  ],\n  \"author\": \"Chris Williams @williaster\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/react\": \"*\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-clip-path/src/clip-paths/CircleClipPath.tsx",
    "content": "import type { SVGProps } from 'react';\nimport ClipPath from './ClipPath';\n\nexport type CircleClipPathProps = {\n  /** Unique id for the clipPath. */\n  id: string;\n  /** x position of the center of the ClipPath circle. */\n  cx?: string | number;\n  /** y position of the center of the ClipPath circle. */\n  cy?: string | number;\n  /** radius of the ClipPath circle. */\n  r?: string | number;\n};\n\n/** ClipPath for clipping to the shape of a `<circle />`, pass any `<circle />` props you want. */\nexport default function CircleClipPath({\n  id,\n  cx,\n  cy,\n  r,\n  ...restProps\n}: CircleClipPathProps & Omit<SVGProps<SVGCircleElement>, keyof CircleClipPathProps>) {\n  return (\n    <ClipPath id={id}>\n      <circle cx={cx} cy={cy} r={r} {...restProps} />\n    </ClipPath>\n  );\n}\n"
  },
  {
    "path": "packages/visx-clip-path/src/clip-paths/ClipPath.tsx",
    "content": "import type { SVGProps, ReactNode } from 'react';\n\nexport type ClipPathProps = {\n  /** Unique id for the clipPath. */\n  id: string;\n  /** clipPath children. */\n  children?: ReactNode;\n};\n\n/** Handles rendering of <defs> and <clipPath> elements for you, with any children you want. */\nexport default function ClipPath({\n  id,\n  children,\n  ...restProps\n}: ClipPathProps & Omit<SVGProps<SVGClipPathElement>, keyof ClipPathProps>) {\n  return (\n    <defs>\n      <clipPath id={id} {...restProps}>\n        {children}\n      </clipPath>\n    </defs>\n  );\n}\n"
  },
  {
    "path": "packages/visx-clip-path/src/clip-paths/RectClipPath.tsx",
    "content": "import type { SVGProps } from 'react';\nimport ClipPath from './ClipPath';\n\nexport type RectClipPathProps = {\n  /** Unique id for the clipPath. */\n  id: string;\n  /** x position of the ClipPath rect. */\n  x?: string | number;\n  /** y position of the ClipPath rect. */\n  y?: string | number;\n  /** width of the ClipPath rect. */\n  width?: string | number;\n  /** height of the ClipPath rect. */\n  height?: string | number;\n};\n\nexport default function RectClipPath({\n  id,\n  x = 0,\n  y = 0,\n  width = 1,\n  height = 1,\n  ...restProps\n}: RectClipPathProps & Omit<SVGProps<SVGRectElement>, keyof RectClipPathProps>) {\n  return (\n    <ClipPath id={id}>\n      <rect x={x} y={y} width={width} height={height} {...restProps} />\n    </ClipPath>\n  );\n}\n"
  },
  {
    "path": "packages/visx-clip-path/src/index.ts",
    "content": "// @visx/clip-path\nexport { default as ClipPath } from './clip-paths/ClipPath';\nexport { default as CircleClipPath } from './clip-paths/CircleClipPath';\nexport { default as RectClipPath } from './clip-paths/RectClipPath';\n"
  },
  {
    "path": "packages/visx-clip-path/test/ClipPaths.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { ClipPath, CircleClipPath, RectClipPath } from '../src';\n\ndescribe('ClipPath Components', () => {\n  // Suppress console warnings about SVG casing since this is expected\n  beforeAll(() => {\n    vi.spyOn(console, 'error').mockImplementation(() => {});\n  });\n\n  afterAll(() => {\n    vi.restoreAllMocks();\n  });\n\n  describe('<ClipPath />', () => {\n    test('it should be defined', () => {\n      expect(ClipPath).toBeDefined();\n    });\n\n    test('it should render defs and clipPath elements', () => {\n      const { container } = render(<ClipPath id=\"test\" />);\n      const defs = container.querySelector('defs');\n      const clipPath = container.querySelector('clippath');\n\n      expect(defs).toBeInTheDocument();\n      expect(clipPath).toBeInTheDocument();\n    });\n\n    test('it should assign the passed id to the clipPath', () => {\n      const { container } = render(<ClipPath id=\"best_clip\" />);\n      const clipPath = container.querySelector('clippath');\n      expect(clipPath).toBeInTheDocument();\n      expect(clipPath).toHaveAttribute('id', 'best_clip');\n    });\n\n    test('it should render children', () => {\n      const { container } = render(\n        <ClipPath id=\"test\">\n          <circle r={5} />\n        </ClipPath>,\n      );\n      const circle = container.querySelector('clippath > circle');\n      expect(circle).toBeInTheDocument();\n      expect(circle).toHaveAttribute('r', '5');\n    });\n  });\n\n  describe('<RectClipPath />', () => {\n    test('it should be defined', () => {\n      expect(RectClipPath).toBeDefined();\n    });\n\n    test('it should render a rect', () => {\n      const { container } = render(<RectClipPath id=\"test\" />);\n      const rect = container.querySelector('clippath > rect');\n      expect(rect).toBeInTheDocument();\n    });\n\n    test('it should pass props to the rect', () => {\n      const { container } = render(\n        <RectClipPath id=\"test\" width={100} height={200} x={10} y={20} />,\n      );\n      const rect = container.querySelector('clippath > rect');\n      expect(rect).toBeInTheDocument();\n      expect(rect).toHaveAttribute('width', '100');\n      expect(rect).toHaveAttribute('height', '200');\n      expect(rect).toHaveAttribute('x', '10');\n      expect(rect).toHaveAttribute('y', '20');\n    });\n  });\n\n  describe('<CircleClipPath />', () => {\n    test('it should be defined', () => {\n      expect(CircleClipPath).toBeDefined();\n    });\n\n    test('it should render a circle', () => {\n      const { container } = render(<CircleClipPath id=\"test\" />);\n      const circle = container.querySelector('clippath > circle');\n      expect(circle).toBeInTheDocument();\n    });\n\n    test('it should pass props to the circle', () => {\n      const { container } = render(<CircleClipPath id=\"test\" r={50} cx={100} cy={200} />);\n      const circle = container.querySelector('clippath > circle');\n      expect(circle).toBeInTheDocument();\n      expect(circle).toHaveAttribute('r', '50');\n      expect(circle).toHaveAttribute('cx', '100');\n      expect(circle).toHaveAttribute('cy', '200');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-clip-path/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-clip-path/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-clip-path/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/clip-path',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-clip-path/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/clip-path': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-curve/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-curve/Readme.md",
    "content": "# @visx/curve\n\n<a title=\"@visx/curve npm downloads\" href=\"https://www.npmjs.com/package/@visx/curve\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/curve.svg?style=flat-square\" />\n</a>\n\n## Installation\n\n```\nnpm install --save @visx/curve\n```\n\n## Overview\n\nThe `@visx/curve` package is a wrapper of the [d3-shape](https://github.com/d3/d3-shape) curve\nfunctions. A `curve` is a function that can be passed into other `visx` objects that draw lines or\npaths, such as a `LinePath`, to change the way the line between points is drawn. Click on the\nexample below for an interactive way to explore curve aesthetics.\n\nAny function with the prefix `curve` in `d3` can be used through `visx` like so:\n\n```javascript\nimport { curveCatmullRomOpen } from '@visx/curve';\nlet line = (<Shape.LinePath curve={curveCatmullRomOpen} />)\n\n// or if you want namespace all Curves under the `Curve`\nimport * as Curve from `@visx/curve`;\nlet line = (<Shape.LinePath curve={Curve.curveCatmullRomOpen} />)\n```\n\n## Functions\n\n| visx                  | d3                                                                            |\n| --------------------- | ----------------------------------------------------------------------------- |\n| curveBasis            | [curveBasis](https://github.com/d3/d3-shape#curveBasis)                       |\n| curveBasisClose       | [curveBasisClosed](https://github.com/d3/d3-shape#curveBasisClosed)           |\n| curveBasisOpen        | [curveBasisOpen](https://github.com/d3/d3-shape#curveBasisOpen)               |\n| curveStep             | [curveStep](https://github.com/d3/d3-shape#curveStep)                         |\n| curveStepAfter        | [curveStepAfter](https://github.com/d3/d3-shape#curveStepAfter)               |\n| curveStepBefore       | [curveStepbefore](https://github.com/d3/d3-shape#curveStepBefore)             |\n| curveBundle           | [curveBundle](https://github.com/d3/d3-shape#curveBundle)                     |\n| curveLinear           | [curveLinear](https://github.com/d3/d3-shape#curveLinear)                     |\n| curveLinearClosed     | [curveLinearClosed](https://github.com/d3/d3-shape#curveLinearClosed)         |\n| curveMonotoneX        | [curveMonotoneX](https://github.com/d3/d3-shape#curveMonotoneX)               |\n| curveMonotoneY        | [curveMonotoneY](https://github.com/d3/d3-shape#curveMonotoneY)               |\n| curveCardinal         | [curveCardinal](https://github.com/d3/d3-shape#curveCardinal)                 |\n| curveCardinalClosed   | [curveCardinalClosed](https://github.com/d3/d3-shape#curveCardinalClosed)     |\n| curveCardinalOpen     | [curveCardinalOpen](https://github.com/d3/d3-shape#curveCardinalOpen)         |\n| curveCatmullRom       | [curveCatmullRom](https://github.com/d3/d3-shape#curveCatmullRom)             |\n| curveCatmullRomClosed | [curveCatmullRomClosed](https://github.com/d3/d3-shape#curveCatmullRomClosed) |\n| curveCatmullRomOpen   | [curveCatmullRomOpen](https://github.com/d3/d3-shape#curveCatmullRomOpen)     |\n| curveNatural          | [curveNatural](https://github.com/d3/d3-shape#curveNatural)                   |\n"
  },
  {
    "path": "packages/visx-curve/package.json",
    "content": "{\n  \"name\": \"@visx/curve\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx curve\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"repository\": \"https://github.com/airbnb/visx\",\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualization\",\n    \"chart\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@visx/vendor\": \"workspace:*\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-curve/src/index.ts",
    "content": "// @visx/curve\nexport {\n  curveBasis,\n  curveBasisClosed,\n  curveBasisOpen,\n  curveStep,\n  curveStepAfter,\n  curveStepBefore,\n  curveBundle,\n  curveLinear,\n  curveLinearClosed,\n  curveCardinal,\n  curveCardinalClosed,\n  curveCardinalOpen,\n  curveCatmullRom,\n  curveCatmullRomClosed,\n  curveCatmullRomOpen,\n  curveMonotoneX,\n  curveMonotoneY,\n  curveNatural,\n} from '@visx/vendor/d3-shape';\n"
  },
  {
    "path": "packages/visx-curve/test/curve.test.ts",
    "content": "import {\n  curveBasis,\n  curveBasisClosed,\n  curveBasisOpen,\n  curveStep,\n  curveStepAfter,\n  curveStepBefore,\n  curveBundle,\n  curveLinear,\n  curveLinearClosed,\n  curveCardinal,\n  curveCardinalClosed,\n  curveCardinalOpen,\n  curveCatmullRom,\n  curveCatmullRomClosed,\n  curveCatmullRomOpen,\n  curveMonotoneX,\n  curveMonotoneY,\n  curveNatural,\n} from '../src';\n\ndescribe('curves', () => {\n  test('curveBasis', () => {\n    expect(curveBasis).toBeDefined();\n  });\n\n  test('curveBasisClosed', () => {\n    expect(curveBasisClosed).toBeDefined();\n  });\n\n  test('curveBasisOpen', () => {\n    expect(curveBasisOpen).toBeDefined();\n  });\n\n  test('curveStep', () => {\n    expect(curveStep).toBeDefined();\n  });\n\n  test('curveStepAfter', () => {\n    expect(curveStepAfter).toBeDefined();\n  });\n\n  test('curveStepBefore', () => {\n    expect(curveStepBefore).toBeDefined();\n  });\n\n  test('curveBundle', () => {\n    expect(curveBundle).toBeDefined();\n  });\n\n  test('curveLinear', () => {\n    expect(curveLinear).toBeDefined();\n  });\n\n  test('curveLinearClosed', () => {\n    expect(curveLinearClosed).toBeDefined();\n  });\n\n  test('curveCardinal', () => {\n    expect(curveCardinal).toBeDefined();\n  });\n\n  test('curveCardinalClosed', () => {\n    expect(curveCardinalClosed).toBeDefined();\n  });\n\n  test('curveCardinalOpen', () => {\n    expect(curveCardinalOpen).toBeDefined();\n  });\n\n  test('curveCatmullRom', () => {\n    expect(curveCatmullRom).toBeDefined();\n  });\n\n  test('curveCatmullRomClosed', () => {\n    expect(curveCatmullRomClosed).toBeDefined();\n  });\n\n  test('curveCatmullRomOpen', () => {\n    expect(curveCatmullRomOpen).toBeDefined();\n  });\n\n  test('curveMonotoneX', () => {\n    expect(curveMonotoneX).toBeDefined();\n  });\n\n  test('curveMonotoneY', () => {\n    expect(curveMonotoneY).toBeDefined();\n  });\n\n  test('curveNatural', () => {\n    expect(curveNatural).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-curve/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-curve/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-curve/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/curve',\n    globals: true,\n    environment: 'node',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-curve/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/curve': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-delaunay/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-delaunay/Readme.md",
    "content": "# @visx/delaunay\n\n<a title=\"@visx/delaunay npm downloads\" href=\"https://www.npmjs.com/package/@visx/delaunay\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/delaunay.svg?style=flat-square\" />\n</a>\n\n## Overview\n\nA Voronoi diagram partitions a two-dimensional plane into regions based on a set of input points.\nEach unique input point maps to a corresponding region, where each region represents _all points\nthat are closer to the input point than to any other input point_.\n\nNot only are Voronoi diagrams 😍, but they can be used to\n[improve the interactive experience of a visualization](https://www.visualcinnamon.com/2015/07/voronoi.html).\nThis is most often accomplished by overlaying an invisible voronoi grid on top of the visualization\nto increase the target area of interaction sites such as points on a scatter plot.\n\nThe `@visx/delaunay` package provides a wrapper around the existing\n[d3-delaunay](https://github.com/d3/d3-delaunay) package with some `react`-specific utilities.\n\n## Installation\n\n```\nnpm install --save @visx/delaunay\n```\n\n## Usage\n\nThe `@visx/delaunay` package exports a wrapped version of the d3 `voronoi` and `delaunay` layouts for flexible usage,\nas well as a `<Polygon />` component for rendering Voronoi and Delaunay regions.\n\n```js\nimport { voronoi, Polygon } from '@visx/delaunay';\n\nconst points = Array(n).fill(null).map(() => ({\n  x: Math.random() * innerWidth,\n  y: Math.random() * innerHeight,\n}));\n\n// width + height set an extent on the voronoi\n// x + y set relevant accessors depending on the shape of your data\nconst voronoiDiagram = voronoi({\n  data: points,\n  x: d => d.x,\n  y: d => d.y,\n  width,\n  height,\n});\n\nconst polygons = Array.from(voronoiDiagram.cellPolygons());\n\nreturn (\n  <svg>\n    <Group>\n      {polygons.map((polygon) => (\n        <Polygon key={...} polygon={polygon} />\n      ))}\n      {points.map(({ x, y }) => (\n        <circle key={...} cx={x} cy={y} />\n      )}\n    </Group>\n  </svg>\n)\n```\n\nAdditional information about the voronoi diagram API can be found in the\n[d3-delaunay documentation](https://github.com/d3/d3-delaunay#voronoi).\n"
  },
  {
    "path": "packages/visx-delaunay/package.json",
    "content": "{\n  \"name\": \"@visx/delaunay\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx delaunay\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@SheaJanke\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-delaunay/src/components/Polygon.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\n\nexport type PolygonProps = {\n  /** Override render function which is provided polygon and generated path. */\n  children?: ({ path, polygon }: { path: string; polygon: [number, number][] }) => ReactNode;\n  /** className to apply to path element. */\n  className?: string;\n  /** Array of coordinate arrays for the polygon (e.g., [[x,y], [x1,y1], ...]), used to generate polygon path. */\n  polygon?: [number, number][];\n};\n\nexport default function Polygon({\n  polygon,\n  className,\n  children,\n  ...restProps\n}: PolygonProps & Omit<SVGProps<SVGPathElement>, keyof PolygonProps>) {\n  if (!polygon) return null;\n  const path = `M${polygon.join('L')}Z`;\n  if (children) return <>{children({ path, polygon })}</>;\n\n  return <path className={cx('visx-delaunay-polygon', className)} d={path} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-delaunay/src/delaunay.ts",
    "content": "import { Delaunay } from '@visx/vendor/d3-delaunay';\n\ninterface Config<Datum> {\n  /** The data for the delaunay triangulation */\n  data?: Datum[];\n  /** Set the x-value accessor function for the delaunay triangulation. */\n  x: (d: Datum) => number;\n  /** Set the y-value accessor function for the delaunay triangulation. */\n  y: (d: Datum) => number;\n}\n\n/**\n * Returns a configured d3 delaunay triangulation. See d3-delaunay for the complete API reference.\n */\nexport default function delaunay<Datum>({ data = [], x, y }: Config<Datum>) {\n  return Delaunay.from(data, x, y);\n}\n"
  },
  {
    "path": "packages/visx-delaunay/src/index.ts",
    "content": "// @visx/delaunay\nexport { default as delaunay } from './delaunay';\nexport { default as voronoi } from './voronoi';\nexport { default as Polygon } from './components/Polygon';\n"
  },
  {
    "path": "packages/visx-delaunay/src/voronoi.ts",
    "content": "import { Delaunay } from '@visx/vendor/d3-delaunay';\n\nconst CLIP_PADDING = 1;\n\ninterface Config<Datum> {\n  /** The data for the voronoi diagram */\n  data?: Datum[];\n  /** The total width of the voronoi diagram. */\n  width?: number;\n  /** The total width of the voronoi diagram. */\n  height?: number;\n  /** Set the x-value accessor function for the voronoi diagram. */\n  x: (d: Datum) => number;\n  /** Set the y-value accessor function for the voronoi diagram. */\n  y: (d: Datum) => number;\n}\n\n/**\n * Returns a configured d3 voronoi diagram for the given data. See d3-delaunay\n * for the complete API reference.\n */\nexport default function voronoi<Datum>({ data = [], width = 0, height = 0, x, y }: Config<Datum>) {\n  const delaunay = Delaunay.from(data, x, y);\n  return delaunay.voronoi([\n    -CLIP_PADDING,\n    -CLIP_PADDING,\n    width + CLIP_PADDING,\n    height + CLIP_PADDING,\n  ]);\n}\n"
  },
  {
    "path": "packages/visx-delaunay/test/Polygon.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom'; // Added this import\nimport { Polygon } from '../src';\n\ndescribe('<Polygon />', () => {\n  const polygon: [number, number][] = new Array(3).fill(null).map((_, i) => [i, i]);\n\n  const props = { polygon };\n\n  test('it should be defined', () => {\n    expect(Polygon).toBeDefined();\n  });\n\n  test('it should not render without a polygon', () => {\n    const { container } = render(<Polygon />);\n    expect(container.firstChild).toBeNull();\n  });\n\n  test('it should render a path', () => {\n    const { container } = render(\n      <svg>\n        <Polygon {...props} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path).toBeInTheDocument();\n  });\n\n  test('it should set a d attribute based on the polygon prop', () => {\n    const { container } = render(\n      <svg>\n        <Polygon {...props} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path?.getAttribute('d')).toBe('M0,0L1,1L2,2Z');\n  });\n\n  test('it should add extra (non-func) props to the path element', () => {\n    const { container } = render(\n      <svg>\n        <Polygon {...props} fill=\"orange\" />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path?.getAttribute('fill')).toBe('orange');\n  });\n});\n"
  },
  {
    "path": "packages/visx-delaunay/test/delaunay.test.ts",
    "content": "import { delaunay } from '../src';\n\nconst data = [\n  { x: 10, y: 10 },\n  { x: 10, y: 20 },\n  { x: 20, y: 20 },\n  { x: 20, y: 10 },\n];\n\ndescribe('delaunay', () => {\n  test('it should be defined', () => {\n    expect(delaunay).toBeDefined();\n  });\n\n  test('it should find closest point', () => {\n    const delaunayDiagram = delaunay({ data, x: (d) => d.x, y: (d) => d.y });\n    expect(delaunayDiagram.find(9, 11)).toBe(0);\n    expect(delaunayDiagram.find(11, 19)).toBe(1);\n    expect(delaunayDiagram.find(21, 19)).toBe(2);\n  });\n\n  test('the delaunay triagulation of a square should contain two triangles', () => {\n    const delaunayDiagram = delaunay({ data, x: (d) => d.x, y: (d) => d.y });\n    expect(Array.from(delaunayDiagram.trianglePolygons())).toHaveLength(2);\n  });\n});\n"
  },
  {
    "path": "packages/visx-delaunay/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-delaunay/test/voronoi.test.ts",
    "content": "import { voronoi } from '../src';\n\nconst x = () => 123;\nconst y = () => 123;\n\ndescribe('voronoi', () => {\n  test('it should be defined', () => {\n    expect(voronoi).toBeDefined();\n  });\n\n  test('width and height params should define extent', () => {\n    const width = 17;\n    const height = 99;\n    const v = voronoi({ width, height, x, y });\n    expect(v.xmin).toBe(-1);\n    expect(v.ymin).toBe(-1);\n    expect(v.xmax).toEqual(width + 1);\n    expect(v.ymax).toEqual(height + 1);\n  });\n\n  test('100 random points should give 100 cell polygons', () => {\n    const data = new Array(100).fill(null).map(() => ({\n      x: Math.random(),\n      y: Math.random(),\n    }));\n    const v = voronoi({ data, x: (d) => d.x, y: (d) => d.y });\n    expect(Array.from(v.cellPolygons())).toHaveLength(100);\n  });\n});\n"
  },
  {
    "path": "packages/visx-delaunay/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-delaunay/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/delaunay',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-delaunay/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/delaunay': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-demo/.gitignore",
    "content": ".vercel\n.next\nout/\n"
  },
  {
    "path": "packages/visx-demo/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-demo/Readme.md",
    "content": "# @visx/demo\n\n<a href=\"https://airbnb.io/visx/gallery\">https://airbnb.io/visx/gallery</a>\n\n<p align=\"center\">\n  <a href=\"https://airbnb.io/visx/gallery\">\n    <img src=\"/assets/visx-gallery.png\" />\n  </a>\n</p>\n"
  },
  {
    "path": "packages/visx-demo/next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/image-types/global\" />\n/// <reference path=\"./.next/types/routes.d.ts\" />\n\n// NOTE: This file should not be edited\n// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.\n"
  },
  {
    "path": "packages/visx-demo/next.config.js",
    "content": "const nextConfig = {\n  output: 'export',\n  typescript: {\n    // enable rendering when there are type errors\n    ignoreBuildErrors: true,\n  },\n  eslint: {\n    // Don't run ESLint during builds (it's run at the root level)\n    ignoreDuringBuilds: true,\n  },\n  // Transpile visx packages during production builds.\n  // TypeScript project references cause Next.js webpack to resolve to source files,\n  // so we need to transpile them with SWC (same as dev mode does automatically).\n  transpilePackages: [\n    '@visx/annotation',\n    '@visx/axis',\n    '@visx/bounds',\n    '@visx/brush',\n    '@visx/chord',\n    '@visx/clip-path',\n    '@visx/curve',\n    '@visx/delaunay',\n    '@visx/drag',\n    '@visx/event',\n    '@visx/geo',\n    '@visx/glyph',\n    '@visx/gradient',\n    '@visx/grid',\n    '@visx/group',\n    '@visx/heatmap',\n    '@visx/hierarchy',\n    '@visx/legend',\n    '@visx/marker',\n    '@visx/mock-data',\n    '@visx/network',\n    '@visx/pattern',\n    '@visx/point',\n    '@visx/react-spring',\n    '@visx/responsive',\n    '@visx/sankey',\n    '@visx/scale',\n    '@visx/shape',\n    '@visx/stats',\n    '@visx/text',\n    '@visx/threshold',\n    '@visx/tooltip',\n    '@visx/vendor',\n    '@visx/visx',\n    '@visx/voronoi',\n    '@visx/wordcloud',\n    '@visx/xychart',\n    '@visx/zoom',\n  ],\n};\n\n// eslint-disable-next-line no-undef\nmodule.exports = nextConfig;\n"
  },
  {
    "path": "packages/visx-demo/package.json",
    "content": "{\n  \"name\": \"@visx/demo\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx demo\",\n  \"repository\": \"https://github.com/airbnb/visx\",\n  \"scripts\": {\n    \"build\": \"next build\",\n    \"deploy\": \"rm -rf out && yarn build && cd out && touch .nojekyll && git init && git add . && git commit -m \\\"Deploy commit\\\" && git remote add origin git@github.com:airbnb/visx.git && git push -f origin master:gh-pages\",\n    \"dev\": \"next\",\n    \"preview\": \"yarn build && cd ./out && npx serve\",\n    \"start\": \"next start\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"demo\",\n    \"examples\"\n  ],\n  \"contributors\": [\n    {\n      \"name\": \"Harrison Shoff\",\n      \"url\": \"https://github.com/hshoff\"\n    },\n    {\n      \"name\": \"Chris Williams\",\n      \"url\": \"https://github.com/williaster\"\n    }\n  ],\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@react-spring/web\": \"^10.0.3\",\n    \"@types/d3-scale-chromatic\": \"^3.1.0\",\n    \"@types/nprogress\": \"^0.2.0\",\n    \"@types/prismjs\": \"^1.16.0\",\n    \"@types/react\": \"^19.0.0\",\n    \"@visx/annotation\": \"workspace:*\",\n    \"@visx/axis\": \"workspace:*\",\n    \"@visx/bounds\": \"workspace:*\",\n    \"@visx/brush\": \"workspace:*\",\n    \"@visx/chord\": \"workspace:*\",\n    \"@visx/clip-path\": \"workspace:*\",\n    \"@visx/curve\": \"workspace:*\",\n    \"@visx/delaunay\": \"workspace:*\",\n    \"@visx/drag\": \"workspace:*\",\n    \"@visx/event\": \"workspace:*\",\n    \"@visx/geo\": \"workspace:*\",\n    \"@visx/glyph\": \"workspace:*\",\n    \"@visx/gradient\": \"workspace:*\",\n    \"@visx/grid\": \"workspace:*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/heatmap\": \"workspace:*\",\n    \"@visx/hierarchy\": \"workspace:*\",\n    \"@visx/legend\": \"workspace:*\",\n    \"@visx/marker\": \"workspace:*\",\n    \"@visx/mock-data\": \"workspace:*\",\n    \"@visx/network\": \"workspace:*\",\n    \"@visx/pattern\": \"workspace:*\",\n    \"@visx/point\": \"workspace:*\",\n    \"@visx/react-spring\": \"workspace:*\",\n    \"@visx/responsive\": \"workspace:*\",\n    \"@visx/sankey\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"@visx/stats\": \"workspace:*\",\n    \"@visx/text\": \"workspace:*\",\n    \"@visx/threshold\": \"workspace:*\",\n    \"@visx/tooltip\": \"workspace:*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"@visx/visx\": \"workspace:*\",\n    \"@visx/voronoi\": \"workspace:*\",\n    \"@visx/wordcloud\": \"workspace:*\",\n    \"@visx/xychart\": \"workspace:*\",\n    \"@visx/zoom\": \"workspace:*\",\n    \"babel-loader\": \"^8.2.2\",\n    \"classnames\": \"^2.3.1\",\n    \"d3-collection\": \"^1.0.7\",\n    \"d3-hierarchy\": \"^3.1.2\",\n    \"d3-scale-chromatic\": \"^3.1.0\",\n    \"d3-shape\": \"^3.2.0\",\n    \"lodash\": \"^4.17.21\",\n    \"next\": \"^15.1.0\",\n    \"nprogress\": \"^0.2.0\",\n    \"prismjs\": \"^1.19.0\",\n    \"raw-loader\": \"^4.0.0\",\n    \"react\": \"^19.0.0\",\n    \"react-dom\": \"^19.0.0\",\n    \"react-github-button\": \"^0.1.10\",\n    \"react-markdown\": \"^9.0.1\",\n    \"rehype-raw\": \"^7.0.0\",\n    \"topojson-client\": \"^3.0.0\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.26.0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-demo/public/static/doc_styles.css",
    "content": "body {\n  padding: 50px;\n  font: 15px/1.6 Helvetica, Arial, sans-serif;\n}\n\nimg {\n  max-height: 50vh;\n}\n\nbody {\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Oxygen', 'Ubuntu', 'Cantarell',\n    'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n  background: #ffffff;\n  font-size: 18px;\n  line-height: 1.8em;\n}\n\ncode {\n  font-family: 'Menlo', monospace;\n  font-weight: bold;\n  padding: 0.2rem 0.3rem;\n  background-color: #ebebeb;\n  line-height: 1.8em;\n  font-size: 0.8em;\n}\n\npre > code {\n  background-color: transparent;\n  font-weight: 300;\n}\n\npre {\n  background-color: #f7f9fa;\n  display: inline-block;\n  padding: 0.5em;\n  min-width: 33vw;\n  border-radius: 3px;\n}\n\na {\n  color: #fc2e1c;\n  text-decoration: none;\n}\n\n.logo {\n  background-image: url('favicon.ico');\n  background-position: center;\n  background-size: cover;\n  height: 24px;\n  width: 24px;\n  background-repeat: no-repeat;\n}\n\n.nav-inner {\n  width: 95vw;\n  margin: 0 auto;\n  display: flex;\n  flex-direction: row;\n  align-items: center;\n  justify-content: center;\n}\n.nav {\n  display: flex;\n  flex-direction: row;\n  flex: 1;\n  align-items: center;\n  justify-content: center;\n  padding: 0 10px;\n  font-size: 14px;\n  z-index: 3;\n  position: fixed;\n  top: 0;\n  left: 0;\n  right: 0;\n  margin: 0;\n  background: #ffffff;\n}\n.nav ul {\n  list-style-type: none;\n  display: flex;\n  flex: 1;\n  flex-direction: row;\n  padding: 0;\n  margin: 0;\n  color: white;\n  justify-content: flex-start;\n  align-items: center;\n}\n.content {\n  margin-top: 44px;\n  max-width: 720px;\n  min-width: 300px;\n}\ntable {\n  border-collapse: collapse;\n}\nth,\ntd {\n  border: 1px solid;\n  padding: 5px 10px 5px 5px;\n}\n.content h1 {\n  margin-bottom: 1.2em;\n  line-height: 0;\n}\n.doc-nav {\n  margin-right: 5rem;\n  margin-top: 55px;\n  position: sticky;\n  top: 55px;\n}\n.doc-nav ul {\n  list-style: none;\n  font-size: 14px;\n  margin: 0;\n  padding: 0;\n}\n.doc-nav li {\n  margin: 0;\n  padding: 0;\n  line-height: 1.75em;\n}\n.doc-container {\n  display: flex;\n  flex-direction: row;\n  position: relative;\n}\n@media (max-width: 600px) {\n  .github-buttons {\n    display: none;\n  }\n  .Item {\n    float: left;\n  }\n\n  .nav {\n    padding: 0;\n  }\n\n  .nav-inner {\n    width: 99vw;\n  }\n\n  .doc-container {\n    flex-direction: column-reverse;\n    min-width: 90vw;\n    max-width: 90vw;\n    margin: 0;\n  }\n\n  .content,\n  pre {\n    min-width: 90vw;\n    max-width: 90vw;\n    word-break: break-all;\n  }\n\n  code {\n    word-break: break-all;\n  }\n\n  body {\n    padding: 10px;\n  }\n}\n\n.Item a {\n  display: inline-block;\n  padding: 10px;\n  text-decoration: none;\n  color: #fc2e1c;\n  font-weight: 600;\n}\n.Item .github {\n  font-weight: 600;\n  color: #fc2e1c;\n}\n\n@media (max-width: 600px) {\n  .Item {\n    display: block;\n    float: left;\n  }\n\n  .Item .github {\n    margin-top: 0;\n  }\n}\n\ntable {\n  border-collapse: collapse;\n  font-size: 12px;\n  font-family: monospace;\n  border-color: #efefef;\n  margin-top: 0.25rem;\n}\n"
  },
  {
    "path": "packages/visx-demo/public/static/prism/prism-funky.css",
    "content": "/**\n * prism.js Funky theme\n * Based on “Polyfilling the gaps” talk slides http://lea.verou.me/polyfilling-the-gaps/\n * @author Lea Verou\n */\n\ncode[class*='language-'],\npre[class*='language-'] {\n  font-family: 'Menlo', monospace;\n  text-align: left;\n  white-space: pre;\n  word-spacing: normal;\n  word-break: normal;\n  word-wrap: normal;\n  line-height: 1.5;\n\n  -moz-tab-size: 4;\n  -o-tab-size: 4;\n  tab-size: 4;\n\n  -webkit-hyphens: none;\n  -moz-hyphens: none;\n  -ms-hyphens: none;\n  hyphens: none;\n}\n\n/* Code blocks */\npre[class*='language-'] {\n  padding: 0.4em 0.8em;\n  margin: 0.5em 0;\n  overflow: auto;\n  background: url('data:image/svg+xml;charset=utf-8,<svg%20version%3D\"1.1\"%20xmlns%3D\"http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg\"%20width%3D\"100\"%20height%3D\"100\"%20fill%3D\"rgba(0%2C0%2C0%2C.2)\">%0D%0A<polygon%20points%3D\"0%2C50%2050%2C0%200%2C0\"%20%2F>%0D%0A<polygon%20points%3D\"0%2C100%2050%2C100%20100%2C50%20100%2C0\"%20%2F>%0D%0A<%2Fsvg>');\n  background-size: 1em 1em;\n}\n\ncode[class*='language-'] {\n  background: black;\n  color: white;\n  box-shadow: -0.3em 0 0 0.3em black, 0.3em 0 0 0.3em black;\n}\n\n/* Inline code */\n:not(pre) > code[class*='language-'] {\n  padding: 0.2em;\n  border-radius: 0.3em;\n  box-shadow: none;\n  white-space: normal;\n}\n\n.token.comment,\n.token.prolog,\n.token.doctype,\n.token.cdata {\n  color: #aaa;\n}\n\n.token.punctuation {\n  color: #999;\n}\n\n.namespace {\n  opacity: 0.7;\n}\n\n.token.property,\n.token.tag,\n.token.boolean,\n.token.number,\n.token.constant,\n.token.symbol {\n  color: #4398c6;\n}\n\n.token.selector,\n.token.attr-name,\n.token.string,\n.token.char,\n.token.builtin {\n  color: #868e96;\n}\n\n.token.operator,\n.token.entity,\n.token.url,\n.language-css .token.string,\n.toke.variable,\n.token.inserted {\n  color: #ec5592;\n  font-weight: 600;\n}\n\n.token.atrule,\n.token.attr-value,\n.token.keyword {\n  color: #202123;\n}\n\n.token.regex,\n.token.important {\n  color: orange;\n}\n\n.token.important,\n.token.bold {\n  font-weight: bold;\n}\n.token.italic {\n  font-style: italic;\n}\n\n.token.entity {\n  cursor: help;\n}\n\n.token.deleted {\n  color: red;\n}\n"
  },
  {
    "path": "packages/visx-demo/public/static/prism/prism-line-numbers.css",
    "content": ".github-btn {\n  font: bold 11px/14px 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  height: 20px;\n  overflow: hidden;\n  margin-right: 10px;\n}\n.gh-btn,\n.gh-count,\n.gh-ico {\n  float: left;\n}\n.gh-btn,\n.gh-count {\n  padding: 2px 5px 2px 4px;\n  color: #333;\n  text-decoration: none;\n  white-space: nowrap;\n  cursor: pointer;\n  border-radius: 3px;\n}\n.gh-btn {\n  background-color: #eee;\n  background-image: -webkit-gradient(\n    linear,\n    left top,\n    left bottom,\n    color-stop(0, #fcfcfc),\n    color-stop(100%, #eee)\n  );\n  background-image: -webkit-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: -moz-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: -ms-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: -o-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: linear-gradient(to bottom, #fcfcfc 0, #eee 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fcfcfc', endColorstr='#eeeeee', GradientType=0);\n  background-repeat: no-repeat;\n  border: 1px solid #d5d5d5;\n}\n.gh-btn:hover,\n.gh-btn:focus {\n  text-decoration: none;\n  background-color: #ddd;\n  background-image: -webkit-gradient(\n    linear,\n    left top,\n    left bottom,\n    color-stop(0, #eee),\n    color-stop(100%, #ddd)\n  );\n  background-image: -webkit-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: -moz-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: -ms-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: -o-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: linear-gradient(to bottom, #eee 0, #ddd 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);\n  border-color: #ccc;\n}\n.gh-btn:active {\n  background-image: none;\n  background-color: #dcdcdc;\n  border-color: #b5b5b5;\n  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n}\n.gh-ico {\n  width: 14px;\n  height: 14px;\n  margin-right: 4px;\n  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjQwcHgiIGhlaWdodD0iNDBweCIgdmlld0JveD0iMTIgMTIgNDAgNDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMTIgMTIgNDAgNDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGZpbGw9IiMzMzMzMzMiIGQ9Ik0zMiAxMy40Yy0xMC41IDAtMTkgOC41LTE5IDE5YzAgOC40IDUuNSAxNS41IDEzIDE4YzEgMC4yIDEuMy0wLjQgMS4zLTAuOWMwLTAuNSAwLTEuNyAwLTMuMiBjLTUuMyAxLjEtNi40LTIuNi02LjQtMi42QzIwIDQxLjYgMTguOCA0MSAxOC44IDQxYy0xLjctMS4yIDAuMS0xLjEgMC4xLTEuMWMxLjkgMC4xIDIuOSAyIDIuOSAyYzEuNyAyLjkgNC41IDIuMSA1LjUgMS42IGMwLjItMS4yIDAuNy0yLjEgMS4yLTIuNmMtNC4yLTAuNS04LjctMi4xLTguNy05LjRjMC0yLjEgMC43LTMuNyAyLTUuMWMtMC4yLTAuNS0wLjgtMi40IDAuMi01YzAgMCAxLjYtMC41IDUuMiAyIGMxLjUtMC40IDMuMS0wLjcgNC44LTAuN2MxLjYgMCAzLjMgMC4yIDQuNyAwLjdjMy42LTIuNCA1LjItMiA1LjItMmMxIDIuNiAwLjQgNC42IDAuMiA1YzEuMiAxLjMgMiAzIDIgNS4xYzAgNy4zLTQuNSA4LjktOC43IDkuNCBjMC43IDAuNiAxLjMgMS43IDEuMyAzLjVjMCAyLjYgMCA0LjYgMCA1LjJjMCAwLjUgMC40IDEuMSAxLjMgMC45YzcuNS0yLjYgMTMtOS43IDEzLTE4LjFDNTEgMjEuOSA0Mi41IDEzLjQgMzIgMTMuNHoiLz48L3N2Zz4=');\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n}\n.gh-count {\n  position: relative;\n  display: none;\n  /* hidden to start */\n  margin-left: 4px;\n  background-color: #fafafa;\n  border: 1px solid #d4d4d4;\n}\n.gh-count:hover,\n.gh-count:focus {\n  color: #4183c4;\n}\n.gh-count:before,\n.gh-count:after {\n  content: '';\n  position: absolute;\n  display: inline-block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.gh-count:before {\n  top: 50%;\n  left: -3px;\n  margin-top: -4px;\n  border-width: 4px 4px 4px 0;\n  border-right-color: #fafafa;\n}\n.gh-count:after {\n  top: 50%;\n  left: -4px;\n  z-index: -1;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #d4d4d4;\n}\n.github-btn-large {\n  height: 30px;\n}\n.github-btn-large .gh-btn,\n.github-btn-large .gh-count {\n  padding: 3px 10px 3px 8px;\n  font-size: 16px;\n  line-height: 22px;\n  border-radius: 4px;\n}\n.github-btn-large .gh-ico {\n  width: 20px;\n  height: 20px;\n}\n.github-btn-large .gh-count {\n  margin-left: 6px;\n}\n.github-btn-large .gh-count:before {\n  left: -5px;\n  margin-top: -6px;\n  border-width: 6px 6px 6px 0;\n}\n.github-btn-large .gh-count:after {\n  left: -6px;\n  margin-top: -7px;\n  border-width: 7px 7px 7px 0;\n}\n\n::-webkit-scrollbar {\n  background: transparent;\n  overflow: visible;\n  width: 10px;\n}\n\n::-webkit-scrollbar-thumb {\n  background-color: transparent;\n  border: solid transparent;\n}\n\n::-webkit-scrollbar-thumb:hover {\n  background: rgba(0, 0, 0, 0.8);\n}\n\n::-webkit-scrollbar-thumb:horizontal {\n  border-width: 4px 6px;\n  min-width: 40px;\n}\n\n::-webkit-scrollbar-thumb:vertical {\n  border-width: 6px 4px;\n  min-height: 40px;\n}\n\n::-webkit-scrollbar-track-piece {\n  background-color: white;\n}\n\n::-webkit-scrollbar-corner {\n  background: transparent;\n}\n\n::-webkit-scrollbar-thumb {\n  background-color: #999;\n}\n\n::-webkit-scrollbar-thumb:hover {\n  background-color: #fc2e1c;\n}\n\npre.line-numbers {\n  position: relative;\n  padding-left: 3em;\n  counter-reset: linenumber;\n}\n\npre.line-numbers > code {\n  position: relative;\n}\n\n.line-numbers .line-numbers-rows {\n  position: absolute;\n  pointer-events: none;\n  top: 0;\n  font-size: 100%;\n  left: -0.1em;\n  width: 2em; /* works for line-numbers below 1000 lines */\n  letter-spacing: -1px;\n\n  -webkit-user-select: none;\n  -moz-user-select: none;\n  -ms-user-select: none;\n  user-select: none;\n}\n\n@media (max-width: 600px) {\n  .line-numbers .line-numbers-rows {\n    display: none;\n  }\n  .github-btn {\n    margin-right: 5px;\n  }\n}\n\n.line-numbers-rows > span {\n  pointer-events: none;\n  display: block;\n  counter-increment: linenumber;\n}\n\n.line-numbers-rows > span:before {\n  content: counter(linenumber);\n  color: #ced3d7;\n  display: block;\n  padding-right: 0.8em;\n  text-align: right;\n}\n"
  },
  {
    "path": "packages/visx-demo/public/static/style.css",
    "content": "body {\n  overflow-x: hidden;\n  padding: 50px;\n  font: 15px/1.6 Helvetica, Arial, sans-serif;\n}\n\nbody:first-child {\n  overflow-x: hidden;\n  width: 100%;\n}\n\n.github-btn {\n  font: bold 11px/14px 'Helvetica Neue', Helvetica, Arial, sans-serif;\n  height: 20px;\n  overflow: hidden;\n}\n.gh-btn,\n.gh-count,\n.gh-ico {\n  float: left;\n}\n.gh-btn,\n.gh-count {\n  padding: 2px 5px 2px 4px;\n  color: #333;\n  text-decoration: none;\n  white-space: nowrap;\n  cursor: pointer;\n  border-radius: 3px;\n}\n.gh-btn {\n  background-color: #eee;\n  background-image: -webkit-gradient(\n    linear,\n    left top,\n    left bottom,\n    color-stop(0, #fcfcfc),\n    color-stop(100%, #eee)\n  );\n  background-image: -webkit-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: -moz-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: -ms-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: -o-linear-gradient(top, #fcfcfc 0, #eee 100%);\n  background-image: linear-gradient(to bottom, #fcfcfc 0, #eee 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fcfcfc', endColorstr='#eeeeee', GradientType=0);\n  background-repeat: no-repeat;\n  border: 1px solid #d5d5d5;\n}\n.gh-btn:hover,\n.gh-btn:focus {\n  text-decoration: none;\n  background-color: #ddd;\n  background-image: -webkit-gradient(\n    linear,\n    left top,\n    left bottom,\n    color-stop(0, #eee),\n    color-stop(100%, #ddd)\n  );\n  background-image: -webkit-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: -moz-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: -ms-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: -o-linear-gradient(top, #eee 0, #ddd 100%);\n  background-image: linear-gradient(to bottom, #eee 0, #ddd 100%);\n  filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#dddddd', GradientType=0);\n  border-color: #ccc;\n}\n.gh-btn:active {\n  background-image: none;\n  background-color: #dcdcdc;\n  border-color: #b5b5b5;\n  box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15);\n}\n.gh-ico {\n  width: 14px;\n  height: 14px;\n  margin-right: 4px;\n  background-image: url('data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHhtbG5zOnhsaW5rPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiB2ZXJzaW9uPSIxLjEiIGlkPSJMYXllcl8xIiB4PSIwcHgiIHk9IjBweCIgd2lkdGg9IjQwcHgiIGhlaWdodD0iNDBweCIgdmlld0JveD0iMTIgMTIgNDAgNDAiIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMTIgMTIgNDAgNDAiIHhtbDpzcGFjZT0icHJlc2VydmUiPjxwYXRoIGZpbGw9IiMzMzMzMzMiIGQ9Ik0zMiAxMy40Yy0xMC41IDAtMTkgOC41LTE5IDE5YzAgOC40IDUuNSAxNS41IDEzIDE4YzEgMC4yIDEuMy0wLjQgMS4zLTAuOWMwLTAuNSAwLTEuNyAwLTMuMiBjLTUuMyAxLjEtNi40LTIuNi02LjQtMi42QzIwIDQxLjYgMTguOCA0MSAxOC44IDQxYy0xLjctMS4yIDAuMS0xLjEgMC4xLTEuMWMxLjkgMC4xIDIuOSAyIDIuOSAyYzEuNyAyLjkgNC41IDIuMSA1LjUgMS42IGMwLjItMS4yIDAuNy0yLjEgMS4yLTIuNmMtNC4yLTAuNS04LjctMi4xLTguNy05LjRjMC0yLjEgMC43LTMuNyAyLTUuMWMtMC4yLTAuNS0wLjgtMi40IDAuMi01YzAgMCAxLjYtMC41IDUuMiAyIGMxLjUtMC40IDMuMS0wLjcgNC44LTAuN2MxLjYgMCAzLjMgMC4yIDQuNyAwLjdjMy42LTIuNCA1LjItMiA1LjItMmMxIDIuNiAwLjQgNC42IDAuMiA1YzEuMiAxLjMgMiAzIDIgNS4xYzAgNy4zLTQuNSA4LjktOC43IDkuNCBjMC43IDAuNiAxLjMgMS43IDEuMyAzLjVjMCAyLjYgMCA0LjYgMCA1LjJjMCAwLjUgMC40IDEuMSAxLjMgMC45YzcuNS0yLjYgMTMtOS43IDEzLTE4LjFDNTEgMjEuOSA0Mi41IDEzLjQgMzIgMTMuNHoiLz48L3N2Zz4=');\n  background-size: 100% 100%;\n  background-repeat: no-repeat;\n}\n.gh-count {\n  position: relative;\n  display: none;\n  /* hidden to start */\n  margin-left: 4px;\n  background-color: #fafafa;\n  border: 1px solid #d4d4d4;\n}\n.gh-count:hover,\n.gh-count:focus {\n  color: #4183c4;\n}\n.gh-count:before,\n.gh-count:after {\n  content: '';\n  position: absolute;\n  display: inline-block;\n  width: 0;\n  height: 0;\n  border-color: transparent;\n  border-style: solid;\n}\n.gh-count:before {\n  top: 50%;\n  left: -3px;\n  margin-top: -4px;\n  border-width: 4px 4px 4px 0;\n  border-right-color: #fafafa;\n}\n.gh-count:after {\n  top: 50%;\n  left: -4px;\n  z-index: -1;\n  margin-top: -5px;\n  border-width: 5px 5px 5px 0;\n  border-right-color: #d4d4d4;\n}\n.github-btn-large {\n  height: 30px;\n}\n.github-btn-large .gh-btn,\n.github-btn-large .gh-count {\n  padding: 3px 10px 3px 8px;\n  font-size: 16px;\n  line-height: 22px;\n  border-radius: 4px;\n}\n.github-btn-large .gh-ico {\n  width: 20px;\n  height: 20px;\n}\n.github-btn-large .gh-count {\n  margin-left: 6px;\n}\n.github-btn-large .gh-count:before {\n  left: -5px;\n  margin-top: -6px;\n  border-width: 6px 6px 6px 0;\n}\n.github-btn-large .gh-count:after {\n  left: -6px;\n  margin-top: -7px;\n  border-width: 7px 7px 7px 0;\n}\n"
  },
  {
    "path": "packages/visx-demo/public/static/visx-geo/world-topo.json",
    "content": "\n{\"arcs\":[[[7080,7327],[-5,4],[-10,-10],[5,-6]],[[7070,7315],[-16,-12],[-9,5],[-28,-4],[-12,-6],[-1,-5],[-17,-18],[-11,-16],[6,-10],[6,-18],[-2,-15],[3,-8],[-18,-35],[4,-12],[-2,-18],[-7,-5],[-13,0],[-13,4],[3,-16],[6,-6],[-1,-9],[4,-9],[-12,-14],[-8,0],[-6,-18],[2,-7],[-6,-11],[2,-30],[-8,-17],[-6,-1],[-2,8],[-15,4],[-3,-8],[-14,-12],[6,-9],[-11,-7],[-13,6],[-7,-15],[-8,-7],[-3,-19],[2,-9],[-4,-35],[-32,-17],[-16,2],[-11,-11],[-14,6],[-30,-5],[-46,26]],[[6689,6902],[27,56],[1,10],[-4,21],[-24,7],[-1,9],[1,35],[-7,43],[0,9],[7,14],[1,9],[-10,5],[0,31],[11,8],[-5,13],[7,6],[5,26],[-1,11],[4,19]],[[6701,7234],[8,-10],[13,-1],[6,-7],[1,-9],[5,8],[5,-4],[13,13],[0,24],[9,0],[4,6],[20,11],[9,15],[0,16],[5,14],[-1,9],[9,8],[12,0],[4,16],[4,3],[15,-14],[5,2]],[[6847,7334],[14,2],[7,-12],[6,6],[8,-6]],[[6882,7324],[7,-15],[7,10],[15,9],[2,5],[10,-14],[5,7],[-2,13],[4,8],[21,2],[-3,18],[5,4],[12,26],[9,-2],[7,-9],[-1,-21],[6,3],[2,-8],[-3,-14],[-1,-35],[3,-12],[7,-4],[15,19],[9,1],[3,11],[14,14],[13,-2],[-1,-12],[14,8],[12,2],[7,-9]],[[5665,4557],[3,-32],[-3,-9],[0,-36],[2,-12],[-5,-22],[4,-12],[-56,0],[0,-182],[3,-21],[6,-7],[15,-33],[6,-7],[3,-10],[6,-7]],[[5649,4167],[-53,-21],[-11,4],[-8,-4],[-13,9],[-8,-3],[-17,2],[-5,4],[-10,0],[-7,9],[-5,14],[-52,0],[-66,0],[-7,-1],[-12,17],[-4,9],[-6,1],[-18,-16],[-15,4],[-6,-6]],[[5326,4189],[0,28],[2,-1],[-2,58],[7,9],[1,23],[6,24],[2,20],[0,23],[5,12],[0,26],[4,4],[8,20],[0,10],[6,12],[5,0],[8,20],[5,28],[-1,20],[2,29],[-2,15],[-7,15],[-8,46],[-7,29],[6,16],[6,7],[-1,21],[-3,9],[-10,48],[-2,4],[0,21],[-8,16],[-8,30],[16,4],[10,11]],[[5366,4846],[4,-2],[18,2],[12,-3],[21,2],[32,1],[7,-4],[4,-15],[0,-22],[3,-16],[3,-3],[0,-19],[10,-23],[0,-8],[9,-20],[7,4],[6,-4],[2,6],[33,0],[1,20],[4,12],[-2,8],[2,18],[21,0],[9,5],[-3,-22],[36,0],[1,-22],[-2,-20],[5,-23],[-4,-53],[1,-14],[6,-17],[3,-2],[4,-23],[0,-22],[-4,-9],[3,-18],[6,7],[13,-4],[14,9],[12,-3],[2,8]],[[5363,4916],[-7,-5],[-8,-18],[-1,-40],[-8,-2]],[[5339,4851],[-2,5],[2,14],[-6,24]],[[5333,4894],[10,23],[7,3],[4,10],[9,-14]],[[5582,7537],[-1,0]],[[5581,7537],[1,0]],[[5537,7617],[1,0]],[[5538,7617],[-1,0]],[[5557,7633],[4,-13],[7,-4],[3,-22]],[[5571,7594],[-4,-21],[6,-24]],[[5573,7549],[2,-10]],[[5575,7539],[6,-2]],[[5581,7537],[1,-1]],[[5582,7536],[0,0]],[[5582,7536],[0,-5]],[[5582,7531],[1,-5]],[[5583,7526],[0,0]],[[5583,7526],[-2,-13],[-5,-2],[-2,-17],[-11,-8],[3,-12],[-6,-8],[-5,3]],[[5555,7469],[-3,19],[-11,9],[-1,22],[-4,4],[4,16],[-1,29],[5,23],[-7,2]],[[5537,7593],[1,14]],[[5538,7607],[0,13]],[[5538,7620],[9,19],[3,-11],[7,5]],[[5553,8659],[10,-5],[-7,-11],[-10,6],[7,10]],[[5047,7630],[-7,-5],[-1,11]],[[5039,7636],[8,1],[0,-7]],[[6563,6637],[0,0]],[[6563,6659],[2,-2],[1,-36]],[[6566,6621],[-8,-14],[-3,13],[-6,-4],[-1,-38],[7,-9],[-11,-3],[-4,-6],[2,-9],[-10,-44],[0,-17]],[[6532,6490],[-2,-5],[-70,18],[-3,5],[-25,63],[0,9]],[[6432,6580],[6,-1],[0,-13],[12,-3],[10,11],[24,-2],[11,-4],[15,12],[6,14],[1,15],[11,12],[13,31],[11,13],[5,19]],[[6557,6684],[3,-2],[-1,-22],[4,-1]],[[6562,6642],[0,0]],[[3093,2021],[0,6]],[[3093,2027],[0,-6]],[[3093,2028],[0,123]],[[3093,2151],[10,-17],[-8,-15],[11,-6],[5,-17],[12,-13],[7,-13],[17,-13],[11,-14],[12,-7],[20,0],[-5,-16],[-18,1],[-11,-8],[-12,6],[-51,9]],[[3259,3902],[11,-14],[7,-29],[9,-17],[15,-17],[3,-11],[17,-13],[11,-1],[15,-18],[4,-9],[15,-17],[9,-5],[5,-8],[13,-5],[8,-20],[-6,-14],[-3,-19],[-8,-10],[-1,-25],[-3,-14],[-5,-4],[-5,-15],[4,-5],[13,1],[19,-8],[5,-5],[7,4],[5,-5],[6,3],[4,-8],[3,12],[5,5],[10,-9],[5,8],[-1,8],[6,12],[6,0],[11,18],[5,40],[0,22]],[[3483,3710],[5,-4],[6,7],[9,-9],[1,-17],[5,-14],[-2,-9],[0,-25],[-2,-17],[-13,-19],[-15,-5],[-6,-19],[-8,-4],[-6,-13],[-7,-5],[3,-10],[-6,-4],[-20,-39],[-2,-11],[-12,-25],[-5,-2],[-1,-10],[-8,-11]],[[3399,3445],[0,-7],[-7,-12],[2,-23],[-3,-20],[-5,-13],[3,-4],[-2,-14],[-4,-5],[3,-25],[-3,-8]],[[3383,3314],[2,-25],[-2,-12],[-6,0],[-4,-34],[5,-29],[-4,-14],[5,-12],[23,-21],[11,-25],[-7,-19],[0,-13],[7,-17],[12,-6],[1,-29],[-11,-30],[-13,-26],[-2,-16],[-27,-24],[-37,-16],[-27,-8],[-27,0],[-15,11],[3,-32],[5,-9],[-2,-21],[-4,3],[-1,-21],[-4,-5],[6,-17],[-2,-18],[-20,-16],[-21,0],[-26,20],[-8,2],[-4,-10],[5,-32],[-2,-24],[6,-16],[11,-4],[-4,-10],[13,0],[2,10],[-6,0],[14,11],[5,-13],[1,-17],[-3,-12],[-12,-5],[-3,16],[-13,5],[-9,-15],[19,-13],[-20,-17],[-8,-19],[3,-43],[-4,-11],[-9,-7],[0,-20],[-14,3],[-8,-5],[-1,-8],[-14,-5],[-9,-18],[0,-9],[-6,-9],[-2,-14],[7,-25],[7,-6],[8,-16],[6,-4],[17,0],[6,-6],[2,-20],[-5,-33],[-6,-2],[-12,-18],[-16,-14],[-3,-10],[-9,-10],[-6,-22],[2,-16],[-5,-18],[-5,-6],[-23,-14],[-5,-12],[-2,-21],[2,-24],[9,-34],[11,-24],[-3,-1]],[[3098,2168],[-15,10],[-26,10],[-55,1],[-4,12],[-11,13],[6,19],[-5,7],[5,13],[-2,14],[-13,1],[-11,-8],[-3,26],[-7,9],[2,22],[-3,11],[3,15],[9,1],[3,17],[12,10],[1,22],[7,7],[-1,15],[-5,7],[6,30],[8,13],[2,22],[8,9],[-3,32],[4,11],[-4,4],[0,15],[8,5],[5,13],[-8,17],[-14,5],[7,5],[17,3],[2,17],[-18,3],[-1,18],[5,7],[-4,14],[3,7],[-6,16],[5,9],[-11,7],[0,45],[3,8],[8,1],[-5,26],[2,43],[-3,11],[4,27],[5,21],[-2,18],[8,13],[0,25],[15,13],[-3,15],[-1,21],[-5,20],[3,35],[-2,24],[3,12],[10,4],[-1,8],[10,14],[-2,40],[-4,4],[6,6],[0,12],[9,39],[6,2],[-2,34],[3,18],[-9,9],[3,18],[-4,6],[0,16],[-5,12],[-2,14],[3,9],[-5,2],[-3,15],[1,24],[6,8],[0,13],[5,19],[7,8],[2,10],[-4,4],[2,16],[-4,31],[7,10],[1,26],[4,17],[13,33],[9,38],[6,-3],[8,7],[0,10],[-8,21],[0,10],[5,9],[-2,26],[-3,17],[2,15],[5,4],[-6,14],[2,14],[7,13],[25,20],[9,54],[-5,17]],[[3133,3869],[5,9],[0,8],[7,6],[2,12],[9,5],[4,19],[3,-2],[10,-17],[21,0],[12,-5],[6,-38],[3,20],[8,29],[32,1],[4,-14]],[[6265,7522],[0,0]],[[6249,7560],[2,-10],[15,-14],[-6,-16],[6,-11],[11,-10],[-3,-13],[-7,2],[15,-25],[9,-1],[-3,-13],[5,-7],[-5,-5],[3,-15]],[[6291,7422],[-10,-2]],[[6281,7420],[-4,23],[-7,7],[1,10],[-13,-1],[-8,14],[-7,-4]],[[6243,7469],[-8,16],[-12,1],[-11,7],[-3,20],[5,12],[-3,17],[-5,8]],[[6206,7550],[9,0],[11,7],[10,-3],[13,6]],[[6249,7546],[0,0]],[[6255,7542],[0,0]],[[488,408],[24,-7],[-48,-4],[-13,16],[37,-5]],[[542,484],[-90,7],[20,11],[65,-10],[5,-8]],[[3331,592],[8,-3],[-1,-57],[-23,-11],[-52,4],[-17,17],[-32,-10],[-67,20],[3,10],[19,-10],[115,3],[8,27],[39,10]],[[4135,588],[34,-2],[-10,-10],[-44,8],[-5,11],[25,-7]],[[3120,602],[25,-4],[35,-20],[-20,-7],[-40,31]],[[3137,618],[-11,-15],[-30,6],[41,9]],[[4054,618],[1,-6],[-76,3],[30,13],[45,-10]],[[547,618],[21,-9],[14,-23],[-47,-2],[-90,25],[-10,7],[5,17],[24,15],[25,0],[58,-30]],[[3143,666],[-58,-38],[-39,-36],[-31,3],[-10,10],[11,23],[23,11],[92,33],[12,-6]],[[9654,680],[-35,-8],[-8,14],[21,-7],[22,11],[0,-10]],[[3740,650],[1,-7],[44,2],[21,-39],[-7,-30],[-18,-1],[9,-11],[-158,-26],[-16,-9],[-121,-4],[1,17],[22,27],[26,-4],[60,37],[-13,14],[14,40],[31,33],[52,14],[37,-3],[38,-11],[19,-13],[-4,-20],[-38,-6]],[[9641,732],[63,-13],[-27,-10],[-42,-2],[-19,12],[25,13]],[[839,754],[14,-14],[-32,3],[-11,7],[29,4]],[[938,754],[-21,-7],[-2,12],[23,-5]],[[951,834],[16,-10],[-24,3],[8,7]],[[9561,885],[-8,-14],[-7,9],[15,5]],[[1342,903],[19,-12],[-6,-6],[-27,12],[14,6]],[[1458,897],[-1,-13],[-17,20],[18,-7]],[[1760,918],[-17,-8],[-3,7],[26,11],[-6,-10]],[[1680,914],[-12,3],[10,17],[17,-2],[-1,-10],[-14,-8]],[[1635,935],[17,0],[7,-14],[-23,-10],[0,-10],[-32,-4],[-22,7],[3,11],[15,12],[-27,3],[7,10],[55,-5]],[[4425,917],[9,-22],[-14,0],[-4,16],[-29,3],[20,7],[12,19],[11,1],[-5,-24]],[[9717,944],[-11,3],[8,14],[3,-17]],[[1498,961],[13,-7],[9,-16],[-11,-7],[29,6],[17,-9],[7,-11],[-6,-12],[-22,3],[-48,22],[0,8],[-19,7],[-3,16],[34,0]],[[2955,972],[-2,-10],[-13,0],[15,10]],[[2514,979],[-20,-5],[-4,5],[22,8],[2,-8]],[[2918,987],[18,-3],[-8,-40],[-36,14],[-7,10],[11,7],[18,0],[-19,10],[23,2]],[[2474,988],[-3,-19],[-14,-1],[6,17],[-10,16],[23,1],[-2,-14]],[[2365,999],[-10,3],[18,7],[-8,-10]],[[2270,1031],[14,-3],[-2,14],[10,0],[2,-17],[10,19],[19,1],[5,-10],[-23,-11],[8,-3],[27,11],[-6,-10],[13,-10],[-15,-1],[1,-9],[-72,2],[2,5],[-24,-1],[6,7],[-29,6],[-58,7],[6,10],[57,7],[8,-11],[7,7],[23,-12],[-13,13],[17,9],[15,-6],[-8,-14]],[[4919,1112],[8,-10],[14,1],[-17,-19],[-8,18],[-16,10],[19,0]],[[2947,1119],[8,-13],[-22,-10],[-48,-11],[-9,4],[2,12],[33,5],[9,12],[8,-13],[3,14],[16,0]],[[3313,1111],[-7,10],[11,1],[-4,-11]],[[4835,1126],[-5,-10],[-10,9],[15,1]],[[5082,1116],[-11,6],[19,4],[-8,-10]],[[4913,1121],[-10,0],[6,12],[12,3],[2,-14],[-10,-1]],[[7004,1113],[-10,3],[-5,16],[16,-11],[-1,-8]],[[5124,1122],[-12,11],[12,5],[0,-16]],[[5745,1129],[-22,0],[-2,11],[19,6],[5,-17]],[[5040,1146],[-7,-18],[-5,21],[12,-3]],[[2924,1165],[8,-12],[-12,-13],[-23,5],[-1,13],[8,7],[20,0]],[[5449,1148],[-17,8],[11,12],[19,-1],[-11,-8],[-2,-11]],[[3001,1170],[-23,2],[-6,7],[17,4],[12,-13]],[[3283,1179],[-6,-12],[-16,30],[11,2],[11,-20]],[[3055,1197],[19,-24],[1,-17],[16,-26],[11,-25],[3,-60],[-6,-23],[-20,-7],[-2,-10],[-40,-7],[-49,0],[-21,13],[10,8],[16,-3],[45,-2],[14,8],[-7,6],[-28,-9],[-18,10],[35,8],[1,5],[-31,0],[-14,17],[-11,-17],[-31,2],[10,-8],[-14,-9],[-38,14],[-1,15],[15,8],[16,-8],[-4,12],[9,4],[16,-13],[-4,14],[29,-2],[9,7],[-23,7],[10,6],[30,-6],[19,11],[20,0],[13,-11],[-2,16],[-35,7],[5,17],[24,8],[15,-4],[-18,14],[-20,-4],[-27,14],[7,34],[-10,5],[0,20],[45,10],[9,-7],[2,-18]],[[7385,1327],[-15,4],[8,9],[7,-13]],[[3111,1321],[9,-5],[-16,-13],[-8,-22],[-11,0],[-7,9],[22,44],[15,12],[5,-5],[-10,-11],[1,-9]],[[7686,1378],[4,-8],[-14,-2],[10,10]],[[3174,1408],[-3,-16],[-10,-2],[6,17],[7,1]],[[7805,1401],[-19,0],[-1,7],[12,10],[15,-7],[-7,-10]],[[7870,1413],[-16,19],[9,-2],[7,-17]],[[3410,1465],[-6,6],[14,7],[-8,-13]],[[3242,1481],[-2,-9],[14,-8],[-14,-12],[-26,3],[20,26],[8,0]],[[3270,1492],[2,-17],[-12,-8],[10,25]],[[3394,1508],[-2,-9],[20,-7],[-8,-17],[-7,6],[-7,-7],[-14,20],[5,8],[13,6]],[[3446,1521],[-9,7],[15,-2],[-6,-5]],[[0,324],[46,3],[68,-14],[19,8],[194,-14],[21,-11],[128,-2],[122,-11],[81,-3],[-58,13],[54,1],[-124,12],[-104,7],[24,11],[-55,17],[37,2],[-52,17],[-71,-3],[-37,23],[-127,27],[73,-2],[18,-14],[73,-4],[20,4],[70,-3],[6,-14],[50,10],[19,-11],[127,8],[18,9],[-44,5],[81,5],[16,14],[70,14],[-10,10],[-54,26],[31,11],[-19,10],[-74,13],[17,11],[109,6],[135,7],[0,5],[-77,24],[-11,11],[13,10],[43,-4],[46,10],[-17,11],[-75,12],[-55,17],[-3,5],[-68,8],[-43,21],[14,11],[48,6],[-2,14],[-71,-7],[-47,23],[14,18],[-3,26],[9,1],[24,-17],[21,17],[21,-5],[18,4],[38,-10],[-9,-10],[36,-3],[2,10],[72,-30],[30,16],[30,6],[-36,7],[7,14],[32,-17],[21,7],[13,-13],[27,0],[-16,13],[21,1],[-31,15],[29,-5],[-22,20],[-27,16],[-38,-3],[-33,3],[2,9],[28,4],[9,7],[69,-21],[6,8],[-27,13],[9,11],[56,6],[1,10],[41,4],[2,6],[19,-3],[9,-14],[18,0],[-10,14],[29,6],[16,14],[61,4],[30,-4],[-16,9],[4,14],[30,0],[11,11],[22,-4],[18,-16],[30,9],[58,-4],[20,-5],[64,13],[93,0],[8,-7],[45,3],[41,0],[59,10],[-3,10],[24,6],[6,-12],[33,-3],[51,6],[-7,21],[11,10],[21,0],[-9,-7],[19,2],[-8,-12],[4,-14],[15,3],[-18,-16],[-6,-21],[9,6],[46,8],[15,0],[-10,11],[0,20],[15,6],[35,-17],[-5,-19],[-34,-18],[4,-7],[45,4],[84,-10],[53,13],[28,-3],[14,4],[49,-4],[-3,-8],[20,-8],[70,13],[-27,6],[2,10],[-34,3],[17,7],[3,14],[-46,3],[5,11],[-7,15],[-33,5],[-4,20],[42,-4],[3,-6],[47,2],[-5,21],[-41,3],[-46,0],[-11,7],[-4,20],[11,7],[26,-4],[-17,-12],[21,-4],[33,4],[84,-1],[9,-7],[44,-11],[17,7],[24,-7],[21,8],[46,0],[33,-7],[16,10],[25,1],[6,10],[-10,17],[33,-4],[1,-10],[-15,-14],[9,-9],[30,6],[8,-11],[38,11],[5,-13],[28,-10],[20,2],[43,-19],[29,9],[-2,28],[24,-11],[-8,25],[28,-2],[24,-17],[-2,-16],[55,8],[5,-7],[-15,-14],[48,6],[7,5],[34,-5],[26,15],[57,12],[21,-2],[42,10],[35,16],[22,43],[-1,7],[-20,21],[-4,13],[6,23],[-15,38],[-15,16],[4,21],[-13,16],[15,0],[-1,7],[25,-14],[5,14],[11,6],[0,11],[-18,7],[14,5],[-5,17],[6,14],[-9,16],[12,3],[6,21],[-10,5],[-19,-1],[15,30],[6,0],[-2,-17],[15,-6],[1,26],[-4,14],[8,4],[14,-7],[5,34],[14,-2],[-5,11],[19,-4],[3,23],[16,1],[-5,27],[11,6],[16,-7],[-4,11],[20,14],[11,-3],[9,12],[10,1],[-1,10],[14,4],[-1,13],[30,14],[13,-2],[3,10],[12,2],[1,8],[21,4],[7,8],[13,6],[11,-3],[7,-20],[-10,-3],[-2,12],[-15,-12],[-10,0],[-15,-17],[-9,-22],[-9,-6],[-7,7],[-6,-6],[-19,-5],[-17,-29],[-20,3],[6,-10],[-18,-10],[9,-14],[-14,-14],[13,-19],[16,3],[0,10],[21,-2],[-16,-14],[-16,0],[-2,-16],[-5,16],[-19,-3],[1,-28],[-16,27],[-15,3],[-10,-29],[11,-10],[-9,-4],[-14,11],[-12,-15],[6,-16],[-15,-6],[-8,5],[-3,-33],[10,-6],[-12,-11],[21,6],[6,-6],[-20,-7],[14,-6],[-10,-7],[36,-17],[-2,17],[23,7],[-14,-17],[15,-6],[-5,-8],[14,-25],[14,-7],[-2,-21],[15,-13],[-1,-11],[-10,4],[5,-18],[22,1],[-16,-24],[20,4],[9,-21],[-5,-12],[-12,-1],[-14,-13],[14,-1],[11,10],[9,-8],[-7,-12],[-38,-3],[36,-14],[13,10],[0,-26],[-19,-2],[6,-18],[17,8],[-7,-24],[25,4],[-11,-19],[-9,8],[-3,-13],[-15,12],[-21,5],[13,-17],[21,-10],[-7,-23],[-21,5],[21,-13],[-23,-13],[31,7],[-9,-17],[-36,6],[17,-17],[-10,-13],[-13,-3],[-2,17],[-17,2],[6,-15],[-14,3],[-10,-10],[18,2],[7,-9],[-35,-4],[-2,-7],[33,-3],[-85,-34],[-52,-9],[4,-3],[-60,-13],[4,-11],[-17,-7],[-31,-1],[-20,4],[-46,0],[-31,8],[-64,0],[34,-42],[23,-15],[10,6],[66,-8],[-25,-26],[-38,-9],[-61,13],[-95,13],[-30,-6],[118,-34],[-9,-17],[-71,-7],[-61,21],[-37,30],[12,-23],[-13,-4],[17,-20],[42,-17],[17,-23],[18,-7],[2,20],[108,-4],[17,-13],[-20,-24],[-22,-3],[-62,0],[55,-10],[39,6],[24,-26],[-8,-7],[24,-16],[19,7],[38,-10],[7,13],[39,9],[21,-6],[9,-14],[46,-9],[89,-24],[77,-3],[-92,-8],[62,-5],[-2,-4],[-62,-1],[-6,-25],[26,-5],[52,8],[75,3],[-64,-17],[33,-33],[-6,-17],[66,-4],[49,30],[72,31],[52,14],[16,-1],[53,11],[65,5],[59,-2],[6,-17],[-17,-11],[31,-7],[67,24],[-2,10],[36,18],[9,16],[79,27],[42,-13],[34,10],[18,17],[53,0],[40,12],[42,-3],[-21,10],[37,0],[5,7],[153,6],[48,10],[-61,7],[-165,11],[31,17],[-27,0],[9,15],[-73,-12],[-96,23],[-5,14],[12,23],[11,3],[8,18],[24,0],[-7,12],[28,18],[34,10],[17,0],[5,10],[28,7],[15,13],[36,16],[52,10],[29,14],[48,10],[53,7],[31,-4],[22,14],[17,-6],[43,6],[-18,11],[29,26],[-3,10],[14,17],[24,3],[23,-7],[39,33],[-10,4],[-27,-10],[-22,3],[17,4],[-20,7],[1,13],[28,23],[18,3],[12,-9],[16,11],[-15,16],[29,-7],[14,11],[42,13],[3,19],[10,20],[-18,0],[-18,7],[-1,18],[16,2],[1,-9],[21,-10],[7,17],[16,9],[-12,10],[13,4],[3,-10],[22,-7],[10,-28],[15,7],[15,-5],[-4,9],[6,23],[-11,13],[13,5],[25,-7],[16,14],[13,-8],[-20,-29],[71,-3],[7,-9],[4,12],[18,3],[5,-6],[28,-5],[7,11],[12,-7],[-4,-14],[12,-9],[21,25],[13,8],[41,14],[105,20],[19,0],[28,7],[-5,17],[12,2],[-1,-17],[11,-3],[25,9],[-8,8],[9,9],[22,-23],[31,-14],[21,-5],[14,25],[18,7],[-16,10],[16,1],[8,-13],[22,-4],[22,3],[27,-4],[3,9],[17,3],[-3,-18],[45,-4],[11,1],[-6,11],[17,9],[11,-10],[-10,-23],[10,-10],[23,-1],[26,4],[3,13],[16,24],[24,-18],[-21,-6],[14,-7],[26,-5],[13,26],[15,-4],[0,-15],[27,-15],[31,-3],[35,17],[23,3],[38,21],[40,5],[38,11],[7,7],[2,33],[-12,13],[-1,13],[20,12],[28,0],[4,-8],[-21,-13],[24,-1],[20,-13],[-2,-23],[45,4],[8,-15],[7,9],[26,-1],[-5,-7],[19,-19],[2,12],[13,7],[-1,10],[15,4],[-2,32],[4,14],[26,6],[21,15],[28,4],[8,17],[32,8],[24,0],[-6,5],[34,13],[14,-6],[-2,23],[18,5],[14,-8],[-13,-7],[10,-3],[6,-12],[9,8],[16,-6],[-5,-17],[13,20],[-3,14],[16,5],[2,11],[-19,-3],[-6,13],[27,6],[-2,-9],[15,2],[0,-13],[11,8],[11,-7],[10,7],[-14,3],[10,16],[-16,1],[-1,12],[9,14],[23,4],[11,12],[30,4],[25,7],[40,-6],[19,-10],[15,-20],[11,3],[13,-8],[1,-9],[-36,3],[15,-8],[-11,-23],[1,-12],[7,13],[33,10],[23,-11],[12,1],[5,-20],[12,-4],[4,11],[24,0],[18,-7],[45,-7],[24,9],[30,-9],[45,-7],[48,-4],[9,-3],[35,8],[-1,-15],[14,-30],[-13,-3],[-7,-17],[13,0],[-16,-9],[12,-8],[0,-9],[-27,-3],[17,-14],[-13,-6],[9,-5],[-17,-12],[-13,18],[-18,-29],[13,-14],[34,8],[1,-21],[-15,-30],[-17,-8],[-5,-19],[-10,-7],[-6,-33],[-12,-36],[-15,-8],[25,-10],[22,10],[-3,26],[14,11],[34,3],[8,20],[20,6],[-6,7],[17,12],[14,3],[-11,7],[16,40],[17,7],[14,12],[-6,15],[22,23],[15,5],[8,-12],[28,6],[5,-7],[13,8],[-3,16],[35,18],[22,5],[7,21],[16,4],[-7,13],[9,12],[19,10],[73,24],[30,4],[13,-3],[-6,13],[29,18],[36,-4],[9,7],[18,0],[34,17],[8,-5],[14,4],[23,-4],[23,1],[19,14],[25,5],[12,-6],[34,1],[4,-10],[31,17],[11,-4],[8,-10],[13,6],[16,0],[16,6],[13,-10],[14,13],[9,0],[8,-26],[8,11],[13,3],[9,9],[27,7],[14,17],[0,7],[27,0],[8,6],[27,-9],[24,-3],[65,-22],[29,-6],[-3,-17],[12,13],[16,-19],[18,0],[29,17],[7,0],[-5,20],[13,14],[62,17],[35,-27],[-3,-15],[21,2],[16,-8],[3,-10],[-17,-16],[-31,-8],[-11,-15],[25,3],[22,10],[32,6],[13,10],[-3,-10],[19,3],[5,-6],[32,-1],[41,14],[0,-3],[-45,-17],[5,-7],[73,19],[18,14],[58,14],[13,-9],[11,6],[8,14],[14,6],[12,-14],[14,6],[-8,-12],[3,-11],[11,0],[0,-16],[28,6],[11,-7],[10,7],[6,-10],[11,13],[2,21],[16,19],[18,8],[28,-7],[30,4],[8,6],[19,-2],[13,-11],[-5,-11],[19,10],[11,0],[9,12],[4,-14],[13,7],[8,-8],[30,1],[20,-11],[35,-3],[12,-6],[28,-3],[10,-5],[20,3],[14,-13],[27,10],[12,-6],[-4,-11],[21,8],[5,-6],[-22,-38],[0,-10],[11,0],[26,23],[9,-10],[14,7],[14,-31],[13,5],[-8,-14],[8,-7],[23,3],[4,-6],[39,4],[35,-1],[10,4],[-1,-21],[16,-13],[0,14],[24,0],[17,-11],[23,7],[-5,24],[5,3],[24,-14],[2,-10],[16,-13],[14,-3],[17,-14],[19,3],[6,-10],[6,8],[17,-1],[45,-17],[14,-20],[-16,0],[28,-13],[19,-34],[-3,-13],[18,0],[2,34],[16,3],[22,-23],[21,2],[-3,7],[38,-3],[13,-6],[12,5],[13,-6],[-9,-6],[27,2],[18,-20],[10,-3],[48,-30],[2,21],[19,-31],[-5,-6],[-13,7],[-13,-34],[12,6],[-5,-17],[-39,15],[-11,-1],[16,-13],[29,-8],[-8,-19],[-20,-10],[-14,16],[-2,-13],[-32,1],[-12,5],[1,-16],[9,6],[23,-6],[-20,-4],[-5,-9],[-34,0],[9,-14],[-26,-1],[1,15],[-11,9],[-4,-20],[17,-14],[-15,0],[13,-30],[-24,1],[-20,-6],[-3,16],[-30,-30],[9,-7],[-5,-13],[-22,2],[-34,-12],[45,-1],[-4,-7],[21,-16],[-2,-16],[-18,-5],[18,-3],[4,-13],[-13,-11],[14,-5],[-14,-17],[18,0],[20,-30],[-7,-11],[27,-7],[-11,-20],[14,-7],[20,8],[12,-14],[36,-4],[-15,-13],[-12,9],[-47,-2],[-37,-7],[-14,-13],[-34,22],[20,-29],[-38,2],[-9,-8],[9,-14],[-23,-14],[27,3],[-37,-16],[52,-4],[-72,-17],[-6,-13],[61,6],[7,-8],[-35,-4],[40,-4],[-17,-13],[9,-23],[-22,5],[25,-20],[40,-9],[38,-31],[-89,-12],[59,-2],[53,8],[73,-27],[12,-14],[24,3],[-3,-20],[86,-9],[66,-23],[124,-12],[-9955,-15]],[[3456,1546],[12,-3],[-1,-9],[-17,4],[-19,-9],[3,13],[22,4]],[[3431,1556],[12,-2],[-6,-9],[-6,11]],[[3331,1581],[7,-5],[-12,-7],[-4,7],[-20,-3],[-1,6],[30,2]],[[3392,1616],[7,-6],[-33,-7],[10,13],[16,0]],[[3470,1665],[-6,-10],[-5,8],[11,2]],[[6916,2373],[5,-3],[-5,-12],[16,-14],[19,13],[7,-1],[-1,-15],[-9,1],[-11,-5],[2,-7],[13,1],[-1,-9],[-22,3],[-7,8],[-5,-13],[-8,4],[5,20],[-5,14],[1,12],[6,3]],[[9093,2685],[-7,-6],[5,12],[2,-6]],[[9020,2837],[14,-3],[13,-8],[2,-6],[17,-8],[24,13],[5,-4],[5,11],[5,-4],[4,9],[10,-13],[-1,-28],[1,-39],[-7,1],[-1,-22],[-4,-21],[3,-1],[0,-21],[-10,9],[6,10],[-14,1],[-4,-23],[-2,6],[-8,-26],[-9,6],[-14,-1],[-3,20],[-2,-6],[-4,15],[-7,9],[-6,24],[0,13],[9,-9],[-13,31],[-11,37],[-2,13],[4,15]],[[9121,2859],[-9,-6],[0,6],[9,0]],[[9109,2896],[9,-16],[1,-14],[-5,-2],[-11,22],[6,10]],[[9001,2876],[-5,-4],[-1,25],[7,3],[-1,-24]],[[8822,3134],[-1,-10],[12,1],[0,-11],[-11,1],[-5,-10],[-20,1],[-4,17],[21,11],[8,0]],[[9263,3604],[-1,-18],[-2,14],[3,4]],[[9261,3608],[-2,17],[3,2],[-1,-19]],[[8136,3714],[7,-36],[-7,19],[0,17]],[[9257,3758],[2,-20],[-10,-37],[1,32],[5,7],[-2,14],[4,4]],[[9195,3832],[5,-3],[0,-17],[-7,17],[2,3]],[[9061,4133],[3,-7],[-3,-7],[-4,13],[4,1]],[[8880,4236],[-7,-7],[0,-6],[-8,0],[1,8],[10,8],[4,-3]],[[8805,4285],[2,-15],[-4,8],[2,7]],[[8797,4395],[0,-9],[6,2],[-5,-8],[-1,-14],[6,-6],[-8,0],[-6,5],[-1,14],[9,16]],[[8621,4522],[5,-21],[-7,4],[-8,-2],[5,9],[-2,9],[6,10],[1,-9]],[[8624,4533],[6,-6],[14,10],[6,-2],[1,-21],[-14,-18],[-13,16],[-3,29],[3,-8]],[[8682,4547],[1,-13],[-4,6],[3,7]],[[8959,4566],[-1,-8],[6,-7],[3,-19],[0,-30],[10,-9],[-4,-20],[6,-4],[4,-11],[-2,-17],[5,2],[-1,-13],[3,-19],[-2,-19],[5,-20],[3,-22],[5,-2],[15,18],[4,-22],[18,-23],[-3,-12],[2,-6],[2,-37],[3,-8],[-2,-16],[6,-22],[9,-9],[-1,-11],[5,-19],[1,-16],[-3,-34],[9,-15],[-2,-17],[5,-14],[13,-15],[4,7],[2,-12],[8,0],[4,-6],[1,-14],[19,-12],[1,-10],[7,5],[3,-13],[4,1],[1,-10],[-4,-1],[-1,-10],[15,-24],[-1,-8],[8,-30],[0,-14],[3,-20],[8,-7],[5,-13],[-3,22],[4,5],[3,-9],[10,-13],[2,13],[6,-21],[-2,-15],[3,-36],[4,0],[4,-13],[5,-4],[6,-13],[6,3],[4,-6],[6,-27],[8,-7],[4,-25],[10,-6],[0,-27],[6,-16],[-2,-19],[4,-40],[-4,-3],[10,-41],[1,-17],[3,-4],[1,-40],[-7,-21],[-2,-39],[-7,-32],[0,-30],[-3,-28],[-5,-21],[-6,-11],[0,-23],[-13,-15],[-11,-20],[-6,-26],[-5,-3],[0,-26],[-9,-18],[-3,-27],[-4,-14],[2,-9],[-8,-7],[-9,-34],[0,-24],[-7,-34],[4,-21],[-2,-14],[-13,-16],[-33,-2],[-16,-10],[-10,-13],[-13,-24],[-19,-4],[3,-12],[4,7],[-2,-20],[-6,16],[-8,-3],[-4,16],[-3,-3],[-8,9],[5,8],[-2,9],[-6,0],[-1,-10],[-8,-5],[-6,8],[8,1],[3,17],[-6,10],[-15,-14],[10,-2],[-2,-8],[-6,0],[-10,-11],[-14,-22],[-32,28],[-5,-2],[-8,7],[-9,-1],[1,-6],[-8,1],[-4,13],[-14,5],[-10,11],[-3,13],[-13,23],[-3,18],[5,6],[0,13],[-9,34],[-14,26],[6,2],[3,10],[-4,3],[-21,-20],[-8,0],[-1,7],[9,12],[3,33],[-8,16],[-3,16],[-7,-13],[-1,-20],[-5,-23],[-7,4],[-15,-11],[3,23],[11,-3],[3,21],[-1,25],[4,17],[9,19],[-3,19],[6,4],[-8,34],[0,-26],[-3,2],[-6,-11],[-5,-27],[-25,-26],[-8,-24],[-4,-3],[-4,-16],[6,2],[0,-12],[-5,7],[-6,-5],[-6,18],[-1,21],[-3,17],[-11,20],[-4,27],[-12,0],[-2,13],[-4,1],[7,15],[-5,12],[-8,-5],[3,9],[-8,16],[-14,-5],[-10,14],[-7,1],[-9,-6],[-12,18],[-18,14],[-9,-7],[-18,2],[-33,-7],[-27,-23],[-20,-11],[-17,-2],[-14,5],[-18,-19],[-15,-10],[-2,-6],[-17,-8],[-4,-5],[-5,-28],[-7,-16],[-6,-7],[-4,3],[-6,-7],[-3,9],[-19,-3],[-8,-6],[0,8],[-14,3],[-20,-2],[-13,-6],[-16,-1],[-9,-16],[-2,-12],[-16,1],[-3,-11],[-7,-4],[-2,-11],[-20,-8],[-2,-5],[-12,7],[-18,-1],[-15,14],[-10,19],[-10,9],[-4,-3],[-4,15],[0,32],[6,-7],[7,3],[6,18],[-1,36],[3,8],[0,43],[-18,66],[-4,34],[1,32],[-5,22],[-7,17],[0,16],[-11,24],[-2,38],[-5,16],[-11,32],[-7,13],[5,14],[6,-26],[7,6],[0,9],[-9,14],[-4,27],[2,4],[7,-20],[-1,-17],[5,14],[2,-22],[7,-2],[0,30],[-5,13],[-6,26],[-4,4],[-3,21],[-5,16],[1,26],[4,22],[5,6],[0,24],[2,10],[-5,22],[3,7],[7,33],[4,4],[-2,-20],[1,-21],[7,4],[8,34],[23,20],[13,26],[21,22],[5,-3],[8,6],[7,-7],[12,7],[8,14],[17,3],[10,20],[12,-6],[7,6],[12,3],[16,11],[11,13],[9,25],[3,19],[4,4],[16,39],[-4,1],[-2,36],[3,14],[8,17],[6,3],[0,10],[7,12],[-1,-15],[5,-3],[0,-14],[12,-37],[-1,10],[3,13],[-2,11],[7,-10],[-3,24],[-6,5],[6,13],[-5,8],[5,2],[7,-7],[-1,9],[7,-9],[16,-1],[-10,3],[-1,9],[6,4],[1,18],[-4,-11],[-3,18],[1,9],[6,1],[3,9],[5,0],[4,-9],[1,10],[-6,3],[4,17],[11,-10],[0,9],[-8,16],[10,14],[3,-4],[7,6],[1,-11],[3,5],[4,26],[-5,5],[4,7],[3,-19],[9,16],[1,-16],[4,14],[4,0],[-3,11],[6,4],[4,-14],[9,1],[11,-28],[10,-16],[-3,-17],[0,-13],[4,-1],[-1,11],[5,14],[4,3],[12,-5],[9,-11],[-1,11],[7,-5],[3,-14],[4,1],[-3,18],[5,-1],[-6,15],[-7,11],[4,20],[7,4],[1,18],[4,9],[11,12],[-5,9],[0,14],[6,2],[0,12],[6,6],[2,11],[7,-14],[0,17],[4,-2],[-1,12],[9,5],[3,-13],[13,4],[4,-5],[9,5],[7,9],[2,24],[-7,12],[-9,-5],[-5,12],[-5,0],[7,11],[10,-1],[9,-21],[6,10],[7,-21],[14,-7],[4,6],[4,-11],[3,4],[4,-12],[6,-1],[8,7],[11,-18],[13,11],[6,2],[-4,-8],[2,-6],[5,7],[5,-5],[-2,-11],[7,-1],[3,14],[-5,3],[10,9],[4,-17],[3,7],[4,-11],[-12,-28],[4,-6],[-9,-21],[0,9],[-5,-6],[0,8],[-7,-9],[0,-26],[4,3],[-4,-29],[-3,-3],[-7,-24],[-4,-4],[2,-13],[22,-27],[0,-8],[10,-11],[4,-9],[7,1],[10,-14],[10,-7],[9,-21],[7,-8],[20,-9],[4,-7],[1,-15],[22,-24],[14,4],[10,13],[3,24],[7,18],[3,26],[3,9],[-2,9],[3,25],[5,20],[-4,40],[3,16],[-4,13],[1,21],[5,21],[-2,18],[6,14],[-2,11],[-5,-4],[6,28],[6,1],[-2,8],[6,41],[0,14],[5,2],[6,11]],[[5470,7982],[-2,-9],[5,-23],[3,-3]],[[5476,7947],[-3,-17],[-12,3],[-6,-6],[7,-3],[-5,-12],[-1,-22],[-9,-9]],[[5447,7881],[-19,-12],[-16,-2],[-9,-14],[-23,9]],[[5380,7862],[-32,7],[-12,17],[2,7],[-12,-5],[-17,-1],[-4,-11],[-15,6]],[[5290,7882],[-2,7],[-6,-8],[-16,12]],[[5266,7893],[-2,12]],[[5264,7905],[1,14]],[[5265,7919],[4,2]],[[5269,7921],[7,0],[8,-16],[6,15],[12,-1],[2,-7],[9,1],[9,10],[32,4],[6,-11],[3,9],[-5,5],[1,13],[-6,9],[4,7],[12,5],[4,16],[7,-3],[3,13]],[[5383,7990],[7,-9],[18,0],[7,11],[0,12],[11,-1],[20,-13],[10,3],[13,-6],[1,-5]],[[6281,7420],[-19,8],[-9,14],[-9,24]],[[6244,7466],[-1,3]],[[6289,7594],[9,-6],[11,-12],[5,-17],[16,-3],[5,15],[9,6],[5,16]],[[6349,7593],[15,-31],[1,-11],[10,-28],[15,-3],[8,-10],[-11,-3],[-13,-11],[0,-11],[-6,-28],[4,-11],[-5,0],[-1,-17],[-7,10],[-2,-43]],[[6357,7396],[-7,-2],[-6,12],[-11,12],[1,8],[7,2],[-5,18],[6,7],[-10,16],[-4,-1],[-26,-29],[-11,-17]],[[6249,7560],[8,10],[13,-8],[8,-9],[6,1],[6,-8],[4,3],[1,15],[-10,9],[-3,13],[7,8]],[[5848,5045],[-4,-15],[2,-14],[9,-5],[0,-17],[-9,-13],[-9,-34],[-11,-21],[-3,1]],[[5823,4927],[-9,39],[1,21],[-4,4]],[[5811,4991],[0,18],[-4,5],[-2,12]],[[5805,5026],[4,7],[5,-4],[0,-9],[11,1],[5,7],[1,21],[6,-6],[7,7],[4,-5]],[[5166,8104],[10,-14],[1,-10],[-8,-11]],[[5169,8069],[-7,-3],[-4,-16],[2,-14]],[[5160,8036],[-9,-3],[-4,10],[-13,7],[-1,21],[-9,-13],[-10,3],[2,15],[-5,5],[-10,0],[0,6],[-11,5],[-4,15],[-7,-6],[-7,8],[-2,15]],[[5070,8124],[16,14],[7,3]],[[5093,8141],[0,-6],[16,-3],[8,9]],[[5117,8141],[1,0]],[[5118,8141],[3,3],[16,-1],[7,-8],[9,0],[9,-11],[-6,-13],[10,-7]],[[5099,5856],[-3,-17],[7,-16],[0,-19],[3,-5],[-1,-16],[-5,0],[1,-14],[-3,-18],[-6,-3],[0,-9],[-5,-12],[-2,-20],[-8,-4],[-2,-15],[0,-41],[-1,-12],[2,-25],[1,-42],[-2,-18]],[[5075,5550],[-31,-9]],[[5044,5541],[5,3],[-5,18],[1,24],[0,73],[-1,5],[0,43],[-6,13],[-1,37],[-16,23],[0,19],[4,17]],[[5025,5816],[5,3],[1,13],[4,-1],[3,11],[6,-3],[11,2],[8,13],[3,14]],[[5066,5868],[-1,19],[14,10],[10,-21],[2,-8],[6,-4],[2,-8]],[[5006,6041],[-2,-21],[6,-16],[-1,-9],[7,-24],[5,0],[7,-13],[7,-7],[-9,-1],[0,-15],[6,-6],[11,-19],[8,-1],[3,7],[5,-3],[3,-15],[-6,-4],[10,-26]],[[5025,5816],[-12,0],[-18,8]],[[4995,5824],[-8,-3],[-5,-10],[-2,5],[-59,0],[-3,-22],[3,-11],[2,-25],[0,-24],[2,-5]],[[4925,5729],[-4,-4],[-10,24],[-6,5],[-10,1],[-11,-7],[-4,-11],[-11,3],[-4,12],[-3,-1],[-4,24],[-9,1],[-3,7]],[[4846,5783],[3,24],[-2,14],[6,9],[1,19],[-4,14],[8,10],[9,1],[10,18],[-1,24],[6,0],[0,14],[-3,11],[10,13],[15,-13],[5,7],[0,25],[6,-5],[5,21],[11,16],[12,-6],[1,16],[8,3],[11,13],[8,5],[8,15],[8,-4],[8,2],[11,-8]],[[7529,6456],[0,16],[3,-11],[-3,-5]],[[7521,6458],[-5,-7],[2,29],[-4,4],[3,11],[6,-20],[-2,-17]],[[7571,6448],[0,-29],[2,-10],[-12,7],[1,-20]],[[7562,6396],[1,-15],[-7,20],[-1,27],[-3,9],[-2,29],[-11,31],[-5,-14],[-9,0],[-8,26],[1,14],[-4,6],[-9,4],[11,-11],[-4,-10],[2,-12],[-3,-8],[5,-13],[-2,-18],[-6,-9],[-1,-11],[-7,1],[1,7],[-5,6],[-2,-15],[-12,-7],[0,14],[-4,-18],[-4,10],[-1,18]],[[7473,6457],[-6,48],[2,14],[-7,2],[3,13],[-6,8],[0,11],[5,8],[0,22],[-7,0],[-11,12],[-2,7],[4,12],[5,1],[3,18],[13,-1],[-3,18],[-8,1],[-3,11],[-9,14],[2,12],[5,4],[4,14],[5,-9],[11,-3],[7,-14],[7,-2],[2,15],[6,-18],[-2,-4],[1,-32],[15,-8],[23,2],[7,-3],[18,3],[11,-14],[-6,-2],[-5,-31],[-5,-2],[0,-9],[-8,2],[0,-6],[-7,0],[-7,-21],[2,-14],[9,-30],[7,5],[0,15],[5,8],[-1,11],[5,4],[8,-22],[0,-25],[3,-12],[3,-42]],[[5793,7702],[0,-17],[-11,-3],[-6,-14],[-2,-26],[-4,1],[-8,-16],[5,1],[11,-28]],[[5778,7600],[-13,-4],[-6,9],[-21,-5],[-7,-15]],[[5731,7585],[-8,0],[2,-21],[-25,-7],[-9,10],[-8,1],[-2,6],[-14,0],[-8,-7],[-13,0],[-10,-4]],[[5636,7563],[3,22],[-5,18],[-9,5],[-5,11]],[[5620,7619],[5,6],[-3,23],[9,5],[7,17],[-13,15],[-4,15],[1,17],[8,13]],[[5630,7730],[9,-8],[-4,-15],[17,3],[18,-8],[10,3],[21,-5],[4,-4],[11,5],[9,16],[25,10],[10,-10],[15,-2],[8,-13],[10,0]],[[6402,6694],[3,0],[0,-24],[-4,8],[1,16]],[[2971,6401],[-3,-10],[-15,-3],[-1,6],[9,10],[4,-4],[6,12],[0,-11]],[[2969,6475],[8,-3],[-7,-3],[-1,6]],[[2948,6491],[0,-14],[-5,9],[5,5]],[[2889,6546],[9,-13],[-10,9],[1,4]],[[2908,6546],[6,-21],[0,-8],[7,-10],[0,-8],[-7,15],[-1,14],[-5,18]],[[2840,6572],[6,0],[0,-20],[-8,5],[-3,13],[5,2]],[[2908,6577],[-3,0],[-4,16],[7,-16]],[[2830,6632],[3,0],[8,-40],[-8,-11],[-10,14],[7,37]],[[2869,6655],[0,-4],[16,-20],[-1,-29],[-2,7],[3,17],[-6,14],[-11,8],[1,7]],[[2819,6722],[15,-4],[-21,-5],[6,9]],[[2839,6733],[5,0],[16,-25],[0,-11],[-4,-3],[0,-19],[-6,5],[4,8],[0,18],[-8,23],[-7,4]],[[5528,7765],[9,0],[-7,-29],[14,-17],[-10,-5],[7,-13],[-1,-8],[-7,-3]],[[5533,7690],[-8,-3],[0,-8],[-7,-6],[-1,-13],[-4,0],[-1,-26]],[[5512,7634],[-22,19]],[[5490,7653],[-2,3]],[[5488,7656],[0,8],[-35,57],[-8,32],[-7,3],[0,29],[6,2],[10,-12],[3,10],[9,-1],[4,7],[4,-7],[22,-6],[4,4],[19,-3],[2,-11],[7,-3]],[[5781,8416],[4,-6],[9,3],[3,-8],[9,4],[11,-6],[1,-13],[12,9],[16,-3],[11,-11],[-2,-19],[6,-15],[-7,-13],[11,-10],[-3,-7],[7,-14],[15,-15],[-3,-11],[10,1],[11,-9],[6,-11],[-15,-22],[-22,5],[-4,-9],[8,-10],[2,-30],[5,-13]],[[5882,8183],[-23,-2],[-12,-29],[3,-14],[-7,-1],[-6,11],[-15,-1],[-9,-6],[-5,14],[-13,-11],[-11,13],[-16,-10],[1,7],[-13,0],[-1,7],[-21,5],[-10,6],[-28,2],[-19,-4],[-11,-18],[-11,3],[0,-5]],[[5655,8150],[0,34],[-12,10],[6,13],[15,11],[0,18],[-7,25],[-5,28]],[[5652,8289],[20,1],[5,-4],[12,5],[-1,7],[19,11],[1,-8],[8,6],[-7,3],[9,37],[8,1],[3,10],[9,-1],[6,10],[-8,1],[2,20]],[[5738,8388],[11,10],[17,-2],[8,17],[7,3]],[[2547,6247],[-3,-6],[9,0],[-1,-18],[-5,-28],[4,-4],[-4,-10],[2,-16],[-2,-24],[-7,-21],[-5,-2],[-5,-20]],[[2530,6098],[-9,0],[2,51],[0,60]],[[2523,6209],[4,10],[4,-6],[9,26],[0,6],[7,2]],[[3084,4249],[-4,-1]],[[3080,4248],[4,1]],[[3384,4022],[-1,21],[-24,29],[-24,0],[-51,-22],[-4,-23],[-10,-28],[0,-29],[-8,-54],[-3,-14]],[[3133,3869],[-10,-5],[-9,4],[1,16],[-3,11],[0,16],[-4,7],[-3,23],[0,15],[-6,20],[-4,2],[2,18],[-6,6],[1,10],[-3,14],[6,2],[1,8],[-5,11],[7,16],[-13,23],[-3,34],[-3,18],[2,6],[-7,5],[0,8],[-5,18]],[[3069,4175],[-4,17],[7,8],[10,30]],[[3082,4230],[5,-3],[-1,11],[8,5],[0,6],[-7,0],[-1,9],[4,4],[-7,3],[0,7],[-10,17]],[[3073,4289],[6,16],[-7,15],[6,28],[5,6],[3,20],[-6,22],[4,8],[-1,36],[7,11],[2,12],[-16,55],[-9,34]],[[3067,4552],[23,-3],[-1,-8],[10,6],[9,20],[11,3],[11,19],[7,3],[11,20],[19,8],[7,1],[4,-5],[5,9],[3,-32],[-4,-13],[3,-21],[-2,-18],[2,-19],[3,-2],[1,-14],[4,-2],[1,-12],[5,-1],[4,-10],[6,-4],[1,-11],[13,-4],[4,4],[10,-7],[4,-8],[5,4],[9,-20],[4,1],[8,-10],[7,0],[0,-6],[8,-17],[22,4],[18,-27],[-2,-20],[5,-18],[1,-28],[-9,-1],[9,-20],[3,-47],[47,-4],[3,3],[0,-13],[-4,-8],[2,-34],[11,-15],[6,-1],[0,-8],[6,-27],[0,-10],[-6,-46],[-9,-38],[7,-13],[-8,-10]],[[3651,3581],[1,22],[3,0],[-4,-22]],[[3650,3661],[-4,8],[6,7],[-2,-15]],[[3919,4412],[0,-16],[-4,16],[4,0]],[[3660,5124],[-3,3],[4,9],[-1,-12]],[[3588,5149],[0,-7],[-8,-7],[1,9],[7,5]],[[3577,5151],[2,-5],[-4,-19],[-3,-11],[-15,-19],[0,13],[7,10],[0,14],[2,11],[8,8],[3,-2]],[[3573,5156],[5,19],[0,-10],[-5,-9]],[[3608,5175],[11,-6],[9,5],[27,-7],[-2,-14],[-1,-20],[-4,-14],[-5,-5],[0,-14],[-7,-5],[-3,7],[0,-11],[-9,1],[-6,-12],[-14,3],[-4,-6],[-5,2],[-7,28],[1,13],[6,-5],[1,8],[-7,-1],[0,23],[2,17],[4,10],[5,5],[8,-2]],[[3586,5165],[-4,4],[1,13],[7,3],[2,-9],[-6,-11]],[[3625,5187],[3,-5],[-2,-7],[-11,2],[10,10]],[[3599,5183],[-5,0],[-2,9],[6,-1],[1,-8]],[[3624,5200],[-6,-5],[-3,-12],[-14,0],[-1,12],[8,1],[15,9],[1,-5]],[[3600,5213],[1,-14],[-2,-7],[0,23],[1,-2]],[[3609,5216],[-6,-13],[1,14],[5,-1]],[[3608,5236],[0,-10],[-5,0],[5,10]],[[3600,5305],[1,-11],[-5,4],[4,7]],[[3431,5295],[13,-7],[2,14],[-6,10],[5,17],[6,-8],[11,2],[0,4],[10,2],[8,-5],[3,-7]],[[3483,5317],[3,-7],[8,-3],[7,3],[6,9],[5,-7],[6,5],[9,-9],[9,11],[8,31],[1,14],[4,7],[15,44]],[[3564,5415],[5,24],[8,-16],[1,-21],[3,4],[-1,-29],[3,-31],[7,-22],[1,-18],[6,-18],[13,-4],[4,-8],[0,-19],[-7,-4],[7,-3],[-11,-17],[-5,-12],[-4,-17],[-5,-11],[-5,-1],[-9,-17],[-4,-19],[-8,-19],[0,-14],[-7,-8],[-1,-13],[-6,4],[-14,-13],[13,2],[0,-10],[9,7],[7,10],[11,11],[13,17],[-5,-12],[5,-5],[0,-14],[4,-9],[0,-11],[7,-14],[4,9],[6,4],[5,-7],[12,10],[1,-7],[-5,-41],[2,-2],[8,40],[7,18],[2,-8],[8,21],[3,-12],[1,19],[4,-2],[4,16],[1,15],[5,0],[5,12],[2,-11],[4,10],[11,-7],[19,-9],[0,-10],[7,-6],[8,5],[1,-7],[10,-9],[1,-8],[6,9],[-2,-11],[1,-13],[3,11],[5,4],[10,-14],[-3,-5],[6,-1],[3,-8],[-5,-16],[5,5],[3,-14],[-4,0],[-5,-36],[2,-9],[6,14],[1,23],[8,8],[1,-9],[-7,-12],[7,-2],[2,14],[9,4],[6,-4],[-1,12],[4,0],[18,-13],[6,-11],[15,-5],[3,6],[5,-9],[29,4],[3,2],[14,-3],[25,-31],[3,-1],[8,-15],[5,-2],[11,-27],[14,-26],[9,-6],[4,-12],[6,-1],[6,-8],[16,-1],[5,3],[13,-6],[4,-13],[9,-57],[1,-24],[5,-21],[-1,-53],[-7,-40],[-7,-25],[-10,-27],[-3,5],[-2,-16],[-12,-24],[-3,-13],[-10,-10],[-5,-9],[-11,-37],[-15,-52],[-13,-34],[-5,0],[0,14],[-4,9],[-4,-16],[0,-17],[-4,-7],[0,-27],[-2,-5],[2,-28],[-3,-20],[2,-9],[0,-24],[2,-28],[2,-6],[-4,-25],[-6,-53],[1,-31],[-2,-9],[-7,-8],[-7,-30],[2,-51],[-3,-13],[-6,-6],[-9,-44],[-13,-31],[-8,-25],[4,-27],[-5,-10],[-12,-7],[-13,-20],[0,-21],[-17,1],[-11,-3],[0,18],[-7,-5],[2,-13],[-22,-7],[10,7],[-9,3],[-8,-7],[-2,7],[-9,-7],[1,-17],[-10,-3],[-2,-6],[-10,-7],[-1,-11],[-12,4],[-8,-7],[-1,-7],[-11,-6],[-11,-13],[-5,-12],[-10,-9],[-10,-15],[-1,-15],[-8,-7],[-6,4],[1,-17],[-4,-17],[-1,-19],[-5,-6],[4,-6],[-3,-16],[3,-6],[2,-32],[-2,-52],[-4,-17],[-17,-23],[-5,-12],[-14,-39],[-8,-37],[-10,-34],[-12,-25],[-22,-27],[-3,-9],[0,17],[5,-4],[11,20],[5,3],[4,11],[-1,12],[5,1],[0,10],[9,9],[-1,22],[4,-6],[1,12],[-12,-4],[-9,8],[3,-7],[-6,-21],[-1,-24],[-6,-10],[-9,-4],[-3,-21],[-4,-3],[-1,-14],[5,-10],[-5,-7],[-6,-30],[-7,-26],[-18,-28]],[[3517,3240],[-4,10]],[[3513,3250],[2,1],[1,23],[5,4],[2,13],[5,6],[5,-10],[6,18],[-4,16],[-12,-19]],[[3523,3302],[-11,11],[-5,23],[-15,14],[-9,21],[-8,3],[-4,8],[-7,3],[-2,10],[-8,11],[-6,-13],[-4,0],[0,16],[-23,40],[-7,0],[-2,-8],[-11,-2],[-2,6]],[[3483,3710],[0,8]],[[3483,3718],[5,3],[0,26],[4,16],[0,34]],[[3492,3797],[-9,15],[-10,-10],[-13,1],[-3,21],[1,11],[-4,23],[1,21],[-7,19],[-9,1],[-6,12],[-12,-10],[-31,8],[0,36],[3,16],[-9,61]],[[3067,4552],[-11,2],[-7,-8],[-12,3],[0,41],[1,29],[2,20],[-10,-14],[-2,-7],[-9,-11],[-25,0],[-3,27],[-14,7],[-11,0],[7,16],[0,8],[-6,17],[-4,2],[-1,11],[-5,6],[-2,15],[-5,9],[2,9],[-8,14],[1,11],[7,2],[-3,13],[2,13],[11,17],[5,3],[1,12],[-3,14],[8,24],[1,30],[14,14],[14,21],[17,5],[10,6],[5,11],[9,1],[3,-6],[10,-5],[0,5]],[[3056,4939],[6,58],[0,9],[5,46],[0,10],[5,54],[-4,13],[-2,24],[-13,21],[1,42],[12,4],[3,5],[10,-6],[-2,21],[-4,4],[-14,0],[0,37],[8,4],[5,-3],[34,0],[-1,16],[7,-15],[5,4],[9,19],[4,-5],[7,-29],[-1,-21],[6,2]],[[3142,5253],[11,-21],[10,-7],[10,14],[6,-1],[-1,-17],[11,17],[1,10],[11,6],[10,16],[0,-8],[9,16],[0,14],[19,16],[1,14],[-20,4],[2,15],[-6,20],[0,30],[-13,22],[-4,12],[2,5],[4,-10],[12,0],[4,-14],[10,4],[4,-5],[4,7],[4,-5],[7,-18],[7,5],[-1,20],[6,1],[4,9],[7,-6],[18,12],[0,6],[16,10],[10,22],[-2,13],[-3,1]],[[3312,5482],[11,0],[3,4],[8,-12],[-3,-33],[6,0],[5,-8],[-2,-8],[4,-14],[0,-10],[-7,-12],[1,-13],[-4,-17],[-1,-22],[2,-17],[5,-5],[0,-26],[6,-8],[8,-19],[8,-4],[4,-7],[8,5],[0,10],[5,9],[9,-5],[6,11],[7,0],[3,11],[9,7],[9,-8],[9,4]],[[3347,5935],[-4,3],[0,13],[6,-10],[-2,-6]],[[8198,5465],[5,-34],[-7,5],[-2,24]],[[8194,5460],[4,5]],[[8166,5448],[6,-1],[7,5],[7,12],[9,10],[-2,-10]],[[8193,5464],[-7,-9],[2,-17],[0,-14],[-7,-10],[-7,23],[-8,11]],[[7545,6781],[-2,-8],[5,-11],[6,3],[3,-10],[-3,-11],[3,-13],[-5,-4],[-33,-3],[-10,8],[-6,-9],[-11,-3],[-12,9],[-6,-2],[-7,7],[-3,12],[4,10]],[[7468,6756],[3,13],[13,29],[11,14],[12,3],[0,-5],[9,-1],[-4,-10],[18,-5],[5,6],[10,-8],[0,-11]],[[5701,4158],[-1,-8],[8,-27],[7,-13],[6,-21],[4,-29],[8,-13],[14,-17],[7,-3],[3,-9],[0,-15],[12,-1],[-1,-34],[6,-12],[3,-15],[18,-5],[12,-10],[1,-14],[7,-7]],[[5815,3905],[-9,-3],[-3,-13],[-8,-7],[-12,-4],[-12,-27],[-5,-6],[-2,-10],[-11,-7],[-4,-13],[-5,-31],[-8,-10],[-3,-10],[-15,-6],[0,-10],[-8,-41],[-5,-7],[-10,1],[-4,-5],[-17,5],[-10,6],[-13,20],[-7,1],[-7,-5],[-6,-23],[0,-14],[-6,-13],[-8,-7],[-6,-18],[-7,-2],[-2,-10],[-15,0],[-15,4],[0,21],[5,11],[0,19],[-4,13],[-1,14],[-10,29],[-8,10]],[[5554,3757],[0,159],[28,0],[0,212],[23,4],[21,9],[21,5],[9,-27],[15,26],[7,4],[4,-6],[7,13],[12,2]],[[5634,5812],[4,-14],[8,-14],[10,-31],[1,-16],[-1,-21],[-5,-6],[3,-9],[-2,-17],[19,-1]],[[5671,5683],[2,-7],[-4,-11],[3,-6],[16,-5],[8,-17],[5,-3],[1,-11],[-4,-4],[6,-14],[18,-19],[2,-10],[8,-10],[-2,-16],[8,-21],[6,-2],[13,-23],[-1,-15],[6,-14]],[[5762,5475],[-12,7],[-4,-8],[-10,-1],[-12,12],[-6,-3],[-11,9],[-4,-5],[0,-13],[-18,-7],[-5,11],[-6,-10],[-27,-19],[-12,12],[-9,-34],[-3,-5],[-23,9],[-2,-3],[-20,12],[-7,-2],[-6,20],[-13,14],[-3,7],[-10,1],[-17,-34],[-1,-7],[-6,-3],[2,-12],[-1,-27],[1,-13]],[[5517,5383],[-4,9],[-11,-4],[-16,7],[-8,-6],[-15,-2],[-4,-7],[-3,-27],[1,-7],[-8,-34]],[[5449,5312],[-2,8],[0,26],[-4,13],[-5,3],[-15,32],[-6,21],[4,1],[-3,14],[-10,19],[-1,31],[-4,6],[2,8],[1,27],[-7,10],[10,13],[5,24],[3,4],[6,30],[6,14]],[[5429,5616],[9,-4],[7,8],[10,5],[4,11],[2,-12],[5,-7],[23,26],[7,-2],[5,4],[15,1],[15,36],[-6,7],[0,8],[5,5],[17,0],[10,7],[9,-1],[4,12],[8,5],[5,19],[13,24],[5,4],[3,10],[-1,14],[8,5],[0,5],[14,9],[9,-3]],[[2957,7804],[-12,-5],[13,16],[-1,-11]],[[2699,7829],[2,-7],[13,9],[3,-9],[5,9],[9,-4],[2,-11],[-7,-12],[-23,15],[-15,6],[11,4]],[[2665,7849],[6,-2],[-2,-11],[-4,13]],[[3319,7889],[6,-10],[-2,-13],[-7,-22],[5,3],[-19,-34],[10,5],[9,11],[-10,0],[12,21],[4,-8],[11,0],[-7,-23],[-16,-12],[-6,3],[-13,-5],[-5,21],[1,13],[6,7],[10,30],[7,14],[4,-1]],[[3221,7879],[6,-21],[3,6],[12,-8],[33,3],[3,-3],[-17,-10],[4,-13],[-11,-3],[-2,12],[-19,2],[-4,11],[-11,0],[2,14],[-9,-1],[4,16],[7,9],[-1,-14]],[[3503,7956],[10,3],[-1,-7],[-9,4]],[[2562,7993],[-9,-6],[0,8],[9,-2]],[[2924,7774],[20,14],[8,11],[6,0],[2,17],[7,17],[14,11],[5,9],[17,17],[5,-2],[32,22],[14,22],[0,4],[14,20],[0,5],[16,23],[21,20],[44,28],[28,8],[18,-3],[10,-5],[11,-14],[1,-8],[-11,8],[11,-15],[-4,-13],[-11,-4],[-1,-6],[-18,-13],[-16,11],[-3,-5],[-11,0],[18,-11],[9,-15],[8,9],[12,0],[3,-6],[-7,-14],[-1,-10],[-11,-13],[16,0],[-3,-15],[11,-32],[20,-8],[-8,-6],[7,-7],[10,0],[4,-9],[5,5],[24,-6],[10,10],[5,-15],[7,3],[7,-12],[-7,-5],[14,-3],[-1,-4],[-18,-7],[0,-3],[-32,-21],[-9,4],[-4,-9],[-8,1],[1,-9],[-11,0],[1,10],[-9,-5],[-4,-8],[2,-10],[-6,-5],[-8,-19],[-9,-10],[-6,1],[-9,-11],[-5,14],[-9,5],[-1,14],[7,29],[21,24],[22,18],[1,-13],[7,8],[20,9],[-34,2],[-5,-6],[-4,6],[13,15],[-3,9],[-5,-12],[-16,-9],[-17,-16],[-4,4],[-10,-10],[-12,-1],[-8,6]],[[3134,7784],[-9,6],[1,19]],[[3126,7809],[-10,9]],[[3116,7818],[1,1],[-1,74],[-14,17],[-16,-11],[-9,17],[-19,-37],[-4,-23],[-7,-12],[1,-17],[-12,-20],[1,-11],[-18,-5],[-6,-16],[-89,-1]],[[1546,8044],[6,-11],[-14,13],[8,-2]],[[1479,8054],[4,-13],[-7,0],[-4,9],[7,4]],[[3218,8058],[33,-11],[15,-14],[11,-6],[10,-14],[-16,-6],[-24,11],[-14,9],[-2,9],[-22,16],[9,6]],[[1494,8104],[-11,-4],[6,9],[5,-5]],[[1448,8112],[20,-17],[22,-5],[26,-13],[5,-19],[9,-12],[4,-16],[22,-13],[10,-22],[8,-25],[-6,-6],[-11,3],[-22,14],[-14,12],[9,11],[-18,-4],[-9,9],[4,11],[-8,0],[-1,10],[-14,-3],[0,11],[7,3],[-8,5],[-1,10],[-15,-2],[-33,43],[-2,7],[16,8]],[[3447,8155],[6,-8],[7,7],[-5,-17],[-12,4],[2,-12],[7,-5],[-28,-60],[-3,-27],[6,13],[13,21],[12,-13],[7,0],[-17,-14],[11,-17],[15,9],[-2,-16],[12,1],[8,14],[9,-8],[5,3],[15,-10],[-4,-13],[-17,-15],[10,3],[-3,-15],[12,-7],[3,10],[4,-6],[7,9],[-5,-19],[-11,-9],[-7,0],[6,-14],[-6,-9],[8,-15],[2,13],[6,14],[12,6],[-9,-18],[-1,-22],[8,8],[3,14],[5,-19],[-5,-10],[-2,-19],[-5,-17],[-6,3],[-10,-3],[4,26],[-2,5],[-14,-23],[-4,1],[8,31],[1,14],[-5,15],[-18,-29],[-10,-9],[0,-8],[-8,-11],[-9,-1],[-9,5],[3,7],[11,3],[15,28],[-11,3],[-6,-12],[-10,12],[-28,-4],[-25,3],[-6,4],[-18,-6],[-15,-2],[-4,17],[27,37],[-9,3],[-14,-6],[8,9],[6,-3],[9,33],[10,-9],[-2,9],[8,4],[-11,4],[25,78],[8,11],[8,28],[24,18]],[[1448,8147],[-7,0],[2,14],[5,-14]],[[1445,8181],[-2,-17],[-4,14],[6,3]],[[2798,8181],[-3,-7],[-8,3],[11,4]],[[1462,8192],[-15,-17],[2,14],[17,12],[-4,-9]],[[1430,8212],[1,-9],[-8,2],[7,7]],[[2738,8248],[8,-1],[10,-15],[3,-12],[-10,1],[-29,15],[6,10],[12,2]],[[1339,8249],[4,-12],[-6,-9],[6,-21],[17,-18],[-5,-5],[-20,26],[-16,32],[20,7]],[[1427,8244],[3,-10],[-2,-21],[-14,7],[-3,12],[2,20],[14,-8]],[[1419,8255],[-7,1],[4,10],[3,-11]],[[1382,8268],[9,-8],[5,-15],[-7,0],[-15,26],[8,-3]],[[1386,8270],[-9,4],[2,6],[7,-10]],[[1395,8273],[11,-17],[-5,-9],[-21,36],[3,5],[12,-15]],[[1380,8293],[-2,-10],[-7,7],[9,3]],[[1305,8302],[20,-3],[5,-14],[-15,-10],[13,-2],[2,21],[12,6],[-8,-28],[0,-22],[-13,-7],[-9,10],[7,6],[-11,3],[-7,25],[4,15]],[[2815,8428],[-1,-10],[-7,-3],[4,17],[4,-4]],[[2787,8429],[-11,-11],[1,8],[10,3]],[[2801,8446],[-3,-6],[9,-8],[-12,-27],[-8,-3],[2,12],[-9,-16],[-3,4],[14,23],[3,-5],[3,26],[4,0]],[[3293,8462],[1,-19],[-7,7],[6,12]],[[3204,8666],[5,-10],[-11,7],[6,3]],[[3109,8672],[7,-7],[-4,-10],[-10,-6],[-3,7],[5,16],[5,0]],[[3200,8731],[-2,-16],[-16,19],[18,-3]],[[2793,8775],[5,-7],[-8,-30],[-8,-9],[-10,11],[-2,14],[12,23],[11,-2]],[[3203,8784],[8,0],[-6,-10],[-9,3],[7,7]],[[3033,8802],[15,-11],[0,-7],[-13,1],[-7,15],[5,2]],[[2719,8809],[7,-3],[-2,-12],[-27,-27],[-23,-5],[-6,18],[18,27],[8,-5],[9,6],[16,1]],[[2822,8839],[21,-4],[4,-9],[-13,-10],[-16,17],[4,6]],[[3216,8833],[-8,14],[5,2],[3,-16]],[[2857,8849],[12,-6],[0,-11],[-20,14],[8,3]],[[3204,8862],[4,-12],[-12,8],[8,4]],[[3186,8910],[2,-6],[-13,-6],[11,12]],[[2625,8972],[12,-9],[-7,-5],[11,-20],[9,16],[14,-17],[20,-4],[4,-10],[19,-12],[5,2],[16,-14],[5,-23],[19,-8],[-1,8],[22,-21],[-8,-2],[-19,-16],[-26,14],[-12,-1],[-1,17],[-15,-1],[2,13],[-19,-10],[2,-14],[-19,-8],[-9,-19],[-25,-10],[-5,33],[-27,-2],[-14,-5],[8,20],[20,13],[-6,24],[6,15],[0,28],[5,23],[13,12],[1,-7]],[[2638,8984],[9,-10],[0,-16],[-12,13],[3,13]],[[2657,8990],[18,-11],[-3,-6],[15,-10],[-15,2],[-15,25]],[[2936,9103],[24,-5],[1,-12],[-28,0],[-10,16],[13,1]],[[2601,9095],[-7,-12],[-8,5],[-3,16],[9,13],[7,-6],[2,-16]],[[2900,9117],[16,-9],[-4,-11],[3,-24],[-9,-11],[-14,-6],[-31,-1],[-7,12],[0,22],[15,25],[31,3]],[[2096,9122],[-15,8],[14,1],[1,-9]],[[2919,9131],[3,-14],[-16,10],[2,12],[11,-8]],[[2173,9144],[-3,-12],[-12,5],[15,7]],[[2218,9152],[-13,-10],[2,17],[11,-7]],[[2820,9179],[-10,-28],[-16,-3],[26,31]],[[2860,9180],[10,-6],[-13,-11],[-6,16],[9,1]],[[2315,9189],[14,0],[-4,-11],[-10,11]],[[2342,9191],[8,-12],[-14,-3],[6,15]],[[3114,9197],[-2,-10],[-10,3],[12,7]],[[2834,9196],[-16,-12],[-9,1],[20,15],[5,-4]],[[2787,9204],[9,-8],[-21,-3],[4,-8],[-24,10],[16,8],[16,1]],[[2294,9191],[5,5],[10,-12],[22,-14],[6,-20],[18,-3],[-17,-6],[-13,-15],[-33,4],[-9,7],[-25,7],[-3,8],[-11,-6],[-11,11],[33,17],[-4,16],[12,-9],[-6,16],[10,11],[18,-11],[-2,-6]],[[3004,9275],[14,-3],[-20,-12],[-5,8],[11,7]],[[2924,7774],[-11,-4],[-19,-25]],[[2894,7745],[-6,-7],[-19,-10],[-11,-18],[-17,9],[-5,-3],[-30,-8],[-17,-15],[-5,-17],[13,-6],[7,4]],[[2804,7674],[-1,-9]],[[2803,7665],[5,-11],[-36,-7],[-9,-13],[-11,6],[-12,-1],[-32,-36],[-12,-2],[-5,4],[0,12],[5,4],[13,-1],[1,10],[-6,4]],[[2704,7634],[5,9],[1,17]],[[2710,7660],[8,4],[12,20],[-1,38],[4,14],[9,16],[0,12],[-12,25],[11,0],[1,-14],[14,-17],[18,-14],[0,17],[4,6],[6,-5],[-9,17],[2,14],[-10,3],[-10,32],[-12,0],[-10,8],[-39,6],[-3,0],[-30,10]],[[2663,7852],[0,10],[-10,-4]],[[2653,7858],[-3,4],[4,24],[-8,1],[3,23],[-11,14],[5,20],[-25,0],[-8,9],[-12,39],[-22,-2],[-24,14],[-2,-22],[-7,-2],[3,15],[-6,-2],[-5,-26],[-5,-3],[3,16],[-10,-5],[-5,-22],[-7,-6]],[[2511,7947],[-9,-1],[-4,7],[-20,0],[-2,7],[-16,-11],[-8,4],[-10,14],[-8,-7],[-3,12],[-14,11],[-22,-6],[-3,7],[-17,3],[-6,5],[-4,31],[-9,3],[0,-22],[-79,0],[-80,0],[-55,0],[-79,0],[-79,0],[-49,0],[-49,0],[-80,0],[-61,0],[-74,0],[-81,0]],[[1590,8004],[-8,0]],[[1582,8004],[-1,0]],[[1581,8004],[-7,20],[2,14],[-8,-11],[-12,8],[-1,15],[-14,0],[-6,8],[3,18],[-3,5],[-9,0],[-20,12],[-13,-2],[6,17],[-14,1],[-10,6],[-4,-6],[-14,11],[-8,12],[9,23],[13,3],[-9,3],[-10,-15],[-4,12],[0,14],[19,25],[0,13],[-12,-16],[-7,-5],[-8,17],[-4,-12],[4,26],[-10,9],[-10,34],[10,-5],[-8,12],[5,21],[-17,-20],[-3,-14],[-21,32],[-4,26],[-6,-3],[1,17],[7,4],[10,33],[-5,0],[-4,28],[2,8]],[[1387,8402],[0,0]],[[1387,8402],[-1,12],[-9,1],[-9,13],[-10,3],[-14,11],[-7,0],[0,11],[-7,4],[2,10],[-29,56],[-20,40],[-12,8],[-4,12],[-21,22],[3,8],[-13,13],[-25,-11],[-2,-20],[-27,-20],[-5,17],[-43,50],[3,16],[-17,-1],[-9,-8],[-12,6],[-16,1],[0,538]],[[1083,9194],[29,-2],[23,-6],[15,-16],[50,-21],[26,2],[-3,18],[20,5],[-1,8],[29,8],[12,-5],[-9,-9],[24,4],[10,14],[16,0],[45,28],[22,-4],[5,11],[9,-11],[-45,-25],[-27,-6],[-3,-10],[-18,-6],[-4,-15],[-9,3],[-4,-11],[24,-3],[-11,15],[29,13],[15,12],[12,-9],[14,21],[35,9],[0,-10],[23,16],[-2,9],[22,7],[-13,3],[0,17],[23,-16],[14,-32],[15,-16],[20,-9],[9,4],[-8,12],[10,9],[8,18],[10,-1],[-2,-19],[12,0],[-13,-19],[24,-2],[14,8],[6,20],[36,-3],[23,-10],[23,-16],[31,-5],[23,-13],[57,-13],[-9,8],[11,4],[38,-17],[18,-18],[-3,-9],[-26,2],[-8,-18],[-9,-3],[47,-13],[40,-1],[3,4],[36,1],[22,14],[13,-16],[18,0],[7,-21],[6,15],[20,-23],[-7,-21],[25,-29],[-12,23],[1,18],[16,-14],[-4,15],[-9,8],[0,15],[-12,12],[7,19],[35,18],[21,5],[1,13],[-24,-7],[2,-8],[-22,-7],[-16,5],[7,-11],[-22,-3],[-2,12],[-10,-3],[14,20],[27,5],[31,14],[12,-3],[9,-11],[4,-20],[19,-6],[4,-12],[20,-1],[9,8],[5,-11],[27,-14],[21,-3],[23,10],[26,-1],[15,-7],[25,5],[22,-12],[12,11],[-16,12],[-10,-9],[-10,10],[3,9],[-11,11],[27,1],[-8,9],[21,-3],[5,-12],[18,3],[-11,-15],[26,12],[-16,-41],[11,-19],[10,8],[11,-20],[4,16],[-15,26],[7,19],[17,-3],[18,14],[18,33],[-10,8],[-5,-13],[-15,0],[11,34],[18,-2],[2,13],[-22,-5],[-9,14],[-7,-7],[-25,10],[-21,22],[1,14],[9,15],[-12,9],[5,30],[14,6],[8,-7],[5,12],[-13,4],[18,9],[2,13],[18,3],[4,-19],[7,7],[32,-24],[4,-30],[37,-41],[-25,2],[-4,-6],[18,-3],[-25,-18],[20,-9],[18,7],[10,-9],[19,-1],[-23,-12],[14,-11],[6,-20],[-2,-17],[9,-12],[11,12],[4,31],[11,15],[9,1],[28,-27],[5,-32],[-16,2],[1,-19],[8,-19],[17,-15],[-1,-14],[15,7],[-3,7],[14,-1],[1,20],[17,23],[7,37],[25,0],[-10,13],[11,7],[-20,11],[-2,10],[6,23],[7,-4],[20,5],[16,-9],[30,-1],[15,-23],[22,-5],[-6,-12],[-12,-5],[20,-5],[1,-10],[-20,-13],[-17,6],[-2,-7],[18,-11],[-5,-13],[26,-30],[-7,-27],[-13,-1],[-17,-24],[-12,-1],[-10,-11],[-25,21],[16,-30],[-4,-2],[-19,14],[4,-14],[-25,7],[-5,17],[-19,-5],[-18,2],[7,-12],[19,-9],[-16,-15],[-3,-13],[-23,-20],[-16,0],[-17,15],[-31,20],[-10,-3],[-30,2],[32,-7],[14,-11],[11,-16],[56,-5],[2,-11],[-16,-20],[-14,-27],[-18,-15],[-24,1],[-12,10],[4,-14],[-10,-17],[-21,-3],[-19,10],[-14,0],[-37,16],[-8,-2],[11,-10],[4,5],[31,-11],[-10,-11],[18,11],[6,-8],[25,-12],[2,-18],[-22,-16],[-19,5],[-10,-3],[15,-16],[-19,5],[-2,-20],[-8,-12],[-18,-12],[11,-4],[-17,-12],[-19,-60],[-8,-31],[3,-40],[-3,-17],[13,-17],[3,4],[29,-1],[2,-15],[10,-37],[9,-24],[-3,-25],[12,2],[30,12],[15,-3],[15,-12],[30,-8],[12,-15],[13,-10],[7,-15],[10,-12],[11,-1],[32,-17],[21,-20],[12,-3],[19,5],[15,-6],[12,1],[18,-9],[3,-14],[-6,-25],[0,-12],[8,-17],[-2,-23],[3,-13],[-5,-19],[20,-28],[6,-21],[10,-5],[15,-30],[1,-10],[19,-11],[1,16],[10,15],[11,-20],[6,11],[-9,15],[13,19],[2,22],[-6,4],[1,19],[-5,0],[-5,42],[-2,32],[-7,2],[-6,25],[-5,1],[39,22],[16,14],[19,23],[12,21],[4,16],[0,44],[-8,34],[-9,20],[-24,23],[-13,16],[-2,16],[22,21],[-1,20],[14,6],[-1,13],[-7,2],[-7,35],[6,6],[-16,2],[10,15],[2,20],[6,5],[-13,13],[-4,34],[18,16],[21,-4],[32,-14],[34,-1],[14,12],[18,-9],[17,-14],[-1,-8],[30,-19],[-9,-10],[14,-16],[23,-5],[11,2],[2,-11],[12,-1],[2,12],[5,-18],[-12,-15],[6,-26],[2,-26],[-6,-6],[3,-9],[11,-2],[-8,-8],[2,-18],[-19,-7],[10,-3],[15,12],[13,1],[11,-6],[5,-24],[7,10],[9,-20],[28,15],[6,21],[10,-9],[5,18],[7,3],[-2,12],[8,8],[-3,22],[8,2],[7,25],[14,2],[0,-12],[9,-6],[-1,-17],[6,0],[5,-15],[12,-13],[-11,-9],[13,3],[1,-13],[7,1],[4,-11],[-9,-11],[16,0],[-2,-19],[15,-12],[7,-20],[-14,-11],[10,2],[6,-6],[-6,-7],[18,-7],[-8,-18],[-7,0],[5,-13],[-9,-4],[11,-10],[-12,-2],[5,-5],[14,1],[-3,-13],[10,-2],[1,-7],[22,-5],[-4,-5],[3,-16],[-4,-16],[20,12],[-2,-10],[10,-5],[10,9],[6,-22],[30,-6],[14,-10],[-9,-11],[-15,-1],[-1,-6],[-33,-12],[21,5],[3,-3],[-30,-15],[-13,-3],[2,-15],[-11,-14],[38,24],[6,15],[19,9],[-5,7],[24,-1],[11,-22],[-12,-11],[6,-9],[9,15],[30,-19],[4,-15],[-6,-7],[5,-9],[-7,-12],[8,-9],[4,-17],[-8,-15],[-20,-17],[-10,-13],[-8,5],[-25,-14],[-8,3],[-7,-12],[-8,-5],[1,-12],[-13,-8],[0,-8],[-11,-6],[-3,-10],[-38,-3],[-10,-5],[-6,7],[-51,4],[-26,-2],[-37,0],[-5,-5],[-8,5],[-19,-25],[-3,-23],[-4,-6],[-19,-3],[-4,-11],[-24,-18],[-10,-28],[-7,-9],[-19,14],[-5,-2],[22,-14],[-5,-20],[-10,-17],[-6,-3],[-6,-17],[-17,-23],[-15,-1],[-21,-24],[-10,-4],[-7,-18],[-12,-11],[-7,-11],[-6,-2],[5,-8],[-15,-12],[-6,-8]],[[1827,9404],[6,-29],[-17,-11],[32,3],[-4,6],[17,15],[49,-17],[-3,-15],[17,6],[18,-8],[8,4],[-26,29],[23,-2],[24,-23],[11,-1],[-1,-11],[13,-38],[6,-4],[21,15],[-15,14],[-9,45],[0,25],[29,-10],[8,7],[26,-17],[18,-30],[4,-24],[19,-29],[-7,-28],[16,-17],[25,-16],[8,1],[35,-23],[16,4],[4,-24],[-13,-6],[-4,13],[-5,-14],[-19,11],[-14,-26],[22,5],[-2,-17],[9,-10],[-19,-8],[-24,-5],[-49,6],[4,12],[-40,5],[-4,18],[-10,-16],[-17,-13],[-28,-6],[-12,-9],[-56,-11],[-59,-3],[-16,19],[2,22],[-18,5],[-26,-3],[-22,4],[-18,9],[0,6],[-18,12],[-4,14],[39,12],[41,5],[53,-7],[9,7],[22,-3],[-18,14],[-19,2],[-18,8],[-58,-6],[-19,4],[-40,-1],[-19,23],[17,8],[41,11],[13,11],[-48,-10],[-21,6],[13,5],[-36,7],[0,11],[16,17],[13,3],[-13,15],[34,25],[50,16],[27,11],[10,-5]],[[2094,9405],[-16,-22],[-8,1],[-18,19],[-26,12],[13,13],[42,1],[16,-10],[-3,-14]],[[2768,9430],[25,-7],[37,2],[19,-6],[32,-26],[-1,-17],[-52,5],[-28,-9],[-22,6],[-4,22],[-21,5],[1,25],[14,0]],[[2595,9436],[41,-3],[4,-8],[-30,-21],[-18,-26],[10,-20],[-3,-28],[9,-14],[19,-16],[14,-5],[-16,-13],[-13,0],[-8,-10],[21,10],[18,-2],[8,17],[-4,14],[-16,-1],[-8,13],[2,21],[16,1],[-18,12],[-3,25],[14,2],[-6,11],[26,-5],[-19,15],[63,24],[37,-1],[11,-27],[14,-5],[0,-14],[10,-10],[-26,-24],[18,11],[-11,-18],[5,-13],[12,5],[16,25],[23,-13],[11,14],[26,14],[67,-15],[7,-14],[-14,-14],[33,4],[0,-15],[-32,-17],[31,12],[19,-1],[-10,-9],[-4,-17],[12,19],[3,-12],[15,-7],[13,23],[32,-12],[8,-11],[-10,-12],[-11,3],[-13,-14],[4,-6],[25,7],[4,9],[15,2],[3,-9],[-13,-17],[30,15],[-3,-16],[15,10],[31,-11],[-10,-16],[-31,-9],[32,3],[-1,-16],[12,9],[6,14],[24,-23],[2,-12],[-26,3],[-15,-11],[19,-8],[19,1],[16,-11],[-2,-8],[-26,2],[-15,8],[-22,3],[22,-8],[13,-10],[-8,-4],[5,-11],[-43,2],[33,-6],[-9,-8],[29,-2],[23,-6],[-10,-6],[8,-11],[37,-12],[12,7],[-2,-12],[18,-4],[13,-28],[-21,-10],[47,10],[-7,-18],[22,-5],[5,9],[18,-10],[10,-16],[-20,-10],[14,-3],[-30,-8],[14,-7],[-7,-17],[-15,-3],[7,-7],[-17,-1],[-7,16],[3,-21],[-9,-4],[9,-9],[-5,-24],[-17,9],[-9,14],[-1,-9],[-18,16],[-1,14],[-9,5],[19,17],[-31,-5],[-2,9],[-22,20],[2,8],[-13,-6],[-6,-11],[-16,12],[7,-15],[16,-12],[-1,-7],[-20,-1],[-9,18],[-2,-18],[12,-16],[14,3],[-2,-10],[10,-2],[10,-39],[1,14],[31,-16],[-3,-16],[17,0],[-10,-10],[11,-14],[11,-5],[-9,-11],[12,-6],[0,-25],[-7,5],[-4,18],[-2,-14],[10,-29],[-17,5],[8,-19],[-7,-5],[-1,13],[-12,11],[-12,-3],[-13,13],[-5,-5],[-20,21],[-6,12],[-1,-16],[-27,24],[-8,-3],[23,-33],[17,-6],[17,-21],[5,0],[16,-26],[7,-2],[-9,-20],[-30,16],[-35,7],[-12,7],[-25,24],[-9,-2],[-38,22],[-5,14],[15,10],[-16,12],[-2,-7],[-15,9],[-13,14],[-15,33],[-20,-9],[4,15],[-14,-6],[-5,-14],[-30,14],[-5,-12],[-24,-12],[-14,2],[-18,11],[-4,27],[5,9],[18,8],[-3,15],[21,-2],[25,-11],[9,-9],[-6,-7],[10,-12],[-2,16],[-16,17],[23,-3],[1,7],[15,-3],[11,12],[19,-5],[-7,19],[-8,4],[-13,18],[41,32],[5,19],[15,6],[-4,22],[-12,18],[-4,23],[-23,5],[3,18],[-19,-6],[-13,16],[2,15],[-9,-11],[-10,2],[-32,-14],[0,20],[28,3],[1,9],[-30,19],[-15,5],[10,9],[-23,0],[0,21],[-20,2],[-10,12],[-21,2],[21,-15],[3,-13],[-29,-7],[-6,8],[-39,3],[15,-14],[-9,-2],[-14,13],[-15,-11],[-25,12],[-15,-3],[-31,3],[-5,4],[-39,2],[-21,21],[1,-11],[-47,11],[-21,25],[9,7],[22,-4],[27,0],[-15,18],[-6,-3],[-47,6],[-5,7],[5,17],[-9,11],[5,24],[25,52],[36,27],[33,8]],[[2227,9438],[17,-9],[57,6],[4,-12],[-12,-6],[8,-7],[-19,-7],[-19,-16],[35,-3],[9,-16],[12,3],[5,-18],[-9,-6],[3,-27],[-25,-13],[-26,2],[9,-8],[-13,-13],[-19,3],[-13,25],[-27,24],[-21,3],[-34,24],[-4,9],[14,16],[11,-4],[16,-18],[24,2],[10,8],[-4,14],[-11,1],[-28,20],[11,7],[16,-9],[3,8],[-13,12],[33,5]],[[2287,9448],[-13,-11],[-23,-4],[-12,7],[34,10],[14,-2]],[[2423,9449],[18,-8],[8,5],[45,-7],[-28,-33],[-12,-21],[-14,-14],[-33,4],[-13,-4],[10,-16],[-18,-22],[-29,-6],[-2,33],[-11,9],[-2,60],[11,2],[1,14],[44,9],[25,-5]],[[1623,9476],[28,-12],[41,-10],[46,4],[58,-41],[-3,-6],[-28,-9],[-76,-37],[-3,-15],[-14,-8],[-13,1],[-3,-32],[-7,-11],[-22,-7],[-9,5],[-11,-12],[-27,-10],[-26,36],[-34,14],[-14,0],[0,10],[14,22],[9,4],[-4,18],[17,2],[-12,9],[14,21],[16,15],[-10,9],[-14,28],[87,12]],[[2118,9518],[-3,-12],[-30,4],[15,17],[18,-9]],[[2378,9537],[25,-20],[2,-24],[-5,-11],[-41,1],[-43,18],[23,30],[25,8],[14,-2]],[[2325,9539],[-16,-17],[-5,9],[21,8]],[[2164,9558],[-14,-12],[-20,-1],[7,9],[27,4]],[[2380,9546],[-17,10],[11,3],[6,-13]],[[2157,9563],[-38,-10],[11,8],[27,2]],[[1732,9567],[5,-3],[-22,-28],[-10,-5],[-22,5],[20,18],[29,13]],[[2805,9567],[0,-15],[-16,-3],[16,18]],[[2149,9575],[-6,-11],[-43,0],[2,8],[47,3]],[[2113,9595],[25,-12],[-38,-5],[-7,16],[20,1]],[[2266,9598],[21,-11],[7,-58],[-18,1],[14,-20],[-11,-7],[-47,-3],[-20,3],[-11,19],[33,20],[-52,-5],[-33,-7],[2,14],[20,10],[-6,28],[18,3],[35,-31],[7,21],[-30,12],[15,9],[23,0],[13,-10],[20,12]],[[2213,9601],[-38,-8],[20,9],[18,-1]],[[2508,9589],[-10,-2],[-15,15],[17,6],[8,-19]],[[1981,9607],[-3,-11],[20,-20],[-11,-11],[22,-7],[-10,-10],[27,5],[12,10],[31,-10],[1,-18],[-15,-30],[-28,-8],[-21,7],[-19,-7],[-5,8],[-25,-11],[-22,-4],[-24,-12],[-34,-10],[-29,0],[-27,17],[52,17],[27,0],[19,13],[-36,-6],[-3,5],[-44,-9],[-5,24],[-10,-23],[-35,-6],[-55,16],[12,13],[30,0],[31,14],[-30,-8],[-32,0],[10,12],[57,5],[-39,0],[-12,12],[23,10],[10,12],[36,1],[7,-17],[28,5],[33,-21],[14,-22],[62,-1],[6,7],[-32,17],[18,11],[-30,11],[18,11],[15,19],[15,0]],[[1840,9610],[3,-10],[-34,3],[31,7]],[[2354,9618],[44,-6],[16,-16],[46,3],[26,-13],[-26,0],[59,-9],[-2,-7],[-52,-1],[30,-6],[28,-18],[2,-16],[14,11],[11,-8],[26,6],[13,-9],[59,10],[21,10],[23,-5],[16,6],[39,-3],[40,-18],[6,-11],[-25,-15],[16,1],[10,-9],[-23,-7],[-1,-11],[-29,0],[-12,-6],[-33,5],[-7,16],[-11,-16],[-84,-5],[-53,2],[2,20],[-21,-15],[-21,-3],[-30,10],[-10,-4],[-19,9],[1,10],[-13,14],[11,38],[-14,8],[-14,21],[-17,-6],[-37,-3],[6,7],[-27,3],[-11,14],[-18,4],[15,6],[-15,7],[13,6],[32,-1]],[[1774,9644],[20,-9],[-25,-7],[-2,-15],[13,-14],[-30,-8],[-9,-17],[-20,9],[5,24],[-19,-6],[-1,-22],[-34,-26],[-19,-3],[-7,19],[-15,-12],[-46,8],[9,15],[31,5],[9,14],[22,7],[15,17],[27,15],[26,1],[18,-6],[32,11]],[[2491,9653],[17,-10],[-11,-14],[-30,11],[0,13],[24,0]],[[2083,9641],[18,-11],[-11,-7],[-23,12],[-14,25],[13,0],[17,-19]],[[2350,9662],[51,0],[13,-7],[-11,-10],[-70,0],[-6,13],[23,4]],[[2196,9660],[-42,-1],[0,9],[21,1],[21,-9]],[[1824,9675],[20,-11],[-15,-6],[-27,14],[22,3]],[[1955,9679],[-35,-12],[21,-5],[-3,-16],[-52,-10],[-31,11],[3,23],[51,10],[46,-1]],[[1933,9718],[31,-15],[-4,-11],[-50,5],[-52,-7],[-5,8],[40,8],[40,12]],[[2308,9715],[18,-10],[40,-9],[-15,-7],[9,-16],[-51,-11],[-22,18],[22,2],[-33,10],[-10,12],[7,18],[35,-7]],[[2120,9752],[22,-6],[10,-21],[25,12],[58,-29],[-8,-16],[22,-13],[0,-11],[-25,-6],[-19,5],[-12,19],[-45,10],[-50,-6],[-10,18],[38,-3],[1,15],[-18,11],[-27,-9],[10,11],[-26,2],[4,16],[50,1]],[[2237,9796],[21,-8],[-5,-17],[-36,22],[20,3]],[[2423,9866],[56,-44],[40,-1],[1,-15],[22,9],[22,-2],[19,-26],[-9,-26],[20,9],[23,-2],[24,-19],[-46,-14],[-69,-50],[-26,25],[15,-26],[-24,10],[0,-11],[-49,4],[-22,17],[34,3],[-45,2],[-28,21],[25,12],[79,3],[-58,1],[0,12],[-36,-11],[-3,7],[-33,-6],[-14,15],[27,4],[-31,3],[-21,14],[-4,14],[53,-6],[21,9],[-36,-4],[-32,9],[14,17],[41,2],[7,8],[-33,3],[17,15],[39,0],[7,9],[-28,8],[41,-2]],[[3064,9969],[92,-13],[-63,-13],[33,0],[64,14],[63,-22],[36,-2],[8,-17],[-85,-27],[-75,-6],[11,-7],[-78,-18],[137,21],[-4,-9],[-119,-45],[-9,-11],[-28,-4],[-23,-32],[-31,-8],[-32,7],[7,-13],[-52,-10],[-85,-2],[20,-4],[80,-3],[-1,-11],[-35,3],[-9,7],[-57,-2],[56,-5],[-45,-3],[55,-3],[-14,-6],[38,-1],[8,-15],[-22,-5],[-30,2],[38,-10],[-14,-14],[-35,-13],[-43,0],[19,-17],[-14,-13],[-47,-6],[-38,9],[-17,14],[5,-14],[18,-8],[57,-7],[-10,-14],[19,-6],[18,11],[7,-22],[-21,-10],[-5,7],[-22,-15],[-42,-11],[8,17],[-36,5],[-6,-7],[-40,2],[-13,10],[-6,-17],[-23,-1],[-61,10],[-4,-7],[-37,4],[-15,10],[-1,17],[33,15],[23,-1],[15,8],[-21,5],[-15,25],[29,7],[27,-6],[22,-23],[54,-3],[27,35],[-39,-27],[-38,10],[15,39],[-21,-13],[-21,5],[-35,-4],[1,19],[24,20],[44,7],[35,-5],[56,1],[-53,4],[-30,6],[11,9],[-23,27],[-37,6],[0,32],[75,-4],[67,-35],[-7,16],[-44,23],[80,9],[54,8],[-44,0],[94,17],[-62,-3],[-2,9],[57,26],[-37,-9],[-40,-28],[-44,-11],[-53,-5],[27,11],[-48,2],[1,-13],[-55,-1],[-26,5],[26,19],[85,11],[-93,-8],[-33,-21],[-58,14],[99,12],[30,12],[-43,-8],[-98,-8],[-15,8],[12,11],[45,14],[-57,-12],[12,13],[-22,4],[-21,-8],[-14,7],[27,11],[83,15],[87,-6],[-56,12],[43,5],[-12,10],[30,1],[59,-23],[-11,12],[82,-19],[-75,24],[18,17],[41,-8],[-28,15],[47,-2],[16,12],[41,-3],[44,-11],[-31,15],[35,4],[54,-3],[10,-8],[24,12],[91,2]],[[5255,7927],[0,0]],[[5255,7927],[0,0]],[[5255,7927],[10,-8]],[[5264,7905],[2,-12]],[[5290,7882],[-2,-13],[-10,-7],[4,-15],[-6,6],[-12,-4],[-2,10],[-5,0],[-1,-14],[-5,-6],[-1,-18],[-7,10],[2,5],[-11,9],[0,13],[-10,-11],[1,-8],[-9,-12],[-8,4],[-13,-4]],[[5195,7827],[-7,15],[0,14]],[[5188,7856],[-5,6],[-8,-4],[-3,-9]],[[5172,7849],[-4,7],[2,10],[8,9],[0,11],[7,4],[12,28],[8,-5],[5,10]],[[5210,7923],[14,-1],[9,5],[4,9],[9,-9],[9,0]],[[3101,2016],[-9,-10],[13,-7],[6,-18],[-2,-7],[-8,14],[-15,-2],[2,19],[-18,-5],[-1,-4],[-14,10],[3,5],[39,9],[4,-4]],[[3116,2021],[14,-1],[7,-9],[-5,-12],[-7,7],[-9,-6],[-8,1],[-2,15],[10,5]],[[3041,2018],[7,-9],[-19,2],[-1,8],[13,-1]],[[3069,2021],[8,-5],[-19,-3],[-1,8],[12,0]],[[3013,2074],[7,-1],[8,-15],[-5,-7],[-8,10],[-4,-3],[-2,16],[4,0]],[[3003,2080],[6,-2],[-5,-24],[-11,16],[0,7],[10,3]],[[3044,2081],[2,-8],[-9,4],[3,-17],[-9,10],[-1,10],[8,1],[-2,10],[6,7],[2,-17]],[[2972,2103],[2,3],[22,-21],[-6,-2],[-14,-18],[4,15],[-9,1],[-7,-7],[1,12],[-8,1],[3,17],[12,-1]],[[2925,2147],[15,-16],[8,0],[21,-22],[-10,3],[-11,14],[-13,-1],[-10,22]],[[3093,2028],[0,-1]],[[3093,2021],[-12,-3],[-17,9],[-13,-4],[-23,10],[-10,10],[-17,-8],[-1,12],[8,-7],[10,12],[7,-9],[6,12],[-2,12],[20,-15],[7,5],[13,-4],[10,-11],[3,8],[-28,18],[-4,19],[24,15],[-1,8],[-25,-6],[-6,8],[1,17],[9,1],[0,8],[12,7],[2,13],[6,4],[5,-11],[16,0]],[[2952,2165],[-2,-17],[-9,0],[-2,7],[13,10]],[[2921,2176],[8,-2],[-6,-7],[-2,9]],[[2938,2182],[8,-11],[-5,-6],[-3,17]],[[2920,2209],[3,-4],[-3,-19],[-5,7],[5,16]],[[2943,2211],[3,-10],[-9,5],[6,5]],[[2925,2234],[1,-8],[-9,1],[8,7]],[[2931,2257],[2,-13],[-14,-1],[-1,9],[9,-2],[4,7]],[[2924,2263],[1,-11],[-8,7],[7,4]],[[2906,2275],[8,0],[-10,-15],[2,15]],[[2931,2276],[3,1],[5,-22],[-5,0],[-6,13],[3,8]],[[2908,2302],[14,-5],[0,-6],[-18,-9],[1,12],[7,-5],[-4,13]],[[2903,2329],[8,-14],[-12,3],[4,11]],[[2914,2359],[5,-2],[0,-12],[-9,10],[4,4]],[[2906,2359],[2,-6],[-9,-5],[7,11]],[[2925,2377],[5,0],[2,-27],[-3,-27],[3,-13],[-9,-10],[-4,6],[1,25],[-4,-21],[-7,11],[-2,25],[13,-3],[2,12],[-7,18],[10,4]],[[2906,2392],[1,-9],[-7,-5],[-2,13],[8,1]],[[2924,2406],[4,-8],[2,-18],[-14,4],[-1,6],[9,16]],[[2913,2413],[9,-4],[-1,-11],[-7,-2],[-5,19],[4,-2]],[[2907,2415],[7,-32],[-6,0],[0,16],[-5,-5],[-3,20],[7,1]],[[2921,2430],[3,-17],[-11,6],[-1,6],[9,5]],[[2945,2427],[4,-6],[-19,2],[7,7],[8,-3]],[[2914,2436],[-3,-8],[-5,6],[8,2]],[[2924,2545],[-1,-11],[-10,7],[11,4]],[[2936,2556],[-5,-9],[0,15],[5,-6]],[[2955,2556],[-6,-2],[3,11],[3,-9]],[[2948,2591],[3,-16],[-7,2],[-6,12],[10,2]],[[2946,2594],[-9,-4],[3,9],[6,-5]],[[2946,2613],[2,-4],[-11,-6],[-4,10],[13,0]],[[2974,2623],[6,-4],[-12,-23],[-4,-1],[-5,16],[7,2],[-1,11],[9,-1]],[[2948,2662],[3,-7],[-11,0],[8,7]],[[2945,2775],[11,1],[5,-30],[-8,-2],[-4,-15],[9,-10],[-6,-5],[6,-13],[-7,-2],[2,-14],[-17,3],[-3,4],[7,21],[-1,36],[4,8],[2,18]],[[3098,2168],[-21,9],[-7,-4],[-3,-12],[-8,-1],[-27,-20],[-3,-19],[-1,-36],[-7,-5],[-24,11],[-10,15],[5,11],[15,1],[10,5],[6,18],[-5,1],[-22,-19],[-5,6],[-7,-20],[1,-10],[-20,22],[9,0],[-1,20],[14,1],[13,9],[14,0],[-2,5],[-21,3],[-19,-19],[1,-11],[-6,-4],[-8,6],[6,5],[-9,6],[9,1],[2,11],[-11,-5],[0,29],[6,-2],[15,16],[9,-1],[0,13],[-7,-6],[-15,13],[10,-15],[-6,-4],[-4,-13],[-8,7],[0,17],[-9,7],[-1,13],[6,2],[1,13],[-6,-6],[-7,4],[-1,17],[11,-2],[-1,9],[-6,-4],[-5,21],[-13,14],[9,8],[1,26],[3,6],[-5,9],[0,44],[10,11],[-11,13],[-3,13],[21,-4],[6,-13],[5,5],[-10,27],[-1,-6],[-21,1],[-2,12],[9,-2],[-7,11],[6,12],[5,0],[6,11],[-6,2],[-3,12],[-11,0],[-1,-5],[-11,14],[4,11],[-13,-16],[2,-11],[-6,-3],[-4,19],[13,13],[3,10],[12,11],[0,11],[14,3],[6,-14],[-1,-8],[7,-4],[-7,-18],[4,-3],[5,16],[4,49],[8,10],[-3,20],[4,-1],[14,13],[1,15],[-14,13],[4,39],[-1,17],[9,12],[-3,14],[0,18],[5,2],[-3,15],[5,3],[4,-15],[0,27],[-8,-3],[-4,6],[8,12],[-10,13],[-3,-13],[-12,-6],[-7,4],[2,7],[-5,11],[-2,27],[5,20],[1,37],[9,7],[4,19],[1,19],[-9,38],[2,30],[-6,26],[1,22],[9,-3],[5,16],[0,18],[4,-4],[5,42],[6,9],[-1,15],[6,18],[5,6],[1,15],[4,12],[1,31],[6,21],[4,4],[1,12],[-4,23],[6,5],[4,37],[-4,9],[1,25],[-5,52],[0,24],[2,12],[7,5],[2,44],[-5,10],[-1,19],[6,11],[4,20],[0,18],[3,22],[4,2],[-1,30],[4,5],[2,15],[2,41],[-2,11],[2,19],[6,8],[-1,24],[-2,5],[1,62],[3,17],[-6,0],[1,25],[6,1],[4,33],[0,23],[2,25],[2,3],[0,24],[-3,10],[0,37],[2,6],[-1,31],[-5,51],[0,21],[-2,8]],[[3044,4127],[12,4],[4,9],[0,26],[9,9]],[[8073,6343],[8,-9],[1,-20],[-9,-13],[-7,-43],[-4,0],[-5,-15],[-9,-1],[-2,-11],[-14,6],[-14,12],[-1,42],[10,19],[8,9],[-1,10],[7,-3],[5,9],[8,-6],[10,10],[8,-9],[1,13]],[[8066,6398],[4,-5],[-8,-2],[4,7]],[[8393,6916],[2,-7],[-8,4],[6,3]],[[8386,6994],[-10,4],[-11,15],[6,2],[9,-11],[8,-5],[-2,-5]],[[8689,7778],[-2,10],[-10,6],[-11,-7]],[[8666,7787],[-4,7],[-12,-22],[-11,-4],[0,-9],[6,-40],[-2,-28],[3,-6],[-5,-31],[-19,-10],[3,-13]],[[8625,7631],[-8,13],[0,9],[-9,7],[-4,-13],[-1,-19],[-14,-5],[-1,-10],[-7,-10],[-26,-3],[8,-20],[-3,-13],[-30,7],[-2,12],[-9,1],[-12,-34],[-9,-16],[-6,0],[-8,-10],[-16,-14],[-14,-21]],[[8454,7492],[-5,-13],[-6,-5],[-9,3],[-11,-3],[-28,-28],[-3,-9],[-8,-11],[-3,5],[-7,-13],[-10,-4],[0,12],[15,8],[-10,29],[6,0],[-2,11],[12,12],[11,27],[-3,13],[-22,14],[-12,-7],[0,-7],[-10,-13],[-4,-16],[-14,-7],[-17,-19],[-1,-19],[-10,-15],[-10,0],[-7,-8],[-11,11],[-6,-6],[-5,-28],[5,-14],[10,-13],[14,-4],[7,5],[12,-25],[-7,-1],[-2,-21],[10,-12],[13,1],[2,11],[10,10],[3,9],[12,10],[11,-8],[0,-6],[9,-7],[34,-4],[-7,-15],[3,-13],[-9,-5],[-5,9],[-28,-23],[-6,3],[4,-11],[-7,-1],[0,-17],[-11,-5],[2,8],[-8,2],[2,-13],[-7,-22],[-8,-4],[-7,-26],[-5,-3],[1,-16],[12,-14],[17,-12],[6,-38],[11,-36],[-1,-21],[15,-16],[0,-13],[11,-10],[4,-16],[-8,1],[-9,9],[-10,-3],[-4,11],[-11,2],[-5,-7],[-7,4],[-3,16],[-6,2],[3,-11],[11,-13],[16,4],[2,-9],[7,-5],[8,-15],[9,-9],[6,-12],[2,-13],[-9,-2],[-12,-10],[-8,-11],[-5,-15],[6,-2],[6,9],[6,-1],[8,-19],[13,-6],[-13,-19],[7,5],[0,-22],[-4,-6],[-5,3],[1,-27],[-5,-3],[5,-23],[-5,2],[-4,-10],[-3,12],[-9,-28],[-8,-17],[-3,-23],[-6,-4],[-1,-11],[-9,-7],[-1,-8],[-5,9],[-4,-6],[5,-6],[2,-11],[-5,4],[2,-10],[-5,-15],[5,-3],[-3,-18],[-4,0],[6,-17],[-11,10],[-4,-8],[5,-14],[-9,1],[-3,-9],[3,-10],[-10,0],[4,-9],[-3,-8],[-6,3],[-5,-5],[-2,8],[-5,-13],[3,-11],[-5,-4],[-1,-10],[-6,-1],[-7,-13],[-4,1],[-5,-14],[-6,5],[0,-9],[-10,-21],[-1,-10],[-6,1],[-13,-12],[-7,6],[0,-11],[-14,8],[-5,-13],[-6,11],[-5,-7],[4,-8],[-4,-3],[-2,9],[-5,-3]],[[8172,6482],[-4,-2]],[[8168,6480],[-7,-3],[-2,17],[-3,-1],[-2,15],[-6,-8],[6,-17],[0,-15],[-2,-9],[-10,20],[7,-19],[-10,-14],[-5,1],[-13,-12],[-10,3],[-11,-15],[-25,-8],[-3,-10],[-6,-1],[-7,-13],[5,-7],[-1,-13],[7,-9],[-4,-10],[-13,-2],[-1,10],[-7,25],[3,28],[5,0],[0,8],[-8,1],[-2,14],[-1,-16],[-12,1],[0,6],[-9,2],[-9,13],[2,-16],[-6,7],[0,-8],[-9,-5]],[[7999,6420],[-7,10],[-9,-4],[-12,14],[1,6],[-10,2],[0,14],[-4,7],[0,14],[5,0],[0,16],[-14,0],[-18,12],[-7,14],[-14,-13],[1,-9],[-14,-14],[-3,8],[-6,-8],[0,-9],[-11,16],[-4,-12],[-5,11],[-7,-21],[-5,10],[-13,9],[-4,-20],[-3,0]],[[7836,6473],[-13,3],[-4,-12],[1,-10],[5,-15],[0,-39],[-5,6],[-9,-2],[-2,20]],[[7809,6424],[-2,12],[-7,-6],[-3,-8],[-8,-4],[-2,5],[-5,-6],[-2,13],[-4,3],[-1,19],[-14,5],[-6,-1],[0,16],[4,5],[-1,14],[6,11],[-5,13],[-8,-2],[-7,5],[2,6],[-6,40],[6,9],[-9,-3],[-13,1],[-14,-14],[-2,5],[5,10],[-1,18],[-4,0],[0,17],[7,8],[-2,12],[4,11],[2,-3],[6,10],[0,13],[6,-3],[3,13],[7,6],[-4,6],[5,33],[0,29],[-2,31],[-7,4],[-1,-9],[-7,20],[0,16],[-8,13],[-9,9],[-5,-18]],[[7703,6808],[-7,9],[-4,-3],[-7,15],[-7,1],[5,6],[-4,17],[-9,21],[-12,-9],[-6,0],[-6,-9],[-9,4],[-9,11],[-8,-6],[-3,-16],[-9,-6],[-6,-8],[-7,-1],[-9,-16],[-12,-14],[0,-11],[-9,-9],[-12,-5],[-8,2]],[[7468,6756],[-4,12],[3,18],[-1,10],[-6,5],[-13,-14]],[[7447,6787],[-8,2],[-4,-5],[-15,1],[-3,7],[-14,9],[-4,-11],[-9,10],[-3,-11],[-2,13],[-6,7],[-16,3],[2,17],[-4,3],[-7,-6],[-9,11],[-7,12],[-2,16],[-5,5],[-13,-7],[-9,26],[-9,2],[-9,15],[-10,8],[-1,15],[-14,5],[-11,-23],[-7,11]],[[7248,6922],[-11,15],[-10,6],[1,9],[-14,15],[-4,-3],[-9,13],[-5,16],[-9,-8],[-2,12],[4,5],[-4,7],[2,15],[-9,14],[-2,20],[9,4],[6,-16],[10,8],[7,13],[-5,14],[0,12],[-7,3],[-8,16],[-3,33],[8,8],[0,7],[-10,12],[-9,5],[-8,41],[1,9],[-7,0]],[[7160,7227],[-18,1],[-11,8]],[[7131,7236],[-5,6],[0,8],[-13,-4],[-4,10],[1,27],[-7,15],[-9,1],[0,7],[-8,7],[-7,-2],[-9,4]],[[7080,7327],[7,10],[-8,13],[3,7],[-5,17],[-1,26],[-12,9],[-6,0],[-2,-9],[-6,3],[-4,16],[4,9],[-6,12],[1,14]],[[7045,7454],[8,8],[-3,9],[4,18],[11,3],[10,14],[3,10],[11,-4],[8,11],[4,-20],[18,4],[9,13],[0,10],[5,15],[18,-2],[11,5],[5,-2],[8,19],[26,23],[27,15],[-1,8]],[[7227,7611],[1,3],[-3,23],[3,11],[9,6],[-7,5],[13,6],[-4,13],[2,7],[-11,37],[0,32],[5,5],[-18,8],[7,9],[21,5],[23,13],[3,-9],[13,3],[7,-7],[4,17],[-11,7],[7,21],[9,47],[5,14],[0,14],[24,-13],[21,1],[4,-10],[13,13],[7,0],[5,9],[-4,41],[4,25],[25,10],[4,10],[0,17],[4,6],[12,-1]],[[7424,8009],[15,5]],[[7439,8014],[-4,-17],[9,-8],[-2,-9],[16,-10],[2,-12],[14,-12],[11,1],[7,-11],[9,3],[11,-21],[0,-11],[15,-34],[1,-11],[-5,-14],[3,-17],[-7,-13],[-2,-16],[6,-17],[6,2],[16,-9],[23,-4],[11,2],[23,-8],[6,-13],[7,0],[14,-19],[9,-5],[11,2],[-2,-16],[6,-3],[9,-41],[12,-19],[2,-11],[23,4],[63,-13],[14,6],[49,-12],[7,-15],[29,-11],[18,-15],[23,7],[0,-12],[13,-5],[6,10],[44,30],[36,10],[20,-3],[20,4],[25,19],[15,29],[18,12],[10,13],[-9,18],[-7,23],[11,33],[5,4],[13,-1],[5,-10],[14,-6],[13,-3],[16,16],[14,24],[6,-3],[23,5],[15,18],[-1,7],[11,24],[6,3],[15,-1],[1,13],[9,-4],[16,12],[12,-3],[3,5],[14,-8],[11,-1],[5,6],[-4,23],[-18,25],[0,6],[-10,7],[-6,11],[-10,5],[-12,-3]],[[8270,7946],[-7,-13]],[[8263,7933],[-5,-6],[-13,13],[-17,-1],[-11,-9],[-7,10],[-2,13],[8,8],[-1,12],[25,79]],[[8240,8052],[16,-12],[14,-6],[12,9],[13,17],[12,1],[7,6],[1,14],[-4,6],[8,27],[7,10],[1,11],[8,23],[16,14],[3,17],[-4,7],[3,13],[-8,5],[-12,-1],[22,37],[12,1],[26,11],[19,0],[11,6],[28,-11],[4,-9],[20,-1],[17,-13],[23,-49],[-3,-10],[6,-23],[6,-9],[1,-20],[10,-19],[1,-23],[7,-6],[-2,-23],[5,-9],[11,-7],[20,2],[7,-14],[13,-3],[9,-7],[11,-17],[12,0],[-4,-13],[6,-8],[2,-13],[-4,-13],[7,-20],[15,2],[13,-5],[17,3],[3,9],[12,14],[12,-1],[6,9],[18,8],[9,-7],[-4,-13],[6,-17],[-8,-19],[-9,-6],[-4,-38],[-5,-13],[2,-9],[-11,-22],[-1,-15],[-8,-8],[-2,-21],[-8,-3]],[[4913,5477],[0,-1]],[[4913,5476],[0,1]],[[4925,5729],[-2,-26],[3,-1],[4,-47],[-8,-15],[-6,-39],[-7,-28],[2,-31],[2,-4],[4,-31],[5,-1],[2,-13],[-3,-14]],[[4921,5479],[-10,3],[-3,-4],[-15,4],[-5,4],[-18,3],[-3,-9],[16,7],[6,-3],[-22,-5],[-22,-3],[-38,-25],[-5,-8],[-12,-10]],[[4790,5433],[-1,2],[0,41],[5,10],[-1,33],[-10,7],[-1,13],[-6,7],[-10,3],[-6,8],[8,15],[1,23],[-5,23]],[[4764,5618],[7,-1],[3,10],[3,27],[-7,4],[2,14],[7,0],[5,-7],[2,15],[-8,9],[1,12],[5,5],[-5,6],[2,13],[-5,-2],[-3,7],[1,32],[4,6]],[[4778,5768],[4,2],[5,14],[5,1],[3,-12],[9,-6],[2,12],[7,-1],[1,18],[8,-5],[-1,8],[5,2],[2,-15],[-2,-13],[6,-3],[3,9],[11,4]],[[5402,5930],[2,-13],[7,-8],[3,-17],[-1,-10],[5,-3],[2,-34],[-2,-3],[-1,-26],[3,-28],[9,-22],[6,-8],[-7,-3],[-9,3],[-10,-4],[-15,3],[-7,-19],[11,-27],[17,-29],[3,-1],[8,-30],[2,-17],[4,-2],[-3,-16]],[[5449,5312],[-3,-5],[2,-25],[-18,15],[-7,3],[-10,-2],[-8,12],[-9,-3],[-27,0]],[[5369,5307],[-6,5],[-48,3],[-1,-7]],[[5314,5308],[-38,0],[-4,10]],[[5272,5318],[0,12],[4,27],[-1,12],[-8,18],[-2,13],[6,11],[-2,8],[-10,-11],[-10,10],[-2,29],[-11,-4],[2,17]],[[5238,5460],[6,19],[1,41],[4,2],[10,24],[10,13],[2,14],[10,13],[3,-8],[7,1],[1,9],[8,-5],[7,-14],[1,-16],[7,1],[6,15],[-1,8],[10,15],[-2,17],[5,9],[0,9],[5,14],[1,25],[16,23],[2,34],[9,9],[2,17],[-1,14],[6,5],[3,30],[12,34],[6,-1],[11,14],[1,37],[-3,10],[-10,4],[-3,40]],[[5390,5936],[7,0]],[[5397,5936],[-1,-11],[6,5]],[[5398,5936],[1,0]],[[5399,5936],[-1,0]],[[5944,7202],[0,0]],[[5944,7202],[-3,0]],[[5941,7202],[0,0]],[[5941,7202],[3,0]],[[5905,7208],[0,1]],[[5905,7209],[1,0]],[[5906,7209],[1,0]],[[5907,7209],[-2,-1]],[[5935,7200],[1,-2]],[[5936,7198],[-7,-1],[-1,11],[-17,-6],[-3,7]],[[5908,7209],[0,0]],[[5908,7209],[3,-5],[17,6],[1,-10],[6,0]],[[5807,5072],[0,-19],[-2,6],[2,13]],[[5762,5475],[2,-10],[7,-8],[0,-10],[16,-18],[12,12],[6,1],[5,-9],[7,12],[0,6],[10,-5],[0,-12],[4,-3],[7,-21],[10,-6],[0,-14],[6,4],[2,-10]],[[5856,5384],[2,-7],[-5,-19],[3,-15],[-4,-19],[8,-3],[8,-13]],[[5868,5308],[-10,-15],[-12,-24],[0,-15]],[[5846,5254],[-7,-6],[-2,-13],[-6,-5],[0,-21],[-3,-7],[-4,-25]],[[5824,5177],[-7,-9],[-3,-12],[1,-13],[8,12]],[[5823,5155],[-1,-6],[-1,-46]],[[5821,5103],[-7,-8],[-3,-9]],[[5811,5086],[-3,1],[-7,-28],[3,-9],[-3,-10]],[[5801,5040],[4,-14]],[[5811,4991],[-2,-3],[-1,-49],[4,11],[-1,-27],[-3,-5],[0,-30],[7,-28],[-1,-13],[-4,-5],[10,-49],[6,-14],[6,-6],[6,-13],[2,-29],[7,-10],[2,-12]],[[5849,4709],[-28,-8],[-19,-7]],[[5802,4694],[-16,-35],[0,-23],[4,-2],[2,9]],[[5792,4643],[4,-21],[-1,-21],[1,-34],[-5,-16],[0,-10],[-4,-17],[4,-25],[9,-11],[6,-17],[14,-4],[-2,11],[9,5],[0,-75],[-5,1],[-1,12],[-10,-10],[-7,1],[-2,14],[-6,17],[-4,-2],[-1,13],[-5,13],[-16,7],[-6,6],[-3,16],[-5,7],[-1,12],[-5,0],[-1,-16],[-7,-8],[-10,6],[-11,0],[-4,7],[-14,8],[0,26],[-17,-7],[-8,-8],[-4,5],[3,14],[-8,6],[-4,9]],[[5366,4846],[-9,2],[-4,-10],[-7,-3],[-7,16]],[[5363,4916],[8,-9],[0,-6],[8,11],[1,14],[7,-2],[12,12],[2,-8],[-3,-7],[1,-20],[9,0],[4,6],[10,27],[8,8],[1,8],[9,4],[10,35],[-1,29],[1,13],[-1,26],[12,25],[0,7],[11,30],[8,5],[12,27],[0,21],[3,25],[3,7],[-2,14],[1,28],[5,27],[-1,34],[16,57],[0,19]],[[5333,4894],[-5,13],[0,10],[-15,33],[-5,6]],[[5308,4956],[2,12],[8,13],[5,-10],[5,-2],[4,22],[-8,9],[3,10],[-7,12],[2,7],[-1,20],[4,-5],[6,5],[4,-5],[11,5],[-1,24],[5,5],[5,-5],[5,-26],[11,-4],[9,13],[1,6],[9,-22],[5,9],[0,20],[5,5],[1,41],[-2,10],[3,23],[-9,9],[-3,11],[-5,0],[0,27],[5,19],[5,0],[6,16],[-5,18],[0,11],[-14,6],[-7,-9],[-7,-3],[-4,22],[2,23],[3,9]],[[3018,5865],[-19,-13],[-7,-27],[-6,-1],[-7,-26],[-5,-13],[-2,-37],[-11,-37],[11,7],[1,-11],[4,2],[4,-28],[8,-16],[1,-19],[-4,-7],[1,-28],[7,-3],[3,-18],[7,-5],[5,4],[18,-4],[9,7],[10,-10],[7,-1],[18,-46],[5,-2],[7,8],[11,-5],[29,8],[4,-18],[-6,-10],[0,-17],[-5,-6],[0,-66],[5,-28],[4,-2],[5,-17],[-15,-35],[7,-6],[11,-18],[0,-12],[4,-17],[5,-39]],[[3056,4939],[-8,22],[-6,-2],[-7,6],[18,59],[0,7],[-26,25],[-10,-10],[-2,7],[-8,7],[-6,-11],[-10,-7],[-8,6],[-9,-5],[-7,8],[2,12],[-2,17],[-10,6],[1,12],[-4,13],[-7,3],[-5,10],[-5,2],[-4,26],[-6,11],[-5,2],[-8,14],[-5,-2]],[[2909,5177],[-11,11],[-3,-1],[-7,15],[-8,7],[-3,-12],[-9,-1],[-19,10],[-1,14],[-7,11],[-11,5],[-13,16],[-7,13]],[[2810,5265],[-5,10],[5,13],[7,-2],[-3,14],[0,13],[7,19],[10,-5],[0,9],[9,-4],[1,22],[12,29],[0,6],[7,20],[-6,-5],[-4,5],[-1,15],[3,16],[-2,57],[-5,2],[9,12],[0,7],[-7,20],[3,5],[1,19],[-5,6],[-3,17],[-7,14]],[[2836,5599],[2,14],[13,12],[1,13],[4,2],[-6,28],[-3,3],[3,11]],[[2850,5682],[12,-31],[1,-12],[5,0],[-1,29],[-4,10],[7,5],[10,15],[6,23],[12,4],[2,15],[-3,1],[3,13],[-1,20],[3,2],[0,16],[8,14],[11,14],[9,-5],[-3,-8],[7,-4],[4,18],[1,14],[10,-3],[15,1],[6,12],[10,13],[13,10],[3,11],[-1,9],[6,1],[12,10],[8,-6],[3,-18],[-6,-10]],[[6235,4487],[1,-17],[-4,8],[3,9]],[[6207,4496],[-7,9],[1,21],[4,1],[-1,-12],[3,-19]],[[4324,6037],[-5,9],[5,2],[0,-11]],[[4340,6065],[8,-16],[-5,-7],[-4,7],[1,16]],[[4365,6116],[5,-8],[-8,-3],[3,11]],[[4303,6173],[3,-6],[-7,-10],[-3,11],[7,5]],[[2676,5812],[7,-32],[16,-36],[7,-10]],[[2706,5734],[-3,-5],[-5,7],[-2,-8],[0,-23],[6,-10],[-5,-4],[2,-19],[-6,-11],[4,-16]],[[2697,5645],[-2,11],[-5,9],[0,15],[-9,5],[5,-10],[0,-10],[-12,12],[3,27],[-8,14],[-10,11],[-11,8],[1,10],[-12,21],[-4,-7],[9,-12],[-6,-16],[-6,15],[-10,5],[-5,19],[1,16],[3,2],[1,15],[-8,5],[7,2],[0,9]],[[2619,5821],[2,7],[21,-15],[5,7],[13,-10],[0,-5],[8,-5],[8,5],[0,7]],[[2698,6446],[5,-3],[4,-17],[-10,-9],[-8,8],[7,1],[-4,15],[6,5]],[[2836,6454],[6,-1],[-1,-7],[-5,8]],[[2823,6481],[-2,-7],[-7,5],[9,2]],[[2914,6329],[-1,4]],[[2913,6333],[-1,0]],[[2912,6333],[-2,-4]],[[2910,6329],[-10,-1],[-15,6],[-21,-3],[-2,-3],[-21,-3],[6,17],[9,10],[3,9],[-8,15],[-19,-1],[-13,20],[-1,18],[-6,16],[-14,-5],[-10,8],[-8,0],[-10,11],[-5,10],[-13,-1],[-13,8],[-13,4],[-7,11],[12,1],[1,7],[-7,6],[-25,1],[-10,-21],[-7,-9],[-15,0],[-2,-15],[-3,2],[-11,-11],[1,10],[-11,-3],[10,9],[5,0],[-2,15],[3,11],[12,15],[14,8],[3,6],[19,3],[9,8],[27,-2],[3,-6],[15,2],[6,-8],[10,1],[11,-12],[9,-20],[15,-1],[13,-13],[5,-1],[7,-16],[12,-5],[-3,9],[12,-16],[5,-11],[23,-17],[0,-5],[12,2],[3,-6],[-5,-10],[2,-9],[20,1],[7,-5],[9,-19],[5,2],[2,-9],[-3,-6],[-13,0],[-10,-9]],[[3089,5876],[-11,16],[3,2],[8,-18]],[[5905,7209],[1,0]],[[5941,7202],[-6,-2]],[[5908,7209],[6,1],[0,11],[14,-4],[17,8],[15,13],[0,-3],[-19,-22],[3,-11]],[[5938,7197],[0,0]],[[5938,7197],[0,0]],[[5937,7198],[0,0]],[[5944,7202],[-3,-6]],[[5941,7196],[0,6]],[[5936,7198],[0,-1]],[[5936,7197],[-3,-9],[-16,-11]],[[5917,7177],[-8,1]],[[5909,7178],[-7,3],[-5,11],[1,9],[7,7]],[[5907,7209],[1,0]],[[5411,8112],[4,8],[9,-9],[14,-7],[6,-6],[12,-3],[-7,-8],[13,-20],[10,7],[-4,12],[9,-2],[19,-24],[4,4],[7,-7],[8,0],[8,-23]],[[5523,8034],[-8,-1],[-12,-15],[-1,-11],[-15,-14],[-9,4],[-8,-15]],[[5383,7990],[-10,11],[-13,20],[-10,9],[-7,17],[3,13],[-5,11],[6,13],[26,11],[3,8],[9,1],[13,9],[-2,8],[15,-9]],[[5255,7927],[0,0]],[[5394,8289],[0,-4]],[[5394,8285],[0,4]],[[5371,8330],[6,-3],[4,-14],[-11,-5],[-6,4],[1,12],[6,6]],[[5262,8339],[4,3],[12,-11],[5,-15],[13,-5],[11,2],[1,-9],[-10,-8],[12,-2],[8,-7],[5,14],[11,2],[14,11],[13,4],[3,-10],[10,-8],[6,2],[3,-17],[13,-10]],[[5396,8275],[3,-23],[-5,-27],[12,-14],[-3,-9],[7,-21],[-4,-20],[2,-11],[7,-4],[2,-14],[-6,-20]],[[5269,7921],[-15,12],[1,-6]],[[5210,7923],[-2,4],[8,55],[9,11],[2,10],[-16,4],[-4,7],[-18,-1],[-13,17]],[[5176,8030],[4,20],[-6,3],[-5,16]],[[5166,8104],[-3,14],[9,22],[0,9],[-8,12],[5,10],[8,-4],[10,5],[8,28],[-10,5],[2,9],[8,1],[4,18],[0,16]],[[5199,8249],[-3,19],[6,6],[21,2],[6,-18],[0,12],[8,-4],[2,20],[9,1],[-8,29],[10,6],[-9,13],[-1,9]],[[5240,8344],[22,-5]],[[6201,5844],[-9,-28]],[[6192,5816],[-6,4],[-22,-7],[-4,8]],[[6160,5821],[0,12]],[[6160,5833],[0,24],[10,22],[7,22]],[[6177,5901],[8,-6],[3,9],[9,11]],[[6197,5915],[6,-14],[2,-25],[-10,-14],[-7,-3],[-3,-11],[13,3],[3,-7]],[[3294,6081],[4,-5],[0,-15],[-3,-3],[-3,16],[2,7]],[[5312,8347],[17,-10],[-1,-7],[-10,-1],[-8,6],[2,12]],[[5348,8350],[-12,-5],[4,7],[8,-2]],[[5272,8355],[7,-12],[-8,2],[1,10]],[[5413,8363],[6,-13],[-9,3],[3,10]],[[5287,8385],[7,0],[6,-15],[-2,-16],[-19,1],[-11,24],[19,6]],[[5342,8415],[7,-3],[0,-22],[-11,-12],[8,-11],[-13,-8],[5,-3],[-8,-10],[8,-5],[-9,-11],[-4,32],[-13,0],[-2,28],[13,12],[5,-13],[14,26]],[[5247,8463],[-2,-13],[-9,0],[11,13]],[[5240,8344],[-2,32],[-14,7],[3,14],[6,5],[-4,11],[-4,-6],[0,34],[16,1],[7,12],[9,-10],[-3,15],[18,12],[-32,-9],[-5,-13],[-7,3],[11,20],[17,1],[9,6],[10,19],[20,10],[-6,-10],[3,-20],[-7,-15],[2,-23],[12,-1],[5,-6],[-6,-16],[-11,2],[-4,-20],[-20,-21],[6,-16],[-7,-5],[8,-8],[-8,-10]],[[3006,6222],[2,16],[-6,10]],[[3002,6248],[0,0]],[[3002,6248],[-1,2]],[[3001,6250],[-1,4]],[[3000,6254],[8,11],[-2,9],[4,12],[-4,32]],[[3006,6318],[3,11],[14,-4],[4,6],[11,-10],[5,1],[4,-8],[11,0],[4,-20],[6,2],[11,-3],[-2,-5],[-11,2],[0,-8],[24,-7],[12,-20],[-9,-23],[-8,11],[-17,0],[-9,4],[-8,-14],[-9,-2],[-3,12],[-9,-8],[-5,2],[1,-9],[-10,-31],[-6,8],[-4,17]],[[5238,7310],[2,-6],[-7,-4],[1,-6],[-8,-8],[6,-5],[-4,-35],[3,-10],[-1,-19],[4,-5],[-4,-8],[-3,-30],[-11,-11],[-1,-9],[-7,-8],[-1,-14],[7,-25],[0,-11],[10,-7],[6,-15],[2,-20],[19,-24],[7,-62],[6,-44]],[[5264,6924],[-7,-7],[11,-29],[5,-37],[-2,-44],[4,-19],[-5,-34],[2,-21],[3,-4],[-2,-20],[-10,-9],[-3,-10],[18,-52],[0,-25],[5,-5],[1,-10],[6,-6],[7,5],[21,-13],[3,-4],[11,-43]],[[5332,6537],[-28,-35],[-99,-122],[-24,-40],[-17,-32],[-8,-8],[-39,-15]],[[5117,6285],[-26,-9],[-5,7],[4,15],[-2,11],[1,14],[-8,8],[-12,4],[-9,16],[-2,-4],[-9,5],[-4,14],[-14,12],[1,19],[-14,18],[-28,40],[-8,9],[-36,49],[-21,30],[-8,9],[-51,70]],[[4866,6622],[-64,78],[-16,21],[-28,33]],[[4758,6754],[0,22]],[[4758,6776],[0,59],[12,18],[18,22],[7,0],[8,8],[10,0],[27,5],[6,-5],[7,21],[11,17],[11,11],[6,11],[17,8],[3,14],[-8,21],[4,4],[1,15],[23,9],[-3,14],[12,5],[35,-3],[0,17],[6,7],[-11,14],[-4,11],[2,8],[-5,10],[2,18],[-4,8],[2,24],[-4,15],[3,6],[-4,7],[2,9],[-12,19]],[[4938,7203],[8,0],[18,16],[2,12],[11,12],[8,0],[1,7],[6,-5],[8,2],[5,15],[24,22],[25,4],[10,4],[8,-2],[11,13],[3,-4],[12,2],[9,8],[21,-1],[13,-7],[8,-8],[10,11],[14,5],[6,10],[12,-12],[8,2],[0,9],[9,-1],[7,-10],[13,4],[10,-1]],[[2774,5010],[-4,-1],[0,11],[5,9],[5,-3],[-6,-16]],[[2519,5143],[-4,-14],[-5,0],[9,14]],[[2493,5154],[0,-14],[-8,2],[1,11],[7,1]],[[2459,5168],[2,-12],[-7,2],[-1,8],[6,2]],[[2478,5174],[6,-6],[-5,-6],[-4,5],[3,7]],[[2463,5192],[4,-22],[6,-11],[-1,-9],[6,-10],[-4,-13],[-13,-3],[-3,10],[12,14],[-9,21],[-3,18],[5,5]],[[2909,5177],[-10,0],[6,-20],[4,-4],[-1,-13],[2,-13],[-5,0],[-4,-27],[-15,-40],[-16,-25],[-33,-24],[-9,-21],[1,-7],[-6,5],[-1,-22],[-8,-31],[-1,-17],[-4,-3],[-1,-12],[-4,-7],[-8,2],[-5,16],[0,9],[-8,2],[-9,11],[-8,-11],[-2,5],[4,10],[-5,9],[10,10],[-2,22],[-3,6]],[[2768,4987],[11,12],[6,40],[-3,5],[-4,-11],[-1,15],[-7,-22],[-11,18],[-7,5],[5,13],[-1,22],[-2,5],[2,15],[-4,19],[10,7],[3,21],[-1,11],[12,24],[1,31],[-2,13],[12,11],[19,9],[4,15]],[[5949,6986],[2,-6]],[[5951,6980],[17,-99]],[[5968,6881],[-4,-12],[-3,-33],[-5,-16],[0,-26],[-5,-14],[-13,15],[-6,17],[-10,16],[-1,26],[-8,12],[-5,14],[-2,23],[-4,-1],[-4,-16],[6,-10],[3,-16],[0,-14],[4,-6],[14,-42],[5,-5],[5,-36],[4,-4],[5,-25],[0,-11],[11,-43],[15,-51],[8,-35],[15,-29],[-8,3],[2,-41],[3,-16],[6,-13],[10,-6],[2,-8],[16,-29]],[[6024,6449],[-78,0],[-73,0],[0,14],[-6,-14],[-57,0],[-71,0],[-46,0]],[[5693,6449],[0,421],[-3,10],[-1,24],[-4,13],[6,20],[3,17],[-4,22],[0,14],[8,16]],[[5698,7006],[1,-7],[7,-2],[12,7],[14,-6],[27,-8],[1,-7],[8,-5],[5,4],[4,-9],[21,-6],[8,-9],[13,7],[16,22],[4,-4],[4,14],[3,-3],[11,6],[-9,-10],[9,2],[7,11],[13,-9],[8,5],[-3,-15],[7,-4],[1,-7],[6,2],[0,9],[6,-10],[7,-4],[31,7],[9,9]],[[6111,6097],[3,-11],[8,-6],[-12,2],[-2,8],[3,7]],[[6177,5901],[-6,15],[-8,12],[-5,18],[-14,19],[-7,23],[-5,10],[-10,7],[-5,9],[-9,-1],[-10,9],[-10,-6],[-5,10],[-3,-8],[-13,-5],[-6,16],[-3,-1],[-6,12],[-9,-45],[-6,19],[-5,1],[-2,-8],[-10,1],[-6,-4]],[[6014,6004],[-3,51],[6,17],[1,18],[3,5],[5,24],[-2,23],[3,6],[-1,17],[12,-2],[3,17],[21,13],[5,18],[5,9]],[[6072,6220],[9,-35],[0,-9],[6,-31],[1,-24],[3,-23],[4,-4],[0,-17],[5,-2],[2,-22],[4,-1],[-2,18],[3,4],[6,-7],[0,-17],[6,-8],[3,5],[6,-3],[3,-12],[12,-6],[12,-31],[2,-9],[9,-6],[3,-12],[3,1],[4,-13],[1,-13],[4,2],[6,-13],[0,-8],[10,-9]],[[5941,7196],[-3,1]],[[5938,7197],[-2,0]],[[4503,6784],[-3,-9],[-5,3],[8,6]],[[4571,6803],[1,-17],[-5,-6],[-6,6],[2,19],[8,-2]],[[4552,6828],[-7,-11],[-2,-14],[-7,-8],[-6,21],[12,4],[4,8],[6,0]],[[4604,6803],[7,35],[5,-4],[-4,-26],[-8,-5]],[[4503,6844],[4,-7],[-3,-16],[-4,14],[3,9]],[[4626,6861],[0,-6],[-9,-10],[-1,11],[10,5]],[[4919,7214],[-1,3]],[[4918,7217],[1,-3]],[[4851,7247],[-1,5]],[[4850,7252],[1,-5]],[[5043,7435],[2,-6],[-6,-9],[-6,2],[10,13]],[[5088,7483],[0,-11],[8,0],[-7,-23],[-4,-6],[-8,7],[-3,10],[-9,0],[9,14],[14,9]],[[5114,7490],[6,-11],[-3,-3],[-12,12],[9,2]],[[5055,7627],[0,0]],[[4950,7681],[11,-8],[1,-9],[16,-8],[6,-11],[6,3],[8,-7],[20,0],[0,9],[18,-7],[3,-7]],[[5047,7630],[8,-9],[8,4],[6,-5],[12,8],[7,-3]],[[5088,7625],[4,-5],[-6,-6],[3,-18],[-4,-6],[-23,-20],[-3,-10],[-17,-6],[-15,-8],[-8,-13],[5,-6],[-8,-7],[-7,-18],[-8,-14],[-11,-32],[3,-21],[6,-15],[7,-7],[-21,-22],[-9,-36],[4,-6],[-19,-4],[-12,-20],[-2,-15],[-7,-12],[-5,6],[-7,-1],[-3,-8],[-6,4],[-42,-1],[-7,-13],[-15,-5],[-4,-16]],[[4851,7264],[0,0]],[[4851,7264],[-6,-7],[-14,11],[-9,24],[-2,18],[-12,13],[-14,2]],[[4794,7325],[-3,18],[7,27],[6,2],[3,10],[-5,0],[-6,14],[1,17],[6,6],[3,12],[-5,3],[-5,22],[-6,12],[14,0],[4,14],[-4,17],[7,8],[-1,30],[-3,6],[8,16],[6,4],[6,14],[-10,6],[0,16],[-16,2],[-2,-7],[-11,-3],[-3,3],[-13,-3],[3,13],[-4,6],[-15,-10]],[[4756,7600],[-4,7],[8,12],[-7,6],[1,13],[-6,-4],[1,10],[-7,18],[12,17],[5,-3],[11,5],[-2,4],[13,17],[6,2],[13,-13],[36,2],[14,-2],[17,-9],[16,0],[17,6],[3,-6],[11,-2],[10,4],[16,-8],[10,5]],[[5628,8557],[8,2],[12,-10],[-17,-13],[-15,-4],[-10,7],[0,13],[22,5]],[[5631,8581],[8,-10],[-15,-8],[-3,11],[-9,4],[19,3]],[[5778,8608],[4,-7]],[[5782,8601],[-5,-1]],[[5777,8600],[3,-1]],[[5780,8599],[-7,-9]],[[5773,8590],[-4,-10]],[[5769,8580],[-12,1],[-9,-8],[13,-28],[6,-22]],[[5767,8523],[5,-8],[-7,-3],[-6,-16]],[[5759,8496],[-14,5],[-8,-6],[-15,19],[-26,13],[-21,-12]],[[5675,8515],[7,26],[-10,-3],[-13,5],[-6,13],[-3,20],[6,3],[-5,14],[18,5],[6,10],[30,1],[8,10],[35,-13],[27,-2],[3,4]],[[6160,5833],[0,-12]],[[6192,5816],[-8,-22],[5,-23],[5,-13],[6,-8],[1,-13],[4,-12],[5,-4],[12,-21],[51,-34],[31,-23],[28,0]],[[6332,5643],[-21,-43],[-31,-61],[-14,-31],[-14,-34],[-5,-9],[-27,3],[-20,-14],[-8,-12],[-1,-8],[-9,-7],[-12,-2],[-7,-13]],[[6163,5412],[-19,-3],[-3,2],[-9,19],[-26,-24],[-8,-27],[-25,12],[-15,0],[-7,11],[-28,36],[-23,1],[-3,10]],[[5997,5449],[-4,8],[0,27],[-2,9],[-11,-2],[-1,9],[-5,7],[-3,12],[0,13],[-4,11],[-3,24],[-6,5],[0,8],[-6,4],[-7,24],[-9,16],[-19,8],[-1,9],[5,9],[0,17],[12,3],[2,-5],[7,3],[5,9],[-1,50]],[[5946,5727],[4,33],[3,9],[-1,22],[7,18],[6,-7],[5,5],[0,25],[4,16],[-1,14],[6,8],[2,12],[11,31],[11,1],[0,19],[3,19],[6,24],[2,28]],[[5634,8649],[-3,-11],[-9,9],[12,2]],[[5804,9158],[-14,-7],[8,-9],[-8,-12],[7,-21],[18,-7],[18,-21],[-2,-10],[-23,-30],[-1,-9],[13,-20],[11,-25],[5,-23],[-10,-1],[2,-32],[-7,-6],[6,-11],[9,-1],[-2,-23],[14,-8],[1,-11],[-17,-18],[14,-16],[21,-15],[9,-17],[-9,-24],[-25,-28],[-15,-23],[-18,-22],[-10,-7],[-27,-31]],[[5772,8670],[-31,-8],[-19,-2],[-8,-8],[-15,0],[-6,-6],[-38,-11],[-10,-6],[-10,17],[3,10],[-12,-6],[2,10],[-10,0],[-12,14],[-5,-7],[-8,8],[-2,23],[5,3],[3,23],[-5,25],[-5,3],[3,22],[-6,2],[3,27],[13,9],[-5,12],[11,-3],[13,8],[-5,9],[17,9],[3,10],[13,6],[10,18],[17,18],[5,16],[25,8],[-4,14],[2,17],[-33,19]],[[5671,8973],[-15,37],[10,20],[-12,20],[5,16],[-7,26],[5,3],[-23,26],[-21,5],[-41,32]],[[5572,9158],[12,1],[7,14],[10,-2],[21,-31],[22,-6],[20,12],[27,-15],[7,13],[18,12],[-1,17],[6,22],[15,15],[16,-2],[22,10],[17,-16],[18,-7],[6,-12],[-14,-14],[3,-11]],[[9954,4093],[-5,-13],[-7,0],[12,13]],[[9951,4184],[0,-5],[9,-12],[2,-26],[-10,-2],[-3,-6],[-10,-2],[-15,11],[-1,12],[5,7],[-2,6],[7,12],[18,5]],[[0,4252],[9987,-23],[-2,-11],[4,2],[7,14],[0,-17],[-16,-2],[-1,7],[-11,-10],[-4,-9],[-7,15],[12,16],[13,4],[2,8],[-9984,6]],[[3351,2225],[4,-3],[-17,-28],[-11,-4],[-4,-11],[-8,-4],[-11,12],[16,3],[-4,17],[12,1],[-13,15],[11,-5],[9,6],[15,-3],[1,4]],[[3368,2227],[7,2],[4,-8],[12,3],[4,-18],[-17,-11],[-16,0],[8,-4],[-12,-6],[1,-10],[-11,5],[3,-11],[-9,12],[6,17],[13,11],[-3,14],[10,4]],[[6541,3981],[5,-2],[5,-13],[-1,-13],[-7,-1],[-6,6],[-4,14],[8,9]],[[6252,4454],[4,-5],[-1,-13],[-3,-1],[0,19]],[[3483,5317],[7,10],[4,16],[2,29],[4,19],[-10,24],[-3,26],[-1,25],[4,16],[5,9]],[[3495,5491],[3,5],[3,18],[12,-10],[11,-4],[6,-6],[10,-19],[22,-31],[3,-18],[-1,-11]],[[3306,6034],[4,-11],[-1,-7],[-9,13],[1,11],[5,-6]],[[3288,6120],[2,-14],[-4,-5],[-3,22],[5,-3]],[[3295,6124],[5,-5],[-9,-3],[1,18],[3,-10]],[[5262,7641],[2,-7],[1,-27],[-4,-7],[-2,-24],[-7,-9],[-8,9],[3,8],[-7,3],[2,19],[-5,15],[3,10],[13,13],[6,-1],[3,16],[0,-18]],[[5160,8036],[5,-6],[11,0]],[[5172,7849],[16,7]],[[5195,7827],[-7,-5],[5,-18],[5,-6],[-2,-11],[-13,-6],[3,-11],[8,-5],[1,-9],[-6,-11],[4,-14],[10,-7],[9,3],[-4,-22]],[[5208,7705],[-2,-3]],[[5206,7702],[-2,-1]],[[5204,7701],[-11,-10],[-9,-23],[-14,-6],[-22,9],[0,7],[-15,1],[-7,6],[-11,0],[-5,6],[-13,-17],[-10,-6],[-3,-9],[0,-26],[4,-8]],[[4950,7681],[9,13],[6,48],[-1,11],[4,49],[11,-11],[0,8],[-14,16],[3,6],[1,26],[-20,14],[-9,18],[4,14],[-5,12],[-8,1],[-3,15],[-6,-3],[-11,11],[-18,6],[-4,6],[-11,-5],[0,7],[-9,7],[12,5],[-14,12],[1,13],[10,6],[22,0],[2,9],[12,2],[10,-20],[12,9],[16,-4],[4,8],[-1,28],[-6,8],[0,18],[16,0],[-1,-11],[5,-6],[30,-4],[8,7],[-5,3],[2,11],[10,9],[18,7],[11,15],[0,37],[10,8],[17,4]],[[4800,8771],[13,-21],[-14,13],[1,8]],[[4808,8772],[9,-11],[-11,3],[2,8]],[[9394,5584],[3,-9],[-4,-1],[1,10]],[[5308,4956],[-3,13],[-10,15],[0,9],[-17,28],[-8,19],[7,-8],[5,3],[-8,8],[-7,1],[-2,13],[-9,21],[1,10],[8,2],[-2,7],[-4,-5],[-9,16],[-1,11],[-6,18],[5,6],[2,-7],[2,12],[6,13],[1,14],[-1,27],[2,-7],[11,-2],[-8,7],[-5,19],[9,-6],[-2,24],[3,7],[4,-4]],[[5272,5240],[6,1],[36,-1],[0,68]],[[4964,8107],[6,-6],[-7,-6],[-6,6],[7,6]],[[4883,8252],[-4,-10],[-6,16],[10,-6]],[[4825,8298],[-11,-2],[-8,20],[-10,-17],[-14,5],[-9,13],[11,10],[-5,6],[11,2],[8,19]],[[4798,8354],[20,10],[13,-2],[0,-8],[18,-35],[-7,-6],[-11,-19],[-6,4]],[[4857,8375],[-7,14],[7,-1],[0,-13]],[[4830,8398],[2,-9],[-7,-6],[-6,6],[1,10],[10,-1]],[[4839,8409],[-5,-13],[-4,6],[9,7]],[[4832,8443],[11,-10],[-2,-5],[-18,-4],[7,10],[-7,5],[9,4]],[[4795,8489],[3,-18],[-4,1],[1,17]],[[4800,8503],[1,-8],[-10,7],[9,1]],[[4824,8506],[5,-20],[14,-6],[-9,-6],[-10,1],[-13,15],[11,5],[2,11]],[[4827,8543],[-5,-20],[-16,-15],[3,11],[-7,3],[2,15],[23,15],[0,-9]],[[4907,8560],[9,0],[-6,-20],[-22,-20],[6,-7],[-8,-14],[22,8],[20,-3],[16,2],[7,-13],[-6,-9],[-6,-24],[-9,-18],[-10,-8],[8,-10],[-21,-15],[9,-4],[11,6],[13,-8],[14,-19],[4,-29],[8,-27],[19,-9],[4,-13],[8,-7],[-4,-5],[11,-24],[-7,1],[12,-23],[-7,-19],[8,-7],[5,11],[20,-2],[11,-10],[3,-16],[-5,-24],[-4,0],[-14,-26],[-11,-12],[12,-3],[13,1],[-3,-14],[-11,-13],[-5,1],[-14,-11],[-12,6],[-18,-6],[-3,7],[-18,-7],[-14,-1],[2,-8],[-27,9],[-13,-6],[-2,-17],[-8,-7],[-11,10],[-16,-3],[-12,-21],[-8,10],[19,25],[7,14],[1,12],[6,-1],[2,11],[12,3],[11,-4],[11,2],[8,20],[-23,-9],[-8,12],[-13,-3],[0,6],[-10,3],[-8,-7],[-10,18],[13,6],[20,18],[2,9],[-2,24],[-17,-4],[11,12],[5,11],[27,10],[8,19],[-4,11],[5,2],[-1,14],[-9,-6],[-11,23],[9,26],[-19,-10],[-11,5],[1,-10],[-13,10],[-5,-5],[-1,21],[11,19],[-15,29],[-8,-15],[-4,-23],[-5,-1],[3,22],[-1,18],[5,24],[8,18],[-12,-13],[-5,11],[0,17],[5,10],[-6,19],[7,25],[12,0],[-5,20],[11,21],[20,-6],[26,7]],[[4912,8589],[-2,-13],[-4,10],[6,3]],[[4964,8673],[4,-27],[-15,5],[9,7],[2,15]],[[6206,7550],[-23,27],[-5,-9],[-8,5],[-9,-5],[-8,5]],[[6153,7573],[7,17],[-8,51],[-10,6],[-3,11],[-21,13],[-8,10]],[[6110,7681],[2,9],[16,0],[27,-19],[21,2],[7,-6],[6,1],[10,-14],[17,-9],[-2,-8],[6,-4],[16,12],[7,-8],[4,8],[11,-14],[11,0],[-2,-18],[8,-10],[14,-9]],[[4995,5824],[5,-3],[-3,-26],[10,-13],[3,-27],[-4,-30],[8,0],[-2,-24],[2,-8],[-4,-8],[9,-19],[-3,-11],[0,-28],[-3,-15],[4,-3],[-1,-23],[-3,-2],[6,-28],[8,-9],[5,-13]],[[5032,5534],[-7,-19],[-15,1],[-21,-17],[-12,-16],[-6,0],[-6,-7],[-11,-5],[-10,-15],[-7,8],[-24,12]],[[4913,5477],[8,2]],[[4851,7264],[0,0]],[[4683,5897],[-3,-14],[6,-9],[6,11],[4,0],[8,-17],[4,13],[5,5],[16,-11],[2,7],[14,19],[5,-5],[2,-20],[3,-1],[-1,-21],[13,-17],[-9,-23],[5,5],[6,-3],[0,-28],[9,-12],[0,-8]],[[4764,5618],[-6,8],[-1,-12],[-11,-17],[-5,13],[-4,0],[3,19],[-5,25],[0,11],[-8,10],[-7,-7],[-6,3]],[[4714,5671],[-3,1],[-5,-11],[-3,4],[5,15],[-3,10],[0,15],[-4,1],[2,13],[-15,39],[-19,0],[-17,-7],[-5,-26],[-12,-21],[-5,-1]],[[4630,5703],[4,8],[-12,23],[0,12],[-4,-2],[-6,13],[-20,29],[4,20],[-5,-10],[-3,21],[-4,-14],[-2,11]],[[4582,5814],[8,30],[12,8],[16,4],[0,19],[-6,11],[7,3],[-1,24]],[[4618,5913],[19,-3],[-1,-8],[17,-6],[3,-5],[7,6],[20,0]],[[4534,5935],[-2,17],[4,7],[8,-14],[5,5],[-8,2],[-1,13]],[[4540,5965],[29,0],[4,12],[7,2],[8,-5],[2,-7],[6,1],[4,-10],[12,7],[3,-14],[-15,-6],[-5,7],[-11,6],[-6,7],[-1,-9],[-5,-4],[-12,-1],[0,-11],[-24,1],[-2,-6]],[[4553,5826],[1,-7],[-6,3],[5,4]],[[4582,5814],[-1,9],[-5,-7],[-7,20],[5,15],[8,-2],[-9,7],[-2,-8],[-3,8],[2,11],[8,-1],[-5,6],[-6,-7],[-11,-6],[3,14],[-7,-6],[-6,6],[1,13],[-5,-2],[-7,9]],[[4535,5893],[14,7],[15,-1],[13,14],[41,0]],[[5272,5240],[-3,6],[-10,3],[3,15],[10,28],[0,26]],[[5243,5399],[5,-8],[-8,-24],[-6,4],[0,10],[4,1],[1,11],[4,6]],[[5663,7229],[13,-11],[9,5],[22,-8],[8,3],[-1,-12],[9,6],[7,-7],[-2,-5],[-25,-2],[-16,-4],[0,9],[-10,6],[-24,5],[1,17],[4,5],[5,-7]],[[5756,7245],[-1,-17],[-3,-5],[4,22]],[[5640,7268],[-4,-2],[0,12],[4,-10]],[[5784,7281],[-5,-19],[-8,-12],[-2,13],[5,13],[10,5]],[[5710,7319],[-4,-10],[-2,10],[6,0]],[[5731,7350],[-10,-7],[2,7],[8,0]],[[5748,7357],[-5,-6],[-5,6],[10,0]],[[5576,7363],[5,-7],[-4,-5],[-5,10],[4,2]],[[5690,7366],[3,-13],[-8,16],[5,-3]],[[5571,7398],[6,-23],[-8,2],[-3,14],[5,7]],[[5723,7405],[3,-16],[-4,-9],[-5,25],[6,0]],[[5651,7423],[11,-14],[8,0],[5,-29],[7,0],[0,-10],[-7,1],[-8,23],[-11,0],[-1,9],[-12,17],[-9,-1],[13,12],[4,-8]],[[5733,7446],[6,-17],[-13,0],[4,10],[-10,-4],[-2,8],[13,8],[2,-5]],[[5553,7474],[-2,-18],[-5,18],[7,0]],[[5706,7488],[-2,-14],[-9,3],[0,9],[11,2]],[[5688,7522],[-8,1],[4,10],[4,-11]],[[5586,7536],[18,3],[4,11],[23,3],[5,10]],[[5731,7585],[7,-8],[1,-14],[-8,-6],[0,-15],[-8,-13]],[[5723,7529],[-3,5],[-11,2],[-11,8],[-12,-10],[-8,6],[-9,-12],[-11,1],[4,-19],[-4,-10],[8,-6],[-1,-11],[-9,17],[-8,0],[0,-6],[10,-14],[-9,6],[-2,14],[-12,9],[0,14],[-6,-6],[-3,-28],[8,-15],[2,-11],[5,-6],[7,-17],[-11,9],[-4,-7],[6,-16],[-9,-6],[17,-11],[0,-9],[8,-2],[13,-15],[-2,-5],[2,-25],[-3,-1],[-12,22],[-15,-11],[5,-3],[0,-11],[10,-10],[-11,-8],[-11,16],[0,-8],[7,-21],[3,-20],[0,-17],[-11,22],[-5,-6],[-4,-14],[0,13],[-6,19],[-6,-1],[0,-14],[-7,3],[-3,13],[3,14],[-3,15],[-13,17],[7,16],[7,2],[6,9],[19,-10],[10,-12],[9,10],[-5,6],[-17,14],[-1,-6],[-12,4],[-12,-7],[-4,8],[-8,-4],[-5,24],[-4,-1],[-1,16],[-13,20],[-2,14],[-5,4]],[[5583,7526],[0,0]],[[5582,7531],[4,5]],[[3288,5876],[-5,-2],[5,13],[0,-11]],[[3786,8632],[-12,-4],[4,9],[8,-5]],[[3787,8645],[3,-11],[-11,4],[-4,10],[12,-3]],[[3846,8835],[12,-11],[-9,0],[-12,15],[9,-4]],[[3579,8886],[3,14],[6,-4],[-9,-10]],[[3876,8910],[-1,-14],[-10,26],[11,-12]],[[3961,8973],[2,-9],[-18,-2],[0,10],[16,1]],[[3583,9209],[9,-5],[-9,-16],[-11,9],[11,12]],[[3535,9210],[20,-7],[5,-10],[-9,-9],[-40,-14],[-19,9],[8,9],[-21,2],[3,11],[-6,23],[14,9],[30,-7],[15,-16]],[[4292,9258],[5,-6],[-22,-8],[-56,-5],[5,12],[24,14],[11,0],[27,11],[6,-18]],[[3513,9274],[-13,6],[9,10],[4,-16]],[[3537,9281],[-14,10],[21,1],[-7,-11]],[[3472,9375],[-13,-11],[-4,9],[17,2]],[[4335,9380],[22,-3],[33,-25],[-20,4],[17,-11],[-5,-9],[-50,20],[-10,8],[0,15],[13,1]],[[4354,9391],[36,-8],[-3,-13],[-17,-1],[-14,11],[-38,1],[0,5],[36,5]],[[4333,9407],[21,-8],[-47,6],[55,-12],[-48,-4],[-29,9],[13,12],[35,-3]],[[4418,9469],[11,-1],[11,-14],[-32,-5],[-18,7],[3,8],[25,5]],[[4439,9496],[13,-2],[-12,-10],[-14,7],[13,5]],[[4505,9520],[-7,-8],[21,-2],[-15,-6],[-30,-2],[2,17],[29,1]],[[4481,9596],[3,-41],[-16,34],[13,7]],[[2994,9643],[23,-5],[-21,-3],[-2,8]],[[4445,9674],[18,-11],[-32,9],[14,2]],[[4519,9788],[-33,-16],[-26,9],[49,14],[10,-7]],[[3575,9904],[-53,7],[4,13],[49,-20]],[[3722,9942],[44,-15],[-28,-11],[-44,11],[-20,15],[48,0]],[[3880,9983],[38,-14],[-47,9],[9,5]],[[4105,9998],[43,-1],[139,-17],[-12,-6],[-116,-3],[-142,-14],[100,5],[47,8],[96,-4],[39,6],[2,-18],[34,4],[72,-17],[-31,-17],[-54,-4],[-152,-7],[-81,-17],[1,-9],[30,8],[107,13],[89,-4],[-3,-12],[-44,-9],[-2,-11],[85,20],[2,14],[51,4],[11,-19],[-7,-14],[-56,-36],[-16,-18],[53,26],[58,30],[75,-8],[37,24],[53,-1],[57,-12],[13,-8],[-64,-27],[-24,0],[7,-12],[-31,-8],[-46,1],[36,-15],[-18,-11],[-40,-3],[-44,6],[-25,-22],[11,-12],[20,3],[-9,-21],[17,-12],[-27,-8],[0,-11],[-28,-2],[-11,-42],[-18,-22],[18,0],[10,17],[51,-16],[-6,-10],[-19,10],[-22,-2],[38,-26],[10,6],[21,-5],[2,-18],[-10,-12],[-35,13],[-27,-3],[-24,-13],[-13,12],[-14,-8],[10,-12],[18,1],[0,-16],[19,4],[30,-4],[6,-11],[-15,-4],[21,-14],[3,-29],[-17,-4],[-4,9],[-16,-2],[-26,17],[8,-12],[24,-14],[-8,-27],[30,-5],[7,6],[13,-11],[-18,-15],[-16,2],[-7,11],[-36,-2],[-11,-18],[9,-27],[-2,21],[9,3],[36,-10],[-7,-26],[-28,3],[-18,-14],[-36,11],[-14,9],[-1,13],[-10,-16],[-25,-4],[-17,-16],[24,-7],[-16,-14],[22,-6],[6,-12],[-19,-7],[21,1],[23,-15],[33,-16],[-17,-14],[20,9],[14,-3],[-17,-11],[2,-17],[9,14],[10,-1],[0,-35],[8,-18],[-13,-10],[-11,3],[-7,22],[-2,-22],[-19,0],[-16,10],[-9,27],[-24,13],[-15,14],[-20,5],[-16,-3],[-26,23],[-16,-2],[31,-13],[-8,-6],[26,-8],[25,1],[11,-12],[-16,-13],[-24,-7],[-44,2],[14,-7],[-11,-17],[2,-11],[40,7],[13,-6],[-17,-3],[-27,-14],[-16,-3],[34,-3],[11,16],[15,-4],[29,13],[23,-11],[25,-7],[33,0],[0,-8],[-14,0],[-4,-12],[-19,-2],[1,-10],[-13,-8],[-17,-1],[2,-9],[-26,-21],[-31,-10],[-13,-9],[-23,1],[1,-6],[-24,-7],[-9,4],[-5,-11],[-18,10],[-1,-16],[-30,-3],[-30,17],[6,-17],[-4,-12],[-11,1],[-16,-12],[-12,-33],[-13,-5],[-1,-15],[-27,-26],[-15,-2],[-14,-18],[-13,3],[-20,-12],[-17,14],[15,16],[-12,0],[-7,-21],[-14,-1],[8,-16],[-17,1],[-7,-6],[-8,9],[-14,-12],[2,-15],[-14,-14],[-10,8],[-13,-3],[1,-12],[14,-11],[-1,-13],[-13,-9],[-12,1],[3,-8],[18,-1],[7,-27],[-13,0],[6,-7],[-18,-12],[-13,6],[12,-15],[-4,-15],[-21,-8],[-6,-11],[9,-15],[-21,9],[12,-11],[9,-1],[-8,-21],[11,5],[-6,-22],[-8,-6],[7,-7],[-17,-13],[9,-6],[-3,-17],[-20,3],[20,-7],[-12,-15],[-11,5],[14,-18],[0,-9],[-29,6],[-13,-12],[-12,10],[3,19],[-9,0],[6,10],[-15,-11],[-11,20],[6,8],[-3,10],[-10,-9],[-22,-8],[3,7],[-19,-8],[-17,0],[14,12],[-20,6],[-4,9],[7,5],[-20,5],[-1,9],[-10,13],[8,10],[-10,16],[-15,2],[-8,9],[5,28],[-12,7],[15,8],[-28,-3],[-2,19],[-11,10],[3,23],[-6,8],[14,-1],[13,13],[6,16],[9,-13],[-4,16],[-11,4],[-15,-12],[2,10],[-19,-33],[-9,0],[1,29],[22,16],[-10,2],[-8,-13],[-23,50],[-12,0],[-4,23],[19,15],[18,9],[21,21],[-21,-13],[-3,-7],[-33,-23],[-9,1],[1,22],[11,11],[16,-1],[5,10],[-34,3],[-6,14],[49,13],[17,-3],[12,6],[-28,-2],[-28,-7],[-21,-2],[2,10],[25,18],[15,2],[12,-7],[24,4],[-49,5],[-24,-17],[0,18],[22,10],[-5,12],[15,-1],[16,-8],[21,2],[-6,8],[7,12],[-13,0],[9,-8],[-31,-6],[-3,7],[-15,-1],[13,14],[18,4],[23,-2],[-5,11],[7,22],[16,-8],[0,19],[-17,-7],[10,18],[-2,11],[15,4],[-8,11],[-24,0],[-25,5],[-25,17],[-22,4],[-15,18],[11,6],[48,-8],[25,-15],[24,-6],[5,11],[-14,-6],[1,16],[-24,21],[17,-6],[-5,9],[-22,-1],[16,9],[-4,6],[-19,-12],[5,13],[24,4],[-8,4],[-21,-8],[-7,9],[25,4],[-41,6],[-4,7],[-14,-11],[0,-11],[-14,-5],[-24,1],[-17,17],[17,13],[-8,8],[19,13],[-21,11],[17,5],[10,12],[-3,15],[-18,4],[4,18],[-30,38],[7,13],[-16,5],[7,11],[-21,13],[4,8],[-31,10],[-14,17],[13,3],[-7,17],[-16,-2],[-4,10],[-26,9],[-17,-2],[-4,9],[-42,5],[-31,8],[-6,-11],[-27,5],[1,-9],[-35,-1],[7,10],[-15,1],[-6,-12],[-18,11],[-7,-6],[23,-12],[-58,9],[-30,15],[36,17],[-57,7],[-26,11],[12,12],[50,5],[21,6],[50,-3],[14,9],[-19,13],[-24,-11],[-45,-4],[-29,6],[21,8],[-33,-1],[13,9],[-30,-4],[-44,23],[8,21],[91,16],[8,10],[43,9],[42,-2],[31,23],[-5,30],[-56,2],[-12,15],[39,20],[28,7],[8,12],[46,13],[44,-9],[16,6],[6,19],[-19,15],[104,24],[90,11],[24,-14],[-6,-33],[24,17],[-1,11],[85,-18],[-31,13],[44,0],[-31,12],[-15,20],[65,-8],[77,-19],[22,-14],[25,1],[-8,28],[38,-1],[-68,26],[132,2],[-157,7],[28,14],[74,4],[6,5],[54,-17],[95,1],[-42,3],[53,5],[-49,3],[0,13],[180,11]],[[2530,6098],[8,-8],[4,5],[7,-7]],[[2549,6088],[-17,-28],[-9,-9],[-2,-15],[2,-14],[-6,-9]],[[2517,6013],[-6,-1],[2,-10],[-5,-3],[-10,-17],[-1,-9]],[[2497,5973],[-15,12],[-19,1],[-9,9],[-17,25]],[[2437,6020],[3,7],[-1,33],[1,10],[11,38],[36,0],[2,20],[-7,4],[-4,17],[-8,7],[-1,7],[-9,13],[12,0],[1,33],[50,0]],[[9022,5957],[-2,-11],[-3,10],[5,12],[4,-3],[-4,-8]],[[3409,5499],[-2,-9],[4,-10],[-2,-8],[-13,-2],[-5,-8],[2,-9],[-6,-39],[4,-7],[2,-13],[5,-8],[0,-8],[10,0],[2,-28],[6,-15],[0,-8],[9,-27],[6,-5]],[[3312,5482],[-18,43],[8,14],[-2,28],[9,7],[5,-2],[11,21],[-7,0],[-5,21],[5,19],[5,3],[15,22],[-6,18]],[[3332,5676],[4,-9],[7,-3],[15,-20],[17,-36],[1,-15],[-4,-18],[1,-10],[3,13],[4,2],[10,-8],[9,-18],[2,-9],[6,-1],[5,-11],[0,-27],[-3,-7]],[[8172,6482],[5,-7],[-5,-9],[-9,5],[5,9]],[[7037,2130],[10,-6],[-7,-4],[-3,10]],[[2691,6046],[-12,-1],[-4,-8],[-12,-4],[-8,-7],[-8,2],[-3,9],[-6,-6],[-4,-11],[0,-12],[-5,-3],[-5,-13],[-6,-5],[0,-7],[-8,9],[-8,-14],[-13,-2],[2,-26],[-6,-2],[0,-10],[-11,-5]],[[2574,5930],[-4,22],[-10,3]],[[2560,5955],[3,17],[-2,12],[-6,-1],[-3,6],[-10,-8],[0,7],[-7,3],[-8,17],[-10,5]],[[2549,6088],[8,9],[7,2],[7,-7],[2,4],[12,-6],[4,3],[12,-1],[13,11],[15,-6],[11,6],[18,-9],[13,-22],[-8,6],[10,-19],[8,0],[-7,9],[9,-6],[4,-13],[4,-3]],[[5512,7634],[1,-9]],[[5513,7625],[-8,12],[-27,21],[12,-5]],[[5466,7679],[-8,-5],[-2,8],[10,-3]],[[5412,7751],[11,-14],[-10,8],[-1,6]],[[5401,7772],[0,-20],[-5,27],[5,-7]],[[5404,7789],[3,-10],[-5,-3],[2,13]],[[5458,7861],[5,-3],[18,-29],[6,0],[9,-10],[17,0],[11,9]],[[5524,7828],[3,-33],[12,-10],[-10,-3],[-1,-17]],[[5488,7656],[-12,12],[-6,13],[-14,10],[-11,-4],[-2,10],[-14,14],[-9,17],[8,5],[-15,23],[-1,23],[-9,12],[-7,2],[-3,-20],[-8,-11],[-8,20],[0,20]],[[5377,7802],[9,-3],[13,3],[6,6],[20,-9],[-2,17],[12,6],[-2,20],[9,5],[8,12],[8,2]],[[3002,6248],[-1,2]],[[2977,6260],[-12,8],[1,7],[11,-10],[0,-5]],[[3000,6254],[2,-6]],[[3006,6222],[-8,11],[-24,-5],[-11,6],[-8,0],[-6,-5],[1,-8],[-12,16],[-7,4],[2,15],[6,2],[16,-10],[24,-4],[4,8],[7,-2],[0,7],[-13,23],[1,19],[3,2],[-9,11],[-11,1],[-2,6],[8,10],[11,2],[13,-11],[15,-2]],[[5614,7970],[21,-26]],[[5635,7944],[-8,-11],[-4,2],[-13,-17],[-4,-19],[-5,-6],[-4,-21],[-6,-5],[-1,-12],[-6,-10],[-7,2],[-5,-8],[-10,-1]],[[5562,7838],[-16,4],[-11,-11],[-11,-3]],[[5458,7861],[-7,21],[-4,-1]],[[5476,7947],[6,-1],[10,-13],[15,0],[14,3],[-1,10],[7,4],[14,3],[4,7],[8,-7],[12,11],[3,13],[9,3],[9,-5],[11,3],[5,-11],[12,3]],[[8426,4574],[2,-3],[-6,-11],[-11,-6],[0,8],[6,3],[10,17],[-1,-8]],[[8386,4582],[-1,-10],[-6,2],[7,8]],[[8333,4644],[9,-18],[4,2],[10,-24],[-10,-15],[-9,5],[-5,14],[-10,12],[-15,3],[-4,11],[10,10],[20,0]],[[8473,4637],[-2,-11],[-16,-29],[-8,0],[-2,-6],[-12,-5],[-3,9],[7,6],[-5,10],[2,16],[10,18]],[[8444,4645],[2,-5],[7,4],[3,10]],[[8456,4654],[13,13]],[[8469,4667],[7,-5],[0,-8],[-6,-2],[3,-15]],[[8318,4695],[-3,-16],[1,18],[2,-2]],[[8424,4708],[1,-8],[-8,-2],[4,11],[3,-1]],[[8242,4700],[-7,-24],[3,-4],[-11,-3],[-10,6],[6,6],[-1,15],[7,13],[8,-1],[5,-8]],[[8442,4708],[-5,-4],[-10,-16],[-5,4],[7,9],[-2,6],[12,4],[3,-3]],[[8450,4700],[-5,-10],[-4,6],[11,16],[-2,-12]],[[8858,4702],[-10,-1],[7,12],[3,-11]],[[8265,4700],[-2,12],[5,2],[-3,-14]],[[8459,4715],[2,-3],[13,1],[1,-11],[-22,-6],[3,18],[3,1]],[[8550,4716],[8,-3],[-2,-6],[-6,9]],[[8276,4716],[4,0],[5,-15],[6,7],[6,-6],[8,2],[1,-19],[-18,-12],[0,10],[-7,-11],[-12,-2],[-9,-9],[-7,-2],[-11,5],[2,11],[-1,13],[12,14],[6,-8],[4,5],[6,-18],[14,4],[-6,11],[-4,1],[-6,16],[7,3]],[[8415,4713],[2,-8],[-7,-8],[2,-8],[-13,-10],[-8,1],[-9,-9],[-11,5],[-1,-7],[-12,0],[-2,6],[-7,2],[-9,-3],[-13,4],[0,11],[13,18],[19,-4],[15,-16],[15,11],[6,-12],[6,1],[0,7],[12,12],[-4,4],[3,8],[3,-5]],[[8208,4712],[5,-15],[-14,-15],[-7,13],[-11,8],[-3,14],[12,-6],[8,8],[10,-7]],[[8604,4733],[0,-14],[-5,14],[5,0]],[[8519,4741],[-6,-15],[-15,2],[-5,-7],[5,21],[11,-2],[8,7],[2,-6]],[[8857,4720],[-12,-20],[-23,0],[5,24],[6,21],[6,8],[11,6],[5,-1],[7,-11],[-5,-27]],[[8656,4770],[0,-26],[-8,-16],[-7,-6],[3,28],[10,23],[2,-3]],[[8664,4774],[1,-9],[-7,7],[6,2]],[[8166,4787],[3,-6],[-12,-8],[-3,-6],[-12,-1],[-12,5],[4,15],[32,1]],[[8204,4789],[6,-5],[-10,-1],[4,6]],[[8738,4813],[-1,-5],[-6,7],[3,6],[4,-8]],[[8733,4812],[3,-8],[-6,-16],[-7,2],[2,30],[-1,7],[9,-15]],[[7948,4837],[3,4],[13,-9],[8,1],[0,9],[9,-3],[2,-10],[7,-5],[6,2],[5,-8],[8,5],[5,-14],[2,-16],[11,-1],[10,-5],[4,4],[11,-7],[7,4],[5,-7],[7,8],[2,19],[4,5],[7,-1],[3,-15],[12,3],[12,-14],[16,1],[0,-13],[6,-8],[-2,-17],[16,-15],[12,4],[7,6],[13,-11],[-3,-41],[7,-10],[-18,4],[-20,20],[-6,-1],[-10,-8],[-9,6],[-16,4],[-2,-6],[-9,6],[-11,0],[-13,8],[-14,14],[-18,10],[-23,1],[-2,-7],[-18,4],[-11,14],[-25,5],[-4,10],[4,15],[-7,-1],[-7,10],[-20,-2],[3,10],[2,-8],[4,17],[5,1],[1,18],[5,17],[4,-6]],[[8346,4810],[-1,39],[3,-8],[-2,-31]],[[8685,4859],[3,-16],[-4,0],[1,16]],[[8737,4870],[5,-12],[1,-27],[-5,-14],[-8,8],[-1,9],[2,19],[6,17]],[[7843,4868],[-9,8],[9,-3],[0,-5]],[[8386,4889],[2,1],[2,-20],[-3,-2],[-4,10],[3,11]],[[8410,4898],[-4,-6],[0,-18],[-10,-1],[3,23],[-2,8],[11,13],[2,-19]],[[8422,4913],[0,-9],[-5,6],[-2,-24],[7,-6],[-2,-7],[-8,-5],[0,-10],[-6,-1],[-2,9],[5,17],[3,22],[0,15],[4,10],[6,-17]],[[8418,4952],[5,-5],[-3,-8],[-5,6],[3,7]],[[8564,4977],[-2,-8],[-9,-3],[3,10],[8,1]],[[8225,4951],[-3,23],[3,18],[4,5],[1,-36],[-5,-10]],[[8523,5004],[7,-6],[-2,-7],[6,-2],[0,-14],[-15,-15],[-15,15],[-5,14],[1,12],[11,5],[12,-2]],[[8598,5023],[14,-13],[8,1],[7,-8],[1,-15],[7,-11],[-1,-17],[-24,23],[-3,8],[-9,2],[-2,-10],[-15,7],[-2,8],[-6,-10],[-7,-2],[-6,20],[-4,-17],[-6,11],[8,6],[1,12],[21,0],[5,-5],[13,10]],[[7789,5006],[0,-13],[-7,21],[0,8],[6,-7],[1,-9]],[[7994,5036],[13,-12],[-2,-21],[-6,-7],[-3,11],[-8,-10],[0,26],[2,12],[4,1]],[[7782,5024],[-5,-4],[0,20],[5,-16]],[[7769,5060],[4,-12],[-4,1],[-5,11],[5,0]],[[8501,5041],[-3,3],[-3,21],[4,3],[2,-27]],[[8483,5079],[15,1],[11,-2],[-2,-3],[-24,-4],[0,8]],[[8620,5085],[2,-15],[-6,-6],[-14,10],[10,9],[8,2]],[[8458,5089],[22,-6],[0,-9],[-8,-3],[-7,2],[-10,-6],[-1,20],[4,2]],[[8762,5091],[20,-3],[6,-5],[14,-4],[-11,-5],[-15,5],[-14,12]],[[7940,5097],[5,-5],[4,-17],[0,-18],[4,-16],[14,-6],[-5,-8],[-2,-12],[4,-10],[-22,15],[0,21],[-3,4],[-1,14],[-18,4],[0,8],[7,9],[-3,5],[9,9],[2,-13],[3,1],[-2,12],[4,3]],[[8550,5100],[9,-9],[-6,-5],[-11,-3],[-5,6],[1,9],[6,8],[6,-6]],[[8421,5116],[1,-14],[3,9],[6,-1],[0,-10],[-4,-5],[-3,6],[-1,-12],[-3,18],[-6,-15],[-4,10],[3,13],[8,1]],[[8044,5127],[4,-10],[-9,-8],[0,18],[5,0]],[[7746,5129],[7,-31],[4,-7],[-2,-11],[-9,6],[-9,29],[3,13],[6,1]],[[8636,5129],[4,-8],[-2,-16],[-7,6],[-3,15],[8,3]],[[8634,5139],[-7,-9],[-4,6],[11,3]],[[8761,5145],[12,-2],[9,-20],[6,-4],[-7,-7],[-7,2],[-4,22],[-3,-4],[-6,13]],[[8536,5138],[-5,0],[3,9],[2,-9]],[[8915,5033],[0,-218],[-3,-12],[3,-17],[0,-128]],[[8915,4658],[-10,18],[-4,12],[-15,28],[-17,-5],[-3,6],[-7,-8],[-1,19],[5,19],[-4,4],[-7,18],[13,-3],[-12,8],[-4,13],[10,2],[-8,7],[1,5],[-7,13],[-3,32],[-8,7],[0,12],[-4,8],[-15,20],[-21,12],[-18,18],[-14,4],[-7,-1],[-16,20],[1,11],[-4,-6],[-5,9],[-1,-9],[-5,7],[1,8],[-6,-4],[-4,14],[-3,-5],[0,28],[6,6],[-1,9],[-6,-11],[0,-14],[-7,-21],[1,-8],[-5,-11],[-7,-3],[-6,11],[-2,14],[6,8],[-9,15],[-3,12],[-6,8],[-6,-2],[-2,12],[5,5],[10,-2],[4,-6],[9,18],[7,5],[7,-10],[8,7],[4,12],[-1,9],[-7,-8],[-11,2],[-16,-6],[-4,7],[-6,-5],[-8,11],[-4,22],[-5,11],[-9,2],[-5,-3],[-7,4],[3,13],[5,6],[0,18],[7,5],[8,0],[10,17],[8,5],[8,-1],[12,-10],[6,-11],[17,0],[5,-8],[-4,-5],[7,-22],[-1,-12],[-4,-7],[2,-39],[5,-10],[3,-17],[1,17],[5,-3],[1,-23],[5,-17],[6,-6],[11,0],[2,7],[10,16],[1,11],[9,14],[3,18],[9,-2],[14,10],[-3,16],[19,18],[4,0],[11,-13],[9,-4],[5,-10],[7,-3],[20,-21],[10,3],[16,-10],[-2,-6],[8,0]],[[7903,5160],[0,-12],[-8,7],[6,9],[2,-4]],[[8544,5159],[1,-17],[6,0],[-1,-9],[-5,6],[-5,-3],[0,10],[-5,11],[6,9],[3,-7]],[[8533,5168],[1,-14],[-4,-1],[0,14],[3,1]],[[7735,5153],[-4,0],[3,16],[1,-16]],[[7881,5163],[-8,-1],[3,8],[5,-7]],[[8633,5183],[14,-10],[-2,-13],[-6,2],[-11,13],[8,-16],[-6,-1],[-1,8],[-9,2],[-2,9],[15,6]],[[7737,5167],[-5,8],[0,8],[5,-16]],[[7904,5183],[11,-16],[-7,4],[-8,-1],[4,13]],[[7850,5240],[4,0],[7,-11],[-14,-1],[-1,20],[4,-8]],[[7861,5243],[2,-12],[-8,11],[-5,-1],[5,9],[6,-7]],[[7892,5248],[-1,-8],[-5,3],[6,5]],[[7904,5252],[2,-10],[-2,-11],[-3,13],[-6,-3],[2,9],[7,2]],[[7845,5238],[-6,7],[-1,17],[3,2],[5,-9],[-1,-17]],[[7704,5270],[3,-2],[6,-18],[6,-7],[-2,-28],[-4,1],[-3,14],[-5,7],[-8,26],[7,7]],[[7839,5273],[7,-4],[0,-13],[-10,11],[-2,10],[5,-4]],[[8473,5279],[5,-11],[-3,-3],[-6,-26],[-5,-5],[-7,-25],[-24,-11],[-11,3],[-4,10],[-24,0],[-12,-4],[-6,6],[-13,-7],[-11,7],[-10,-4],[-7,-19],[-3,-19],[3,-26],[4,-13],[5,-1],[5,-12],[2,-17],[13,1],[2,12],[8,18],[5,-3],[13,0],[1,9],[15,-2],[7,4],[-7,4],[10,6],[9,-5],[0,-20],[-3,-4],[-4,11],[-9,-3],[-8,-23],[-9,-17],[-12,-6],[-3,-12],[-10,8],[0,-8],[8,-15],[5,-3],[11,-32],[7,-26],[-5,-8],[-1,-14],[13,-17],[-1,-9],[7,-3],[0,-15],[-4,-6],[-4,6],[-14,-7],[-2,-7],[2,-12],[-12,1],[-5,9],[1,25],[3,8],[-8,7],[-13,25],[0,9],[5,10],[1,26],[-8,8],[-17,-20],[6,-16],[0,-25],[-2,-12],[1,-36],[2,-7],[-4,-14],[-1,-14],[5,-24],[-15,-2],[-4,-8],[-11,16],[0,14],[3,7],[0,18],[4,19],[0,23],[-5,19],[2,12],[-6,3],[-10,-8],[-3,14],[2,27],[-4,0],[1,13],[3,-1],[7,11],[-1,15],[3,13],[4,2],[-2,14],[0,26],[5,11],[1,11],[7,11],[1,50],[3,16],[4,4],[-1,10],[9,8],[7,-3],[6,14],[0,15],[3,3],[10,-7],[5,3],[0,-9],[5,-4],[8,2],[8,-5],[7,1],[10,-12],[4,8],[19,-6],[8,1],[10,8],[9,23],[10,19],[2,-4]],[[7825,5301],[0,-16],[-7,-2],[-2,18],[9,0]],[[8556,5309],[-6,-20],[5,-6],[0,-25],[-11,-20],[3,-8],[6,3],[0,8],[7,8],[-3,5],[3,9],[11,11],[4,-1],[-1,-29],[-11,-9],[0,-14],[11,-6],[0,-13],[-20,8],[-3,-10],[1,-20],[5,-25],[10,-24],[-11,11],[-5,20],[-5,6],[1,34],[-4,4],[-2,38],[-3,10],[4,12],[0,12],[4,16],[10,15]],[[8571,5333],[3,-7],[-3,-21],[-8,-7],[-3,16],[5,13],[6,6]],[[7663,5350],[2,-7],[14,-20],[-5,0],[-14,13],[-4,9],[7,5]],[[8268,5370],[-4,6],[4,4],[0,-10]],[[8489,5385],[-4,-3],[0,16],[4,-13]],[[8269,5423],[5,-1]],[[8274,5422],[-2,-7],[-3,8]],[[8008,5418],[2,-16],[-2,-7],[-8,11],[-1,9],[7,11],[2,-8]],[[8265,5422],[-5,1],[11,-21],[-1,-10],[-15,-1],[7,-13],[-5,-10],[11,-13],[-4,-4],[16,-37],[-8,-15],[1,-8],[7,-13],[9,-10],[10,-16],[6,-14],[-7,-9],[-16,4],[-8,12],[4,-17],[-6,2],[-6,-18],[-4,-26],[2,-2],[-3,-17],[1,-14],[4,4],[-3,-14],[4,-4],[-9,-8],[-1,5],[-7,-22],[-14,-16],[1,-8],[-9,-10],[6,1],[-2,-24],[6,0],[-2,-19],[-4,-2],[0,-18],[-5,-7],[-6,-36],[-38,-32],[0,28],[-14,23],[-6,-9],[-9,3],[0,12],[-6,-6],[-9,20],[-3,-10],[3,-3],[-14,-16],[-9,6],[-7,-11],[-4,-1],[1,27],[-4,17],[0,-10],[-4,-4],[-7,5],[-9,-9],[-7,6],[-2,-5],[-3,12],[-7,-8],[-6,62],[-5,8],[3,3],[2,20],[-4,16],[-7,11],[-7,4],[-2,-4],[-7,21],[0,34],[5,-2],[-5,14],[-5,4],[0,20],[3,50],[7,9],[1,14],[9,9]],[[8045,5303],[-3,-16],[3,-12],[17,-35],[7,-8],[8,3],[2,6],[10,4],[7,-6],[9,2],[8,7],[2,18],[8,7],[15,0],[-2,-8],[9,-3],[11,-8],[7,12],[16,-1],[5,12],[1,13],[3,2],[-1,20],[12,14],[-4,12],[1,10],[5,10],[6,-1],[4,65],[5,11],[6,-4],[3,5],[7,-4],[10,4],[13,0],[10,-12]],[[8523,5442],[2,-13],[-3,-14],[-4,-2],[2,32],[3,-3]],[[7652,5506],[11,-6],[4,-11],[10,-6],[12,4],[10,-8],[9,6],[11,-21],[3,-16],[6,-9],[0,-16],[13,-17],[3,-9],[6,-5],[20,-26],[7,-15],[-1,-13],[3,-5],[3,6],[6,-23],[14,-21],[-2,19],[6,1],[8,-16],[1,-14],[10,-6],[12,-18],[1,-19],[7,-15],[13,-3],[5,-14],[-13,-13],[8,1],[12,15],[11,-13],[2,-18],[-7,0],[-6,-21],[7,-4],[-5,-5],[1,-12],[4,-12],[9,-1],[7,-6],[6,2],[2,-16],[1,-28],[4,-14],[7,-5],[-1,-9],[8,-5],[13,-1],[0,-13],[5,-6],[0,-10],[6,-4],[2,-14],[-6,-14],[-1,-15],[3,-5],[-4,-25],[2,-13],[0,-26],[-2,-53],[-7,2],[-7,19],[-3,-6],[0,-12],[-8,6],[-9,11],[-1,-4],[5,-19],[-4,-3],[-3,11],[-10,17],[-5,19],[-7,10],[-11,12],[-28,46],[-1,17],[-17,23],[-8,29],[-9,16],[-5,17],[2,7],[-9,34],[0,8],[-5,3],[1,11],[-9,30],[-9,14],[0,13],[-4,9],[-9,10],[-5,1],[-1,21],[-9,45],[0,20],[-3,0],[-7,14],[-5,2],[-9,14],[-7,6],[-2,27],[-5,5],[-4,14],[-3,5],[-8,23],[-11,6],[-8,21],[-6,5],[-13,28],[-5,27],[-3,6],[0,17],[8,2]],[[4872,8298],[-4,5],[8,13],[4,-7],[-8,-11]],[[7606,5598],[2,-16],[-2,-11],[-5,16],[0,9],[5,2]],[[7571,5804],[0,-12],[-5,0],[-1,12],[6,0]],[[7583,5964],[1,-29],[-3,1],[1,-36],[-3,-2],[1,-13],[-5,-6],[2,-9],[-2,-25],[-5,13],[5,34],[0,29],[2,1],[0,26],[6,16]],[[7448,6428],[-4,1],[4,13],[0,-14]],[[7248,6922],[-16,-24],[0,-12],[-5,-9],[1,-17],[-7,-14],[9,-14],[9,-1],[7,-10],[9,-6],[2,-11],[15,-17],[6,3],[11,-14],[7,2],[1,-11],[12,-4],[18,0],[8,4],[6,-8],[8,-2],[1,-18],[8,-3],[10,-14],[9,7],[7,-16],[4,5],[9,-3],[11,-11],[7,7],[9,-11],[13,6],[7,-5],[4,17],[0,13],[-6,11],[2,24],[3,21]],[[7703,6808],[0,-19],[-13,-15],[0,-11],[7,-21],[-7,6],[-4,10],[-21,-9],[-2,-10],[-14,-19],[-9,-5],[-2,-21],[4,-12],[-4,-6],[0,-10],[-10,-18],[-2,-16],[3,-3],[-2,-22],[-3,-2],[-6,-22],[-5,-27],[-11,9],[-11,-2],[4,-18],[-2,-30],[-9,-21],[2,-34],[-3,1],[-1,-12],[-8,9],[-3,-10]],[[7473,6457],[-4,-11],[5,-18],[-6,2],[-4,-6],[-2,22],[-5,-3],[-1,-16],[-7,0],[-1,26],[-8,-18],[-21,-14],[-8,-19],[6,-28],[-7,-10],[-4,-16],[-4,-3],[-6,-16],[-19,-10],[-5,9],[-5,-13],[5,1],[-15,-26],[-9,-26],[-13,-29],[-9,-8],[-6,-10],[-9,-22],[-21,-21],[-6,-16],[3,-5],[-1,-14],[-6,-9],[-11,-8],[-10,4],[-4,-3],[-1,-20],[-10,-15],[-1,10],[-6,-1],[-9,-10],[-3,-17],[-2,-18],[3,-24],[-1,-30],[3,-29],[-5,-4],[7,-9],[0,-14],[-3,-37],[-8,-24],[-4,-26],[2,-16],[0,-46],[1,-17],[-15,0],[-2,-15],[-8,-21],[-2,-13],[5,-9],[-20,-12],[-5,-12],[-2,-22],[-2,-8],[-16,-16],[-7,6],[-11,22],[-7,19],[-6,25],[-3,32],[4,-10],[0,11],[-6,7],[-2,18],[-6,30],[-1,14],[-9,36],[-9,17],[-6,25],[-6,34],[-2,33],[-8,39],[-1,14],[-7,14],[-2,12],[-4,5],[0,15],[-3,4],[-4,24],[-4,8],[-5,29],[-1,37],[-5,30],[-6,45],[1,7],[-3,22],[-1,23],[-3,24],[2,33],[4,12],[-2,36],[-3,-4],[-3,11],[2,16],[12,11],[-16,-3],[2,14],[-2,14],[9,5],[-13,4],[-2,-15],[-8,-7],[8,-18],[-6,-25],[-17,-17],[-14,-11],[-5,0],[-10,9],[-11,17],[-15,33],[-15,29],[0,10],[7,1],[0,-9],[14,12],[3,-3],[9,7],[7,23],[-10,-1],[-9,-10],[-13,5],[-11,10],[-9,15],[-4,19],[-6,14]],[[6893,6556],[5,7],[10,0],[0,19],[13,-3],[11,2],[5,-7],[6,0],[3,8],[13,7],[0,-8],[6,-3],[9,10],[-4,12],[3,3],[-5,27],[-6,14],[0,17],[-10,1],[-6,14],[2,35],[-9,2],[-10,11],[1,17],[10,20],[6,22],[7,12],[6,1],[4,-16],[4,-2],[9,7],[20,8],[0,9],[8,16],[5,21],[16,16],[9,29],[3,22],[12,8],[4,7],[-2,10],[6,11],[6,19],[10,12],[-4,2],[3,17],[-2,24],[7,10],[14,8],[1,10],[-8,8],[-11,2],[0,14],[-9,2],[0,13],[-9,10],[4,22],[-5,5],[1,10],[7,10],[-9,1],[1,16],[-5,3],[4,19],[13,6],[7,-5],[16,-2],[11,-9],[11,11],[17,3],[3,10],[5,1],[4,11]],[[7140,7205],[20,22]],[[4825,8298],[2,-37],[6,-29],[-6,-16],[-4,-28],[-10,1],[-8,-4],[-12,0],[-5,-10],[-7,0],[-4,-8],[-7,-1],[-12,-14],[-20,0],[-11,-8],[10,14],[-20,-4],[12,13],[-11,-6],[-7,10],[13,14],[-15,-2],[5,10],[13,-2],[-1,11],[8,12],[-10,-5],[12,12],[5,21],[10,8],[-16,-2],[-14,9],[-3,9],[6,13],[0,24],[-5,4],[22,4],[23,-3],[-5,4],[12,9],[3,8],[-15,-1],[-2,7],[10,6],[2,18],[15,2],[6,-6],[4,17],[13,-9],[-9,-9]],[[6560,6732],[-4,-9],[-5,0],[-16,-12],[0,7],[13,7],[13,13],[-1,-6]],[[6357,7396],[3,-38],[4,-9],[9,-7],[13,-2],[9,-5],[2,-13],[21,-24],[23,-9],[43,18],[16,-4],[-3,30]],[[6497,7333],[8,-1],[16,11],[1,13],[9,13],[9,7],[24,0],[3,10],[17,-4],[5,4],[3,-17],[23,-10],[8,-9],[10,3],[11,-10],[10,-21],[13,-7],[8,-22],[23,0],[2,-31],[-3,-8],[4,-5],[0,-15]],[[6689,6902],[14,-27],[0,-8],[6,-21],[10,-20],[14,-8],[5,-10],[5,-1],[-1,-12],[2,-18],[-1,-26],[11,2],[4,-8],[-4,-17],[0,-11],[-12,0],[-12,-7],[-2,-10],[-11,-7],[-7,-59]],[[6710,6634],[-5,-8],[-10,9],[-12,4],[-1,9],[-5,-6],[-24,3],[-2,4],[-12,-4],[-6,10],[-7,2],[-14,-2],[-4,8],[-17,5],[-4,19],[-4,42],[-6,17],[-11,3],[-8,-2],[-5,-8],[-9,-4],[-3,-11],[-6,2],[-13,-17],[-11,5],[-3,7],[-17,0],[-8,16],[-10,6],[-13,16],[-4,16],[-12,11],[-9,-1],[-8,6],[-9,35],[0,12],[-8,13],[2,10],[-6,0],[1,16],[-15,30],[0,10],[-5,6],[-11,-12],[-2,9],[-7,-1],[-9,13],[8,-1],[0,9],[-9,-8],[1,-20],[-11,-4]],[[6347,6908],[-3,15],[-11,14],[0,31],[-9,0],[0,23],[4,21],[-9,22],[-5,19],[-6,-1],[-14,21],[-16,15],[4,5],[-4,15],[-11,15],[-5,22],[3,14],[-4,8],[2,8],[6,-3],[-2,9],[7,21],[7,2],[1,7],[-6,16],[1,10],[6,2],[-4,9],[-6,-3],[-14,14],[-3,21],[-5,0],[-1,18],[-6,5],[2,12],[-3,7]],[[6243,7322],[0,10],[-6,6],[1,17],[-10,17],[6,20],[-4,0],[-3,45],[-5,13],[11,4],[4,19],[7,-7]],[[6347,6908],[-13,5],[-3,-3]],[[6331,6910],[-7,6],[-9,0],[-6,-5],[-8,-33],[-9,-20]],[[6292,6858],[-5,-2],[-46,8],[-62,91],[-11,18],[-47,49],[-34,10]],[[6087,7032],[4,8],[-7,3],[0,11],[-8,51]],[[6076,7105],[4,3],[43,44],[14,11],[7,22],[1,40],[3,8],[-2,23]],[[6146,7256],[0,0]],[[6146,7256],[0,20],[3,10],[13,5],[15,26],[-1,3]],[[6176,7320],[6,2],[6,13],[9,0],[10,-7],[12,-2],[8,4],[1,-18],[11,12],[4,-2]],[[4554,9014],[7,-14],[12,-7],[12,13],[-4,-20],[10,2],[-2,-20],[12,4],[0,-8],[21,-10],[-4,-10],[6,-8],[-13,-25],[-13,-4],[-2,-15],[-24,-8],[-39,-26],[-31,-6],[-1,-11],[-23,-7],[-27,8],[-12,0],[-28,20],[-42,-4],[4,9],[14,4],[10,10],[2,11],[-13,-6],[-9,29],[-32,1],[-11,-4],[-3,8],[23,2],[15,8],[25,-2],[-21,7],[22,16],[-39,7],[-20,-9],[-18,6],[7,8],[12,-7],[-8,15],[17,-5],[-9,12],[10,17],[20,-8],[-5,7],[9,16],[11,-11],[25,-14],[-2,-19],[9,-29],[0,13],[9,15],[9,-10],[5,13],[-5,20],[9,3],[13,-22],[6,-1],[-1,19],[22,6],[16,-26],[-6,27],[10,-1],[10,-11],[12,14],[6,-6],[13,3],[-3,19],[15,2]],[[5993,7068],[-6,-5],[0,-15]],[[5987,7048],[-10,8],[-6,-14],[0,-19],[6,-9],[-7,-11],[-2,-14],[10,1],[5,6]],[[5983,6996],[0,-9]],[[5983,6987],[0,-6]],[[5983,6981],[1,-8]],[[5984,6973],[-8,-34],[0,-21],[-6,-33]],[[5970,6885],[-2,-4]],[[5951,6980],[8,18],[-2,4]],[[5957,7002],[7,21],[6,44],[5,21]],[[5975,7088],[10,0],[1,9],[8,10]],[[5994,7107],[-1,-9],[3,-19],[-3,-11]],[[5434,7386],[-12,-29],[-3,-25],[6,-18],[-6,-11],[1,-8],[-10,1],[-8,6],[-3,10],[-7,8],[-7,-1],[-25,27],[-10,1],[-4,6],[0,19],[7,6],[6,-6],[4,10],[7,1],[10,-13],[9,4],[9,-2],[17,10],[4,-4],[12,11],[3,-3]],[[5256,7557],[8,-6],[8,-34],[-5,-14],[3,-13],[-2,-30],[-6,-24],[-10,6],[-5,-19],[-8,0],[-7,17],[5,39],[-4,1],[2,23],[-5,17],[-4,0],[2,16],[8,-2],[9,6],[11,17]],[[5380,7862],[-9,-16],[7,-7],[-4,-8],[3,-12],[8,-10],[-5,-1]],[[5380,7808],[1,7],[-18,1],[-3,-5],[-16,-12],[-4,2],[-1,-16],[9,-13],[-6,-7],[-2,-13],[2,-18],[8,-16],[9,-7],[19,-21],[12,-54],[18,-28],[12,-11],[25,0],[4,-9],[-8,-15],[19,-17],[13,-7],[14,-18],[13,-8],[0,-6],[12,-15],[2,-10],[-4,-18],[-9,6],[-5,23],[-11,0],[-14,11],[-11,-25],[-2,-21],[9,-5],[9,-11],[-1,-29],[-11,-1],[-5,-8],[1,-18],[-8,-10],[-8,-20],[-10,4],[0,15],[5,3],[3,12],[-3,8],[9,5],[2,12],[-4,8],[-2,21],[-4,6],[-2,20],[-7,11],[-5,-5],[-12,13],[2,8],[-6,18],[-8,1],[-5,8],[-7,3],[-10,22],[-10,1],[-8,-3],[-5,11],[-7,2],[-12,24],[-10,10],[-8,18],[-10,5],[-3,12],[-9,9],[1,6],[-8,2],[1,18],[-7,17],[0,14],[-5,13],[-7,1],[-16,17],[-15,5],[-14,-19],[-3,-11],[-17,-6]],[[5344,7711],[0,0]],[[5345,7596],[0,0]],[[2849,6246],[15,-3],[3,-8],[12,-7],[4,-14],[-9,-3],[-10,6],[-1,-7],[-6,3],[-1,-11],[-7,10],[-8,-1],[-7,10],[-3,10],[-8,2],[5,12],[10,5],[11,-4]],[[6087,7032],[-4,-6],[-57,-30],[15,-28],[13,-29],[-9,-10],[-4,-18],[-21,-8],[-7,-22],[-12,-17],[-31,9]],[[5970,6873],[0,12]],[[5984,6973],[-1,8]],[[5983,6987],[4,0],[0,25]],[[5987,7012],[0,36]],[[5993,7068],[7,-5],[10,-16],[12,-3],[54,61]],[[8563,6721],[-5,-10],[-7,-5],[-4,-21],[0,20],[7,8],[-3,7],[7,-1],[4,12],[1,-10]],[[8603,6820],[-13,-15],[0,9],[11,11],[2,-5]],[[8624,6937],[5,-5],[-7,-8],[2,13]],[[8639,6942],[-5,-5],[6,22],[-1,-17]],[[8616,7056],[0,-12],[-6,-7],[1,18],[5,1]],[[8578,7069],[-1,-10],[-6,2],[7,8]],[[8638,7135],[3,-16],[7,-3],[9,6],[1,-15],[-5,-9],[10,1],[0,-17],[5,-2],[-11,-22],[-6,-38],[0,-16],[-3,-14],[-7,5],[1,-11],[-12,-13],[2,20],[-5,12],[-2,-4],[0,-22],[-9,5],[4,18],[-5,12],[1,21],[2,-2],[8,19],[-2,11],[3,12],[-5,15],[-8,2],[7,-19],[-6,-11],[1,11],[-10,-10],[-6,18],[1,10],[4,-14],[5,-1],[-1,10],[-11,11],[1,10],[6,-2],[18,22],[2,9],[6,4],[7,-3]],[[8726,7162],[8,-9],[5,1],[-1,-13],[4,-10],[-10,-11],[-5,-23],[-8,15],[-5,2],[-13,-11],[0,-7],[-7,-11],[-1,-16],[-10,0],[3,9],[-6,1],[-6,31],[11,14],[2,17],[6,6],[5,-10],[10,2],[3,14],[8,9],[7,0]],[[8747,7160],[-3,-8],[-3,8],[8,15],[-2,-15]],[[8595,7181],[-2,-23],[-3,4],[1,16],[4,3]],[[8845,7375],[1,-10],[-6,-6],[-1,17],[8,13],[-2,-14]],[[8923,7564],[5,3],[-1,-34],[2,-14],[8,-11],[5,-22],[4,-26],[-5,-14],[0,-12],[-7,-6],[-5,-25],[1,-17],[-6,9],[-7,-6],[-3,-24],[3,-14],[-2,-39],[-5,-8],[-5,-19],[-1,-20],[8,-27],[-11,-7],[-2,-21],[-16,-17],[2,30],[5,11],[-8,0],[-4,-12],[1,-16],[-7,11],[-8,-5],[0,-21],[-9,-16],[-1,25],[-6,4],[-6,-11],[-4,-18],[-17,5],[-15,-6],[7,9],[-13,1],[0,16],[-5,-3],[-3,-22],[9,-9],[1,-10],[-7,3],[-10,-9],[0,-10],[-6,-8],[-3,-15],[-5,-7],[-10,5],[-1,8],[-9,11],[3,8],[-3,14],[10,17],[-2,9],[-11,-4],[-6,7],[-7,0],[-20,-18],[-10,1],[-3,-9],[-6,2],[-15,-9],[-1,9],[-8,-6],[-2,-24],[-11,13],[-16,-7],[-4,7],[-3,-8],[-1,25],[3,5],[12,-1],[3,10],[7,5],[17,28],[7,7],[-1,9],[17,8],[5,-8],[24,6],[7,7],[11,-2],[8,7],[-1,-12],[13,-4],[12,10],[-3,18],[5,16],[7,8],[10,28],[-1,26],[11,10],[6,1],[-3,-13],[-9,-5],[4,-6],[-2,-13],[10,-6],[3,10],[21,13],[10,12],[10,29],[14,15],[1,16],[9,23],[3,24],[4,10],[1,17],[-4,11],[-5,-3],[7,19],[1,11],[-5,13],[5,10],[7,3],[1,26],[9,-5],[3,-20],[3,9],[8,-6],[3,19],[-13,-5],[3,23],[10,-10]],[[8944,7799],[15,-24],[4,-13],[19,-27],[11,-7],[0,-6],[12,0],[3,-7],[13,-4],[15,25],[1,-8],[-7,-17],[-1,-9],[8,-28],[8,6],[-4,-12],[-6,0],[-8,-10],[-27,-4],[-11,-14],[-8,-20],[-3,-23],[-8,11],[-14,9],[-8,11],[-12,9],[-8,-3],[-12,-15],[-9,15],[-5,0],[-6,-18],[12,-8],[13,-20],[-13,-1],[-8,-7],[-6,-13],[-7,10],[5,14],[-3,17],[-7,6],[3,26],[12,7],[5,11],[-5,13],[6,8],[8,-9],[10,-3],[7,10],[-3,22],[9,14],[0,22],[3,6],[1,20],[-6,23],[3,12],[9,3]],[[6762,7807],[-15,8],[-3,11],[1,13],[12,14],[11,-3],[7,-11],[1,-13],[-4,-11],[-10,-8]],[[7140,7205],[-9,31]],[[6651,7782],[-20,19]],[[6631,7801],[12,18],[8,-37]],[[7227,7611],[-6,13],[-15,4],[-12,17],[-14,6],[-14,0],[-19,2],[-14,5],[-13,-5],[-16,1],[-3,-6],[-13,2],[-12,8],[-12,13],[-21,-10],[-5,-27],[3,-9],[-22,14],[-27,9],[-10,-1],[-10,-13],[-5,-15],[3,-3]],[[6970,7616],[-6,-3],[-4,-11],[-4,5],[-9,-16],[-20,-15],[0,-5],[-10,-5],[0,-10],[-13,-17],[1,-19],[-4,0],[-13,13],[4,14],[-5,7],[-33,-3],[-5,20],[-2,30],[-14,0],[2,57],[-8,-7],[-8,26],[-7,5],[-10,19],[-12,-10],[-37,4],[-32,-8],[-23,38],[-2,12],[-28,28]],[[6668,7765],[0,34],[-2,9],[-7,-1],[3,20],[17,-5],[8,16],[12,7],[2,14],[-11,2],[-3,9],[-13,3],[-8,-7],[4,-13],[17,0],[2,-11],[-4,-6],[-24,2],[-2,12],[-7,0],[7,-14],[-3,-17],[-8,-6],[-4,5],[4,13],[-15,-3],[-6,-23]],[[6627,7805],[-73,-31],[0,-212]],[[6554,7562],[-14,-3],[-15,32],[0,6],[-20,23],[-20,-3],[-14,-9],[-15,-21]],[[6456,7587],[-1,20],[6,15],[3,22],[-15,9],[-8,-3],[-6,18],[-12,0],[1,23],[-4,4],[-8,33],[-17,9],[1,17],[16,-1],[4,-6],[16,-2],[-17,20],[12,28],[9,5],[22,0],[11,-6],[10,2],[-15,10],[0,6],[9,18],[4,40],[-8,19],[-13,2],[-10,-10],[-16,14],[-9,3],[-12,-11],[-9,-2],[-18,-21],[-13,2],[-2,-14]],[[6367,7850],[-9,9],[-10,5],[0,12],[6,-6],[7,6],[-9,19],[-4,15],[-14,23],[-11,0],[-7,5],[-1,-9],[-7,7],[0,26],[-18,8],[8,30],[8,10],[-7,14],[3,28],[12,12],[-1,14],[9,9],[22,-37],[13,11],[-5,20],[0,13],[20,17],[0,15],[11,0],[15,12],[6,17],[5,6],[14,-3],[1,-11],[11,-1],[6,12],[11,6],[5,-16],[23,0],[9,-7],[1,-9],[7,-1],[6,-13],[10,-7],[-3,-16],[8,2],[1,24],[10,-13],[16,-15],[13,11],[11,20],[18,0],[5,-11],[11,1],[1,13],[22,-4],[0,-11],[10,-11],[16,-3],[1,-9],[7,4],[5,18],[9,-10],[15,-1],[17,10],[2,19],[4,6],[-7,11],[-10,1],[-3,8],[-16,3],[3,8],[-12,4],[11,15],[7,1],[10,11],[-10,23],[22,16],[17,-3],[1,7],[-13,9],[-14,3],[2,12],[-6,8],[5,11],[-6,3],[12,10],[4,-6],[43,7],[25,14],[25,5],[9,-4],[-1,10],[7,7],[15,-1],[15,6],[33,8],[13,6],[2,13],[10,0],[2,9],[8,-4],[-1,9],[8,-6],[13,0],[14,-11],[8,9],[14,-12],[1,-18],[6,-3],[-1,-23],[-6,0],[6,-13],[3,6],[11,-4],[10,5],[3,9],[9,-14],[-3,-13],[9,3],[-4,10],[11,-1],[3,-8],[11,-2],[8,7],[-3,-12],[-6,1],[-6,-17],[6,-8],[13,12],[14,-10],[1,12],[9,9],[7,-2],[12,11],[-2,4],[31,15],[12,8],[-7,-19],[-8,1],[3,-9],[34,-36],[7,-11],[42,-97],[12,-38],[15,7],[-1,14],[6,6],[15,-7],[-3,-15],[9,2],[2,-13],[11,3],[6,-4],[17,5],[18,12],[13,-7],[11,-20],[0,-15],[23,-14],[-2,-7],[9,-19],[19,-1],[6,-7],[12,20],[0,-10],[12,-22],[7,-9]],[[6163,5412],[-17,-50],[-9,-17],[0,-175],[1,-39],[15,-39],[0,-7]],[[6153,5085],[-6,-15],[-9,-4],[-4,-20],[-5,-9],[-5,0],[-9,-13],[2,-12],[-3,-18],[-6,-12],[-3,-25],[-4,-11],[-7,-30],[-6,-3]],[[6088,4913],[-21,33],[-19,27],[-5,13],[4,6],[-1,14],[-100,116]],[[5946,5122],[3,12],[-4,7],[0,10],[4,7],[9,-1],[-2,6],[11,4],[-4,11],[-10,-6],[2,-6],[-9,7],[-3,12],[1,12]],[[5944,5197],[4,21],[7,12],[2,15],[9,9],[2,18],[3,6],[0,26],[-3,18],[2,3],[-14,40],[-2,17],[2,13],[-8,5],[-3,24],[-2,2]],[[5943,5426],[11,23],[15,14],[14,9],[4,-7],[2,-16],[8,0]],[[7045,7454],[-13,-5],[-15,2],[-9,-5],[-2,-6],[-5,10],[-7,-7],[-2,12],[-8,8],[-12,-11],[-8,-1],[-4,11],[-36,-5],[-2,14],[7,20],[14,6],[18,-12],[1,7],[8,8]],[[6970,7500],[12,3],[11,-7],[9,15],[8,-3],[0,14],[7,-6],[4,9],[10,8],[-13,3],[-5,9],[-9,-1],[0,10],[-8,0],[-6,22],[-1,-10],[-6,-2],[0,-13],[-6,-1],[-12,7],[-4,14],[-4,-4],[-9,10],[8,7],[22,29],[-8,3]],[[6976,7489],[-6,4],[2,-14],[4,10]],[[6993,7480],[0,0]],[[6961,7477],[0,0]],[[7901,5783],[-6,7],[-11,2],[-7,-4],[-3,5],[5,13],[0,15],[-4,5],[-3,-16],[-9,2],[-2,38],[-3,3]],[[7858,5853],[0,7],[-6,22],[0,22],[-6,7],[0,21],[-3,7],[-2,25],[6,0],[10,26],[1,11],[9,8],[12,5],[9,-5],[5,3],[11,-2],[5,4],[6,-3],[2,-10],[4,8]],[[7921,6009],[3,-14],[13,-1],[3,-9],[6,-1],[2,7],[-6,19],[7,7],[6,-2],[3,6],[8,-14],[4,0],[8,11],[5,2],[2,10]],[[7985,6030],[0,-14],[-3,-2],[-2,-19],[3,-10],[0,-10],[5,-22],[-5,-20],[4,-24],[-2,-15],[-2,-6],[-4,5],[-8,-14],[-8,-7],[-8,-1],[0,-17],[-11,7],[-4,-13],[-1,-15],[9,-13],[1,-17],[-9,3],[-3,10],[-10,-2],[-3,-7],[-7,6],[1,-11],[-6,-13],[-9,0],[-2,-6]],[[627,5299],[5,-18],[-8,8],[3,10]],[[8522,7115],[1,-14],[-17,-6],[-2,8],[5,8],[13,4]],[[8508,7172],[1,-8],[-7,2],[6,6]],[[8575,7196],[-1,-14],[-5,11],[6,3]],[[8518,7361],[8,22],[5,6],[27,0],[7,17]],[[8565,7406],[7,-27],[14,-31],[6,-25],[4,-25],[-2,-7],[-1,-33],[4,-6],[-2,-25],[-9,-23],[-18,0],[-1,-15],[-3,6],[-17,1],[-2,-20],[-4,14],[0,-13],[-5,-9],[-3,13],[-6,-5],[-3,-11],[-4,3],[-4,-10],[-2,15],[-7,2],[0,9],[6,-7],[2,11],[-4,1],[-2,18],[2,17],[6,9],[-4,4],[8,7],[-7,10],[5,1],[-5,11],[-1,31],[-3,8],[3,12],[7,-1],[-6,42],[4,3]],[[5598,7616],[-9,-9],[-3,6],[-10,-8],[0,-11],[-5,0]],[[5557,7633],[8,15]],[[5565,7648],[9,17],[-2,6],[14,-7],[8,-19],[10,-5],[-6,-24]],[[6338,6909],[5,-15],[-4,-7],[-5,12],[4,10]],[[6345,6826],[-22,0],[-6,27],[-25,5]],[[6331,6910],[7,-26],[-6,2],[-7,-12],[10,-1],[2,-19],[8,-28]],[[7836,6473],[2,-9],[8,-12],[6,-22],[2,9],[5,-5],[0,-9],[-2,-23],[7,-19],[15,-11],[2,8],[9,10],[5,-4],[9,-13],[-1,-9],[-6,-3],[9,-6],[0,-8],[7,-2],[0,-11],[-2,-10],[-9,-12],[-8,6],[-4,-15],[-6,-7],[18,-21],[4,-8],[9,-5],[5,-6],[-2,-12],[6,-14],[5,0],[7,-30],[13,-24],[9,-17],[0,-18],[4,-11],[5,5],[4,-14],[8,-12],[4,-1],[-1,-8],[-6,-5],[2,-12],[7,-8],[5,-12],[-5,-33]],[[7921,6009],[9,11],[0,20],[1,5],[-3,11],[3,6],[2,24],[-5,5],[0,13],[-11,7],[0,8],[-8,15],[0,29],[2,20],[-3,9],[-7,7],[-6,14],[-7,24],[-18,8],[-2,-10],[-9,-15],[-9,-6],[-16,16],[-4,-9],[-19,-26],[-4,-7],[-5,6],[3,19],[4,9],[0,17],[-3,3],[5,14],[0,15],[3,7],[-3,6],[-1,19],[2,7],[-12,2],[-2,-7],[-7,0],[-3,9],[3,29],[-5,15],[-6,-5]],[[7780,6353],[0,15],[7,14],[4,-1],[0,13],[6,16],[3,0],[9,14]],[[5975,7088],[14,52],[1,19],[9,12],[0,7]],[[5999,7178],[13,-3],[4,-23],[-9,-14],[2,-8],[-6,2],[-6,-12],[3,-5],[-6,-8]],[[4790,5433],[-19,13],[-21,22],[-9,12],[-21,40],[-9,19],[-12,7],[-1,10],[-14,13],[-3,12]],[[4681,5581],[3,14],[6,12],[15,23],[0,16],[8,8],[1,17]],[[5693,6449],[0,-115],[-27,0],[0,-28]],[[5666,6306],[-66,66],[-3,4],[-45,45],[-34,36],[-45,45],[-30,31],[-27,-26]],[[5416,6507],[-22,-22],[-20,33],[-42,19]],[[5264,6924],[10,7],[11,30],[-5,31],[6,17],[5,1],[10,22],[19,18],[-2,10],[1,34]],[[5319,7094],[10,-6],[12,-14],[15,-2],[14,6],[6,-6],[17,-5],[8,-12],[20,-6],[5,-13],[0,-14],[7,-25],[4,-7],[17,-9],[10,0],[18,-8],[23,-18],[3,-7],[18,-22],[8,0],[14,14],[10,24],[1,18],[-6,24],[0,16],[3,12],[15,24],[14,13],[10,1],[5,7],[21,-3],[21,-14],[-1,-18],[6,-6],[19,-7],[2,-5],[25,-2],[5,-18]],[[3307,5973],[-4,11],[5,10],[-1,-21]],[[7235,5735],[7,-13],[17,-49],[5,-36],[5,-8],[4,-24],[0,-20],[-2,-22],[-12,-22],[-22,-17],[-9,5],[-4,7],[-7,43],[-1,50],[1,40],[2,10],[0,17],[6,17],[-2,7],[4,10],[6,1],[-14,10],[2,7],[7,-3],[7,-10]],[[5798,3530],[6,-12],[10,-10],[3,-14],[-4,-17],[-5,-7],[1,-10],[-8,-9],[-13,-4],[-5,-7],[-4,-22],[-8,2],[-16,35],[-5,22],[8,6],[12,35],[8,2],[4,10],[13,8],[3,-8]],[[5582,8366],[-1,0]],[[5581,8366],[1,0]],[[5652,8289],[0,9],[-14,16],[-6,-1]],[[5632,8313],[-3,6],[5,24],[-8,11],[-15,1],[-21,9]],[[5590,8364],[-6,32],[0,16]],[[5584,8412],[8,9],[22,11],[15,-4],[8,3],[29,-5],[4,-4],[22,8],[5,-12],[15,-2],[26,-28]],[[5759,8496],[14,-14],[-6,-26],[14,-17],[0,-23]],[[5584,8412],[-2,19],[2,24],[10,12],[0,15],[8,15],[22,11],[18,-21],[4,-17],[12,-7],[19,15],[-2,37]],[[3249,6221],[-2,2]],[[3247,6223],[2,-2]],[[4851,7247],[2,-14],[14,-21],[11,-5],[19,8],[6,-5],[15,7]],[[4919,7214],[2,-9],[17,-2]],[[4758,6776],[-3,0],[1,-30],[-18,-3],[-7,-11],[-16,-2],[-9,7],[-10,1],[-13,-7],[2,-15],[-4,-6],[-8,-25],[-8,-3],[-4,-23],[-3,-30],[-3,-13],[-6,-12],[-12,-16],[-6,-22],[-16,-16],[-4,-13],[-6,-53],[0,-16],[-12,-26],[1,-7],[-4,-14],[-11,-4],[-22,4],[-18,-1],[-12,-4]],[[4527,6416],[1,21],[4,20],[10,13],[4,26],[5,11],[-2,5],[13,42],[-4,0],[8,12],[11,26],[5,4],[5,17],[0,22],[10,45],[0,9],[9,16],[7,4],[10,14],[10,53],[7,16],[24,8],[16,14],[11,23],[15,15],[21,49],[5,19],[1,14],[-7,13],[0,26],[2,26],[3,11],[9,18],[3,24],[-1,7],[11,17],[10,23],[26,19],[21,25],[15,48],[2,15],[9,39],[14,7]],[[5206,7702],[-2,-1]],[[5783,7801],[-3,21],[1,26],[3,22],[-4,18],[-6,5],[-17,36],[-10,30],[-8,3]],[[5739,7962],[20,10],[14,-2],[6,-9],[21,-8],[10,-13],[-1,-25],[7,-10],[5,2],[0,-20],[10,-9],[-1,-16],[6,-9],[-15,0],[-3,6],[-7,-6],[-1,9],[-7,-4],[1,-26],[-13,-19],[0,-11],[-8,-1]],[[6384,4200],[0,8],[5,14],[-5,-22]],[[6370,4487],[-2,-11],[7,-4],[1,-18],[7,-8],[4,-13],[-1,-9],[5,-25],[3,-37],[0,-29],[8,-27],[-4,-34],[-3,-9],[-6,7],[-3,25],[-8,-7],[3,-23],[-2,-5],[5,-11],[-1,-25],[-5,-13],[-6,-24],[2,-29],[-4,-39],[-3,-11],[-10,-59],[-2,-19],[-7,-32],[-3,-29],[-10,-57],[-4,-16],[-2,-24],[-7,-48],[-1,-16],[-4,-13],[-8,-47],[-14,-15],[-11,-2],[-13,-11],[-6,-9],[-12,-2],[-11,17],[-10,2],[-10,15],[-2,20],[-7,14],[-1,45],[3,10],[-4,6],[-1,16],[-6,12],[-4,36],[3,27],[4,6],[0,17],[7,4],[11,46],[4,7],[6,29],[-3,4],[2,24],[-6,18],[1,16],[-6,22],[-1,35],[-3,15],[15,49],[0,30],[12,-1],[11,16],[10,-2],[0,7],[8,4],[4,-6],[1,9],[6,5],[18,25],[3,-7],[-3,-10],[7,2],[-4,18],[4,5],[2,12],[6,8],[-3,-22],[11,28],[-3,11],[3,11],[4,-2],[3,11],[-4,9],[0,19],[7,-1],[1,-10],[4,-1],[0,14],[5,1],[-1,9],[6,-4],[3,5],[1,16],[3,8],[-2,22],[3,13],[5,4],[3,18],[2,-8]],[[2590,6367],[-7,-17],[2,17],[5,0]],[[1889,6595],[7,-4],[1,-9],[-8,13]],[[1800,6801],[-5,-1],[5,12],[0,-11]],[[1880,6866],[3,-12],[-3,-16],[-7,7],[2,17],[5,4]],[[1847,6884],[4,-14],[5,-1],[2,-17],[-11,17],[-3,9],[3,6]],[[2186,6889],[0,-8],[7,-2]],[[2193,6879],[11,-20],[1,-12],[9,-31],[6,-12],[9,-27],[7,-6],[-1,-15],[2,-15]],[[2237,6741],[3,-16],[3,2],[2,-14]],[[2245,6713],[2,-9],[20,-12],[4,-8],[16,-2],[9,-10],[5,6]],[[2301,6678],[0,-14],[-8,-31],[-6,-38],[-2,-30],[-1,-43],[1,-16],[-4,-22],[3,-29],[5,-34],[15,-57],[9,-17],[9,-27],[3,-25],[5,-5],[1,-9],[7,-19],[7,-4],[11,2],[5,-9],[6,-2],[8,-21],[10,3],[16,11],[17,3],[15,13],[10,2],[6,-12],[10,-3],[6,17],[-5,8],[14,16],[5,11],[1,21],[7,14],[-1,6],[1,39],[3,15],[16,17],[19,4],[17,12],[14,2],[20,-9],[6,9],[6,-10],[2,-17],[-3,-16],[-9,-18],[-7,-19],[-1,-19],[-8,-16],[9,-8],[-6,-40],[-3,-10],[-2,-23],[-3,14],[-4,3],[2,18],[-5,-4],[-3,-15]],[[2437,6020],[-20,42],[-19,33],[-11,16],[-10,10],[-1,-6],[-8,1],[-4,13],[-5,-9],[9,-4],[-11,-1],[-8,-12],[-15,-9],[-7,-8],[-8,-2],[-15,10],[-4,6],[-17,3],[-8,13],[-13,6],[-6,14],[-5,0],[-15,8],[-5,0],[-5,9],[-31,22],[-6,11],[-13,14],[-4,13],[-7,6],[-5,-4],[-32,20],[-8,21],[-9,14],[-12,13],[-15,12],[-3,14],[-5,6],[-8,22],[0,10],[-4,8],[3,8],[10,6],[-7,15],[7,12],[1,22],[-6,8],[-7,23],[-2,32],[-9,17],[-15,34],[-12,32],[-21,28],[7,-7],[0,9],[-5,-1],[-9,13],[-6,18],[7,0],[-22,24],[0,5],[-9,-3],[6,9],[-7,-1],[-8,9],[0,14],[4,9],[0,19],[-4,9],[-10,3],[-5,23],[-9,2],[-7,13],[-2,26],[2,3],[-14,4],[-8,12],[-5,13],[-5,5],[-13,29],[-2,20],[-5,2],[1,9],[-11,23],[0,16],[-10,36],[3,20],[-16,10],[-1,10],[-7,6],[-9,-6],[-10,15],[-8,2],[0,-41],[4,-8],[3,-27],[-1,-19],[7,-21],[4,-1],[17,-27],[3,-23],[7,-3],[11,-32],[3,-25],[4,-12],[8,-6],[4,-20],[6,-7],[-1,-6],[8,-25],[-3,20],[8,-10],[0,-9],[5,-13],[1,-29],[9,-25],[10,-36],[-2,-15],[3,-15],[8,-8],[0,13],[14,-16],[4,-23],[7,-10],[0,-14],[-11,-19],[-7,0],[-6,36],[-8,9],[-12,22],[-14,16],[-5,14],[-4,-3],[-4,14],[-3,-1],[-2,25],[3,3],[0,27],[-9,30],[-3,0],[-17,21],[-1,21],[-4,-13],[-10,-1],[-5,13],[-8,9],[-10,6],[0,9],[-16,20],[-1,8],[15,-5],[7,6],[5,-13],[-1,17],[2,28],[-9,26],[-4,3],[-12,26],[-6,2],[-14,19],[-4,12],[0,19],[-5,4],[-1,26],[-7,9],[0,11],[-10,22],[1,15],[-8,14],[-6,28]],[[1746,7056],[66,10],[-1,-12],[46,-30],[58,-37],[79,0],[0,26],[46,0],[11,-20],[8,-8],[14,-26],[6,-4],[7,-12],[6,-21],[-1,-10],[5,-21],[14,-20],[25,-19],[8,14],[4,30],[8,2],[3,6],[5,-5],[20,-2],[3,-8]],[[2290,6649],[-4,-5],[0,-32],[-2,-53],[6,67],[4,13],[-4,10]],[[5582,7536],[0,0]],[[5586,7536],[-4,1]],[[5581,7537],[0,0]],[[5575,7539],[-2,10]],[[5598,7616],[20,7],[2,-4]],[[5117,6285],[0,-124],[-1,-33],[-4,-7],[-4,-29],[-11,-17],[0,-8],[-14,4],[0,-5],[-47,-3],[-9,-17],[-9,-3],[-13,3],[1,-5]],[[4683,5897],[-1,36],[-6,21],[-5,-5],[-8,23],[4,5],[-2,28],[-5,6],[1,18],[-2,5]],[[4659,6034],[5,-2],[7,8],[0,24],[3,11],[6,7],[14,-22],[3,-2],[4,13],[12,1],[14,-4],[13,7],[65,0],[41,0],[5,45],[-8,15],[-1,33],[-2,21],[-1,36],[-2,22],[-6,109],[0,17],[-3,39],[-6,104],[0,14],[-3,39],[0,16],[-3,37],[50,0]],[[7737,5862],[0,-11],[-4,-2],[-1,13],[5,0]],[[7733,5907],[-2,-14],[-1,20],[3,-6]],[[7622,6095],[-2,9],[7,13],[2,-6],[-7,-16]],[[7710,6117],[-4,12],[2,5],[2,-17]],[[7602,6269],[-2,-10],[-5,9],[7,1]],[[7604,6305],[6,-6],[-6,-6],[-3,10],[3,2]],[[7780,6353],[-9,6],[0,-6],[-10,2],[3,-11],[-6,-6],[-8,1],[-1,-17],[-21,-7],[-6,8],[0,-9],[-5,-4],[-2,-10],[1,-18],[-4,-10],[3,-19],[-10,-8],[5,-6],[5,-22],[-2,-10],[11,-23],[4,-17],[7,-8],[-1,-11],[6,-28],[6,5],[-2,-15],[-7,-3],[0,-40],[-9,-4],[-2,-12],[2,-16],[6,-13],[3,-15],[11,-14],[4,-11],[3,-67],[6,-9],[1,-25],[2,1],[3,-19],[-6,-12],[-1,-12],[-5,-17],[-6,-8],[0,-8],[-5,-4],[-2,-23]],[[7742,5779],[-7,-20],[0,24],[-1,18],[7,10],[1,45],[-5,2],[4,20],[-6,11],[5,21],[-3,32],[-9,31],[-4,-1],[0,27],[-3,9],[-5,30],[0,32],[-2,26],[-4,14],[2,25],[-8,-2],[-5,13],[0,18],[-3,12],[-6,8],[0,-23],[-2,-16],[-5,-11],[-11,3],[2,-12],[-16,-8],[-2,-16],[-7,-13],[-9,8],[-6,-4],[0,12],[-5,-9],[-3,5],[3,21],[-12,-19],[-1,11],[4,22],[2,38],[4,9],[0,22],[-2,3],[-2,30],[-6,24],[-5,8],[0,20],[-2,-4],[-1,-16],[-7,9],[-6,22],[9,-10],[6,14],[-11,14],[3,13],[-4,-3],[-6,11],[-10,-1],[2,16],[-4,-12],[-5,6],[5,4],[-5,9],[0,-11],[-7,22],[-3,3],[-3,21]],[[5533,7690],[8,-17],[11,-8],[13,-12],[0,-5]],[[5538,7620],[0,-3]],[[5537,7617],[-6,0],[7,-10]],[[5537,7593],[-14,24],[-10,8]],[[8263,7933],[2,-6],[9,9],[-4,10]],[[7439,8014],[9,6],[1,10],[19,0],[8,3],[15,13],[-2,11],[25,18],[5,0],[8,12],[11,0],[12,16],[9,-2],[7,10],[7,-10],[9,6],[2,-10],[33,-2],[3,-22],[8,-10],[8,1],[15,-8],[9,7],[21,-9],[11,2],[9,-10],[7,11],[15,6],[5,15],[2,14],[-8,6],[-6,22],[7,27],[5,0],[3,14],[8,4],[7,20],[11,-11],[11,-3],[9,-10],[14,0],[23,-15],[7,1],[17,-9],[2,-43],[17,-15],[11,-7],[20,-3],[13,10],[19,4],[4,6],[21,-6],[4,-6],[13,3],[14,-20],[22,-3],[-1,-15],[17,-20],[16,1],[31,-10],[3,4],[9,-6],[20,14],[18,1],[11,8],[10,-2],[8,5],[3,12],[27,27],[17,-1],[17,-20],[9,-1],[12,8],[12,-5],[3,-6]],[[5913,3637],[-22,0]],[[5891,3637],[1,15],[-3,17],[1,16],[-3,3]],[[5887,3688],[1,16],[0,71],[-4,30],[-3,5],[-6,24],[1,14],[-7,44]],[[5869,3892],[31,64],[-2,10],[4,10],[-1,17],[6,7],[9,29],[1,14],[-6,6],[1,36],[-5,2],[0,11],[6,3],[-1,14],[4,4],[-2,36],[3,14],[-1,17],[-5,22],[4,14],[-7,-1],[-1,6],[-13,9],[-9,1],[-5,12],[-5,1],[-7,10],[-9,-2],[-2,4],[-13,-1],[0,21]],[[5844,4282],[-1,18],[-4,20],[19,14],[14,6],[19,16],[4,1],[27,19]],[[5922,4376],[6,-21],[7,-13],[1,6],[17,6],[5,-11],[2,-41],[-5,-11],[0,-9],[-5,-10],[5,-13],[1,-14],[9,-15],[5,-13],[5,-4],[0,-17],[5,0],[-2,38],[4,19],[9,2],[3,5],[1,35],[-1,16],[3,15],[-2,14],[-21,54],[-6,11]],[[5968,4405],[-2,10],[-1,28],[2,8],[-4,14],[0,16],[6,10],[2,25]],[[5971,4516],[19,0],[5,10],[9,-10],[1,-7],[15,1],[7,6],[12,-8],[11,10],[1,13],[7,4],[11,-8],[11,13],[11,0],[5,9],[9,4],[18,27]],[[6123,4580],[6,-13],[-7,-32],[0,-23],[3,-18],[0,-28],[3,-20],[-6,-8],[5,-1],[-2,-39],[4,-23],[-4,-8],[6,-2],[-3,-8],[6,-5],[0,-22],[-5,-7],[1,-8],[-3,-24],[-13,-26],[-3,-14],[-7,-7],[3,-7],[-21,-26],[-1,-7],[-11,-2],[-16,-16],[-6,-3],[-20,-22],[-11,-32],[-8,-15],[-2,-13],[-5,5],[1,-12],[-4,6],[-13,-18],[-6,-17],[-16,-26],[-3,4],[0,-25],[-3,-12],[6,-15],[3,0],[4,-39],[4,-16],[2,-20],[-1,-24],[5,16],[2,-16],[-2,-10],[3,-20],[-7,-50],[6,-4],[-3,-17],[-9,-26],[-13,-11],[-26,-17],[-11,-10],[-12,-16],[-5,-18],[-4,-6],[3,-12],[7,-5],[-1,-33]],[[4659,6034],[-6,12],[-12,16],[-1,13],[-8,8],[-2,17],[-5,13],[-10,-2],[-6,16],[-8,14],[-16,0],[-20,-9],[-19,1],[-1,-15],[-3,-3],[-2,-22]],[[4540,6093],[0,30],[2,18],[8,33],[4,26],[0,28],[-3,40],[-5,20],[-6,11],[9,24],[0,28],[-9,26],[0,-9],[-5,11],[-4,19],[-4,-3],[-1,-16]],[[4526,6379],[-1,6],[3,26],[55,0],[55,0],[0,15],[-4,71],[3,10],[12,16],[17,11],[0,146],[56,0],[36,0],[0,74]],[[6603,4026],[2,-11],[-3,-12],[-9,-1],[0,15],[4,13],[6,-4]],[[5969,4525],[0,2]],[[5969,4527],[0,-2]],[[5964,4534],[0,2]],[[5964,4536],[0,-2]],[[5952,4624],[-3,6]],[[5949,4630],[3,-6]],[[5946,4634],[0,1]],[[5946,4635],[0,-1]],[[5941,4623],[2,-16],[8,-22],[-1,-51],[3,-25],[-8,-21],[0,-15],[4,-4],[0,-16],[4,-12],[-1,-26],[2,-9],[7,-10],[-2,-24],[7,-10],[2,11],[8,-16],[4,0],[-6,34],[-6,2],[0,12]],[[5922,4376],[-7,-1],[-2,12],[-6,14],[6,8],[4,49],[9,3],[5,11],[-4,0],[-4,11],[2,15],[-3,27],[5,15],[-4,17],[7,6],[5,11],[-4,20],[-6,8],[1,15],[-4,12],[-7,1],[-1,11]],[[5914,4641],[10,-5],[4,-7],[9,1],[4,-7]],[[8093,5320],[-2,3],[0,20],[2,-2],[0,-21]],[[8269,5423],[5,-1]],[[7786,5497],[-1,-11],[-3,11],[4,0]],[[7773,5553],[-3,-8],[-3,8],[6,0]],[[7834,5543],[9,-7],[3,-14],[18,-29],[9,-33],[1,-32],[-4,-8],[0,-23],[4,-12],[-2,-6],[1,-32],[10,-15],[3,-23],[8,-23],[1,-24],[-16,4],[-4,-10],[-5,15],[-15,19],[-7,11],[-10,9],[-11,21],[-14,15],[2,9],[-2,17],[-6,17],[-11,19],[2,9],[-4,6],[1,21],[-2,19],[-6,11],[2,6],[-2,23],[0,26],[-7,25]],[[7780,5554],[2,15],[4,-9],[12,-7],[2,-11],[7,1],[0,-19],[-3,-9],[3,-8],[5,9],[9,7],[6,-10],[7,30]],[[8045,5303],[0,-10],[8,-13],[9,1],[16,-8],[6,-6],[0,16],[5,22],[0,18],[4,0],[2,16],[5,8],[11,2],[20,10],[9,9],[12,33],[7,12],[6,19],[1,16]],[[8193,5464],[1,-4]],[[8198,5465],[6,1],[6,15],[-6,9],[6,11],[6,0],[3,14],[4,4],[1,17],[6,6],[1,8],[8,18],[3,19],[3,-3],[-2,-22],[6,8],[3,15],[4,-2],[1,-18],[7,-3],[6,-10],[-4,-13],[5,-16],[6,9],[3,-14],[8,-1],[9,-15],[15,-10],[0,-11],[-15,-13],[-7,-1],[-2,6],[-7,-8],[5,-14],[9,-13],[-18,-12],[-11,10],[-1,-14]],[[8256,5598],[-5,-6],[0,10],[6,4],[-1,-8]],[[5649,4167],[22,9],[17,-1],[7,-5],[6,-12]],[[5554,3757],[1,-13],[0,-196],[-12,-8],[-2,-9],[-7,-5],[-3,-11],[-11,7],[-16,-4],[-16,13],[-5,-1],[-2,28],[-4,0],[-3,11],[-5,-2],[-4,-12],[0,-11],[-8,-7]],[[5457,3537],[-5,4],[-15,27],[-12,41],[-2,21],[-5,18],[2,11],[-5,7],[0,21],[-3,11],[-1,23],[1,20],[-11,53],[1,33],[-2,25],[3,10],[-1,27],[-14,39],[-4,18],[-13,37],[-5,37],[-3,3],[-4,20],[-7,22],[-3,18],[-8,23],[-8,14],[-5,21],[-3,36],[1,12]],[[9665,3952],[5,-3],[-1,-13],[-7,3],[-2,12],[5,1]],[[9646,3990],[4,-27],[-9,7],[-1,8],[6,12]],[[9555,4026],[7,-13],[6,0],[16,-24],[5,-3],[11,-30],[7,-3],[15,-20],[4,-10],[11,-14],[2,-10],[-3,-5],[-12,8],[-2,-4],[-6,8],[-2,13],[-4,-1],[-7,14],[-13,7],[-4,13],[-12,16],[-1,8],[-6,6],[-12,44]],[[5416,6507],[4,-53],[1,-34],[12,-31],[-1,-12],[11,-21],[-7,-29],[0,-21],[-6,-142],[-1,-9],[-22,-46],[-12,-29],[-13,-39],[0,-11],[-9,-19],[4,-39]],[[5377,5972],[-6,1],[-4,-10],[-5,0],[-14,-18],[-2,-10],[-10,2],[-7,9],[-12,6],[-22,1],[-13,-6],[-7,-7],[-8,-20],[-18,2],[-10,7],[-15,20],[-9,1],[-10,-12],[-6,0],[-3,-7],[-7,4],[-4,15],[-12,21],[-3,-3],[-16,14],[-8,-8],[-12,2],[-11,-6],[-9,-11],[-1,-28],[-4,-14],[-8,-13],[-1,-25],[1,-21],[-2,-2]],[[5377,5972],[13,-36]],[[5238,5460],[-5,-4],[-6,14],[5,-21],[-2,-4],[-17,-3],[-14,10],[0,-10],[-4,-4],[0,13],[-4,2],[3,-18],[-25,-6],[-7,6],[-8,17],[-3,12],[-3,27],[-4,8],[-3,17],[-6,13],[-13,20],[-15,4],[-12,-1],[4,6],[-5,2],[0,-9],[-19,-1]],[[2691,6046],[-6,-4],[4,-35],[-7,-20],[-4,-40],[2,-21],[-1,-19],[2,-10],[-4,-2],[1,15],[-5,-4],[4,-12],[-5,-31],[3,2],[1,-14],[-6,-11],[1,-16],[5,-12]],[[2619,5821],[-6,13],[-12,18],[-7,15],[-4,17],[-26,41],[4,10],[6,-5]],[[5093,8141],[24,0]],[[5162,8210],[-10,-17],[-10,7],[15,13],[5,-3]],[[5118,8141],[-21,6],[1,7],[9,1],[7,-11],[-3,33],[8,7],[6,13],[6,36],[10,-1],[14,21],[11,5],[24,3],[9,-12]],[[5140,8230],[7,-10],[-8,-8],[0,-15],[12,-5],[12,14],[-12,20],[-2,13],[-9,-9]],[[5157,8665],[-10,4],[10,9],[0,-13]],[[5249,8849],[3,-8],[-16,-5],[-3,7],[16,6]],[[5244,8857],[-2,-7],[-13,0],[15,7]],[[5344,8955],[3,-6],[-12,-11],[9,17]],[[5387,9114],[3,-5],[-17,-6],[5,13],[9,-2]],[[5420,9124],[-11,-11],[-15,-6],[9,15],[17,2]],[[5441,9154],[2,-15],[8,12],[8,-5],[-1,-15],[-21,-8],[-4,-7],[-17,-3],[6,18],[6,0],[6,23],[7,0]],[[5421,9152],[6,-15],[-9,-5],[-18,7],[21,13]],[[5439,9158],[-11,-3],[20,19],[-9,-16]],[[5492,9188],[10,-7],[-3,-14],[-32,-8],[9,12],[-6,8],[22,9]],[[5523,9207],[6,-7],[-8,-11],[-17,-2],[5,15],[14,5]],[[5533,9218],[12,-6],[-15,-10],[-9,7],[12,9]],[[5652,9249],[5,-8],[-16,-11],[-6,7],[17,12]],[[5649,9262],[-11,-16],[-24,-4],[7,13],[17,-3],[11,10]],[[5856,9203],[2,-15],[-17,4],[-10,-15],[-16,-3],[-11,-16]],[[5572,9158],[-14,0],[7,-8],[-11,-20],[0,-11],[-42,13],[-8,-3],[1,-19],[-8,-13],[-16,8],[-15,-11],[-5,-16],[-14,-13],[9,-12],[-1,-10],[-27,-31],[2,-13],[-12,-7],[-15,-1],[3,-17],[-3,-30],[-5,-12],[-20,-30],[14,-8],[1,-15],[-5,-10],[-21,5],[-15,-8],[-14,-21],[-5,-18],[6,-16],[-4,-24],[7,-20],[-5,-30],[20,-20],[-4,-18],[-13,-4],[10,-29],[-3,-21],[-10,-13],[-7,0],[-6,-16],[4,-21],[-6,-21],[-5,6]],[[5317,8580],[-2,7],[-16,4],[-5,22],[-5,-3],[1,-15],[-5,-12],[-15,-2],[-28,-36],[-16,-16],[-15,-5],[-30,5],[4,7],[-19,9],[-10,9],[-4,11],[2,18],[14,-10],[-5,13],[9,14],[-12,11],[2,-11],[-10,-4],[-8,9],[8,18],[11,0],[-5,7],[7,5],[5,15],[10,13],[-13,-9],[-6,-16],[-6,16],[-6,-8],[-6,8],[3,14],[12,-3],[-1,14],[-10,-9],[-10,14],[3,16],[10,0],[-13,10],[0,10],[11,7],[-11,5],[11,16],[33,-6],[-31,8],[-7,-3],[7,17],[13,1],[25,16],[-12,-3],[12,13],[22,-8],[-1,10],[-16,2],[-2,12],[10,5],[7,-6],[16,2],[4,11],[12,-2],[-5,11],[34,19],[7,-14],[24,5],[-2,8],[19,14],[2,9],[-18,-7],[2,-9],[-26,-14],[-12,16],[15,11],[-3,9],[14,10],[12,17],[13,-11],[0,17],[11,5],[4,17],[19,3],[-10,6],[10,12],[-8,12],[27,33],[-8,8],[9,16],[12,10],[-7,6],[20,4],[10,13],[22,-3],[0,5],[-28,1],[28,31],[-15,-9],[4,15],[30,7],[-22,1],[23,8],[5,-17],[6,8],[-11,14],[17,8],[32,-1],[-9,8],[-29,-5],[2,11],[24,6],[6,22],[10,6],[4,14],[19,5],[11,13],[26,10],[8,-11],[15,2],[11,14],[19,-17],[-5,14],[-18,15],[28,3],[20,-6],[5,-14],[11,25],[29,23],[0,11],[37,-7],[-19,-17],[-9,-26],[8,-1],[6,15],[33,35],[-3,-34],[17,22],[11,6],[-8,10],[28,3],[8,-5],[-19,-29],[14,2],[11,20],[9,1],[21,-14],[8,4],[27,-25],[-16,-2],[-10,-10],[-39,6],[-3,-4],[29,-8],[-2,-12],[34,3]],[[5713,9281],[11,-11],[-15,-3],[-6,9],[10,5]],[[4778,9282],[-1,-9],[-15,-2],[16,11]],[[5647,9686],[-7,-11],[38,-10],[-33,-33],[-23,0],[10,17],[-53,-6],[22,27],[-22,9],[23,8],[45,-1]],[[5596,9708],[21,-5],[1,-13],[-43,-4],[-15,17],[36,5]],[[5313,9706],[24,-18],[-29,12],[-16,19],[13,4],[8,-17]],[[5467,9783],[4,5],[53,-31],[2,-16],[23,1],[8,-9],[40,-9],[-5,-12],[-44,-1],[-22,-10],[3,-21],[-18,-4],[-5,-31],[-14,1],[-11,-30],[-12,-11],[3,-11],[-20,6],[-35,25],[-18,3],[-9,22],[50,-2],[-31,7],[59,9],[-36,4],[-50,-9],[-5,19],[40,3],[17,12],[27,1],[-3,22],[-14,-14],[-16,-1],[-1,23],[-28,-21],[10,-6],[-25,-10],[-23,-1],[-17,20],[-20,10],[21,16],[-19,4],[10,14],[-23,-12],[-16,26],[31,17],[9,-10],[47,12],[-3,-10],[-33,-9],[37,-1],[19,16],[20,-12],[5,-15],[28,-25],[-14,23],[-7,33],[24,9],[7,-9]],[[5642,9812],[113,-16],[-1,-15],[-37,-13],[-5,-13],[-38,-5],[-6,-7],[-32,2],[-1,11],[-57,-2],[-32,10],[22,8],[39,1],[0,7],[-66,-7],[-28,4],[-12,23],[33,-5],[33,19],[53,-25],[3,26],[19,-3]],[[9617,2273],[0,-19],[-6,6],[6,13]],[[9665,2494],[6,-10],[0,-14],[-12,-2],[-5,-8],[1,13],[5,6],[-1,14],[6,1]],[[96,2665],[10,-1],[-9,-6],[6,-11],[-9,-5],[3,13],[-9,8],[8,2]],[[9802,2850],[-4,0],[-2,-14],[9,-2],[1,-21],[4,-9],[10,14],[6,3],[3,-10],[3,13],[9,-2],[-4,-7],[3,-10],[-6,-8],[6,-18],[-8,-17],[-3,-13],[-9,-13],[-6,-23],[-15,-16],[-1,-24],[9,-5],[1,-9],[-7,-4],[-10,10],[-7,-9],[-25,-22],[-4,-20],[0,-17],[-7,-15],[-5,-25],[0,-16],[-8,-3],[-17,-24],[-4,-11],[-13,-7],[-11,0],[-1,6],[-13,-4],[-5,16],[-11,-2],[-2,10],[-8,3],[-3,-7],[-16,3],[1,13],[-9,0],[0,10],[9,6],[-2,8],[4,17],[8,-7],[-4,16],[36,56],[2,7],[10,1],[19,21],[8,4],[16,27],[14,12],[13,29],[6,37],[9,4],[8,16],[1,31],[15,21],[7,0]],[[9872,3102],[4,-10],[-7,5],[3,5]],[[9807,3201],[-1,-14],[3,-11],[8,-8],[8,2],[10,-9],[2,-9],[5,4],[1,-13],[5,-10],[-2,-23],[9,-16],[-3,-21],[7,-17],[8,0],[4,-17],[5,3],[-4,18],[3,20],[3,-14],[7,-9],[1,-35],[2,-7],[14,-7],[19,-13],[10,4],[5,14],[8,7],[8,0],[7,-10],[-6,-15],[-1,-32],[-10,-9],[-2,-34],[-1,12],[-12,1],[-10,-8],[-4,-10],[1,-13],[4,-3],[-5,-25],[-8,-21],[-6,-9],[-9,-30],[-8,-14],[-13,-14],[-3,11],[-9,-1],[-8,12],[4,4],[10,24],[4,27],[-5,17],[-15,10],[-6,12],[-9,4],[-6,8],[1,14],[22,19],[3,41],[4,20],[-3,30],[4,10],[-3,8],[-8,-6],[-2,16],[-6,19],[7,-12],[-2,22],[-11,8],[1,-9],[-26,61],[2,16],[-12,29],[10,1]],[[6629,6344],[-1,12],[8,19],[-7,-31]],[[6474,6141],[-8,37],[-2,0],[-11,55],[-10,44]],[[6443,6277],[13,8],[52,37],[19,12],[9,56],[9,61],[-13,39]],[[6566,6621],[6,-28],[6,-15],[10,-17],[31,-18],[8,2],[6,-11],[13,-39],[7,-13],[8,-2],[0,-17],[-9,-27],[-4,-19],[-12,-17],[-11,-42],[-8,1],[1,11],[-5,-3],[-3,-13],[-4,-4],[-1,-20],[-3,-10],[2,-31],[2,-11],[-3,-4],[-15,-2],[-8,-6],[-7,-12],[-3,-28],[-5,-10],[-5,1],[-21,-7],[-6,-19],[2,-9],[-7,-20],[-8,-3],[-4,5],[-16,-3],[-12,-14],[-7,0],[-7,-6]],[[6557,6684],[2,8],[9,-6],[-5,-27]],[[6893,6556],[-1,-9],[-8,10],[-6,-3],[-8,15],[-5,42],[-13,5],[1,20],[-5,7],[-3,13],[-7,1],[2,-7],[-16,-8],[-13,2],[-1,-4],[-23,-1],[-19,6],[-4,-11],[-28,4],[-5,-6],[-17,-8],[1,8],[-5,2]],[[2729,5623],[3,-19],[-7,12],[4,7]],[[2836,5599],[-8,16],[-7,31],[5,4],[0,10],[5,8],[-5,3],[-4,-7],[-3,16],[-10,15],[-6,5],[-10,2],[-9,-12],[0,-13],[-8,-11],[-12,-10],[0,-8],[10,-19],[4,-14],[-10,-6],[-2,-9],[-13,-2],[0,7],[-8,30],[-1,-14],[-10,8],[-3,19],[-9,8],[-6,-1],[0,8],[-8,-4],[-9,2],[-2,-16]],[[2706,5734],[6,-10],[3,-23],[13,-4],[-4,11],[5,-3],[6,-15],[10,-1],[9,5],[7,12],[14,8],[14,22],[10,-4],[7,2],[-2,-7],[16,-2],[17,-19],[3,-9],[10,-15]],[[3073,4289],[-8,13],[-7,0],[2,-20],[-3,4],[-3,-15],[17,-10],[-2,-8],[7,-8],[4,3]],[[3084,4249],[-2,-19]],[[3044,4127],[-14,19],[0,3],[-13,15],[0,13],[-3,10],[-18,16],[-6,15],[-10,5],[-17,20],[-17,13],[-3,8],[-32,34],[-1,9],[-9,19],[-10,12],[-6,25],[-4,2],[0,15],[3,23],[-10,34],[0,7],[-8,20],[1,6],[-7,9],[-3,11],[-2,23],[-4,10],[-8,9],[1,11],[-4,20],[-12,36],[-1,20],[-4,9],[-2,18],[-5,8],[-4,33],[-6,23],[-14,29],[-6,35],[-7,12],[-6,16],[-16,16],[-11,17],[0,11],[8,6],[-2,16],[-7,11],[3,15],[-8,19],[2,25],[12,23],[0,5],[14,21]],[[8339,5486],[-9,-12],[-3,4],[12,8]],[[8361,5534],[5,-6],[-8,-6],[3,12]],[[8390,5552],[-3,0],[-4,14],[7,5],[7,-7],[-7,-12]],[[8493,5581],[-3,9],[3,5],[0,-14]],[[8251,5645],[-2,-13],[-1,14],[3,-1]],[[8489,5736],[9,-8],[3,-13],[4,4],[-1,-13],[4,-7],[0,-10],[-6,-9],[8,-6],[-1,-20],[3,3],[-2,-23],[5,-6],[1,-27],[-4,-16],[-6,-12],[-1,-28],[-4,20],[1,8],[-6,19],[-1,14],[-5,-4],[0,-9],[-5,-8],[-3,-22],[6,-6],[3,-20],[-1,-12],[-7,-21],[-7,13],[3,8],[-3,9],[-3,-14],[-10,5],[-13,14],[-5,15],[0,20],[-2,0],[1,19],[6,8],[0,9],[-5,11],[-15,13],[-3,-12],[1,-15],[-4,9],[-4,-1],[0,12],[-4,-14],[-6,0],[1,16],[-9,-3],[-7,-26],[-2,-17],[-3,-3],[-5,9],[7,30],[-1,11],[7,16],[16,6],[3,21],[8,1],[2,11],[3,-6],[6,1],[4,-13],[0,-15],[11,6],[2,17],[3,4],[6,-8],[3,5],[0,23],[4,1],[5,-9],[5,10],[7,1],[0,17],[-4,21],[2,8],[5,-12]],[[8503,5750],[-4,-2],[2,14],[2,-12]],[[8453,5767],[7,-6],[-1,-12],[-7,-13],[-12,2],[-2,9],[7,10],[3,10],[5,0]],[[8479,5754],[-4,9],[3,3],[1,-12]],[[8490,5782],[1,-31],[-5,11],[0,15],[4,5]],[[8332,5791],[-6,-5],[2,10],[4,-5]],[[8408,5792],[-5,-9],[0,11],[4,7],[1,-9]],[[8423,5815],[8,-4],[1,-7],[-7,-25],[-1,-15],[-4,-13],[0,-19],[5,-11],[-2,-12],[-7,-5],[-3,15],[-9,8],[-5,15],[2,15],[11,6],[-1,23],[4,23],[8,6]],[[8444,5821],[1,-35],[-2,-9],[-9,-14],[0,-7],[-6,-27],[-3,-4],[2,34],[9,27],[5,33],[3,2]],[[8319,5836],[0,-30],[6,-17],[-10,-11],[-4,-14],[-13,-9],[1,-12],[-9,-26],[-10,-10],[-1,-9],[-8,-14],[-6,-2],[-1,-9],[-9,0],[19,43],[4,0],[9,23],[7,11],[6,20],[12,17],[4,32],[0,14],[3,3]],[[8456,5842],[7,-8],[4,7],[6,-10],[-1,-30],[5,-8],[2,-19],[-8,-4],[2,-10],[-8,7],[-1,14],[2,19],[-2,11],[-5,5],[-4,-4],[1,30]],[[8456,5856],[5,-12],[-5,0],[0,12]],[[8396,5860],[10,-14],[4,6],[3,-11],[7,8],[-1,-24],[-9,-10],[-1,-11],[-6,-6],[-9,-2],[-6,-13],[-2,20],[4,17],[0,39],[-6,1],[3,10],[9,-10]],[[8332,5870],[2,-13],[-3,-2],[-2,15],[3,0]],[[8331,5890],[11,-11],[0,-5],[-10,1],[-1,15]],[[8405,5890],[-5,12],[6,0],[-1,-12]],[[8469,5906],[10,-3],[2,-13],[5,-4],[-2,-6],[1,-33],[6,-24],[-14,0],[-2,10],[-4,0],[-4,10],[6,17],[-5,0],[-6,16],[-8,11],[-3,20],[7,-3],[11,2]],[[8426,5905],[6,-6],[5,-13],[4,-1],[4,-15],[0,-12],[-17,28],[-8,-17],[3,13],[-1,26],[4,-3]],[[8392,5910],[-3,-30],[-3,11],[2,17],[4,2]],[[8434,5912],[3,-18],[-5,16],[2,2]],[[8421,5926],[-7,8],[2,6],[5,-14]],[[8360,5962],[15,-22],[-1,-23],[-3,-26],[-4,-5],[-9,17],[-4,15],[0,14],[-7,12],[-4,18],[10,-4],[7,4]],[[8385,5963],[7,-9],[-4,-11],[-5,8],[2,12]],[[8450,5993],[5,-11],[0,-12],[-7,-8],[-4,7],[3,5],[0,20],[3,-1]],[[8387,6049],[2,-18],[-3,-5],[-3,23],[4,0]],[[8358,6252],[7,4],[10,-14],[13,-6],[4,13],[3,0],[2,-15],[-4,-8],[-1,-29],[3,-15],[4,0],[2,-28],[-8,-32],[1,-4],[-18,-18],[2,-10],[-7,-28],[9,-32],[-3,-1],[4,-30],[5,-10],[10,-2],[-3,13],[8,9],[8,-1],[9,-20],[-1,-12],[5,-3],[3,17],[17,-13],[1,-4],[-12,-1],[0,-8],[5,-8],[4,-16],[6,-8],[2,-12],[-2,-14],[-6,5],[-1,13],[-7,1],[-8,7],[0,14],[-3,11],[-7,6],[-5,16],[-9,7],[2,-18],[5,-15],[-3,-12],[-7,25],[-17,19],[-8,-8],[1,-6],[-11,-4],[-4,16],[-6,2],[-2,-7],[-1,24],[11,17],[-4,14],[-9,-4],[2,-13],[-4,-3],[-4,23],[-7,4],[-1,23],[-4,8],[1,26],[-4,3],[0,23],[9,-15],[9,5],[-3,17],[0,21],[4,10],[-1,11],[0,43],[5,23],[-1,10],[10,4]],[[8740,5620],[-2,-13],[-3,3],[5,10]],[[9256,4529],[13,-10],[0,-5],[-10,3],[-3,12]],[[9195,4611],[7,-2],[-2,-10],[-8,2],[-5,23],[8,-13]],[[9184,4640],[3,2],[5,-15],[-14,1],[0,16],[6,-4]],[[9176,4644],[-1,-9],[-5,5],[-1,9],[6,1],[1,-6]],[[9234,4667],[10,-3],[5,-11],[-10,2],[-5,12]],[[8989,4680],[-11,16],[11,-11],[0,-5]],[[8981,4701],[6,0],[1,-7],[-7,7]],[[9105,4867],[7,-7],[-1,-11],[-7,10],[1,8]],[[9299,4867],[8,-4],[3,-17],[6,-8],[1,-9],[5,-4],[8,-16],[2,-14],[-7,-8],[-5,1],[-10,17],[1,14],[-14,25],[0,19],[2,4]],[[9089,4870],[-4,0],[-2,11],[3,3],[3,-14]],[[9296,4889],[-2,-21],[-1,25],[3,-4]],[[9228,4941],[-2,-6],[7,-2],[0,-17],[-5,-20],[-8,-1],[5,-25],[-8,-9],[-11,3],[2,-8],[-14,-21],[-15,-13],[-24,-2],[-3,10],[-6,4],[-6,-5],[-2,7],[-10,12],[-9,7],[4,14],[11,-5],[3,4],[7,-8],[20,6],[2,24],[4,-27],[8,6],[8,-5],[8,6],[0,10],[10,20],[7,-3],[2,5],[-2,23],[-3,16],[7,0],[5,-8],[2,8],[6,0]],[[8915,5033],[7,-1],[25,-25],[25,-17],[13,-4],[9,-11],[5,-11],[15,-2],[0,-8],[9,-6],[5,-15],[8,-3],[13,-25],[-1,-38],[14,-4],[18,-16],[5,-7],[12,-3],[9,-22],[0,-18],[-25,-3],[0,-12],[5,-13],[1,-15],[7,-6],[8,-21],[12,-8],[3,-30],[7,-9],[2,-19],[21,3],[-4,-19],[1,-9],[7,-6],[15,-2],[1,-5],[-9,-5],[8,-16],[10,-7],[12,-3],[-4,-5],[-9,-1],[10,-10],[-7,-9],[-13,6],[2,7],[-9,8],[-7,-1],[-8,6],[-12,0],[1,5],[-11,-3],[-2,5],[-17,1],[-11,33],[-5,2],[-7,22],[-8,6],[-4,23],[-10,30],[-13,9],[-5,-1],[-7,8],[-9,2],[-6,12],[-6,-1],[2,-13],[-7,10],[1,-8],[-13,8],[4,-19],[-11,-4],[1,-12],[-18,-5],[-6,1],[11,-10],[7,-15],[1,-11],[-22,-23],[-11,10],[-20,-3],[-6,4],[-3,-5],[-6,7]],[[9195,5027],[10,-11],[11,-17],[7,-3],[14,-33],[11,-10],[5,-22],[-2,-14],[-5,-10],[-6,14],[1,21],[-5,19],[-10,21],[-6,2],[-9,16],[-5,4],[-9,15],[-10,7],[8,1]],[[9172,5046],[6,-5],[0,-12],[-8,0],[-3,9],[5,8]],[[9079,5070],[12,-5],[-3,-8],[-17,0],[0,11],[8,2]],[[9154,5105],[6,-13],[-6,5],[0,8]],[[5544,8319],[0,-1]],[[5544,8318],[4,-1]],[[5548,8317],[63,-4],[21,0]],[[5655,8150],[1,-13],[14,-27],[-5,0],[4,-18],[-10,-8],[-18,-24],[-13,-25],[4,-28],[-6,2]],[[5626,8009],[-15,8],[-11,12],[-16,-2],[-4,-6],[-6,6],[-10,0],[-14,-12],[-1,12],[-10,11],[-7,-11],[-9,7]],[[5396,8275],[8,-3],[0,13],[-10,0]],[[5394,8289],[54,20],[12,16],[10,2],[11,9],[27,5],[7,-23],[12,-6],[17,7]],[[3138,6248],[29,-2],[9,-6],[2,-7],[-7,-13],[-9,-5],[-17,3],[-12,-1],[1,15],[-3,7],[3,10],[4,-1]],[[8625,7631],[5,-14]],[[8630,7617],[-7,4],[-11,-15],[-11,-27],[4,-15],[-3,-11],[1,-19],[-11,-5],[-7,-16],[-13,-11],[-8,-14],[-9,1],[-4,-9],[-10,-8],[2,-9],[-6,-13],[2,-13],[9,-2],[17,-29]],[[8518,7361],[-8,4],[-8,-9],[-8,15],[-7,1],[2,-14],[-10,9],[-7,-2],[3,9],[-13,4],[9,5],[-3,9],[10,20],[-3,4],[4,21],[5,14],[-4,8],[-16,7],[-11,14],[1,12]],[[4525,7072],[11,-2],[-3,-7],[-10,3],[2,6]],[[4286,7362],[15,1],[0,-6],[-10,-3],[-5,8]],[[4220,7396],[-11,-2],[-2,9],[13,-7]],[[4248,7409],[-8,0],[0,8],[6,0],[2,-8]],[[4794,7325],[-12,-12],[-21,8],[-10,-7],[4,24],[1,44],[-4,18],[-8,-2],[-1,11],[8,6],[-2,7],[-4,-11],[-9,1],[4,38],[6,7],[7,36],[-1,3],[7,47],[-6,50],[3,7]],[[3492,3797],[-1,-17],[-4,-23],[-1,-22],[-3,-17]],[[5949,6986],[8,16]],[[5987,7012],[-4,-16]],[[853,4163],[-9,-2],[-1,11],[5,3],[5,-12]],[[6422,6601],[-8,-2],[-3,9]],[[6411,6608],[1,10],[-3,15],[1,20],[3,6],[4,24],[6,6],[4,-12],[5,-2],[1,-9],[-4,-14],[4,-14],[0,-15],[-4,-17],[-7,-5]],[[5783,7801],[3,-8],[11,-6],[14,12],[10,-3],[2,-9]],[[5823,7787],[-1,-22],[-14,-4],[-3,13],[-4,-3],[-6,-35],[1,-21],[-3,-13]],[[5630,7730],[-6,15],[8,5],[-10,9],[-6,-14],[-5,9],[-10,2],[-9,9],[5,16],[-15,12],[-6,9],[1,16],[-13,13],[-2,7]],[[5635,7944],[10,8],[7,-5],[20,-6],[10,3],[9,-14],[10,11],[26,6],[3,12],[9,3]],[[9064,7741],[7,1],[-12,-10],[-16,-24],[15,37],[6,-4]],[[9133,7793],[-15,-6],[-10,-15],[-5,0],[-7,-11],[-18,-19],[10,17],[-3,3],[25,28],[9,0],[12,15],[2,-12]],[[9182,7845],[-21,-27],[-10,-9],[15,27],[16,9]],[[9227,7898],[-1,-8],[-10,-14],[11,22]],[[9301,8041],[-1,-17],[-6,3],[7,14]],[[9336,8091],[-7,-15],[-9,-4],[-5,-11],[-5,16],[15,9],[4,15],[7,3],[0,-13]],[[9344,8100],[-7,6],[7,7],[0,-13]],[[8967,8309],[5,-11],[-3,-7],[8,-35],[4,-38],[-6,-46],[5,-11],[-2,-12],[6,0],[9,-69],[10,-33],[0,-7],[8,-36],[-9,14],[-23,9],[3,-6],[-10,-7],[-2,-16],[-12,-57],[6,-26],[8,-11],[0,-11],[5,-21],[9,4],[1,-28],[-3,-6],[-2,22],[-17,3],[-2,6],[-7,-5],[-6,-32],[-5,-9],[-3,6],[-4,29],[7,30],[-3,31],[7,21],[-3,26],[-5,12],[7,55],[0,46],[-3,10],[1,17],[5,19],[-5,18],[-11,14],[-1,38],[4,5],[3,26],[-4,26],[13,9],[1,-9],[10,9],[-4,8],[9,2],[-2,12],[-10,21],[5,-2],[5,11],[3,-8]],[[9669,8321],[-19,19],[4,0],[15,-19]],[[8810,8355],[-14,-11],[8,11],[6,0]],[[8827,8358],[9,-8],[-12,-22],[-6,15],[-6,1],[8,17],[7,-3]],[[5548,8317],[18,15],[-10,2],[-12,-16]],[[5544,8319],[10,17],[0,12],[12,-1],[15,19]],[[5582,8366],[-12,-19],[12,-3],[7,5],[1,15]],[[9609,8371],[18,-27],[1,-11],[-13,14],[-4,13],[-7,6],[5,5]],[[9571,8591],[3,-16],[-8,-2],[-23,-18],[9,26],[19,10]],[[5777,8600],[3,-1]],[[6924,9029],[21,-5],[-5,-13],[-16,18]],[[6396,9167],[-24,-22],[-23,-4],[-10,9],[1,19],[15,16],[13,1],[28,-19]],[[9482,9188],[-3,-8],[6,-25],[-10,6],[-2,19],[9,8]],[[9705,9201],[-6,-12],[-29,7],[-11,8],[14,11],[32,-8],[0,-6]],[[6648,9234],[5,-8],[26,-17],[0,-11],[-25,-1],[-5,11],[-10,-2],[-13,12],[-1,15],[13,8],[10,-7]],[[6464,9295],[14,-14],[-6,-11],[-7,12],[-15,9],[14,4]],[[0,9271],[9990,-7],[-25,-4],[-4,14],[8,11],[30,17],[-9999,-31]],[[8829,9305],[-3,-9],[-20,5],[23,4]],[[0,9302],[26,4],[18,-3],[27,-17],[-12,-12],[-42,-8],[-17,5],[0,31]],[[7160,9347],[-27,1],[22,18],[21,-9],[-16,-10]],[[8580,9366],[-7,-7],[-15,7],[22,0]],[[8592,9374],[-28,2],[18,7],[10,-9]],[[7209,9382],[0,-11],[-19,1],[-8,7],[16,13],[11,-10]],[[7078,9392],[-5,-14],[-16,10],[21,4]],[[6536,9406],[31,-6],[-8,-26],[-15,-9],[-7,-32],[5,-18],[16,-29],[23,-20],[19,-10],[-49,-5],[-16,3],[-2,-8],[-14,12],[-18,-1],[-11,7],[-11,34],[-11,-4],[-10,10],[-19,-6],[-8,6],[-3,22],[11,12],[15,-5],[9,22],[11,9],[-20,7],[7,8],[21,1],[-7,12],[17,12],[13,-2],[20,9],[11,-5]],[[6970,9416],[1,-13],[11,-6],[-42,-7],[3,20],[27,6]],[[8951,9436],[32,-18],[0,-21],[-33,3],[-40,10],[-27,-4],[2,8],[17,1],[17,22],[32,-1]],[[8903,9439],[-10,16],[20,5],[2,-17],[-12,-4]],[[8148,9464],[-16,-15],[-37,13],[18,14],[34,-4],[1,-8]],[[7281,9528],[-4,-16],[-14,11],[18,5]],[[9075,9530],[47,-4],[5,-12],[15,3],[49,-6],[-8,-15],[-25,-8],[-43,2],[-58,24],[7,20],[11,-4]],[[8773,9524],[-11,-1],[6,29],[14,-16],[-9,-12]],[[8863,9565],[40,-20],[10,14],[19,1],[-8,10],[35,-19],[29,1],[50,-20],[-19,-5],[5,-8],[-16,-15],[-40,6],[-11,13],[15,13],[-3,8],[-25,-4],[5,-18],[12,-15],[30,-9],[-38,-6],[-14,10],[-49,-10],[-6,8],[-17,-18],[-33,8],[-25,20],[-2,34],[18,1],[-9,9],[42,18],[5,-7]],[[7674,9577],[3,-9],[-30,3],[27,6]],[[8125,9595],[2,-10],[-18,11],[16,-1]],[[9145,9596],[-23,0],[29,8],[-6,-8]],[[6893,9615],[24,-15],[-21,-24],[-51,-17],[-116,-32],[-47,-18],[0,-15],[-22,-8],[-2,-8],[-17,8],[1,-16],[-26,8],[15,-17],[-16,-8],[-16,-31],[-24,-20],[-36,4],[-11,6],[-20,-6],[-4,9],[24,12],[-30,-4],[-2,8],[26,12],[-3,6],[26,13],[-3,20],[24,4],[-14,7],[18,4],[-18,4],[-3,9],[21,-4],[14,19],[19,-4],[-5,11],[38,20],[23,3],[14,11],[23,-2],[0,12],[52,-5],[61,15],[49,28],[35,1]],[[7679,9622],[-33,-4],[35,11],[-2,-7]],[[8666,7787],[3,-13],[-2,-13],[9,-14],[7,9],[6,22]],[[6367,7850],[-12,-15],[-2,-14],[-4,9],[-10,-14],[-17,0],[-7,-31],[-8,-23],[-10,-8],[0,-13],[14,-11],[8,-28],[-2,-14],[6,19],[-5,-26],[0,-21],[7,-10],[4,-16],[12,-26],[2,-11],[6,-4]],[[6110,7681],[-15,21],[-1,6],[-18,24],[-15,7],[-11,15],[-9,1],[-8,19],[-17,11],[8,3],[-1,11],[8,-6],[11,2],[5,-4],[0,16],[-4,2],[8,10],[2,14],[4,-6],[2,11],[11,0],[-13,17],[-5,0],[-4,15],[6,-3],[13,14],[24,9],[0,13],[-30,-8]],[[6061,7895],[-1,12],[5,17],[11,5],[3,10],[25,-3],[0,13],[6,12],[-8,29],[10,5],[-8,3],[11,26],[-1,14],[-10,-2],[-5,10],[-7,0],[-5,9],[-6,-5],[-8,10],[-18,-4],[-8,11],[-8,20],[-16,-6],[-6,-7],[-10,4],[-5,8],[-13,-5],[-6,10],[2,10],[-4,19],[-7,12],[-11,-3],[-13,12],[-3,17],[8,9],[-8,8],[-1,10],[-11,13],[-13,1],[-9,-8],[-15,5],[-1,-11],[-12,-7],[-3,5]],[[5767,8523],[9,-9],[6,9],[-6,10],[-10,-2],[7,19],[-4,30]],[[5773,8590],[9,11]],[[5778,8608],[-1,16],[11,-5],[3,11],[10,-4],[7,12],[29,-8],[2,8],[-9,9],[-25,2],[-10,28],[-16,-9],[-7,2]],[[5856,9203],[15,-9],[19,18],[16,-11],[14,-3],[-7,-8],[-20,4],[6,-7],[19,-3],[-6,-7],[19,4],[5,-5],[35,-7],[23,-1],[52,-28],[21,-21],[14,-2],[16,-14],[13,-3],[30,-21],[1,-23],[7,-2],[-5,-24],[-21,-24],[-30,-15],[-22,-4],[-28,5],[-22,9],[-27,3],[-27,15],[-36,7],[-24,23],[-11,0],[8,-15],[18,-11],[3,-9],[13,-6],[-4,-7],[14,-3],[21,-20],[-4,-21],[-6,-7],[13,-46],[-6,-4],[16,-15],[15,2],[12,-18],[31,-13],[16,9],[1,21],[-25,5],[-16,19],[-3,12],[10,2],[7,12],[18,-9],[10,-13],[0,-9],[10,10],[31,-15],[9,7],[18,-7],[-4,22],[-19,30],[4,9],[18,12],[6,9],[18,5],[22,27],[11,-8],[20,3],[22,-21],[1,11],[11,23],[0,16],[-20,19],[10,28],[3,31],[-25,18],[18,-4],[37,0],[18,-6],[16,-18],[5,-18],[-38,-5],[-12,-22],[17,-9],[8,-17],[20,-5],[34,13],[5,22],[-3,11],[26,7],[1,6],[24,9],[31,22],[8,-1],[31,13],[-1,-12],[16,4],[-12,10],[32,18],[15,-3],[-7,-14],[6,-13],[-21,-8],[29,-3],[7,6],[11,-7],[1,12],[29,14],[38,-5],[18,17],[25,8],[15,-13],[-10,-8],[1,-13],[16,-4],[8,10],[-6,7],[20,5],[13,11],[0,10],[-22,28],[15,6],[2,10],[74,-10],[20,-7],[19,-15],[62,-29],[33,-25],[2,-9],[17,25],[7,19],[-21,2],[-10,16],[-1,12],[-35,14],[3,16],[12,3],[-6,9],[6,15],[-1,20],[-16,-3],[-2,17],[8,14],[28,12],[15,17],[14,51],[12,16],[5,-5],[52,1],[39,-11],[1,-25],[-16,-26],[1,-7],[-15,-11],[8,-13],[16,-10],[5,-15],[-2,-25],[-10,-9],[8,-25],[-5,-11],[3,-21],[-3,-16],[5,-8],[26,-20],[-15,-16],[3,-22],[-18,-13],[-9,-27],[-20,-14],[2,-15],[-15,-1],[-10,-7],[-22,21],[-22,-6],[8,-15],[27,-10],[22,2],[24,-8],[10,6],[2,16],[13,2],[26,20],[1,17],[24,24],[-1,25],[-11,15],[3,17],[29,12],[31,4],[1,-11],[19,-15],[-5,-15],[5,-20],[-7,-7],[18,-13],[18,-1],[-25,13],[0,18],[20,10],[-11,14],[-5,24],[-19,5],[-24,13],[-17,1],[-20,-10],[-27,5],[3,18],[-10,15],[6,25],[17,20],[-21,41],[-15,12],[14,22],[39,16],[5,17],[-4,28],[15,-7],[6,-30],[-13,-17],[7,-17],[-5,-18],[11,-4],[57,-7],[6,-11],[12,0],[-4,17],[-17,2],[-39,16],[-8,20],[27,8],[17,-13],[15,3],[-5,14],[-15,-2],[15,14],[16,5],[28,-3],[51,-35],[23,-3],[18,5],[14,-7],[-14,-16],[-16,-6],[-2,-17],[7,-12],[-10,-12],[11,2],[0,11],[10,11],[9,-6],[-4,-27],[-10,-9],[14,-10],[-7,14],[18,0],[6,8],[-17,44],[13,23],[-6,11],[-32,15],[-3,11],[-26,4],[-14,11],[4,23],[-11,9],[2,28],[39,5],[43,-1],[59,10],[40,3],[-23,-18],[25,2],[10,13],[-19,21],[-22,4],[14,18],[-21,4],[13,10],[16,-7],[68,47],[67,8],[66,16],[-28,9],[19,3],[22,-5],[25,7],[21,-3],[-16,-13],[58,10],[32,12],[29,-10],[-29,24],[18,-3],[40,4],[1,26],[63,39],[43,3],[33,-17],[-21,-13],[-24,-3],[82,-7],[6,-6],[-27,-21],[36,-1],[4,12],[38,1],[19,-4],[27,5],[47,-24],[3,-16],[19,4],[3,-28],[-21,5],[1,-12],[22,-1],[-2,-14],[-20,-17],[-20,-6],[-12,-13],[-47,-16],[-2,-9],[-32,-15],[-20,-19],[-27,-1],[-12,-18],[-17,-2],[-6,-15],[-15,-12],[23,6],[7,17],[37,-2],[15,8],[51,12],[23,10],[-7,6],[-25,-5],[-6,8],[13,10],[25,-6],[7,7],[8,-13],[19,-6],[22,5],[-2,12],[16,-20],[-8,-12],[44,9],[19,7],[100,-13],[-18,-4],[1,-11],[38,-12],[36,-5],[25,2],[21,-8],[-7,11],[19,-6],[11,17],[-8,10],[3,16],[17,-2],[10,10],[23,-14],[29,0],[12,-16],[7,15],[30,-4],[7,-12],[34,-14],[-34,-12],[30,-6],[-39,-3],[20,-10],[18,-1],[6,-12],[-15,-11],[-19,8],[27,-37],[13,-27],[40,-21],[13,12],[18,43],[10,14],[13,-19],[23,-12],[22,0],[4,6],[31,8],[22,-6],[19,-11],[11,-13],[7,27],[16,4],[12,-13],[17,2],[-3,27],[15,17],[-29,0],[12,16],[37,2],[4,10],[-12,9],[23,-1],[23,-9],[38,0],[50,-8],[39,-12],[-37,1],[-16,4],[-13,-15],[27,6],[42,2],[-26,-26],[10,16],[-12,4],[-3,-17],[-23,-12],[29,4],[30,31],[36,0],[34,-9],[13,-13],[-12,-9],[-7,7],[-9,-11],[25,-2],[-2,-11],[20,2],[0,-13],[24,3],[18,-20],[-13,0],[26,-9],[28,3],[65,12],[45,-1],[26,-6],[33,-17],[11,-25],[-11,-19],[3,-8],[31,-8],[3,-28],[11,-11],[-10,-25],[14,22],[-2,26],[19,17],[51,7],[23,-12],[23,2],[11,-5],[24,-1],[21,16],[16,-13],[2,-19],[29,-8],[7,-18],[22,4],[17,12],[-13,32],[-11,-1],[11,11],[-1,19],[41,-7],[22,-1],[17,-10],[1,9],[37,-6],[20,2],[28,-7],[71,-27],[17,-16],[-9958,-15],[3,-12],[28,-11],[2,-9],[12,1],[20,-19],[16,-2],[-10,-7],[12,-5],[0,10],[12,-7],[8,-20],[10,-2],[-3,-18],[5,-13],[-7,-6],[14,-8],[-1,-14],[17,13],[-11,3],[9,6],[-2,17],[-9,6],[27,1],[20,-12],[-5,9],[32,-6],[10,-17],[13,-7],[10,-17],[5,4],[17,-14],[-9,0],[-14,-11],[-5,-15],[-21,13],[11,-20],[-32,3],[4,-27],[-19,-12],[-8,-11],[16,-5],[6,-9],[-13,-1],[-12,-9],[-23,10],[-2,8],[-16,10],[-33,12],[-4,29],[-29,10],[-12,-10],[-30,4],[-11,27],[9,7],[2,15],[-7,-11],[-28,-4],[0,-16],[13,-11],[-7,-23],[9982,-11],[-10,-13],[-34,-9],[-21,8],[-1,8],[-16,9],[12,-16],[-24,2],[-11,7],[20,-23],[20,12],[-3,-16],[17,-17],[8,8],[12,-25],[2,-16],[-5,-13],[18,-9],[2,-20],[7,-16],[-12,-7],[0,-10],[-28,12],[-22,3],[-10,16],[2,-16],[-21,-16],[-25,-11],[-25,-18],[-12,2],[-7,-10],[-8,4],[-1,-10],[-10,-10],[-11,2],[5,-8],[-22,-13],[-3,-12],[-17,-4],[-1,-9],[-15,-7],[-10,-16],[-6,-18],[-8,8],[-7,21],[-13,9],[-32,0],[-35,-20],[-16,-23],[-4,0],[8,39],[-33,-24],[-5,-14],[-7,-2],[-2,11],[-30,3],[2,-9],[-9,-4],[-5,-19],[4,-12],[-12,-10],[4,-10],[-18,-16],[-10,-26],[1,-19],[13,-7],[1,11],[18,-8],[3,-6],[-15,-21],[1,-36],[11,1],[4,-32],[-9,-10],[-12,13],[8,11],[-6,4],[-8,-7],[6,-6],[-16,-12],[-7,-25],[-1,-16],[11,-34],[-11,-14],[-13,-1],[-6,6],[-15,-9],[-13,-15],[-6,-22],[4,-13],[-3,-6],[5,-22],[-13,10],[-9,-5],[-21,-25],[1,-26],[-7,-19],[-10,-20],[-11,-7],[-2,-8],[-17,-22],[-9,17],[-1,40],[-4,33],[-7,23],[-4,46],[-9,60],[-2,29],[4,46],[6,29],[6,15],[17,15],[7,17],[-5,22],[16,0],[7,14],[15,0],[20,19],[24,33],[3,13],[13,12],[5,12],[8,2],[18,25],[14,14],[-1,8],[30,21],[21,9],[-8,4],[15,18],[-7,9],[8,12],[2,33],[14,12],[17,-5],[-18,17],[-15,-1],[-22,-8],[3,-11],[-8,-6],[3,-9],[-6,-15],[10,-9],[-10,-7],[-5,11],[-10,-2],[-12,-18],[-32,-32],[-19,-14],[8,27],[-17,-7],[5,11],[-3,9],[14,29],[-3,10],[-12,-14],[-10,-2],[-3,12],[-13,2],[-26,-10],[-15,3],[-22,-15],[-1,-18],[-20,-20],[0,-9],[-27,-20],[-13,-28],[-7,-1],[-2,-23],[14,5],[16,-14],[-1,-7],[-11,-3],[-8,5],[-13,-10],[-19,11],[0,-8],[-10,-2],[-2,-8],[-16,8],[-9,-11],[-17,-2],[-9,15],[10,4],[18,-1],[6,4],[-15,8],[-10,14],[-13,-8],[-12,2],[-2,7],[-23,8],[-16,-8],[5,-5],[-14,-5],[6,-12],[-14,2],[-2,7],[-12,0],[-10,-9],[-31,13],[-3,-16],[-8,-3],[-6,9],[4,6],[-27,-1],[-32,2],[-19,-3],[-25,-13],[-19,-30],[-17,-11],[-8,-13],[-5,-20],[-15,-9],[-4,-11],[-11,-12],[-14,-9],[-22,-32],[-12,-26],[-26,-27],[-8,-4],[-15,-23],[-19,-15],[0,-12],[14,-9],[30,5],[0,-28],[-4,-21],[12,0],[5,14],[-6,6],[10,10],[8,-2],[-8,-11],[9,-11],[-12,-22],[16,4],[11,9],[7,14],[1,-9],[-10,-15],[7,-3],[8,26],[-1,20],[16,-8],[9,5],[17,-12],[0,-11],[27,-32],[6,-10],[-13,-12],[8,-5],[1,-15],[-4,-13],[11,-12],[-6,-3],[3,-9],[-9,-16],[-6,-3],[0,-12],[-6,-8],[0,-18],[-4,-4],[-3,-20],[1,-32],[3,-23],[-6,-17],[1,-17],[-6,-17],[0,-14],[-26,-38],[-7,-28],[-13,-18],[-5,-27],[-18,-41],[-15,-25],[-10,-11],[-8,-20],[-6,-6],[-5,-15],[-7,-5],[-11,-25],[-3,-14],[-5,0],[-1,-12],[-18,-20],[-9,-6],[-7,-11],[-8,0],[-12,-10],[-6,7],[-4,-4],[-12,10],[-3,-4],[-1,23],[-9,-11],[1,15],[-16,-21],[-1,-11],[-14,-11],[-4,-17]],[[7858,9748],[0,-12],[30,4],[14,-16],[16,-1],[8,-19],[-16,-10],[-31,-5],[-68,-3],[-33,-14],[-21,5],[21,17],[6,19],[36,39],[19,-6],[2,11],[17,-9]],[[7118,9769],[37,-6],[-27,-3],[-10,9]],[[7523,9794],[79,-8],[-18,-13],[-55,8],[-6,13]],[[6659,9787],[-27,3],[21,7],[6,-10]],[[7715,9797],[-5,-21],[25,17],[20,0],[24,-16],[-9,-24],[-19,-5],[25,-18],[-39,-10],[-38,4],[-11,8],[-50,2],[-18,12],[-1,14],[-33,3],[29,14],[23,19],[77,1]],[[6585,9810],[-4,-16],[-28,0],[1,14],[31,2]],[[6481,9813],[15,-7],[-35,-6],[20,13]],[[6646,9809],[-52,-12],[-13,20],[42,0],[23,-8]],[[6329,9836],[-38,-20],[-39,11],[77,9]],[[6729,9835],[-5,-10],[-29,-12],[-38,1],[-13,13],[14,11],[65,2],[6,-5]],[[6537,9839],[-13,-8],[-22,8],[35,0]],[[6388,9840],[7,-8],[30,3],[-9,-14],[-60,-9],[4,-14],[-38,-4],[16,15],[-22,8],[63,10],[-18,7],[27,6]],[[7225,9845],[-28,-9],[2,9],[26,0]],[[6560,9854],[57,-11],[-29,-1],[-28,12]],[[6542,9848],[13,2],[47,-13],[-19,-7],[-41,18]],[[6797,9859],[20,-16],[-28,-11],[-36,-3],[-17,9],[46,10],[15,11]],[[7536,9852],[-37,1],[2,7],[38,-2],[-3,-6]],[[7665,9859],[54,-29],[-20,-3],[0,-24],[-75,-6],[-22,-7],[-63,20],[36,9],[15,17],[-22,-3],[16,14],[81,12]],[[6577,9869],[28,-6],[-38,-6],[10,12]],[[6605,9878],[14,-9],[-44,4],[30,5]],[[5846,5121],[2,-14],[5,-5],[3,-11],[1,-26],[-1,-18],[-8,-2]],[[5801,5040],[6,7],[8,22],[-4,17]],[[5821,5103],[7,4],[4,-9],[5,7],[5,16],[4,0]],[[4526,6379],[-1,15],[2,22]],[[6163,6147],[4,4],[4,-6],[-8,2]],[[6345,6826],[6,-29],[6,-11],[0,-14],[11,-4],[-4,-5],[5,-5],[11,-23],[8,-6],[0,-16],[6,-10],[-2,-18],[-4,4],[7,-31],[8,-17],[0,-12],[8,-21]],[[6422,6601],[7,-4],[-5,-9],[8,-8]],[[6443,6277],[-4,-2],[-58,-16],[-17,-4],[-27,-27],[-16,-40],[-3,-19],[-9,-11],[-5,1],[-7,19],[-11,-3],[-25,5],[-5,6],[-16,1],[-15,-5],[-11,0],[-7,10],[-9,-11],[-1,-24],[2,-15],[-11,-16]],[[6188,6126],[-2,21],[-5,8],[0,8],[-6,9],[0,15],[-15,23],[-9,25],[0,8],[-7,16],[-2,14],[-11,49],[-18,29],[-9,3],[-6,13],[-13,43],[3,7],[-7,28],[4,20],[0,19],[-8,23],[0,8],[-14,46],[-18,21],[-2,-3],[-12,35],[3,0],[0,20],[-4,7],[-4,18],[-8,11],[1,11],[-5,5],[-8,30],[-4,7],[-8,26],[-7,15],[-6,24],[-8,14],[-6,-3],[-6,7],[5,20],[4,47]],[[6024,6449],[0,-20],[6,-21],[2,-34],[2,-65],[5,-40],[4,-8],[10,-8],[5,-9],[1,-10],[10,-6],[3,-8]],[[5946,5727],[-6,5],[3,17],[-2,21],[-20,35],[-3,45],[2,5],[2,31],[-13,0],[0,-12],[-18,0],[7,-17],[0,-27],[2,-11],[-14,-24],[-1,-9],[-18,-39],[-13,-4],[-14,23],[-7,8],[-11,-12],[-4,-17],[-13,-9],[-5,-10],[1,-6],[-23,0],[-4,15],[-22,1],[-14,-7],[-11,27],[-8,12],[-2,15],[-21,-7],[-3,-21],[-5,-6],[0,-19],[-3,-6],[-3,-29],[-11,-12]],[[5634,5812],[3,13],[-1,15],[-4,-1],[-7,16],[3,23],[-5,-2],[0,34],[-7,7],[-6,-7],[-5,9],[6,21],[7,14],[-5,25],[4,9],[9,9],[-4,7],[-1,18],[8,6],[0,10],[7,15],[2,15],[-2,11],[7,9],[12,2],[11,-2],[0,218]],[[5943,5426],[-14,-28],[-9,2],[-3,6],[-5,-5],[-13,-3],[-6,-13],[-7,5],[-4,12],[-7,-8],[-11,7],[-8,-17]],[[4535,5893],[-1,42]],[[4540,5965],[-5,11],[-1,13],[-14,41],[-8,3],[11,9],[8,18],[9,33]],[[7884,5266],[4,-3],[-4,-7],[-7,2],[7,8]],[[3953,2073],[22,-4],[11,-7],[17,-21],[3,-11],[-10,-7],[-10,20],[-12,11],[-22,11],[1,8]],[[9445,4521],[15,-17],[-6,0],[-3,9],[-8,4],[2,4]],[[9612,4569],[-6,-12],[-3,7],[9,5]],[[9481,4595],[13,-14],[8,0],[5,-13],[0,-8],[-12,4],[-9,10],[-1,11],[-6,3],[2,7]],[[9483,4641],[4,-12],[0,-10],[-5,7],[1,15]],[[9442,4640],[13,0],[11,-20],[-4,-9],[-10,7],[-13,1],[-6,13],[0,16],[3,2],[6,-10]],[[9388,4691],[3,-9],[-6,0],[3,9]],[[9371,4689],[-5,3],[5,6],[0,-9]],[[9466,4701],[6,-16],[-2,-11],[5,-5],[7,-34],[-14,21],[-3,10],[-5,37],[6,-2]],[[9378,4711],[4,-3],[3,-19],[-7,4],[-2,13],[-9,-2],[-1,6],[6,13],[5,-1],[1,-11]],[[9365,4716],[-5,1],[-1,9],[4,5],[2,-15]],[[9349,4747],[6,-9],[-4,-9],[-5,14],[3,4]],[[9405,4746],[4,0],[9,-16],[12,-12],[9,-15],[1,-13],[-7,12],[-11,9],[-18,25],[-3,13],[4,-3]],[[9349,4800],[13,-15],[3,-16],[10,-7],[-2,-7],[-15,13],[-7,18],[-6,9],[4,5]],[[4650,5621],[2,-12],[-12,10],[10,2]],[[4681,5581],[-6,9],[-23,18],[1,15],[-7,4],[-6,10],[2,3],[-3,18],[-5,-4],[-3,18],[7,1],[-6,7],[0,11],[4,7],[-6,5]],[[2560,5955],[-2,-14],[-12,0],[-13,5],[-14,14],[-14,2],[-8,11]],[[6359,5831],[0,-104],[-27,-84]],[[6201,5844],[18,-44],[13,-18],[15,0],[11,15],[4,0],[10,12],[11,-4],[6,-7],[6,4],[21,25],[8,-5],[14,3],[9,10],[12,-4]],[[6359,5831],[14,5],[4,7],[7,0],[12,7],[13,23],[15,-9],[-5,-19],[-1,-18],[2,-35],[8,-8],[-14,-6],[-3,-53],[-4,-8],[-1,-12],[-6,-10],[-3,-22],[-6,-20],[-8,-13],[0,-11],[-6,-25],[-10,-29],[-4,-29],[-12,-48],[-13,-33],[-7,-26],[-12,-30],[-14,-28],[-10,-24],[-9,-15],[-8,-19],[-21,-26],[-8,-7],[-18,-27],[-8,-17],[-10,-15],[-22,-48],[-11,-21],[-18,-49],[-9,-28]],[[5183,5187],[-3,-2],[-1,13],[5,8],[3,-11],[-4,-8]],[[3409,5499],[3,3],[1,20],[5,7],[8,-2],[20,-10],[2,10],[33,0],[18,-8],[-1,-20],[-3,-8]],[[5626,8009],[-12,-39]],[[5377,7802],[3,6]],[[5474,8485],[-7,-30],[-12,-34],[0,19],[19,45]],[[5521,8514],[8,1],[-8,-14],[-2,-22],[-10,-8],[-5,7],[-1,19],[10,16],[8,1]],[[5327,8537],[-2,-9],[-9,3],[11,6]],[[5671,8973],[-41,-2],[-9,5],[1,-19],[-16,0],[3,-8],[-13,0],[4,-13],[-10,-13],[-4,-15],[12,-15],[-17,-17],[-4,-15],[-13,-13],[-8,1],[-11,-13],[-32,-24],[0,-9],[-17,-3],[5,-11],[-5,-7],[-15,-2],[5,-14],[-5,-29],[-7,-9],[5,-32],[0,-18],[10,-10],[10,4],[14,-25],[9,-2],[6,-19],[-20,-23],[-6,3],[8,-16],[-17,-16],[-18,-13],[-13,-2],[8,-8],[-6,-3],[3,-15],[-10,-16],[6,-8],[0,-17],[-6,-10],[-3,-37],[-3,0],[-6,-23],[-5,-8],[-6,5],[-27,-3],[-11,-14],[-2,-11],[5,-10],[-6,-9],[-11,3],[-10,-5],[-14,2],[4,15],[-14,31],[8,6],[-6,8],[8,2],[-15,26],[-18,47],[4,27],[-4,8],[-9,-4],[-4,9],[-1,39],[6,-6]],[[5891,3637],[-3,2],[-1,-29],[-12,0],[-11,7],[-9,22],[0,24],[7,17],[1,10],[8,11],[14,-15],[2,2]],[[3249,6221],[-2,2]],[[5999,7178],[-3,27],[1,18],[-4,4],[1,20],[3,4]],[[5997,7251],[7,-5],[5,9],[0,11],[9,3],[-4,14],[4,21],[8,-5],[2,-7],[12,0],[5,6],[18,10],[10,-11],[16,-3],[21,8],[20,17],[22,-1],[16,7],[4,7],[4,-12]],[[5402,5930],[5,0],[0,13],[-4,3],[-6,-5],[2,-5]],[[5398,5936],[-1,0]],[[5044,5541],[-12,-7]],[[7728,5654],[6,-7],[0,-10],[-6,-6],[0,23]],[[7840,5883],[5,-11],[-4,1],[-1,10]],[[7858,5853],[-4,22],[-5,11],[-1,-7],[-12,18],[0,8],[-5,0],[-8,10],[-7,-5],[-16,5],[3,15],[-3,7],[4,21],[-11,5],[-15,-8],[-2,-9],[4,-13],[-4,-16],[0,-27],[2,-5],[-7,-15],[0,-11],[-4,-13],[-5,-20],[0,-15],[-9,-32],[2,-7],[-2,-27],[5,-21],[-3,-10],[16,5],[4,-12],[1,-29],[9,-16],[0,-12],[4,-37],[4,-16],[-4,4],[-3,29],[-6,-2],[2,-13],[6,-18],[6,0],[9,-18],[12,1],[6,-4],[6,-21],[7,-12]],[[7780,5554],[-4,13],[-8,12],[2,14],[-6,2],[-5,10],[-2,18],[-7,5],[1,7],[-5,11],[-4,1],[-3,18],[-5,-2],[-2,-12],[-4,5],[-2,18],[2,14],[4,19],[0,16],[3,16],[7,40]],[[6962,7540],[0,0]],[[6882,7324],[1,20],[12,24],[3,15],[-7,12],[-2,14],[4,10],[-2,9],[-12,1],[0,7],[-9,4],[2,16],[8,9],[18,-6],[7,6],[0,11],[8,4],[1,14],[-10,2],[13,4],[7,-3],[1,9],[-4,11],[5,14],[8,-8],[18,14],[5,7],[8,-18],[-11,-19],[7,-10],[9,3]],[[6497,7333],[-3,23],[2,30],[-1,22],[4,15],[-12,17],[0,9],[-11,0],[1,8],[14,2],[-9,14],[6,10],[-5,3],[-14,-3],[-5,6],[0,25],[4,9],[2,19],[4,-11],[13,-1],[5,-8],[16,6],[1,12],[8,-6],[3,14],[-19,23],[-4,34],[-6,5],[-16,-3],[-5,-6],[-5,-17],[4,0],[-3,-19],[-7,9],[-3,13]],[[6554,7562],[29,-5],[4,7],[-4,7],[-2,23],[4,3]],[[6585,7597],[4,-18],[11,-2],[7,14],[-6,6],[0,13]],[[6601,7610],[5,1],[4,19],[7,-2],[-3,10],[11,1],[2,6],[8,-12],[7,-2],[7,-14],[13,2],[5,-8],[-1,-12],[6,-8],[-5,-4],[4,-10],[-3,-10],[11,-11],[18,1],[6,-3],[7,6],[9,-10],[8,-36],[4,-2],[5,-29],[27,-31],[4,-10],[13,-16],[5,2],[10,-14],[27,-29],[7,1],[19,-14],[3,-4],[-4,-9],[0,-25]],[[8444,4645],[12,9]],[[8469,4667],[5,9],[1,10],[20,8],[10,-1],[6,5],[3,-4],[11,10],[11,-6],[-13,-19],[-8,-3],[-4,-9],[-7,-2],[-6,-8],[-10,-3],[-15,-17]],[[130,3966],[6,0],[-1,-7],[-5,7]],[[3308,5807],[-4,-9],[1,-31],[-4,-4],[-14,-1],[-5,4],[10,7],[0,20],[-5,5],[8,7],[13,2]],[[5303,7135],[4,-6],[-9,-6],[0,11],[5,1]],[[5238,7310],[7,2],[10,15],[13,6],[17,-9],[-4,-1],[6,-17],[-5,-4],[10,-3],[14,20],[3,-14],[-10,-23],[-6,-4],[-3,-16],[6,-18],[11,-10],[-1,-16],[3,-7],[-3,-11],[-12,-28],[-14,-14],[-2,-16],[4,-12],[9,-10],[6,4],[0,-13],[11,4],[2,-20],[9,-1]],[[5778,7600],[-2,-9],[6,-15],[20,-17],[6,-2],[-3,-13],[-14,-1],[-9,6],[-6,-7],[-12,1],[-9,-20],[-14,-10],[-15,-24],[2,17],[13,10],[3,7],[-20,-3],[-1,9]],[[5997,7251],[2,5],[-6,17],[12,18],[0,11],[-6,7],[-10,-18],[-8,-3],[-18,15],[-11,-13],[-17,-26],[-7,1],[-17,-8],[-13,9],[-7,18],[-21,18],[-18,5],[-3,-3],[0,-18],[-5,-18],[-4,6],[-13,-10],[-12,5],[-7,9],[0,16],[-7,-1],[-7,9],[-10,3],[-3,-6],[-11,1],[-2,-6],[-9,3],[8,5],[12,0],[-1,7],[8,7],[-15,-3],[-12,2],[-1,8],[7,-2],[-10,13],[0,14],[-5,5],[7,4],[-1,13],[-17,7],[-11,9],[7,6],[-4,14],[4,3],[5,-20],[14,8],[-7,0],[-5,16],[6,2],[3,10],[-6,-2],[0,14],[-6,9],[9,16],[-24,-6],[2,29],[16,25],[16,3],[2,-7],[11,-1],[-1,11],[8,-2],[-2,-7],[11,3],[19,-3],[1,7],[-8,3],[5,6],[27,5],[-15,3],[-11,13],[6,13],[19,-6],[11,5],[15,-8],[9,1],[7,11],[29,28],[14,6],[10,9],[28,-6],[10,0],[10,9],[1,-10],[6,-11],[9,-5],[10,6],[4,-16],[8,-13],[5,8],[12,-5],[0,-6],[13,-8],[8,0],[15,-7],[32,11],[4,-6],[14,-5],[12,7],[24,20],[3,7]],[[8378,6635],[10,-12],[-5,-8],[1,-22],[-6,-18],[-4,-43],[-3,-19],[-6,-20],[-4,-5],[-4,-17],[-1,-27],[-5,7],[-1,16],[-11,20],[-2,22],[-3,0],[2,15],[0,20],[17,58],[3,3],[4,18],[12,7],[2,9],[4,-4]],[[6108,4736],[-7,-14],[1,11],[6,3]],[[6093,4842],[6,-26],[-4,-4],[-7,16],[0,15],[5,-1]],[[6102,4899],[5,-11],[-3,-19],[-2,30]],[[5914,5071],[5,-1],[2,-12],[-9,7],[2,6]],[[5882,5125],[1,0]],[[5883,5125],[1,0]],[[5884,5125],[-1,-28],[-2,0],[-1,-30],[-2,-20],[4,2],[0,-28],[2,8],[4,-3],[0,13],[5,-3],[-3,10],[7,6],[2,-10],[12,-2],[8,5],[3,-7],[17,17],[-2,8],[-4,-6],[-10,4],[5,8],[-3,9],[5,-1],[5,9],[-1,12],[6,0],[-2,7],[8,17]],[[6088,4913],[1,-10],[-4,-16],[-3,-25],[-5,-21],[2,-26],[5,-5],[12,-22],[2,-15],[-4,-5],[-4,-23],[1,-10],[4,-2],[0,-13],[-4,-14],[2,-25],[4,-7],[0,-16],[4,-4],[0,-15],[4,-21],[-2,-8],[15,-16],[5,-14]],[[5971,4516],[-2,9]],[[5969,4527],[-5,7]],[[5964,4536],[-4,14],[2,20],[-2,4],[-1,30],[-7,20]],[[5949,4630],[-3,4]],[[5946,4635],[-4,-2],[-1,-10]],[[5914,4641],[-12,10],[-3,6],[-13,6],[-6,6],[-4,13],[-11,6]],[[5865,4688],[0,10],[-4,5],[-1,11],[-11,36],[1,11],[-3,8],[2,12],[-5,9],[-7,21],[-6,-1],[-6,12],[0,13],[6,7],[-5,32],[1,21],[-6,5],[2,27]],[[5846,5121],[10,4],[26,0]],[[5883,5125],[1,0]],[[5944,5197],[-8,-3],[1,8],[-8,-8],[-3,15],[-5,-3],[-2,-12],[-6,-7],[0,7],[-6,-6],[0,10],[-8,-17],[-9,0],[-4,-9],[3,-7],[-9,-26],[2,-14]],[[5823,5155],[5,6],[2,14],[-6,2]],[[5846,5254],[4,-12],[9,28],[10,11],[3,11],[-1,25],[-3,-9]],[[6061,7895],[-18,0],[-6,-11],[-4,2],[-12,-13],[-4,3],[-22,-8],[-14,-18],[-4,3],[-11,-12],[4,-22],[15,-28],[18,10],[13,-3],[-5,-9],[1,-11],[-17,-4],[-9,7],[-4,-10],[-23,-12],[-12,-18],[-10,-2],[-11,11],[5,5],[1,24],[-8,3],[-11,13],[-9,-2],[-1,8],[24,21],[8,2],[-1,14],[-6,-3],[-5,10],[-3,-6],[-18,-3],[-17,14],[4,8],[-7,6],[17,-5],[4,9],[-11,-4],[-6,5],[-25,-2],[-24,-46],[-5,1],[-10,-23],[4,2],[-3,-14]],[[5836,7853],[9,-17],[2,3],[-11,14]],[[5948,7848],[0,-9],[-11,7],[3,-13],[4,5],[21,-17],[6,-8],[4,-20],[9,-4],[-12,23],[-7,26],[-10,-6],[-7,16]],[[3523,3302],[-5,-5],[0,-12],[-8,-5],[3,-30]],[[3517,3240],[-4,-18],[-7,-13],[0,-7],[-13,-16],[-20,-17],[-12,10],[-14,0],[-7,-8],[-20,15],[-8,13],[-18,-1],[-16,29],[-2,10],[3,27],[-1,10],[9,9],[-4,31]],[[677,6342],[13,-11],[2,-12],[8,-13],[-6,-10],[-16,-13],[-3,-11],[-7,9],[1,15],[-4,25],[5,12],[-1,17],[8,-8]],[[649,6394],[3,-7],[7,2],[8,-8],[0,-7],[-9,-6],[-4,2],[0,10],[-7,7],[2,7]],[[631,6405],[16,-4],[-2,-5],[-15,2],[1,7]],[[613,6427],[6,-8],[1,-12],[-13,2],[-3,14],[7,10],[2,-6]],[[571,6463],[4,-3],[-1,-14],[-8,-3],[-6,11],[11,9]],[[2301,6687],[-6,35],[0,12],[6,-47]],[[2761,6828],[-2,-18],[-2,17],[4,1]],[[2366,6873],[3,-1],[-11,-13],[8,14]],[[1707,7111],[7,-9],[-6,0],[-1,9]],[[1671,7144],[8,-4],[-8,-2],[0,6]],[[2993,7551],[-6,-11],[8,7],[8,-1],[-20,-15],[-36,-12],[-4,1],[4,11],[7,6],[29,6],[10,8]],[[2582,7791],[0,-10],[-7,-17],[-3,8],[10,19]],[[2679,7836],[1,-8],[-10,3],[9,5]],[[2563,7913],[-19,-17],[-6,0],[5,14],[8,6],[12,-3]],[[2541,7956],[-2,-6],[-15,-14],[0,8],[17,12]],[[1595,7969],[-3,-9],[8,-13],[-1,-5],[-9,17],[5,10]],[[1582,8004],[-1,0]],[[2511,7947],[-14,-11],[-19,-11],[-20,-29],[-17,-21],[9,-3],[22,14],[6,0],[-5,-19],[14,-2],[11,5],[7,9],[14,4],[10,7],[7,13],[7,-14],[-1,-10],[10,6],[9,-1],[12,-22],[11,0],[9,-4],[14,14],[18,-2],[13,6],[0,-17],[15,-1]],[[2663,7852],[-3,-10],[9,-12],[-16,1],[-5,4],[-2,-11],[-7,9],[-15,5],[-3,-7],[-25,-7],[-13,0],[-15,-39],[-3,-12],[-10,-17],[2,-8],[10,17],[7,-3],[-11,-49],[1,-13],[-6,-26],[0,-14],[4,-15],[-2,-28],[9,-33],[8,-4],[16,14],[7,22],[5,26],[0,15],[-9,37],[3,10],[-3,17],[8,20],[0,14],[5,15],[7,2],[7,15],[-3,-22],[4,-4],[4,14],[0,16],[11,5],[-3,15],[9,10],[13,-8],[6,-11],[16,-7],[6,-13],[-4,-11],[4,-6],[-1,-28],[-6,-5],[-1,-13],[-7,-2],[-3,-18],[6,-5],[7,6],[6,16],[9,5],[7,-10],[4,-37],[3,-14]],[[2704,7634],[-5,5],[-3,-17],[-6,-8],[-3,-17],[-6,-12],[15,-11],[7,0],[5,-7],[9,4],[14,3],[9,12],[24,15],[26,21],[14,21],[5,2],[-1,17],[-5,3]],[[2804,7674],[10,6],[16,2],[13,-8],[18,0],[8,5],[15,19],[-3,9],[4,4],[-7,11],[15,16],[1,7]],[[3116,7818],[10,-9]],[[3134,7784],[3,-9],[-3,-20],[-20,-16],[-6,5],[-13,-5],[1,-9],[-12,11],[-3,-22],[-14,-14],[-10,3],[-8,-8],[1,-9],[-11,-15],[-6,-22],[1,-15],[5,1],[-13,-19],[9,-7],[5,-23],[17,-8],[-14,-3],[-6,-6],[0,11],[-15,-14],[0,12],[-5,5],[-1,-17],[-12,-9],[-29,-2],[-6,-9],[-8,-1],[-23,-27],[-1,-10],[8,-1],[-2,-29],[-3,-14],[-7,-9],[-1,-11],[-12,-24],[-1,15],[-7,2],[-10,13],[3,-23],[9,-21],[1,-16],[-10,-31],[-7,-13],[-8,-30],[-2,11],[4,20],[6,17],[-6,-2],[1,9],[-13,21],[-1,17],[4,11],[-2,15],[11,15],[-5,0],[-11,-10],[2,-16],[-4,-6],[0,-23],[4,-6],[1,-20],[-9,11],[-8,-2],[9,-4],[11,-13],[-2,-17],[-6,3],[8,-12],[-7,-12],[6,-8],[-4,-8],[12,-4],[5,-35],[7,-23],[-5,9],[-6,38],[-2,-15],[6,-17],[-9,5],[0,-7],[-15,-4],[-2,-6],[15,3],[13,-8],[-1,-17],[-3,2],[-5,-13],[-13,1],[-2,9],[-4,-8],[7,-6],[-2,-11],[-11,-8],[17,-2],[-7,-11],[-15,-4],[-15,-18],[-9,-27],[-11,1],[-13,-12],[-5,-10],[-4,-21],[-22,-32],[-14,-8],[1,-8],[-12,-15],[1,-5],[-11,-14],[-3,-12],[2,-18],[-4,-5],[-3,-19],[8,-63],[9,-38],[9,-26],[-5,0],[0,-10],[18,-75],[3,-31],[-2,-12],[-1,-28],[-4,-11],[-4,-29],[-12,-1],[-7,-4],[0,14],[-6,25],[-6,7],[-6,0],[-3,31],[-6,5],[0,20],[-7,-2],[-6,21],[-3,18],[7,15],[-1,8],[-7,6],[0,-19],[-5,8],[2,21],[4,14],[0,26],[-4,16],[-7,0],[-10,20],[-6,20],[-11,14],[-10,-4],[-10,-15],[-16,-5],[0,7],[-11,20],[-22,14],[-15,-1],[-2,9],[-4,-11],[-14,-5],[-4,7],[-1,16],[-3,2],[-2,-22],[-5,5],[-5,-5],[-10,6],[-14,-7],[-7,-9],[-11,7],[-4,7],[-8,-12],[2,-7],[10,-1],[3,4],[6,-14],[5,12],[3,-3],[-8,-29],[4,-8],[11,-5],[3,-9],[-4,-9],[-3,10],[-15,9],[2,4],[-12,11],[4,-9],[-2,-16],[-10,12],[-8,-14],[-15,9],[0,13],[-7,3],[-3,12],[-6,5],[-9,-8],[4,-6],[-13,-2],[-21,13],[-16,-5],[2,17],[-8,-18],[-17,-13],[-1,19],[-8,-5],[-1,-9],[4,-12],[-8,-12],[1,-4],[-14,-18],[-16,-9],[-12,8],[1,-9],[6,-8],[-7,-6],[-5,6],[1,-12],[-12,-8],[1,-14],[-7,-33],[-3,-26],[7,-32],[1,-16],[3,-1]],[[2245,6713],[1,7],[-9,21]],[[2193,6879],[-7,10]],[[1746,7056],[-4,10],[-2,27],[-8,16],[-15,18],[-6,2],[-3,12],[-9,0],[-10,6],[-10,18],[-21,3],[-9,5],[0,33],[-7,5],[0,12],[-12,15],[-5,18],[-9,13],[-4,23],[5,9],[-3,11],[-6,-1],[-8,13],[-3,21],[3,5],[9,-11],[-10,29],[8,6],[-7,6],[-2,-19],[-16,13],[5,3],[-7,20],[-7,6],[-10,20],[1,10],[-4,16],[2,10],[-2,15],[-7,17],[-8,9],[0,19],[8,15],[-2,17],[3,16],[-2,16],[-5,5],[3,12],[-5,8],[-1,32],[-5,10],[9,41],[4,25],[2,52],[2,11],[1,62],[13,7],[-14,-2],[1,29],[-4,-2],[6,13],[-7,6],[-10,44],[-7,20],[6,11],[15,-11],[24,0],[7,-6],[4,-14],[-9,-15],[12,8],[2,-20],[-7,-10],[2,-4],[10,14],[-1,29],[5,8],[-5,18],[-9,6],[8,12],[-10,16],[1,6]],[[60,8169],[1,-9],[-11,9],[10,0]],[[80,8161],[-11,0],[12,11],[-1,-11]],[[96,8175],[2,-14],[-10,0],[1,14],[7,0]],[[177,8186],[18,-5],[-12,-3],[-15,5],[9,3]],[[162,8200],[5,-4],[-4,-12],[-7,-4],[-27,-2],[22,6],[9,7],[-7,4],[9,5]],[[9827,8206],[-2,-8],[-9,2],[11,6]],[[9802,8235],[12,-10],[-11,-5],[-1,15]],[[332,8268],[5,-12],[-32,-29],[11,24],[7,1],[-1,9],[10,7]],[[367,8291],[6,-8],[9,8],[-9,-15],[8,1],[-14,-16],[-4,1],[-20,-13],[-6,4],[19,9],[1,25],[10,4]],[[391,8303],[7,-5],[-10,-3],[3,8]],[[451,8354],[5,-1],[6,-16],[-8,-9],[-16,0],[-4,-9],[-14,-3],[-3,11],[7,3],[10,16],[3,-2],[14,10]],[[1304,8361],[8,-30],[-14,25],[6,5]],[[558,8363],[-9,-20],[4,19],[5,1]],[[1355,8404],[7,-16],[-1,-16],[-6,-11],[-13,9],[-5,8],[5,20],[13,6]],[[1295,8417],[2,-9],[-14,-4],[5,11],[7,2]],[[1319,8419],[9,-1],[0,-12],[-13,5],[4,8]],[[1289,8428],[10,-1],[4,-16],[13,-7],[9,-30],[9,-9],[-1,-33],[-16,17],[2,8],[-21,10],[8,20],[-11,-1],[6,13],[-3,17],[-9,2],[0,10]],[[1315,8433],[-5,-12],[-6,8],[11,4]],[[1328,8428],[4,-13],[-9,9],[0,12],[5,-8]],[[1308,8454],[9,-14],[-10,-3],[1,17]],[[1278,8457],[7,-4],[1,-11],[-6,-6],[-6,-28],[-3,4],[0,20],[-4,26],[11,-1]],[[1283,8470],[24,-10],[-2,-17],[-9,13],[7,-18],[-16,-4],[0,23],[-10,9],[6,4]],[[745,8475],[8,0],[-14,-10],[6,10]],[[1234,8479],[-1,-12],[-6,-2],[-1,19],[8,-5]],[[1237,8491],[8,2],[9,-14],[7,-29],[-1,-30],[-5,0],[-13,33],[-1,15],[-10,18],[6,5]],[[749,8519],[11,0],[7,-8],[-2,-10],[8,0],[-4,-10],[-18,4],[10,-7],[-18,-9],[-14,-22],[-10,-6],[6,10],[-12,-1],[-12,22],[3,14],[7,7],[10,0],[7,-19],[-4,28],[5,5],[16,-5],[-3,10],[7,-3]],[[1229,8536],[23,-12],[-1,-13],[-7,-1],[-18,12],[14,-15],[13,1],[1,-16],[-7,0],[-19,17],[7,-17],[-4,-6],[-8,6],[-1,10],[-12,12],[1,20],[18,2]],[[1252,8544],[6,-11],[14,-6],[8,-16],[-2,-5],[2,-21],[-19,-19],[-1,12],[4,10],[-5,13],[-7,43]],[[761,8550],[18,-11],[-6,-8],[-18,-4],[-10,2],[1,9],[10,1],[5,11]],[[913,8659],[5,-3],[-25,-29],[20,32]],[[385,8661],[13,-6],[2,-22],[-19,-5],[-10,2],[-19,13],[-4,7],[16,0],[9,9],[12,2]],[[929,8665],[13,-4],[-15,-9],[2,13]],[[897,8667],[-2,-19],[-4,10],[6,9]],[[231,8857],[0,-6],[17,-7],[20,7],[23,-20],[21,-2],[-2,-9],[-15,1],[-9,-13],[-3,10],[-28,19],[-17,-8],[-13,10],[6,18]],[[1387,8402],[-3,-8],[4,-28],[-10,-21],[-9,-8],[-7,2],[-3,23],[6,6],[-1,24],[-15,16],[-8,-7],[-7,-22],[-9,13],[7,4],[5,24],[-18,22],[-11,25],[-19,8],[12,9],[-11,10],[-3,12],[14,-6],[-15,12],[-15,23],[-16,11],[-4,24],[-6,1],[-1,17],[-6,-11],[7,-17],[1,-24],[-13,11],[-8,-2],[2,13],[-8,12],[-3,-4],[-17,8],[19,-18],[2,-12],[-9,-4],[-20,5],[-23,23],[-9,16],[-34,19],[-11,9],[12,10],[-5,11],[-18,-12],[-9,0],[-21,9],[3,11],[-13,-5],[-31,8],[-30,-6],[-12,12],[-16,5],[3,18],[-11,-14],[-21,5],[9,13],[-18,-1],[-16,19],[-12,1],[-2,-7],[-15,-3],[-3,6],[9,19],[-17,-18],[2,-20],[8,-8],[-6,-3],[-8,-27],[-18,1],[-5,-5],[-2,13],[-12,-25],[-13,3],[-7,-13],[-19,-17],[-16,-2],[-6,6],[3,9],[19,10],[2,8],[-11,-6],[-10,7],[4,16],[8,10],[5,19],[-5,8],[27,21],[6,-6],[18,3],[-14,10],[4,5],[-19,4],[-15,-15],[-9,-2],[-20,-27],[-7,-16],[-11,-2],[9,-10],[-18,-24],[-11,0],[-4,-11],[-9,-5],[-3,-20],[10,3],[13,-8],[2,-6],[-11,-12],[-5,0],[-14,-31],[-4,7],[-2,-11],[-12,1],[-9,-17],[-9,2],[-2,-13],[-10,-1],[-14,-15],[7,-5],[-7,-12],[-5,4],[-12,-16],[-17,-5],[-2,-11],[-13,-1],[-4,-8],[7,-10],[-10,-4],[-1,-7],[-22,-6],[-5,-17],[-6,16],[-20,-21],[-10,2],[-12,-10],[-5,2],[6,12],[-10,1],[-6,-22],[-9,-11],[-12,8],[-4,-14],[-7,2],[-9,-9],[0,18],[10,3],[22,30],[12,12],[9,3],[34,-7],[-10,9],[5,17],[16,15],[24,17],[9,-4],[-1,15],[10,16],[18,15],[2,46],[12,18],[5,16],[-8,-7],[-25,-13],[-11,12],[1,10],[-9,-10],[4,-20],[-11,-2],[-14,29],[-8,-10],[-12,17],[-19,-11],[-20,-18],[-11,4],[11,7],[-1,13],[6,7],[-12,2],[0,15],[7,6],[-20,46],[-1,-17],[-16,-8],[-23,-4],[-9,6],[-13,23],[-19,12],[20,19],[18,-3],[7,-12],[9,7],[-4,7],[-29,2],[-20,20],[-7,-6],[-9,14],[0,21],[-6,7],[15,2],[-4,13],[18,26],[8,-3],[-3,14],[5,17],[11,0],[-8,7],[7,5],[17,0],[2,-11],[17,1],[20,24],[25,-1],[18,17],[-6,30],[-13,9],[10,4],[9,13],[-10,12],[-41,-24],[-17,-5],[-12,9],[-18,0],[-19,-8],[-33,8],[-8,6],[3,12],[-11,10],[7,9],[13,2],[-38,8],[-18,10],[37,28],[24,9],[16,13],[16,7],[29,2],[-7,-11],[7,-19],[26,2],[24,-8],[11,18],[13,-3],[-13,10],[-11,-2],[-2,11],[-15,10],[-5,9],[9,3],[7,-17],[12,-11],[10,4],[14,-9],[16,2],[-3,14],[-23,0],[-9,-7],[-10,10],[2,20],[-23,-2],[-30,5],[-10,27],[-34,25],[-20,9],[-16,11],[9,17],[0,14],[16,-2],[37,4],[19,11],[15,16],[2,19],[29,33],[26,0],[45,27],[39,4],[21,14],[12,13],[33,-7],[-12,-12],[11,-6],[16,16],[13,-7],[2,-12],[19,5],[38,-1],[9,-4],[-12,-15],[24,0],[-6,-6],[32,3],[11,-5],[30,5],[31,-8],[27,-11],[40,0],[30,-12],[40,9],[52,-27],[12,0]],[[2912,6333],[-2,-4]],[[2914,6329],[-1,4]],[[6651,7782],[-7,-26],[12,-19],[-3,-12],[11,5],[3,8],[-2,16],[3,11]],[[6601,7610],[-7,11],[-5,-2],[-4,-22]],[[6627,7805],[-10,-35],[2,-18],[4,-10],[9,17],[-3,20],[3,6],[-1,16]],[[3301,5940],[-4,4],[5,8],[-1,-12]],[[3313,5694],[1,-6],[-5,-8],[-9,-2],[1,7],[12,9]],[[3303,5691],[4,12],[2,-5],[-6,-7]],[[3228,5816],[-8,-8],[-9,6],[4,7],[6,-5],[4,10],[3,-10]],[[3018,5865],[-3,-7],[-14,-7],[0,-13],[10,-38],[-1,-16],[-4,-6],[-10,-30],[5,-18],[6,-7],[-1,-15],[6,-5],[9,7],[5,10],[-1,32],[-11,30],[-2,23],[3,10],[4,0],[12,13],[18,8],[5,9],[8,-2],[-2,13],[-11,-5],[-2,13],[2,16],[5,5],[6,-10],[2,-22],[4,-10],[12,3],[15,-10],[7,-12],[4,-15],[-2,-7],[5,-15],[8,-1],[17,4],[6,4],[21,2],[11,-20],[11,-9],[11,-5],[8,2],[4,9],[5,0],[2,8],[20,5],[-5,5],[-9,1],[10,6],[7,-3],[11,6],[12,1],[16,-4],[8,4],[-2,-6],[-10,-6],[-16,0],[1,-9],[5,-5],[1,-12],[-9,-1],[5,-4],[8,8],[5,-25],[2,17],[11,-10],[7,-3],[-2,7],[13,-19],[4,1],[7,-12],[-9,-24],[-3,-22],[-12,0],[10,-11],[3,6],[14,6],[6,-4],[3,6],[9,-4]],[[7888,5785],[0,-17],[-4,12],[4,5]],[[7999,6420],[-7,1],[-4,-12],[-7,-3],[1,-12],[-6,-6],[-5,4],[-9,-2],[4,-16],[-8,-8],[2,-17],[-7,-4],[-4,-11],[-7,-4],[-3,-15],[-1,-23],[-5,-13],[7,-30],[7,-15],[11,-17],[-1,-15],[8,-21],[9,-14],[4,-12],[16,-29],[6,-2],[16,-47],[8,-11],[1,-21],[5,-18],[-2,-5],[6,-25],[0,-35],[2,-3],[0,-23],[3,-13],[-6,-10],[0,-42],[-3,-5],[4,-7],[-4,-10],[-2,4],[0,-16],[-7,-2],[-2,-8],[-4,0],[-8,-14],[-6,-1],[-2,-13],[-5,0],[-11,-13],[-13,0],[-5,12],[1,-23],[-11,2],[11,-9],[-4,-11],[-6,4],[7,-11],[-3,-2],[-12,24],[0,-5],[10,-18],[2,-11],[-5,-6],[-10,15],[4,-19],[-1,-6],[-17,-13],[-12,-29],[-11,-2],[5,9],[-2,10],[0,36],[2,17],[6,7],[-10,15],[-5,-5],[-3,16]],[[9706,4050],[-7,13],[4,7],[3,-20]],[[9699,4104],[2,-14],[-8,6],[0,12],[6,-4]],[[9675,4172],[7,-8],[-6,-8],[-6,7],[5,9]],[[9671,4228],[8,-15],[-7,1],[-1,14]],[[9675,4243],[-6,-2],[-6,7],[7,9],[5,-14]],[[9650,4255],[10,-14],[1,-7],[-10,-6],[-4,27],[-5,1],[1,12],[4,-1],[3,-12]],[[9672,4262],[-3,21],[1,9],[3,-20],[-1,-10]],[[9662,4292],[-5,2],[9,9],[-4,-11]],[[9671,4298],[-2,1],[-1,24],[2,-2],[1,-23]],[[9633,4310],[4,2],[0,11],[5,-11],[3,-23],[-11,-7],[-7,15],[1,11],[-3,15],[1,17],[5,-11],[2,-19]],[[9653,4368],[1,-9],[-5,0],[4,9]],[[9654,4385],[-4,-3],[-1,10],[5,-7]],[[5917,7177],[-8,1]],[[233,4380],[5,-6],[-14,2],[-4,7],[7,5],[6,-8]],[[213,4406],[3,-6],[-1,-12],[-9,0],[-5,15],[12,3]],[[6488,5914],[7,-6],[7,6],[10,-9],[-9,-11],[-10,-3],[-6,2],[-5,12],[6,9]],[[6474,6141],[-14,-9],[-10,-18],[-2,-12],[2,-20],[-10,-7],[-13,-15],[-23,-11],[-11,-11],[-4,0],[-25,-18],[-3,-12],[-8,-16],[-6,-3],[-14,3],[-10,-9],[-6,-13],[-15,-8],[-5,-6],[-14,0],[-16,-6],[-7,-15],[-15,-17],[-7,3],[-4,-8],[-14,-5],[-10,9],[-3,-4],[-7,35],[2,25],[-6,21],[-2,16],[-3,43],[-6,7],[4,2],[-3,17],[3,18],[-1,29]],[[5913,3637],[-1,-16],[-5,-23],[-3,-38],[-5,-21],[-10,-19],[-7,-3],[-13,-27],[-21,-68],[-4,-16],[-15,-32],[-4,-4],[-16,-28],[-9,-21],[-13,-22],[-25,-35],[-27,-26],[-15,4],[-9,-9],[0,-11],[-17,5],[-4,-12],[-11,1],[-8,6],[-16,4],[-6,-7],[-23,6],[-10,-4],[-12,-19],[-7,3],[-6,-5],[-11,4],[-1,-6],[-11,0],[-14,-20],[-9,3],[-9,9],[0,11],[-6,4],[-8,-2],[0,17],[-10,-2],[0,-13],[-4,19],[5,10],[-2,12],[-7,16],[-4,20],[-4,-1],[1,18],[7,-2],[4,8],[1,20],[-2,22],[-4,17],[-9,20],[-7,28],[-8,24],[-6,42],[-6,29],[-7,15],[-3,15]],[[5815,3905],[12,3],[14,-12],[15,3],[13,-7]],[[5844,4282],[-15,1],[-13,-5],[-15,-18],[0,-21],[-3,-8]],[[5798,4231],[-3,3],[-13,-9],[-5,-13],[-12,-14],[-13,-38],[-2,-11]],[[5750,4149],[-9,-7],[-14,11],[-7,-7],[-7,11],[-12,1]],[[5792,4643],[5,5],[9,23],[3,15],[-7,8]],[[5849,4709],[-4,-14],[7,-1],[9,-18],[5,4],[-1,8]],[[5750,4149],[10,22],[5,5],[4,17],[11,9],[0,11],[8,0],[8,9],[1,-7],[8,12],[-7,4]]],\"type\":\"Topology\",\"objects\":{\"units\":{\"geometries\":[{\"arcs\":[[0,1,2,3,4,5]],\"type\":\"Polygon\",\"id\":\"AFG\",\"properties\":{\"name\":\"Afghanistan\"}},{\"arcs\":[[[6,7,8,9]],[[10,11,12]]],\"type\":\"MultiPolygon\",\"id\":\"AGO\",\"properties\":{\"name\":\"Angola\"}},{\"arcs\":[[[13,14]],[[15,16]],[[17,18,19,20,21,22,23,24,25,26,27,28,29,30]]],\"type\":\"MultiPolygon\",\"id\":\"ALB\",\"properties\":{\"name\":\"Albania\"}},{\"arcs\":[[[31]]],\"type\":\"MultiPolygon\",\"id\":\"ALD\",\"properties\":{\"name\":\"Aland\"}},{\"arcs\":[[32,33]],\"type\":\"Polygon\",\"id\":\"AND\",\"properties\":{\"name\":\"Andorra\"}},{\"arcs\":[[[34]],[[35,36,37,38,39],[40]]],\"type\":\"MultiPolygon\",\"id\":\"ARE\",\"properties\":{\"name\":\"United Arab Emirates\"}},{\"arcs\":[[[41,42]],[[43,44]],[[45,46,47,48,49,50]]],\"type\":\"MultiPolygon\",\"id\":\"ARG\",\"properties\":{\"name\":\"Argentina\"}},{\"arcs\":[[[51]],[[52,53,54,55,56],[57],[58]]],\"type\":\"MultiPolygon\",\"id\":\"ARM\",\"properties\":{\"name\":\"Armenia\"}},{\"arcs\":[[[59]],[[60]],[[61]],[[62]],[[63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76]],[[77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90]],[[91]],[[92]],[[93]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106]],[[107]],[[108]],[[109]],[[110]],[[111]],[[112]],[[113]],[[114]],[[115]],[[116]],[[117]],[[118]],[[119]],[[120]]],\"type\":\"MultiPolygon\",\"id\":\"ATA\",\"properties\":{\"name\":\"Antarctica\"}},{\"arcs\":[[[121]]],\"type\":\"MultiPolygon\",\"id\":\"ATF\",\"properties\":{\"name\":\"Fr. S. Antarctic Lands\"}},{\"arcs\":[[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]],[[130]],[[131]],[[132]],[[133]],[[134]],[[135]],[[136]],[[137]],[[138]],[[139]],[[140]]],\"type\":\"MultiPolygon\",\"id\":\"AUS\",\"properties\":{\"name\":\"Australia\"}},{\"arcs\":[[141,142,143,144,145,146,147,148,149,150]],\"type\":\"Polygon\",\"id\":\"AUT\",\"properties\":{\"name\":\"Austria\"}},{\"arcs\":[[[151,152,-55]],[[-59]],[[-58]],[[153,154,155,-53,156],[-52]]],\"type\":\"MultiPolygon\",\"id\":\"AZE\",\"properties\":{\"name\":\"Azerbaijan\"}},{\"arcs\":[[157,158,159,160]],\"type\":\"Polygon\",\"id\":\"BDI\",\"properties\":{\"name\":\"Burundi\"}},{\"arcs\":[[161,162,163,164,165,166,167]],\"type\":\"Polygon\",\"id\":\"BEL\",\"properties\":{\"name\":\"Belgium\"}},{\"arcs\":[[168,169,170,171,172]],\"type\":\"Polygon\",\"id\":\"BEN\",\"properties\":{\"name\":\"Benin\"}},{\"arcs\":[[173,-172,174,175,176,177]],\"type\":\"Polygon\",\"id\":\"BFA\",\"properties\":{\"name\":\"Burkina Faso\"}},{\"arcs\":[[[178]],[[179]],[[180,181,182]]],\"type\":\"MultiPolygon\",\"id\":\"BGD\",\"properties\":{\"name\":\"Bangladesh\"}},{\"arcs\":[[183,184,185,186,187,188]],\"type\":\"Polygon\",\"id\":\"BGR\",\"properties\":{\"name\":\"Bulgaria\"}},{\"arcs\":[[189]],\"type\":\"Polygon\",\"id\":\"BHR\",\"properties\":{\"name\":\"Bahrain\"}},{\"arcs\":[[[190]],[[191]],[[192]],[[193]],[[194]],[[195]],[[196]],[[197]],[[198]],[[199]],[[200]]],\"type\":\"MultiPolygon\",\"id\":\"BHS\",\"properties\":{\"name\":\"Bahamas\"}},{\"arcs\":[[201,202,203,204,205]],\"type\":\"Polygon\",\"id\":\"BIH\",\"properties\":{\"name\":\"Bosnia and Herz.\"}},{\"arcs\":[[206,207,208,209,210]],\"type\":\"Polygon\",\"id\":\"BLR\",\"properties\":{\"name\":\"Belarus\"}},{\"arcs\":[[[211,212,213]]],\"type\":\"MultiPolygon\",\"id\":\"BLZ\",\"properties\":{\"name\":\"Belize\"}},{\"arcs\":[[[214,215]],[[216,-51,217,218,219,220,221]]],\"type\":\"MultiPolygon\",\"id\":\"BOL\",\"properties\":{\"name\":\"Bolivia\"}},{\"arcs\":[[[222]],[[223]],[[224]],[[225]],[[226]],[[227]],[[228]],[[229]],[[230]],[[231]],[[232]],[[233]],[[234]],[[235]],[[236]],[[237]],[[238,239,240,241,242,243,-47,244,245,246,-222,247,248,249,250]]],\"type\":\"MultiPolygon\",\"id\":\"BRA\",\"properties\":{\"name\":\"Brazil\"}},{\"arcs\":[[251]],\"type\":\"Polygon\",\"id\":\"BRB\",\"properties\":{\"name\":\"Barbados\"}},{\"arcs\":[[[252,253]],[[254,255]]],\"type\":\"MultiPolygon\",\"id\":\"BRN\",\"properties\":{\"name\":\"Brunei\"}},{\"arcs\":[[256,257]],\"type\":\"Polygon\",\"id\":\"BTN\",\"properties\":{\"name\":\"Bhutan\"}},{\"arcs\":[[258,259,260]],\"type\":\"Polygon\",\"id\":\"BWA\",\"properties\":{\"name\":\"Botswana\"}},{\"arcs\":[[261,262,263,264,265,266]],\"type\":\"Polygon\",\"id\":\"CAF\",\"properties\":{\"name\":\"Central African Rep.\"}},{\"arcs\":[[[267]],[[268]],[[269]],[[270]],[[271]],[[272]],[[273]],[[274,275,276,277]],[[278]],[[279]],[[280]],[[281]],[[282]],[[283]],[[284]],[[285]],[[286]],[[287]],[[288]],[[289]],[[290]],[[291]],[[292]],[[293]],[[294]],[[295]],[[296]],[[297]],[[298]],[[299]],[[300]],[[301]],[[302]],[[303]],[[304]],[[305]],[[306]],[[307]],[[308]],[[309]],[[310]],[[311]],[[312]],[[313]],[[314]],[[315]],[[316]],[[317]],[[318]],[[319]],[[320]],[[321]],[[322]],[[323]],[[324]],[[325]],[[326]],[[327]],[[328]],[[329]],[[330]],[[331]],[[332]],[[333,334,335,336,337,338,339,340,341,342,343,344,345,-346,346,347]],[[348]],[[349]],[[350]],[[351]],[[352]],[[353]],[[354]],[[355]],[[356]],[[357]],[[358]],[[359]],[[360]],[[361]],[[362]],[[363]],[[364]],[[365]],[[366]],[[367]],[[368]],[[369]],[[370]],[[371]],[[372]],[[373]],[[374]],[[375]],[[376]],[[377]],[[378]],[[379]],[[380]],[[381]],[[382]],[[383]],[[384]]],\"type\":\"MultiPolygon\",\"id\":\"CAN\",\"properties\":{\"name\":\"Canada\"}},{\"arcs\":[[385,386,387,-148,388,-146,389,390,391,392,393]],\"type\":\"Polygon\",\"id\":\"CHE\",\"properties\":{\"name\":\"Switzerland\"}},{\"arcs\":[[[394]],[[395]],[[396]],[[397]],[[398]],[[399]],[[400]],[[401]],[[402]],[[-44,403,-42,404]],[[405]],[[406]],[[407]],[[408]],[[409]],[[410]],[[411]],[[412]],[[413]],[[414]],[[415]],[[416]],[[417]],[[418]],[[419]],[[420]],[[421]],[[422]],[[423]],[[424]],[[425]],[[426]],[[427]],[[428]],[[429]],[[430]],[[431]],[[432]],[[433]],[[434]],[[435]],[[-50,436,437,-218]]],\"type\":\"MultiPolygon\",\"id\":\"CHL\",\"properties\":{\"name\":\"Chile\"}},{\"arcs\":[[[438]],[[439]],[[440]],[[441]],[[442,443,444,445,446,447,448,449,450,451,-258,452,453,454,455,456,-1,457,458,459,460,461,462,463,464]]],\"type\":\"MultiPolygon\",\"id\":\"CHN\",\"properties\":{\"name\":\"China\"}},{\"arcs\":[[[465,466]],[[-177,467,468,469,470,471]]],\"type\":\"MultiPolygon\",\"id\":\"CIV\",\"properties\":{\"name\":\"C\\u00f4te d'Ivoire\"}},{\"arcs\":[[[472,-266,473,474,475,476,477,478,479]],[[480,481]]],\"type\":\"MultiPolygon\",\"id\":\"CMR\",\"properties\":{\"name\":\"Cameroon\"}},{\"arcs\":[[[482,483,484,485]],[[486,487,488,489]],[[490,491,492,493]]],\"type\":\"MultiPolygon\",\"id\":\"CNM\",\"properties\":{\"name\":\"Cyprus U.N. Buffer Zone\"}},{\"arcs\":[[[494]],[[495,496,497,498,499,500,501,502,503,-160,504,505,506,507,-10,508,-11,509,-264]]],\"type\":\"MultiPolygon\",\"id\":\"COD\",\"properties\":{\"name\":\"Dem. Rep. Congo\"}},{\"arcs\":[[-510,-13,510,511,-474,-265]],\"type\":\"Polygon\",\"id\":\"COG\",\"properties\":{\"name\":\"Congo\"}},{\"arcs\":[[[512,-249,513,514,515,516,517]]],\"type\":\"MultiPolygon\",\"id\":\"COL\",\"properties\":{\"name\":\"Colombia\"}},{\"arcs\":[[[518]],[[519]]],\"type\":\"MultiPolygon\",\"id\":\"COM\",\"properties\":{\"name\":\"Comoros\"}},{\"arcs\":[[[520]],[[521]],[[522]],[[523]]],\"type\":\"MultiPolygon\",\"id\":\"CPV\",\"properties\":{\"name\":\"Cape Verde\"}},{\"arcs\":[[[524,525,526,527]]],\"type\":\"MultiPolygon\",\"id\":\"CRI\",\"properties\":{\"name\":\"Costa Rica\"}},{\"arcs\":[[[528]],[[529]],[[530]],[[531,532,533,534]]],\"type\":\"MultiPolygon\",\"id\":\"CUB\",\"properties\":{\"name\":\"Cuba\"}},{\"arcs\":[[535]],\"type\":\"Polygon\",\"id\":\"CUW\",\"properties\":{\"name\":\"Cura\\u00e7ao\"}},{\"arcs\":[[[536,-488]],[[-486,537,-494,538]]],\"type\":\"MultiPolygon\",\"id\":\"CYN\",\"properties\":{\"name\":\"N. Cyprus\"}},{\"arcs\":[[[539,540]],[[541]],[[542,543,-484]],[[544,545,546,547,-490,548,-492]]],\"type\":\"MultiPolygon\",\"id\":\"CYP\",\"properties\":{\"name\":\"Cyprus\"}},{\"arcs\":[[549,550,-151,551]],\"type\":\"Polygon\",\"id\":\"CZE\",\"properties\":{\"name\":\"Czech Rep.\"}},{\"arcs\":[[[-387,552]],[[553,554]],[[555]],[[556,557,-552,-150,558,-394,559,560,-162,561,562,563]]],\"type\":\"MultiPolygon\",\"id\":\"DEU\",\"properties\":{\"name\":\"Germany\"}},{\"arcs\":[[564,565,566,567,568,569]],\"type\":\"Polygon\",\"id\":\"DJI\",\"properties\":{\"name\":\"Djibouti\"}},{\"arcs\":[[570]],\"type\":\"Polygon\",\"id\":\"DMA\",\"properties\":{\"name\":\"Dominica\"}},{\"arcs\":[[[571]],[[572]],[[573]],[[574]],[[575]],[[576]],[[577]],[[-564,578]]],\"type\":\"MultiPolygon\",\"id\":\"DNK\",\"properties\":{\"name\":\"Denmark\"}},{\"arcs\":[[[579,580,581,582,583,584]]],\"type\":\"MultiPolygon\",\"id\":\"DOM\",\"properties\":{\"name\":\"Dominican Rep.\"}},{\"arcs\":[[585,586,587,588,589,590,591,592]],\"type\":\"Polygon\",\"id\":\"DZA\",\"properties\":{\"name\":\"Algeria\"}},{\"arcs\":[[[593]],[[594]],[[595]],[[596]],[[597]],[[598]],[[599,600,-515]]],\"type\":\"MultiPolygon\",\"id\":\"ECU\",\"properties\":{\"name\":\"Ecuador\"}},{\"arcs\":[[[601,602,603,604,605,606]]],\"type\":\"MultiPolygon\",\"id\":\"EGY\",\"properties\":{\"name\":\"Egypt\"}},{\"arcs\":[[[607]],[[-569,608,609,610]]],\"type\":\"MultiPolygon\",\"id\":\"ERI\",\"properties\":{\"name\":\"Eritrea\"}},{\"arcs\":[[-485,-544,611,-541,612,-545,-491,-538],[-542]],\"type\":\"Polygon\",\"id\":\"ESB\",\"properties\":{\"name\":\"Dhekelia\"}},{\"arcs\":[[[613]],[[614]],[[615]],[[616]],[[617]],[[618]],[[619,620]],[[621,622]],[[623]],[[624]],[[625]],[[626]],[[627,-33,628,629,630,631,632,633]]],\"type\":\"MultiPolygon\",\"id\":\"ESP\",\"properties\":{\"name\":\"Spain\"}},{\"arcs\":[[[634]],[[635]],[[636,637,638,639,640,641,642,643,644]]],\"type\":\"MultiPolygon\",\"id\":\"EST\",\"properties\":{\"name\":\"Estonia\"}},{\"arcs\":[[-568,645,-566,646,647,648,649,650,-609]],\"type\":\"Polygon\",\"id\":\"ETH\",\"properties\":{\"name\":\"Ethiopia\"}},{\"arcs\":[[[651]],[[652,653,654,655]]],\"type\":\"MultiPolygon\",\"id\":\"FIN\",\"properties\":{\"name\":\"Finland\"}},{\"arcs\":[[[656]],[[657]],[[658]]],\"type\":\"MultiPolygon\",\"id\":\"FJI\",\"properties\":{\"name\":\"Fiji\"}},{\"arcs\":[[[659]],[[660]]],\"type\":\"MultiPolygon\",\"id\":\"FLK\",\"properties\":{\"name\":\"Falkland Is.\"}},{\"arcs\":[[[661]],[[662]],[[-240,663,664]],[[665]],[[666]],[[667]],[[668]],[[669,-560,-393,670,-391,671,672,673,674,-629,-34,-628,675,-164],[-627]]],\"type\":\"MultiPolygon\",\"id\":\"FRA\",\"properties\":{\"name\":\"France\"}},{\"arcs\":[[[676]],[[677]]],\"type\":\"MultiPolygon\",\"id\":\"FRO\",\"properties\":{\"name\":\"Faeroe Is.\"}},{\"arcs\":[[[678]]],\"type\":\"MultiPolygon\",\"id\":\"FSM\",\"properties\":{\"name\":\"Micronesia\"}},{\"arcs\":[[[-512,679,680,-475]]],\"type\":\"MultiPolygon\",\"id\":\"GAB\",\"properties\":{\"name\":\"Gabon\"}},{\"arcs\":[[[681]],[[682]],[[683,684]],[[685]],[[686]],[[687]],[[688]],[[689]],[[690]],[[691]],[[692]],[[693]],[[694]],[[695]]],\"type\":\"MultiPolygon\",\"id\":\"GBR\",\"properties\":{\"name\":\"United Kingdom\"}},{\"arcs\":[[-157,-57,696,697,698]],\"type\":\"Polygon\",\"id\":\"GEO\",\"properties\":{\"name\":\"Georgia\"}},{\"arcs\":[[699,700,-466,701,-468,-176]],\"type\":\"Polygon\",\"id\":\"GHA\",\"properties\":{\"name\":\"Ghana\"}},{\"arcs\":[[-631,702]],\"type\":\"Polygon\",\"id\":\"GIB\",\"properties\":{\"name\":\"Gibraltar\"}},{\"arcs\":[[703,-471,704,705,706,707,708]],\"type\":\"Polygon\",\"id\":\"GIN\",\"properties\":{\"name\":\"Guinea\"}},{\"arcs\":[[709,710]],\"type\":\"Polygon\",\"id\":\"GMB\",\"properties\":{\"name\":\"Gambia\"}},{\"arcs\":[[[711]],[[712,713,-708]]],\"type\":\"MultiPolygon\",\"id\":\"GNB\",\"properties\":{\"name\":\"Guinea-Bissau\"}},{\"arcs\":[[[-681,714,-476]],[[715]]],\"type\":\"MultiPolygon\",\"id\":\"GNQ\",\"properties\":{\"name\":\"Eq. Guinea\"}},{\"arcs\":[[[716]],[[717]],[[718]],[[719]],[[720]],[[721]],[[722]],[[723]],[[724]],[[725]],[[726]],[[727]],[[728]],[[729]],[[730]],[[731]],[[732,-186,733,734,-27,735,-25,736]]],\"type\":\"MultiPolygon\",\"id\":\"GRC\",\"properties\":{\"name\":\"Greece\"}},{\"arcs\":[[[737]]],\"type\":\"MultiPolygon\",\"id\":\"GRD\",\"properties\":{\"name\":\"Grenada\"}},{\"arcs\":[[[738]],[[739]],[[740]],[[741]],[[742]],[[743]],[[744]],[[745]],[[746]],[[747]],[[748]],[[749]],[[750]],[[751]],[[752]],[[753]],[[754]],[[755]],[[756]],[[757]],[[758]],[[759]],[[760]],[[761]],[[762]],[[763]]],\"type\":\"MultiPolygon\",\"id\":\"GRL\",\"properties\":{\"name\":\"Greenland\"}},{\"arcs\":[[-213,764,765,766,767,768]],\"type\":\"Polygon\",\"id\":\"GTM\",\"properties\":{\"name\":\"Guatemala\"}},{\"arcs\":[[769]],\"type\":\"Polygon\",\"id\":\"GUM\",\"properties\":{\"name\":\"Guam\"}},{\"arcs\":[[[770,-251,771,772]]],\"type\":\"MultiPolygon\",\"id\":\"GUY\",\"properties\":{\"name\":\"Guyana\"}},{\"arcs\":[[[773,-447]]],\"type\":\"MultiPolygon\",\"id\":\"HKG\",\"properties\":{\"name\":\"Hong Kong\"}},{\"arcs\":[[774]],\"type\":\"Polygon\",\"id\":\"HMD\",\"properties\":{\"name\":\"Heard I. and McDonald Is.\"}},{\"arcs\":[[[775,776,777,-766,778]]],\"type\":\"MultiPolygon\",\"id\":\"HND\",\"properties\":{\"name\":\"Honduras\"}},{\"arcs\":[[[-204,779,780]],[[781]],[[782]],[[783]],[[784]],[[785,786,-206,787,788]]],\"type\":\"MultiPolygon\",\"id\":\"HRV\",\"properties\":{\"name\":\"Croatia\"}},{\"arcs\":[[[-582,789]],[[790]],[[-584,791,-580,792]]],\"type\":\"MultiPolygon\",\"id\":\"HTI\",\"properties\":{\"name\":\"Haiti\"}},{\"arcs\":[[793,794,795,-786,796,-143,797]],\"type\":\"Polygon\",\"id\":\"HUN\",\"properties\":{\"name\":\"Hungary\"}},{\"arcs\":[[[798]],[[799]],[[800]],[[801,802,803,804]],[[805]],[[806]],[[807]],[[808]],[[809]],[[810]],[[811]],[[812]],[[813]],[[814]],[[815]],[[816]],[[817]],[[818]],[[819]],[[820]],[[821]],[[822]],[[823]],[[824]],[[825]],[[826]],[[827]],[[828]],[[829]],[[830]],[[831]],[[832]],[[833]],[[834]],[[835]],[[836]],[[837]],[[838]],[[839]],[[840]],[[841]],[[842]],[[843]],[[844]],[[845]],[[846]],[[847]],[[848]],[[849]],[[850]],[[851]],[[852]],[[853]],[[854]],[[855]],[[856]],[[857,858]],[[859]],[[860]],[[861]],[[862]],[[863]],[[864]],[[865]],[[866]],[[867]],[[868]],[[869]],[[870]],[[871]],[[872]],[[873]],[[874]],[[875]],[[876]],[[877]],[[878]],[[879]],[[880]],[[881,882]],[[883]],[[884,885]],[[886]],[[887]]],\"type\":\"MultiPolygon\",\"id\":\"IDN\",\"properties\":{\"name\":\"Indonesia\"}},{\"arcs\":[[888]],\"type\":\"Polygon\",\"id\":\"IMN\",\"properties\":{\"name\":\"Isle of Man\"}},{\"arcs\":[[[889]],[[890]],[[891]],[[892]],[[893,-453,-257,-452,894,-183,895,896,897,-455]]],\"type\":\"MultiPolygon\",\"id\":\"IND\",\"properties\":{\"name\":\"India\"}},{\"arcs\":[[[-684,898]]],\"type\":\"MultiPolygon\",\"id\":\"IRL\",\"properties\":{\"name\":\"Ireland\"}},{\"arcs\":[[[899]],[[-54,-156,900,901,-3,902,903,904,905,-152]]],\"type\":\"MultiPolygon\",\"id\":\"IRN\",\"properties\":{\"name\":\"Iran\"}},{\"arcs\":[[-905,906,907,908,909,910,911,912,913]],\"type\":\"Polygon\",\"id\":\"IRQ\",\"properties\":{\"name\":\"Iraq\"}},{\"arcs\":[[[914]]],\"type\":\"MultiPolygon\",\"id\":\"ISL\",\"properties\":{\"name\":\"Iceland\"}},{\"arcs\":[[915,916,917,918,919,920,921,-603,922,923,924,925]],\"type\":\"Polygon\",\"id\":\"ISR\",\"properties\":{\"name\":\"Israel\"}},{\"arcs\":[[[926]],[[927]],[[928,929,-672,-390,-145],[930],[931]]],\"type\":\"MultiPolygon\",\"id\":\"ITA\",\"properties\":{\"name\":\"Italy\"}},{\"arcs\":[[932]],\"type\":\"Polygon\",\"id\":\"JAM\",\"properties\":{\"name\":\"Jamaica\"}},{\"arcs\":[[933,934,-921,935,-919,936,937,-916,938,-910]],\"type\":\"Polygon\",\"id\":\"JOR\",\"properties\":{\"name\":\"Jordan\"}},{\"arcs\":[[[939]],[[940]],[[941]],[[942]],[[943]],[[944]],[[945]],[[946]],[[947]],[[948]],[[949]],[[950]],[[951]]],\"type\":\"MultiPolygon\",\"id\":\"JPN\",\"properties\":{\"name\":\"Japan\"}},{\"arcs\":[[952]],\"type\":\"Polygon\",\"id\":\"KAB\",\"properties\":{\"name\":\"Baikonur\"}},{\"arcs\":[[-898,953,-456]],\"type\":\"Polygon\",\"id\":\"KAS\",\"properties\":{\"name\":\"Siachen Glacier\"}},{\"arcs\":[[[954,955]],[[-460,956,957,958,959,960,961,962],[-953]]],\"type\":\"MultiPolygon\",\"id\":\"KAZ\",\"properties\":{\"name\":\"Kazakhstan\"}},{\"arcs\":[[[-649,963,964,965,966,967,968]]],\"type\":\"MultiPolygon\",\"id\":\"KEN\",\"properties\":{\"name\":\"Kenya\"}},{\"arcs\":[[-459,969,970,-957],[971],[972],[973]],\"type\":\"Polygon\",\"id\":\"KGZ\",\"properties\":{\"name\":\"Kyrgyzstan\"}},{\"arcs\":[[[974,975,976,977]]],\"type\":\"MultiPolygon\",\"id\":\"KHM\",\"properties\":{\"name\":\"Cambodia\"}},{\"arcs\":[[[978]]],\"type\":\"MultiPolygon\",\"id\":\"KIR\",\"properties\":{\"name\":\"Kiribati\"}},{\"arcs\":[[[979]],[[980]],[[981]],[[982,983]]],\"type\":\"MultiPolygon\",\"id\":\"KOR\",\"properties\":{\"name\":\"Korea\"}},{\"arcs\":[[984,-18,985,986]],\"type\":\"Polygon\",\"id\":\"XKX\",\"properties\":{\"name\":\"Kosovo\"}},{\"arcs\":[[[987]],[[988,-908,989]]],\"type\":\"MultiPolygon\",\"id\":\"KWT\",\"properties\":{\"name\":\"Kuwait\"}},{\"arcs\":[[990,-977,991,992,-450]],\"type\":\"Polygon\",\"id\":\"LAO\",\"properties\":{\"name\":\"Lao PDR\"}},{\"arcs\":[[-925,993,994]],\"type\":\"Polygon\",\"id\":\"LBN\",\"properties\":{\"name\":\"Lebanon\"}},{\"arcs\":[[-470,995,996,-705]],\"type\":\"Polygon\",\"id\":\"LBR\",\"properties\":{\"name\":\"Liberia\"}},{\"arcs\":[[-606,997,998,999,-587,1000,1001]],\"type\":\"Polygon\",\"id\":\"LBY\",\"properties\":{\"name\":\"Libya\"}},{\"arcs\":[[1002]],\"type\":\"Polygon\",\"id\":\"LCA\",\"properties\":{\"name\":\"Saint Lucia\"}},{\"arcs\":[[-389,-147]],\"type\":\"Polygon\",\"id\":\"LIE\",\"properties\":{\"name\":\"Liechtenstein\"}},{\"arcs\":[[[1003]]],\"type\":\"MultiPolygon\",\"id\":\"LKA\",\"properties\":{\"name\":\"Sri Lanka\"}},{\"arcs\":[[1004]],\"type\":\"Polygon\",\"id\":\"LSO\",\"properties\":{\"name\":\"Lesotho\"}},{\"arcs\":[[[1005,1006]],[[-210,1007,1008,1009,1010]]],\"type\":\"MultiPolygon\",\"id\":\"LTU\",\"properties\":{\"name\":\"Lithuania\"}},{\"arcs\":[[-561,-670,-163]],\"type\":\"Polygon\",\"id\":\"LUX\",\"properties\":{\"name\":\"Luxembourg\"}},{\"arcs\":[[1011,-211,-1011,1012,-644]],\"type\":\"Polygon\",\"id\":\"LVA\",\"properties\":{\"name\":\"Latvia\"}},{\"arcs\":[[1013,1014]],\"type\":\"Polygon\",\"id\":\"MAF\",\"properties\":{\"name\":\"St-Martin\"}},{\"arcs\":[[-622,1015,-620,1016,-592,1017,1018]],\"type\":\"Polygon\",\"id\":\"MAR\",\"properties\":{\"name\":\"Morocco\"}},{\"arcs\":[[1019,-674]],\"type\":\"Polygon\",\"id\":\"MCO\",\"properties\":{\"name\":\"Monaco\"}},{\"arcs\":[[1020,1021]],\"type\":\"Polygon\",\"id\":\"MDA\",\"properties\":{\"name\":\"Moldova\"}},{\"arcs\":[[[1022]],[[1023]]],\"type\":\"MultiPolygon\",\"id\":\"MDG\",\"properties\":{\"name\":\"Madagascar\"}},{\"arcs\":[[[1024]],[[1025]],[[1026]],[[1027]],[[1028]],[[1029,1030,1031,1032,1033,-214,-769,1034,1035],[1036]]],\"type\":\"MultiPolygon\",\"id\":\"MEX\",\"properties\":{\"name\":\"Mexico\"}},{\"arcs\":[[[-23,1037]],[[-187,-733,1038,-15,1039,-21,1040,-19,-985,1041]]],\"type\":\"MultiPolygon\",\"id\":\"MKD\",\"properties\":{\"name\":\"Macedonia\"}},{\"arcs\":[[1042,-178,-472,-704,1043,1044,-589]],\"type\":\"Polygon\",\"id\":\"MLI\",\"properties\":{\"name\":\"Mali\"}},{\"arcs\":[[[1045]],[[1046]],[[1047]],[[1048]],[[1049]],[[1050]],[[-993,1051,1052,-181,-895,-451]]],\"type\":\"MultiPolygon\",\"id\":\"MMR\",\"properties\":{\"name\":\"Myanmar\"}},{\"arcs\":[[1053,-986,-31,1054,-16,1055,-29,1056,-780,-203]],\"type\":\"Polygon\",\"id\":\"MNE\",\"properties\":{\"name\":\"Montenegro\"}},{\"arcs\":[[-464,1057,-462,1058]],\"type\":\"Polygon\",\"id\":\"MNG\",\"properties\":{\"name\":\"Mongolia\"}},{\"arcs\":[[[1059,1060,1061,1062,1063,1064,1065,1066,1067]]],\"type\":\"MultiPolygon\",\"id\":\"MOZ\",\"properties\":{\"name\":\"Mozambique\"}},{\"arcs\":[[[1068,1069,1070,-590,-1045]]],\"type\":\"MultiPolygon\",\"id\":\"MRT\",\"properties\":{\"name\":\"Mauritania\"}},{\"arcs\":[[[1071]]],\"type\":\"MultiPolygon\",\"id\":\"MUS\",\"properties\":{\"name\":\"Mauritius\"}},{\"arcs\":[[[1072,1073]],[[1074,1075]],[[1076,1077]],[[1078,1079]],[[1080,-1065,1081,1082]]],\"type\":\"MultiPolygon\",\"id\":\"MWI\",\"properties\":{\"name\":\"Malawi\"}},{\"arcs\":[[[1083]],[[-882,1084]],[[1085]],[[1086]],[[1087,1088]],[[-886,1089,-256,1090,-253,1091]],[[1092]]],\"type\":\"MultiPolygon\",\"id\":\"MYS\",\"properties\":{\"name\":\"Malaysia\"}},{\"arcs\":[[1093,-261,1094,1095,-8]],\"type\":\"Polygon\",\"id\":\"NAM\",\"properties\":{\"name\":\"Namibia\"}},{\"arcs\":[[[1096]],[[1097]],[[1098]]],\"type\":\"MultiPolygon\",\"id\":\"NCL\",\"properties\":{\"name\":\"New Caledonia\"}},{\"arcs\":[[1099,1100,-173,-174,-1043,-588,-1000]],\"type\":\"Polygon\",\"id\":\"NER\",\"properties\":{\"name\":\"Niger\"}},{\"arcs\":[[[1101,-478,1102,-169,-1101]]],\"type\":\"MultiPolygon\",\"id\":\"NGA\",\"properties\":{\"name\":\"Nigeria\"}},{\"arcs\":[[[1103,-528,1104,-776]]],\"type\":\"MultiPolygon\",\"id\":\"NIC\",\"properties\":{\"name\":\"Nicaragua\"}},{\"arcs\":[[[-166,1105]],[[1106]],[[-562,-168,1107],[1108]]],\"type\":\"MultiPolygon\",\"id\":\"NLD\",\"properties\":{\"name\":\"Netherlands\"}},{\"arcs\":[[[1109]],[[1110]],[[1111]],[[1112]],[[1113]],[[1114]],[[1115]],[[1116]],[[1117]],[[1118]],[[1119]],[[1120]],[[1121]],[[1122]],[[1123,-656,1124,1125]],[[1126]],[[1127]],[[1128]],[[1129]],[[1130]],[[1131]],[[1132]]],\"type\":\"MultiPolygon\",\"id\":\"NOR\",\"properties\":{\"name\":\"Norway\"}},{\"arcs\":[[-894,-454]],\"type\":\"Polygon\",\"id\":\"NPL\",\"properties\":{\"name\":\"Nepal\"}},{\"arcs\":[[[1133]],[[1134]],[[1135]],[[1136]],[[1137]],[[1138]]],\"type\":\"MultiPolygon\",\"id\":\"NZL\",\"properties\":{\"name\":\"New Zealand\"}},{\"arcs\":[[[1139]],[[1140,1141,-37,1142]],[[-41],[-35]],[[-40,1143]]],\"type\":\"MultiPolygon\",\"id\":\"OMN\",\"properties\":{\"name\":\"Oman\"}},{\"arcs\":[[[-954,-897,1144,-903,-2,-457]]],\"type\":\"MultiPolygon\",\"id\":\"PAK\",\"properties\":{\"name\":\"Pakistan\"}},{\"arcs\":[[[1145]],[[-517,1146,-526,1147]]],\"type\":\"MultiPolygon\",\"id\":\"PAN\",\"properties\":{\"name\":\"Panama\"}},{\"arcs\":[[[-248,-221,1148,-215,1149,-219,-438,1150,-600,-514]]],\"type\":\"MultiPolygon\",\"id\":\"PER\",\"properties\":{\"name\":\"Peru\"}},{\"arcs\":[[[1151]],[[1152]],[[1153]],[[1154]],[[1155]],[[1156]],[[1157]],[[1158]],[[1159]],[[1160]],[[1161]],[[1162]],[[1163]],[[1164]],[[1165]],[[1166]],[[1167]],[[1168]],[[1169]],[[1170]],[[1171]],[[1172]],[[1173]],[[1174]],[[1175]],[[1176]],[[1177]],[[1178]],[[1179]],[[1180]],[[1181]]],\"type\":\"MultiPolygon\",\"id\":\"PHL\",\"properties\":{\"name\":\"Philippines\"}},{\"arcs\":[[[1182]]],\"type\":\"MultiPolygon\",\"id\":\"PLW\",\"properties\":{\"name\":\"Palau\"}},{\"arcs\":[[[1183]],[[1184]],[[1185]],[[1186]],[[1187]],[[1188]],[[1189]],[[1190]],[[1191]],[[1192]],[[1193]],[[1194]],[[-858,1195]],[[1196]],[[1197]],[[1198]],[[1199]]],\"type\":\"MultiPolygon\",\"id\":\"PNG\",\"properties\":{\"name\":\"Papua New Guinea\"}},{\"arcs\":[[1200,1201,1202,-1008,-209,1203,1204,-550,-558,1205,-554,1206]],\"type\":\"Polygon\",\"id\":\"POL\",\"properties\":{\"name\":\"Poland\"}},{\"arcs\":[[[1207]]],\"type\":\"MultiPolygon\",\"id\":\"PRI\",\"properties\":{\"name\":\"Puerto Rico\"}},{\"arcs\":[[[1208,1209,-983,1210,-445]]],\"type\":\"MultiPolygon\",\"id\":\"PRK\",\"properties\":{\"name\":\"Dem. Rep. Korea\"}},{\"arcs\":[[[1211]],[[1212]],[[1213]],[[1214]],[[1215,-633]]],\"type\":\"MultiPolygon\",\"id\":\"PRT\",\"properties\":{\"name\":\"Portugal\"}},{\"arcs\":[[-247,1216,-245,-46,-217]],\"type\":\"Polygon\",\"id\":\"PRY\",\"properties\":{\"name\":\"Paraguay\"}},{\"arcs\":[[[-602,1217,-923]],[[-938,1218,-917]]],\"type\":\"MultiPolygon\",\"id\":\"PSX\",\"properties\":{\"name\":\"Palestine\"}},{\"arcs\":[[[1219]]],\"type\":\"MultiPolygon\",\"id\":\"PYF\",\"properties\":{\"name\":\"Fr. Polynesia\"}},{\"arcs\":[[1220,1221]],\"type\":\"Polygon\",\"id\":\"QAT\",\"properties\":{\"name\":\"Qatar\"}},{\"arcs\":[[1222,1223,-189,1224,-795,1225,-1021]],\"type\":\"Polygon\",\"id\":\"ROU\",\"properties\":{\"name\":\"Romania\"}},{\"arcs\":[[[1226]],[[1227]],[[1228]],[[1229]],[[1230]],[[1231]],[[1232]],[[1233]],[[1234]],[[1235]],[[1236]],[[-1203,1237,-1201,1238,-1006,1239,-1009]],[[1240]],[[1241]],[[1242,-639]],[[1243]],[[1244]],[[1245]],[[1246]],[[1247]],[[1248]],[[1249]],[[1250]],[[1251]],[[1252]],[[1253]],[[1254]],[[1255]],[[1256]],[[1257]],[[1258]],[[1259]],[[1260]],[[1261]],[[1262]],[[1263]],[[1264]],[[1265]],[[1266]],[[1267]],[[1268]],[[1269]],[[1270]],[[-1209,-444,1271,-465,-1059,-461,-963,1272,-154,-699,1273,1274,-207,-1012,-643,1275,-641,1276,-637,1277,-653,-1124,1278]],[[1279]],[[1280]],[[1281]],[[1282]],[[1283]],[[1284]],[[1285]],[[1286]],[[1287]],[[1288]],[[1289]],[[1290]],[[1291]],[[1292]],[[1293]],[[1294]],[[1295]],[[1296]],[[1297]],[[1298]]],\"type\":\"MultiPolygon\",\"id\":\"RUS\",\"properties\":{\"name\":\"Russia\"}},{\"arcs\":[[1299,-161,-504,1300,-502,1301]],\"type\":\"Polygon\",\"id\":\"RWA\",\"properties\":{\"name\":\"Rwanda\"}},{\"arcs\":[[-591,-1071,1302,-1018]],\"type\":\"Polygon\",\"id\":\"ESH\",\"properties\":{\"name\":\"W. Sahara\"}},{\"arcs\":[[[1303]],[[-989,1304,-1221,1305,-38,-1142,1306,1307,-934,-909]]],\"type\":\"MultiPolygon\",\"id\":\"SAU\",\"properties\":{\"name\":\"Saudi Arabia\"}},{\"arcs\":[[[1308,-610,-651,1309,-262,1310,-998,-605]]],\"type\":\"MultiPolygon\",\"id\":\"SDN\",\"properties\":{\"name\":\"Sudan\"}},{\"arcs\":[[-650,-969,1311,-496,-263,-1310]],\"type\":\"Polygon\",\"id\":\"SSD\",\"properties\":{\"name\":\"S. Sudan\"}},{\"arcs\":[[-1044,-709,-714,1312,-711,1313,-1069]],\"type\":\"Polygon\",\"id\":\"SEN\",\"properties\":{\"name\":\"Senegal\"}},{\"arcs\":[[1314]],\"type\":\"Polygon\",\"id\":\"SGP\",\"properties\":{\"name\":\"Singapore\"}},{\"arcs\":[[[1315]]],\"type\":\"MultiPolygon\",\"id\":\"SGS\",\"properties\":{\"name\":\"S. Geo. and S. Sandw. Is.\"}},{\"arcs\":[[[1316]],[[1317]],[[1318]],[[1319]],[[1320]],[[1321]],[[1322]],[[1323]],[[1324]],[[1325]],[[1326]],[[1327]],[[1328]]],\"type\":\"MultiPolygon\",\"id\":\"SLB\",\"properties\":{\"name\":\"Solomon Is.\"}},{\"arcs\":[[[1329]],[[-997,1330,-706]]],\"type\":\"MultiPolygon\",\"id\":\"SLE\",\"properties\":{\"name\":\"Sierra Leone\"}},{\"arcs\":[[[-778,1331,-767]]],\"type\":\"MultiPolygon\",\"id\":\"SLV\",\"properties\":{\"name\":\"El Salvador\"}},{\"arcs\":[[-931]],\"type\":\"Polygon\",\"id\":\"SMR\",\"properties\":{\"name\":\"San Marino\"}},{\"arcs\":[[1332,-647,-565,1333]],\"type\":\"Polygon\",\"id\":\"SOL\",\"properties\":{\"name\":\"Somaliland\"}},{\"arcs\":[[-964,-648,-1333,1334]],\"type\":\"Polygon\",\"id\":\"SOM\",\"properties\":{\"name\":\"Somalia\"}},{\"arcs\":[[-1225,-188,-1042,-987,-1054,-202,-787,-796]],\"type\":\"Polygon\",\"id\":\"SRB\",\"properties\":{\"name\":\"Serbia\"}},{\"arcs\":[[[1335]]],\"type\":\"MultiPolygon\",\"id\":\"STP\",\"properties\":{\"name\":\"S\\u00e3o Tom\\u00e9 and Principe\"}},{\"arcs\":[[-664,-239,-771,1336]],\"type\":\"Polygon\",\"id\":\"SUR\",\"properties\":{\"name\":\"Suriname\"}},{\"arcs\":[[1337,-798,-142,-551,-1205]],\"type\":\"Polygon\",\"id\":\"SVK\",\"properties\":{\"name\":\"Slovakia\"}},{\"arcs\":[[-789,1338,-929,-144,-797]],\"type\":\"Polygon\",\"id\":\"SVN\",\"properties\":{\"name\":\"Slovenia\"}},{\"arcs\":[[[1339]],[[1340]],[[1341]],[[1342,-1125,-655]]],\"type\":\"MultiPolygon\",\"id\":\"SWE\",\"properties\":{\"name\":\"Sweden\"}},{\"arcs\":[[-1061,1343]],\"type\":\"Polygon\",\"id\":\"SWZ\",\"properties\":{\"name\":\"Swaziland\"}},{\"arcs\":[[1344,-1014]],\"type\":\"Polygon\",\"id\":\"SXM\",\"properties\":{\"name\":\"Sint Maarten\"}},{\"arcs\":[[-913,911,-911,-939,-926,-995,1345,1346]],\"type\":\"Polygon\",\"id\":\"SYR\",\"properties\":{\"name\":\"Syria\"}},{\"arcs\":[[-1311,-267,-473,1347,-481,1348,-479,-1102,-1100,-999]],\"type\":\"Polygon\",\"id\":\"TCD\",\"properties\":{\"name\":\"Chad\"}},{\"arcs\":[[-171,1349,-700,-175]],\"type\":\"Polygon\",\"id\":\"TGO\",\"properties\":{\"name\":\"Togo\"}},{\"arcs\":[[[1350]],[[1351]],[[-992,-976,1352,-1089,1353,-1052]]],\"type\":\"MultiPolygon\",\"id\":\"THA\",\"properties\":{\"name\":\"Thailand\"}},{\"arcs\":[[[-974]],[[1354]],[[-970,-458,-6,1355]]],\"type\":\"MultiPolygon\",\"id\":\"TJK\",\"properties\":{\"name\":\"Tajikistan\"}},{\"arcs\":[[[-4,-902,1356,-961,1357,1358,1359]]],\"type\":\"MultiPolygon\",\"id\":\"TKM\",\"properties\":{\"name\":\"Turkmenistan\"}},{\"arcs\":[[[1360,-803]],[[-805,1361]]],\"type\":\"MultiPolygon\",\"id\":\"TLS\",\"properties\":{\"name\":\"Timor-Leste\"}},{\"arcs\":[[[1362]]],\"type\":\"MultiPolygon\",\"id\":\"TON\",\"properties\":{\"name\":\"Tonga\"}},{\"arcs\":[[[1363]]],\"type\":\"MultiPolygon\",\"id\":\"TTO\",\"properties\":{\"name\":\"Trinidad and Tobago\"}},{\"arcs\":[[[1364]],[[-1001,-586,1365]]],\"type\":\"MultiPolygon\",\"id\":\"TUN\",\"properties\":{\"name\":\"Tunisia\"}},{\"arcs\":[[[1366,-734,-185]],[[-697,-56,-153,-906,-914,-1347,1367]]],\"type\":\"MultiPolygon\",\"id\":\"TUR\",\"properties\":{\"name\":\"Turkey\"}},{\"arcs\":[[[1368]]],\"type\":\"MultiPolygon\",\"id\":\"TWN\",\"properties\":{\"name\":\"Taiwan\"}},{\"arcs\":[[[1369]],[[1370]],[[1371]],[[1372]],[[1373,1374,1375,-966,1376,-1067,1377,-1074,1378,-1076,1379,-1078,1380,-1080,1381,-1083,1382,1383,-158,-1300,1384]]],\"type\":\"MultiPolygon\",\"id\":\"TZA\",\"properties\":{\"name\":\"Tanzania\"}},{\"arcs\":[[[-1375,1385]],[[1386,-1385,-1302,-501,1387,-499,1388,-497,-1312,-968]]],\"type\":\"MultiPolygon\",\"id\":\"UGA\",\"properties\":{\"name\":\"Uganda\"}},{\"arcs\":[[[1389,-1223,-1022,-1226,-794,-1338,-1204,-208,-1275],[1390],[1391]]],\"type\":\"MultiPolygon\",\"id\":\"UKR\",\"properties\":{\"name\":\"Ukraine\"}},{\"arcs\":[[1392,-242,1393,-48,-244]],\"type\":\"Polygon\",\"id\":\"URY\",\"properties\":{\"name\":\"Uruguay\"}},{\"arcs\":[[[1394]],[[1395]],[[1396]],[[1397]],[[1398]],[[1399]],[[1400]],[[1401]],[[1402]],[[1403]],[[1404]],[[1405]],[[1406]],[[1407]],[[1408]],[[1409]],[[1410,-344]],[[1411,-340,1412,-338,1413,-336,1414,-334,-278,1415,-276,1416,-1033,1417,-1031,1418,-1036,1419,-342]],[[1420]],[[1421]],[[1422]],[[1423]],[[1424]],[[1425]],[[1426]],[[1427]],[[1428]],[[1429]],[[1430]],[[1431]],[[1432]],[[1433]],[[1434]],[[1435]],[[1436]],[[1437]],[[1438]],[[1439]],[[1440]],[[1441]],[[1442]],[[1443]],[[1444]],[[1445]],[[1446]],[[1447]],[[1448]],[[1449]],[[1450]],[[1451]],[[1452]],[[1453]],[[-347,345,1454]]],\"type\":\"MultiPolygon\",\"id\":\"USA\",\"properties\":{\"name\":\"United States\"}},{\"arcs\":[[[-534,1455]],[[1456,-532]]],\"type\":\"MultiPolygon\",\"id\":\"USG\",\"properties\":{\"name\":\"USNB Guantanamo Bay\"}},{\"arcs\":[[[-973]],[[-972]],[[-955,1457,-958,-971,-1356,-5,-1360,1458,-1358,-960,1459],[-1355]]],\"type\":\"MultiPolygon\",\"id\":\"UZB\",\"properties\":{\"name\":\"Uzbekistan\"}},{\"arcs\":[[-932]],\"type\":\"Polygon\",\"id\":\"VAT\",\"properties\":{\"name\":\"Vatican\"}},{\"arcs\":[[[1460]]],\"type\":\"MultiPolygon\",\"id\":\"VCT\",\"properties\":{\"name\":\"St. Vin. and Gren.\"}},{\"arcs\":[[[1461]],[[1462]],[[1463]],[[-772,-250,-513,1464]]],\"type\":\"MultiPolygon\",\"id\":\"VEN\",\"properties\":{\"name\":\"Venezuela\"}},{\"arcs\":[[[1465]],[[1466,-978,-991,-449]]],\"type\":\"MultiPolygon\",\"id\":\"VNM\",\"properties\":{\"name\":\"Vietnam\"}},{\"arcs\":[[[1467]],[[1468]],[[1469]],[[1470]],[[1471]],[[1472]],[[1473]],[[1474]],[[1475]],[[1476]],[[1477]],[[1478]]],\"type\":\"MultiPolygon\",\"id\":\"VUT\",\"properties\":{\"name\":\"Vanuatu\"}},{\"arcs\":[[1479,-547]],\"type\":\"Polygon\",\"id\":\"WSB\",\"properties\":{\"name\":\"Akrotiri\"}},{\"arcs\":[[[1480]],[[1481]]],\"type\":\"MultiPolygon\",\"id\":\"WSM\",\"properties\":{\"name\":\"Samoa\"}},{\"arcs\":[[[1482]],[[1483,-1307,-1141]]],\"type\":\"MultiPolygon\",\"id\":\"YEM\",\"properties\":{\"name\":\"Yemen\"}},{\"arcs\":[[[-1062,-1344,-1060,1484,-1095,-260,1485],[-1005]]],\"type\":\"MultiPolygon\",\"id\":\"ZAF\",\"properties\":{\"name\":\"South Africa\"}},{\"arcs\":[[-1383,-1082,-1064,1486,1487,1488,-1094,-7,-508,1489,-506,1490]],\"type\":\"Polygon\",\"id\":\"ZMB\",\"properties\":{\"name\":\"Zambia\"}},{\"arcs\":[[-1063,-1486,-259,-1489,1491,-1487]],\"type\":\"Polygon\",\"id\":\"ZWE\",\"properties\":{\"name\":\"Zimbabwe\"}}],\"type\":\"GeometryCollection\"}},\"transform\":{\"translate\":[-180,-90],\"scale\":[0.036003600360036005,0.01736514657995801]}}\n"
  },
  {
    "path": "packages/visx-demo/src/components/ApiTable.tsx",
    "content": "import React, { useMemo } from 'react';\nimport Markdown from 'react-markdown';\nimport type { DocGenInfo, PropInfo, ParamInfo } from '../types';\nimport { toExportName } from './util/format';\nimport { getGitHubUrl } from '../utils/getGitHubUrl';\n\ntype Props = {\n  docgenInfo: DocGenInfo;\n};\n\nconst alphaSort = (a: PropInfo, b: PropInfo) => a.name.localeCompare(b.name);\n\n/** Renders a list of props/parameters for the passed docgenInfo */\nexport default function ApiTable({ docgenInfo }: Props) {\n  const {\n    displayName = '',\n    kind = 'component',\n    description,\n    parameters,\n    returnType,\n    filePath,\n    lineNumber,\n  } = docgenInfo;\n  const anchorId = displayName;\n  const isFunction = kind === 'function';\n  const sourceUrl = getGitHubUrl(filePath, lineNumber);\n\n  // required first, then abc order\n  const props = useMemo(() => {\n    const requiredProps: PropInfo[] = [];\n    const optionalProps: PropInfo[] = [];\n\n    Object.values(docgenInfo.props).forEach((prop) => {\n      if (prop.required) {\n        requiredProps.push(prop);\n      } else {\n        optionalProps.push(prop);\n      }\n    });\n\n    return [...requiredProps.sort(alphaSort), ...optionalProps.sort(alphaSort)];\n  }, [docgenInfo]);\n\n  return (\n    <div className=\"api\">\n      <h3>\n        <a id={anchorId} href={`#${anchorId}`} className=\"export-name-anchor\">\n          #\n        </a>\n        {toExportName(displayName)}\n        {kind === 'hook' && <span className=\"kind-badge hook\">hook</span>}\n        {kind === 'function' && <span className=\"kind-badge function\">function</span>}\n        {sourceUrl && (\n          <a href={sourceUrl} target=\"_blank\" rel=\"noopener noreferrer\" className=\"source-link\">\n            View Source →\n          </a>\n        )}\n      </h3>\n      {description && (\n        <div className=\"doc-description\">\n          <Markdown>{description}</Markdown>\n        </div>\n      )}\n      {isFunction && parameters && parameters.length > 0 ? (\n        <>\n          <h4>Parameters</h4>\n          {parameters.map((param: ParamInfo) => {\n            const id = `${displayName}_${param.name}`;\n            return (\n              <div key={param.name} className=\"prop\">\n                <div className=\"title\">\n                  <span className=\"name\">\n                    <a id={id} href={`#${id}`} className=\"api-anchor\">\n                      #\n                    </a>{' '}\n                    <strong>{param.name}</strong>\n                  </span>\n                  {param.type && (\n                    <span className=\"typedef\">\n                      <code>{param.type.name}</code>\n                    </span>\n                  )}\n                </div>\n                <div className=\"description\">\n                  <Markdown>\n                    {`${param.description || ''}${\n                      param.defaultValue\n                        ? `\\n\\nDefault \\`${String(param.defaultValue.value) || '\"\"'}\\``\n                        : ''\n                    }`}\n                  </Markdown>\n                </div>\n              </div>\n            );\n          })}\n          {returnType && (\n            <div className=\"return-type\">\n              <strong>Returns:</strong> <code>{returnType}</code>\n            </div>\n          )}\n        </>\n      ) : (\n        props.map((prop) => {\n          const id = `${displayName}_${prop.name}`;\n          return (\n            <div key={prop.name} className=\"prop\">\n              <div className=\"title\">\n                <span className=\"name\">\n                  <a id={id} href={`#${id}`} className=\"api-anchor\">\n                    #\n                  </a>{' '}\n                  <strong>{prop.name}</strong>\n                </span>\n                {prop.type && (\n                  <span className=\"typedef\">\n                    <code>{prop.type.name}</code>\n                  </span>\n                )}\n                {prop.required && <span className=\"kind-badge required\">required</span>}\n              </div>\n              <div className=\"description\">\n                <Markdown>\n                  {`${prop.description}${\n                    prop.defaultValue\n                      ? `\\n\\nDefault \\`${String(prop.defaultValue.value) || '\"\"'}\\``\n                      : ''\n                  }`}\n                </Markdown>\n              </div>\n            </div>\n          );\n        })\n      )}\n      <style jsx>{`\n        h3 {\n          margin-bottom: 0.5rem;\n          margin-left: -29px;\n          font-weight: 400;\n        }\n        h4 {\n          margin-top: 1rem;\n          margin-bottom: 0.5rem;\n          font-weight: 500;\n          font-size: 16px;\n        }\n        .kind-badge {\n          font-size: 12px;\n          font-weight: 500;\n          padding: 2px 8px;\n          border-radius: 3px;\n          margin-left: 8px;\n        }\n        .kind-badge.hook {\n          background-color: #e3f2fd;\n          color: #1976d2;\n        }\n        .kind-badge.function {\n          background-color: #f3e5f5;\n          color: #7b1fa2;\n        }\n        .kind-badge.required {\n          background-color: #ffebee;\n          color: #c62828;\n        }\n        .source-link {\n          font-size: 14px;\n          font-weight: 400;\n          margin-left: 12px;\n          color: #666;\n          text-decoration: none;\n          opacity: 0.7;\n          transition: opacity 0.2s;\n        }\n        .source-link:hover {\n          opacity: 1;\n          text-decoration: underline;\n        }\n        .doc-description {\n          margin-bottom: 1rem;\n          font-size: 16px;\n        }\n        .doc-description :global(p) {\n          margin: 0.25rem 0;\n        }\n        .return-type {\n          margin-top: 1rem;\n          padding: 0.5rem;\n          background-color: #f5f5f5;\n          border-radius: 4px;\n          font-size: 16px;\n        }\n        .return-type code {\n          font-family: 'Menlo', monospace;\n          background-color: transparent;\n          font-weight: 400;\n        }\n        .prop:last-child {\n          border-bottom: 1px solid #eaeaea;\n        }\n        .prop {\n          padding: 0.5em 0.5em 0.5em 0;\n          line-height: 1.2em;\n          vertical-align: middle;\n        }\n        .export-name-anchor,\n        .api-anchor {\n          opacity: 0;\n          scroll-margin-top: 88px;\n        }\n        .export-name-anchor {\n          display: inline-block;\n          margin-right: 12px;\n        }\n        .title:hover .api-anchor,\n        h3:hover .export-name-anchor {\n          opacity: 1;\n        }\n        .title {\n          font-size: 18px;\n          margin-left: -16px;\n        }\n        .title > :not(:last-child) {\n          margin-right: 6px;\n        }\n        .description {\n          max-width: 720px;\n        }\n        .description > :global(p) {\n          font-size: 18px;\n          margin: 0.25rem 0 0 0;\n        }\n        .typedef code {\n          font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Oxygen', 'Ubuntu',\n            'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n          background-color: transparent;\n          font-weight: 400;\n          color: grey;\n          padding: 0;\n          font-size: 16px;\n        }\n        .required {\n          color: #fc2e1c;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/CodeSandboxLink.tsx",
    "content": "import React from 'react';\n\nconst icon = (\n  <svg\n    xmlns=\"http://www.w3.org/2000/svg\"\n    width=\"20\"\n    height=\"20\"\n    viewBox=\"0 0 24 24\"\n    fill=\"none\"\n    stroke=\"currentColor\"\n    strokeWidth=\"2\"\n    strokeLinecap=\"round\"\n    strokeLinejoin=\"round\"\n  >\n    <path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\" />\n    <polyline points=\"7.5 4.21 12 6.81 16.5 4.21\" />\n    <polyline points=\"7.5 19.79 7.5 14.6 3 12\" />\n    <polyline points=\"21 12 16.5 14.6 16.5 19.79\" />\n    <polyline points=\"3.27 6.96 12 12.01 20.73 6.96\" />\n    <line x1=\"12\" y1=\"22.08\" x2=\"12\" y2=\"12\" />\n  </svg>\n);\n\ntype Props = {\n  branch?: string;\n  exampleDirectoryName: string;\n};\n\nfunction CodeSandboxLink({ branch = 'master', exampleDirectoryName }: Props) {\n  return exampleDirectoryName ? (\n    <>\n      <a\n        className=\"sandbox-link\"\n        href={`https://codesandbox.io/s/github/airbnb/visx/tree/${branch}/packages/visx-demo/src/sandboxes/${exampleDirectoryName}`}\n        rel=\"nofollow noopener noreferrer\"\n        target=\"_blank\"\n      >\n        {icon}&nbsp;Try it on CodeSandbox\n      </a>\n      <style jsx>{`\n        .sandbox-link {\n          display: flex;\n          align-items: center;\n          font-size: 12px;\n          color: #222;\n        }\n      `}</style>\n    </>\n  ) : null;\n}\n\nexport default CodeSandboxLink;\n"
  },
  {
    "path": "packages/visx-demo/src/components/Codeblock.tsx",
    "content": "import React from 'react';\nimport ReactDOMServer from 'react-dom/server';\nimport Prism from 'prismjs';\n// these have sequential dependencies\nimport 'prismjs/components/prism-jsx.min';\nimport 'prismjs/components/prism-typescript.min';\nimport 'prismjs/components/prism-tsx.min';\n\nfunction Lines({ lines }: { lines: number[] }) {\n  return (\n    <span aria-hidden=\"true\" className=\"line-numbers-rows\">\n      {lines.map((_, i) => (\n        <span key={`line-number-${lines.length}-${i}`} />\n      ))}\n    </span>\n  );\n}\n\nexport default function ({ children }: { children: string }) {\n  const match = children.match(/\\n(?!$)/g);\n  const linesNum = match ? match.length + 1 : 1;\n  const lines: number[] = new Array(linesNum + 1).fill(1);\n  const html = [\n    ReactDOMServer.renderToString(<Lines lines={lines} />),\n    Prism.highlight(children, Prism.languages.ts, 'tsx'),\n  ].join('');\n\n  return (\n    <pre className=\"codeblock line-numbers\">\n      <code dangerouslySetInnerHTML={{ __html: html }} />\n      <style jsx>{`\n        .codeblock code {\n          display: block;\n          padding: 0 0 0 1.5rem;\n          border-radius: 0;\n          font-weight: 300;\n          font-size: 14px;\n          line-height: 1.4em;\n          background: white;\n          color: #495057;\n        }\n\n        .codeblock.line-numbers {\n          padding-left: 0;\n        }\n\n        @media (max-width: 600px) {\n          .codeblock code {\n            font-size: 10px;\n            padding: 0;\n            pointer-events: none;\n          }\n        }\n      `}</style>\n    </pre>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/DocPage.tsx",
    "content": "/* eslint-disable no-underscore-dangle */\nimport React from 'react';\nimport Markdown from 'react-markdown';\nimport rehypeRaw from 'rehype-raw';\n\nimport ApiTable from './ApiTable';\nimport PackageList from './PackageList';\nimport Page from './Page';\nimport type { DocGenInfo, VisxPackage } from '../types';\nimport { toExportName } from './util/format';\n\ntype Props = {\n  components?: unknown[];\n  examples?: (React.ComponentClass | React.FC)[];\n  visxPackage: VisxPackage;\n  readme: string;\n};\n\nexport default function DocPage({ components, examples, visxPackage, readme }: Props) {\n  return (\n    <Page wrapper={false} title={`@visx/${visxPackage} documentation`}>\n      <div className=\"doc-container\">\n        <div className=\"doc-nav\">\n          <PackageList compact grid={false} emphasizePackage={visxPackage} />\n        </div>\n        <div className=\"doc-content\">\n          <div className=\"doc-readme\">\n            <Markdown rehypePlugins={[rehypeRaw]}>{readme}</Markdown>\n          </div>\n          {examples && examples.length > 0 && (\n            <>\n              <h2>Examples</h2>\n              <div className=\"examples\">\n                {examples.map((example, i) => (\n                  <div key={i} className=\"example\">\n                    {React.createElement(example)}\n                  </div>\n                ))}\n              </div>\n            </>\n          )}\n          {components && components.length > 0 && (\n            <div className=\"component-docs\">\n              <div>\n                <h2>APIs</h2>\n                {components.map((component) => {\n                  // @ts-expect-error TS doesn't know about docgenInfo\n                  const docgenInfo = component.__docgenInfo as DocGenInfo | undefined;\n                  return docgenInfo ? (\n                    <ApiTable key={docgenInfo.displayName} docgenInfo={docgenInfo} />\n                  ) : null;\n                })}\n              </div>\n              <div>\n                <h2>Exports</h2>\n                <ul>\n                  {components.map((component) => {\n                    // @ts-expect-error TS doesn't know about docgenInfo\n                    const docgenInfo = component?.__docgenInfo as DocGenInfo | undefined;\n                    const { displayName = '' } = docgenInfo || {};\n                    return docgenInfo ? (\n                      <li key={displayName}>\n                        <a className=\"export-anchor\" href={`#${displayName}`}>\n                          {toExportName(displayName)}\n                        </a>\n                      </li>\n                    ) : null;\n                  })}\n                </ul>\n              </div>\n            </div>\n          )}\n        </div>\n      </div>\n      <style jsx>{`\n        .doc-container {\n          margin-top: 24px;\n          display: flex;\n          flex-direction: row;\n        }\n        .doc-content {\n          width: 100%;\n        }\n        .doc-content :global(h1) {\n          margin-bottom: 1.2em;\n          line-height: 0;\n          font-size: 2em;\n        }\n        .doc-content :global(img) {\n          max-width: 50vw;\n          max-height: 50vh;\n        }\n        .doc-content :global(th),\n        .doc-content :global(td) {\n          border: 1px solid;\n          padding: 5px 10px 5px 5px;\n        }\n        .doc-nav {\n          margin-right: 5em;\n          width: 140px;\n          flex-shrink: 0;\n        }\n        .doc-content :global(code) {\n          font-family: 'Menlo', monospace;\n          padding: 0.2rem 0.3rem;\n          background-color: #efefef;\n          line-height: 1.8em;\n          font-size: 0.8em;\n          font-weight: normal;\n        }\n        .doc-content :global(code[class*='language-']) {\n          background-color: transparent;\n          font-weight: 300;\n          color: #222;\n          box-shadow: none;\n        }\n        .doc-readme {\n          max-width: 720px;\n          font-size: 18px;\n        }\n        .doc-readme :global(pre) {\n          background-color: #efefef;\n          display: inline-block;\n          padding: 0.5em;\n          min-width: 33vw;\n          border-radius: 3px;\n          font-weight: normal;\n          max-width: 720px;\n          line-height: 1.1em;\n          word-break: break-word;\n        }\n        .doc-readme :global(pre code) {\n          max-width: 720px;\n          font-size: 16px;\n          line-height: 1.1em;\n          word-break: break-word;\n          white-space: pre-wrap; /* css-3 */\n          white-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n          white-space: -pre-wrap; /* Opera 4-6 */\n          white-space: -o-pre-wrap; /* Opera 7 */\n        }\n        .doc-content :global(table) {\n          border-collapse: collapse;\n          font-size: 16px;\n          line-height: 1em;\n          border-color: #efefef;\n          margin-top: 0.25rem;\n        }\n        .examples {\n          display: flex;\n          flex-wrap: wrap;\n        }\n        .example {\n          min-width: 400px;\n          max-width: 33%;\n          flex-grow: 1;\n        }\n        .component-docs {\n          display: grid;\n          grid-gap: 2rem;\n          grid-template-columns: 1fr 320px;\n        }\n        ul {\n          margin-top: 0.5rem;\n        }\n        li {\n          line-height: 1em;\n        }\n        .doc-content :global(.export-anchor) {\n          line-height: 1.5em;\n          font-size: 16px;\n          padding: 0;\n        }\n        @media (max-width: 800px) {\n          .doc-container {\n            flex-direction: column-reverse;\n            min-width: 90vw;\n            max-width: 90vw;\n            margin: 0;\n          }\n          .example {\n            max-width: 100%;\n          }\n          .component-docs {\n            grid-template-columns: 1fr;\n          }\n        }\n      `}</style>\n    </Page>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Footer.tsx",
    "content": "import React from 'react';\nimport Twitter from './icons/Twitter';\nimport Medium from './icons/Medium';\nimport GitHub from './icons/GitHub';\n\nfunction Footer() {\n  return (\n    <footer className=\"wrapper\">\n      <div className=\"airbnb\">\n        <a href=\"https://airbnb.io\">Airbnb.io</a>\n      </div>\n      <div className=\"social\">\n        <a href=\"https://github.com/airbnb/visx\" className=\"icon\" aria-label=\"github logo\">\n          <GitHub />\n        </a>\n        <a href=\"https://x.com/AirbnbEng\" className=\"icon\" aria-label=\"x logo\">\n          <Twitter />\n        </a>\n        <a href=\"https://medium.com/airbnb-engineering\" className=\"icon\" aria-label=\"medium logo\">\n          <Medium />\n        </a>\n      </div>\n      <style jsx>{`\n        footer {\n          align-self: center;\n          width: 95vw;\n          padding: 24px 0;\n          border-top: 1px solid #dfdfdf;\n          display: flex;\n          margin: 48px auto 48px;\n          font-weight: 300;\n        }\n        .airbnb {\n          margin-left: 24px;\n        }\n        .social {\n          margin: 0 24px;\n          display: flex;\n          flex-direction: row;\n          justify-content: flex-end;\n          flex: 1;\n          grid-gap: 2rem;\n        }\n        .icon {\n          width: 36px;\n          height: 36px;\n          justify-content: center;\n        }\n        @media (max-width: 600px) {\n          footer {\n            flex-direction: column;\n          }\n          .social {\n            margin-top: 1rem;\n            min-width: 240px;\n            justify-content: space-between;\n          }\n        }\n      `}</style>\n    </footer>\n  );\n}\nexport default Footer;\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"import/no-relative-packages\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/AnnotationTile.tsx",
    "content": "import React from 'react';\nimport type { AnnotationProps } from '../../sandboxes/visx-annotation/Example';\nimport Annotation, { greens } from '../../sandboxes/visx-annotation/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-annotation/package.json';\n\nconst tileStyles = { background: greens[0] };\nconst detailsStyles: React.CSSProperties = {\n  color: greens[2],\n  borderBottomRightRadius: 16,\n  borderBottomLeftRadius: 16,\n};\nconst exampleProps = { compact: true };\nconst exampleRenderer: React.FC<AnnotationProps> = (props) =>\n  props.width > 0 && props.height > 0 ? <Annotation {...props} /> : null;\n\nexport default function AnnotationTile() {\n  return (\n    <GalleryTile<AnnotationProps>\n      title=\"Annotation\"\n      description=\"<Annotation />\"\n      exampleRenderer={exampleRenderer}\n      exampleUrl=\"/annotation\"\n      detailsStyles={detailsStyles}\n      tileStyles={tileStyles}\n      exampleProps={exampleProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/AreaTile.tsx",
    "content": "import React from 'react';\nimport type { AreaProps } from '../../sandboxes/visx-area/Example';\nimport Area, { accentColor, background } from '../../sandboxes/visx-area/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-area/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: accentColor };\n\nexport default function AreaTile() {\n  return (\n    <GalleryTile<AreaProps>\n      title=\"AreaClosed\"\n      description=\"<Shape.AreaClosed />\"\n      exampleRenderer={Area}\n      exampleUrl=\"/areas\"\n      detailsStyles={detailsStyles}\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/AxisTile.tsx",
    "content": "import React from 'react';\nimport type { AxisProps } from '../../sandboxes/visx-axis/Example';\nimport Axis, { backgroundColor, labelColor } from '../../sandboxes/visx-axis/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-axis/package.json';\n\nconst tileStyles = { backgroundColor };\nconst detailsStyles = { color: labelColor };\nconst exampleProps = { showControls: false };\n\nexport default function AxisTile() {\n  return (\n    <GalleryTile<AxisProps>\n      title=\"Axes & scales\"\n      description=\"<Axis.AxisBottom />\"\n      detailsStyles={detailsStyles}\n      detailsHeight={20}\n      exampleProps={exampleProps}\n      exampleRenderer={Axis}\n      exampleUrl=\"/axis\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/BarGroupHorizontalTile.tsx",
    "content": "import React from 'react';\nimport type { BarGroupHorizontalProps } from '../../sandboxes/visx-bargroup-horizontal/Example';\nimport BarGroupHorizontal, {\n  background,\n  green,\n} from '../../sandboxes/visx-bargroup-horizontal/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-bargroup-horizontal/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: green };\nconst exampleProps = { margin: { top: 20, bottom: 70, left: 50, right: 20 } };\n\nexport default function BarGroupHorizontalTile() {\n  return (\n    <GalleryTile<BarGroupHorizontalProps>\n      title=\"Bar Group Horizontal\"\n      description=\"<Shape.BarGroupHorizontal />\"\n      detailsStyles={detailsStyles}\n      exampleProps={exampleProps}\n      exampleRenderer={BarGroupHorizontal}\n      exampleUrl=\"/bargrouphorizontal\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/BarGroupTile.tsx",
    "content": "import React from 'react';\nimport type { BarGroupProps } from '../../sandboxes/visx-bargroup/Example';\nimport BarGroup, { background, green } from '../../sandboxes/visx-bargroup/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-bargroup/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: green };\n\nexport default function BarGroupTile() {\n  return (\n    <GalleryTile<BarGroupProps>\n      title=\"Bar Group\"\n      description=\"<Shape.BarGroup />\"\n      detailsStyles={detailsStyles}\n      exampleRenderer={BarGroup}\n      exampleUrl=\"/bargroup\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/BarStackHorizontalTile.tsx",
    "content": "import React from 'react';\nimport type { BarStackHorizontalProps } from '../../sandboxes/visx-barstack-horizontal/Example';\nimport BarStackHorizontal, {\n  background,\n  purple3,\n} from '../../sandboxes/visx-barstack-horizontal/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-barstack-horizontal/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: purple3, zIndex: 1 };\n\nexport default function BarStackHorizontalTile() {\n  return (\n    <GalleryTile<BarStackHorizontalProps>\n      title=\"Bar Stack Horizontal\"\n      description=\"<Shape.BarStackHorizontal />\"\n      detailsStyles={detailsStyles}\n      exampleRenderer={BarStackHorizontal}\n      exampleUrl=\"/barstackhorizontal\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/BarStackTile.tsx",
    "content": "import React from 'react';\nimport type { BarStackProps } from '../../sandboxes/visx-barstack/Example';\nimport BarStack, { background, purple3 } from '../../sandboxes/visx-barstack/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-barstack/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: purple3, zIndex: 1 };\n\nexport default function BarStackTile() {\n  return (\n    <GalleryTile<BarStackProps>\n      title=\"Bar Stack\"\n      description=\"<Shape.BarStack />\"\n      detailsStyles={detailsStyles}\n      exampleRenderer={BarStack}\n      exampleUrl=\"/barstack\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/BarsTile.tsx",
    "content": "import React from 'react';\nimport type { BarsProps } from '../../sandboxes/visx-bars/Example';\nimport Bars from '../../sandboxes/visx-bars/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-bars/package.json';\n\nconst tileStyles = { background: '#5290e7' };\nconst detailsStyles = { color: 'rgba(25, 231, 217, 1)' };\n\nexport default function BarsTile() {\n  return (\n    <GalleryTile<BarsProps>\n      title=\"Bars\"\n      description=\"<Shape.Bar />\"\n      exampleRenderer={Bars}\n      exampleUrl=\"/bars\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/BrushTile.tsx",
    "content": "import React from 'react';\nimport type { BrushProps } from '../../sandboxes/visx-brush/Example';\nimport Brush, { background, accentColor } from '../../sandboxes/visx-brush/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-brush/package.json';\n\nconst tileStyles = { border: `1px solid ${accentColor}` };\nconst detailsStyles = { color: background };\nconst exampleProps = { compact: true, margin: { top: 10, left: 50, bottom: 60, right: 20 } };\n\nexport default function BrushTile() {\n  return (\n    <GalleryTile<BrushProps>\n      title=\"Brush\"\n      description=\"<Brush />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Brush}\n      exampleUrl=\"/brush\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/ChordTile.tsx",
    "content": "import React from 'react';\nimport type { ChordProps } from '../../sandboxes/visx-chord/Example';\nimport Chord from '../../sandboxes/visx-chord/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-chord/package.json';\n\nconst tileStyles = { background: '#e4e3d8' };\nconst detailsStyles = { color: '#111' };\n\nexport default function ChordTile() {\n  return (\n    <GalleryTile<ChordProps>\n      title=\"Chord\"\n      description=\"<Chord.Chord /> & <Chord.Ribbon />\"\n      exampleRenderer={Chord}\n      exampleUrl=\"/chord\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/CurvesTile.tsx",
    "content": "import React from 'react';\nimport type { CurveProps } from '../../sandboxes/visx-curve/Example';\nimport Curve from '../../sandboxes/visx-curve/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-curve/package.json';\n\nconst tileStyles = { border: '1px solid lightgray' };\nconst detailsStyles = { color: '#222' };\nconst exampleProps = { showControls: false };\n\nexport default function CurvesTile() {\n  return (\n    <GalleryTile<CurveProps>\n      title=\"Curves\"\n      description=\"<Curve.* /> <Shape.Line />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Curve}\n      exampleUrl=\"/curves\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/DelaunayTriangulationTile.tsx",
    "content": "import React from 'react';\nimport type { DelaunayTriangulationProps } from '../../sandboxes/visx-delaunay-triangulation/Example';\nimport Delaunay from '../../sandboxes/visx-delaunay-triangulation/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-delaunay-triangulation/package.json';\n\nconst tileStyles = {\n  background: 'black',\n  borderRadius: 14,\n  boxShadow: 'rgba(0, 0, 0, 0.1) 0px 1px 6px',\n};\nconst detailsStyles = { background: 'white', color: '#5B247A', borderRadius: '0 0 14px 14px' };\n\nexport default function DelaunayTriangulationTile() {\n  return (\n    <GalleryTile<DelaunayTriangulationProps>\n      title=\"Delaunay Triangulation\"\n      description=\"<Delaunay.Polygon />\"\n      exampleRenderer={Delaunay}\n      exampleUrl=\"/delaunay-triangulation\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/DelaunayVoronoiTile.tsx",
    "content": "import React from 'react';\nimport type { VoronoiProps } from '../../sandboxes/visx-delaunay-voronoi/Example';\nimport Voronoi from '../../sandboxes/visx-delaunay-voronoi/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-delaunay-voronoi/package.json';\n\nconst tileStyles = {\n  background: '#eb6d88',\n  borderRadius: 14,\n  boxShadow: 'rgba(0, 0, 0, 0.1) 0px 1px 6px',\n};\nconst detailsStyles = { background: 'white', color: '#eb6d88', borderRadius: '0 0 14px 14px' };\n\nexport default function DelaunayTile() {\n  return (\n    <GalleryTile<VoronoiProps>\n      title=\"Voronoi Overlay\"\n      description=\"<Delaunay.Polygon />\"\n      exampleRenderer={Voronoi}\n      exampleUrl=\"/delaunay-voronoi\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/DendrogramsTile.tsx",
    "content": "import React from 'react';\nimport type { DendrogramProps } from '../../sandboxes/visx-dendrogram/Example';\nimport Dendrogram, { background, green } from '../../sandboxes/visx-dendrogram/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-dendrogram/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: green };\nconst exampleProps = { margin: { top: 40, left: 0, right: 0, bottom: 90 } };\n\nexport default function DendrogramsTile() {\n  return (\n    <GalleryTile<DendrogramProps>\n      title=\"Dendrograms\"\n      description=\"<Hierarchy.Cluster /> + <Shape.LinkVertical />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Dendrogram}\n      exampleUrl=\"/dendrograms\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/DotsTile.tsx",
    "content": "import React from 'react';\nimport type { DotsProps } from '../../sandboxes/visx-dots/Example';\nimport Dots from '../../sandboxes/visx-dots/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-dots/package.json';\n\nconst tileStyles = { background: '#fd6e7f' };\nconst detailsStyles = { color: '#f6c431' };\nconst exampleProps = { showControls: false };\n\nexport default function DotsTile() {\n  return (\n    <GalleryTile<DotsProps>\n      title=\"Dots\"\n      description=\"<Shape.Circle />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Dots}\n      exampleUrl=\"/dots\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/DragIITile.tsx",
    "content": "import React from 'react';\nimport type { DragIIProps } from '../../sandboxes/visx-drag-ii/Example';\nimport DragII from '../../sandboxes/visx-drag-ii/Example';\nimport GalleryTile from '../GalleryTile';\nimport drawData from '../util/drawData';\n\nexport { default as packageJson } from '../../sandboxes/visx-drag-ii/package.json';\n\nconst tileStyles = { background: '#04002b', borderRadius: 14 };\nconst detailsStyles = { color: '#ff614e', zIndex: 1 };\nconst exampleProps = { data: drawData };\n\nexport default function DragIITile() {\n  return (\n    <GalleryTile<DragIIProps>\n      title=\"Drag ii\"\n      description=\"<Drag.Drag />\"\n      exampleProps={exampleProps}\n      exampleRenderer={DragII}\n      exampleUrl=\"/drag-ii\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/DragITile.tsx",
    "content": "import React from 'react';\nimport type { DragIProps } from '../../sandboxes/visx-drag-i/Example';\nimport DragI from '../../sandboxes/visx-drag-i/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-drag-i/package.json';\n\nconst tileStyles = { background: '#c4c3cb', borderRadius: 14 };\nconst detailsStyles = { color: '#6437d6', zIndex: 1 };\n\nexport default function DragITile() {\n  return (\n    <GalleryTile<DragIProps>\n      title=\"Drag i\"\n      description=\"<Drag.Drag />\"\n      exampleRenderer={DragI}\n      exampleUrl=\"/drag-i\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/GeoAlbersUsaTile.tsx",
    "content": "import React from 'react';\nimport type { GeoAlbersUsaProps } from '../../sandboxes/visx-geo-albers-usa/Example';\nimport GeoAlbersUsa, { background, colors } from '../../sandboxes/visx-geo-albers-usa/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-geo-albers-usa/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: colors[1] };\n\nexport default function GeoAlbersUsaTile() {\n  return (\n    <GalleryTile<GeoAlbersUsaProps>\n      title=\"AlbersUsa\"\n      description=\"<Geo.AlbersUsa />\"\n      exampleProps={{ fullSize: false }}\n      exampleRenderer={GeoAlbersUsa}\n      exampleUrl=\"/geo-albers-usa\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/GeoCustomTile.tsx",
    "content": "import React from 'react';\nimport type { GeoCustomProps } from '../../sandboxes/visx-geo-custom/Example';\nimport GeoCustom, { background } from '../../sandboxes/visx-geo-custom/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-geo-custom/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: '#019ece' };\nconst exampleProps = { events: false };\n\nexport default function GeoCustomTile() {\n  return (\n    <GalleryTile<GeoCustomProps>\n      title=\"Custom Projection\"\n      description=\"<Geo.CustomProjection />\"\n      exampleProps={exampleProps}\n      exampleRenderer={GeoCustom}\n      exampleUrl=\"/geo-custom\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/GeoMercatorTile.tsx",
    "content": "import React from 'react';\nimport type { GeoMercatorProps } from '../../sandboxes/visx-geo-mercator/Example';\nimport GeoMercator, { background } from '../../sandboxes/visx-geo-mercator/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-geo-mercator/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: '#f63a48' };\n\nexport default function GeoMercatorTile() {\n  return (\n    <GalleryTile<GeoMercatorProps>\n      title=\"Mercator\"\n      description=\"<Geo.Mercator />\"\n      exampleRenderer={GeoMercator}\n      exampleUrl=\"/geo-mercator\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/GlyphsTile.tsx",
    "content": "import React from 'react';\nimport type { GlyphProps } from '../../sandboxes/visx-glyph/Example';\nimport Glyph, { primaryColor, secondaryColor } from '../../sandboxes/visx-glyph/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-glyph/package.json';\n\nconst tileStyles = { background: secondaryColor };\nconst detailsStyles = { color: primaryColor };\nconst exampleProps = { margin: { top: 30, left: 10, right: 10, bottom: 80 } };\n\nexport default function GlyphsTile() {\n  return (\n    <GalleryTile<GlyphProps>\n      title=\"Glyphs\"\n      description=\"<Glyph.GlyphDot />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Glyph}\n      exampleUrl=\"/glyphs\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/GradientsTile.tsx",
    "content": "import React from 'react';\nimport type { GradientProps } from '../../sandboxes/visx-gradient/Example';\nimport Gradient from '../../sandboxes/visx-gradient/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-gradient/package.json';\n\nconst tileStyles = { background: 'white', boxShadow: '0 1px 6px rgba(0,0,0,0.1)' };\nconst detailsStyles = { color: '#333' };\n\nexport default function GradientsTile() {\n  return (\n    <GalleryTile<GradientProps>\n      title=\"Gradients\"\n      description=\"<Gradient.LinearGradient /> <Gradient.RadialGradient />\"\n      detailsStyles={detailsStyles}\n      exampleRenderer={Gradient}\n      exampleUrl=\"/gradients\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/HeatmapsTile.tsx",
    "content": "import React from 'react';\nimport type { HeatmapProps } from '../../sandboxes/visx-heatmap/Example';\nimport Heatmap, { background } from '../../sandboxes/visx-heatmap/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-heatmap/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: 'rgba(255,255,255,0.3)' };\n\nexport default function HeatmapsTile() {\n  return (\n    <GalleryTile<HeatmapProps>\n      title=\"Heatmaps\"\n      description=\"<HeatmapCircle /> & <HeatmapRect />\"\n      exampleRenderer={Heatmap}\n      exampleUrl=\"/heatmaps\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/LegendsTile.tsx",
    "content": "import React from 'react';\nimport Legends from '../../sandboxes/visx-legend/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-legend/package.json';\n\nconst tileStyles = { background: 'black' };\nconst detailsStyles = { color: '#aaa' };\n\nexport default function LegendsTile() {\n  return (\n    <GalleryTile<any>\n      title=\"Legends\"\n      description=\"<Legend />\"\n      exampleRenderer={Legends}\n      exampleUrl=\"/legends\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/LineRadialTile.tsx",
    "content": "import React from 'react';\nimport type { LineRadialProps } from '../../sandboxes/visx-shape-line-radial/Example';\nimport LineRadial, { background, blue } from '../../sandboxes/visx-shape-line-radial/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-shape-line-radial/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: blue };\nconst exampleProps = { animate: false };\n\nexport default function LineRadialTile() {\n  return (\n    <GalleryTile<LineRadialProps>\n      title=\"Radial Lines\"\n      description=\"<Shape.LineRadial />\"\n      exampleProps={exampleProps}\n      exampleRenderer={LineRadial}\n      exampleUrl=\"/lineradial\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/LinkTypesTile.tsx",
    "content": "import React from 'react';\nimport type { LinkTypesProps } from '../../sandboxes/visx-linktypes/Example';\nimport LinkTypes from '../../sandboxes/visx-linktypes/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-linktypes/package.json';\n\nconst tileStyles = { background: '#272b4d' };\nconst detailsStyles = { color: '#269688' };\n\nexport default function LinkTypesTile() {\n  return (\n    <GalleryTile<LinkTypesProps>\n      title=\"Link Types\"\n      description=\"<Shape.Link* />\"\n      exampleRenderer={LinkTypes}\n      exampleUrl=\"/linktypes\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/NetworkTile.tsx",
    "content": "import React from 'react';\nimport type { NetworkProps } from '../../sandboxes/visx-network/Example';\nimport Network, { background } from '../../sandboxes/visx-network/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-network/package.json';\n\nconst tileStyles = { background };\n\nexport default function NetworkTile() {\n  return (\n    <GalleryTile<NetworkProps>\n      title=\"Network\"\n      description=\"<Network.Graph />\"\n      exampleRenderer={Network}\n      exampleUrl=\"/network\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/PackTile.tsx",
    "content": "import React from 'react';\nimport type { PackProps } from '../../sandboxes/visx-pack/Example';\nimport Pack from '../../sandboxes/visx-pack/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-pack/package.json';\n\nconst tileStyles = { background: 'white', boxShadow: 'rgba(0, 0, 0, 0.1) 0px 1px 6px' };\nconst detailsStyles = { color: '#fd6c6f' };\n\nexport default function PackTile() {\n  return (\n    <GalleryTile<PackProps>\n      title=\"Pack\"\n      description=\"<Hierarchy.Pack />\"\n      exampleRenderer={Pack}\n      exampleUrl=\"/pack\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/PatternsTile.tsx",
    "content": "import React from 'react';\nimport type { PatternProps } from '../../sandboxes/visx-pattern/Example';\nimport Patterns from '../../sandboxes/visx-pattern/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-pattern/package.json';\n\nconst tileStyles = { background: '#f5f2e3' };\nconst detailsStyles = { color: '#333' };\n\nexport default function PatternsTile() {\n  return (\n    <GalleryTile<PatternProps>\n      title=\"Patterns\"\n      description=\"<Pattern />\"\n      exampleRenderer={Patterns}\n      exampleUrl=\"/patterns\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/PiesTile.tsx",
    "content": "import React from 'react';\nimport type { PieProps } from '../../sandboxes/visx-shape-pie/Example';\nimport Pie from '../../sandboxes/visx-shape-pie/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-shape-pie/package.json';\n\nconst tileStyles = { background: '#7f82e3' };\nconst detailsStyles = { color: 'rgb(93,30,91)' };\nconst exampleProps = { animate: false, margin: { top: 20, right: 20, bottom: 80, left: 20 } };\n\nexport default function PiesTile() {\n  return (\n    <GalleryTile<PieProps>\n      title=\"Pies & donuts\"\n      description=\"<Shape.Pie />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Pie}\n      exampleUrl=\"/pies\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/PolygonsTile.tsx",
    "content": "import React from 'react';\nimport type { PolygonProps } from '../../sandboxes/visx-polygons/Example';\nimport Polygon, { background } from '../../sandboxes/visx-polygons/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-polygons/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: 'white' };\nconst exampleProps = { margin: { top: 10, right: 0, bottom: 76, left: 0 } };\n\nexport default function PolygonsTile() {\n  return (\n    <GalleryTile<PolygonProps>\n      title=\"Polygons\"\n      description=\"<Shape.Polygon />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Polygon}\n      exampleUrl=\"/polygons\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/RadarTile.tsx",
    "content": "import React from 'react';\nimport type { RadarProps } from '../../sandboxes/visx-radar/Example';\nimport Radar, { background, pumpkin } from '../../sandboxes/visx-radar/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-radar/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: pumpkin };\n\nexport default function RadarTile() {\n  return (\n    <GalleryTile<RadarProps>\n      title=\"Radar\"\n      description=\"<Shape.Line /> + <Shape.LineRadial />\"\n      exampleRenderer={Radar}\n      exampleUrl=\"/radar\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/RadialBarsTile.tsx",
    "content": "import React from 'react';\nimport type { RadialBarsProps } from '../../sandboxes/visx-radial-bars/Example';\nimport RadialBars from '../../sandboxes/visx-radial-bars/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-radial-bars/package.json';\n\nconst tileStyles = { background: '#3dbdb1' };\nconst detailsStyles = { color: '#93F9B9' };\nconst exampleProps = { showControls: false };\n\nexport default function BarsTile() {\n  return (\n    <GalleryTile<RadialBarsProps>\n      title=\"Radial Bars\"\n      description=\"<Shape.Arc />\"\n      exampleProps={exampleProps}\n      exampleRenderer={RadialBars}\n      exampleUrl=\"/radial-bars\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/ResponsiveTile.tsx",
    "content": "import React from 'react';\nimport type { ResponsiveProps } from '../../sandboxes/visx-responsive/Example';\nimport Responsive from '../../sandboxes/visx-responsive/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-responsive/package.json';\n\nconst tileStyles = { background: 'white' };\nconst detailsStyles = {\n  color: '#232323',\n  zIndex: 1,\n  border: '1px solid lightgray',\n  borderTop: 'none',\n  borderBottomLeftRadius: '14px',\n  borderBottomRightRadius: '14px',\n};\n\nexport default function ResponsiveTile() {\n  return (\n    <GalleryTile<ResponsiveProps>\n      title=\"Responsive\"\n      description=\"<Responsive.ParentSize />\"\n      exampleRenderer={Responsive}\n      exampleUrl=\"/responsive\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/SankeyTile.tsx",
    "content": "import React from 'react';\nimport type { SankeyDemoProps } from '../../sandboxes/visx-sankey/Example';\nimport Sankey, { background, color } from '../../sandboxes/visx-sankey/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-sankey/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color };\nconst exampleProps = { showControls: false };\n\nexport default function SankeyTile() {\n  return (\n    <GalleryTile<SankeyDemoProps>\n      title=\"Sankey\"\n      description=\"<Sankey.Sankey />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Sankey}\n      exampleUrl=\"/sankey\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/SplitLinePathTile.tsx",
    "content": "import React from 'react';\nimport type { SplitLinePathExampleProps } from '../../sandboxes/visx-shape-splitlinepath/Example';\nimport SplitLinePathExample, {\n  backgroundLight,\n} from '../../sandboxes/visx-shape-splitlinepath/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-shape-splitlinepath/package.json';\n\nconst tileStyles = { background: backgroundLight };\nconst detailsStyles = { color: 'white' };\n\nexport default function SplitLinePathTile() {\n  return (\n    <GalleryTile<SplitLinePathExampleProps>\n      title=\"SplitLinePath\"\n      description=\"<Shape.SplitLinePath />\"\n      exampleRenderer={SplitLinePathExample}\n      exampleUrl=\"/splitlinepath\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n      detailsHeight={0}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/StackedAreasTile.tsx",
    "content": "import React from 'react';\nimport type { StackedAreasProps } from '../../sandboxes/visx-stacked-areas/Example';\nimport StackedAreas, { background } from '../../sandboxes/visx-stacked-areas/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-stacked-areas/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: 'rgba(251, 224, 137, 1.000)' };\n\nexport default function StackedAreasTile() {\n  return (\n    <GalleryTile<StackedAreasProps>\n      title=\"Stacked Areas\"\n      description=\"<Shape.AreaStack />\"\n      detailsStyles={detailsStyles}\n      exampleRenderer={StackedAreas}\n      exampleUrl=\"/stacked-areas\"\n      tileStyles={tileStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/StatsPlotTile.tsx",
    "content": "import React from 'react';\nimport type { StatsPlotProps } from '../../sandboxes/visx-stats/Example';\nimport StatsPlot from '../../sandboxes/visx-stats/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-stats/package.json';\n\nconst tileStyles = { background: '#8a88e3' };\nconst detailsStyles = { color: '#ffffff', zIndex: 1 };\n\nexport default function StatsPlotTile() {\n  return (\n    <GalleryTile<StatsPlotProps>\n      title=\"Stats Plots\"\n      description=\"<BoxPlot /> & <ViolinPlot />\"\n      exampleRenderer={StatsPlot}\n      exampleUrl=\"/statsplot\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/StreamGraphTile.tsx",
    "content": "import React from 'react';\nimport type { StreamGraphProps } from '../../sandboxes/visx-streamgraph/Example';\nimport StreamGraph, { BACKGROUND as background } from '../../sandboxes/visx-streamgraph/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-streamgraph/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: 'rgb(93,30,91)' };\nconst exampleProps = { animate: false };\n\nexport default function StreamGraphTile() {\n  return (\n    <GalleryTile<StreamGraphProps>\n      title=\"Streamgraph\"\n      description=\"<Shape.Stack />\"\n      exampleProps={exampleProps}\n      exampleRenderer={StreamGraph}\n      exampleUrl=\"/streamgraph\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/TextTile.tsx",
    "content": "import React from 'react';\nimport GalleryTile from '../GalleryTile';\n\nexport const packageJson = {\n  name: '@visx/demo-text',\n  dependencies: { '@visx/text': 'current' },\n};\n\nconst tileStyles = { background: 'white', border: '1px solid lightgray', borderRadius: '14px' };\nconst detailsStyles = { color: '#232323', zIndex: 1 };\nfunction Text() {\n  return (\n    <>\n      <div className=\"text-demo\">Flexible SVG Text</div>\n      <style jsx>{`\n        .text-demo {\n          height: 100%;\n          font-size: 64px;\n          font-weight: bold;\n          display: flex;\n          justify-content: center;\n          align-items: center;\n          flex: 1;\n          line-height: 1em;\n          padding: 1rem;\n        }\n      `}</style>\n    </>\n  );\n}\n\nexport default function TextTile() {\n  return (\n    <GalleryTile<any>\n      title=\"Text\"\n      description=\"<Text.Text />\"\n      exampleRenderer={Text}\n      exampleUrl=\"/text\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/ThresholdTile.tsx",
    "content": "import React from 'react';\nimport type { ThresholdProps } from '../../sandboxes/visx-threshold/Example';\nimport Threshold, { background } from '../../sandboxes/visx-threshold/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-threshold/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: '#111' };\nconst exampleProps = { margin: { top: 40, left: 40, right: 20, bottom: 30 } };\n\nexport default function ThresholdTile() {\n  return (\n    <GalleryTile<ThresholdProps>\n      title=\"Area difference chart\"\n      description=\"<Threshold />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Threshold}\n      exampleUrl=\"/threshold\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/TooltipTile.tsx",
    "content": "import React from 'react';\nimport type { TooltipProps } from '../../sandboxes/visx-tooltip/Example';\nimport Tooltip from '../../sandboxes/visx-tooltip/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-tooltip/package.json';\n\nconst exampleProps = { showControls: false };\nconst detailsStyles = {\n  background: 'white',\n  color: 'rgba(53,71,125,1)',\n};\n\nexport default function DotsTile() {\n  return (\n    <GalleryTile<TooltipProps>\n      title=\"Tooltip\"\n      description=\"<Tooltip /> + <Portal />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Tooltip}\n      exampleUrl=\"/tooltip\"\n      detailsStyles={detailsStyles}\n      detailsHeight={0}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/TreemapTile.tsx",
    "content": "import React from 'react';\nimport type { TreemapProps } from '../../sandboxes/visx-treemap/Example';\nimport Treemap, { background, color1 } from '../../sandboxes/visx-treemap/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-treemap/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: color1 };\nconst exampleProps = { margin: { top: 0, left: 10, right: 10, bottom: 76 } };\n\nexport default function TreemapTile() {\n  return (\n    <GalleryTile<TreemapProps>\n      title=\"Treemap\"\n      description=\"<Hierarchy.Treemap />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Treemap}\n      exampleUrl=\"/treemap\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/TreesTile.tsx",
    "content": "import React from 'react';\nimport type { TreeProps } from '../../sandboxes/visx-tree/Example';\nimport Tree, { background } from '../../sandboxes/visx-tree/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-tree/package.json';\n\nconst tileStyles = { background };\nconst detailsStyles = { color: '#269688' };\nconst exampleProps = { margin: { top: 10, left: 30, right: 40, bottom: 76 } };\n\nexport default function TreesTile() {\n  return (\n    <GalleryTile<TreeProps>\n      title=\"Trees\"\n      description=\"<Hierarchy.Tree /> + <Shape.LinkHorizontal />\"\n      exampleProps={exampleProps}\n      exampleRenderer={Tree}\n      exampleUrl=\"/trees\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/VoronoiTile.tsx",
    "content": "import React from 'react';\nimport type { VoronoiProps } from '../../sandboxes/visx-voronoi/Example';\nimport Voronoi from '../../sandboxes/visx-voronoi/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-voronoi/package.json';\n\nconst tileStyles = {\n  background: '#eb6d88',\n  borderRadius: 14,\n  boxShadow: 'rgba(0, 0, 0, 0.1) 0px 1px 6px',\n};\nconst detailsStyles = { background: 'white', color: '#eb6d88', borderRadius: '0 0 14px 14px' };\n\nexport default function VoronoiTile() {\n  return (\n    <GalleryTile<VoronoiProps>\n      title=\"Voronoi overlay\"\n      description=\"<Voronoi.VoronoiPolygon />\"\n      exampleRenderer={Voronoi}\n      exampleUrl=\"/voronoi\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/WordcloudTile.tsx",
    "content": "import React from 'react';\nimport Wordcloud from '../../sandboxes/visx-wordcloud/Example';\nimport type { WidthAndHeight } from '../../types';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-wordcloud/package.json';\n\nconst tileStyles = { background: '#e4e3d8' };\nconst detailsStyles = { color: '#111' };\nconst renderer = (size: WidthAndHeight) => <Wordcloud width={size.width} height={size.height} />;\n\nexport default function WordcloudTile() {\n  return (\n    <GalleryTile\n      title=\"Wordcloud\"\n      description=\"<Wordcloud />\"\n      exampleRenderer={renderer}\n      exampleUrl=\"/wordcloud\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n      detailsHeight={0}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/XYChartTile.tsx",
    "content": "import React from 'react';\nimport type { XYChartProps } from '../../sandboxes/visx-xychart/Example';\nimport XYChart from '../../sandboxes/visx-xychart/Example';\nimport GalleryTile from '../GalleryTile';\n\nfunction XYChartWrapper(props) {\n  if (typeof window === 'undefined') return null;\n  return <XYChart {...props} />;\n}\n\nexport { default as packageJson } from '../../sandboxes/visx-xychart/package.json';\n\nconst tileStyles = { background: '#222' };\n\nexport default function XYChartITile() {\n  return (\n    <GalleryTile<XYChartProps>\n      title=\"XYChart\"\n      description=\"<XYChart />\"\n      exampleRenderer={XYChartWrapper}\n      exampleUrl=\"/xychart\"\n      tileStyles={tileStyles}\n      detailsHeight={0}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/ZoomITile.tsx",
    "content": "import React from 'react';\nimport type { ZoomIProps } from '../../sandboxes/visx-zoom-i/Example';\nimport ZoomI from '../../sandboxes/visx-zoom-i/Example';\nimport GalleryTile from '../GalleryTile';\n\nexport { default as packageJson } from '../../sandboxes/visx-zoom-i/package.json';\n\nconst tileStyles = { background: '#0a0a0a' };\nconst detailsStyles = { color: '#ccc' };\n\nexport default function ZoomITile() {\n  return (\n    <GalleryTile<ZoomIProps>\n      title=\"Zoom\"\n      description=\"<Zoom />\"\n      exampleRenderer={ZoomI}\n      exampleUrl=\"/zoom-i\"\n      tileStyles={tileStyles}\n      detailsStyles={detailsStyles}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Gallery/index.tsx",
    "content": "import React from 'react';\nimport Link from 'next/link';\nimport { useRouter } from 'next/router';\n\nimport * as AnnotationTile from './AnnotationTile';\nimport * as AreaTile from './AreaTile';\nimport * as AxisTile from './AxisTile';\nimport * as BarGroupHorizontalTile from './BarGroupHorizontalTile';\nimport * as BarGroupTile from './BarGroupTile';\nimport * as BarStackHorizontalTile from './BarStackHorizontalTile';\nimport * as BarStackTile from './BarStackTile';\nimport * as BarsTile from './BarsTile';\nimport * as BrushTile from './BrushTile';\nimport * as ChordTile from './ChordTile';\nimport * as CurvesTile from './CurvesTile';\nimport * as DelaunayTile from './DelaunayTriangulationTile';\nimport * as DelaunayVoronoiTile from './DelaunayVoronoiTile';\nimport * as DendrogramsTile from './DendrogramsTile';\nimport * as DotsTile from './DotsTile';\nimport * as DragIITile from './DragIITile';\nimport * as DragITile from './DragITile';\nimport * as GeoCustomTile from './GeoCustomTile';\nimport * as GeoAlbersUsaTile from './GeoAlbersUsaTile';\nimport * as GeoMercatorTile from './GeoMercatorTile';\nimport * as GlyphsTile from './GlyphsTile';\nimport * as GradientsTile from './GradientsTile';\nimport * as HeatmapsTile from './HeatmapsTile';\nimport * as LegendsTile from './LegendsTile';\nimport * as LineRadialTile from './LineRadialTile';\nimport * as LinkTypesTile from './LinkTypesTile';\nimport * as NetworkTile from './NetworkTile';\nimport * as PackTile from './PackTile';\nimport * as PatternsTile from './PatternsTile';\nimport * as PiesTile from './PiesTile';\nimport * as PolygonsTile from './PolygonsTile';\nimport * as RadarTile from './RadarTile';\nimport * as RadialBarsTile from './RadialBarsTile';\nimport * as ResponsiveTile from './ResponsiveTile';\nimport * as SankeyTile from './SankeyTile';\nimport * as SplitLinePathTile from './SplitLinePathTile';\nimport * as StackedAreasTile from './StackedAreasTile';\nimport * as StatsPlotTile from './StatsPlotTile';\nimport * as StreamGraphTile from './StreamGraphTile';\nimport * as TextTile from './TextTile';\nimport * as ThresholdTile from './ThresholdTile';\nimport * as TooltipTile from './TooltipTile';\nimport * as TreemapTile from './TreemapTile';\nimport * as TreesTile from './TreesTile';\nimport * as WordcloudTile from './WordcloudTile';\nimport * as XYChartTile from './XYChartTile';\nimport * as ZoomITile from './ZoomITile';\nimport type { VisxPackage } from '../../types';\nimport exampleToVisxDependencyLookup, {\n  visxPackages,\n} from '../../sandboxes/exampleToVisxDependencyLookup';\n\nexport const tiles = [\n  BarsTile,\n  DotsTile,\n  PatternsTile,\n  AreaTile,\n  TreemapTile,\n  ZoomITile,\n  StackedAreasTile,\n  AxisTile,\n  ChordTile,\n  StreamGraphTile,\n  LegendsTile,\n  CurvesTile,\n  ThresholdTile,\n  AnnotationTile,\n  LineRadialTile,\n  DragITile,\n  BarGroupTile,\n  BarGroupHorizontalTile,\n  PiesTile,\n  BrushTile,\n  BarStackTile,\n  BarStackHorizontalTile,\n  DelaunayTile,\n  DelaunayVoronoiTile,\n  DendrogramsTile,\n  DragIITile,\n  XYChartTile,\n  GeoCustomTile,\n  GeoAlbersUsaTile,\n  GeoMercatorTile,\n  GlyphsTile,\n  GradientsTile,\n  HeatmapsTile,\n  LinkTypesTile,\n  NetworkTile,\n  PackTile,\n  PolygonsTile,\n  RadarTile,\n  RadialBarsTile,\n  ResponsiveTile,\n  SankeyTile,\n  SplitLinePathTile,\n  StatsPlotTile,\n  TextTile,\n  TooltipTile,\n  TreesTile,\n  WordcloudTile,\n];\n\nexport default function Gallery() {\n  const router = useRouter();\n  const { pkg: routePackage } = router.query;\n\n  const filteredTiles = routePackage\n    ? tiles.filter((Tile) =>\n        exampleToVisxDependencyLookup[Tile.packageJson.name]?.has(routePackage as VisxPackage),\n      )\n    : tiles;\n\n  return (\n    <>\n      <div className=\"gallery\">\n        <div className=\"filters\">\n          <div className=\"filter-label\">Filter</div>\n          {visxPackages.map((visxPackage) => (\n            <Link\n              key={visxPackage}\n              href={{\n                pathname: '/gallery',\n                query: routePackage === visxPackage ? undefined : { pkg: visxPackage },\n              }}\n              className={`filter-button ${routePackage === visxPackage ? 'emphasize' : ''}`}\n            >\n              {`${visxPackage}`}\n            </Link>\n          ))}\n        </div>\n        <div className=\"grid\">\n          {filteredTiles.map((Tile, i) => (\n            /* eslint-disable react/jsx-pascal-case */\n            <Tile.default key={`tile-${i}`} />\n          ))}\n        </div>\n      </div>\n      <style jsx>{`\n        .gallery {\n          display: flex;\n          flex-direction: row;\n        }\n        .grid {\n          width: 100%;\n          display: grid;\n          grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));\n          overflow-x: hidden;\n          padding-bottom: 40px;\n        }\n        .tilt > a {\n          display: flex;\n          flex: 1;\n        }\n        .filters {\n          margin-right: 24px;\n          width: 150px;\n          flex-shrink: 0;\n          display: flex;\n          flex-direction: column;\n          align-items: flex-start;\n          a {\n            display: block;\n            cursor: pointer;\n            border: none;\n            outline: none;\n            background: transparent;\n            padding: 0;\n            margin: 4px 4px 8px 0;\n            font-size: 16px;\n            line-height: 1em;\n            &.emphasize {\n              font-weight: 600;\n            }\n          }\n        }\n        h6 {\n          margin: 0 4px 0 0;\n        }\n        .filter-label {\n          font-size: 14px;\n          font-weight: 600;\n        }\n        @media (min-width: 800px) {\n          .emphasize::before {\n            content: '';\n            padding-left: 4px;\n            border-left: 2px solid #fc2e1c;\n          }\n        }\n        @media (max-width: 800px) {\n          .gallery {\n            flex-direction: column;\n            min-width: 90vw;\n            max-width: 90vw;\n            margin: 0;\n          }\n          .filters {\n            display: flex;\n            flex-wrap: wrap;\n            width: 100%;\n            justify-content: center;\n          }\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/GalleryTile.tsx",
    "content": "import React, { useEffect, useRef, useState } from 'react';\nimport Link from 'next/link';\nimport { ParentSize } from '@visx/responsive';\nimport type { WidthAndHeight } from '../types';\n\ntype Props<ExampleProps extends WidthAndHeight> = {\n  description?: string;\n  detailsHeight?: number;\n  detailsStyles?: React.CSSProperties;\n  exampleRenderer: React.ComponentClass<ExampleProps> | React.FunctionComponent<ExampleProps>;\n  exampleProps?: Omit<ExampleProps, 'width' | 'height'> &\n    Partial<Pick<ExampleProps, 'width' | 'height'>>;\n  exampleUrl?: string;\n  tileStyles?: React.CSSProperties;\n  title?: string;\n};\n\nconst renderLinkWrapper = (url: string | undefined, node: React.ReactNode) =>\n  url ? (\n    <Link href={url} style={{ display: 'block', flex: 1, minWidth: 0, height: '100%' }}>\n      {node}\n    </Link>\n  ) : (\n    node\n  );\n\n/**\n * hook which returns if the ref was ever visible.\n * used for better perf/not rendering all tiles on load.\n */\nfunction useEverVisible() {\n  const ref = useRef<HTMLDivElement>(null);\n  const [everVisible, setIsVisible] = useState(false);\n\n  useEffect(() => {\n    const observer = new IntersectionObserver(\n      (entries) => {\n        entries.forEach((entry) => {\n          setIsVisible((visible) => visible || entry.isIntersecting);\n        });\n      },\n      {\n        root: null, // viewport is the root\n        threshold: 0.01,\n      },\n    );\n\n    let curr: HTMLDivElement;\n    if (ref.current) {\n      curr = ref.current;\n      observer.observe(ref.current);\n    }\n\n    return () => {\n      if (curr) {\n        observer.unobserve(curr);\n        observer.disconnect();\n      }\n    };\n  }, []);\n\n  return { everVisible, ref };\n}\n\nexport default function GalleryTile<ExampleProps extends WidthAndHeight>({\n  description,\n  detailsHeight = 76,\n  detailsStyles,\n  exampleProps,\n  exampleRenderer,\n  exampleUrl,\n  tileStyles,\n  title,\n}: Props<ExampleProps>) {\n  const { everVisible, ref } = useEverVisible();\n  return (\n    <>\n      {renderLinkWrapper(\n        exampleUrl,\n        <div ref={ref} className=\"gallery-tile\" style={tileStyles}>\n          <div className=\"image\">\n            {/** lazy render */}\n            {everVisible && (\n              <ParentSize>\n                {({ width, height }) =>\n                  React.createElement(exampleRenderer, {\n                    width,\n                    height: height + (title || description ? detailsHeight : 0),\n                    ...exampleProps,\n                  } as ExampleProps)\n                }\n              </ParentSize>\n            )}\n          </div>\n          {(title || description) && (\n            <div className=\"details\" style={detailsStyles}>\n              {title && <div className=\"title\">{title}</div>}\n              {description && (\n                <div className=\"description\">\n                  <pre>{description}</pre>\n                </div>\n              )}\n            </div>\n          )}\n        </div>,\n      )}\n      <style jsx>{`\n        h3 {\n          margin-top: 0;\n          margin-left: 40px;\n          margin-bottom: 0;\n        }\n        .gallery-tile {\n          background-color: white;\n          margin: 5px;\n          display: flex;\n          height: 390px;\n          flex: 1;\n          min-width: 300px;\n          flex-direction: column;\n          border-radius: 14px;\n          cursor: pointer;\n          text-decoration: none;\n          color: inherit;\n        }\n        .image {\n          flex: 1;\n          display: flex;\n          overflow: hidden;\n        }\n        .details {\n          text-align: center;\n          padding: 15px 20px;\n          color: #ffffff;\n        }\n        .title {\n          font-weight: 900;\n          line-height: 0.9rem;\n        }\n        .description {\n          font-weight: 300;\n          font-size: 14px;\n        }\n        pre {\n          margin: 0;\n          background-color: transparent;\n          min-width: unset;\n        }\n        @media (max-width: 960px) {\n          .gallery-tile {\n            min-width: 45%;\n          }\n        }\n        @media (max-width: 600px) {\n          .gallery-tile {\n            min-width: 100%;\n          }\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Logo.tsx",
    "content": "import React from 'react';\n\nfunction Logo() {\n  return (\n    <span>\n      visx\n      <style jsx>{`\n        span {\n          border: 1px solid #fff;\n          display: inline-block;\n          color: #fff;\n          font-weight: bold;\n          font-size: 11px;\n          padding: 5px 8px;\n        }\n      `}</style>\n    </span>\n  );\n}\nexport default Logo;\n"
  },
  {
    "path": "packages/visx-demo/src/components/Meta.tsx",
    "content": "import React from 'react';\nimport Head from 'next/head';\nimport Router from 'next/router';\nimport NProgress from 'nprogress';\n\nRouter.events.on('routeChangeStart', () => NProgress.start());\nRouter.events.on('routeChangeComplete', () => {\n  NProgress.done();\n});\nRouter.events.on('routeChangeError', () => NProgress.done());\n\nfunction Meta({ title = 'visualization components' }) {\n  return (\n    <div>\n      <Head>\n        <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\" />\n        <meta charSet=\"utf-8\" />\n        <meta\n          property=\"og:image\"\n          content=\"https://raw.githubusercontent.com/airbnb/visx/master/assets/x-hero.png\"\n        />\n        <meta property=\"og:image:type\" content=\"image/png\" />\n        <meta\n          property=\"og:image:secure_url\"\n          content=\"https://raw.githubusercontent.com/airbnb/visx/master/assets/x-hero.png\"\n        />\n        <meta\n          property=\"og:image:alt\"\n          content=\"a collection of expressive, low-level visualization primitives for React\"\n        />\n        <meta property=\"og:url\" content=\"https://airbnb.io/visx/\" />\n        <meta property=\"og:title\" content={`visx | ${title}`} />\n        <meta\n          property=\"og:description\"\n          content=\"a collection of expressive, low-level visualization primitives for React\"\n        />\n        <meta name=\"twitter:card\" content=\"summary_large_image\" />\n        <meta name=\"twitter:site\" content=\"@AirbnbEng\" />\n        <meta name=\"twitter:creator\" content=\"@hshoff\" />\n        <meta name=\"twitter:title\" content=\"visx\" />\n        <meta\n          name=\"twitter:description\"\n          content=\"a collection of expressive, low-level visualization primitives for React\"\n        />\n        <meta\n          name=\"twitter:image\"\n          content=\"https://raw.githubusercontent.com/airbnb/visx/master/assets/x-hero.png\"\n        />\n        <meta name=\"twitter:image:alt\" content=\"visx logo is an oversized X\" />\n        <title>{`visx | ${title}`}</title>\n        <link rel=\"shortcut icon\" type=\"image/png\" href=\"static/favicon.png\" />\n        <link rel=\"stylesheet\" href=\"static/prism/prism-funky.css\" />\n        <link rel=\"stylesheet\" href=\"static/prism/prism-line-numbers.css\" />\n      </Head>\n      <style jsx global>{`\n        body {\n          width: 100vw;\n          overflow-x: hidden;\n          font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Oxygen', 'Ubuntu',\n            'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;\n          background: #ffffff;\n          display: flex;\n          color: white;\n          padding: 0;\n          margin: 0;\n          font-size: 22px;\n          line-height: 1.5em;\n        }\n        #__next,\n        .wrapper {\n          position: relative;\n          display: flex;\n          -webkit-box-align: center;\n          align-items: center;\n          -webkit-box-pack: center;\n          justify-content: center;\n          max-width: 105rem;\n          margin: 0 auto;\n        }\n\n        .tilt {\n          display: flex;\n          flex: 1;\n          min-width: 33%;\n        }\n\n        .page-left {\n          display: flex;\n          flex: 4;\n          flex-direction: column;\n          padding: 0 2rem 2rem;\n          margin-bottom: 50px;\n          margin-top: 140px;\n        }\n\n        .page-left h2:first-child {\n          margin-top: 0;\n          padding-top: 4px;\n        }\n\n        .page-right {\n          display: flex;\n          flex: 3;\n          flex-direction: column;\n          color: white;\n          padding: 10px 2rem 2rem;\n          margin-top: 140px;\n        }\n\n        .page-right > ul {\n          display: flex;\n          flex-direction: column;\n          flex: 1;\n          font-family: 'Karla';\n          color: #000;\n        }\n\n        .page-right a {\n          font-size: 14px;\n        }\n\n        ol,\n        ul {\n          padding-left: 0;\n        }\n\n        blockquote {\n          margin-left: 0;\n        }\n\n        li {\n          list-style-type: none;\n        }\n\n        p {\n          margin: 1rem 0;\n        }\n\n        code {\n          font-family: 'Menlo', monospace;\n          font-weight: bold;\n          padding: 0.2rem 0.3rem;\n          background-color: #ebebeb;\n          line-height: 1.8em;\n          font-size: 14px;\n        }\n\n        h1 {\n          font-size: 54px;\n          display: block;\n          margin-bottom: 3rem;\n        }\n\n        h2 {\n          font-size: 19px;\n          margin-bottom: 0.2rem;\n          margin-top: 2rem;\n          display: block;\n        }\n\n        a {\n          color: #272727;\n          font-weight: 400;\n          text-decoration: none;\n        }\n\n        a:hover {\n          text-decoration: underline;\n        }\n\n        .logo {\n          background-image: url('/visx/static/favicon.png');\n          background-position: center;\n          background-size: cover;\n          height: 24px;\n          width: 24px;\n          background-repeat: no-repeat;\n        }\n\n        .item-bottom .codeblock {\n          margin: 1em 0px 0;\n        }\n\n        .visx-brush:hover {\n          cursor: move;\n        }\n\n        /* loading progress bar styles */\n        #nprogress {\n          pointer-events: none;\n        }\n\n        #nprogress .bar {\n          background: #fc2e1c;\n          position: fixed;\n          z-index: 1031;\n          top: 0;\n          left: 0;\n          width: 100%;\n          height: 2px;\n        }\n\n        #nprogress .peg {\n          display: block;\n          position: absolute;\n          right: 0px;\n          width: 100px;\n          height: 100%;\n          box-shadow: 0 0 10px #ff9300, 0 0 5px #ff9300;\n          opacity: 1;\n          transform: rotate(3deg) translate(0px, -4px);\n        }\n\n        svg {\n          user-select: none;\n          cursor: pointer;\n        }\n\n        .visx-heatmap-circle:hover,\n        .visx-heatmap-rect:hover {\n          stroke: white;\n          stroke-width: 1;\n        }\n\n        @media (max-width: 960px) {\n          .tilt {\n            min-width: 45%;\n          }\n        }\n\n        @media (max-width: 600px) {\n          .tilt {\n            min-width: 100%;\n          }\n          #home {\n            display: none;\n          }\n        }\n      `}</style>\n    </div>\n  );\n}\nexport default Meta;\n"
  },
  {
    "path": "packages/visx-demo/src/components/Nav.tsx",
    "content": "import React from 'react';\nimport Link from 'next/link';\nimport GithubButton from 'react-github-button';\n\nimport NavItem from './NavItem';\nimport Belo from './icons/Belo';\n\nfunction Nav() {\n  return (\n    <div className=\"nav\">\n      <div className=\"nav-inner wrapper\">\n        <Link href=\"/\">\n          <div className=\"belo\">\n            <Belo />\n          </div>\n        </Link>\n        <ul>\n          <NavItem id=\"home\" href=\"/\">\n            Home\n          </NavItem>\n          <NavItem href=\"/docs\">Docs</NavItem>\n          <NavItem href=\"/gallery\">Gallery</NavItem>\n        </ul>\n\n        <GithubButton type=\"stargazers\" namespace=\"airbnb\" repo=\"visx\" />\n      </div>\n\n      <style jsx>{`\n        .belo {\n          width: 32px;\n          height: 32px;\n          margin: 0 0.5rem;\n        }\n        .nav-inner {\n          width: 95vw;\n          margin: 0 auto;\n          display: flex;\n          flex-direction: row;\n          align-items: center;\n          justify-content: center;\n        }\n        .nav {\n          display: flex;\n          flex-direction: row;\n          flex: 1;\n          align-items: center;\n          justify-content: center;\n          padding: 0.5rem 1rem;\n          font-size: 16px;\n          z-index: 3;\n          position: fixed;\n          top: 0;\n          left: 0;\n          right: 0;\n          margin: 0;\n          background: #ffffff;\n        }\n        ul {\n          list-style-type: none;\n          display: flex;\n          flex: 1;\n          flex-direction: row;\n          padding: 0;\n          margin: 0;\n          color: white;\n          justify-content: flex-start;\n          align-items: center;\n        }\n        .x-logo {\n          width: 36px;\n          height: 36px;\n          margin-right: 1rem;\n          background-image: url('static/x-24.svg');\n        }\n        @media (max-width: 600px) {\n          .github-buttons {\n            display: none;\n          }\n          .Item {\n            float: left;\n          }\n\n          .nav {\n            padding: 0;\n            padding-right: 1rem;\n          }\n\n          .nav-inner {\n            width: 99vw;\n          }\n        }\n      `}</style>\n    </div>\n  );\n}\nexport default Nav;\n"
  },
  {
    "path": "packages/visx-demo/src/components/NavItem.tsx",
    "content": "import React from 'react';\nimport Link from 'next/link';\n\ntype NavItemProps = {\n  href: string;\n  id?: string;\n  className?: string;\n  external?: boolean;\n  children: React.ReactNode;\n};\n\nfunction NavItem({ id, href, children, className, external }: NavItemProps) {\n  return (\n    <li className=\"Item\">\n      {external ? (\n        <a id={id} href={href} target=\"_blank\" rel=\"noopener noreferrer\" className={className}>\n          {children}\n        </a>\n      ) : (\n        <Link href={href} id={id} className={className}>\n          {children}\n        </Link>\n      )}\n\n      <style jsx>{`\n        .Item {\n          display: inline-block;\n          padding: 10px;\n          text-decoration: none;\n          color: #272727;\n          font-weight: 400;\n          font-size: 18px;\n        }\n        .Item .github {\n          font-weight: 600;\n          color: #fc2e1c;\n        }\n\n        @media (max-width: 600px) {\n          .Item {\n            display: block;\n            float: left;\n          }\n\n          .Item .github {\n            margin-top: 0;\n          }\n        }\n      `}</style>\n    </li>\n  );\n}\nexport default NavItem;\n"
  },
  {
    "path": "packages/visx-demo/src/components/NoSsr.tsx",
    "content": "import dynamic from 'next/dynamic';\nimport React from 'react';\n\nfunction NoSsr({ children }: { children: React.ReactNode }) {\n  // eslint-disable-next-line react/jsx-no-useless-fragment\n  return <>{children}</>;\n}\n\nexport default dynamic(() => Promise.resolve(NoSsr), {\n  ssr: false,\n});\n"
  },
  {
    "path": "packages/visx-demo/src/components/PackageList.tsx",
    "content": "import React from 'react';\nimport Link from 'next/link';\nimport cx from 'classnames';\nimport type { VisxPackage } from '../types';\n\nexport default function PackageList({\n  emphasizePackage,\n  compact,\n  grid,\n}: {\n  emphasizePackage?: VisxPackage;\n  compact?: boolean;\n  grid?: boolean;\n}) {\n  const HeaderElement = compact ? 'h6' : 'h3';\n  return (\n    <>\n      <div className=\"container\">\n        <div>\n          <HeaderElement>Chart primitives</HeaderElement>\n          <ul>\n            <li className={cx(emphasizePackage === 'annotation' && 'emphasize')}>\n              <Link href=\"/docs/annotation\">annotation</Link>\n              {!compact && <p>Annotate elements of a chart</p>}\n            </li>\n            <li className={cx(cx(emphasizePackage === 'axis' && 'emphasize'))}>\n              <Link href=\"/docs/axis\">axis</Link>\n              {!compact && <p>Annotate your coordinate system</p>}\n            </li>\n            <li className={cx(cx(emphasizePackage === 'curve' && 'emphasize'))}>\n              <Link href=\"/docs/curve\">curve</Link>\n              {!compact && <p>d3 line interpolators for @visx/shape</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'glyph' && 'emphasize')}>\n              <Link href=\"/docs/glyph\">glyph</Link>\n              {!compact && <p>Complex marks & symbols to be used in visuals</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'grid' && 'emphasize')}>\n              <Link href=\"/docs/grid\">grid</Link>\n              {!compact && <p>Grid lines for a chart</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'legend' && 'emphasize')}>\n              <Link href=\"/docs/legend\">legend</Link>\n              {!compact && <p>Make your visual encodings readable</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'marker' && 'emphasize')}>\n              <Link href=\"/docs/marker\">marker</Link>\n              {!compact && <p>Annotation lines with text</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'scale' && 'emphasize')}>\n              <Link href=\"/docs/scale\">scale</Link>\n              {!compact && <p>Map data to visual dimensions</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'shape' && 'emphasize')}>\n              <Link href=\"/docs/shape\">shape</Link>\n              {!compact && <p>Fundamental visualization shape primatives, the core of visx</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'tooltip' && 'emphasize')}>\n              <Link href=\"/docs/tooltip\">tooltip</Link>\n              {!compact && <p>Show details on demand</p>}\n            </li>\n          </ul>\n        </div>\n        <div>\n          <HeaderElement>Layouts & specialized</HeaderElement>\n          <ul>\n            <li className={cx(emphasizePackage === 'chord' && 'emphasize')}>\n              <Link href=\"/docs/chord\">chord</Link>\n              {!compact && <p>Radial layout for matrix relationships</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'geo' && 'emphasize')}>\n              <Link href=\"/docs/geo\">geo</Link>\n              {!compact && <p>Geographic projections</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'heatmap' && 'emphasize')}>\n              <Link href=\"/docs/heatmap\">heatmap</Link>\n              {!compact && <p>Represent data values using color</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'hierarchy' && 'emphasize')}>\n              <Link href=\"/docs/hierarchy\">hierarchy</Link>\n              {!compact && <p>Components to visualize hierarchical or nested data</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'network' && 'emphasize')}>\n              <Link href=\"/docs/network\">network</Link>\n              {!compact && <p>Visualize nodes and links between them</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'react-spring' && 'emphasize')}>\n              <Link href=\"/docs/react-spring\">react-spring</Link>\n              {!compact && <p>Animated visx primitives</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'sankey' && 'emphasize')}>\n              <Link href=\"/docs/sankey\">sankey</Link>\n              {!compact && <p>Components to visualize sankey charts</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'stats' && 'emphasize')}>\n              <Link href=\"/docs/stats\">stats</Link>\n              {!compact && <p>Common ways to visualize distributions</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'threshold' && 'emphasize')}>\n              <Link href=\"/docs/threshold\">threshold</Link>\n              {!compact && <p>Difference charts to compare the delta between two time series</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'wordcloud' && 'emphasize')}>\n              <Link href=\"/docs/wordcloud\">wordcloud</Link>\n              {!compact && <p>Visualize word frequency</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'xychart' && 'emphasize')}>\n              <Link href=\"/docs/xychart\">xychart</Link>\n              {!compact && (\n                <p>\n                  A chart-level API built on & integrated with several other visx building blocks\n                </p>\n              )}\n            </li>\n          </ul>\n        </div>\n        <div>\n          <HeaderElement>Interactions</HeaderElement>\n          <ul>\n            <li className={cx(emphasizePackage === 'brush' && 'emphasize')}>\n              <Link href=\"/docs/brush\">brush</Link>\n              {!compact && <p>Enable selection of a part of an interface</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'delaunay' && 'emphasize')}>\n              <Link href=\"/docs/delaunay\">delaunay</Link>\n              {!compact && <p>Partition points in a chart to improve user interaction</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'drag' && 'emphasize')}>\n              <Link href=\"/docs/drag\">drag</Link>\n              {!compact && <p>Make elements of an interface draggable</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'voronoi' && 'emphasize')}>\n              <Link href=\"/docs/voronoi\">voronoi</Link>\n              {!compact && <p>Partition points in a chart to improve user interaction</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'zoom' && 'emphasize')}>\n              <Link href=\"/docs/zoom\">zoom</Link>\n              {!compact && <p>Apply transforms to a viewport</p>}\n            </li>\n          </ul>\n        </div>\n        <div>\n          <HeaderElement>SVG utilities</HeaderElement>\n          <ul>\n            <li className={cx(emphasizePackage === 'clip-path' && 'emphasize')}>\n              <Link href=\"/docs/clip-path\">clip-path</Link>\n              {!compact && <p>Utilities for clip-path elements</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'event' && 'emphasize')}>\n              <Link href=\"/docs/event\">event</Link>\n              {!compact && (\n                <p>Utilities for computing svg coordinates from mouse or touch events</p>\n              )}\n            </li>\n            <li className={cx(emphasizePackage === 'group' && 'emphasize')}>\n              <Link href=\"/docs/group\">group</Link>\n              {!compact && <p>Simplified API for &lt;g /&gt; elements</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'gradient' && 'emphasize')}>\n              <Link href=\"/docs/gradient\">gradient</Link>\n              {!compact && <p>Utilities for making making color gradient definitions</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'pattern' && 'emphasize')}>\n              <Link href=\"/docs/pattern\">pattern</Link>\n              {!compact && <p>Utilities for creating pattern definitions</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'text' && 'emphasize')}>\n              <Link href=\"/docs/text\">text</Link>\n              {!compact && <p>An improved SVG Text component</p>}\n            </li>\n          </ul>\n        </div>\n        <div>\n          <HeaderElement>Data utilities</HeaderElement>\n          <ul>\n            <li className={cx(emphasizePackage === 'bounds' && 'emphasize')}>\n              <Link href=\"/docs/bounds\">bounds</Link>\n              {!compact && <p>Detect the bounding box of an element & its parent</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'mock-data' && 'emphasize')}>\n              <Link href=\"/docs/mock-data\">mock-data</Link>\n              {!compact && <p>Lots of mock data sets to play with</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'responsive' && 'emphasize')}>\n              <Link href=\"/docs/responsive\">responsive</Link>\n              {!compact && <p>Utilities to make responsive visualizations easy</p>}\n            </li>\n            <li className={cx(emphasizePackage === 'point' && 'emphasize')}>\n              <Link href=\"/docs/point\">point</Link>\n              {!compact && <p>A simple class to represent an x,y coordinate</p>}\n            </li>\n          </ul>\n        </div>\n        {compact && (\n          <div>\n            <HeaderElement>Umbrella package</HeaderElement>\n            <ul>\n              <li className={cx(emphasizePackage === 'visx' && 'emphasize')}>\n                <Link href=\"/docs/visx\">visx</Link>\n              </li>\n            </ul>\n          </div>\n        )}\n      </div>\n      <style jsx>{`\n        .container {\n          display: ${grid ? 'grid' : 'unset'};\n          grid-gap: 2em;\n          grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));\n        }\n        h6 {\n          margin: 1em 0 0;\n          line-height: 1.5em;\n        }\n        ul {\n          padding: 0;\n          margin-top: 0;\n          margin-bottom: 0;\n        }\n        li {\n          font-size: ${compact ? '16px' : undefined};\n          line-height: 1.5em;\n          background-color: ${compact ? undefined : '#f8f8f8'};\n          margin-bottom: ${compact ? 0 : '1em'};\n          width: 100%;\n          overflow: ellipsis;\n        }\n        li p {\n          margin: 0;\n          font-size: 11px;\n          line-height: 1.5em;\n        }\n        li a {\n          padding: 2px;\n        }\n        .emphasize a {\n          background-color: #fc2e1c;\n          color: white;\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/Page.tsx",
    "content": "import React from 'react';\nimport cx from 'classnames';\nimport Meta from './Meta';\nimport Nav from './Nav';\n\nfunction Page({\n  children,\n  title,\n  className,\n  wrapper = true,\n}: {\n  children: React.ReactNode;\n  title?: string;\n  className?: string | boolean;\n  wrapper?: boolean;\n}) {\n  return (\n    <div className={cx('main', { wrapper }, className)}>\n      <Meta title={title} />\n      <div className=\"nav-container\">\n        <Nav />\n      </div>\n      <div className=\"page-content\">{children}</div>\n      <style jsx>{`\n        .main {\n          width: 95vw;\n          margin: 0 auto;\n          overflow-x: hidden;\n        }\n        .page-content {\n          margin: 69px 0 40px;\n          color: #161616;\n          overflow-y: auto;\n          overflow-x: hidden;\n          -webkit-overflow-scrolling: touch;\n        }\n\n        .nav-container {\n          background: #ffffff;\n        }\n      `}</style>\n    </div>\n  );\n}\n\nexport default Page;\n"
  },
  {
    "path": "packages/visx-demo/src/components/Show.tsx",
    "content": "import React, { useMemo } from 'react';\nimport cx from 'classnames';\nimport type { WithScreenSizeProvidedProps } from '@visx/responsive';\nimport { withScreenSize } from '@visx/responsive';\nimport CodeSandboxLink from './CodeSandboxLink';\nimport Page from './Page';\nimport Codeblock from './Codeblock';\nimport type { MarginShape, ShowProvidedProps, PackageJson } from '../types';\nimport VisxDocLink from './VisxDocLink';\nimport extractVisxDepsFromPackageJson from './util/extractVisxDepsFromPackageJson';\n\ntype Component<P = {}> = React.FC<P> | React.ComponentClass<P>;\n\ntype ShowProps = {\n  children?: string;\n  title: string;\n  component: Component<ShowProvidedProps>;\n  codeSandboxDirectoryName?: string;\n  shadow?: boolean;\n  events?: boolean;\n  margin?: MarginShape;\n  description?: Component<{ width: number; height: number }>;\n  windowResizeDebounceTime?: number;\n  packageJson?: PackageJson;\n};\n\nconst padding = 40;\n\nconst Show = withScreenSize<ShowProps & WithScreenSizeProvidedProps>(\n  ({\n    screenWidth,\n    children,\n    title,\n    component,\n    shadow = false,\n    events = false,\n    margin,\n    description,\n    codeSandboxDirectoryName,\n    packageJson,\n  }: ShowProps & WithScreenSizeProvidedProps) => {\n    const width = Math.min(800, (screenWidth || 0) - padding);\n    const height = width * 0.6;\n    const visxDeps = useMemo(() => extractVisxDepsFromPackageJson(packageJson), [packageJson]);\n\n    return (\n      <Page title={title}>\n        <div className=\"container\">\n          <div style={{ width }}>\n            <h1>{title}</h1>\n            <div className={cx(!!shadow && 'shadow', title.split(' ').join('-'), 'chart')}>\n              {React.createElement(component, {\n                width,\n                height,\n                margin,\n                events,\n              })}\n            </div>\n            {description && React.createElement(description, { width, height })}\n            {codeSandboxDirectoryName && (\n              <div className=\"sandbox-link\">\n                <CodeSandboxLink exampleDirectoryName={codeSandboxDirectoryName} />\n              </div>\n            )}\n            {visxDeps.length > 0 && (\n              <>\n                <h2>Documentation</h2>\n                <div className=\"doc-links\">\n                  {visxDeps.map((packageName) => (\n                    <VisxDocLink key={packageName} packageName={packageName} />\n                  ))}\n                </div>\n              </>\n            )}\n            {children && (\n              <>\n                <h2>Code</h2>\n                <div className=\"code\">\n                  <Codeblock>{children}</Codeblock>\n                </div>\n              </>\n            )}\n          </div>\n        </div>\n        <style jsx>{`\n          .container {\n            display: flex;\n            flex-direction: column;\n            align-items: center;\n            overflow: hidden;\n            margin-bottom: 40px;\n          }\n          .container h1 {\n            margin-top: 15px;\n            line-height: 0.9em;\n            letter-spacing: -0.03em;\n          }\n          .container h2 {\n            margin-top: 15px;\n            margin-bottom: 5px;\n          }\n          .chart {\n            border-radius: 14px;\n          }\n          .shadow {\n            border-radius: 14px;\n            box-shadow: 0 1px 6px rgba(0, 0, 0, 0.1);\n          }\n          .sandbox-link {\n            display: flex;\n            justify-content: flex-end;\n          }\n          .doc-links {\n            font-size: 13px;\n          }\n          .doc-links :global(a) {\n            margin-right: 6px;\n          }\n        `}</style>\n      </Page>\n    );\n  },\n);\n\nexport default Show;\n"
  },
  {
    "path": "packages/visx-demo/src/components/VisxDocLink.tsx",
    "content": "import React from 'react';\nimport Link from 'next/link';\n\nfunction getDocUrlFromVXPackageName(visxPackage: string) {\n  const packageName = visxPackage.split('@visx/')[1]; // e.g., @visx/shape\n  return packageName ? `docs/${packageName}` : null;\n}\n\ntype Props = {\n  packageName: string;\n};\n\nfunction VisxDocLink({ packageName }: Props) {\n  const url = getDocUrlFromVXPackageName(packageName);\n  return url ? <Link href={url}>{packageName}</Link> : null;\n}\n\nexport default VisxDocLink;\n"
  },
  {
    "path": "packages/visx-demo/src/components/icons/Belo.tsx",
    "content": "import React from 'react';\n\nfunction Belo() {\n  return (\n    <svg\n      viewBox=\"0 0 1000 1000\"\n      role=\"presentation\"\n      aria-hidden=\"true\"\n      focusable=\"false\"\n      style={{ fill: '#000000' }}\n    >\n      <path d=\"m499.3 736.7c-51-64-81-120.1-91-168.1-10-39-6-70 11-93 18-27 45-40 80-40s62 13 80 40c17 23 21 54 11 93-11 49-41 105-91 168.1zm362.2 43c-7 47-39 86-83 105-85 37-169.1-22-241.1-102 119.1-149.1 141.1-265.1 90-340.2-30-43-73-64-128.1-64-111 0-172.1 94-148.1 203.1 14 59 51 126.1 110 201.1-37 41-72 70-103 88-24 13-47 21-69 23-101 15-180.1-83-144.1-184.1 5-13 15-37 32-74l1-2c55-120.1 122.1-256.1 199.1-407.2l2-5 22-42c17-31 24-45 51-62 13-8 29-12 47-12 36 0 64 21 76 38 6 9 13 21 22 36l21 41 3 6c77 151.1 144.1 287.1 199.1 407.2l1 1 20 46 12 29c9.2 23.1 11.2 46.1 8.2 70.1zm46-90.1c-7-22-19-48-34-79v-1c-71-151.1-137.1-287.1-200.1-409.2l-4-6c-45-92-77-147.1-170.1-147.1-92 0-131.1 64-171.1 147.1l-3 6c-63 122.1-129.1 258.1-200.1 409.2v2l-21 46c-8 19-12 29-13 32-51 140.1 54 263.1 181.1 263.1 1 0 5 0 10-1h14c66-8 134.1-50 203.1-125.1 69 75 137.1 117.1 203.1 125.1h14c5 1 9 1 10 1 127.1.1 232.1-123 181.1-263.1z\" />\n    </svg>\n  );\n}\n\nexport default Belo;\n"
  },
  {
    "path": "packages/visx-demo/src/components/icons/GitHub.tsx",
    "content": "import React from 'react';\n\nfunction GitHub() {\n  return (\n    <svg\n      width=\"100%\"\n      height=\"100%\"\n      viewBox=\"0 0 136 133\"\n      version=\"1.1\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      style={{\n        fill: '#515251',\n        fillRule: 'evenodd',\n        clipRule: 'evenodd',\n        strokeLinejoin: 'round',\n        strokeMiterlimit: 2,\n      }}\n    >\n      <g transform=\"matrix(1,0,0,1,-568.001,-447.669)\">\n        <g transform=\"matrix(4.16667,0,0,4.16667,0,0)\">\n          <g transform=\"matrix(1,0,0,1,152.608,139.345)\">\n            <path d=\"M0,-31.904C-8.995,-31.904 -16.288,-24.611 -16.288,-15.614C-16.288,-8.417 -11.621,-2.312 -5.148,-0.157C-4.333,-0.008 -4.036,-0.511 -4.036,-0.943C-4.036,-1.329 -4.05,-2.354 -4.058,-3.713C-8.589,-2.729 -9.545,-5.897 -9.545,-5.897C-10.286,-7.778 -11.354,-8.279 -11.354,-8.279C-12.833,-9.29 -11.242,-9.27 -11.242,-9.27C-9.607,-9.154 -8.747,-7.591 -8.747,-7.591C-7.294,-5.102 -4.934,-5.821 -4.006,-6.237C-3.858,-7.29 -3.438,-8.008 -2.972,-8.415C-6.589,-8.826 -10.392,-10.224 -10.392,-16.466C-10.392,-18.244 -9.757,-19.698 -8.715,-20.837C-8.883,-21.249 -9.442,-22.905 -8.556,-25.148C-8.556,-25.148 -7.188,-25.586 -4.076,-23.478C-2.777,-23.839 -1.383,-24.02 0.002,-24.026C1.385,-24.02 2.779,-23.839 4.08,-23.478C7.19,-25.586 8.555,-25.148 8.555,-25.148C9.444,-22.905 8.885,-21.249 8.717,-20.837C9.761,-19.698 10.392,-18.244 10.392,-16.466C10.392,-10.208 6.583,-8.831 2.954,-8.428C3.539,-7.925 4.06,-6.931 4.06,-5.411C4.06,-3.234 4.04,-1.477 4.04,-0.943C4.04,-0.507 4.333,0 5.16,-0.159C11.628,-2.318 16.291,-8.419 16.291,-15.614C16.291,-24.611 8.997,-31.904 0,-31.904\" />\n          </g>\n        </g>\n      </g>\n    </svg>\n  );\n}\n\nexport default GitHub;\n"
  },
  {
    "path": "packages/visx-demo/src/components/icons/Instagram.tsx",
    "content": "import React from 'react';\n\nfunction Instagram() {\n  return (\n    <svg viewBox=\"0 0 504 504\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <g id=\"Page-1\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n        <g id=\"glyph-logo_May2016\" fill=\"#515251\">\n          <path\n            d=\"M252,45.471 C319.266,45.471 327.233,45.727 353.797,46.939 C378.359,48.06 391.698,52.164 400.576,55.613 C412.334,60.183 420.727,65.643 429.542,74.458 C438.357,83.273 443.817,91.666 448.386,103.424 C451.836,112.302 455.94,125.641 457.061,150.202 C458.273,176.767 458.529,184.734 458.529,252 C458.529,319.266 458.273,327.233 457.061,353.797 C455.94,378.359 451.836,391.698 448.386,400.576 C443.817,412.334 438.357,420.727 429.542,429.542 C420.727,438.357 412.334,443.817 400.576,448.386 C391.698,451.836 378.359,455.94 353.797,457.061 C327.237,458.273 319.27,458.529 252,458.529 C184.73,458.529 176.763,458.273 150.203,457.061 C125.641,455.94 112.302,451.836 103.425,448.386 C91.666,443.817 83.273,438.357 74.458,429.542 C65.643,420.727 60.183,412.334 55.614,400.576 C52.164,391.698 48.06,378.359 46.939,353.798 C45.727,327.233 45.471,319.266 45.471,252 C45.471,184.734 45.727,176.767 46.939,150.203 C48.06,125.641 52.164,112.302 55.614,103.424 C60.183,91.666 65.643,83.273 74.458,74.458 C83.273,65.643 91.666,60.183 103.425,55.613 C112.302,52.164 125.641,48.06 150.202,46.939 C176.767,45.727 184.734,45.471 252,45.471 M252,0.079 C183.582,0.079 175.004,0.369 148.134,1.595 C121.319,2.819 103.007,7.077 86.982,13.305 C70.416,19.743 56.367,28.357 42.362,42.362 C28.357,56.367 19.743,70.416 13.305,86.982 C7.077,103.007 2.819,121.319 1.595,148.134 C0.369,175.003 0.08,183.582 0.08,252 C0.08,320.418 0.369,328.997 1.595,355.866 C2.819,382.681 7.077,400.993 13.305,417.018 C19.743,433.583 28.357,447.633 42.362,461.638 C56.367,475.643 70.416,484.257 86.982,490.695 C103.007,496.923 121.319,501.181 148.134,502.405 C175.004,503.631 183.582,503.92 252,503.92 C320.418,503.92 328.997,503.631 355.866,502.405 C382.681,501.181 400.993,496.923 417.018,490.695 C433.584,484.257 447.633,475.643 461.638,461.638 C475.643,447.633 484.257,433.584 490.695,417.018 C496.923,400.993 501.181,382.681 502.405,355.866 C503.631,328.997 503.921,320.418 503.921,252 C503.921,183.582 503.631,175.003 502.405,148.134 C501.181,121.319 496.923,103.007 490.695,86.982 C484.257,70.416 475.643,56.367 461.638,42.362 C447.633,28.357 433.584,19.743 417.018,13.305 C400.993,7.077 382.681,2.819 355.866,1.595 C328.997,0.369 320.418,0.079 252,0.079\"\n            id=\"Fill-1\"\n          />\n          <path\n            d=\"M252,122.635 C180.554,122.635 122.635,180.554 122.635,252 C122.635,323.446 180.554,381.365 252,381.365 C323.446,381.365 381.365,323.446 381.365,252 C381.365,180.554 323.446,122.635 252,122.635 Z M252,335.974 C205.623,335.974 168.026,298.377 168.026,252 C168.026,205.623 205.623,168.026 252,168.026 C298.377,168.026 335.974,205.623 335.974,252 C335.974,298.377 298.377,335.974 252,335.974 L252,335.974 Z\"\n            id=\"Fill-2\"\n          />\n          <path\n            d=\"M416.706,117.524 C416.706,134.22 403.172,147.755 386.476,147.755 C369.78,147.755 356.245,134.22 356.245,117.524 C356.245,100.828 369.78,87.294 386.476,87.294 C403.172,87.294 416.706,100.828 416.706,117.524\"\n            id=\"Fill-3\"\n          />\n        </g>\n      </g>\n    </svg>\n  );\n}\n\nexport default Instagram;\n"
  },
  {
    "path": "packages/visx-demo/src/components/icons/Medium.tsx",
    "content": "import React from 'react';\n\nfunction Medium() {\n  return (\n    <svg\n      viewBox=\"0 0 24 24\"\n      xmlns=\"http://www.w3.org/2000/svg\"\n      fillRule=\"evenodd\"\n      clipRule=\"evenodd\"\n    >\n      <path\n        fill=\"#515251\"\n        d=\"M2.846 6.887c.03-.295-.083-.586-.303-.784l-2.24-2.7v-.403h6.958l5.378 11.795 4.728-11.795h6.633v.403l-1.916 1.837c-.165.126-.247.333-.213.538v13.498c-.034.204.048.411.213.537l1.871 1.837v.403h-9.412v-.403l1.939-1.882c.19-.19.19-.246.19-.537v-10.91l-5.389 13.688h-.728l-6.275-13.688v9.174c-.052.385.076.774.347 1.052l2.521 3.058v.404h-7.148v-.404l2.521-3.058c.27-.279.39-.67.325-1.052v-10.608z\"\n      />\n    </svg>\n  );\n}\n\nexport default Medium;\n"
  },
  {
    "path": "packages/visx-demo/src/components/icons/Twitter.tsx",
    "content": "import React from 'react';\n\nfunction Twitter() {\n  return (\n    <svg viewBox=\"0 -2 24 24\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">\n      <g id=\"Symbols\" stroke=\"none\" strokeWidth=\"1\" fill=\"none\" fillRule=\"evenodd\">\n        <g id=\"Footer\" transform=\"translate(-1072.000000, -51.000000)\" fill=\"#515251\">\n          <g id=\"Group-5\" transform=\"translate(1008.000000, 48.000000)\">\n            <path\n              d=\"M85.2987805,6.1169891 C85.2987805,6.1169891 87.2236691,5.9603901 87.9975491,5.3663196 C87.9975491,5.3663196 87.81143,6.0498695 85.4971409,8.2123804 C85.4971409,8.2123804 86.2759209,19.8849144 74.3934698,22.7433948 C74.3934698,22.7433948 68.3665309,24.0707225 64,20.6877746 C64,20.6877746 68.5722451,21.5254344 71.1436729,18.5948715 C71.1436729,18.5948715 67.8253059,18.6296692 66.777143,15.1423244 C66.777143,15.1423244 68.0310202,15.4207153 68.7755098,15.0727272 C68.7755098,15.0727272 65.0163269,14.2698669 65.084898,10.0492601 C65.084898,10.0492601 66.101224,10.8173198 67.014694,10.6781196 C67.014694,10.6781196 63.6302042,7.7127599 65.72898,4.0166206 C65.72898,4.0166206 70.2644901,9.5421896 75.88735,9.2140903 C75.7893895,8.8188695 75.7355098,8.4037704 75.7355098,7.9762401 C75.7355099,5.2296104 77.8979598,3 80.5673504,3 C81.9142895,3 83.1338806,3.5692101 84.0106106,4.4864101 C84.6522408,4.4963493 85.9746895,4.3795299 87.2946892,3.4051609 C87.2898007,3.4076405 87.3657093,4.4715004 85.2987805,6.1169891 L85.2987805,6.1169891 Z\"\n              id=\"Shape\"\n            />\n          </g>\n        </g>\n      </g>\n    </svg>\n  );\n}\n\nexport default Twitter;\n"
  },
  {
    "path": "packages/visx-demo/src/components/util/drawData.ts",
    "content": "export default [\n  [\n    { x: 49, y: 50 },\n    { x: 49, y: 50 },\n    { x: 48, y: 50 },\n    { x: 46, y: 50 },\n    { x: 43, y: 50 },\n    { x: 42, y: 50 },\n    { x: 41, y: 50 },\n    { x: 40, y: 50 },\n    { x: 39, y: 50 },\n    { x: 39, y: 51 },\n    { x: 39, y: 52 },\n    { x: 38, y: 53 },\n    { x: 37, y: 54 },\n    { x: 36, y: 56 },\n    { x: 36, y: 59 },\n    { x: 36, y: 61 },\n    { x: 36, y: 62 },\n    { x: 36, y: 64 },\n    { x: 36, y: 66 },\n    { x: 36, y: 69 },\n    { x: 36, y: 72 },\n    { x: 36, y: 75 },\n    { x: 37, y: 78 },\n    { x: 38, y: 80 },\n    { x: 39, y: 81 },\n    { x: 40, y: 83 },\n    { x: 40, y: 84 },\n    { x: 41, y: 84 },\n    { x: 42, y: 84 },\n    { x: 43, y: 84 },\n    { x: 46, y: 84 },\n    { x: 47, y: 84 },\n    { x: 49, y: 84 },\n    { x: 51, y: 83 },\n    { x: 53, y: 81 },\n    { x: 54, y: 80 },\n    { x: 56, y: 77 },\n    { x: 59, y: 73 },\n    { x: 60, y: 68 },\n    { x: 63, y: 60 },\n    { x: 66, y: 45 },\n    { x: 67, y: 35 },\n    { x: 67, y: 31 },\n    { x: 67, y: 27 },\n    { x: 67, y: 23 },\n    { x: 67, y: 21 },\n    { x: 67, y: 19 },\n    { x: 66, y: 18 },\n    { x: 65, y: 17 },\n    { x: 65, y: 17 },\n    { x: 64, y: 17 },\n    { x: 63, y: 16 },\n    { x: 63, y: 16 },\n    { x: 62, y: 16 },\n    { x: 62, y: 16 },\n    { x: 61, y: 16 },\n    { x: 61, y: 17 },\n    { x: 61, y: 18 },\n    { x: 60, y: 19 },\n    { x: 60, y: 19 },\n    { x: 60, y: 20 },\n    { x: 60, y: 20 },\n    { x: 59, y: 21 },\n    { x: 59, y: 22 },\n    { x: 59, y: 23 },\n    { x: 59, y: 24 },\n    { x: 58, y: 27 },\n    { x: 57, y: 31 },\n    { x: 56, y: 34 },\n    { x: 56, y: 36 },\n    { x: 56, y: 39 },\n    { x: 56, y: 43 },\n    { x: 56, y: 46 },\n    { x: 56, y: 49 },\n    { x: 56, y: 55 },\n    { x: 56, y: 59 },\n    { x: 57, y: 68 },\n    { x: 58, y: 70 },\n    { x: 60, y: 73 },\n    { x: 61, y: 75 },\n    { x: 62, y: 77 },\n    { x: 63, y: 78 },\n    { x: 64, y: 80 },\n    { x: 65, y: 81 },\n    { x: 65, y: 83 },\n    { x: 66, y: 83 },\n    { x: 66, y: 84 },\n    { x: 66, y: 84 },\n    { x: 66, y: 84 },\n    { x: 67, y: 84 },\n    { x: 67, y: 85 },\n    { x: 68, y: 85 },\n    { x: 68, y: 85 },\n    { x: 69, y: 85 },\n    { x: 69, y: 85 },\n    { x: 70, y: 84 },\n    { x: 70, y: 83 },\n    { x: 72, y: 81 },\n    { x: 74, y: 78 },\n    { x: 77, y: 75 },\n    { x: 79, y: 73 },\n    { x: 80, y: 70 },\n    { x: 82, y: 66 },\n    { x: 84, y: 61 },\n    { x: 86, y: 57 },\n    { x: 86, y: 56 },\n    { x: 87, y: 54 },\n    { x: 87, y: 52 },\n    { x: 87, y: 50 },\n    { x: 87, y: 49 },\n    { x: 87, y: 48 },\n    { x: 87, y: 48 },\n    { x: 87, y: 47 },\n    { x: 86, y: 47 },\n    { x: 85, y: 47 },\n    { x: 84, y: 47 },\n    { x: 84, y: 47 },\n    { x: 83, y: 47 },\n    { x: 83, y: 47 },\n    { x: 83, y: 47 },\n    { x: 82, y: 48 },\n    { x: 82, y: 48 },\n    { x: 82, y: 51 },\n    { x: 82, y: 51 },\n    { x: 82, y: 52 },\n    { x: 82, y: 52 },\n    { x: 82, y: 52 },\n    { x: 82, y: 53 },\n    { x: 82, y: 53 },\n    { x: 83, y: 54 },\n    { x: 83, y: 54 },\n    { x: 83, y: 55 },\n    { x: 83, y: 55 },\n    { x: 84, y: 55 },\n    { x: 84, y: 55 },\n    { x: 84, y: 55 },\n    { x: 85, y: 55 },\n    { x: 86, y: 55 },\n    { x: 87, y: 55 },\n    { x: 87, y: 55 },\n    { x: 88, y: 55 },\n    { x: 90, y: 56 },\n    { x: 91, y: 56 },\n    { x: 93, y: 56 },\n    { x: 94, y: 56 },\n    { x: 95, y: 56 },\n    { x: 96, y: 56 },\n    { x: 97, y: 55 },\n    { x: 100, y: 53 },\n    { x: 101, y: 53 },\n    { x: 102, y: 52 },\n    { x: 102, y: 52 },\n    { x: 102, y: 51 },\n    { x: 102, y: 52 },\n    { x: 102, y: 52 },\n    { x: 101, y: 53 },\n    { x: 101, y: 54 },\n    { x: 99, y: 57 },\n    { x: 97, y: 63 },\n    { x: 96, y: 64 },\n    { x: 96, y: 65 },\n    { x: 96, y: 67 },\n    { x: 96, y: 69 },\n    { x: 96, y: 70 },\n    { x: 96, y: 71 },\n    { x: 96, y: 71 },\n    { x: 96, y: 72 },\n    { x: 96, y: 72 },\n    { x: 96, y: 72 },\n    { x: 96, y: 73 },\n    { x: 97, y: 74 },\n    { x: 98, y: 75 },\n    { x: 99, y: 77 },\n    { x: 101, y: 79 },\n    { x: 102, y: 79 },\n    { x: 103, y: 80 },\n    { x: 104, y: 80 },\n    { x: 105, y: 80 },\n    { x: 105, y: 80 },\n    { x: 106, y: 80 },\n    { x: 107, y: 80 },\n    { x: 108, y: 79 },\n    { x: 109, y: 77 },\n    { x: 110, y: 75 },\n    { x: 112, y: 72 },\n    { x: 114, y: 68 },\n    { x: 116, y: 62 },\n    { x: 118, y: 59 },\n    { x: 119, y: 56 },\n    { x: 120, y: 54 },\n    { x: 121, y: 53 },\n    { x: 122, y: 51 },\n    { x: 123, y: 51 },\n    { x: 123, y: 50 },\n    { x: 124, y: 50 },\n    { x: 125, y: 49 },\n    { x: 125, y: 49 },\n    { x: 125, y: 49 },\n    { x: 126, y: 49 },\n    { x: 127, y: 49 },\n    { x: 128, y: 50 },\n    { x: 128, y: 51 },\n    { x: 129, y: 51 },\n    { x: 129, y: 51 },\n    { x: 129, y: 52 },\n    { x: 128, y: 52 },\n    { x: 128, y: 52 },\n    { x: 127, y: 51 },\n    { x: 126, y: 51 },\n    { x: 125, y: 51 },\n    { x: 123, y: 51 },\n    { x: 122, y: 51 },\n    { x: 120, y: 52 },\n    { x: 119, y: 53 },\n    { x: 118, y: 54 },\n    { x: 115, y: 60 },\n    { x: 113, y: 64 },\n    { x: 112, y: 67 },\n    { x: 112, y: 69 },\n    { x: 112, y: 70 },\n    { x: 112, y: 70 },\n    { x: 112, y: 72 },\n    { x: 112, y: 73 },\n    { x: 112, y: 73 },\n    { x: 112, y: 74 },\n    { x: 113, y: 75 },\n    { x: 113, y: 76 },\n    { x: 113, y: 76 },\n    { x: 114, y: 76 },\n    { x: 114, y: 76 },\n    { x: 115, y: 76 },\n    { x: 115, y: 76 },\n    { x: 116, y: 77 },\n    { x: 117, y: 77 },\n    { x: 119, y: 77 },\n    { x: 120, y: 77 },\n    { x: 121, y: 77 },\n    { x: 122, y: 77 },\n    { x: 123, y: 76 },\n    { x: 124, y: 76 },\n    { x: 125, y: 75 },\n    { x: 126, y: 75 },\n    { x: 126, y: 73 },\n    { x: 127, y: 72 },\n    { x: 128, y: 70 },\n    { x: 128, y: 68 },\n    { x: 129, y: 66 },\n    { x: 129, y: 64 },\n    { x: 131, y: 60 },\n    { x: 131, y: 57 },\n    { x: 132, y: 55 },\n    { x: 133, y: 54 },\n    { x: 133, y: 52 },\n    { x: 133, y: 51 },\n    { x: 133, y: 50 },\n    { x: 133, y: 47 },\n    { x: 133, y: 46 },\n    { x: 133, y: 46 },\n    { x: 133, y: 46 },\n    { x: 133, y: 46 },\n    { x: 132, y: 46 },\n    { x: 132, y: 46 },\n    { x: 131, y: 46 },\n    { x: 131, y: 46 },\n    { x: 130, y: 46 },\n    { x: 130, y: 46 },\n    { x: 130, y: 46 },\n    { x: 129, y: 47 },\n    { x: 129, y: 48 },\n    { x: 129, y: 48 },\n    { x: 129, y: 48 },\n    { x: 129, y: 49 },\n    { x: 129, y: 49 },\n    { x: 129, y: 50 },\n    { x: 129, y: 51 },\n    { x: 129, y: 52 },\n    { x: 129, y: 52 },\n    { x: 129, y: 53 },\n    { x: 129, y: 55 },\n    { x: 129, y: 56 },\n    { x: 129, y: 57 },\n    { x: 129, y: 58 },\n    { x: 129, y: 59 },\n    { x: 129, y: 59 },\n    { x: 129, y: 60 },\n    { x: 129, y: 62 },\n    { x: 129, y: 64 },\n    { x: 129, y: 65 },\n    { x: 129, y: 67 },\n    { x: 129, y: 69 },\n    { x: 130, y: 70 },\n    { x: 131, y: 72 },\n    { x: 131, y: 74 },\n    { x: 132, y: 75 },\n    { x: 133, y: 77 },\n    { x: 134, y: 78 },\n    { x: 134, y: 79 },\n    { x: 135, y: 80 },\n    { x: 135, y: 81 },\n    { x: 135, y: 81 },\n    { x: 136, y: 81 },\n    { x: 136, y: 81 },\n    { x: 136, y: 82 },\n    { x: 136, y: 82 },\n    { x: 137, y: 82 },\n    { x: 137, y: 82 },\n    { x: 138, y: 82 },\n    { x: 139, y: 83 },\n    { x: 139, y: 83 },\n    { x: 139, y: 83 },\n    { x: 140, y: 83 },\n    { x: 140, y: 83 },\n    { x: 140, y: 83 },\n    { x: 140, y: 83 },\n    { x: 140, y: 83 },\n    { x: 141, y: 81 },\n    { x: 141, y: 80 },\n    { x: 142, y: 77 },\n    { x: 142, y: 66 },\n    { x: 142, y: 65 },\n    { x: 142, y: 62 },\n    { x: 142, y: 61 },\n    { x: 142, y: 60 },\n    { x: 142, y: 60 },\n    { x: 142, y: 60 },\n    { x: 142, y: 60 },\n    { x: 142, y: 60 },\n    { x: 142, y: 61 },\n    { x: 142, y: 62 },\n    { x: 142, y: 63 },\n    { x: 142, y: 64 },\n    { x: 142, y: 66 },\n    { x: 143, y: 67 },\n    { x: 143, y: 68 },\n    { x: 144, y: 69 },\n    { x: 144, y: 70 },\n    { x: 145, y: 71 },\n    { x: 145, y: 73 },\n    { x: 146, y: 75 },\n    { x: 147, y: 78 },\n    { x: 153, y: 83 },\n    { x: 153, y: 83 },\n    { x: 153, y: 83 },\n    { x: 153, y: 83 },\n    { x: 154, y: 83 },\n    { x: 154, y: 83 },\n    { x: 155, y: 83 },\n    { x: 156, y: 81 },\n    { x: 156, y: 79 },\n    { x: 156, y: 78 },\n    { x: 156, y: 77 },\n    { x: 156, y: 76 },\n    { x: 156, y: 74 },\n    { x: 156, y: 71 },\n    { x: 156, y: 70 },\n    { x: 157, y: 68 },\n    { x: 157, y: 66 },\n    { x: 157, y: 64 },\n    { x: 157, y: 63 },\n    { x: 157, y: 63 },\n    { x: 157, y: 62 },\n    { x: 157, y: 61 },\n    { x: 157, y: 61 },\n    { x: 157, y: 60 },\n    { x: 156, y: 60 },\n    { x: 156, y: 60 },\n    { x: 156, y: 60 },\n    { x: 156, y: 61 },\n    { x: 156, y: 61 },\n    { x: 157, y: 64 },\n    { x: 158, y: 65 },\n    { x: 159, y: 68 },\n    { x: 160, y: 69 },\n    { x: 161, y: 70 },\n    { x: 162, y: 72 },\n    { x: 162, y: 73 },\n    { x: 163, y: 74 },\n    { x: 164, y: 75 },\n    { x: 165, y: 76 },\n    { x: 165, y: 76 },\n    { x: 166, y: 76 },\n    { x: 166, y: 76 },\n    { x: 167, y: 76 },\n    { x: 167, y: 76 },\n    { x: 168, y: 76 },\n    { x: 169, y: 76 },\n    { x: 172, y: 76 },\n    { x: 172, y: 76 },\n    { x: 173, y: 76 },\n    { x: 175, y: 75 },\n    { x: 175, y: 75 },\n    { x: 176, y: 74 },\n    { x: 176, y: 74 },\n    { x: 176, y: 73 },\n    { x: 176, y: 72 },\n    { x: 176, y: 72 },\n    { x: 176, y: 71 },\n    { x: 176, y: 69 },\n    { x: 176, y: 68 },\n    { x: 176, y: 66 },\n    { x: 176, y: 65 },\n    { x: 176, y: 64 },\n    { x: 176, y: 63 },\n    { x: 175, y: 62 },\n    { x: 174, y: 61 },\n    { x: 173, y: 60 },\n    { x: 173, y: 57 },\n    { x: 172, y: 56 },\n    { x: 172, y: 55 },\n    { x: 171, y: 53 },\n    { x: 170, y: 52 },\n    { x: 169, y: 51 },\n    { x: 168, y: 50 },\n    { x: 167, y: 49 },\n    { x: 167, y: 49 },\n    { x: 167, y: 49 },\n    { x: 166, y: 49 },\n    { x: 166, y: 49 },\n    { x: 166, y: 49 },\n    { x: 165, y: 49 },\n    { x: 165, y: 49 },\n    { x: 165, y: 50 },\n    { x: 165, y: 50 },\n    { x: 165, y: 51 },\n    { x: 165, y: 51 },\n    { x: 165, y: 52 },\n    { x: 165, y: 52 },\n    { x: 165, y: 52 },\n    { x: 165, y: 53 },\n    { x: 166, y: 53 },\n    { x: 166, y: 54 },\n    { x: 166, y: 54 },\n    { x: 167, y: 54 },\n    { x: 167, y: 54 },\n    { x: 167, y: 54 },\n    { x: 168, y: 54 },\n    { x: 168, y: 54 },\n    { x: 169, y: 54 },\n    { x: 169, y: 54 },\n    { x: 170, y: 54 },\n    { x: 171, y: 54 },\n    { x: 173, y: 54 },\n    { x: 175, y: 55 },\n    { x: 177, y: 55 },\n    { x: 178, y: 55 },\n    { x: 180, y: 55 },\n    { x: 182, y: 55 },\n    { x: 183, y: 55 },\n    { x: 186, y: 55 },\n    { x: 189, y: 55 },\n    { x: 191, y: 55 },\n    { x: 193, y: 54 },\n    { x: 194, y: 53 },\n    { x: 196, y: 52 },\n    { x: 196, y: 52 },\n    { x: 197, y: 51 },\n    { x: 198, y: 51 },\n    { x: 198, y: 51 },\n    { x: 199, y: 51 },\n    { x: 199, y: 50 },\n    { x: 199, y: 50 },\n    { x: 199, y: 50 },\n    { x: 199, y: 49 },\n    { x: 199, y: 49 },\n  ],\n  [\n    { x: 39, y: 34 },\n    { x: 38, y: 34 },\n    { x: 36, y: 34 },\n    { x: 33, y: 36 },\n    { x: 30, y: 37 },\n    { x: 29, y: 38 },\n    { x: 28, y: 38 },\n    { x: 27, y: 38 },\n    { x: 26, y: 39 },\n    { x: 26, y: 40 },\n    { x: 25, y: 41 },\n    { x: 25, y: 41 },\n    { x: 24, y: 42 },\n    { x: 24, y: 42 },\n    { x: 24, y: 43 },\n    { x: 23, y: 44 },\n    { x: 23, y: 45 },\n    { x: 23, y: 45 },\n    { x: 23, y: 46 },\n    { x: 23, y: 47 },\n    { x: 23, y: 49 },\n    { x: 23, y: 50 },\n    { x: 23, y: 52 },\n    { x: 23, y: 53 },\n    { x: 23, y: 53 },\n    { x: 23, y: 54 },\n    { x: 23, y: 54 },\n    { x: 23, y: 55 },\n    { x: 23, y: 57 },\n    { x: 23, y: 57 },\n    { x: 23, y: 58 },\n    { x: 23, y: 59 },\n    { x: 23, y: 61 },\n    { x: 24, y: 65 },\n    { x: 24, y: 67 },\n    { x: 25, y: 70 },\n    { x: 25, y: 71 },\n    { x: 25, y: 72 },\n    { x: 25, y: 73 },\n    { x: 25, y: 74 },\n    { x: 25, y: 75 },\n    { x: 25, y: 77 },\n    { x: 25, y: 78 },\n    { x: 25, y: 79 },\n    { x: 26, y: 80 },\n    { x: 26, y: 82 },\n    { x: 26, y: 83 },\n    { x: 27, y: 86 },\n    { x: 27, y: 86 },\n    { x: 27, y: 88 },\n    { x: 27, y: 89 },\n    { x: 28, y: 90 },\n    { x: 28, y: 91 },\n    { x: 29, y: 92 },\n    { x: 29, y: 93 },\n    { x: 30, y: 95 },\n    { x: 31, y: 95 },\n    { x: 31, y: 96 },\n    { x: 32, y: 97 },\n    { x: 33, y: 97 },\n    { x: 34, y: 99 },\n    { x: 35, y: 100 },\n    { x: 36, y: 101 },\n    { x: 37, y: 102 },\n    { x: 37, y: 102 },\n    { x: 38, y: 102 },\n    { x: 39, y: 102 },\n    { x: 40, y: 102 },\n    { x: 41, y: 102 },\n    { x: 44, y: 103 },\n    { x: 47, y: 103 },\n    { x: 52, y: 104 },\n    { x: 59, y: 104 },\n    { x: 64, y: 104 },\n    { x: 68, y: 104 },\n    { x: 73, y: 104 },\n    { x: 76, y: 104 },\n    { x: 83, y: 105 },\n    { x: 87, y: 105 },\n    { x: 92, y: 105 },\n    { x: 98, y: 105 },\n    { x: 102, y: 105 },\n    { x: 110, y: 105 },\n    { x: 114, y: 105 },\n    { x: 119, y: 105 },\n    { x: 129, y: 105 },\n    { x: 137, y: 104 },\n    { x: 147, y: 103 },\n    { x: 158, y: 102 },\n    { x: 173, y: 100 },\n    { x: 180, y: 100 },\n    { x: 183, y: 99 },\n    { x: 186, y: 99 },\n    { x: 189, y: 98 },\n    { x: 194, y: 97 },\n    { x: 199, y: 95 },\n    { x: 201, y: 94 },\n    { x: 205, y: 92 },\n    { x: 211, y: 88 },\n    { x: 214, y: 86 },\n    { x: 216, y: 84 },\n    { x: 218, y: 82 },\n    { x: 219, y: 82 },\n    { x: 220, y: 81 },\n    { x: 220, y: 80 },\n    { x: 221, y: 80 },\n    { x: 221, y: 79 },\n    { x: 221, y: 78 },\n    { x: 221, y: 77 },\n    { x: 222, y: 76 },\n    { x: 222, y: 74 },\n    { x: 223, y: 72 },\n    { x: 223, y: 70 },\n    { x: 223, y: 68 },\n    { x: 223, y: 64 },\n    { x: 223, y: 59 },\n    { x: 223, y: 55 },\n    { x: 223, y: 51 },\n    { x: 223, y: 48 },\n    { x: 223, y: 48 },\n    { x: 223, y: 46 },\n    { x: 223, y: 45 },\n    { x: 223, y: 43 },\n    { x: 223, y: 43 },\n    { x: 223, y: 42 },\n    { x: 221, y: 41 },\n    { x: 220, y: 40 },\n    { x: 218, y: 39 },\n    { x: 216, y: 38 },\n    { x: 216, y: 38 },\n    { x: 214, y: 37 },\n    { x: 212, y: 36 },\n    { x: 209, y: 35 },\n    { x: 207, y: 34 },\n    { x: 204, y: 34 },\n    { x: 200, y: 34 },\n    { x: 196, y: 34 },\n    { x: 193, y: 33 },\n    { x: 190, y: 33 },\n    { x: 186, y: 33 },\n    { x: 182, y: 33 },\n    { x: 178, y: 33 },\n    { x: 175, y: 33 },\n    { x: 172, y: 33 },\n    { x: 166, y: 33 },\n    { x: 161, y: 33 },\n    { x: 155, y: 33 },\n    { x: 150, y: 33 },\n    { x: 140, y: 33 },\n    { x: 136, y: 34 },\n    { x: 131, y: 35 },\n    { x: 125, y: 35 },\n    { x: 123, y: 35 },\n    { x: 121, y: 36 },\n    { x: 120, y: 36 },\n    { x: 118, y: 36 },\n    { x: 116, y: 36 },\n    { x: 114, y: 36 },\n    { x: 112, y: 36 },\n    { x: 110, y: 36 },\n    { x: 109, y: 36 },\n    { x: 108, y: 36 },\n    { x: 107, y: 36 },\n    { x: 106, y: 36 },\n    { x: 105, y: 36 },\n    { x: 104, y: 36 },\n    { x: 103, y: 36 },\n    { x: 102, y: 36 },\n    { x: 101, y: 36 },\n    { x: 100, y: 36 },\n    { x: 98, y: 36 },\n    { x: 96, y: 36 },\n    { x: 95, y: 36 },\n    { x: 94, y: 36 },\n    { x: 93, y: 36 },\n    { x: 92, y: 36 },\n    { x: 92, y: 36 },\n    { x: 91, y: 36 },\n    { x: 91, y: 36 },\n    { x: 90, y: 36 },\n    { x: 89, y: 36 },\n    { x: 89, y: 36 },\n    { x: 88, y: 36 },\n    { x: 88, y: 36 },\n    { x: 87, y: 36 },\n    { x: 86, y: 36 },\n    { x: 86, y: 36 },\n    { x: 86, y: 36 },\n    { x: 86, y: 36 },\n    { x: 85, y: 36 },\n    { x: 85, y: 35 },\n    { x: 85, y: 34 },\n    { x: 85, y: 34 },\n    { x: 85, y: 34 },\n    { x: 85, y: 33 },\n    { x: 85, y: 33 },\n    { x: 84, y: 32 },\n    { x: 84, y: 31 },\n    { x: 83, y: 29 },\n    { x: 83, y: 27 },\n    { x: 83, y: 25 },\n    { x: 82, y: 24 },\n    { x: 82, y: 22 },\n    { x: 80, y: 19 },\n    { x: 80, y: 18 },\n    { x: 79, y: 17 },\n    { x: 78, y: 16 },\n    { x: 78, y: 15 },\n    { x: 78, y: 15 },\n    { x: 77, y: 15 },\n    { x: 77, y: 14 },\n    { x: 76, y: 14 },\n    { x: 76, y: 13 },\n    { x: 75, y: 13 },\n    { x: 75, y: 12 },\n    { x: 74, y: 12 },\n    { x: 73, y: 12 },\n    { x: 73, y: 11 },\n    { x: 72, y: 11 },\n    { x: 72, y: 11 },\n    { x: 70, y: 10 },\n    { x: 70, y: 10 },\n    { x: 67, y: 10 },\n    { x: 65, y: 9 },\n    { x: 65, y: 9 },\n    { x: 64, y: 9 },\n    { x: 63, y: 9 },\n    { x: 63, y: 9 },\n    { x: 62, y: 9 },\n    { x: 61, y: 9 },\n    { x: 61, y: 9 },\n    { x: 60, y: 9 },\n    { x: 59, y: 9 },\n    { x: 59, y: 9 },\n    { x: 59, y: 9 },\n    { x: 58, y: 9 },\n    { x: 57, y: 9 },\n    { x: 57, y: 9 },\n    { x: 56, y: 9 },\n    { x: 56, y: 10 },\n    { x: 55, y: 10 },\n    { x: 55, y: 11 },\n    { x: 54, y: 11 },\n    { x: 54, y: 12 },\n    { x: 53, y: 13 },\n    { x: 51, y: 15 },\n    { x: 51, y: 15 },\n    { x: 50, y: 16 },\n    { x: 49, y: 17 },\n    { x: 49, y: 18 },\n    { x: 48, y: 19 },\n    { x: 48, y: 20 },\n    { x: 47, y: 21 },\n    { x: 46, y: 22 },\n    { x: 46, y: 22 },\n    { x: 46, y: 23 },\n    { x: 45, y: 24 },\n    { x: 45, y: 24 },\n  ],\n];\n"
  },
  {
    "path": "packages/visx-demo/src/components/util/extractVisxDepsFromPackageJson.ts",
    "content": "import type { PackageJson } from '../../types';\n\nexport default function extractVisxDepsFromPackageJson(packageJson?: PackageJson) {\n  const visxDeps: string[] = [];\n\n  Object.keys(packageJson?.dependencies ?? {}).forEach((dep) => {\n    if (dep.startsWith('@visx/')) visxDeps.push(dep);\n  });\n\n  return visxDeps;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/components/util/format.ts",
    "content": "export function toExportName(displayName: string) {\n  const isComponent = !!(displayName && displayName[0].toLowerCase() !== displayName[0]);\n  if (isComponent) {\n    return `\\u003C${displayName} /\\u003E`;\n  }\n  return `${displayName}()`;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/next-env.d.ts",
    "content": "/// <reference types=\"next\" />\n/// <reference types=\"next/types/global\" />\n"
  },
  {
    "path": "packages/visx-demo/src/pages/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"import/no-relative-packages\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-demo/src/pages/_app.tsx",
    "content": "import React from 'react';\nimport type { AppProps } from 'next/app';\nimport 'prismjs/themes/prism.css';\nimport NoSsr from '../components/NoSsr';\n\nfunction MyApp({ Component, pageProps }: AppProps) {\n  return (\n    <NoSsr>\n      <Component {...pageProps} />\n    </NoSsr>\n  );\n}\n\nexport default MyApp;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/_document.tsx",
    "content": "import React from 'react';\nimport type { DocumentContext } from 'next/document';\nimport Document, { Html, Head, Main, NextScript } from 'next/document';\n\nclass VisxDocument extends Document {\n  static async getInitialProps(ctx: DocumentContext) {\n    const initialProps = await Document.getInitialProps(ctx);\n    return { ...initialProps };\n  }\n\n  render() {\n    return (\n      <Html lang=\"en\">\n        <Head />\n        <body>\n          <Main />\n          <NextScript />\n        </body>\n      </Html>\n    );\n  }\n}\n\nexport default VisxDocument;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/annotation.tsx",
    "content": "import React from 'react';\nimport Annotation from '../sandboxes/visx-annotation/Example';\nimport packageJson from '../sandboxes/visx-annotation/package.json';\nimport Show from '../components/Show';\nimport AnnotationSource from '!!raw-loader!../sandboxes/visx-annotation/Example';\n\nfunction AnnotationPage() {\n  return (\n    <Show\n      component={Annotation}\n      title=\"Annotation\"\n      codeSandboxDirectoryName=\"visx-annotation\"\n      packageJson={packageJson}\n    >\n      {AnnotationSource}\n    </Show>\n  );\n}\n\nexport default AnnotationPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/areas.tsx",
    "content": "import React from 'react';\nimport Area from '../sandboxes/visx-area/Example';\nimport packageJson from '../sandboxes/visx-area/package.json';\nimport Show from '../components/Show';\nimport AreaSource from '!!raw-loader!../sandboxes/visx-area/Example';\n\nfunction AreasPage() {\n  return (\n    <Show\n      component={Area}\n      title=\"Areas\"\n      codeSandboxDirectoryName=\"visx-area\"\n      packageJson={packageJson}\n    >\n      {AreaSource}\n    </Show>\n  );\n}\nexport default AreasPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/axis.tsx",
    "content": "import React from 'react';\nimport Axis from '../sandboxes/visx-axis/Example';\nimport packageJson from '../sandboxes/visx-axis/package.json';\nimport Show from '../components/Show';\nimport AxisSource from '!!raw-loader!../sandboxes/visx-axis/Example';\n\nfunction AxisPage() {\n  return (\n    <Show\n      component={Axis}\n      title=\"Axis\"\n      codeSandboxDirectoryName=\"visx-axis\"\n      packageJson={packageJson}\n    >\n      {AxisSource}\n    </Show>\n  );\n}\nexport default AxisPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/bargroup.tsx",
    "content": "import React from 'react';\nimport BarGroup from '../sandboxes/visx-bargroup/Example';\nimport packageJson from '../sandboxes/visx-bargroup/package.json';\nimport Show from '../components/Show';\nimport BarGroupSource from '!!raw-loader!../sandboxes/visx-bargroup/Example';\n\nfunction BarGroupPage() {\n  return (\n    <Show\n      events\n      margin={{ top: 80, right: 0, bottom: 80, left: 0 }}\n      component={BarGroup}\n      title=\"Bar Group\"\n      codeSandboxDirectoryName=\"visx-bargroup\"\n      packageJson={packageJson}\n    >\n      {BarGroupSource}\n    </Show>\n  );\n}\nexport default BarGroupPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/bargrouphorizontal.tsx",
    "content": "import React from 'react';\nimport BarGroupHorizontal from '../sandboxes/visx-bargroup-horizontal/Example';\nimport packageJson from '../sandboxes/visx-bargroup-horizontal/package.json';\nimport Show from '../components/Show';\nimport BarGroupHorizontalSource from '!!raw-loader!../sandboxes/visx-bargroup-horizontal/Example';\n\nfunction BarGroupHorizontalPage() {\n  return (\n    <Show\n      events\n      margin={{ top: 45, left: 60, right: 20, bottom: 45 }}\n      component={BarGroupHorizontal}\n      title=\"Bar Group Horizontal\"\n      codeSandboxDirectoryName=\"visx-bargroup-horizontal\"\n      packageJson={packageJson}\n    >\n      {BarGroupHorizontalSource}\n    </Show>\n  );\n}\nexport default BarGroupHorizontalPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/bars.tsx",
    "content": "import React from 'react';\nimport Bars from '../sandboxes/visx-bars/Example';\nimport packageJson from '../sandboxes/visx-bars/package.json';\nimport Show from '../components/Show';\nimport BarsSource from '!!raw-loader!../sandboxes/visx-bars/Example';\n\nfunction BarsPage() {\n  return (\n    <Show\n      events\n      component={Bars}\n      title=\"Bars\"\n      codeSandboxDirectoryName=\"visx-bars\"\n      packageJson={packageJson}\n    >\n      {BarsSource}\n    </Show>\n  );\n}\nexport default BarsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/barstack.tsx",
    "content": "import React from 'react';\nimport BarStack from '../sandboxes/visx-barstack/Example';\nimport packageJson from '../sandboxes/visx-barstack/package.json';\nimport Show from '../components/Show';\nimport BarStackSource from '!!raw-loader!../sandboxes/visx-barstack/Example';\n\nfunction BarStackPage() {\n  return (\n    <Show\n      events\n      margin={{ top: 80, right: 0, bottom: 0, left: 0 }}\n      component={BarStack}\n      title=\"Bar Stack\"\n      codeSandboxDirectoryName=\"visx-barstack\"\n      packageJson={packageJson}\n    >\n      {BarStackSource}\n    </Show>\n  );\n}\nexport default BarStackPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/barstackhorizontal.tsx",
    "content": "import React from 'react';\nimport BarStackHorizontal from '../sandboxes/visx-barstack-horizontal/Example';\nimport packageJson from '../sandboxes/visx-barstack-horizontal/package.json';\nimport Show from '../components/Show';\nimport BarStackHorizontalSource from '!!raw-loader!../sandboxes/visx-barstack-horizontal/Example';\n\nfunction BarStackHorizontalPage() {\n  return (\n    <Show\n      events\n      margin={{\n        top: 80,\n        left: 80,\n        right: 40,\n        bottom: 100,\n      }}\n      component={BarStackHorizontal}\n      title=\"Bar Stack Horizontal\"\n      codeSandboxDirectoryName=\"visx-barstack-horizontal\"\n      packageJson={packageJson}\n    >\n      {BarStackHorizontalSource}\n    </Show>\n  );\n}\nexport default BarStackHorizontalPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/brush.tsx",
    "content": "import React from 'react';\nimport Brush from '../sandboxes/visx-brush/Example';\nimport packageJson from '../sandboxes/visx-brush/package.json';\nimport Show from '../components/Show';\nimport BrushSource from '!!raw-loader!../sandboxes/visx-brush/Example';\n\nfunction BrushPage() {\n  return (\n    <Show\n      component={Brush}\n      title=\"Brush\"\n      margin={{\n        top: 40,\n        left: 50,\n        right: 20,\n        bottom: 10,\n      }}\n      codeSandboxDirectoryName=\"visx-brush\"\n      packageJson={packageJson}\n    >\n      {BrushSource}\n    </Show>\n  );\n}\nexport default BrushPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/chord.tsx",
    "content": "import React from 'react';\nimport Chord from '../sandboxes/visx-chord/Example';\nimport packageJson from '../sandboxes/visx-chord/package.json';\nimport Show from '../components/Show';\nimport ChordSource from '!!raw-loader!../sandboxes/visx-chord/Example';\n\nfunction ChordPage() {\n  return (\n    <Show\n      component={Chord}\n      title=\"Chords\"\n      codeSandboxDirectoryName=\"visx-chord\"\n      packageJson={packageJson}\n    >\n      {ChordSource}\n    </Show>\n  );\n}\nexport default ChordPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/curves.tsx",
    "content": "import React from 'react';\nimport Lines from '../sandboxes/visx-curve/Example';\nimport packageJson from '../sandboxes/visx-curve/package.json';\nimport Show from '../components/Show';\nimport LinesSource from '!!raw-loader!../sandboxes/visx-curve/Example';\n\nfunction CurvesPage() {\n  return (\n    <Show\n      component={Lines}\n      title=\"Curves\"\n      codeSandboxDirectoryName=\"visx-curve\"\n      packageJson={packageJson}\n    >\n      {LinesSource}\n    </Show>\n  );\n}\nexport default CurvesPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/delaunay-triangulation.tsx",
    "content": "import React from 'react';\nimport DelaunayTriangulation from '../sandboxes/visx-delaunay-triangulation/Example';\nimport packageJson from '../sandboxes/visx-delaunay-triangulation/package.json';\nimport Show from '../components/Show';\nimport DelaunayTriangulationSource from '!!raw-loader!../sandboxes/visx-delaunay-triangulation/Example';\n\nfunction DelaunayTriangulationPage() {\n  return (\n    <Show\n      events\n      margin={{\n        top: 16,\n        left: 16,\n        right: 16,\n        bottom: 16,\n      }}\n      component={DelaunayTriangulation}\n      title=\"Delaunay Triangulation\"\n      codeSandboxDirectoryName=\"visx-delaunay-triangulation\"\n      packageJson={packageJson}\n    >\n      {DelaunayTriangulationSource}\n    </Show>\n  );\n}\nexport default DelaunayTriangulationPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/delaunay-voronoi.tsx",
    "content": "import React from 'react';\nimport VoronoiChart from '../sandboxes/visx-delaunay-voronoi/Example';\nimport packageJson from '../sandboxes/visx-delaunay-voronoi/package.json';\nimport Show from '../components/Show';\nimport VoronoiChartSource from '!!raw-loader!../sandboxes/visx-delaunay-voronoi/Example';\n\nfunction DelaunayVoronoiPage() {\n  return (\n    <Show\n      events\n      margin={{\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n      }}\n      component={VoronoiChart}\n      title=\"Voronoi\"\n      codeSandboxDirectoryName=\"visx-delaunay-voronoi\"\n      packageJson={packageJson}\n    >\n      {VoronoiChartSource}\n    </Show>\n  );\n}\nexport default DelaunayVoronoiPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/dendrograms.tsx",
    "content": "import React from 'react';\nimport Dendrograms from '../sandboxes/visx-dendrogram/Example';\nimport packageJson from '../sandboxes/visx-dendrogram/package.json';\nimport Show from '../components/Show';\nimport DendrogramsSource from '!!raw-loader!../sandboxes/visx-dendrogram/Example';\n\nfunction DendrogramsPage() {\n  return (\n    <Show\n      events\n      title=\"Dendrograms\"\n      codeSandboxDirectoryName=\"visx-dendrogram\"\n      component={Dendrograms}\n      margin={{\n        top: 80,\n        left: 10,\n        right: 10,\n        bottom: 80,\n      }}\n      packageJson={packageJson}\n    >\n      {DendrogramsSource}\n    </Show>\n  );\n}\nexport default DendrogramsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"no-underscore-dangle\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/annotation.tsx",
    "content": "import React from 'react';\nimport AnnotationReadme from '!!raw-loader!../../../../visx-annotation/Readme.md';\nimport * as AnnotationComponents from '../../../../visx-annotation/src';\nimport DocPage from '../../components/DocPage';\nimport AnnotationTile from '../../components/Gallery/AnnotationTile';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('annotation', AnnotationComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [AnnotationTile];\n\nfunction AnnotationDocs() {\n  return (\n    <DocPage\n      examples={examples}\n      components={components}\n      readme={AnnotationReadme}\n      visxPackage=\"annotation\"\n    />\n  );\n}\n\nexport default AnnotationDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/axis.tsx",
    "content": "import React from 'react';\nimport AxisReadme from '!!raw-loader!../../../../visx-axis/Readme.md';\nimport * as AxisComponents from '../../../../visx-axis/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport AxisTile from '../../components/Gallery/AxisTile';\nimport BarStackTile from '../../components/Gallery/BarStackTile';\nimport ThresholdTile from '../../components/Gallery/ThresholdTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('axis', AxisComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [AxisTile, BarStackTile, ThresholdTile];\n\nfunction AxisDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={AxisReadme} visxPackage=\"axis\" />\n  );\n}\nexport default AxisDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/bounds.tsx",
    "content": "import React from 'react';\nimport BoundsReadme from '!!raw-loader!../../../../visx-bounds/Readme.md';\nimport DocPage from '../../components/DocPage';\n\nfunction BoundsDocs() {\n  return <DocPage readme={BoundsReadme} visxPackage=\"bounds\" />;\n}\nexport default BoundsDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/brush.tsx",
    "content": "import React from 'react';\nimport BrushReadme from '!!raw-loader!../../../../visx-brush/Readme.md';\nimport * as BrushComponents from '../../../../visx-brush/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport BrushTile from '../../components/Gallery/BrushTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('brush', BrushComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [BrushTile];\n\nfunction BrushDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={BrushReadme} visxPackage=\"brush\" />\n  );\n}\nexport default BrushDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/chord.tsx",
    "content": "import React from 'react';\nimport ChordReadme from '!!raw-loader!../../../../visx-chord/Readme.md';\nimport * as ChordComponents from '../../../../visx-chord/src';\nimport DocPage from '../../components/DocPage';\nimport ChordTile from '../../components/Gallery/ChordTile';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('chord', ChordComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [ChordTile];\n\nfunction ChordDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={ChordReadme} visxPackage=\"chord\" />\n  );\n}\nexport default ChordDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/clip-path.tsx",
    "content": "import React from 'react';\nimport ClipPathReadme from '!!raw-loader!../../../../visx-clip-path/Readme.md';\nimport * as ClipPathComponents from '../../../../visx-clip-path/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('clip-path', ClipPathComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nfunction ClipPathDocs() {\n  return <DocPage components={components} readme={ClipPathReadme} visxPackage=\"clip-path\" />;\n}\nexport default ClipPathDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/curve.tsx",
    "content": "import React from 'react';\nimport CurveReadme from '!!raw-loader!../../../../visx-curve/Readme.md';\nimport DocPage from '../../components/DocPage';\nimport CurvesTile from '../../components/Gallery/CurvesTile';\n\nconst examples = [CurvesTile];\n\nfunction CurveDocs() {\n  return <DocPage readme={CurveReadme} examples={examples} visxPackage=\"curve\" />;\n}\nexport default CurveDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/delaunay.tsx",
    "content": "import React from 'react';\nimport DelaunayReadme from '!!raw-loader!../../../../visx-delaunay/Readme.md';\nimport * as DelaunayComponents from '../../../../visx-delaunay/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport DelaunayTriangulationTile from '../../components/Gallery/DelaunayTriangulationTile';\nimport DelaunayVoronoiTile from '../../components/Gallery/DelaunayVoronoiTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('delaunay', DelaunayComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [DelaunayVoronoiTile, DelaunayTriangulationTile];\n\nfunction DelaunayDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={DelaunayReadme}\n      visxPackage=\"delaunay\"\n    />\n  );\n}\nexport default DelaunayDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/drag.tsx",
    "content": "import React from 'react';\nimport DragReadme from '!!raw-loader!../../../../visx-drag/Readme.md';\nimport * as DragComponents from '../../../../visx-drag/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport DragITile from '../../components/Gallery/DragITile';\nimport DragIITile from '../../components/Gallery/DragIITile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('drag', DragComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [DragITile, DragIITile];\n\nfunction DragDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={DragReadme} visxPackage=\"drag\" />\n  );\n}\nexport default DragDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/event.tsx",
    "content": "import React from 'react';\nimport EventReadme from '!!raw-loader!../../../../visx-event/Readme.md';\nimport DocPage from '../../components/DocPage';\nimport AreaTile from '../../components/Gallery/AreaTile';\nimport DotsTile from '../../components/Gallery/DotsTile';\nimport VoronoiTile from '../../components/Gallery/VoronoiTile';\n\nconst examples = [AreaTile, DotsTile, VoronoiTile];\n\nfunction EventDocs() {\n  return <DocPage readme={EventReadme} examples={examples} visxPackage=\"event\" />;\n}\nexport default EventDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/geo.tsx",
    "content": "import React from 'react';\nimport GeoReadme from '!!raw-loader!../../../../visx-geo/Readme.md';\nimport * as GeoComponents from '../../../../visx-geo/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport GeoMercatorTile from '../../components/Gallery/GeoMercatorTile';\nimport GeoCustomTile from '../../components/Gallery/GeoCustomTile';\nimport GeoAlbersUsaTile from '../../components/Gallery/GeoAlbersUsaTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('geo', GeoComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [GeoMercatorTile, GeoCustomTile, GeoAlbersUsaTile];\n\nfunction GeoDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={GeoReadme} visxPackage=\"geo\" />\n  );\n}\nexport default GeoDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/glyph.tsx",
    "content": "import React from 'react';\nimport GlyphReadme from '!!raw-loader!../../../../visx-glyph/Readme.md';\nimport * as Glyph from '../../../../visx-glyph/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport GlyphsTile from '../../components/Gallery/GlyphsTile';\nimport LegendsTile from '../../components/Gallery/LegendsTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('glyph', Glyph);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  // @ts-expect-errorTS doesn't know about docgenInfo\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(\n    // @ts-expect-errorTS doesn't know about docgenInfo\n    b?.__docgenInfo?.displayName ?? '',\n  ),\n);\n\nconst examples = [GlyphsTile, LegendsTile];\n\nfunction GlyphDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={GlyphReadme} visxPackage=\"glyph\" />\n  );\n}\nexport default GlyphDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/gradient.tsx",
    "content": "import React from 'react';\nimport GradientReadme from '!!raw-loader!../../../../visx-gradient/Readme.md';\nimport * as Gradients from '../../../../visx-gradient/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport GradientsTile from '../../components/Gallery/GradientsTile';\nimport AreaTile from '../../components/Gallery/AreaTile';\nimport BarsTile from '../../components/Gallery/BarsTile';\nimport ChordTile from '../../components/Gallery/ChordTile';\nimport DragIITile from '../../components/Gallery/DragIITile';\nimport PiesTile from '../../components/Gallery/PiesTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('gradient', Gradients);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) => {\n  // @ts-expect-errorTS doesn't know about docgenInfo\n  const aName = a?.__docgenInfo?.displayName ?? '';\n  // @ts-expect-errorTS doesn't know about docgenInfo\n  const bName = b?.__docgenInfo?.displayName ?? '';\n  return (\n    (aName === 'LinearGradient' && -2) ||\n    (bName === 'LinearGradient' && 2) ||\n    (aName === 'RadialGradient' && -1) ||\n    (bName === 'RadialGradient' && 1) ||\n    aName.localeCompare(bName)\n  );\n});\n\nconst examples = [GradientsTile, PiesTile, ChordTile, AreaTile, BarsTile, DragIITile];\n\nfunction GradientDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={GradientReadme}\n      visxPackage=\"gradient\"\n    />\n  );\n}\nexport default GradientDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/grid.tsx",
    "content": "import React from 'react';\nimport GridReadme from '!!raw-loader!../../../../visx-grid/Readme.md';\nimport * as GridComponents from '../../../../visx-grid/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport AxisTile from '../../components/Gallery/AxisTile';\nimport BarStackTile from '../../components/Gallery/BarStackTile';\nimport ThresholdTile from '../../components/Gallery/ThresholdTile';\nimport LineRadialTile from '../../components/Gallery/LineRadialTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('grid', GridComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [AxisTile, BarStackTile, ThresholdTile, LineRadialTile];\n\nfunction GridDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={GridReadme} visxPackage=\"grid\" />\n  );\n}\nexport default GridDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/group.tsx",
    "content": "import React from 'react';\nimport GroupReadme from '!!raw-loader!../../../../visx-group/Readme.md';\nimport * as GroupComponents from '../../../../visx-group/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport PatternsTile from '../../components/Gallery/PatternsTile';\nimport RadarTile from '../../components/Gallery/RadarTile';\nimport PiesTile from '../../components/Gallery/PiesTile';\nimport TreemapTile from '../../components/Gallery/TreemapTile';\nimport StatsPlotTile from '../../components/Gallery/StatsPlotTile';\nimport LineRadialTile from '../../components/Gallery/LineRadialTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('group', GroupComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [PatternsTile, RadarTile, PiesTile, TreemapTile, StatsPlotTile, LineRadialTile];\n\nfunction GroupDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={GroupReadme} visxPackage=\"group\" />\n  );\n}\nexport default GroupDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/heatmap.tsx",
    "content": "import React from 'react';\nimport HeatmapReadme from '!!raw-loader!../../../../visx-heatmap/Readme.md';\nimport * as HeatmapComponents from '../../../../visx-heatmap/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport HeatmapsTile from '../../components/Gallery/HeatmapsTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('heatmap', HeatmapComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [HeatmapsTile];\n\nfunction HeatmapDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={HeatmapReadme}\n      visxPackage=\"heatmap\"\n    />\n  );\n}\nexport default HeatmapDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/hierarchy.tsx",
    "content": "import React from 'react';\nimport HierarchyReadme from '!!raw-loader!../../../../visx-hierarchy/Readme.md';\nimport * as HierarchyComponents from '../../../../visx-hierarchy/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport PackTile from '../../components/Gallery/PackTile';\nimport TreemapTile from '../../components/Gallery/TreemapTile';\nimport DendrogramsTile from '../../components/Gallery/DendrogramsTile';\nimport LinkTypesTile from '../../components/Gallery/LinkTypesTile';\nimport TreesTile from '../../components/Gallery/TreesTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('hierarchy', HierarchyComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [PackTile, TreemapTile, DendrogramsTile, LinkTypesTile, TreesTile];\n\nfunction HierarchyDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={HierarchyReadme}\n      visxPackage=\"hierarchy\"\n    />\n  );\n}\nexport default HierarchyDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/legend.tsx",
    "content": "import React from 'react';\nimport LegendReadme from '!!raw-loader!../../../../visx-legend/Readme.md';\nimport * as LegendComponents from '../../../../visx-legend/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport LegendsTile from '../../components/Gallery/LegendsTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('legend', LegendComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [LegendsTile];\n\nfunction LegendDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={LegendReadme}\n      visxPackage=\"legend\"\n    />\n  );\n}\nexport default LegendDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/marker.tsx",
    "content": "import React from 'react';\nimport MarkerReadme from '!!raw-loader!../../../../visx-marker/Readme.md';\nimport * as MarkerComponents from '../../../../visx-marker/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('marker', MarkerComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nfunction MarkerDocs() {\n  return <DocPage components={components} readme={MarkerReadme} visxPackage=\"marker\" />;\n}\nexport default MarkerDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/mock-data.tsx",
    "content": "import React from 'react';\nimport MockDataReadme from '!!raw-loader!../../../../visx-mock-data/Readme.md';\nimport DocPage from '../../components/DocPage';\nimport PackTile from '../../components/Gallery/PackTile';\nimport TreemapTile from '../../components/Gallery/TreemapTile';\nimport PiesTile from '../../components/Gallery/PiesTile';\nimport ChordTile from '../../components/Gallery/ChordTile';\nimport CurvesTile from '../../components/Gallery/CurvesTile';\nimport StatsPlotTile from '../../components/Gallery/StatsPlotTile';\n\nconst examples = [PackTile, TreemapTile, PiesTile, ChordTile, CurvesTile, StatsPlotTile];\n\nfunction MockDataDocs() {\n  return <DocPage examples={examples} readme={MockDataReadme} visxPackage=\"mock-data\" />;\n}\nexport default MockDataDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/network.tsx",
    "content": "import React from 'react';\nimport NetworkReadme from '!!raw-loader!../../../../visx-network/Readme.md';\nimport * as NetworkComponents from '../../../../visx-network/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport NetworkTile from '../../components/Gallery/NetworkTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('network', NetworkComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [NetworkTile];\n\nfunction NetworkDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={NetworkReadme}\n      visxPackage=\"network\"\n    />\n  );\n}\nexport default NetworkDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/pattern.tsx",
    "content": "import React from 'react';\nimport PatternReadme from '!!raw-loader!../../../../visx-pattern/Readme.md';\nimport * as PatternComponents from '../../../../visx-pattern/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport PatternsTile from '../../components/Gallery/PatternsTile';\nimport StreamGraphTile from '../../components/Gallery/StreamGraphTile';\nimport StatsPlotTile from '../../components/Gallery/StatsPlotTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('pattern', PatternComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [PatternsTile, StreamGraphTile, StatsPlotTile];\n\nfunction PatternDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={PatternReadme}\n      visxPackage=\"pattern\"\n    />\n  );\n}\nexport default PatternDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/point.tsx",
    "content": "import React from 'react';\nimport PointReadme from '!!raw-loader!../../../../visx-point/Readme.md';\nimport DocPage from '../../components/DocPage';\nimport RadarTile from '../../components/Gallery/RadarTile';\n\nconst examples = [RadarTile];\n\nfunction PointDocs() {\n  return <DocPage examples={examples} readme={PointReadme} visxPackage=\"point\" />;\n}\nexport default PointDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/react-spring.tsx",
    "content": "import React from 'react';\nimport ReactSpringReadme from '!!raw-loader!../../../../visx-react-spring/README.md';\nimport * as ReactSpringComponents from '../../../../visx-react-spring/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport AxisTile from '../../components/Gallery/AxisTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('react-spring', ReactSpringComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [AxisTile];\n\nfunction ReactSpringDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={ReactSpringReadme}\n      visxPackage=\"react-spring\"\n    />\n  );\n}\nexport default ReactSpringDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/responsive.tsx",
    "content": "import React from 'react';\nimport ResponsiveReadme from '!!raw-loader!../../../../visx-responsive/Readme.md';\nimport * as ResponsiveComponents from '../../../../visx-responsive/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport ResponsiveTile from '../../components/Gallery/ResponsiveTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('responsive', ResponsiveComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [ResponsiveTile];\n\nfunction ResponsiveDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={ResponsiveReadme}\n      visxPackage=\"responsive\"\n    />\n  );\n}\nexport default ResponsiveDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/sankey.tsx",
    "content": "import React from 'react';\nimport SankeyReadme from '!!raw-loader!../../../../visx-sankey/Readme.md';\nimport * as SankeyComponents from '../../../../visx-sankey/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport SankeyTile from '../../components/Gallery/SankeyTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('sankey', SankeyComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [SankeyTile];\n\nfunction SankeyDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={SankeyReadme}\n      visxPackage=\"sankey\"\n    />\n  );\n}\nexport default SankeyDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/scale.tsx",
    "content": "import React from 'react';\nimport ScaleReadme from '!!raw-loader!../../../../visx-scale/Readme.md';\nimport DocPage from '../../components/DocPage';\nimport AxisTile from '../../components/Gallery/AxisTile';\nimport LegendsTile from '../../components/Gallery/LegendsTile';\nimport BarGroupTile from '../../components/Gallery/BarGroupTile';\nimport GeoMercatorTile from '../../components/Gallery/GeoMercatorTile';\nimport LineRadialTile from '../../components/Gallery/LineRadialTile';\nimport StreamGraphTile from '../../components/Gallery/StreamGraphTile';\n\nconst examples = [\n  AxisTile,\n  LegendsTile,\n  LineRadialTile,\n  StreamGraphTile,\n  BarGroupTile,\n  GeoMercatorTile,\n];\n\nfunction ScaleDocs() {\n  return <DocPage examples={examples} readme={ScaleReadme} visxPackage=\"scale\" />;\n}\nexport default ScaleDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/shape.tsx",
    "content": "import React from 'react';\nimport ShapeReadme from '!!raw-loader!../../../../visx-shape/Readme.md';\nimport * as Shapes from '../../../../visx-shape/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport LineRadialTile from '../../components/Gallery/LineRadialTile';\nimport PiesTile from '../../components/Gallery/PiesTile';\nimport StreamGraphTile from '../../components/Gallery/StreamGraphTile';\nimport ThresholdTile from '../../components/Gallery/ThresholdTile';\nimport StackedAreasTile from '../../components/Gallery/StackedAreasTile';\nimport BarStackHorizontalTile from '../../components/Gallery/BarStackHorizontalTile';\nimport BarGroupTile from '../../components/Gallery/BarGroupTile';\nimport RadarTile from '../../components/Gallery/RadarTile';\nimport LinkTypesTile from '../../components/Gallery/LinkTypesTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('shape', Shapes);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  // @ts-expect-errorTS doesn't know about docgenInfo\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(\n    // @ts-expect-errorTS doesn't know about docgenInfo\n    b?.__docgenInfo?.displayName ?? '',\n  ),\n);\n\nconst examples = [\n  LineRadialTile,\n  PiesTile,\n  StreamGraphTile,\n  ThresholdTile,\n  StackedAreasTile,\n  BarStackHorizontalTile,\n  BarGroupTile,\n  RadarTile,\n  LinkTypesTile,\n];\n\nfunction ShapeDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={ShapeReadme} visxPackage=\"shape\" />\n  );\n}\nexport default ShapeDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/stats.tsx",
    "content": "import React from 'react';\nimport StatsReadme from '!!raw-loader!../../../../visx-stats/Readme.md';\nimport * as StatsComponents from '../../../../visx-stats/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport StatsPlotTile from '../../components/Gallery/StatsPlotTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('stats', StatsComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [StatsPlotTile];\n\nfunction StatsDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={StatsReadme} visxPackage=\"stats\" />\n  );\n}\nexport default StatsDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/text.tsx",
    "content": "import React from 'react';\nimport TextReadme from '!!raw-loader!../../../../visx-text/Readme.md';\nimport * as TextComponents from '../../../../visx-text/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport TextTile from '../../components/Gallery/TextTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('text', TextComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [TextTile];\n\nfunction TextDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={TextReadme} visxPackage=\"text\" />\n  );\n}\nexport default TextDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/threshold.tsx",
    "content": "import React from 'react';\nimport ThresholdReadme from '!!raw-loader!../../../../visx-threshold/Readme.md';\nimport * as ThresholdComponents from '../../../../visx-threshold/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport ThresholdTile from '../../components/Gallery/ThresholdTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('threshold', ThresholdComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [ThresholdTile];\n\nfunction ThresholdDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={ThresholdReadme}\n      visxPackage=\"threshold\"\n    />\n  );\n}\nexport default ThresholdDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/tooltip.tsx",
    "content": "import React from 'react';\nimport TooltipReadme from '!!raw-loader!../../../../visx-tooltip/Readme.md';\nimport * as TooltipComponents from '../../../../visx-tooltip/src';\n\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport TooltipTile from '../../components/Gallery/TooltipTile';\nimport DotsTile from '../../components/Gallery/DotsTile';\nimport BarStackHorizontalTile from '../../components/Gallery/BarStackHorizontalTile';\nimport StatsPlotTile from '../../components/Gallery/StatsPlotTile';\nimport AreaTile from '../../components/Gallery/AreaTile';\n\nconst examples = [TooltipTile, DotsTile, BarStackHorizontalTile, StatsPlotTile, AreaTile];\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('tooltip', TooltipComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nfunction TooltipDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={TooltipReadme}\n      visxPackage=\"tooltip\"\n    />\n  );\n}\nexport default TooltipDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/visx.tsx",
    "content": "import React from 'react';\nimport VisxReadme from '!!raw-loader!../../../../visx-visx/Readme.md';\nimport DocPage from '../../components/DocPage';\n\nfunction VisxDocs() {\n  return <DocPage readme={VisxReadme} visxPackage=\"visx\" />;\n}\nexport default VisxDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/voronoi.tsx",
    "content": "import React from 'react';\nimport VoronoiReadme from '!!raw-loader!../../../../visx-voronoi/Readme.md';\nimport * as VoronoiComponents from '../../../../visx-voronoi/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport VoronoiTile from '../../components/Gallery/VoronoiTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('voronoi', VoronoiComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [VoronoiTile];\n\nfunction VoronoiDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={VoronoiReadme}\n      visxPackage=\"voronoi\"\n    />\n  );\n}\nexport default VoronoiDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/wordcloud.tsx",
    "content": "import React from 'react';\nimport WordcloudReadme from '!!raw-loader!../../../../visx-wordcloud/Readme.md';\nimport * as WordcloudComponents from '../../../../visx-wordcloud/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport WordcloudTile from '../../components/Gallery/WordcloudTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('wordcloud', WordcloudComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [WordcloudTile];\n\nfunction WordcloudDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={WordcloudReadme}\n      visxPackage=\"wordcloud\"\n    />\n  );\n}\nexport default WordcloudDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/xychart.tsx",
    "content": "import React from 'react';\nimport XYChartReadme from '!!raw-loader!../../../../visx-xychart/README.md';\nimport * as XYChartPackage from '../../../../visx-xychart/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport XYChartTile from '../../components/Gallery/XYChartTile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('xychart', XYChartPackage);\n\nconst components = Object.values(componentsWithDocs);\n\nconst examples = [XYChartTile];\n\nfunction XYChartDocs() {\n  return (\n    <DocPage\n      components={components}\n      examples={examples}\n      readme={XYChartReadme}\n      visxPackage=\"xychart\"\n    />\n  );\n}\n\nexport default XYChartDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs/zoom.tsx",
    "content": "import React from 'react';\nimport ZoomReadme from '!!raw-loader!../../../../visx-zoom/Readme.md';\nimport * as ZoomComponents from '../../../../visx-zoom/src';\nimport DocPage from '../../components/DocPage';\nimport { attachDocGenInfo } from '../../utils/getDocGenInfo';\nimport ZoomITile from '../../components/Gallery/ZoomITile';\n\n// Attach documentation to components\nconst componentsWithDocs = attachDocGenInfo('zoom', ZoomComponents);\n\nconst components = Object.values(componentsWithDocs).sort((a, b) =>\n  (a?.__docgenInfo?.displayName ?? '').localeCompare(b?.__docgenInfo?.displayName ?? ''),\n);\n\nconst examples = [ZoomITile];\n\nfunction ZoomDocs() {\n  return (\n    <DocPage components={components} examples={examples} readme={ZoomReadme} visxPackage=\"zoom\" />\n  );\n}\nexport default ZoomDocs;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/docs.tsx",
    "content": "import React from 'react';\nimport Page from '../components/Page';\nimport Footer from '../components/Footer';\nimport PackageList from '../components/PackageList';\n\nexport default function Docs() {\n  return (\n    <Page title=\"documentation\">\n      <div className=\"container\">\n        <h1>Documentation</h1>\n        <p>\n          <code>visx</code> is a suite of several low-level standalone packages for building visual\n          interfaces with <code>react</code>. Packages can be mixed and used together depending on\n          your use case, or you can simply add the umbrella <a href=\"/visx/docs/visx\">@visx/visx</a>{' '}\n          package to use them all.\n          <br /> <br />\n          Individual packages can be roughly categorized as follows:\n        </p>\n        <PackageList grid />\n      </div>\n      <Footer />\n      <style jsx>{`\n        .container {\n          margin-top: 24px;\n          margin-bottom: 40px;\n        }\n        .container > p > pre {\n          display: inline;\n        }\n        @media (min-width: 800px) {\n          .container > p {\n            max-width: 60vw;\n          }\n        }\n      `}</style>\n    </Page>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/pages/dots.tsx",
    "content": "import React from 'react';\nimport Dots from '../sandboxes/visx-dots/Example';\nimport packageJson from '../sandboxes/visx-dots/package.json';\nimport Show from '../components/Show';\nimport DotsSource from '!!raw-loader!../sandboxes/visx-dots/Example';\n\nfunction DotsPage() {\n  return (\n    <Show\n      component={Dots}\n      title=\"Dots\"\n      codeSandboxDirectoryName=\"visx-dots\"\n      packageJson={packageJson}\n    >\n      {DotsSource}\n    </Show>\n  );\n}\nexport default DotsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/drag-i.tsx",
    "content": "import React from 'react';\nimport DragI from '../sandboxes/visx-drag-i/Example';\nimport packageJson from '../sandboxes/visx-drag-i/package.json';\nimport Show from '../components/Show';\nimport DragISource from '!!raw-loader!../sandboxes/visx-drag-i/Example';\n\nfunction DragIPage() {\n  return (\n    <Show\n      component={DragI}\n      title=\"Drag I\"\n      codeSandboxDirectoryName=\"visx-drag-i\"\n      packageJson={packageJson}\n    >\n      {DragISource}\n    </Show>\n  );\n}\nexport default DragIPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/drag-ii.tsx",
    "content": "import React from 'react';\nimport DragII from '../sandboxes/visx-drag-ii/Example';\nimport packageJson from '../sandboxes/visx-drag-ii/package.json';\nimport Show from '../components/Show';\nimport DragIISource from '!!raw-loader!../sandboxes/visx-drag-ii/Example';\n\nfunction DragIIPage() {\n  return (\n    <Show\n      component={DragII}\n      title=\"Drag II\"\n      codeSandboxDirectoryName=\"visx-drag-ii\"\n      packageJson={packageJson}\n    >\n      {DragIISource}\n    </Show>\n  );\n}\nexport default DragIIPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/gallery.tsx",
    "content": "import React from 'react';\nimport Page from '../components/Page';\nimport Gallery from '../components/Gallery';\n\nfunction GalleryPage() {\n  return (\n    <Page wrapper={false} title=\"gallery\">\n      <Gallery />\n    </Page>\n  );\n}\n\nexport default GalleryPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/geo-albers-usa.tsx",
    "content": "import React from 'react';\nimport GeoAlbersUsa from '../sandboxes/visx-geo-albers-usa/Example';\nimport packageJson from '../sandboxes/visx-geo-albers-usa/package.json';\nimport Show from '../components/Show';\nimport GeoAlbersUsaSource from '!!raw-loader!../sandboxes/visx-geo-albers-usa/Example';\n\nfunction GeoAlbersUsaPage() {\n  return (\n    <Show\n      events\n      component={GeoAlbersUsa}\n      title=\"Geo AlbersUsa\"\n      codeSandboxDirectoryName=\"visx-geo-albers-usa\"\n      packageJson={packageJson}\n    >\n      {GeoAlbersUsaSource}\n    </Show>\n  );\n}\nexport default GeoAlbersUsaPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/geo-custom.tsx",
    "content": "import React from 'react';\nimport GeoCustom from '../sandboxes/visx-geo-custom/Example';\nimport packageJson from '../sandboxes/visx-geo-custom/package.json';\nimport Show from '../components/Show';\nimport GeoCustomSource from '!!raw-loader!../sandboxes/visx-geo-custom/Example';\n\nfunction GeoCustomPage() {\n  return (\n    <Show\n      events\n      component={GeoCustom}\n      title=\"Geo Custom\"\n      codeSandboxDirectoryName=\"visx-geo-custom\"\n      packageJson={packageJson}\n    >\n      {GeoCustomSource}\n    </Show>\n  );\n}\nexport default GeoCustomPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/geo-mercator.tsx",
    "content": "import React from 'react';\nimport GeoMercator from '../sandboxes/visx-geo-mercator/Example';\nimport packageJson from '../sandboxes/visx-geo-mercator/package.json';\nimport Show from '../components/Show';\nimport GeoMercatorSource from '!!raw-loader!../sandboxes/visx-geo-mercator/Example';\n\nfunction GeoMercatorPage() {\n  return (\n    <Show\n      events\n      component={GeoMercator}\n      title=\"Geo Mercator\"\n      codeSandboxDirectoryName=\"visx-geo-mercator\"\n      packageJson={packageJson}\n    >\n      {GeoMercatorSource}\n    </Show>\n  );\n}\nexport default GeoMercatorPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/glyphs.tsx",
    "content": "import React from 'react';\nimport Glyphs from '../sandboxes/visx-glyph/Example';\nimport packageJson from '../sandboxes/visx-glyph/package.json';\nimport Show from '../components/Show';\nimport GlyphsSource from '!!raw-loader!../sandboxes/visx-glyph/Example';\n\nfunction GlyphsPage() {\n  return (\n    <Show\n      component={Glyphs}\n      title=\"Glyphs\"\n      codeSandboxDirectoryName=\"visx-glyph\"\n      packageJson={packageJson}\n    >\n      {GlyphsSource}\n    </Show>\n  );\n}\nexport default GlyphsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/gradients.tsx",
    "content": "import React from 'react';\nimport Gradients from '../sandboxes/visx-gradient/Example';\nimport packageJson from '../sandboxes/visx-gradient/package.json';\nimport Show from '../components/Show';\nimport GradientsSource from '!!raw-loader!../sandboxes/visx-gradient/Example';\n\nfunction GradientsPage() {\n  return (\n    <Show\n      shadow\n      component={Gradients}\n      title=\"Gradients\"\n      codeSandboxDirectoryName=\"visx-gradient\"\n      packageJson={packageJson}\n    >\n      {GradientsSource}\n    </Show>\n  );\n}\nexport default GradientsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/heatmaps.tsx",
    "content": "import React from 'react';\nimport Heatmaps from '../sandboxes/visx-heatmap/Example';\nimport packageJson from '../sandboxes/visx-heatmap/package.json';\nimport Show from '../components/Show';\nimport HeatmapsSource from '!!raw-loader!../sandboxes/visx-heatmap/Example';\n\nfunction HeatmapsPage() {\n  return (\n    <Show\n      events\n      margin={{\n        top: 10,\n        left: 40,\n        right: 30,\n        bottom: 80,\n      }}\n      component={Heatmaps}\n      title=\"Heatmaps\"\n      codeSandboxDirectoryName=\"visx-heatmap\"\n      packageJson={packageJson}\n    >\n      {HeatmapsSource}\n    </Show>\n  );\n}\nexport default HeatmapsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/home.tsx",
    "content": "// @ts-nocheck\nimport React from 'react';\nimport Link from 'next/link';\nimport { ParentSize } from '@visx/responsive';\nimport Dots from '../sandboxes/visx-dots/Example';\nimport Zoom from '../sandboxes/visx-zoom-i/Example';\nimport Radial from '../sandboxes/visx-shape-line-radial/Example';\nimport Bars from '../sandboxes/visx-bars/Example';\nimport Footer from '../components/Footer';\nimport Page from '../components/Page';\n\nconst Button = React.forwardRef(({ onClick, href, children }, ref) => (\n  <a href={href} onClick={onClick} ref={ref}>\n    {children}\n    <style jsx>{`\n      a {\n        display: block;\n        width: 100%;\n        font-size: 22px;\n        border: none;\n        background-color: #ebebeb;\n        padding: 1rem 0;\n        border-radius: 14px;\n        font-weight: 500;\n        text-align: center;\n      }\n      @media (max-width: 600px) {\n        a {\n          font-size: 20px;\n        }\n      }\n    `}</style>\n  </a>\n));\n\nfunction Home() {\n  return (\n    <Page>\n      <div className=\"home\">\n        <div className=\"wrapper home-hero-container\">\n          <div className=\"stack home-x\" />\n          <div className=\"stack home-guides\" />\n        </div>\n        <div className=\"wrapper container\">\n          <div className=\"content\">\n            <h3>\n              <strong>visx</strong> a collection of expressive, low-level visualization primitives\n              for React\n            </h3>\n            <p>\n              At Airbnb, we made it a goal to unify our visualization stack across the company and\n              in the process, we created a new project that brings together the power of D3 with the\n              joy of React.\n            </p>\n            <p>Here are the advantages of visx:</p>\n            <ol>\n              <li>\n                <strong>Keep bundle sizes down.</strong> visx is split into multiple packages. Start\n                small and use only what you need.\n              </li>\n              <li>\n                <strong>Un-opinionated on purpose.</strong> Bring your own state management,\n                animation library, or CSS-in-JS solution. Odds are good your React app already has\n                an opinion on how animation, theming, or styling is done. visx is careful not to add\n                another one and integrates with all of them.\n              </li>\n              <li>\n                <strong>Not a charting library.</strong> As you start using visualization\n                primitives, you’ll end up building your own charting library that’s optimized for\n                your use case. You’re in control.\n              </li>\n            </ol>\n            <p>\n              And most importantly — it’s just React. If you know React, you can make\n              visualizations. It’s all the same standard APIs and familiar patterns. visx should\n              feel at home in any React codebase.\n            </p>\n          </div>\n          <div className=\"links\">\n            <div className=\"buttons\">\n              <a href=\"https://github.com/airbnb/visx\">\n                <Button>View on GitHub</Button>\n              </a>\n            </div>\n            <div className=\"link\">\n              <Link href=\"/zoom-i\">\n                <ParentSize>\n                  {(size) => (\n                    <div style={{ pointerEvents: 'none' }}>\n                      <Zoom {...size} height={size.height > 0 ? size.height : 400} />\n                    </div>\n                  )}\n                </ParentSize>\n              </Link>\n            </div>\n            <div className=\"link\">\n              <Link href=\"/dots\">\n                <ParentSize>{(size) => <Dots {...size} showControls={false} />}</ParentSize>\n              </Link>\n            </div>\n            <div className=\"link\">\n              <Link href=\"/bars\">\n                <ParentSize>{(size) => <Bars {...size} />}</ParentSize>\n              </Link>\n            </div>\n            <div className=\"link\">\n              <Link href=\"/lineradial\">\n                <ParentSize>{(size) => <Radial animate={false} {...size} />}</ParentSize>\n              </Link>\n            </div>\n            <div className=\"buttons\">\n              <Link href=\"/gallery\" passHref>\n                <Button>View Gallery</Button>\n              </Link>\n            </div>\n          </div>\n        </div>\n      </div>\n      <Footer />\n      <style global jsx>{`\n        .link .mini-map,\n        .link .controls {\n          display: none !important;\n        }\n      `}</style>\n      <style jsx>{`\n        .links {\n          margin: 2rem 2rem 0;\n          display: grid;\n          grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));\n          grid-gap: 2rem;\n        }\n        .link {\n          background-color: #ebebeb;\n          height: 420px;\n          overflow: hidden;\n          border-radius: 14px;\n        }\n        .buttons,\n        .link:first-child {\n          grid-column: span 2;\n        }\n        .home-hero-container {\n          max-width: 105rem;\n          height: 60vh;\n          min-height: 40vh;\n          background-color: #ff1231;\n          position: relative;\n          border-radius: 14px;\n        }\n        .stack {\n          position: absolute;\n          top: 0;\n          left: 0;\n          right: 0;\n          bottom: 0;\n        }\n        .home-x {\n          background-image: url('static/x-light.svg');\n          background-size: 50% 50%;\n          background-position: center;\n          background-repeat: no-repeat;\n        }\n        .home-guides {\n          background-image: url('static/x-guide.svg');\n          background-size: contain;\n          background-position: center;\n          background-repeat: repeat;\n        }\n        strong {\n          font-weight: 500;\n        }\n        .btn {\n          padding: 8px 20px;\n          background-color: #fc2e1c;\n          border-radius: 30px;\n          border-top-right-radius: 0;\n          color: #ffffff;\n          text-transform: uppercase;\n          margin-right: 1rem;\n        }\n\n        .hero-x {\n          background-color: #ff1231;\n        }\n\n        .btn-container {\n          margin-top: 8rem;\n          display: flex;\n          flex-direction: row;\n          align-items: center;\n          justify-content: center;\n        }\n\n        .home {\n          align-self: center;\n          background: white;\n          min-height: 80vh;\n          margin: 0 auto;\n          padding-bottom: 1rem;\n        }\n\n        .home h1 {\n          font-size: 95pt;\n          line-height: 1em;\n          margin: 0;\n          padding: 0;\n          color: #272727;\n        }\n\n        .home h3 {\n          font-size: 36px;\n          line-height: 1em;\n          width: 80%;\n          margin: 1rem 0;\n          font-weight: 300;\n          color: #767676;\n        }\n\n        .home h3 strong {\n          font-size: 42px;\n          color: #272727;\n          font-weight: 600;\n        }\n\n        .hero {\n          display: flex;\n          align-items: center;\n          justify-content: center;\n          flex-direction: column;\n          min-height: 60vh;\n          background-size: 50%;\n          background-repeat: no-repeat;\n          background-position: center;\n          background-image: url('static/tiger-gray.png');\n          margin-bottom: 1rem;\n        }\n\n        .container {\n          display: grid;\n          align-items: flex-start;\n          flex-direction: column;\n          grid-template-columns: 1fr 1fr;\n        }\n\n        .content {\n          color: #272727;\n          margin: 1rem auto 0;\n          padding: 0 1rem;\n          max-width: 680px;\n          display: flex;\n          flex-direction: column;\n          background-color: #fff;\n        }\n\n        blockquote {\n          border-left: 2px solid #efefef;\n          padding: 0.5rem 1rem;\n          color: #777;\n        }\n\n        blockquote p {\n          margin: 0;\n        }\n\n        .faq {\n          min-width: 640px;\n        }\n\n        li {\n          list-style-type: decimal;\n          margin-bottom: 1rem;\n          margin-left: 1.25rem;\n        }\n        li:last-child {\n          margin-bottom: 0;\n        }\n\n        @media (max-width: 600px) {\n          .hero h1 {\n            font-size: 35pt;\n            margin-top: 40px;\n            padding: 0;\n          }\n\n          .home h3 {\n            font-size: 24px;\n            line-height: 1em;\n            width: 100%;\n            margin: 1rem 0 0.5rem;\n            font-weight: 300;\n            color: #767676;\n          }\n\n          .home h3 strong {\n            font-size: 28px;\n            color: #272727;\n            font-weight: 600;\n          }\n\n          .home .content {\n            font-size: 20px;\n            line-height: 1.3em;\n          }\n\n          .btn {\n            font-size: 12px;\n            padding: 4px 20px;\n            margin-top: 2rem;\n          }\n\n          .hero {\n            height: 50vh;\n            background-size: 90%;\n            margin-bottom: 1rem;\n          }\n\n          .home {\n            margin-top: 0.5rem;\n            grid-template-columns: 1fr;\n          }\n\n          .content,\n          .faq {\n            min-width: 300px;\n          }\n\n          .container {\n            display: block;\n          }\n\n          .links {\n            display: flex;\n            flex-direction: column;\n            grid-gap: 0;\n            margin: 0.5rem;\n          }\n          .link {\n            height: 40vh;\n            margin: 0.5rem 0;\n          }\n          .buttons:first-child {\n            margin-bottom: 1rem;\n          }\n          .buttons:last-child {\n            margin-top: 1rem;\n          }\n        }\n      `}</style>\n    </Page>\n  );\n}\n\nexport default Home;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/index.tsx",
    "content": "import Home from './home';\n\nexport default Home;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/legends.tsx",
    "content": "import React from 'react';\nimport Legends from '../sandboxes/visx-legend/Example';\nimport packageJson from '../sandboxes/visx-legend/package.json';\nimport Show from '../components/Show';\nimport LegendsSource from '!!raw-loader!../sandboxes/visx-legend/Example';\n\nfunction LegendsPage() {\n  return (\n    <Show\n      events\n      component={Legends}\n      title=\"Legends\"\n      codeSandboxDirectoryName=\"visx-legend\"\n      packageJson={packageJson}\n    >\n      {LegendsSource}\n    </Show>\n  );\n}\nexport default LegendsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/lineradial.tsx",
    "content": "import React from 'react';\nimport LineRadial from '../sandboxes/visx-shape-line-radial/Example';\nimport packageJson from '../sandboxes/visx-shape-line-radial/package.json';\nimport Show from '../components/Show';\nimport LineRadialSource from '!!raw-loader!../sandboxes/visx-shape-line-radial/Example';\n\nfunction LineRadialPage() {\n  return (\n    <Show\n      component={LineRadial}\n      title=\"Line Radial\"\n      codeSandboxDirectoryName=\"visx-shape-line-radial\"\n      packageJson={packageJson}\n    >\n      {LineRadialSource}\n    </Show>\n  );\n}\nexport default LineRadialPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/linktypes.tsx",
    "content": "import React from 'react';\nimport LinkTypes from '../sandboxes/visx-linktypes/Example';\nimport packageJson from '../sandboxes/visx-linktypes/package.json';\nimport Show from '../components/Show';\nimport LinkTypesSource from '!!raw-loader!../sandboxes/visx-linktypes/Example';\n\nfunction LinkTypesPage() {\n  return (\n    <Show\n      events\n      title=\"Link Types\"\n      codeSandboxDirectoryName=\"visx-linktypes\"\n      component={LinkTypes}\n      margin={{\n        top: 40,\n        left: 40,\n        right: 40,\n        bottom: 40,\n      }}\n      packageJson={packageJson}\n    >\n      {LinkTypesSource}\n    </Show>\n  );\n}\nexport default LinkTypesPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/network.tsx",
    "content": "import React from 'react';\nimport Network from '../sandboxes/visx-network/Example';\nimport packageJson from '../sandboxes/visx-network/package.json';\nimport Show from '../components/Show';\nimport NetworkSource from '!!raw-loader!../sandboxes/visx-network/Example';\n\nfunction NetworkPage() {\n  return (\n    <Show\n      component={Network}\n      title=\"Network\"\n      codeSandboxDirectoryName=\"visx-network\"\n      packageJson={packageJson}\n    >\n      {NetworkSource}\n    </Show>\n  );\n}\nexport default NetworkPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/pack.tsx",
    "content": "import React from 'react';\nimport Pack from '../sandboxes/visx-pack/Example';\nimport packageJson from '../sandboxes/visx-pack/package.json';\nimport Show from '../components/Show';\nimport PackSource from '!!raw-loader!../sandboxes/visx-pack/Example';\n\nfunction PackPage() {\n  return (\n    <Show\n      component={Pack}\n      title=\"Pack\"\n      codeSandboxDirectoryName=\"visx-pack\"\n      packageJson={packageJson}\n    >\n      {PackSource}\n    </Show>\n  );\n}\nexport default PackPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/patterns.tsx",
    "content": "import React from 'react';\nimport Patterns from '../sandboxes/visx-pattern/Example';\nimport packageJson from '../sandboxes/visx-pattern/package.json';\nimport Show from '../components/Show';\nimport PatternsSource from '!!raw-loader!../sandboxes/visx-pattern/Example';\n\nfunction PatternsPage() {\n  return (\n    <Show\n      component={Patterns}\n      title=\"Patterns\"\n      margin={{\n        top: 10,\n        left: 10,\n        right: 10,\n        bottom: 10,\n      }}\n      codeSandboxDirectoryName=\"visx-pattern\"\n      packageJson={packageJson}\n    >\n      {PatternsSource}\n    </Show>\n  );\n}\nexport default PatternsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/pies.tsx",
    "content": "import React from 'react';\nimport Pies from '../sandboxes/visx-shape-pie/Example';\nimport packageJson from '../sandboxes/visx-shape-pie/package.json';\nimport Show from '../components/Show';\nimport PiesSource from '!!raw-loader!../sandboxes/visx-shape-pie/Example';\n\nfunction PiesPage() {\n  return (\n    <Show\n      component={Pies}\n      title=\"Pies\"\n      codeSandboxDirectoryName=\"visx-shape-pie\"\n      packageJson={packageJson}\n    >\n      {PiesSource}\n    </Show>\n  );\n}\nexport default PiesPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/polygons.tsx",
    "content": "import React from 'react';\nimport Polygons from '../sandboxes/visx-polygons/Example';\nimport packageJson from '../sandboxes/visx-polygons/package.json';\nimport Show from '../components/Show';\nimport PolygonsSource from '!!raw-loader!../sandboxes/visx-polygons/Example';\n\nfunction PolygonsPage() {\n  return (\n    <Show\n      component={Polygons}\n      title=\"Polygons\"\n      codeSandboxDirectoryName=\"visx-polygons\"\n      packageJson={packageJson}\n    >\n      {PolygonsSource}\n    </Show>\n  );\n}\nexport default PolygonsPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/radar.tsx",
    "content": "import React from 'react';\nimport Radar from '../sandboxes/visx-radar/Example';\nimport packageJson from '../sandboxes/visx-radar/package.json';\nimport Show from '../components/Show';\nimport RadarSource from '!!raw-loader!../sandboxes/visx-radar/Example';\n\nfunction RadarPage() {\n  return (\n    <Show\n      margin={{ top: 0, right: 0, bottom: 50, left: 0 }}\n      component={Radar}\n      title=\"Radar\"\n      codeSandboxDirectoryName=\"visx-radar\"\n      packageJson={packageJson}\n    >\n      {RadarSource}\n    </Show>\n  );\n}\nexport default RadarPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/radial-bars.tsx",
    "content": "import React from 'react';\nimport RadialBars from '../sandboxes/visx-radial-bars/Example';\nimport packageJson from '../sandboxes/visx-radial-bars/package.json';\nimport Show from '../components/Show';\nimport RadialBarsSource from '!!raw-loader!../sandboxes/visx-radial-bars/Example';\n\nfunction BarsRadialPage() {\n  return (\n    <Show\n      events\n      component={RadialBars}\n      title=\"Radial Bars\"\n      codeSandboxDirectoryName=\"visx-radial-bars\"\n      packageJson={packageJson}\n    >\n      {RadialBarsSource}\n    </Show>\n  );\n}\nexport default BarsRadialPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/responsive.tsx",
    "content": "import React from 'react';\nimport Responsive from '../sandboxes/visx-responsive/Example';\nimport packageJson from '../sandboxes/visx-responsive/package.json';\nimport Show from '../components/Show';\nimport ResponsiveSource from '!!raw-loader!../sandboxes/visx-responsive/Example';\n\nfunction ResponsivePage() {\n  return (\n    <Show\n      component={Responsive}\n      title=\"Responsive\"\n      codeSandboxDirectoryName=\"visx-responsive\"\n      packageJson={packageJson}\n    >\n      {ResponsiveSource}\n    </Show>\n  );\n}\nexport default ResponsivePage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/sankey.tsx",
    "content": "import React from 'react';\nimport Sankey from '../sandboxes/visx-sankey/Example';\nimport packageJson from '../sandboxes/visx-sankey/package.json';\nimport Show from '../components/Show';\nimport TreemapSource from '!!raw-loader!../sandboxes/visx-sankey/Example';\n\nfunction SankeyPage() {\n  return (\n    <Show\n      component={Sankey}\n      title=\"Sankey\"\n      codeSandboxDirectoryName=\"visx-sankey\"\n      packageJson={packageJson}\n    >\n      {TreemapSource}\n    </Show>\n  );\n}\nexport default SankeyPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/splitlinepath.tsx",
    "content": "import React from 'react';\nimport SplitLinePathExample from '../sandboxes/visx-shape-splitlinepath/Example';\nimport packageJson from '../sandboxes/visx-shape-splitlinepath/package.json';\nimport Show from '../components/Show';\nimport StatsPlotSource from '!!raw-loader!../sandboxes/visx-shape-splitlinepath/Example';\n\nfunction SplitLinePathPage() {\n  return (\n    <Show\n      events\n      component={SplitLinePathExample}\n      title=\"SplitLinePath\"\n      codeSandboxDirectoryName=\"visx-shape-splitlinepath\"\n      packageJson={packageJson}\n    >\n      {StatsPlotSource}\n    </Show>\n  );\n}\nexport default SplitLinePathPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/stacked-areas.tsx",
    "content": "import React from 'react';\nimport StackedAreas from '../sandboxes/visx-stacked-areas/Example';\nimport packageJson from '../sandboxes/visx-stacked-areas/package.json';\nimport Show from '../components/Show';\nimport StackedAreasSource from '!!raw-loader!../sandboxes/visx-stacked-areas/Example';\n\nfunction StackedAreasPage() {\n  return (\n    <Show\n      component={StackedAreas}\n      title=\"Stacked Areas\"\n      codeSandboxDirectoryName=\"visx-stacked-areas\"\n      margin={{\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 10,\n      }}\n      packageJson={packageJson}\n    >\n      {StackedAreasSource}\n    </Show>\n  );\n}\nexport default StackedAreasPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/statsplot.tsx",
    "content": "import React from 'react';\nimport StatsPlot from '../sandboxes/visx-stats/Example';\nimport packageJson from '../sandboxes/visx-stats/package.json';\nimport Show from '../components/Show';\nimport StatsPlotSource from '!!raw-loader!../sandboxes/visx-stats/Example';\n\nfunction StatsPlotPage() {\n  return (\n    <Show\n      events\n      component={StatsPlot}\n      title=\"BoxPlot + ViolinPlot\"\n      codeSandboxDirectoryName=\"visx-stats\"\n      packageJson={packageJson}\n    >\n      {StatsPlotSource}\n    </Show>\n  );\n}\nexport default StatsPlotPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/streamgraph.tsx",
    "content": "import React from 'react';\nimport Streamgraph from '../sandboxes/visx-streamgraph/Example';\nimport packageJson from '../sandboxes/visx-streamgraph/package.json';\nimport Show from '../components/Show';\nimport StreamgraphSource from '!!raw-loader!../sandboxes/visx-streamgraph/Example';\n\nfunction StreamgraphPage() {\n  return (\n    <Show\n      component={Streamgraph}\n      title=\"Streamgraph\"\n      codeSandboxDirectoryName=\"visx-streamgraph\"\n      packageJson={packageJson}\n    >\n      {StreamgraphSource}\n    </Show>\n  );\n}\nexport default StreamgraphPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/text.tsx",
    "content": "import React, { useState } from 'react';\nimport { Text } from '@visx/text';\nimport Show from '../components/Show';\nimport Codeblock from '../components/Codeblock';\n\nconst styles = {\n  exampleText: {\n    width: 200,\n  },\n  range: {\n    marginLeft: 20,\n    width: 225,\n  },\n  svg: {\n    height: 200,\n    display: 'block',\n    border: '1px solid #aaa',\n    marginBottom: 10,\n  },\n};\n\nfunction TextDemo() {\n  const [exampleText, setExampleText] = useState<string>('This is really long text');\n  const [x, setX] = useState<number>(0);\n  const [y, setY] = useState<number>(0);\n  const [width, setWidth] = useState<number>(225);\n  const [angle, setAngle] = useState<number>(0);\n  const [scaleToFit, setScaleToFit] = useState<boolean>(false);\n  const [textAnchor, setTextAnchor] = useState<string>('start');\n  const [verticalAnchor, setVerticalAnchor] = useState<string>('start');\n  const [fontSize, setFontSize] = useState<string>('1em');\n  const [fontFamily, setFontFamily] = useState<string>('Arial');\n  const [fontWeight, setFontWeight] = useState<string>('400');\n  const [lineHeight, setLineHeight] = useState<string>('1em');\n  const [showAnchor, setShowAnchor] = useState<boolean>(true);\n  const [resizeSvg, setResizeSvg] = useState<boolean>(true);\n\n  return (\n    <div className=\"text-demo--container\">\n      <div className=\"text-demo\">\n        <div className=\"text-demo--left\">\n          <h6>Demo</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text\n              x={x}\n              y={y}\n              width={width}\n              textAnchor={textAnchor as 'start' | 'inherit' | 'middle' | 'end'}\n              verticalAnchor={verticalAnchor as 'start' | 'middle' | 'end'}\n              lineHeight={lineHeight}\n              scaleToFit={scaleToFit}\n              angle={angle}\n              style={{\n                fontSize,\n                fontFamily,\n                fontWeight: isNaN(Number(fontWeight)) ? 200 : Number(fontWeight),\n              }}\n            >\n              {exampleText}\n            </Text>\n            {showAnchor && <circle cx={x} cy={y} r=\"2\" fill=\"red\" />}\n          </svg>\n        </div>\n        <div className=\"text-demo--form\">\n          <div>\n            text:\n            <input\n              type=\"text\"\n              style={styles.exampleText}\n              value={exampleText}\n              onChange={(e) => setExampleText(e.target.value)}\n            />\n          </div>\n\n          <div>\n            x:\n            <input\n              type=\"range\"\n              style={styles.range}\n              min=\"0\"\n              max=\"225\"\n              value={x}\n              onChange={(e) => setX(Number(e.target.value))}\n            />\n            <input type=\"text\" value={x} onChange={(e) => setX(Number(e.target.value))} />\n          </div>\n\n          <div>\n            y:\n            <input\n              type=\"range\"\n              style={styles.range}\n              min=\"0\"\n              max=\"200\"\n              value={y}\n              onChange={(e) => setY(Number(e.target.value))}\n            />\n            <input type=\"text\" value={y} onChange={(e) => setY(Number(e.target.value))} />\n          </div>\n\n          <div>\n            width:\n            <input\n              type=\"range\"\n              style={styles.range}\n              min=\"25\"\n              max=\"225\"\n              value={width}\n              onChange={(e) => setWidth(Number(e.target.value))}\n            />{' '}\n            {width}\n          </div>\n\n          <div>\n            textAnchor:\n            <label>\n              <input\n                type=\"radio\"\n                value=\"start\"\n                onChange={(e) => setTextAnchor(e.target.value)}\n                checked={textAnchor === 'start'}\n              />{' '}\n              start\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                value=\"middle\"\n                onChange={(e) => setTextAnchor(e.target.value)}\n                checked={textAnchor === 'middle'}\n              />{' '}\n              middle\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                value=\"end\"\n                onChange={(e) => setTextAnchor(e.target.value)}\n                checked={textAnchor === 'end'}\n              />{' '}\n              end\n            </label>\n          </div>\n\n          <div>\n            verticalAnchor:\n            <label>\n              <input\n                type=\"radio\"\n                value=\"start\"\n                onChange={(e) => setVerticalAnchor(e.target.value)}\n                checked={verticalAnchor === 'start'}\n              />{' '}\n              start\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                value=\"middle\"\n                onChange={(e) => setVerticalAnchor(e.target.value)}\n                checked={verticalAnchor === 'middle'}\n              />{' '}\n              middle\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                value=\"end\"\n                onChange={(e) => setVerticalAnchor(e.target.value)}\n                checked={verticalAnchor === 'end'}\n              />{' '}\n              end\n            </label>\n          </div>\n\n          <div>\n            fontSize:\n            <input type=\"text\" value={fontSize} onChange={(e) => setFontSize(e.target.value)} />\n          </div>\n\n          <div>\n            fontFamily:\n            <input type=\"text\" value={fontFamily} onChange={(e) => setFontFamily(e.target.value)} />\n          </div>\n\n          <div>\n            fontWeight:\n            <input type=\"text\" value={fontWeight} onChange={(e) => setFontWeight(e.target.value)} />\n          </div>\n\n          <div>\n            lineHeight:\n            <input type=\"text\" value={lineHeight} onChange={(e) => setLineHeight(e.target.value)} />\n          </div>\n\n          <div>\n            angle:\n            <input\n              type=\"range\"\n              min=\"0\"\n              max=\"360\"\n              value={angle}\n              onChange={(e) => setAngle(Number(e.target.value))}\n            />\n          </div>\n\n          <div>\n            <label>\n              scaleToFit:\n              <input\n                type=\"checkbox\"\n                onChange={() => setScaleToFit(!scaleToFit)}\n                checked={scaleToFit}\n              />\n            </label>\n          </div>\n\n          <div>\n            <label>\n              show anchor:\n              <input\n                type=\"checkbox\"\n                onChange={() => setShowAnchor(!showAnchor)}\n                checked={showAnchor}\n              />\n            </label>\n          </div>\n\n          <div>\n            <label>\n              resize svg (container):\n              <input\n                type=\"checkbox\"\n                onChange={() => setResizeSvg(!resizeSvg)}\n                checked={resizeSvg}\n              />\n            </label>\n          </div>\n        </div>\n      </div>\n      <div className=\"text-demos\">\n        <div>\n          <h6>Simple</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={0} width={width} verticalAnchor=\"start\">\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text }) => {\nreturn (\n  <Text\n    x={0}\n    width={width}\n    verticalAnchor=\"start\"\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Centered</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={width / 2} width={width} verticalAnchor=\"start\" textAnchor=\"middle\">\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={width / 2}\n    width={width}\n    verticalAnchor=\"start\"\n    textAnchor=\"middle\"\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Right-aligned</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={width} width={width} verticalAnchor=\"start\" textAnchor=\"end\">\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={width}\n    width={width}\n    verticalAnchor=\"start\"\n    textAnchor=\"end\"\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Line height</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={0} width={width} verticalAnchor=\"start\" lineHeight=\"2em\">\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={0}\n    width={width}\n    verticalAnchor=\"start\"\n    lineHeight=\"2em\"\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Styled text (fontWeight)</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={0} width={width} verticalAnchor=\"start\" style={{ fontWeight: 900 }}>\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={0}\n    width={width}\n    verticalAnchor=\"start\"\n    style={{ fontWeight: 900 }}\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Styled (fontSize px)</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={0} width={width} verticalAnchor=\"start\" style={{ fontSize: '24px' }}>\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={0}\n    width={width}\n    verticalAnchor=\"start\"\n    style={{ fontSize: '24px' }}\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Styled (fontSize em)</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={0} width={width} verticalAnchor=\"start\" style={{ fontSize: '1.5em' }}>\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={0}\n    width={width}\n    verticalAnchor=\"start\"\n    style={{ fontSize: '1.5em' }}\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Styled (fontSize rem)</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={0} width={width} verticalAnchor=\"start\" style={{ fontSize: '1.5rem' }}>\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={0}\n    width={width}\n    verticalAnchor=\"start\"\n    style={{ fontSize: '1.5rem' }}\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Styled (fontSize %)</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={0} width={width} verticalAnchor=\"start\" style={{ fontSize: '150%' }}>\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={0}\n    width={width}\n    verticalAnchor=\"start\"\n    style={{ fontSize: '150%' }}\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>Fit</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text width={width} verticalAnchor=\"start\" scaleToFit>\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    width={width}\n    verticalAnchor=\"start\"\n    scaleToFit\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n\n        <div>\n          <h6>dx & dy</h6>\n          <svg width={resizeSvg ? width : 225} style={styles.svg}>\n            <Text x={50} y={50} dx={10} dy={-10} width={width} verticalAnchor=\"start\">\n              {exampleText}\n            </Text>\n          </svg>\n          <div style={{ marginBottom: '1rem' }}>\n            <div>\n              <div className=\"code\">\n                <Codeblock>{`import { Text } from '@visx/text';\n\n({ text, width }) => {\nreturn (\n  <Text\n    x={50}\n    y={50}\n    dx={10}\n    dy={-10}\n    width={width}\n    verticalAnchor=\"start\"\n  >\n    {text}\n  </Text>\n);\n}`}</Codeblock>\n              </div>\n            </div>\n          </div>\n        </div>\n      </div>\n      <style jsx>{`\n        .text-demos {\n          display: grid;\n          grid-template-columns: repeat(2, 1fr);\n          grid-gap: 1rem;\n          padding: 1rem;\n          grid-auto-rows: minmax(10px, auto);\n        }\n        .text-demos h6 {\n          margin-bottom: 0.5rem;\n          margin-top: 0.5rem;\n        }\n        .text-demo {\n          display: flex;\n          flex-direction: row;\n          border: 1px solid #d3d3d3;\n          border-radius: 14px;\n          padding: 1rem;\n        }\n        .text-demo--left {\n          display: flex;\n          flex-direction: column;\n          flex: 1;\n        }\n        .text-demo--left h6 {\n          margin-top: 0;\n        }\n        .text-demo--form {\n          font-size: 12px;\n        }\n        .text-demo--form input {\n          margin-left: 0.5rem;\n        }\n        .text-demo--container {\n          width: 800px;\n        }\n      `}</style>\n    </div>\n  );\n}\n\nconst packageJson = { dependencies: { '@visx/text': 'latest' } };\n\nfunction TextPage() {\n  return (\n    <Show\n      component={TextDemo}\n      title=\"Text\"\n      margin={{\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 10,\n      }}\n      packageJson={packageJson}\n    />\n  );\n}\nexport default TextPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/threshold.tsx",
    "content": "import React from 'react';\nimport Threshold from '../sandboxes/visx-threshold/Example';\nimport packageJson from '../sandboxes/visx-threshold/package.json';\nimport Show from '../components/Show';\nimport ThresholdSource from '!!raw-loader!../sandboxes/visx-threshold/Example';\n\nfunction Description({ width }: { width: number }) {\n  return (\n    <div style={{ width, fontSize: 14, lineHeight: '1.5em' }}>\n      The temperature in New York compared to San Francisco; days when New York was warmer are\n      green, and colder days are violet. Based on Mike Bostock's{' '}\n      <a href=\"https://bl.ocks.org/mbostock/3894205\" target=\"_blank\" rel=\"noopener noreferrer\">\n        Difference Chart\n      </a>\n      .\n    </div>\n  );\n}\n\nfunction ThresholdPage() {\n  return (\n    <Show\n      component={Threshold}\n      title=\"Threshold\"\n      description={Description}\n      codeSandboxDirectoryName=\"visx-threshold\"\n      packageJson={packageJson}\n    >\n      {ThresholdSource}\n    </Show>\n  );\n}\nexport default ThresholdPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/tooltip.tsx",
    "content": "import React from 'react';\nimport Tooltip from '../sandboxes/visx-tooltip/Example';\nimport packageJson from '../sandboxes/visx-tooltip/package.json';\nimport Show from '../components/Show';\nimport TooltipSource from '!!raw-loader!../sandboxes/visx-tooltip/Example';\n\nfunction TooltipPage() {\n  return (\n    <Show\n      component={Tooltip}\n      title=\"Tooltip\"\n      codeSandboxDirectoryName=\"visx-tooltip\"\n      packageJson={packageJson}\n    >\n      {TooltipSource}\n    </Show>\n  );\n}\nexport default TooltipPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/treemap.tsx",
    "content": "import React from 'react';\nimport Treemap from '../sandboxes/visx-treemap/Example';\nimport packageJson from '../sandboxes/visx-treemap/package.json';\nimport Show from '../components/Show';\nimport TreemapSource from '!!raw-loader!../sandboxes/visx-treemap/Example';\n\nfunction TreemapPage() {\n  return (\n    <Show\n      component={Treemap}\n      title=\"Treemap\"\n      codeSandboxDirectoryName=\"visx-treemap\"\n      packageJson={packageJson}\n    >\n      {TreemapSource}\n    </Show>\n  );\n}\nexport default TreemapPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/trees.tsx",
    "content": "import React from 'react';\nimport Trees from '../sandboxes/visx-tree/Example';\nimport packageJson from '../sandboxes/visx-tree/package.json';\nimport Show from '../components/Show';\nimport TreesSource from '!!raw-loader!../sandboxes/visx-tree/Example';\n\nfunction TreesPage() {\n  return (\n    <Show\n      events\n      title=\"Trees\"\n      component={Trees}\n      codeSandboxDirectoryName=\"visx-tree\"\n      packageJson={packageJson}\n    >\n      {TreesSource}\n    </Show>\n  );\n}\nexport default TreesPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/voronoi.tsx",
    "content": "import React from 'react';\nimport VoronoiChart from '../sandboxes/visx-voronoi/Example';\nimport packageJson from '../sandboxes/visx-voronoi/package.json';\nimport Show from '../components/Show';\nimport VoronoiChartSource from '!!raw-loader!../sandboxes/visx-voronoi/Example';\n\nfunction VoronoiPage() {\n  return (\n    <Show\n      events\n      margin={{\n        top: 0,\n        left: 0,\n        right: 0,\n        bottom: 0,\n      }}\n      component={VoronoiChart}\n      title=\"Voronoi\"\n      codeSandboxDirectoryName=\"visx-voronoi\"\n      packageJson={packageJson}\n    >\n      {VoronoiChartSource}\n    </Show>\n  );\n}\nexport default VoronoiPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/wordcloud.tsx",
    "content": "import React from 'react';\nimport Wordcloud from '../sandboxes/visx-wordcloud/Example';\nimport packageJson from '../sandboxes/visx-wordcloud/package.json';\nimport WordcloudSource from '!!raw-loader!../sandboxes/visx-wordcloud/Example';\nimport Show from '../components/Show';\nimport type { WidthAndHeight } from '../types';\n\nconst component = ({ width, height }: WidthAndHeight) => (\n  <Wordcloud width={width} height={height} showControls />\n);\n\nfunction WordcloudPage() {\n  return (\n    <Show\n      component={component}\n      title=\"Wordcloud\"\n      codeSandboxDirectoryName=\"visx-wordcloud\"\n      packageJson={packageJson}\n    >\n      {WordcloudSource}\n    </Show>\n  );\n}\nexport default WordcloudPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/xychart.tsx",
    "content": "import React from 'react';\nimport XYChart from '../sandboxes/visx-xychart/Example';\nimport packageJson from '../sandboxes/visx-xychart/package.json';\nimport Show from '../components/Show';\nimport XYChartSource from '!!raw-loader!../sandboxes/visx-xychart/Example';\n\nfunction XYChartPage() {\n  return (\n    <Show\n      component={XYChart}\n      title=\"XYChart\"\n      codeSandboxDirectoryName=\"visx-xychart\"\n      packageJson={packageJson}\n    >\n      {XYChartSource}\n    </Show>\n  );\n}\nexport default XYChartPage;\n"
  },
  {
    "path": "packages/visx-demo/src/pages/zoom-i.tsx",
    "content": "import React from 'react';\nimport ZoomI from '../sandboxes/visx-zoom-i/Example';\nimport packageJson from '../sandboxes/visx-zoom-i/package.json';\nimport Show from '../components/Show';\nimport ZoomISource from '!!raw-loader!../sandboxes/visx-zoom-i/Example';\n\nfunction ZoomIPage() {\n  return (\n    <Show\n      component={ZoomI}\n      title=\"Zoom I\"\n      codeSandboxDirectoryName=\"visx-zoom-i\"\n      packageJson={packageJson}\n    >\n      {ZoomISource}\n    </Show>\n  );\n}\nexport default ZoomIPage;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"import/no-relative-packages\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/README.md",
    "content": "### Examples\n\nThis directory contains examples of `visx` usage.\n\nEach folder is a complete standalone project, and is imported using the Code Sandbox\n[import from GitHub feature](https://codesandbox.io/docs/importing#import-from-github).\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/exampleToVisxDependencyLookup.ts",
    "content": "import annotationPackageJson from './visx-annotation/package.json';\nimport areaPackageJson from './visx-area/package.json';\nimport axisPackageJson from './visx-axis/package.json';\nimport bargroupPackageJson from './visx-bargroup/package.json';\nimport bargroupHorizontalPackageJson from './visx-bargroup-horizontal/package.json';\nimport barsPackageJson from './visx-bars/package.json';\nimport barstackPackageJson from './visx-barstack/package.json';\nimport barstackHorizontalPackageJson from './visx-barstack-horizontal/package.json';\nimport brushPackageJson from './visx-brush/package.json';\nimport chordPackageJson from './visx-chord/package.json';\nimport curvePackageJson from './visx-curve/package.json';\nimport delaunayPackageJson from './visx-delaunay-triangulation/package.json';\nimport delaunayVoronoiPackageJson from './visx-delaunay-voronoi/package.json';\nimport dendrogramPackageJson from './visx-dendrogram/package.json';\nimport dotsPackageJson from './visx-dots/package.json';\nimport dragIPackageJson from './visx-drag-i/package.json';\nimport dragIIPackageJson from './visx-drag-ii/package.json';\nimport geoCustomPackageJson from './visx-geo-custom/package.json';\nimport geoMercatorPackageJson from './visx-geo-mercator/package.json';\nimport glyphPackageJson from './visx-glyph/package.json';\nimport gradientPackageJson from './visx-gradient/package.json';\nimport heatmapPackageJson from './visx-heatmap/package.json';\nimport legendPackageJson from './visx-legend/package.json';\nimport linktypesPackageJson from './visx-linktypes/package.json';\nimport networkPackageJson from './visx-network/package.json';\nimport packPackageJson from './visx-pack/package.json';\nimport patternPackageJson from './visx-pattern/package.json';\nimport polygonsPackageJson from './visx-polygons/package.json';\nimport radarPackageJson from './visx-radar/package.json';\nimport responsivePackageJson from './visx-responsive/package.json';\nimport lineRadialPackageJson from './visx-shape-line-radial/package.json';\nimport piePackageJson from './visx-shape-pie/package.json';\nimport sankeyPackageJson from './visx-sankey/package.json';\nimport splitLinePathPackageJson from './visx-shape-splitlinepath/package.json';\nimport stackedAreasPackageJson from './visx-stacked-areas/package.json';\nimport statsPackageJson from './visx-stats/package.json';\nimport streamgraphPackageJson from './visx-streamgraph/package.json';\nimport thresholdPackageJson from './visx-threshold/package.json';\nimport treePackageJson from './visx-tree/package.json';\nimport treemapPackageJson from './visx-treemap/package.json';\nimport voronoiPackageJson from './visx-voronoi/package.json';\nimport wordcloudPackageJson from './visx-wordcloud/package.json';\nimport zoomPackageJson from './visx-zoom-i/package.json';\nimport { packageJson as textPackageJson } from '../components/Gallery/TextTile';\n\nimport extractVisxDepsFromPackageJson from '../components/util/extractVisxDepsFromPackageJson';\nimport type { VisxPackage } from '../types';\n\nconst examples = [\n  annotationPackageJson,\n  areaPackageJson,\n  axisPackageJson,\n  bargroupHorizontalPackageJson,\n  bargroupPackageJson,\n  barsPackageJson,\n  barstackHorizontalPackageJson,\n  barstackPackageJson,\n  brushPackageJson,\n  chordPackageJson,\n  curvePackageJson,\n  delaunayPackageJson,\n  delaunayVoronoiPackageJson,\n  dendrogramPackageJson,\n  dotsPackageJson,\n  dragIIPackageJson,\n  dragIPackageJson,\n  geoCustomPackageJson,\n  geoMercatorPackageJson,\n  glyphPackageJson,\n  gradientPackageJson,\n  heatmapPackageJson,\n  legendPackageJson,\n  lineRadialPackageJson,\n  linktypesPackageJson,\n  networkPackageJson,\n  packPackageJson,\n  patternPackageJson,\n  piePackageJson,\n  polygonsPackageJson,\n  radarPackageJson,\n  responsivePackageJson,\n  sankeyPackageJson,\n  splitLinePathPackageJson,\n  stackedAreasPackageJson,\n  statsPackageJson,\n  streamgraphPackageJson,\n  textPackageJson,\n  thresholdPackageJson,\n  treePackageJson,\n  treemapPackageJson,\n  voronoiPackageJson,\n  wordcloudPackageJson,\n  zoomPackageJson,\n];\n\nconst exampleToVisxDependencyLookup: { [exampleName: string]: Set<VisxPackage> } = {};\nconst seenPackages = new Set<VisxPackage>();\n\nexamples.forEach((packageJson) => {\n  // create a visx package set per example\n  const visxPackages = new Set<VisxPackage>(\n    extractVisxDepsFromPackageJson(packageJson).map(\n      (visxPackage) => visxPackage.split('@visx/')[1] ?? '',\n    ) as VisxPackage[],\n  );\n\n  visxPackages.forEach((visxPackage) => seenPackages.add(visxPackage));\n  exampleToVisxDependencyLookup[packageJson.name] = visxPackages;\n});\n\nexport const visxPackages = Array.from(seenPackages).sort();\n\nexport default exampleToVisxDependencyLookup;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/template/Example.tsx",
    "content": "import React from 'react';\n\ntype Props = {\n  width: number;\n  height: number;\n};\n\nexport default function Example({ width, height }: Props) {\n  return (\n    <>\n      Example\n      <div>\n        width <em>{width}px</em> height <em>{height}px</em>\n      </div>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/template/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/template/package.json",
    "content": "{\n  \"name\": \"@visx/demo-example\",\n  \"description\": \"Standalone visx demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/responsive\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/template/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-annotation/Example.tsx",
    "content": "import React from 'react';\nimport { HtmlLabel, Label, Connector, CircleSubject, LineSubject } from '@visx/annotation';\nimport { LinePath } from '@visx/shape';\n\nimport ExampleControls from './ExampleControls';\nimport findNearestDatum from './findNearestDatum';\n\nexport type AnnotationProps = {\n  width: number;\n  height: number;\n  compact?: boolean;\n};\n\nexport const orange = '#ff7e67';\nexport const greens = ['#ecf4f3', '#68b0ab', '#006a71'];\n\nexport default function Example({ width, height, compact = false }: AnnotationProps) {\n  return (\n    <ExampleControls width={width} height={height} compact={compact}>\n      {({\n        AnnotationComponent,\n        annotationPosition,\n        approxTooltipHeight,\n        connectorType,\n        data,\n        editLabelPosition,\n        editSubjectPosition,\n        getDate,\n        getStockValue,\n        horizontalAnchor,\n        labelType,\n        labelWidth,\n        setAnnotationPosition,\n        showAnchorLine,\n        subjectType,\n        subtitle,\n        title,\n        verticalAnchor,\n        xScale,\n        yScale,\n      }) => (\n        <svg width={width} height={height}>\n          <rect width={width} height={height} fill={greens[0]} />\n          <LinePath\n            stroke={greens[2]}\n            strokeWidth={2}\n            data={data}\n            x={(d) => xScale(getDate(d)) ?? 0}\n            y={(d) => yScale(getStockValue(d)) ?? 0}\n          />\n          <AnnotationComponent\n            width={width}\n            height={height}\n            x={annotationPosition.x}\n            y={annotationPosition.y}\n            dx={annotationPosition.dx}\n            dy={annotationPosition.dy}\n            canEditLabel={editLabelPosition}\n            canEditSubject={editSubjectPosition}\n            onDragEnd={({ event, ...nextPosition }) => {\n              // snap Annotation to the nearest data point\n              const nearestDatum = findNearestDatum({\n                accessor: subjectType === 'horizontal-line' ? getStockValue : getDate,\n                data,\n                scale: subjectType === 'horizontal-line' ? yScale : xScale,\n                value: subjectType === 'horizontal-line' ? nextPosition.y : nextPosition.x,\n              });\n              const x = xScale(getDate(nearestDatum)) ?? 0;\n              const y = yScale(getStockValue(nearestDatum)) ?? 0;\n\n              // flip label to keep in view\n              const shouldFlipDx =\n                (nextPosition.dx > 0 && x + nextPosition.dx + labelWidth > width) ||\n                (nextPosition.dx < 0 && x + nextPosition.dx - labelWidth <= 0);\n              const shouldFlipDy = // 100 is est. tooltip height\n                (nextPosition.dy > 0 && height - (y + nextPosition.dy) < approxTooltipHeight) ||\n                (nextPosition.dy < 0 && y + nextPosition.dy - approxTooltipHeight <= 0);\n              setAnnotationPosition({\n                x,\n                y,\n                dx: (shouldFlipDx ? -1 : 1) * nextPosition.dx,\n                dy: (shouldFlipDy ? -1 : 1) * nextPosition.dy,\n              });\n            }}\n          >\n            <Connector stroke={orange} type={connectorType} />\n            {labelType === 'svg' ? (\n              <Label\n                backgroundFill=\"white\"\n                showAnchorLine={showAnchorLine}\n                anchorLineStroke={greens[2]}\n                backgroundProps={{ stroke: greens[1] }}\n                fontColor={greens[2]}\n                horizontalAnchor={horizontalAnchor}\n                subtitle={subtitle}\n                title={title}\n                verticalAnchor={verticalAnchor}\n                width={labelWidth}\n              />\n            ) : (\n              <HtmlLabel\n                showAnchorLine={showAnchorLine}\n                anchorLineStroke={greens[2]}\n                horizontalAnchor={horizontalAnchor}\n                verticalAnchor={verticalAnchor}\n                containerStyle={{\n                  width: labelWidth,\n                  background: 'white',\n                  border: `1px solid ${greens[1]}`,\n                  borderRadius: 2,\n                  color: greens[2],\n                  fontSize: '0.55em',\n                  lineHeight: '1em',\n                  padding: '0 0.4em 0 1em',\n                  fontWeight: 200,\n                }}\n              >\n                <h3 style={{ margin: '1em 0 -0.5em' }}>{title}</h3>\n                <p>{subtitle}</p>\n              </HtmlLabel>\n            )}\n            {subjectType === 'circle' && <CircleSubject stroke={orange} />}\n            {subjectType !== 'circle' && (\n              <LineSubject\n                orientation={subjectType === 'vertical-line' ? 'vertical' : 'horizontal'}\n                stroke={orange}\n                min={0}\n                max={subjectType === 'vertical-line' ? height : width}\n              />\n            )}\n          </AnnotationComponent>\n        </svg>\n      )}\n    </ExampleControls>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-annotation/ExampleControls.tsx",
    "content": "/* eslint jsx-a11y/label-has-associated-control: 'off', @typescript-eslint/no-explicit-any: 'off' */\nimport React, { useEffect, useMemo, useState } from 'react';\nimport type { AppleStock } from '@visx/mock-data';\nimport { appleStock } from '@visx/mock-data';\nimport type { PickD3Scale } from '@visx/scale';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport { extent } from '@visx/vendor/d3-array';\nimport { Annotation, EditableAnnotation } from '@visx/annotation';\nimport type { AnnotationProps } from './Example';\n\ntype ExampleControlsProps = AnnotationProps & {\n  children: (props: ProvidedProps) => React.ReactNode;\n};\n\ntype AnnotationPosition = { x: number; y: number; dx: number; dy: number };\n\ntype ProvidedProps = {\n  AnnotationComponent: typeof Annotation | typeof EditableAnnotation;\n  anchorLinePosition?: 'auto' | 'all' | 'none';\n  annotationPosition: AnnotationPosition;\n  approxTooltipHeight: number;\n  connectorType: 'line' | 'elbow';\n  data: AppleStock[];\n  editLabelPosition: boolean;\n  editSubjectPosition: boolean;\n  getDate: (d: AppleStock) => number;\n  getStockValue: (d: AppleStock) => number;\n  horizontalAnchor?: 'start' | 'middle' | 'end';\n  labelType: 'svg' | 'html';\n  labelWidth: number;\n  setAnnotationPosition: (position: AnnotationPosition) => void;\n  showAnchorLine: boolean;\n  subjectType: 'circle' | 'horizontal-line' | 'vertical-line';\n  subtitle: string;\n  title: string;\n  verticalAnchor?: 'start' | 'middle' | 'end';\n  xScale: PickD3Scale<'time', number>;\n  yScale: PickD3Scale<'linear', number>;\n};\n\nconst data = appleStock.slice(-100);\nconst getDate = (d: AppleStock) => new Date(d.date).valueOf();\nconst getStockValue = (d: AppleStock) => d.close;\nconst annotateDatum = data[Math.floor(data.length / 2) + 4];\nconst approxTooltipHeight = 70;\n\nexport default function ExampleControls({\n  width,\n  height,\n  compact = false,\n  children,\n}: ExampleControlsProps) {\n  const xScale = useMemo(\n    () =>\n      scaleTime({\n        domain: extent(data, (d) => getDate(d)) as number[],\n        range: [0, width],\n      }),\n    [width],\n  );\n  const yScale = useMemo(\n    () =>\n      scaleLinear({\n        domain: extent(data, (d) => getStockValue(d)) as number[],\n        range: [height - 100, 100],\n      }),\n    [height],\n  );\n\n  const [editLabelPosition, setEditLabelPosition] = useState(false);\n  const [editSubjectPosition, setEditSubjectPosition] = useState(false);\n  const [title, setTitle] = useState('Title');\n  const [subtitle, setSubtitle] = useState(\n    compact ? 'Subtitle' : 'Subtitle with deets and deets and deets and deets',\n  );\n  const [connectorType, setConnectorType] = useState<ProvidedProps['connectorType']>('elbow');\n  const [subjectType, setSubjectType] = useState<ProvidedProps['subjectType']>('circle');\n  const [showAnchorLine, setShowAnchorLine] = useState(true);\n  const [labelType, setLabelType] = useState<ProvidedProps['labelType']>('svg');\n  const [verticalAnchor, setVerticalAnchor] = useState<ProvidedProps['verticalAnchor'] | 'auto'>(\n    'auto',\n  );\n  const [horizontalAnchor, setHorizontalAnchor] = useState<\n    ProvidedProps['horizontalAnchor'] | 'auto'\n  >('auto');\n  const [labelWidth] = useState(compact ? 100 : 175);\n  const [annotationPosition, setAnnotationPosition] = useState({\n    x: xScale(getDate(annotateDatum)) ?? 0,\n    y: yScale(getStockValue(annotateDatum)) ?? 0,\n    dx: compact ? -50 : -100,\n    dy: compact ? -30 : -50,\n  });\n  // update annotation position when scale's change\n  useEffect(() => {\n    setAnnotationPosition((currPosition) => ({\n      ...currPosition,\n      x: xScale(getDate(annotateDatum)) ?? 0,\n      y: yScale(getStockValue(annotateDatum)) ?? 0,\n    }));\n  }, [xScale, yScale]);\n\n  return (\n    <>\n      {children({\n        AnnotationComponent:\n          editLabelPosition || editSubjectPosition ? EditableAnnotation : Annotation,\n        annotationPosition,\n        approxTooltipHeight,\n        connectorType,\n        data,\n        editLabelPosition,\n        editSubjectPosition,\n        getDate,\n        getStockValue,\n        horizontalAnchor: horizontalAnchor === 'auto' ? undefined : horizontalAnchor,\n        labelType,\n        labelWidth,\n        setAnnotationPosition,\n        showAnchorLine,\n        subjectType,\n        subtitle,\n        title,\n        verticalAnchor: verticalAnchor === 'auto' ? undefined : verticalAnchor,\n        xScale,\n        yScale,\n      })}\n      {!compact && (\n        <div className=\"controls\">\n          <div>\n            <label>\n              <strong>Title</strong>&nbsp;&nbsp;\n              <input type=\"text\" onChange={(e) => setTitle(e.target.value)} value={title} />\n            </label>\n            &nbsp;&nbsp;&nbsp;\n            <label>\n              <strong>Subtitle</strong>&nbsp;&nbsp;\n              <input type=\"text\" onChange={(e) => setSubtitle(e.target.value)} value={subtitle} />\n            </label>\n            &nbsp;&nbsp;&nbsp;\n            <label>\n              <input\n                type=\"checkbox\"\n                onChange={() => setEditSubjectPosition(!editSubjectPosition)}\n                checked={editSubjectPosition}\n              />\n              Edit subject position\n            </label>\n            &nbsp;&nbsp;\n            <label>\n              <input\n                type=\"checkbox\"\n                onChange={() => setEditLabelPosition(!editLabelPosition)}\n                checked={editLabelPosition}\n              />\n              Edit label position\n            </label>\n          </div>\n          <div>\n            <strong>Label content type</strong>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setLabelType('svg')}\n                checked={labelType === 'svg'}\n              />\n              Svg\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setLabelType('html')}\n                checked={labelType === 'html'}\n              />\n              Html\n            </label>\n          </div>\n          <div>\n            <strong>Connector type</strong>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setConnectorType('elbow')}\n                checked={connectorType === 'elbow'}\n              />\n              Elbow\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setConnectorType('line')}\n                checked={connectorType === 'line'}\n              />\n              Straight line\n            </label>\n          </div>\n          <div>\n            <strong>Subject type</strong>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setSubjectType('circle')}\n                checked={subjectType === 'circle'}\n              />\n              Circle\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setSubjectType('vertical-line')}\n                checked={subjectType === 'vertical-line'}\n              />\n              Vertical line\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setSubjectType('horizontal-line')}\n                checked={subjectType === 'horizontal-line'}\n              />\n              Horizontal line\n            </label>\n          </div>\n          <div>\n            <strong>Horizontal label anchor</strong>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setHorizontalAnchor('auto')}\n                checked={horizontalAnchor === 'auto'}\n              />\n              auto\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setHorizontalAnchor('start')}\n                checked={horizontalAnchor === 'start'}\n              />\n              left\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setHorizontalAnchor('middle')}\n                checked={horizontalAnchor === 'middle'}\n              />\n              middle\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setHorizontalAnchor('end')}\n                checked={horizontalAnchor === 'end'}\n              />\n              right\n            </label>\n          </div>\n          <div>\n            <strong>Vertical label anchor</strong>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setVerticalAnchor('auto')}\n                checked={verticalAnchor === 'auto'}\n              />\n              auto\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setVerticalAnchor('start')}\n                checked={verticalAnchor === 'start'}\n              />\n              top\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setVerticalAnchor('middle')}\n                checked={verticalAnchor === 'middle'}\n              />\n              middle\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                onChange={() => setVerticalAnchor('end')}\n                checked={verticalAnchor === 'end'}\n              />\n              bottom\n            </label>\n            <div>\n              <label>\n                <input\n                  type=\"checkbox\"\n                  onChange={() => setShowAnchorLine(!showAnchorLine)}\n                  checked={showAnchorLine}\n                />\n                Show anchor line\n              </label>\n            </div>\n          </div>\n        </div>\n      )}\n      <style jsx>{`\n        .controls {\n          font-size: 13px;\n          line-height: 1.5em;\n        }\n        .controls > div {\n          margin-bottom: 4px;\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-annotation/findNearestDatum.ts",
    "content": "import type { AppleStock } from '@visx/mock-data';\nimport { bisector } from '@visx/vendor/d3-array';\nimport type { scaleLinear, scaleTime } from '@visx/scale';\n\nexport default function findNearestDatum({\n  value,\n  scale,\n  accessor,\n  data,\n}: {\n  value: number;\n  scale: ReturnType<typeof scaleLinear | typeof scaleTime>;\n  accessor: (d: AppleStock) => number;\n  data: AppleStock[];\n}): AppleStock {\n  const bisect = bisector(accessor).left;\n  const nearestValue = scale.invert(value) as number;\n  const nearestValueIndex = bisect(data, nearestValue, 1);\n  const d0 = data[nearestValueIndex - 1];\n  const d1 = data[nearestValueIndex];\n  let nearestDatum = d0;\n  if (d1 && accessor(d1)) {\n    nearestDatum = nearestValue - accessor(d0) > accessor(d1) - nearestValue ? d1 : d0;\n  }\n  return nearestDatum;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-annotation/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-annotation/package.json",
    "content": "{\n  \"name\": \"@visx/demo-annotation\",\n  \"description\": \"Standalone visx annotation demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/annotation\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"annotation\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-annotation/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-area/Example.tsx",
    "content": "import React, { useMemo, useCallback } from 'react';\nimport { AreaClosed, Line, Bar } from '@visx/shape';\nimport type { AppleStock } from '@visx/mock-data';\nimport { appleStock } from '@visx/mock-data';\nimport { curveMonotoneX } from '@visx/curve';\nimport { GridRows, GridColumns } from '@visx/grid';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport { withTooltip, Tooltip, TooltipWithBounds, defaultStyles } from '@visx/tooltip';\nimport type { WithTooltipProvidedProps } from '@visx/tooltip';\nimport { localPoint } from '@visx/event';\nimport { LinearGradient } from '@visx/gradient';\nimport { max, extent, bisector } from '@visx/vendor/d3-array';\nimport { timeFormat } from '@visx/vendor/d3-time-format';\n\ntype TooltipData = AppleStock;\n\nconst stock = appleStock.slice(800);\nexport const background = '#3b6978';\nexport const background2 = '#204051';\nexport const accentColor = '#edffea';\nexport const accentColorDark = '#75daad';\nconst tooltipStyles = {\n  ...defaultStyles,\n  background,\n  border: '1px solid white',\n  color: 'white',\n};\n\n// util\nconst formatDate = timeFormat(\"%b %d, '%y\");\n\n// accessors\nconst getDate = (d: AppleStock) => new Date(d.date);\nconst getStockValue = (d: AppleStock) => d.close;\nconst bisectDate = bisector<AppleStock, Date>((d) => new Date(d.date)).left;\n\nexport type AreaProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default withTooltip<AreaProps, TooltipData>(\n  ({\n    width,\n    height,\n    margin = { top: 0, right: 0, bottom: 0, left: 0 },\n    showTooltip,\n    hideTooltip,\n    tooltipData,\n    tooltipTop = 0,\n    tooltipLeft = 0,\n  }: AreaProps & WithTooltipProvidedProps<TooltipData>) => {\n    if (width < 10) return null;\n\n    // bounds\n    const innerWidth = width - margin.left - margin.right;\n    const innerHeight = height - margin.top - margin.bottom;\n\n    // scales\n    const dateScale = useMemo(\n      () =>\n        scaleTime({\n          range: [margin.left, innerWidth + margin.left],\n          domain: extent(stock, getDate) as [Date, Date],\n        }),\n      [innerWidth, margin.left],\n    );\n    const stockValueScale = useMemo(\n      () =>\n        scaleLinear({\n          range: [innerHeight + margin.top, margin.top],\n          domain: [0, (max(stock, getStockValue) || 0) + innerHeight / 3],\n          nice: true,\n        }),\n      [margin.top, innerHeight],\n    );\n\n    // tooltip handler\n    const handleTooltip = useCallback(\n      (event: React.TouchEvent<SVGRectElement> | React.MouseEvent<SVGRectElement>) => {\n        const { x } = localPoint(event) || { x: 0 };\n        const x0 = dateScale.invert(x);\n        const index = bisectDate(stock, x0, 1);\n        const d0 = stock[index - 1];\n        const d1 = stock[index];\n        let d = d0;\n        if (d1 && getDate(d1)) {\n          d = x0.valueOf() - getDate(d0).valueOf() > getDate(d1).valueOf() - x0.valueOf() ? d1 : d0;\n        }\n        showTooltip({\n          tooltipData: d,\n          tooltipLeft: x,\n          tooltipTop: stockValueScale(getStockValue(d)),\n        });\n      },\n      [showTooltip, stockValueScale, dateScale],\n    );\n\n    return (\n      <div>\n        <svg width={width} height={height}>\n          <rect\n            x={0}\n            y={0}\n            width={width}\n            height={height}\n            fill=\"url(#area-background-gradient)\"\n            rx={14}\n          />\n          <LinearGradient id=\"area-background-gradient\" from={background} to={background2} />\n          <LinearGradient id=\"area-gradient\" from={accentColor} to={accentColor} toOpacity={0.1} />\n          <GridRows\n            left={margin.left}\n            scale={stockValueScale}\n            width={innerWidth}\n            strokeDasharray=\"1,3\"\n            stroke={accentColor}\n            strokeOpacity={0}\n            pointerEvents=\"none\"\n          />\n          <GridColumns\n            top={margin.top}\n            scale={dateScale}\n            height={innerHeight}\n            strokeDasharray=\"1,3\"\n            stroke={accentColor}\n            strokeOpacity={0.2}\n            pointerEvents=\"none\"\n          />\n          <AreaClosed<AppleStock>\n            data={stock}\n            x={(d) => dateScale(getDate(d)) ?? 0}\n            y={(d) => stockValueScale(getStockValue(d)) ?? 0}\n            yScale={stockValueScale}\n            strokeWidth={1}\n            stroke=\"url(#area-gradient)\"\n            fill=\"url(#area-gradient)\"\n            curve={curveMonotoneX}\n          />\n          <Bar\n            x={margin.left}\n            y={margin.top}\n            width={innerWidth}\n            height={innerHeight}\n            fill=\"transparent\"\n            rx={14}\n            onTouchStart={handleTooltip}\n            onTouchMove={handleTooltip}\n            onMouseMove={handleTooltip}\n            onMouseLeave={() => hideTooltip()}\n          />\n          {tooltipData && (\n            <g>\n              <Line\n                from={{ x: tooltipLeft, y: margin.top }}\n                to={{ x: tooltipLeft, y: innerHeight + margin.top }}\n                stroke={accentColorDark}\n                strokeWidth={2}\n                pointerEvents=\"none\"\n                strokeDasharray=\"5,2\"\n              />\n              <circle\n                cx={tooltipLeft}\n                cy={tooltipTop + 1}\n                r={4}\n                fill=\"black\"\n                fillOpacity={0.1}\n                stroke=\"black\"\n                strokeOpacity={0.1}\n                strokeWidth={2}\n                pointerEvents=\"none\"\n              />\n              <circle\n                cx={tooltipLeft}\n                cy={tooltipTop}\n                r={4}\n                fill={accentColorDark}\n                stroke=\"white\"\n                strokeWidth={2}\n                pointerEvents=\"none\"\n              />\n            </g>\n          )}\n        </svg>\n        {tooltipData && (\n          <div>\n            <TooltipWithBounds\n              key={Math.random()}\n              top={tooltipTop - 12}\n              left={tooltipLeft + 12}\n              style={tooltipStyles}\n            >\n              {`$${getStockValue(tooltipData)}`}\n            </TooltipWithBounds>\n            <Tooltip\n              top={innerHeight + margin.top - 14}\n              left={tooltipLeft}\n              style={{\n                ...defaultStyles,\n                minWidth: 72,\n                textAlign: 'center',\n                transform: 'translateX(-50%)',\n              }}\n            >\n              {formatDate(getDate(tooltipData))}\n            </Tooltip>\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-area/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-area/package.json",
    "content": "{\n  \"name\": \"@visx/demo-area\",\n  \"description\": \"Standalone visx area demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/event\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/grid\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/tooltip\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"area\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-area/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-axis/Example.tsx",
    "content": "import React, { useState, useMemo } from 'react';\nimport { AreaClosed } from '@visx/shape';\nimport { curveMonotoneX } from '@visx/curve';\nimport type { ScaleInput } from '@visx/scale';\nimport { scaleUtc, scaleLinear, scaleLog, scaleBand, coerceNumber } from '@visx/scale';\nimport type { SharedAxisProps, AxisScale } from '@visx/axis';\nimport { Axis, Orientation } from '@visx/axis';\nimport { GridRows, GridColumns } from '@visx/grid';\nimport { AnimatedAxis, AnimatedGridRows, AnimatedGridColumns } from '@visx/react-spring';\nimport { getSeededRandom } from '@visx/mock-data';\nimport { LinearGradient } from '@visx/gradient';\nimport { timeFormat } from '@visx/vendor/d3-time-format';\nimport type { GridRowsProps, GridColumnsProps } from '@visx/grid';\n\nexport const backgroundColor = '#da7cff';\nconst axisColor = '#fff';\nconst tickLabelColor = '#fff';\nexport const labelColor = '#340098';\nconst gridColor = '#6e0fca';\nconst seededRandom = getSeededRandom(0.5);\nconst margin = {\n  top: 40,\n  right: 150,\n  bottom: 20,\n  left: 50,\n};\n\nconst tickLabelProps = {\n  fill: tickLabelColor,\n  fontSize: 12,\n  fontFamily: 'sans-serif',\n  textAnchor: 'middle',\n} as const;\n\nconst getMinMax = (vals: (number | { valueOf(): number })[]) => {\n  const numericVals = vals.map(coerceNumber);\n  return [Math.min(...numericVals), Math.max(...numericVals)];\n};\n\nexport type AxisProps = {\n  width: number;\n  height: number;\n  showControls?: boolean;\n};\n\ntype AnimationTrajectory = 'outside' | 'center' | 'min' | 'max' | undefined;\n\ntype AxisComponentType = React.FC<\n  SharedAxisProps<AxisScale> & {\n    animationTrajectory: AnimationTrajectory;\n  }\n>;\ntype GridRowsComponentType = React.FC<\n  GridRowsProps<AxisScale> & {\n    animationTrajectory: AnimationTrajectory;\n  }\n>;\ntype GridColumnsComponentType = React.FC<\n  GridColumnsProps<AxisScale> & {\n    animationTrajectory: AnimationTrajectory;\n  }\n>;\n\nexport default function Example({\n  width: outerWidth = 800,\n  height: outerHeight = 800,\n  showControls = true,\n}: AxisProps) {\n  // use non-animated components if prefers-reduced-motion is set\n  const prefersReducedMotionQuery =\n    typeof window === 'undefined' ? false : window.matchMedia('(prefers-reduced-motion: reduce)');\n  const prefersReducedMotion = !prefersReducedMotionQuery || !!prefersReducedMotionQuery.matches;\n  const [useAnimatedComponents, setUseAnimatedComponents] = useState(!prefersReducedMotion);\n\n  // in svg, margin is subtracted from total width/height\n  const width = outerWidth - margin.left - margin.right;\n  const height = outerHeight - margin.top - margin.bottom;\n  const [dataToggle, setDataToggle] = useState(true);\n  const [animationTrajectory, setAnimationTrajectory] = useState<AnimationTrajectory>('center');\n\n  // define some types\n  interface AxisDemoProps<Scale extends AxisScale> extends SharedAxisProps<Scale> {\n    values: ScaleInput<Scale>[];\n  }\n\n  const AxisComponent: AxisComponentType = useAnimatedComponents ? AnimatedAxis : Axis;\n  const GridRowsComponent: GridRowsComponentType = useAnimatedComponents\n    ? AnimatedGridRows\n    : GridRows;\n  const GridColumnsComponent: GridColumnsComponentType = useAnimatedComponents\n    ? AnimatedGridColumns\n    : GridColumns;\n\n  const axes: AxisDemoProps<AxisScale<number>>[] = useMemo(() => {\n    // toggle between two value ranges to demo animation\n    const linearValues = dataToggle ? [0, 2, 4, 6, 8, 10] : [6, 8, 10, 12];\n    const bandValues = dataToggle ? ['a', 'b', 'c', 'd'] : ['d', 'c', 'b', 'a'];\n    const timeValues = dataToggle\n      ? [new Date('2020-01-01'), new Date('2020-02-01')]\n      : [new Date('2020-02-01'), new Date('2020-03-01')];\n    const logValues = dataToggle ? [1, 10, 100, 1000, 10000] : [0.0001, 0.001, 0.1, 1, 10, 100];\n\n    return [\n      {\n        scale: scaleLinear({\n          domain: getMinMax(linearValues),\n          range: [0, width],\n        }),\n        values: linearValues,\n        tickFormat: (v: number, index: number, ticks: { value: number; index: number }[]) =>\n          index === 0 ? 'first' : index === ticks[ticks.length - 1].index ? 'last' : `${v}`,\n        label: 'linear',\n      },\n      {\n        scale: scaleBand({\n          domain: bandValues,\n          range: [0, width],\n          paddingOuter: 0,\n          paddingInner: 1,\n        }),\n        values: bandValues,\n        tickFormat: (v: string) => v,\n        label: 'categories',\n      },\n      {\n        scale: scaleUtc({\n          domain: getMinMax(timeValues),\n          range: [0, width],\n        }),\n        values: timeValues,\n        tickFormat: (v: Date, i: number) =>\n          i === 3 ? '🎉' : width > 400 || i % 2 === 0 ? timeFormat('%b %d')(v) : '',\n        label: 'time',\n      },\n      {\n        scale: scaleLog({\n          domain: getMinMax(logValues),\n          range: [0, width],\n        }),\n        values: logValues,\n        tickFormat: (v: number) => {\n          const asString = `${v}`;\n          // label only major ticks\n          return asString.match(/^[.01?[\\]]*$/) ? asString : '';\n        },\n        label: 'log',\n      },\n    ];\n  }, [dataToggle, width]);\n\n  if (width < 10) return null;\n\n  const scalePadding = 40;\n  const scaleHeight = height / axes.length - scalePadding;\n\n  const yScale = scaleLinear({\n    domain: [100, 0],\n    range: [scaleHeight, 0],\n  });\n\n  return (\n    <>\n      <svg width={outerWidth} height={outerHeight}>\n        <LinearGradient\n          id=\"visx-axis-gradient\"\n          from={backgroundColor}\n          to={backgroundColor}\n          toOpacity={0.5}\n        />\n        <rect\n          x={0}\n          y={0}\n          width={outerWidth}\n          height={outerHeight}\n          fill={'url(#visx-axis-gradient)'}\n          rx={14}\n        />\n        <g transform={`translate(${margin.left},${margin.top})`}>\n          {axes.map(({ scale, values, label, tickFormat }, i) => (\n            <g key={`scale-${i}`} transform={`translate(0, ${i * (scaleHeight + scalePadding)})`}>\n              <GridRowsComponent\n                // force remount when this changes to see the animation difference\n                key={`gridrows-${animationTrajectory}`}\n                scale={yScale}\n                stroke={gridColor}\n                width={width}\n                numTicks={dataToggle ? 1 : 3}\n                animationTrajectory={animationTrajectory}\n              />\n              <GridColumnsComponent\n                // force remount when this changes to see the animation difference\n                key={`gridcolumns-${animationTrajectory}`}\n                scale={scale}\n                stroke={gridColor}\n                height={scaleHeight}\n                numTicks={dataToggle ? 5 : 2}\n                animationTrajectory={animationTrajectory}\n              />\n              <AreaClosed\n                data={values.map((x) => [\n                  (scale(x) ?? 0) +\n                    // offset point half of band width for band scales\n                    ('bandwidth' in scale && typeof scale!.bandwidth !== 'undefined'\n                      ? scale.bandwidth!() / 2\n                      : 0),\n                  yScale(10 + seededRandom() * 90),\n                ])}\n                yScale={yScale}\n                curve={curveMonotoneX}\n                fill={gridColor}\n                fillOpacity={0.2}\n              />\n              <AxisComponent\n                // force remount when this changes to see the animation difference\n                key={`axis-${animationTrajectory}`}\n                orientation={Orientation.bottom}\n                top={scaleHeight}\n                scale={scale}\n                tickFormat={tickFormat}\n                stroke={axisColor}\n                tickStroke={axisColor}\n                tickLabelProps={tickLabelProps}\n                tickValues={label === 'log' || label === 'time' ? undefined : values}\n                numTicks={label === 'time' ? 6 : undefined}\n                label={label}\n                labelProps={{\n                  x: width + 30,\n                  y: -10,\n                  fill: labelColor,\n                  fontSize: 18,\n                  strokeWidth: 0,\n                  stroke: '#fff',\n                  paintOrder: 'stroke',\n                  fontFamily: 'sans-serif',\n                  textAnchor: 'start',\n                }}\n                animationTrajectory={animationTrajectory}\n              />\n            </g>\n          ))}\n        </g>\n      </svg>\n      {showControls && (\n        <>\n          <div style={{ fontSize: 12 }}>\n            <label>\n              <input\n                type=\"checkbox\"\n                onChange={() => setUseAnimatedComponents(!useAnimatedComponents)}\n                checked={useAnimatedComponents}\n              />{' '}\n              enable animation\n            </label>\n            &nbsp;&nbsp;&nbsp;\n            {useAnimatedComponents && (\n              <>\n                <strong>animation trajectory</strong>\n                <label>\n                  <input\n                    type=\"radio\"\n                    onChange={() => setAnimationTrajectory('outside')}\n                    checked={animationTrajectory === 'outside'}\n                  />{' '}\n                  outside\n                </label>\n                <label>\n                  <input\n                    type=\"radio\"\n                    onChange={() => setAnimationTrajectory('center')}\n                    checked={animationTrajectory === 'center'}\n                  />{' '}\n                  center\n                </label>\n                <label>\n                  <input\n                    type=\"radio\"\n                    onChange={() => setAnimationTrajectory('min')}\n                    checked={animationTrajectory === 'min'}\n                  />{' '}\n                  min\n                </label>\n                <label>\n                  <input\n                    type=\"radio\"\n                    onChange={() => setAnimationTrajectory('max')}\n                    checked={animationTrajectory === 'max'}\n                  />{' '}\n                  max\n                </label>\n              </>\n            )}\n          </div>\n          {useAnimatedComponents && (\n            <button onClick={() => setDataToggle(!dataToggle)}>Update scales</button>\n          )}\n        </>\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-axis/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-axis/package.json",
    "content": "{\n  \"name\": \"@visx/demo-axis\",\n  \"description\": \"Standalone axis demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/grid\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/react-spring\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"@react-spring/web\": \"^10.0.3\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"axis\",\n    \"scales\",\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-axis/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup/Example.tsx",
    "content": "import React from 'react';\nimport { Group } from '@visx/group';\nimport { BarGroup } from '@visx/shape';\nimport { AxisBottom } from '@visx/axis';\nimport type { CityTemperature } from '@visx/mock-data';\nimport { cityTemperature } from '@visx/mock-data';\nimport { scaleBand, scaleLinear, scaleOrdinal } from '@visx/scale';\nimport { timeParse, timeFormat } from '@visx/vendor/d3-time-format';\n\nexport type BarGroupProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  events?: boolean;\n};\n\ntype CityName = 'New York' | 'San Francisco' | 'Austin';\n\nconst blue = '#aeeef8';\nexport const green = '#e5fd3d';\nconst purple = '#9caff6';\nexport const background = '#612efb';\n\nconst data = cityTemperature.slice(0, 8);\nconst keys = Object.keys(data[0]).filter((d) => d !== 'date') as CityName[];\nconst defaultMargin = { top: 40, right: 0, bottom: 40, left: 0 };\n\nconst parseDate = timeParse('%Y-%m-%d');\nconst format = timeFormat('%b %d');\nconst formatDate = (date: string) => format(parseDate(date) as Date);\n\n// accessors\nconst getDate = (d: CityTemperature) => d.date;\n\n// scales\nconst dateScale = scaleBand<string>({\n  domain: data.map(getDate),\n  padding: 0.2,\n});\nconst cityScale = scaleBand<string>({\n  domain: keys,\n  padding: 0.1,\n});\nconst tempScale = scaleLinear<number>({\n  domain: [0, Math.max(...data.map((d) => Math.max(...keys.map((key) => Number(d[key])))))],\n});\nconst colorScale = scaleOrdinal<string, string>({\n  domain: keys,\n  range: [blue, green, purple],\n});\n\nexport default function Example({\n  width,\n  height,\n  events = false,\n  margin = defaultMargin,\n}: BarGroupProps) {\n  // bounds\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n\n  // update scale output dimensions\n  dateScale.rangeRound([0, xMax]);\n  cityScale.rangeRound([0, dateScale.bandwidth()]);\n  tempScale.range([yMax, 0]);\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />\n      <Group top={margin.top} left={margin.left}>\n        <BarGroup\n          data={data}\n          keys={keys}\n          height={yMax}\n          x0={getDate}\n          x0Scale={dateScale}\n          x1Scale={cityScale}\n          yScale={tempScale}\n          color={colorScale}\n        >\n          {(barGroups) =>\n            barGroups.map((barGroup) => (\n              <Group key={`bar-group-${barGroup.index}-${barGroup.x0}`} left={barGroup.x0}>\n                {barGroup.bars.map((bar) => (\n                  <rect\n                    key={`bar-group-bar-${barGroup.index}-${bar.index}-${bar.value}-${bar.key}`}\n                    x={bar.x}\n                    y={bar.y}\n                    width={bar.width}\n                    height={bar.height}\n                    fill={bar.color}\n                    rx={4}\n                    onClick={() => {\n                      if (!events) return;\n                      const { key, value } = bar;\n                      alert(JSON.stringify({ key, value }));\n                    }}\n                  />\n                ))}\n              </Group>\n            ))\n          }\n        </BarGroup>\n      </Group>\n      <AxisBottom\n        top={yMax + margin.top}\n        tickFormat={formatDate}\n        scale={dateScale}\n        stroke={green}\n        tickStroke={green}\n        hideAxisLine\n        tickLabelProps={{\n          fill: green,\n          fontSize: 11,\n          textAnchor: 'middle',\n        }}\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup/package.json",
    "content": "{\n  \"name\": \"@visx/demo-bargroup\",\n  \"description\": \"Standalone visx grouped bar demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"bargroup\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup-horizontal/Example.tsx",
    "content": "import React from 'react';\nimport { BarGroupHorizontal, Bar } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { AxisLeft } from '@visx/axis';\nimport type { CityTemperature } from '@visx/mock-data';\nimport { cityTemperature } from '@visx/mock-data';\nimport { scaleBand, scaleLinear, scaleOrdinal } from '@visx/scale';\nimport { timeParse, timeFormat } from '@visx/vendor/d3-time-format';\n\nexport type BarGroupHorizontalProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  events?: boolean;\n};\n\ntype CityName = 'New York' | 'San Francisco' | 'Austin';\n\nconst blue = '#aeeef8';\nexport const green = '#e5fd3d';\nconst purple = '#9caff6';\nexport const background = '#612efb';\nconst defaultMargin = { top: 20, right: 20, bottom: 20, left: 50 };\n\nconst parseDate = timeParse('%Y-%m-%d');\nconst format = timeFormat('%b %d');\nconst formatDate = (date: string) => format(parseDate(date) as Date);\nfunction max<D>(arr: D[], fn: (d: D) => number) {\n  return Math.max(...arr.map(fn));\n}\n\nconst data = cityTemperature.slice(0, 4);\nconst keys = Object.keys(data[0]).filter((d) => d !== 'date') as CityName[];\n\n// accessors\nconst getDate = (d: CityTemperature) => d.date;\n\n// scales\nconst dateScale = scaleBand({\n  domain: data.map(getDate),\n  padding: 0.2,\n});\nconst cityScale = scaleBand({\n  domain: keys,\n  padding: 0.1,\n});\nconst tempScale = scaleLinear<number>({\n  domain: [0, max(data, (d) => max(keys, (key) => Number(d[key])))],\n});\nconst colorScale = scaleOrdinal<string, string>({\n  domain: keys,\n  range: [blue, green, purple],\n});\n\nexport default function Example({\n  width,\n  height,\n  margin = defaultMargin,\n  events = false,\n}: BarGroupHorizontalProps) {\n  // bounds\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n\n  // update scale output dimensions\n  dateScale.rangeRound([0, yMax]);\n  cityScale.rangeRound([0, dateScale.bandwidth()]);\n  tempScale.rangeRound([0, xMax]);\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />\n      <Group top={margin.top} left={margin.left}>\n        <BarGroupHorizontal\n          data={data}\n          keys={keys}\n          width={xMax}\n          y0={getDate}\n          y0Scale={dateScale}\n          y1Scale={cityScale}\n          xScale={tempScale}\n          color={colorScale}\n        >\n          {(barGroups) =>\n            barGroups.map((barGroup) => (\n              <Group\n                key={`bar-group-horizontal-${barGroup.index}-${barGroup.y0}`}\n                top={barGroup.y0}\n              >\n                {barGroup.bars.map((bar) => (\n                  <Bar\n                    key={`${barGroup.index}-${bar.index}-${bar.key}`}\n                    x={bar.x}\n                    y={bar.y}\n                    width={bar.width}\n                    height={bar.height}\n                    fill={bar.color}\n                    rx={4}\n                    onClick={() => {\n                      if (events) alert(`${bar.key} (${bar.value}) - ${JSON.stringify(bar)}`);\n                    }}\n                  />\n                ))}\n              </Group>\n            ))\n          }\n        </BarGroupHorizontal>\n        <AxisLeft\n          scale={dateScale}\n          stroke={green}\n          tickStroke={green}\n          tickFormat={formatDate}\n          hideAxisLine\n          tickLabelProps={{\n            fill: green,\n            fontSize: 11,\n            textAnchor: 'end',\n            dy: '0.33em',\n          }}\n        />\n      </Group>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup-horizontal/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup-horizontal/package.json",
    "content": "{\n  \"name\": \"@visx/demo-bargroup-horizontal\",\n  \"description\": \"Standalone visx horizontal grouped bar demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\", \n    \"bargroup\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bargroup-horizontal/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bars/Example.tsx",
    "content": "import React, { useMemo } from 'react';\nimport { Bar } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { GradientTealBlue } from '@visx/gradient';\nimport type { LetterFrequency } from '@visx/mock-data';\nimport { letterFrequency } from '@visx/mock-data';\nimport { scaleBand, scaleLinear } from '@visx/scale';\n\nconst data = letterFrequency.slice(5);\nconst verticalMargin = 120;\n\n// accessors\nconst getLetter = (d: LetterFrequency) => d.letter;\nconst getLetterFrequency = (d: LetterFrequency) => Number(d.frequency) * 100;\n\nexport type BarsProps = {\n  width: number;\n  height: number;\n  events?: boolean;\n};\n\nexport default function Example({ width, height, events = false }: BarsProps) {\n  // bounds\n  const xMax = width;\n  const yMax = height - verticalMargin;\n\n  // scales, memoize for performance\n  const xScale = useMemo(\n    () =>\n      scaleBand<string>({\n        range: [0, xMax],\n        round: true,\n        domain: data.map(getLetter),\n        padding: 0.4,\n      }),\n    [xMax],\n  );\n  const yScale = useMemo(\n    () =>\n      scaleLinear<number>({\n        range: [yMax, 0],\n        round: true,\n        domain: [0, Math.max(...data.map(getLetterFrequency))],\n      }),\n    [yMax],\n  );\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <GradientTealBlue id=\"teal\" />\n      <rect width={width} height={height} fill=\"url(#teal)\" rx={14} />\n      <Group top={verticalMargin / 2}>\n        {data.map((d) => {\n          const letter = getLetter(d);\n          const barWidth = xScale.bandwidth();\n          const barHeight = yMax - (yScale(getLetterFrequency(d)) ?? 0);\n          const barX = xScale(letter);\n          const barY = yMax - barHeight;\n          return (\n            <Bar\n              key={`bar-${letter}`}\n              x={barX}\n              y={barY}\n              width={barWidth}\n              height={barHeight}\n              fill=\"rgba(23, 233, 217, .5)\"\n              onClick={() => {\n                if (events) alert(`clicked: ${JSON.stringify(Object.values(d))}`);\n              }}\n            />\n          );\n        })}\n      </Group>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bars/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bars/package.json",
    "content": "{\n  \"name\": \"@visx/demo-bars\",\n  \"description\": \"Standalone visx bars demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"bar\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-bars/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack/Example.tsx",
    "content": "import { BarStack } from '@visx/shape';\nimport type { SeriesPoint } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { Grid } from '@visx/grid';\nimport { AxisBottom } from '@visx/axis';\nimport { cityTemperature } from '@visx/mock-data';\nimport type { CityTemperature } from '@visx/mock-data';\nimport { scaleBand, scaleLinear, scaleOrdinal } from '@visx/scale';\nimport { timeParse, timeFormat } from '@visx/vendor/d3-time-format';\nimport { useTooltip, useTooltipInPortal, defaultStyles } from '@visx/tooltip';\nimport { LegendOrdinal } from '@visx/legend';\nimport { localPoint } from '@visx/event';\n\ntype CityName = 'New York' | 'San Francisco' | 'Austin';\n\ntype TooltipData = {\n  bar: SeriesPoint<CityTemperature>;\n  key: CityName;\n  index: number;\n  height: number;\n  width: number;\n  x: number;\n  y: number;\n  color: string;\n};\n\nexport type BarStackProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  events?: boolean;\n};\n\nconst purple1 = '#6c5efb';\nconst purple2 = '#c998ff';\nexport const purple3 = '#a44afe';\nexport const background = '#eaedff';\nconst defaultMargin = { top: 40, right: 0, bottom: 0, left: 0 };\nconst tooltipStyles = {\n  ...defaultStyles,\n  minWidth: 60,\n  backgroundColor: 'rgba(0,0,0,0.9)',\n  color: 'white',\n};\n\nconst data = cityTemperature.slice(0, 12);\nconst keys = Object.keys(data[0]).filter((d) => d !== 'date') as CityName[];\n\nconst temperatureTotals = data.reduce((allTotals, currentDate) => {\n  const totalTemperature = keys.reduce((dailyTotal, k) => {\n    dailyTotal += Number(currentDate[k]);\n    return dailyTotal;\n  }, 0);\n  allTotals.push(totalTemperature);\n  return allTotals;\n}, [] as number[]);\n\nconst parseDate = timeParse('%Y-%m-%d');\nconst format = timeFormat('%b %d');\nconst formatDate = (date: string) => format(parseDate(date) as Date);\n\n// accessors\nconst getDate = (d: CityTemperature) => d.date;\n\n// scales\nconst dateScale = scaleBand<string>({\n  domain: data.map(getDate),\n  padding: 0.2,\n});\nconst temperatureScale = scaleLinear<number>({\n  domain: [0, Math.max(...temperatureTotals)],\n  nice: true,\n});\nconst colorScale = scaleOrdinal<CityName, string>({\n  domain: keys,\n  range: [purple1, purple2, purple3],\n});\n\nlet tooltipTimeout: number;\n\nexport default function Example({\n  width,\n  height,\n  events = false,\n  margin = defaultMargin,\n}: BarStackProps) {\n  const { tooltipOpen, tooltipLeft, tooltipTop, tooltipData, hideTooltip, showTooltip } =\n    useTooltip<TooltipData>();\n\n  const { containerRef, TooltipInPortal } = useTooltipInPortal({\n    // TooltipInPortal is rendered in a separate child of <body /> and positioned\n    // with page coordinates which should be updated on scroll. consider using\n    // Tooltip or TooltipWithBounds if you don't need to render inside a Portal\n    scroll: true,\n  });\n\n  if (width < 10) return null;\n  // bounds\n  const xMax = width;\n  const yMax = height - margin.top - 100;\n\n  dateScale.rangeRound([0, xMax]);\n  temperatureScale.range([yMax, 0]);\n\n  return width < 10 ? null : (\n    <div style={{ position: 'relative' }}>\n      <svg ref={containerRef} width={width} height={height}>\n        <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />\n        <Grid\n          top={margin.top}\n          left={margin.left}\n          xScale={dateScale}\n          yScale={temperatureScale}\n          width={xMax}\n          height={yMax}\n          stroke=\"black\"\n          strokeOpacity={0.1}\n          xOffset={dateScale.bandwidth() / 2}\n        />\n        <Group top={margin.top}>\n          <BarStack<CityTemperature, CityName>\n            data={data}\n            keys={keys}\n            x={getDate}\n            xScale={dateScale}\n            yScale={temperatureScale}\n            color={colorScale}\n          >\n            {(barStacks) =>\n              barStacks.map((barStack) =>\n                barStack.bars.map((bar) => (\n                  <rect\n                    key={`bar-stack-${barStack.index}-${bar.index}`}\n                    x={bar.x}\n                    y={bar.y}\n                    height={bar.height}\n                    width={bar.width}\n                    fill={bar.color}\n                    onClick={() => {\n                      if (events) alert(`clicked: ${JSON.stringify(bar)}`);\n                    }}\n                    onMouseLeave={() => {\n                      tooltipTimeout = window.setTimeout(() => {\n                        hideTooltip();\n                      }, 300);\n                    }}\n                    onMouseMove={(event) => {\n                      if (tooltipTimeout) clearTimeout(tooltipTimeout);\n                      // TooltipInPortal expects coordinates to be relative to containerRef\n                      // localPoint returns coordinates relative to the nearest SVG, which\n                      // is what containerRef is set to in this example.\n                      const eventSvgCoords = localPoint(event);\n                      const left = bar.x + bar.width / 2;\n                      showTooltip({\n                        tooltipData: bar,\n                        tooltipTop: eventSvgCoords?.y,\n                        tooltipLeft: left,\n                      });\n                    }}\n                  />\n                )),\n              )\n            }\n          </BarStack>\n        </Group>\n        <AxisBottom\n          top={yMax + margin.top}\n          scale={dateScale}\n          tickFormat={formatDate}\n          stroke={purple3}\n          tickStroke={purple3}\n          tickLabelProps={{\n            fill: purple3,\n            fontSize: 11,\n            textAnchor: 'middle',\n          }}\n        />\n      </svg>\n      <div\n        style={{\n          position: 'absolute',\n          top: margin.top / 2 - 10,\n          width: '100%',\n          display: 'flex',\n          justifyContent: 'center',\n          fontSize: '14px',\n        }}\n      >\n        <LegendOrdinal scale={colorScale} direction=\"row\" labelMargin=\"0 15px 0 0\" />\n      </div>\n\n      {tooltipOpen && tooltipData && (\n        <TooltipInPortal top={tooltipTop} left={tooltipLeft} style={tooltipStyles}>\n          <div style={{ color: colorScale(tooltipData.key) }}>\n            <strong>{tooltipData.key}</strong>\n          </div>\n          <div>{tooltipData.bar.data[tooltipData.key]}℉</div>\n          <div>\n            <small>{formatDate(getDate(tooltipData.bar.data))}</small>\n          </div>\n        </TooltipInPortal>\n      )}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack/index.tsx",
    "content": "import { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack/package.json",
    "content": "{\n  \"name\": \"@visx/demo-barstack\",\n  \"description\": \"Standalone visx stacked bar demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/event\": \"latest\",\n    \"@visx/grid\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/legend\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/tooltip\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"barstack\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack-horizontal/Example.tsx",
    "content": "import React from 'react';\nimport { BarStackHorizontal } from '@visx/shape';\nimport type { SeriesPoint } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { AxisBottom, AxisLeft } from '@visx/axis';\nimport type { CityTemperature } from '@visx/mock-data';\nimport { cityTemperature } from '@visx/mock-data';\nimport { scaleBand, scaleLinear, scaleOrdinal } from '@visx/scale';\nimport { timeParse, timeFormat } from '@visx/vendor/d3-time-format';\nimport { withTooltip, Tooltip, defaultStyles } from '@visx/tooltip';\nimport type { WithTooltipProvidedProps } from '@visx/tooltip';\nimport { LegendOrdinal } from '@visx/legend';\n\ntype CityName = 'New York' | 'San Francisco' | 'Austin';\n\ntype TooltipData = {\n  bar: SeriesPoint<CityTemperature>;\n  key: CityName;\n  index: number;\n  height: number;\n  width: number;\n  x: number;\n  y: number;\n  color: string;\n};\n\nexport type BarStackHorizontalProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  events?: boolean;\n};\n\nconst purple1 = '#6c5efb';\nconst purple2 = '#c998ff';\nexport const purple3 = '#a44afe';\nexport const background = '#eaedff';\nconst defaultMargin = { top: 40, left: 50, right: 40, bottom: 100 };\nconst tooltipStyles = {\n  ...defaultStyles,\n  minWidth: 60,\n  backgroundColor: 'rgba(0,0,0,0.9)',\n  color: 'white',\n};\n\nconst data = cityTemperature.slice(0, 12);\nconst keys = Object.keys(data[0]).filter((d) => d !== 'date') as CityName[];\n\nconst temperatureTotals = data.reduce((allTotals, currentDate) => {\n  const totalTemperature = keys.reduce((dailyTotal, k) => {\n    dailyTotal += Number(currentDate[k]);\n    return dailyTotal;\n  }, 0);\n  allTotals.push(totalTemperature);\n  return allTotals;\n}, [] as number[]);\n\nconst parseDate = timeParse('%Y-%m-%d');\nconst format = timeFormat('%b %d');\nconst formatDate = (date: string) => format(parseDate(date) as Date);\n\n// accessors\nconst getDate = (d: CityTemperature) => d.date;\n\n// scales\nconst temperatureScale = scaleLinear<number>({\n  domain: [0, Math.max(...temperatureTotals)],\n  nice: true,\n});\nconst dateScale = scaleBand<string>({\n  domain: data.map(getDate),\n  padding: 0.2,\n});\nconst colorScale = scaleOrdinal<CityName, string>({\n  domain: keys,\n  range: [purple1, purple2, purple3],\n});\n\nlet tooltipTimeout: number;\n\nexport default withTooltip<BarStackHorizontalProps, TooltipData>(\n  ({\n    width,\n    height,\n    events = false,\n    margin = defaultMargin,\n    tooltipOpen,\n    tooltipLeft,\n    tooltipTop,\n    tooltipData,\n    hideTooltip,\n    showTooltip,\n  }: BarStackHorizontalProps & WithTooltipProvidedProps<TooltipData>) => {\n    // bounds\n    const xMax = width - margin.left - margin.right;\n    const yMax = height - margin.top - margin.bottom;\n\n    temperatureScale.rangeRound([0, xMax]);\n    dateScale.rangeRound([yMax, 0]);\n\n    return width < 10 ? null : (\n      <div>\n        <svg width={width} height={height}>\n          <rect width={width} height={height} fill={background} rx={14} />\n          <Group top={margin.top} left={margin.left}>\n            <BarStackHorizontal<CityTemperature, CityName>\n              data={data}\n              keys={keys}\n              height={yMax}\n              y={getDate}\n              xScale={temperatureScale}\n              yScale={dateScale}\n              color={colorScale}\n            >\n              {(barStacks) =>\n                barStacks.map((barStack) =>\n                  barStack.bars.map((bar) => (\n                    <rect\n                      key={`barstack-horizontal-${barStack.index}-${bar.index}`}\n                      x={bar.x}\n                      y={bar.y}\n                      width={bar.width}\n                      height={bar.height}\n                      fill={bar.color}\n                      onClick={() => {\n                        if (events) alert(`clicked: ${JSON.stringify(bar)}`);\n                      }}\n                      onMouseLeave={() => {\n                        tooltipTimeout = window.setTimeout(() => {\n                          hideTooltip();\n                        }, 300);\n                      }}\n                      onMouseMove={() => {\n                        if (tooltipTimeout) clearTimeout(tooltipTimeout);\n                        const top = bar.y + margin.top;\n                        const left = bar.x + bar.width + margin.left;\n                        showTooltip({\n                          tooltipData: bar,\n                          tooltipTop: top,\n                          tooltipLeft: left,\n                        });\n                      }}\n                    />\n                  )),\n                )\n              }\n            </BarStackHorizontal>\n            <AxisLeft\n              hideAxisLine\n              hideTicks\n              scale={dateScale}\n              tickFormat={formatDate}\n              stroke={purple3}\n              tickStroke={purple3}\n              tickLabelProps={{\n                fill: purple3,\n                fontSize: 11,\n                textAnchor: 'end',\n                dy: '0.33em',\n              }}\n            />\n            <AxisBottom\n              top={yMax}\n              scale={temperatureScale}\n              stroke={purple3}\n              tickStroke={purple3}\n              tickLabelProps={{\n                fill: purple3,\n                fontSize: 11,\n                textAnchor: 'middle',\n              }}\n            />\n          </Group>\n        </svg>\n        <div\n          style={{\n            position: 'absolute',\n            top: margin.top / 2 - 10,\n            width: '100%',\n            display: 'flex',\n            justifyContent: 'center',\n            fontSize: '14px',\n          }}\n        >\n          <LegendOrdinal scale={colorScale} direction=\"row\" labelMargin=\"0 15px 0 0\" />\n        </div>\n        {tooltipOpen && tooltipData && (\n          <Tooltip top={tooltipTop} left={tooltipLeft} style={tooltipStyles}>\n            <div style={{ color: colorScale(tooltipData.key) }}>\n              <strong>{tooltipData.key}</strong>\n            </div>\n            <div>{tooltipData.bar.data[tooltipData.key]}℉</div>\n            <div>\n              <small>{formatDate(getDate(tooltipData.bar.data))}</small>\n            </div>\n          </Tooltip>\n        )}\n      </div>\n    );\n  },\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack-horizontal/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack-horizontal/package.json",
    "content": "{\n  \"name\": \"@visx/demo-barstack-horizontal\",\n  \"description\": \"Standalone visx horizontal stacked bar demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/grid\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/legend\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/tooltip\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"barstack\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-barstack-horizontal/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-brush/AreaChart.tsx",
    "content": "import React from 'react';\nimport { Group } from '@visx/group';\nimport { AreaClosed } from '@visx/shape';\nimport type { AxisScale } from '@visx/axis';\nimport { AxisLeft, AxisBottom } from '@visx/axis';\nimport { LinearGradient } from '@visx/gradient';\nimport { curveMonotoneX } from '@visx/curve';\nimport type { AppleStock } from '@visx/mock-data';\n\n// Initialize some variables\nconst axisColor = '#fff';\nconst axisBottomTickLabelProps = {\n  textAnchor: 'middle' as const,\n  fontFamily: 'Arial',\n  fontSize: 10,\n  fill: axisColor,\n};\nconst axisLeftTickLabelProps = {\n  dx: '-0.25em',\n  dy: '0.25em',\n  fontFamily: 'Arial',\n  fontSize: 10,\n  textAnchor: 'end' as const,\n  fill: axisColor,\n};\n\n// accessors\nconst getDate = (d: AppleStock) => new Date(d.date);\nconst getStockValue = (d: AppleStock) => d.close;\n\nexport default function AreaChart({\n  data,\n  gradientColor,\n  width,\n  yMax,\n  margin,\n  xScale,\n  yScale,\n  hideBottomAxis = false,\n  hideLeftAxis = false,\n  top,\n  left,\n  children,\n}: {\n  data: AppleStock[];\n  gradientColor: string;\n  xScale: AxisScale<number>;\n  yScale: AxisScale<number>;\n  width: number;\n  yMax: number;\n  margin: { top: number; right: number; bottom: number; left: number };\n  hideBottomAxis?: boolean;\n  hideLeftAxis?: boolean;\n  top?: number;\n  left?: number;\n  children?: React.ReactNode;\n}) {\n  if (width < 10) return null;\n  return (\n    <Group left={left || margin.left} top={top || margin.top}>\n      <LinearGradient\n        id=\"gradient\"\n        from={gradientColor}\n        fromOpacity={1}\n        to={gradientColor}\n        toOpacity={0.2}\n      />\n      <AreaClosed<AppleStock>\n        data={data}\n        x={(d) => xScale(getDate(d)) || 0}\n        y={(d) => yScale(getStockValue(d)) || 0}\n        yScale={yScale}\n        strokeWidth={1}\n        stroke=\"url(#gradient)\"\n        fill=\"url(#gradient)\"\n        curve={curveMonotoneX}\n      />\n      {!hideBottomAxis && (\n        <AxisBottom\n          top={yMax}\n          scale={xScale}\n          numTicks={width > 520 ? 10 : 5}\n          stroke={axisColor}\n          tickStroke={axisColor}\n          tickLabelProps={axisBottomTickLabelProps}\n        />\n      )}\n      {!hideLeftAxis && (\n        <AxisLeft\n          scale={yScale}\n          numTicks={5}\n          stroke={axisColor}\n          tickStroke={axisColor}\n          tickLabelProps={axisLeftTickLabelProps}\n        />\n      )}\n      {children}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-brush/Example.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-use-before-define */\nimport React, { useRef, useState, useMemo } from 'react';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport type { AppleStock } from '@visx/mock-data';\nimport { appleStock } from '@visx/mock-data';\nimport { Brush } from '@visx/brush';\nimport type {\n  Bounds,\n  BaseBrushState,\n  UpdateBrush,\n  BaseBrush,\n  BrushHandleRenderProps,\n} from '@visx/brush';\nimport { PatternLines } from '@visx/pattern';\nimport { Group } from '@visx/group';\nimport { LinearGradient } from '@visx/gradient';\nimport { max, extent } from '@visx/vendor/d3-array';\nimport AreaChart from './AreaChart';\n\n// Initialize some variables\nconst stock = appleStock.slice(1000);\nconst brushMargin = { top: 10, bottom: 15, left: 50, right: 20 };\nconst chartSeparation = 30;\nconst PATTERN_ID = 'brush_pattern';\nconst GRADIENT_ID = 'brush_gradient';\nexport const accentColor = '#f6acc8';\nexport const background = '#584153';\nexport const background2 = '#af8baf';\nconst selectedBrushStyle = {\n  fill: `url(#${PATTERN_ID})`,\n  stroke: 'white',\n};\n\n// accessors\nconst getDate = (d: AppleStock) => new Date(d.date);\nconst getStockValue = (d: AppleStock) => d.close;\n\nexport type BrushProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  compact?: boolean;\n};\n\nfunction BrushChart({\n  compact = false,\n  width,\n  height,\n  margin = {\n    top: 20,\n    left: 50,\n    bottom: 20,\n    right: 20,\n  },\n}: BrushProps) {\n  const brushRef = useRef<BaseBrush | null>(null);\n  const [filteredStock, setFilteredStock] = useState(stock);\n\n  const onBrushChange = (domain: Bounds | null) => {\n    if (!domain) return;\n    const { x0, x1, y0, y1 } = domain;\n    const stockCopy = stock.filter((s) => {\n      const x = getDate(s).getTime();\n      const y = getStockValue(s);\n      return x > x0 && x < x1 && y > y0 && y < y1;\n    });\n    setFilteredStock(stockCopy);\n  };\n\n  const innerHeight = height - margin.top - margin.bottom;\n  const topChartBottomMargin = compact ? chartSeparation / 2 : chartSeparation + 10;\n  const topChartHeight = 0.8 * innerHeight - topChartBottomMargin;\n  const bottomChartHeight = innerHeight - topChartHeight - chartSeparation;\n\n  // bounds\n  const xMax = Math.max(width - margin.left - margin.right, 0);\n  const yMax = Math.max(topChartHeight, 0);\n  const xBrushMax = Math.max(width - brushMargin.left - brushMargin.right, 0);\n  const yBrushMax = Math.max(bottomChartHeight - brushMargin.top - brushMargin.bottom, 0);\n\n  // scales\n  const dateScale = useMemo(\n    () =>\n      scaleTime<number>({\n        range: [0, xMax],\n        domain: extent(filteredStock, getDate) as [Date, Date],\n      }),\n    [xMax, filteredStock],\n  );\n  const stockScale = useMemo(\n    () =>\n      scaleLinear<number>({\n        range: [yMax, 0],\n        domain: [0, max(filteredStock, getStockValue) || 0],\n        nice: true,\n      }),\n    [yMax, filteredStock],\n  );\n  const brushDateScale = useMemo(\n    () =>\n      scaleTime<number>({\n        range: [0, xBrushMax],\n        domain: extent(stock, getDate) as [Date, Date],\n      }),\n    [xBrushMax],\n  );\n  const brushStockScale = useMemo(\n    () =>\n      scaleLinear({\n        range: [yBrushMax, 0],\n        domain: [0, max(stock, getStockValue) || 0],\n        nice: true,\n      }),\n    [yBrushMax],\n  );\n\n  const initialBrushPosition = useMemo(\n    () => ({\n      start: { x: brushDateScale(getDate(stock[50])) },\n      end: { x: brushDateScale(getDate(stock[100])) },\n    }),\n    [brushDateScale],\n  );\n\n  // event handlers\n  const handleClearClick = () => {\n    if (brushRef?.current) {\n      setFilteredStock(stock);\n      brushRef.current.reset();\n    }\n  };\n\n  const handleResetClick = () => {\n    if (brushRef?.current) {\n      const updater: UpdateBrush = (prevBrush) => {\n        const newExtent = brushRef.current!.getExtent(\n          initialBrushPosition.start,\n          initialBrushPosition.end,\n        );\n\n        const newState: BaseBrushState = {\n          ...prevBrush,\n          start: { y: newExtent.y0, x: newExtent.x0 },\n          end: { y: newExtent.y1, x: newExtent.x1 },\n          extent: newExtent,\n        };\n\n        return newState;\n      };\n      brushRef.current.updateBrush(updater);\n    }\n  };\n\n  return (\n    <div>\n      <svg width={width} height={height}>\n        <LinearGradient id={GRADIENT_ID} from={background} to={background2} rotate={45} />\n        <rect x={0} y={0} width={width} height={height} fill={`url(#${GRADIENT_ID})`} rx={14} />\n        <AreaChart\n          hideBottomAxis={compact}\n          data={filteredStock}\n          width={width}\n          margin={{ ...margin, bottom: topChartBottomMargin }}\n          yMax={yMax}\n          xScale={dateScale}\n          yScale={stockScale}\n          gradientColor={background2}\n        />\n        <AreaChart\n          hideBottomAxis\n          hideLeftAxis\n          data={stock}\n          width={width}\n          yMax={yBrushMax}\n          xScale={brushDateScale}\n          yScale={brushStockScale}\n          margin={brushMargin}\n          top={topChartHeight + topChartBottomMargin + margin.top}\n          gradientColor={background2}\n        >\n          <PatternLines\n            id={PATTERN_ID}\n            height={8}\n            width={8}\n            stroke={accentColor}\n            strokeWidth={1}\n            orientation={['diagonal']}\n          />\n          <Brush\n            xScale={brushDateScale}\n            yScale={brushStockScale}\n            width={xBrushMax}\n            height={yBrushMax}\n            margin={brushMargin}\n            handleSize={8}\n            innerRef={brushRef}\n            resizeTriggerAreas={['left', 'right']}\n            brushDirection=\"horizontal\"\n            initialBrushPosition={initialBrushPosition}\n            onChange={onBrushChange}\n            onClick={() => setFilteredStock(stock)}\n            selectedBoxStyle={selectedBrushStyle}\n            useWindowMoveEvents\n            renderBrushHandle={(props) => <BrushHandle {...props} />}\n          />\n        </AreaChart>\n      </svg>\n      <button onClick={handleClearClick}>Clear</button>&nbsp;\n      <button onClick={handleResetClick}>Reset</button>\n    </div>\n  );\n}\n// We need to manually offset the handles for them to be rendered at the right position\nfunction BrushHandle({ x, height, isBrushActive }: BrushHandleRenderProps) {\n  const pathWidth = 8;\n  const pathHeight = 15;\n  if (!isBrushActive) {\n    return null;\n  }\n  return (\n    <Group left={x + pathWidth / 2} top={(height - pathHeight) / 2}>\n      <path\n        fill=\"#f2f2f2\"\n        d=\"M -4.5 0.5 L 3.5 0.5 L 3.5 15.5 L -4.5 15.5 L -4.5 0.5 M -1.5 4 L -1.5 12 M 0.5 4 L 0.5 12\"\n        stroke=\"#999999\"\n        strokeWidth=\"1\"\n        style={{ cursor: 'ew-resize' }}\n      />\n    </Group>\n  );\n}\n\nexport default BrushChart;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-brush/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-brush/package.json",
    "content": "{\n  \"name\": \"@visx/demo-brush\",\n  \"description\": \"Standalone visx brush demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/brush\": \"latest\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/pattern\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"brush\",\n    \"interaction\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-brush/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-chord/Example.tsx",
    "content": "import React from 'react';\nimport { Arc } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { Chord, Ribbon } from '@visx/chord';\nimport { scaleOrdinal } from '@visx/scale';\nimport { LinearGradient } from '@visx/gradient';\n\nconst pink = '#ff2fab';\nconst orange = '#ffc62e';\nconst purple = '#dc04ff';\nconst purple2 = '#7324ff';\nconst red = '#d04376';\nconst green = '#52f091';\nconst blue = '#04a6ff';\nconst lime = '#00ddc6';\nconst bg = '#e4e3d8';\n\nconst dataMatrix = [\n  [11975, 5871, 8916, 2868],\n  [1951, 10048, 2060, 6171],\n  [8010, 16145, 8090, 8045],\n  [1013, 990, 940, 6907],\n];\n\nfunction descending(a: number, b: number): number {\n  return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;\n}\n\nconst color = scaleOrdinal<number, string>({\n  domain: [0, 1, 2, 3],\n  range: ['url(#gpinkorange)', 'url(#gpurplered)', 'url(#gpurplegreen)', 'url(#gbluelime)'],\n});\n\nexport type ChordProps = {\n  width: number;\n  height: number;\n  centerSize?: number;\n  events?: boolean;\n};\n\nexport default function Example({ width, height, centerSize = 20, events = false }: ChordProps) {\n  height -= 77;\n  const outerRadius = Math.min(width, height) * 0.5 - (centerSize + 10);\n  const innerRadius = outerRadius - centerSize;\n\n  return width < 10 ? null : (\n    <div className=\"chords\">\n      <svg width={width} height={height}>\n        <LinearGradient id=\"gpinkorange\" from={pink} to={orange} vertical={false} />\n        <LinearGradient id=\"gpurplered\" from={purple} to={red} vertical={false} />\n        <LinearGradient id=\"gpurplegreen\" from={purple2} to={green} vertical={false} />\n        <LinearGradient id=\"gbluelime\" from={blue} to={lime} vertical={false} />\n        <rect width={width} height={height} fill={bg} rx={14} />\n        <Group top={height / 2} left={width / 2}>\n          <Chord matrix={dataMatrix} padAngle={0.05} sortSubgroups={descending}>\n            {({ chords }) => (\n              <g>\n                {chords.groups.map((group, i) => (\n                  <Arc\n                    key={`key-${i}`}\n                    data={group}\n                    innerRadius={innerRadius}\n                    outerRadius={outerRadius}\n                    fill={color(i)}\n                    onClick={() => {\n                      if (events) alert(`${JSON.stringify(group)}`);\n                    }}\n                  />\n                ))}\n                {chords.map((chord, i) => (\n                  <Ribbon\n                    key={`ribbon-${i}`}\n                    chord={chord}\n                    radius={innerRadius}\n                    fill={color(chord.target.index)}\n                    fillOpacity={0.75}\n                    onClick={() => {\n                      if (events) alert(`${JSON.stringify(chord)}`);\n                    }}\n                  />\n                ))}\n              </g>\n            )}\n          </Chord>\n        </Group>\n      </svg>\n      <div className=\"deets\">\n        <div>\n          Based on Mike Bostock's <a href=\"https://bl.ocks.org/mbostock/4062006\">Chord Diagram</a>\n        </div>\n      </div>\n      <style jsx>{`\n        .chords {\n          display: flex;\n          flex-direction: column;\n          user-select: none;\n        }\n        svg {\n          margin: 1rem 0;\n          cursor: pointer;\n        }\n        .deets {\n          display: flex;\n          flex-direction: row;\n          font-size: 12px;\n        }\n        .deets > div {\n          margin: 0.25rem;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-chord/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-chord/package.json",
    "content": "{\n  \"name\": \"@visx/demo-chord\",\n  \"description\": \"Standalone visx chord demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/chord\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-chord/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-curve/Example.tsx",
    "content": "import React, { useState } from 'react';\nimport { extent, max } from '@visx/vendor/d3-array';\nimport * as allCurves from '@visx/curve';\nimport { Group } from '@visx/group';\nimport { LinePath } from '@visx/shape';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport { MarkerArrow, MarkerCross, MarkerX, MarkerCircle, MarkerLine } from '@visx/marker';\nimport type { DateValue } from '@visx/mock-data';\nimport { genDateValue as generateDateValue } from '@visx/mock-data';\n\ntype CurveType = keyof typeof allCurves;\n\nconst curveTypes = Object.keys(allCurves);\nconst lineCount = 5;\nconst series = new Array(lineCount).fill(null).map((_, i) =>\n  // vary each series value deterministically\n  generateDateValue(25, /* seed= */ i / 72).sort(\n    (a: DateValue, b: DateValue) => a.date.getTime() - b.date.getTime(),\n  ),\n);\nconst allData = series.reduce((rec, d) => rec.concat(d), []);\n\n// data accessors\nconst getX = (d: DateValue) => d.date;\nconst getY = (d: DateValue) => d.value;\n\n// scales\nconst xScale = scaleTime<number>({\n  domain: extent(allData, getX) as [Date, Date],\n});\nconst yScale = scaleLinear<number>({\n  domain: [0, max(allData, getY) as number],\n});\n\nexport type CurveProps = {\n  width: number;\n  height: number;\n  showControls?: boolean;\n};\n\nexport default function Example({ width, height, showControls = true }: CurveProps) {\n  const [curveType, setCurveType] = useState<CurveType>('curveNatural');\n  const [showPoints, setShowPoints] = useState<boolean>(true);\n  const svgHeight = showControls ? height - 40 : height;\n  const lineHeight = svgHeight / lineCount;\n\n  // update scale output ranges\n  xScale.range([0, width - 50]);\n  yScale.range([lineHeight - 2, 0]);\n\n  return (\n    <div className=\"visx-curves-demo\">\n      {showControls && (\n        <>\n          <label>\n            Curve type &nbsp;\n            <select onChange={(e) => setCurveType(e.target.value as CurveType)} value={curveType}>\n              {curveTypes.map((curve) => (\n                <option key={curve} value={curve}>\n                  {curve}\n                </option>\n              ))}\n            </select>\n          </label>\n          &nbsp;\n          <label>\n            Show points&nbsp;\n            <input\n              type=\"checkbox\"\n              checked={showPoints}\n              onChange={() => setShowPoints(!showPoints)}\n            />\n          </label>\n          <br />\n        </>\n      )}\n      <svg width={width} height={svgHeight}>\n        <MarkerX\n          id=\"marker-x\"\n          stroke=\"#333\"\n          size={22}\n          strokeWidth={4}\n          markerUnits=\"userSpaceOnUse\"\n        />\n        <MarkerCross\n          id=\"marker-cross\"\n          stroke=\"#333\"\n          size={22}\n          strokeWidth={4}\n          strokeOpacity={0.6}\n          markerUnits=\"userSpaceOnUse\"\n        />\n        <MarkerCircle id=\"marker-circle\" fill=\"#333\" size={2} refX={2} />\n        <MarkerArrow id=\"marker-arrow-odd\" stroke=\"#333\" size={8} strokeWidth={1} />\n        <MarkerLine id=\"marker-line\" fill=\"#333\" size={16} strokeWidth={1} />\n        <MarkerArrow id=\"marker-arrow\" fill=\"#333\" refX={2} size={6} />\n        <rect width={width} height={svgHeight} fill=\"#efefef\" rx={14} ry={14} />\n        {width > 8 &&\n          series.map((lineData, i) => {\n            const even = i % 2 === 0;\n            let markerStart = even ? 'url(#marker-cross)' : 'url(#marker-x)';\n            if (i === 1) markerStart = 'url(#marker-line)';\n            const markerEnd = even ? 'url(#marker-arrow)' : 'url(#marker-arrow-odd)';\n            return (\n              <Group key={`lines-${i}`} top={i * lineHeight} left={13}>\n                {showPoints &&\n                  lineData.map((d, j) => (\n                    <circle\n                      key={i + j}\n                      r={3}\n                      cx={xScale(getX(d))}\n                      cy={yScale(getY(d))}\n                      stroke=\"rgba(33,33,33,0.5)\"\n                      fill=\"transparent\"\n                    />\n                  ))}\n                <LinePath<DateValue>\n                  curve={allCurves[curveType]}\n                  data={lineData}\n                  x={(d) => xScale(getX(d)) ?? 0}\n                  y={(d) => yScale(getY(d)) ?? 0}\n                  stroke=\"#333\"\n                  strokeWidth={even ? 2 : 1}\n                  strokeOpacity={even ? 0.6 : 1}\n                  shapeRendering=\"geometricPrecision\"\n                  markerMid=\"url(#marker-circle)\"\n                  markerStart={markerStart}\n                  markerEnd={markerEnd}\n                />\n              </Group>\n            );\n          })}\n      </svg>\n      <style jsx>{`\n        .visx-curves-demo label {\n          font-size: 12px;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-curve/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-curve/package.json",
    "content": "{\n  \"name\": \"@visx/demo-curve\",\n  \"description\": \"Standalone visx curve demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/marker\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"curve\",\n    \"interpolate\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-curve/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-triangulation/Example.tsx",
    "content": "import React, { useState, useMemo, useRef } from 'react';\nimport { Group } from '@visx/group';\nimport { GradientPurpleTeal as Gradient } from '@visx/gradient';\nimport { RectClipPath } from '@visx/clip-path';\nimport { delaunay, Polygon } from '@visx/delaunay';\nimport { localPoint } from '@visx/event';\nimport { getSeededRandom } from '@visx/mock-data';\n\ntype Datum = {\n  x: number;\n  y: number;\n  id: string;\n};\n\nconst seededRandom = getSeededRandom(0.88);\n\nconst data: Datum[] = new Array(150).fill(null).map(() => ({\n  x: seededRandom(),\n  y: seededRandom(),\n  id: Math.random().toString(36).slice(2),\n}));\n\nconst defaultMargin = {\n  top: 16,\n  left: 16,\n  right: 16,\n  bottom: 92,\n};\n\nexport type DelaunayTriangulationProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nfunction Example({ width, height, margin = defaultMargin }: DelaunayTriangulationProps) {\n  const innerWidth = width - margin.left - margin.right;\n  const innerHeight = height - margin.top - margin.bottom;\n\n  const delaunayDiagram = useMemo(\n    () =>\n      delaunay<Datum>({\n        data,\n        x: (d) => d.x * innerWidth,\n        y: (d) => d.y * innerHeight,\n      }),\n    [innerWidth, innerHeight],\n  );\n  const triangles = Array.from(delaunayDiagram.trianglePolygons());\n\n  const svgRef = useRef<SVGSVGElement>(null);\n  const [hoveredId, setHoveredId] = useState<string | null>(null);\n\n  return width < 10 ? null : (\n    <div className=\"delaunay-triangulation\">\n      <svg width={width} height={height} ref={svgRef}>\n        <Gradient id=\"delaunay_purple_teal\" />\n        <RectClipPath id=\"delaunay_clip\" width={innerWidth} height={innerHeight} rx={14} />\n        <Group\n          top={margin.top}\n          left={margin.left}\n          clipPath=\"url(#delaunay_clip)\"\n          onMouseMove={(event) => {\n            if (!svgRef.current) return;\n\n            // find the nearest point to the current mouse position.\n            const point = localPoint(svgRef.current, event);\n            if (!point) return;\n\n            const closest = delaunayDiagram.find(point.x - margin.left, point.y - margin.top);\n            setHoveredId(data[closest].id);\n          }}\n          onMouseLeave={() => {\n            setHoveredId(null);\n          }}\n        >\n          {triangles.map((triangle, i) => (\n            <Polygon\n              key={`triangle-${i}`}\n              polygon={triangle}\n              fill=\"url(#delaunay_purple_teal)\"\n              stroke=\"#fff\"\n              strokeWidth={1}\n            />\n          ))}\n          {data.map(({ x, y, id }) => (\n            <circle\n              key={`circle-${id}`}\n              r={2}\n              cx={x * innerWidth}\n              cy={y * innerHeight}\n              fill={id === hoveredId ? '#5B247A' : '#fff'}\n              fillOpacity={0.8}\n            />\n          ))}\n        </Group>\n      </svg>\n      <style jsx>{`\n        .delaunay-triangulation {\n          background-color: black;\n          border-radius: 14px;\n        }\n      `}</style>\n    </div>\n  );\n}\n\nexport default Example;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-triangulation/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-triangulation/package.json",
    "content": "{\n  \"name\": \"@visx/demo-delaunay-triangulation\",\n  \"description\": \"Standalone visx delaunay triangulation demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/clip-path\": \"latest\",\n    \"@visx/delaunay\": \"latest\",\n    \"@visx/event\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"delaunay\",\n    \"triangulation\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-triangulation/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-voronoi/Example.tsx",
    "content": "import React, { useState, useMemo, useRef } from 'react';\nimport { Group } from '@visx/group';\nimport { GradientOrangeRed, GradientPinkRed } from '@visx/gradient';\nimport { RectClipPath } from '@visx/clip-path';\nimport { voronoi, Polygon } from '@visx/delaunay';\nimport { localPoint } from '@visx/event';\nimport { getSeededRandom } from '@visx/mock-data';\n\ntype Datum = {\n  x: number;\n  y: number;\n  id: string;\n};\n\nconst seededRandom = getSeededRandom(0.88);\n\nconst data: Datum[] = new Array(150).fill(null).map(() => ({\n  x: seededRandom(),\n  y: seededRandom(),\n  id: Math.random().toString(36).slice(2),\n}));\n\nconst defaultMargin = {\n  top: 0,\n  left: 0,\n  right: 0,\n  bottom: 76,\n};\n\nexport type VoronoiProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nfunction Example({ width, height, margin = defaultMargin }: VoronoiProps) {\n  const innerWidth = Math.max(0, width - margin.left - margin.right);\n  const innerHeight = Math.max(0, height - margin.top - margin.bottom);\n\n  const voronoiDiagram = useMemo(\n    () =>\n      voronoi<Datum>({\n        data,\n        x: (d) => d.x * innerWidth,\n        y: (d) => d.y * innerHeight,\n        width: innerWidth,\n        height: innerHeight,\n      }),\n    [innerWidth, innerHeight],\n  );\n\n  const svgRef = useRef<SVGSVGElement>(null);\n  const [hoveredId, setHoveredId] = useState<string | null>(null);\n  const [neighborIds, setNeighborIds] = useState<Set<string>>(new Set());\n\n  return width < 10 ? null : (\n    <svg width={width} height={height} ref={svgRef}>\n      <GradientOrangeRed id=\"voronoi_orange_red\" />\n      <GradientPinkRed id=\"voronoi_pink_red\" />\n      <RectClipPath id=\"voronoi_clip\" width={innerWidth} height={innerHeight} rx={14} />\n      <Group\n        top={margin.top}\n        left={margin.left}\n        clipPath=\"url(#voronoi_clip)\"\n        onMouseMove={(event) => {\n          if (!svgRef.current) return;\n\n          // find the nearest polygon to the current mouse position\n          const point = localPoint(svgRef.current, event);\n          if (!point) return;\n\n          const closest = voronoiDiagram.delaunay.find(point.x, point.y);\n          // find neighboring polygons to hightlight\n          if (data[closest].id !== hoveredId) {\n            const neighbors = Array.from(voronoiDiagram.neighbors(closest));\n            setNeighborIds(new Set(neighbors.map((d) => data[d].id)));\n            setHoveredId(data[closest].id);\n          }\n        }}\n        onMouseLeave={() => {\n          setHoveredId(null);\n          setNeighborIds(new Set());\n        }}\n      >\n        {data.map((d, i) => (\n          <Polygon\n            key={`polygon-${d.id}`}\n            polygon={voronoiDiagram.cellPolygon(i)}\n            fill={\n              hoveredId && (d.id === hoveredId || neighborIds.has(d.id))\n                ? 'url(#voronoi_orange_red)'\n                : 'url(#voronoi_pink_red)'\n            }\n            stroke=\"#fff\"\n            strokeWidth={1}\n            fillOpacity={hoveredId && neighborIds.has(d.id) ? 0.5 : 1}\n          />\n        ))}\n        {data.map(({ x, y, id }) => (\n          <circle\n            key={`circle-${id}`}\n            r={2}\n            cx={x * innerWidth}\n            cy={y * innerHeight}\n            fill={id === hoveredId ? 'fuchsia' : '#fff'}\n            fillOpacity={0.8}\n          />\n        ))}\n      </Group>\n    </svg>\n  );\n}\n\nexport default Example;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-voronoi/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-voronoi/package.json",
    "content": "{\n  \"name\": \"@visx/demo-delaunay-voronoi\",\n  \"description\": \"Standalone @visx/delaunay voronoi demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/clip-path\": \"latest\",\n    \"@visx/delaunay\": \"latest\",\n    \"@visx/event\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"voronoi\",\n    \"delaunay\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-delaunay-voronoi/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dendrogram/Example.tsx",
    "content": "import React, { useMemo } from 'react';\nimport { Group } from '@visx/group';\nimport { Cluster, hierarchy } from '@visx/hierarchy';\nimport type { HierarchyPointNode, HierarchyPointLink } from '@visx/hierarchy';\nimport { LinkVertical } from '@visx/shape';\nimport { LinearGradient } from '@visx/gradient';\n\nconst citrus = '#ddf163';\nconst white = '#ffffff';\nexport const green = '#79d259';\nconst aqua = '#37ac8c';\nconst merlinsbeard = '#f7f7f3';\nexport const background = '#306c90';\n\ninterface NodeShape {\n  name: string;\n  children?: NodeShape[];\n}\n\nconst clusterData: NodeShape = {\n  name: '$',\n  children: [\n    {\n      name: 'A',\n      children: [\n        { name: 'A1' },\n        { name: 'A2' },\n        {\n          name: 'C',\n          children: [\n            {\n              name: 'C1',\n            },\n          ],\n        },\n      ],\n    },\n    {\n      name: 'B',\n      children: [{ name: 'B1' }, { name: 'B2' }, { name: 'B3' }],\n    },\n    {\n      name: 'X',\n      children: [\n        {\n          name: 'Z',\n        },\n      ],\n    },\n  ],\n};\n\nfunction RootNode({ node }: { node: HierarchyPointNode<NodeShape> }) {\n  const width = 40;\n  const height = 20;\n  const centerX = -width / 2;\n  const centerY = -height / 2;\n\n  return (\n    <Group top={node.y} left={node.x}>\n      <rect width={width} height={height} y={centerY} x={centerX} fill=\"url('#top')\" />\n      <text\n        dy=\".33em\"\n        fontSize={9}\n        fontFamily=\"Arial\"\n        textAnchor=\"middle\"\n        style={{ pointerEvents: 'none' }}\n        fill={background}\n      >\n        {node.data.name}\n      </text>\n    </Group>\n  );\n}\n\nfunction Node({ node }: { node: HierarchyPointNode<NodeShape> }) {\n  const isRoot = node.depth === 0;\n  const isParent = !!node.children;\n\n  if (isRoot) return <RootNode node={node} />;\n\n  return (\n    <Group top={node.y} left={node.x}>\n      {node.depth !== 0 && (\n        <circle\n          r={12}\n          fill={background}\n          stroke={isParent ? white : citrus}\n          onClick={() => {\n            alert(`clicked: ${JSON.stringify(node.data.name)}`);\n          }}\n        />\n      )}\n      <text\n        dy=\".33em\"\n        fontSize={9}\n        fontFamily=\"Arial\"\n        textAnchor=\"middle\"\n        style={{ pointerEvents: 'none' }}\n        fill={isParent ? white : citrus}\n      >\n        {node.data.name}\n      </text>\n    </Group>\n  );\n}\n\nconst defaultMargin = { top: 40, left: 0, right: 0, bottom: 40 };\n\nexport type DendrogramProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function Example({ width, height, margin = defaultMargin }: DendrogramProps) {\n  const data = useMemo(() => hierarchy<NodeShape>(clusterData), []);\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <LinearGradient id=\"top\" from={green} to={aqua} />\n      <rect width={width} height={height} rx={14} fill={background} />\n      <Cluster<NodeShape> root={data} size={[xMax, yMax]}>\n        {(cluster) => (\n          <Group top={margin.top} left={margin.left}>\n            {cluster.links().map((link, i) => (\n              <LinkVertical<HierarchyPointLink<NodeShape>, HierarchyPointNode<NodeShape>>\n                key={`cluster-link-${i}`}\n                data={link}\n                stroke={merlinsbeard}\n                strokeWidth=\"1\"\n                strokeOpacity={0.2}\n                fill=\"none\"\n              />\n            ))}\n            {cluster.descendants().map((node, i) => (\n              <Node key={`cluster-node-${i}`} node={node} />\n            ))}\n          </Group>\n        )}\n      </Cluster>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dendrogram/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dendrogram/package.json",
    "content": "{\n  \"name\": \"@visx/demo-dendrogram\",\n  \"description\": \"Standalone visx dendrogram demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/hierarchy\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"hierarchy\",\n    \"dendrogram\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dendrogram/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dots/Example.tsx",
    "content": "import React, { useMemo, useState, useCallback, useRef } from 'react';\nimport { Group } from '@visx/group';\nimport { Circle } from '@visx/shape';\nimport { GradientPinkRed } from '@visx/gradient';\nimport { scaleLinear } from '@visx/scale';\nimport type { PointsRange } from '@visx/mock-data';\nimport { genRandomNormalPoints } from '@visx/mock-data';\nimport { withTooltip, Tooltip } from '@visx/tooltip';\nimport type { WithTooltipProvidedProps } from '@visx/tooltip';\nimport { voronoi, VoronoiPolygon } from '@visx/voronoi';\nimport { localPoint } from '@visx/event';\n\nconst points: PointsRange[] = genRandomNormalPoints(600, /* seed= */ 0.5).filter((_, i) => i < 600);\n\nconst x = (d: PointsRange) => d[0];\nconst y = (d: PointsRange) => d[1];\n\nexport type DotsProps = {\n  width: number;\n  height: number;\n  showControls?: boolean;\n};\n\nlet tooltipTimeout: number;\n\nexport default withTooltip<DotsProps, PointsRange>(\n  ({\n    width,\n    height,\n    showControls = true,\n    hideTooltip,\n    showTooltip,\n    tooltipOpen,\n    tooltipData,\n    tooltipLeft,\n    tooltipTop,\n  }: DotsProps & WithTooltipProvidedProps<PointsRange>) => {\n    if (width < 10) return null;\n    const [showVoronoi, setShowVoronoi] = useState(showControls);\n    const svgRef = useRef<SVGSVGElement>(null);\n    const xScale = useMemo(\n      () =>\n        scaleLinear<number>({\n          domain: [1.3, 2.2],\n          range: [0, width],\n          clamp: true,\n        }),\n      [width],\n    );\n    const yScale = useMemo(\n      () =>\n        scaleLinear<number>({\n          domain: [0.75, 1.6],\n          range: [height, 0],\n          clamp: true,\n        }),\n      [height],\n    );\n    const voronoiLayout = useMemo(\n      () =>\n        voronoi<PointsRange>({\n          x: (d) => xScale(x(d)) ?? 0,\n          y: (d) => yScale(y(d)) ?? 0,\n          width,\n          height,\n        })(points),\n      [width, height, xScale, yScale],\n    );\n\n    // event handlers\n    const handleMouseMove = useCallback(\n      (event: React.MouseEvent | React.TouchEvent) => {\n        if (tooltipTimeout) clearTimeout(tooltipTimeout);\n        if (!svgRef.current) return;\n\n        // find the nearest polygon to the current mouse position\n        const point = localPoint(svgRef.current, event);\n        if (!point) return;\n        const neighborRadius = 100;\n        const closest = voronoiLayout.find(point.x, point.y, neighborRadius);\n        if (closest) {\n          showTooltip({\n            tooltipLeft: xScale(x(closest.data)),\n            tooltipTop: yScale(y(closest.data)),\n            tooltipData: closest.data,\n          });\n        }\n      },\n      [xScale, yScale, showTooltip, voronoiLayout],\n    );\n\n    const handleMouseLeave = useCallback(() => {\n      tooltipTimeout = window.setTimeout(() => {\n        hideTooltip();\n      }, 300);\n    }, [hideTooltip]);\n\n    return (\n      <div>\n        <svg width={width} height={height} ref={svgRef}>\n          <GradientPinkRed id=\"dots-pink\" />\n          {/** capture all mouse events with a rect */}\n          <rect\n            width={width}\n            height={height}\n            rx={14}\n            fill=\"url(#dots-pink)\"\n            onMouseMove={handleMouseMove}\n            onMouseLeave={handleMouseLeave}\n            onTouchMove={handleMouseMove}\n            onTouchEnd={handleMouseLeave}\n          />\n          <Group pointerEvents=\"none\">\n            {points.map((point, i) => (\n              <Circle\n                key={`point-${point[0]}-${i}`}\n                className=\"dot\"\n                cx={xScale(x(point))}\n                cy={yScale(y(point))}\n                r={i % 3 === 0 ? 2 : 3}\n                fill={tooltipData === point ? 'white' : '#f6c431'}\n              />\n            ))}\n            {showVoronoi &&\n              voronoiLayout\n                .polygons()\n                .map((polygon, i) => (\n                  <VoronoiPolygon\n                    key={`polygon-${i}`}\n                    polygon={polygon}\n                    fill=\"white\"\n                    stroke=\"white\"\n                    strokeWidth={1}\n                    strokeOpacity={0.2}\n                    fillOpacity={tooltipData === polygon.data ? 0.5 : 0}\n                  />\n                ))}\n          </Group>\n        </svg>\n        {tooltipOpen && tooltipData && tooltipLeft != null && tooltipTop != null && (\n          <Tooltip left={tooltipLeft + 10} top={tooltipTop + 10}>\n            <div>\n              <strong>x:</strong> {x(tooltipData)}\n            </div>\n            <div>\n              <strong>y:</strong> {y(tooltipData)}\n            </div>\n          </Tooltip>\n        )}\n        {showControls && (\n          <div>\n            <label style={{ fontSize: 12 }}>\n              <input\n                type=\"checkbox\"\n                checked={showVoronoi}\n                onChange={() => setShowVoronoi(!showVoronoi)}\n              />\n              &nbsp;Show voronoi point map\n            </label>\n          </div>\n        )}\n      </div>\n    );\n  },\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dots/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dots/package.json",
    "content": "{\n  \"name\": \"@visx/demo-dots\",\n  \"description\": \"Standalone visx scatterplot demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/event\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/tooltip\": \"latest\",\n    \"@visx/voronoi\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"visualization\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-dots/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-i/Example.tsx",
    "content": "import React, { useMemo, useState, useEffect } from 'react';\nimport { scaleOrdinal } from '@visx/scale';\nimport { LinearGradient } from '@visx/gradient';\nimport { Drag, raise } from '@visx/drag';\nimport type { Circle } from './generateCircles';\nimport generateCircles from './generateCircles';\n\nconst colors = [\n  '#025aac',\n  '#02cff9',\n  '#02efff',\n  '#03aeed',\n  '#0384d7',\n  '#edfdff',\n  '#ab31ff',\n  '#5924d7',\n  '#d145ff',\n  '#1a02b1',\n  '#e582ff',\n  '#ff00d4',\n  '#270eff',\n  '#827ce2',\n];\n\nexport type DragIProps = {\n  width: number;\n  height: number;\n};\n\nexport default function DragI({ width, height }: DragIProps) {\n  const [draggingItems, setDraggingItems] = useState<Circle[]>([]);\n\n  useEffect(() => {\n    if (width > 10 && height > 10) setDraggingItems(generateCircles({ width, height }));\n  }, [width, height]);\n\n  const colorScale = useMemo(\n    () =>\n      scaleOrdinal({\n        range: colors,\n        domain: draggingItems.map((d) => d.id),\n      }),\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n    [width, height],\n  );\n\n  if (draggingItems.length === 0 || width < 10) return null;\n\n  return (\n    <div className=\"Drag\" style={{ touchAction: 'none' }}>\n      <svg width={width} height={height}>\n        <LinearGradient id=\"stroke\" from=\"#ff00a5\" to=\"#ffc500\" />\n        <rect fill=\"#c4c3cb\" width={width} height={height} rx={14} />\n\n        {draggingItems.map((d, i) => (\n          <Drag\n            key={`drag-${d.id}`}\n            width={width}\n            height={height}\n            x={d.x}\n            y={d.y}\n            onDragStart={() => {\n              // svg follows the painter model\n              // so we need to move the data item\n              // to end of the array for it to be drawn\n              // \"on top of\" the other data items\n              setDraggingItems(raise(draggingItems, i));\n            }}\n          >\n            {({ dragStart, dragEnd, dragMove, isDragging, x, y, dx, dy }) => (\n              <circle\n                key={`dot-${d.id}`}\n                cx={x}\n                cy={y}\n                r={isDragging ? d.radius + 4 : d.radius}\n                fill={isDragging ? 'url(#stroke)' : colorScale(d.id)}\n                transform={`translate(${dx}, ${dy})`}\n                fillOpacity={0.9}\n                stroke={isDragging ? 'white' : 'transparent'}\n                strokeWidth={2}\n                onMouseMove={dragMove}\n                onMouseUp={dragEnd}\n                onMouseDown={dragStart}\n                onTouchStart={dragStart}\n                onTouchMove={dragMove}\n                onTouchEnd={dragEnd}\n              />\n            )}\n          </Drag>\n        ))}\n      </svg>\n      <div className=\"deets\">\n        <div>\n          Based on Mike Bostock's{' '}\n          <a href=\"https://bl.ocks.org/mbostock/c206c20294258c18832ff80d8fd395c3\">\n            Circle Dragging II\n          </a>\n        </div>\n      </div>\n\n      <style jsx>{`\n        .Drag {\n          display: flex;\n          flex-direction: column;\n          user-select: none;\n        }\n\n        svg {\n          margin: 1rem 0;\n        }\n        .deets {\n          display: flex;\n          flex-direction: row;\n          font-size: 12px;\n        }\n        .deets > div {\n          margin: 0.25rem;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-i/generateCircles.ts",
    "content": "import { getSeededRandom } from '@visx/mock-data';\n\nexport interface Circle {\n  id: string;\n  radius: number;\n  x: number;\n  y: number;\n}\n\nconst generateCircles = ({ width, height }: { width: number; height: number }) => {\n  const radiusRandom = getSeededRandom(0.2);\n  const xRandom = getSeededRandom(0.3);\n  const yRandom = getSeededRandom(0.4);\n\n  return new Array(width < 360 ? 40 : 185).fill(1).map((d, i) => {\n    const radius = 25 - radiusRandom() * 20;\n    return {\n      id: `${i}`,\n      radius,\n      x: Math.round(xRandom() * (width - radius * 2) + radius),\n      y: Math.round(yRandom() * (height - radius * 2) + radius),\n    };\n  });\n};\n\nexport default generateCircles;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-i/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-i/package.json",
    "content": "{\n  \"name\": \"@visx/demo-drag-i\",\n  \"description\": \"Standalone visx drag demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/drag\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"drag\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-i/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-ii/Example.tsx",
    "content": "import React, { useCallback, useState } from 'react';\nimport { LinePath } from '@visx/shape';\nimport { useDrag } from '@visx/drag';\nimport { curveBasis } from '@visx/curve';\nimport { LinearGradient } from '@visx/gradient';\n\ntype Line = { x: number; y: number }[];\ntype Lines = Line[];\n\nexport type DragIIProps = {\n  width: number;\n  height: number;\n  data?: Lines;\n};\n\nexport default function DragII({ data = [], width, height }: DragIIProps) {\n  const [lines, setLines] = useState<Lines>(data);\n  const onDragStart = useCallback(\n    (currDrag) => {\n      // add the new line with the starting point\n      setLines((currLines) => [...currLines, [{ x: currDrag.x, y: currDrag.y }]]);\n    },\n    [setLines],\n  );\n  const onDragMove = useCallback(\n    (currDrag) => {\n      // add the new point to the current line\n      setLines((currLines) => {\n        const nextLines = [...currLines];\n        const newPoint = { x: currDrag.x + currDrag.dx, y: currDrag.y + currDrag.dy };\n        const lastIndex = nextLines.length - 1;\n        nextLines[lastIndex] = [...(nextLines[lastIndex] || []), newPoint];\n        return nextLines;\n      });\n    },\n    [setLines],\n  );\n  const {\n    x = 0,\n    y = 0,\n    dx,\n    dy,\n    isDragging,\n    dragStart,\n    dragEnd,\n    dragMove,\n  } = useDrag({\n    onDragStart,\n    onDragMove,\n    resetOnStart: true,\n  });\n\n  return width < 10 ? null : (\n    <div className=\"DragII\" style={{ touchAction: 'none' }}>\n      <svg width={width} height={height}>\n        <LinearGradient id=\"stroke\" from=\"#ff614e\" to=\"#ffdc64\" />\n        <rect fill=\"#04002b\" width={width} height={height} rx={14} />\n        {lines.map((line, i) => (\n          <LinePath\n            key={`line-${i}`}\n            fill=\"transparent\"\n            stroke=\"url(#stroke)\"\n            strokeWidth={3}\n            data={line}\n            curve={curveBasis}\n            x={(d) => d.x}\n            y={(d) => d.y}\n          />\n        ))}\n\n        <g>\n          {isDragging && (\n            /* capture mouse events (note: <Drag /> does this for you) */\n            <rect\n              width={width}\n              height={height}\n              onMouseMove={dragMove}\n              onMouseUp={dragEnd}\n              fill=\"transparent\"\n            />\n          )}\n          {/* decorate the currently drawing line */}\n          {isDragging && (\n            <g>\n              <rect\n                fill=\"white\"\n                width={8}\n                height={8}\n                x={x + dx - 4}\n                y={y + dy - 4}\n                pointerEvents=\"none\"\n              />\n              <circle cx={x} cy={y} r={4} fill=\"transparent\" stroke=\"white\" pointerEvents=\"none\" />\n            </g>\n          )}\n          {/* create the drawing area */}\n          <rect\n            fill=\"transparent\"\n            width={width}\n            height={height}\n            onMouseDown={dragStart}\n            onMouseUp={isDragging ? dragEnd : undefined}\n            onMouseMove={isDragging ? dragMove : undefined}\n            onTouchStart={dragStart}\n            onTouchEnd={isDragging ? dragEnd : undefined}\n            onTouchMove={isDragging ? dragMove : undefined}\n          />\n        </g>\n      </svg>\n      <div className=\"deets\">\n        <div>\n          Based on Mike Bostock's{' '}\n          <a href=\"https://bl.ocks.org/mbostock/f705fc55e6f26df29354\">Line Drawing</a>\n        </div>\n      </div>\n\n      <style jsx>{`\n        .DragII {\n          display: flex;\n          flex-direction: column;\n          user-select: none;\n        }\n\n        svg {\n          margin: 1rem 0;\n          cursor: crosshair;\n        }\n\n        .deets {\n          display: flex;\n          flex-direction: row;\n          font-size: 12px;\n        }\n        .deets > div {\n          margin: 0.25rem;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-ii/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-ii/package.json",
    "content": "{\n  \"name\": \"@visx/demo-drag-ii\",\n  \"description\": \"Standalone visx drag demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/drag\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"drag\",\n    \"draw\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-drag-ii/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-albers-usa/Example.tsx",
    "content": "import React, { useState } from 'react';\nimport { AlbersUsa } from '@visx/geo';\nimport { geoCentroid } from '@visx/vendor/d3-geo';\nimport * as topojson from 'topojson-client';\nimport topology from './usa-topo.json';\nimport stateAbbrs from './us-abbr.json';\n\nexport const background = '#EBF4F3';\n\nexport type GeoAlbersUsaProps = {\n  width: number;\n  height: number;\n  fullSize?: boolean;\n};\n\ninterface FeatureShape {\n  type: 'Feature';\n  id: string;\n  geometry: { coordinates: [number, number][][]; type: 'Polygon' };\n  properties: { name: string };\n}\n\n// @ts-expect-error\nconst { features: unitedStates } = topojson.feature(topology, topology.objects.states) as {\n  type: 'FeatureCollection';\n  features: FeatureShape[];\n};\n\nexport const colors: string[] = ['#744DCA', '#3D009C', '#9020FF', '#C630FD'];\n\n// X and Y adjustments to individual states\nconst coordOffsets: Record<string, number[]> = {\n  FL: [11, 3],\n  AK: [0, -4],\n  CA: [-7, 0],\n  NY: [5, 0],\n  MI: [13, 20],\n  LA: [-10, -3],\n  HI: [-10, 10],\n  ID: [0, 10],\n  WV: [-2, 4],\n  KY: [10, 0],\n  TN: [0, 4],\n};\n\n/**\n * These states are too small to have text labels\n * inside of them and are usually displayed with pointers.\n * For simplicity they are omitted from this demo.\n */\nconst ignoredStates = ['VT', 'NH', 'MA', 'RI', 'CT', 'NJ', 'DE', 'MD'];\n\nexport default function GeoAlbersUsa({ width, height, fullSize = true }: GeoAlbersUsaProps) {\n  const [displayLabels, setDisplayLabels] = useState<boolean>(fullSize);\n\n  const centerX = width / 2;\n  const centerY = height / 2;\n  const scale = (width + height) / 1.55;\n\n  return width < 10 ? null : (\n    <>\n      <svg width={width} height={height} style={{ background, borderRadius: '14px' }}>\n        <AlbersUsa<FeatureShape>\n          data={unitedStates}\n          scale={scale}\n          translate={[centerX, centerY - 25]}\n        >\n          {({ features }) =>\n            features.map(({ feature, path, projection }, i) => {\n              const coords: [number, number] | null = projection(geoCentroid(feature));\n              const abbr: string = stateAbbrs[feature.id];\n\n              if (coordOffsets[abbr] && coords) {\n                coords[0] += coordOffsets[abbr][0];\n                coords[1] += coordOffsets[abbr][1];\n              }\n\n              const stylesObj = {\n                fill: '#FFF',\n                fontFamily: 'sans-serif',\n                cursor: 'default',\n              };\n\n              if (abbr === 'HI') {\n                stylesObj.fill = '#3C019C';\n              }\n\n              if (ignoredStates.includes(abbr)) {\n                return (\n                  <path\n                    key={`map-feature-${i}`}\n                    d={path || ''}\n                    fill={colors[i % 4]}\n                    stroke={background}\n                    strokeWidth={0.5}\n                  />\n                );\n              }\n\n              return (\n                <React.Fragment key={`map-feature-${i}`}>\n                  <path\n                    key={`map-feature-${i}`}\n                    d={path || ''}\n                    fill={colors[i % 4]}\n                    stroke={background}\n                    strokeWidth={0.5}\n                  />\n                  {displayLabels && (\n                    <text\n                      transform={`translate(${coords})`}\n                      fontSize={Math.max(width / 75, 9)}\n                      style={stylesObj}\n                      textAnchor=\"middle\"\n                    >\n                      {abbr}\n                    </text>\n                  )}\n                </React.Fragment>\n              );\n            })\n          }\n        </AlbersUsa>\n      </svg>\n      {fullSize && (\n        <label\n          style={{\n            position: 'relative',\n            left: '20px',\n            top: '-60px',\n            fontSize: '14px',\n            display: 'flex',\n            alignItems: 'center',\n          }}\n        >\n          <input\n            type=\"checkbox\"\n            checked={displayLabels}\n            onChange={() => {\n              setDisplayLabels(!displayLabels);\n            }}\n          />\n          &nbsp;Display labels\n        </label>\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-albers-usa/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-albers-usa/package.json",
    "content": "{\n  \"name\": \"@visx/demo-geo-albers-usa\",\n  \"description\": \"Standalone visx geo-albers-usa demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/geo\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"topojson-client\": \"^3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"geojson\",\n    \"geo\",\n    \"mercator\",\n    \"map\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-albers-usa/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-albers-usa/us-abbr.json",
    "content": "{\n  \"01\": \"AL\",\n  \"02\": \"AK\",\n  \"60\": \"AS\",\n  \"04\": \"AZ\",\n  \"05\": \"AR\",\n  \"06\": \"CA\",\n  \"08\": \"CO\",\n  \"09\": \"CT\",\n  \"10\": \"DE\",\n  \"12\": \"FL\",\n  \"64\": \"FM\",\n  \"13\": \"GA\",\n  \"66\": \"GU\",\n  \"15\": \"HI\",\n  \"16\": \"ID\",\n  \"17\": \"IL\",\n  \"18\": \"IN\",\n  \"19\": \"IA\",\n  \"20\": \"KS\",\n  \"21\": \"KY\",\n  \"22\": \"LA\",\n  \"23\": \"ME\",\n  \"68\": \"MH\",\n  \"24\": \"MD\",\n  \"25\": \"MA\",\n  \"26\": \"MI\",\n  \"27\": \"MN\",\n  \"28\": \"MS\",\n  \"29\": \"MO\",\n  \"30\": \"MT\",\n  \"31\": \"NE\",\n  \"32\": \"NV\",\n  \"33\": \"NH\",\n  \"34\": \"NJ\",\n  \"35\": \"NM\",\n  \"36\": \"NY\",\n  \"37\": \"NC\",\n  \"38\": \"ND\",\n  \"69\": \"MP\",\n  \"39\": \"OH\",\n  \"40\": \"OK\",\n  \"41\": \"OR\",\n  \"70\": \"PW\",\n  \"42\": \"PA\",\n  \"72\": \"PR\",\n  \"44\": \"RI\",\n  \"45\": \"SC\",\n  \"46\": \"SD\",\n  \"47\": \"TN\",\n  \"48\": \"TX\",\n  \"74\": \"UM\",\n  \"49\": \"UT\",\n  \"50\": \"VT\",\n  \"51\": \"VA\",\n  \"78\": \"VI\",\n  \"53\": \"WA\",\n  \"54\": \"WV\",\n  \"55\": \"WI\",\n  \"56\": \"WY\"\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-albers-usa/usa-topo.d.ts",
    "content": "declare module '*.json';\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-albers-usa/usa-topo.json",
    "content": "{\n  \"type\": \"Topology\",\n  \"bbox\": [-179.14733999999999, -14.552548999999999, 179.77847, 71.352561],\n  \"transform\": {\n    \"scale\": [0.003589293992939929, 0.0008590596905969058],\n    \"translate\": [-179.14733999999999, -14.552548999999999]\n  },\n  \"objects\": {\n    \"states\": {\n      \"type\": \"GeometryCollection\",\n      \"geometries\": [\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[0]], [[1, 2, 3, 4, 5]]],\n          \"id\": \"01\",\n          \"properties\": { \"name\": \"Alabama\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[6]],\n            [[7]],\n            [[8]],\n            [[9]],\n            [[10]],\n            [[11]],\n            [[12]],\n            [[13]],\n            [[14]],\n            [[15]],\n            [[16]],\n            [[17]],\n            [[18]],\n            [[19]],\n            [[20]],\n            [[21]],\n            [[22]],\n            [[23]],\n            [[24]],\n            [[25]],\n            [[26]],\n            [[27]],\n            [[28]],\n            [[29]],\n            [[30]],\n            [[31]],\n            [[32]],\n            [[33]],\n            [[34]],\n            [[35]],\n            [[36]],\n            [[37]],\n            [[38]],\n            [[39]],\n            [[40]],\n            [[41]],\n            [[42]],\n            [[43]],\n            [[44]],\n            [[45]],\n            [[46]],\n            [[47]],\n            [[48]],\n            [[49]],\n            [[50]],\n            [[51]],\n            [[52]],\n            [[53]],\n            [[54]],\n            [[55]],\n            [[56]],\n            [[57]],\n            [[58]],\n            [[59]],\n            [[60]],\n            [[61]],\n            [[62]],\n            [[63]],\n            [[64]],\n            [[65]],\n            [[66]],\n            [[67]],\n            [[68]],\n            [[69]],\n            [[70]],\n            [[71]],\n            [[72]],\n            [[73]],\n            [[74]],\n            [[75]],\n            [[76]],\n            [[77]],\n            [[78]],\n            [[79]],\n            [[80]],\n            [[81]],\n            [[82]],\n            [[83]],\n            [[84]],\n            [[85]],\n            [[86]],\n            [[87]],\n            [[88]],\n            [[89]],\n            [[90]],\n            [[91]],\n            [[92]],\n            [[93]],\n            [[94]],\n            [[95]],\n            [[96]],\n            [[97]],\n            [[98]],\n            [[99]],\n            [[100]],\n            [[101]],\n            [[102]],\n            [[103]],\n            [[104]],\n            [[105]],\n            [[106]],\n            [[107]],\n            [[108]],\n            [[109]],\n            [[110]],\n            [[111]],\n            [[112]],\n            [[113]],\n            [[114]],\n            [[115]],\n            [[116]],\n            [[117]],\n            [[118]],\n            [[119]],\n            [[120]],\n            [[121]],\n            [[122]],\n            [[123]],\n            [[124]],\n            [[125]],\n            [[126]],\n            [[127]],\n            [[128]],\n            [[129]],\n            [[130]],\n            [[131]],\n            [[132]],\n            [[133]],\n            [[134]],\n            [[135]],\n            [[136]],\n            [[137]],\n            [[138]],\n            [[139]],\n            [[140]],\n            [[141]],\n            [[142]]\n          ],\n          \"id\": \"02\",\n          \"properties\": { \"name\": \"Alaska\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[143, 144, 145, 146, 147]],\n          \"id\": \"04\",\n          \"properties\": { \"name\": \"Arizona\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[148, 149, 150, 151, 152, 153]],\n          \"id\": \"08\",\n          \"properties\": { \"name\": \"Colorado\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[154]],\n            [[155]],\n            [[156]],\n            [[157]],\n            [[158]],\n            [[159]],\n            [[160]],\n            [[161]],\n            [[162]],\n            [[163, 164, -4]]\n          ],\n          \"id\": \"12\",\n          \"properties\": { \"name\": \"Florida\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[165, 166, 167, 168, -164, -3]],\n          \"id\": \"13\",\n          \"properties\": { \"name\": \"Georgia\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[169, 170, 171, 172, 173]],\n          \"id\": \"18\",\n          \"properties\": { \"name\": \"Indiana\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[174, 175, 176, -151]],\n          \"id\": \"20\",\n          \"properties\": { \"name\": \"Kansas\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[177]], [[178]], [[179]], [[180]], [[181]], [[182]], [[183]], [[184, 185]]],\n          \"id\": \"23\",\n          \"properties\": { \"name\": \"Maine\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[186]], [[187]], [[188, 189, 190, 191, 192, 193, 194, 195]]],\n          \"id\": \"25\",\n          \"properties\": { \"name\": \"Massachusetts\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[196, 197, 198, 199, 200]],\n          \"id\": \"27\",\n          \"properties\": { \"name\": \"Minnesota\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[201, 202, 203, 204, 205, 206, 207, 208]],\n          \"id\": \"34\",\n          \"properties\": { \"name\": \"New Jersey\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[209]], [[210]], [[211, 212, 213, -167, 214]]],\n          \"id\": \"37\",\n          \"properties\": { \"name\": \"North Carolina\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[215, -201, 216, 217]],\n          \"id\": \"38\",\n          \"properties\": { \"name\": \"North Dakota\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-152, -177, 218, 219, 220, 221]],\n          \"id\": \"40\",\n          \"properties\": { \"name\": \"Oklahoma\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[222, 223, -204, 224, 225, 226, 227]],\n          \"id\": \"42\",\n          \"properties\": { \"name\": \"Pennsylvania\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[228, -217, -200, 229, 230, 231]],\n          \"id\": \"46\",\n          \"properties\": { \"name\": \"South Dakota\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-221, 232, 233, 234, 235, 236, 237]],\n          \"id\": \"48\",\n          \"properties\": { \"name\": \"Texas\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-232, 238, -149, 239, 240, 241]],\n          \"id\": \"56\",\n          \"properties\": { \"name\": \"Wyoming\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-195, 242, 243, 244]],\n          \"id\": \"09\",\n          \"properties\": { \"name\": \"Connecticut\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[245, 246, 247, 248, 249, 250, 251, -219, -176, 252]],\n          \"id\": \"29\",\n          \"properties\": { \"name\": \"Missouri\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[253, -227, 254, 255, 256]],\n          \"id\": \"54\",\n          \"properties\": { \"name\": \"West Virginia\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[257, 258, 259, -174, 260, -247]],\n          \"id\": \"17\",\n          \"properties\": { \"name\": \"Illinois\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-153, -222, -238, 261, -147]],\n          \"id\": \"35\",\n          \"properties\": { \"name\": \"New Mexico\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-252, 262, 263, 264, -235, 233, -233, -220]],\n          \"id\": \"05\",\n          \"properties\": { \"name\": \"Arkansas\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[265]],\n            [[266]],\n            [[267]],\n            [[268]],\n            [[269]],\n            [[270]],\n            [[271]],\n            [[272]],\n            [[273, 274, 275, -144, 276]]\n          ],\n          \"id\": \"06\",\n          \"properties\": { \"name\": \"California\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[-209, 277]], [[-225, -203, 278, 279]]],\n          \"id\": \"10\",\n          \"properties\": { \"name\": \"Delaware\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[280, 281]],\n          \"id\": \"11\",\n          \"properties\": { \"name\": \"District of Columbia\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[282]], [[283]], [[284]], [[285]], [[286]], [[287]], [[288]], [[289]]],\n          \"id\": \"15\",\n          \"properties\": { \"name\": \"Hawaii\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-199, 290, -258, -246, 291, -230]],\n          \"id\": \"19\",\n          \"properties\": { \"name\": \"Iowa\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[-261, -173, 292, -257, 293, 294, -248]], [[295, -250]]],\n          \"id\": \"21\",\n          \"properties\": { \"name\": \"Kentucky\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[296, 297]],\n            [[298]],\n            [[299]],\n            [[-226, -280, 300, 301, 302, 303, -281, 304, -255]]\n          ],\n          \"id\": \"24\",\n          \"properties\": { \"name\": \"Maryland\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[305]],\n            [[306]],\n            [[307]],\n            [[308]],\n            [[309]],\n            [[310]],\n            [[311]],\n            [[312]],\n            [[313]],\n            [[314, 315, -171]],\n            [[316]],\n            [[317, 318, 319, 320, 321, 322]]\n          ],\n          \"id\": \"26\",\n          \"properties\": { \"name\": \"Michigan\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[323]], [[324]], [[325]], [[326]], [[-264, 327, -6, 328, 329]]],\n          \"id\": \"28\",\n          \"properties\": { \"name\": \"Mississippi\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[330, -218, -229, -242, 331]],\n          \"id\": \"30\",\n          \"properties\": { \"name\": \"Montana\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[332, -185, 333, -190, 334]],\n          \"id\": \"33\",\n          \"properties\": { \"name\": \"New Hampshire\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[335]],\n            [[336]],\n            [[337]],\n            [[338, -207]],\n            [[339]],\n            [[340]],\n            [[341, 342, -196, -245, 343, -205, -224]]\n          ],\n          \"id\": \"36\",\n          \"properties\": { \"name\": \"New York\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[344]], [[345]], [[-316, 346, -228, -254, -293, -172]]],\n          \"id\": \"39\",\n          \"properties\": { \"name\": \"Ohio\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[347, 348, 349, 274, -275, -274, 350]],\n          \"id\": \"41\",\n          \"properties\": { \"name\": \"Oregon\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-251, -296, -249, -295, 351, -215, -166, -2, -328, -263]],\n          \"id\": \"47\",\n          \"properties\": { \"name\": \"Tennessee\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[352, -240, -154, -146, 353]],\n          \"id\": \"49\",\n          \"properties\": { \"name\": \"Utah\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[354]],\n            [[-302, 355]],\n            [[356, -297]],\n            [[-256, -305, -282, -304, 357, -212, -352, -294]]\n          ],\n          \"id\": \"51\",\n          \"properties\": { \"name\": \"Virginia\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[358]],\n            [[359]],\n            [[360]],\n            [[361]],\n            [[362]],\n            [[363]],\n            [[364]],\n            [[365]],\n            [[366]],\n            [[367]],\n            [[368, -348, 369]]\n          ],\n          \"id\": \"53\",\n          \"properties\": { \"name\": \"Washington\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[370]],\n            [[371]],\n            [[372]],\n            [[373]],\n            [[374]],\n            [[375]],\n            [[376]],\n            [[377]],\n            [[378]],\n            [[379]],\n            [[380, -323, 321, -321, 319, -319, 381, -259, -291, -198]]\n          ],\n          \"id\": \"55\",\n          \"properties\": { \"name\": \"Wisconsin\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[382]], [[383]], [[384]]],\n          \"id\": \"60\",\n          \"properties\": { \"name\": \"American Samoa\" }\n        },\n        { \"type\": \"MultiPolygon\", \"arcs\": [[[385]]], \"id\": \"66\", \"properties\": { \"name\": \"Guam\" } },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[386]], [[387]], [[388]], [[389]], [[390]], [[391]], [[392]], [[393]]],\n          \"id\": \"69\",\n          \"properties\": { \"name\": \"Commonwealth of the Northern Mariana Islands\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-231, -292, -253, -175, -150, -239]],\n          \"id\": \"31\",\n          \"properties\": { \"name\": \"Nebraska\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-214, 394, -168]],\n          \"id\": \"45\",\n          \"properties\": { \"name\": \"South Carolina\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[395]], [[396]], [[397]], [[398]], [[399]]],\n          \"id\": \"72\",\n          \"properties\": { \"name\": \"Puerto Rico\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[400]], [[401]], [[402]]],\n          \"id\": \"78\",\n          \"properties\": { \"name\": \"United States Virgin Islands\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-369, 403, -332, -241, -353, 404, -349]],\n          \"id\": \"16\",\n          \"properties\": { \"name\": \"Idaho\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[-275, -350, -405, -354, -145, -276]],\n          \"id\": \"32\",\n          \"properties\": { \"name\": \"Nevada\" }\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[405, -335, -189, -343]],\n          \"id\": \"50\",\n          \"properties\": { \"name\": \"Vermont\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[406]],\n            [[407]],\n            [[408]],\n            [[409]],\n            [[410]],\n            [[411]],\n            [[412]],\n            [[-265, -330, 413, -236]]\n          ],\n          \"id\": \"22\",\n          \"properties\": { \"name\": \"Louisiana\" }\n        },\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [[[-192, 414]], [[415]], [[416]], [[417]], [[-243, -194, 418]]],\n          \"id\": \"44\",\n          \"properties\": { \"name\": \"Rhode Island\" }\n        }\n      ]\n    },\n    \"nation\": {\n      \"type\": \"GeometryCollection\",\n      \"geometries\": [\n        {\n          \"type\": \"MultiPolygon\",\n          \"arcs\": [\n            [[0]],\n            [\n              [\n                164, 4, 328, 413, 236, 261, 147, 276, 350, 369, 403, 330, 215, 196, 380, 317, 381,\n                259, 169, 314, 346, 222, 341, 405, 332, 185, 333, 190, 414, 192, 418, 243, 343, 205,\n                338, 207, 277, 201, 278, 300, 355, 302, 357, 212, 394, 168\n              ]\n            ],\n            [[6]],\n            [[7]],\n            [[8]],\n            [[9]],\n            [[10]],\n            [[11]],\n            [[12]],\n            [[13]],\n            [[14]],\n            [[15]],\n            [[16]],\n            [[17]],\n            [[18]],\n            [[19]],\n            [[20]],\n            [[21]],\n            [[22]],\n            [[23]],\n            [[24]],\n            [[25]],\n            [[26]],\n            [[27]],\n            [[28]],\n            [[29]],\n            [[30]],\n            [[31]],\n            [[32]],\n            [[33]],\n            [[34]],\n            [[35]],\n            [[36]],\n            [[37]],\n            [[38]],\n            [[39]],\n            [[40]],\n            [[41]],\n            [[42]],\n            [[43]],\n            [[44]],\n            [[45]],\n            [[46]],\n            [[47]],\n            [[48]],\n            [[49]],\n            [[50]],\n            [[51]],\n            [[52]],\n            [[53]],\n            [[54]],\n            [[55]],\n            [[56]],\n            [[57]],\n            [[58]],\n            [[59]],\n            [[60]],\n            [[61]],\n            [[62]],\n            [[63]],\n            [[64]],\n            [[65]],\n            [[66]],\n            [[67]],\n            [[68]],\n            [[69]],\n            [[70]],\n            [[71]],\n            [[72]],\n            [[73]],\n            [[74]],\n            [[75]],\n            [[76]],\n            [[77]],\n            [[78]],\n            [[79]],\n            [[80]],\n            [[81]],\n            [[82]],\n            [[83]],\n            [[84]],\n            [[85]],\n            [[86]],\n            [[87]],\n            [[88]],\n            [[89]],\n            [[90]],\n            [[91]],\n            [[92]],\n            [[93]],\n            [[94]],\n            [[95]],\n            [[96]],\n            [[97]],\n            [[98]],\n            [[99]],\n            [[100]],\n            [[101]],\n            [[102]],\n            [[103]],\n            [[104]],\n            [[105]],\n            [[106]],\n            [[107]],\n            [[108]],\n            [[109]],\n            [[110]],\n            [[111]],\n            [[112]],\n            [[113]],\n            [[114]],\n            [[115]],\n            [[116]],\n            [[117]],\n            [[118]],\n            [[119]],\n            [[120]],\n            [[121]],\n            [[122]],\n            [[123]],\n            [[124]],\n            [[125]],\n            [[126]],\n            [[127]],\n            [[128]],\n            [[129]],\n            [[130]],\n            [[131]],\n            [[132]],\n            [[133]],\n            [[134]],\n            [[135]],\n            [[136]],\n            [[137]],\n            [[138]],\n            [[139]],\n            [[140]],\n            [[141]],\n            [[142]],\n            [[154]],\n            [[155]],\n            [[156]],\n            [[157]],\n            [[158]],\n            [[159]],\n            [[160]],\n            [[161]],\n            [[162]],\n            [[177]],\n            [[178]],\n            [[179]],\n            [[180]],\n            [[181]],\n            [[182]],\n            [[183]],\n            [[186]],\n            [[187]],\n            [[209]],\n            [[210]],\n            [[265]],\n            [[266]],\n            [[267]],\n            [[268]],\n            [[269]],\n            [[270]],\n            [[271]],\n            [[272]],\n            [[282]],\n            [[283]],\n            [[284]],\n            [[285]],\n            [[286]],\n            [[287]],\n            [[288]],\n            [[289]],\n            [[297, 356]],\n            [[298]],\n            [[299]],\n            [[305]],\n            [[306]],\n            [[307]],\n            [[308]],\n            [[309]],\n            [[310]],\n            [[311]],\n            [[312]],\n            [[313]],\n            [[316]],\n            [[323]],\n            [[324]],\n            [[325]],\n            [[326]],\n            [[335]],\n            [[336]],\n            [[337]],\n            [[339]],\n            [[340]],\n            [[344]],\n            [[345]],\n            [[354]],\n            [[358]],\n            [[359]],\n            [[360]],\n            [[361]],\n            [[362]],\n            [[363]],\n            [[364]],\n            [[365]],\n            [[366]],\n            [[367]],\n            [[370]],\n            [[371]],\n            [[372]],\n            [[373]],\n            [[374]],\n            [[375]],\n            [[376]],\n            [[377]],\n            [[378]],\n            [[379]],\n            [[382]],\n            [[383]],\n            [[384]],\n            [[385]],\n            [[386]],\n            [[387]],\n            [[388]],\n            [[389]],\n            [[390]],\n            [[391]],\n            [[392]],\n            [[393]],\n            [[395]],\n            [[396]],\n            [[397]],\n            [[398]],\n            [[399]],\n            [[400]],\n            [[401]],\n            [[402]],\n            [[406]],\n            [[407]],\n            [[408]],\n            [[409]],\n            [[410]],\n            [[411]],\n            [[412]],\n            [[415]],\n            [[416]],\n            [[417]]\n          ]\n        }\n      ]\n    }\n  },\n  \"arcs\": [\n    [\n      [25302, 52136],\n      [56, 31],\n      [1, 25],\n      [14, -40],\n      [-9, -28],\n      [-10, 16],\n      [-18, -2],\n      [-20, -17],\n      [-14, 15]\n    ],\n    [\n      [25338, 57677],\n      [0, 15],\n      [150, -6],\n      [63, 0],\n      [160, -13],\n      [93, -2],\n      [37, 2],\n      [159, -4],\n      [61, -5]\n    ],\n    [\n      [26061, 57664],\n      [15, -321],\n      [23, -443],\n      [18, -379],\n      [13, -294],\n      [15, -311],\n      [33, -713],\n      [9, -32],\n      [-4, -36],\n      [13, -45],\n      [5, -149],\n      [10, -72],\n      [17, -69],\n      [3, -82],\n      [9, -36],\n      [-10, -117],\n      [18, -28],\n      [12, -40],\n      [-10, -52],\n      [-11, 0],\n      [2, -24],\n      [-14, -21],\n      [-13, -52],\n      [3, -56],\n      [-2, -86],\n      [-7, -86],\n      [-14, -72],\n      [-3, -45],\n      [6, -124],\n      [-2, -44],\n      [19, -87],\n      [3, -120],\n      [-7, -57],\n      [2, -43],\n      [-8, -80],\n      [1, -79],\n      [-7, -21],\n      [5, -51],\n      [-3, -54],\n      [20, -91],\n      [7, -64],\n      [2, -61]\n    ],\n    [\n      [26229, 53027],\n      [-67, 0],\n      [-71, -5],\n      [-110, -4],\n      [-174, 0],\n      [-135, 7],\n      [-166, -2],\n      [3, -38],\n      [-13, -115],\n      [2, -23],\n      [23, -79],\n      [3, -41],\n      [36, -80],\n      [3, -69],\n      [-15, -102],\n      [3, -55],\n      [20, -51],\n      [-18, -35],\n      [-8, -82],\n      [-9, -15],\n      [7, -24],\n      [-15, -26]\n    ],\n    [\n      [25528, 52188],\n      [-38, -35],\n      [-40, -24],\n      [-56, -4],\n      [18, 41],\n      [12, -26],\n      [35, 27],\n      [3, 34],\n      [-15, 48],\n      [-7, 43],\n      [-20, 47],\n      [-7, 90],\n      [9, 74],\n      [-3, 76],\n      [-7, 48],\n      [-20, 32],\n      [-15, -46],\n      [2, -38],\n      [-9, -57],\n      [1, -41],\n      [-6, -32],\n      [-1, -144],\n      [-8, -66],\n      [-15, -4],\n      [1, 36],\n      [-20, 40],\n      [-15, -16],\n      [-5, 23],\n      [-18, -22]\n    ],\n    [\n      [25284, 52292],\n      [-3, 222],\n      [-3, 357],\n      [-6, 423],\n      [-10, 773],\n      [9, 283],\n      [21, 710],\n      [5, 212],\n      [33, 1120],\n      [6, 160],\n      [19, 643],\n      [12, 362],\n      [-16, 35],\n      [-13, 85]\n    ],\n    [\n      [8053, 88108],\n      [6, 38],\n      [18, -11],\n      [-20, -43],\n      [-4, 16]\n    ],\n    [\n      [7905, 86007],\n      [29, 90],\n      [15, -17],\n      [-1, -46],\n      [-28, -74],\n      [-15, 19],\n      [0, 28]\n    ],\n    [\n      [7695, 85792],\n      [26, -14],\n      [-3, -36],\n      [-23, 50]\n    ],\n    [\n      [7642, 85774],\n      [22, -17],\n      [-7, -33],\n      [-14, 14],\n      [-1, 36]\n    ],\n    [\n      [7602, 85813],\n      [20, -2],\n      [-5, -34],\n      [-15, 36]\n    ],\n    [\n      [7594, 84711],\n      [8, 45],\n      [20, -13],\n      [-8, -73],\n      [-15, -17],\n      [-5, 58]\n    ],\n    [\n      [7543, 85532],\n      [12, 28],\n      [21, -40],\n      [-33, -2],\n      [0, 14]\n    ],\n    [\n      [7540, 87187],\n      [29, 79],\n      [8, 112],\n      [31, -29],\n      [-28, -64],\n      [-9, -49],\n      [5, -24],\n      [-36, -25]\n    ],\n    [\n      [7464, 85521],\n      [14, 55],\n      [18, -28],\n      [23, -4],\n      [-33, -33],\n      [-22, 10]\n    ],\n    [\n      [7385, 86976],\n      [17, 6],\n      [5, -88],\n      [-22, 82]\n    ],\n    [\n      [7168, 84530],\n      [29, 89],\n      [15, 6],\n      [26, -66],\n      [5, 20],\n      [-21, 65],\n      [6, 54],\n      [9, 10],\n      [27, -25],\n      [21, 19],\n      [-29, 54],\n      [16, 56],\n      [29, -31],\n      [15, 4],\n      [-14, 56],\n      [12, 17],\n      [20, -20],\n      [14, 45],\n      [-18, 6],\n      [-13, 33],\n      [20, 3],\n      [22, 67],\n      [34, 18],\n      [-12, 35],\n      [-3, 68],\n      [27, 66],\n      [7, -31],\n      [53, 51],\n      [7, -7],\n      [-12, -118],\n      [-13, -18],\n      [-26, -103],\n      [5, -84],\n      [36, 11],\n      [2, 69],\n      [22, -9],\n      [21, -71],\n      [20, 48],\n      [12, -33],\n      [-17, -117],\n      [9, -22],\n      [9, 72],\n      [27, 47],\n      [7, -25],\n      [-3, -115],\n      [-30, -89],\n      [-32, 23],\n      [-11, 81],\n      [-21, -26],\n      [13, -99],\n      [-22, -20],\n      [-39, 13],\n      [-16, -54],\n      [-8, 36],\n      [2, 74],\n      [-10, 2],\n      [-9, -114],\n      [-8, -24],\n      [-31, -17],\n      [2, -37],\n      [-16, -22],\n      [-45, -13],\n      [-86, 76],\n      [-21, -13],\n      [-15, 29]\n    ],\n    [\n      [7129, 86075],\n      [41, 28],\n      [18, -43],\n      [-5, -48],\n      [-13, -16],\n      [-29, -3],\n      [-16, 59],\n      [4, 23]\n    ],\n    [\n      [6962, 82933],\n      [31, 45],\n      [8, -48],\n      [-37, -9],\n      [-2, 12]\n    ],\n    [\n      [6905, 82759],\n      [20, 62],\n      [19, 20],\n      [11, -11],\n      [25, 17],\n      [5, -40],\n      [19, -37],\n      [36, 16],\n      [-2, -37],\n      [-19, -31],\n      [-46, -6],\n      [-32, -13],\n      [-32, 25],\n      [-4, 35]\n    ],\n    [\n      [6789, 83718],\n      [20, 17],\n      [4, 76],\n      [18, 75],\n      [25, 34],\n      [5, 44],\n      [15, -8],\n      [34, 70],\n      [33, 36],\n      [39, -15],\n      [29, 1],\n      [0, -112],\n      [26, -57],\n      [4, 45],\n      [17, 53],\n      [-18, 48],\n      [6, 25],\n      [53, -14],\n      [-3, 35],\n      [-52, 44],\n      [-19, -4],\n      [-1, 127],\n      [31, 61],\n      [29, 29],\n      [20, -12],\n      [22, -56],\n      [6, -133],\n      [15, 13],\n      [9, 77],\n      [-5, 55],\n      [35, -38],\n      [7, 47],\n      [-37, 36],\n      [-21, 58],\n      [7, 44],\n      [17, -6],\n      [51, -87],\n      [9, 4],\n      [30, -41],\n      [11, 10],\n      [-31, 75],\n      [-20, 34],\n      [-7, 44],\n      [17, 0],\n      [30, -58],\n      [29, 12],\n      [41, -29],\n      [7, 49],\n      [36, 15],\n      [-8, -63],\n      [-39, -106],\n      [-7, -83],\n      [19, -36],\n      [0, 95],\n      [16, 43],\n      [16, -49],\n      [5, 46],\n      [17, 32],\n      [5, 41],\n      [14, 10],\n      [10, -31],\n      [22, 72],\n      [17, 8],\n      [-4, -45],\n      [28, -16],\n      [-11, -38],\n      [-11, 20],\n      [-18, -15],\n      [19, -36],\n      [-5, -49],\n      [19, 22],\n      [11, -51],\n      [27, 1],\n      [-24, -53],\n      [-16, 33],\n      [-24, 2],\n      [-15, -48],\n      [16, -9],\n      [-8, -53],\n      [26, -8],\n      [-26, -89],\n      [23, 17],\n      [13, 47],\n      [5, -35],\n      [47, -4],\n      [-3, -41],\n      [-36, -78],\n      [-13, -110],\n      [-38, 13],\n      [-2, 39],\n      [-10, -41],\n      [-23, 42],\n      [-17, -6],\n      [-23, 49],\n      [-15, -13],\n      [-24, 19],\n      [-8, -46],\n      [27, 1],\n      [15, -17],\n      [45, -87],\n      [-8, -70],\n      [-23, -52],\n      [-11, 36],\n      [-19, -50],\n      [-19, 30],\n      [-6, 38],\n      [-21, 18],\n      [-20, -12],\n      [-17, -37],\n      [29, 2],\n      [20, -49],\n      [-38, -53],\n      [-34, 12],\n      [-4, -20],\n      [25, -34],\n      [14, 13],\n      [35, 1],\n      [22, -43],\n      [-11, -28],\n      [-24, -8],\n      [-34, -33],\n      [-8, 11],\n      [-19, -29],\n      [3, -49],\n      [-27, -50],\n      [-13, 20],\n      [7, 34],\n      [-23, 50],\n      [7, 47],\n      [27, 62],\n      [-8, 24],\n      [-15, -21],\n      [-34, -105],\n      [-3, -24],\n      [-22, 32],\n      [-22, -10],\n      [-5, -35],\n      [26, -6],\n      [10, -63],\n      [-16, -61],\n      [-25, -20],\n      [1, -70],\n      [-25, -41],\n      [-12, 13],\n      [-23, -82],\n      [-19, -30],\n      [-18, 21],\n      [-31, -20],\n      [22, 116],\n      [11, 11],\n      [26, 71],\n      [24, 31],\n      [-2, 37],\n      [-33, -23],\n      [3, 52],\n      [22, 102],\n      [29, 52],\n      [-7, 30],\n      [-15, -45],\n      [-34, -61],\n      [-26, -112],\n      [-24, -59],\n      [-14, -11],\n      [-5, -44],\n      [-19, -30],\n      [-4, 84],\n      [-26, 58],\n      [-33, 27],\n      [3, 100],\n      [-4, 106],\n      [-13, 83],\n      [-11, 32],\n      [-23, 20],\n      [-27, 5],\n      [14, 30],\n      [-15, 37],\n      [5, 23]\n    ],\n    [\n      [6782, 82633],\n      [27, 101],\n      [51, 97],\n      [21, -4],\n      [16, -54],\n      [-12, -23],\n      [-55, -73],\n      [-29, -79],\n      [-19, 35]\n    ],\n    [\n      [6519, 81925],\n      [26, 41],\n      [5, 38],\n      [13, 22],\n      [8, -32],\n      [-6, -43],\n      [5, -68],\n      [-7, -33],\n      [-36, 13],\n      [-8, 62]\n    ],\n    [\n      [6240, 82171],\n      [5, 47],\n      [14, 25],\n      [13, -59],\n      [-13, -63],\n      [-19, 50]\n    ],\n    [\n      [6225, 82357],\n      [9, 35],\n      [3, -82],\n      [-10, -1],\n      [-2, 48]\n    ],\n    [\n      [6080, 82757],\n      [21, 48],\n      [48, -3],\n      [25, -54],\n      [-35, 23],\n      [-16, -26],\n      [-43, -6],\n      [0, 18]\n    ],\n    [\n      [5919, 82533],\n      [19, 25],\n      [11, -57],\n      [-9, -11],\n      [-21, 43]\n    ],\n    [\n      [5642, 81925],\n      [8, 64],\n      [19, 12],\n      [27, -58],\n      [-8, -18],\n      [-21, 37],\n      [-25, -37]\n    ],\n    [\n      [5573, 81984],\n      [16, -49],\n      [-27, 12],\n      [11, 37]\n    ],\n    [\n      [5524, 80844],\n      [-1, 36],\n      [13, 24],\n      [20, -25],\n      [-9, -59],\n      [-19, -15],\n      [-4, 39]\n    ],\n    [\n      [5506, 81836],\n      [8, 67],\n      [10, 10],\n      [11, -62],\n      [-29, -15]\n    ],\n    [\n      [5485, 80904],\n      [12, 85],\n      [-11, 46],\n      [31, -2],\n      [4, -99],\n      [-27, -38],\n      [-9, 8]\n    ],\n    [\n      [5445, 80747],\n      [10, 13],\n      [16, -42],\n      [-1, -34],\n      [-23, -4],\n      [-2, 67]\n    ],\n    [\n      [5429, 81185],\n      [17, -21],\n      [5, 49],\n      [17, 46],\n      [5, -22],\n      [-8, -58],\n      [9, -13],\n      [1, -44],\n      [-10, -61],\n      [13, -30],\n      [-7, -19],\n      [-17, 22],\n      [-2, -21],\n      [-20, 8],\n      [-3, 164]\n    ],\n    [\n      [5385, 80755],\n      [21, 25],\n      [11, -30],\n      [-20, -26],\n      [-12, 31]\n    ],\n    [\n      [5377, 81028],\n      [9, 39],\n      [23, 41],\n      [5, -36],\n      [-23, -38],\n      [-9, -58],\n      [-5, 52]\n    ],\n    [\n      [5303, 81352],\n      [14, 11],\n      [5, -42],\n      [-19, 31]\n    ],\n    [\n      [5265, 80882],\n      [33, 98],\n      [15, 27],\n      [-5, 18],\n      [-22, 0],\n      [-4, 76],\n      [22, 50],\n      [27, -44],\n      [-1, 38],\n      [-13, 52],\n      [30, -13],\n      [18, 114],\n      [12, -23],\n      [-2, -43],\n      [-9, -2],\n      [-5, -75],\n      [12, -18],\n      [0, 33],\n      [13, 1],\n      [-4, -60],\n      [-11, -37],\n      [-22, 12],\n      [-1, -45],\n      [-28, -71],\n      [-18, -24],\n      [-31, -141],\n      [-6, 77]\n    ],\n    [\n      [5246, 85264],\n      [5, 41],\n      [14, -83],\n      [-7, -25],\n      [-12, 67]\n    ],\n    [\n      [5238, 81460],\n      [22, 42],\n      [36, -14],\n      [-1, -78],\n      [-50, 12],\n      [-7, 38]\n    ],\n    [\n      [5213, 85252],\n      [8, 77],\n      [5, -57],\n      [-13, -20]\n    ],\n    [\n      [5096, 81334],\n      [16, 74],\n      [25, 25],\n      [18, -23],\n      [-2, -46],\n      [10, 5],\n      [12, 47],\n      [15, -32],\n      [26, -26],\n      [26, 25],\n      [7, -66],\n      [-9, -60],\n      [-14, 40],\n      [-22, 3],\n      [-14, 23],\n      [-3, 40],\n      [-10, -12],\n      [0, -69],\n      [11, -20],\n      [11, -87],\n      [-11, -60],\n      [-36, 35],\n      [-10, 59],\n      [-18, -18],\n      [-18, -90],\n      [4, 58],\n      [-10, 43],\n      [0, 104],\n      [-4, 28]\n    ],\n    [\n      [5033, 85142],\n      [7, 131],\n      [39, 52],\n      [21, 6],\n      [39, 76],\n      [5, -2],\n      [-55, -273],\n      [-22, -32],\n      [-32, -4],\n      [-2, 46]\n    ],\n    [\n      [4937, 81216],\n      [27, 3],\n      [-4, -71],\n      [-26, 47],\n      [3, 21]\n    ],\n    [\n      [4863, 81217],\n      [10, 31],\n      [36, 8],\n      [-9, -51],\n      [-37, -10],\n      [0, 22]\n    ],\n    [\n      [4804, 81100],\n      [4, 51],\n      [17, 20],\n      [25, -19],\n      [12, -29],\n      [35, -42],\n      [6, -41],\n      [-30, 44],\n      [-23, -57],\n      [-28, 74],\n      [-11, -38],\n      [-7, 37]\n    ],\n    [\n      [4656, 80881],\n      [30, 66],\n      [26, -27],\n      [0, -83],\n      [-11, -53],\n      [-13, -21],\n      [-27, 58],\n      [-5, 60]\n    ],\n    [\n      [4587, 90956],\n      [19, 44],\n      [21, 16],\n      [24, -17],\n      [22, 6],\n      [9, -37],\n      [-1, -50],\n      [-75, -13],\n      [-18, 19],\n      [-1, 32]\n    ],\n    [\n      [4545, 80324],\n      [1, 51],\n      [68, -54],\n      [19, -39],\n      [26, 0],\n      [18, -28],\n      [-20, -23],\n      [-10, -33],\n      [-22, 40],\n      [-17, -9],\n      [-31, 37],\n      [-18, -29],\n      [-22, 57],\n      [8, 30]\n    ],\n    [\n      [4451, 81463],\n      [14, -1],\n      [-5, -38],\n      [-9, 39]\n    ],\n    [\n      [3979, 80040],\n      [12, 22],\n      [16, -18],\n      [-21, -37],\n      [-7, 33]\n    ],\n    [\n      [3880, 79918],\n      [22, 34],\n      [33, -11],\n      [24, 18],\n      [5, -24],\n      [-9, -45],\n      [-26, -13],\n      [-47, 27],\n      [-2, 14]\n    ],\n    [\n      [3807, 79887],\n      [60, 24],\n      [9, -35],\n      [-15, -32],\n      [-13, 37],\n      [-34, -4],\n      [-7, 10]\n    ],\n    [\n      [3781, 79848],\n      [17, 29],\n      [7, -36],\n      [-18, -14],\n      [-6, 21]\n    ],\n    [\n      [3751, 80090],\n      [13, 56],\n      [14, -15],\n      [18, 18],\n      [12, -21],\n      [-22, -33],\n      [13, -48],\n      [30, 0],\n      [1, -41],\n      [-23, 3],\n      [-18, -79],\n      [-23, 24],\n      [-2, 78],\n      [16, 35],\n      [-9, 20],\n      [-16, -21],\n      [-4, 24]\n    ],\n    [\n      [3635, 79967],\n      [5, 36],\n      [28, 54],\n      [30, -6],\n      [3, -58],\n      [20, 6],\n      [14, -15],\n      [8, -44],\n      [13, 13],\n      [-2, -41],\n      [-26, -36],\n      [-12, 11],\n      [-18, -45],\n      [-6, 28],\n      [-25, 1],\n      [-17, -20],\n      [-18, 91],\n      [3, 25]\n    ],\n    [\n      [3608, 79782],\n      [7, 15],\n      [27, -33],\n      [-32, -11],\n      [-2, 29]\n    ],\n    [\n      [3261, 87028],\n      [35, 25],\n      [57, 0],\n      [22, -20],\n      [23, 10],\n      [9, -24],\n      [21, 10],\n      [10, 30],\n      [-8, 38],\n      [34, 68],\n      [37, -11],\n      [0, 37],\n      [25, 46],\n      [33, -40],\n      [24, 32],\n      [23, 9],\n      [15, 54],\n      [19, -132],\n      [27, -10],\n      [29, 34],\n      [29, -20],\n      [27, -40],\n      [-12, -65],\n      [11, -44],\n      [-11, -40],\n      [13, -11],\n      [4, -65],\n      [-13, -38],\n      [21, -54],\n      [2, -58],\n      [21, 10],\n      [-11, -34],\n      [2, -48],\n      [-71, -21],\n      [-6, -34],\n      [-20, 19],\n      [-26, -18],\n      [-28, -58],\n      [8, -64],\n      [-26, -8],\n      [-23, 71],\n      [-38, 47],\n      [-57, -4],\n      [-14, 35],\n      [-28, 18],\n      [-27, 58],\n      [-35, 42],\n      [-40, 19],\n      [-32, 72],\n      [-25, 10],\n      [-2, 70],\n      [-28, 97]\n    ],\n    [\n      [3147, 79003],\n      [17, 23],\n      [22, 53],\n      [25, 5],\n      [37, 40],\n      [9, 27],\n      [28, -21],\n      [14, 19],\n      [8, 44],\n      [22, -19],\n      [3, 72],\n      [24, -11],\n      [-17, 106],\n      [20, 32],\n      [8, -16],\n      [15, 18],\n      [-18, 35],\n      [4, 39],\n      [17, 23],\n      [29, -1],\n      [9, -68],\n      [15, 7],\n      [-7, 50],\n      [13, 31],\n      [-53, 47],\n      [-14, -21],\n      [-32, 81],\n      [0, 46],\n      [31, 92],\n      [42, 50],\n      [36, 32],\n      [6, -15],\n      [23, 13],\n      [16, -63],\n      [-16, -42],\n      [7, -35],\n      [17, -18],\n      [14, 53],\n      [6, -33],\n      [15, 29],\n      [-1, 41],\n      [18, 63],\n      [15, -58],\n      [11, 26],\n      [20, -62],\n      [-8, -56],\n      [-23, -13],\n      [-24, -70],\n      [-40, -70],\n      [2, -39],\n      [34, 54],\n      [58, 64],\n      [4, 22],\n      [22, 22],\n      [7, -19],\n      [-5, -72],\n      [-16, -51],\n      [-26, -34],\n      [-6, -23],\n      [-45, -51],\n      [-30, -20],\n      [12, -46],\n      [-16, -1],\n      [-4, -61],\n      [-16, 17],\n      [-7, -70],\n      [-20, 25],\n      [-4, -76],\n      [-36, -13],\n      [-22, 30],\n      [-10, -31],\n      [-12, 23],\n      [-21, -37],\n      [-6, 11],\n      [-44, -73],\n      [-3, -31],\n      [-23, 4],\n      [-16, -23],\n      [-13, -60],\n      [-28, 23],\n      [-9, -45],\n      [-49, 40],\n      [-15, 36]\n    ],\n    [\n      [3070, 93368],\n      [7, 34],\n      [34, 50],\n      [123, 108],\n      [63, 74],\n      [48, 74],\n      [45, 56],\n      [42, 64],\n      [84, 105],\n      [55, 56],\n      [146, 167],\n      [172, 154],\n      [133, 90],\n      [87, 45],\n      [135, 15],\n      [52, -11],\n      [34, -31],\n      [-41, -11],\n      [7, -38],\n      [-10, -71],\n      [-31, -77],\n      [1, -70],\n      [12, -56],\n      [-21, -59],\n      [-49, -33],\n      [-4, -20],\n      [49, 7],\n      [42, -151],\n      [40, -3],\n      [36, 32],\n      [42, -1],\n      [49, -30],\n      [47, 21],\n      [69, 15],\n      [32, -58],\n      [50, 21],\n      [18, -34],\n      [52, 32],\n      [18, 26],\n      [84, -65],\n      [18, 59],\n      [26, 44],\n      [37, 150],\n      [18, 26],\n      [40, -9],\n      [8, -39],\n      [32, -12],\n      [31, 27],\n      [26, 0],\n      [-32, 110],\n      [-71, 55],\n      [-45, 24],\n      [-48, -1],\n      [-60, -60],\n      [13, 112],\n      [-3, 83],\n      [-62, 114],\n      [-22, 91],\n      [-26, 35],\n      [-59, 14],\n      [-8, 56],\n      [-32, 90],\n      [7, 50],\n      [27, 18],\n      [10, 43],\n      [16, -37],\n      [24, 28],\n      [27, -89],\n      [36, -91],\n      [24, -10],\n      [-19, -101],\n      [3, -55],\n      [28, -50],\n      [57, -123],\n      [53, -68],\n      [39, 18],\n      [30, 28],\n      [9, 49],\n      [-45, 2],\n      [-10, 45],\n      [-56, 70],\n      [-53, 112],\n      [10, 52],\n      [0, 60],\n      [14, 23],\n      [1, 57],\n      [33, 93],\n      [30, -32],\n      [22, 3],\n      [1, 28],\n      [-38, 55],\n      [-25, -8],\n      [-28, 57],\n      [-87, -29],\n      [-32, -37],\n      [-34, 0],\n      [-39, -19],\n      [-34, 17],\n      [-20, 43],\n      [-17, -16],\n      [-21, 23],\n      [-4, -51],\n      [-36, 39],\n      [-91, 42],\n      [-54, 31],\n      [-48, 15],\n      [-22, 30],\n      [1, 98],\n      [-22, 163],\n      [-52, 216],\n      [-20, 58],\n      [-36, 62],\n      [-91, 101],\n      [-145, 228],\n      [-21, 24],\n      [-51, 87],\n      [-50, 49],\n      [-54, 37],\n      [-51, 23],\n      [-29, 35],\n      [-19, 70],\n      [-54, 84],\n      [-45, 40],\n      [-81, 41],\n      [-42, -6],\n      [37, 40],\n      [92, 59],\n      [20, 46],\n      [3, 57],\n      [19, 76],\n      [11, 236],\n      [-8, 117],\n      [179, -31],\n      [68, 6],\n      [144, 42],\n      [79, 28],\n      [77, 15],\n      [77, 63],\n      [41, 65],\n      [29, 30],\n      [53, 87],\n      [81, 192],\n      [21, 92],\n      [7, 79],\n      [-2, 186],\n      [39, 233],\n      [84, 183],\n      [65, 179],\n      [37, 77],\n      [129, 162],\n      [96, -35],\n      [69, -3],\n      [68, 40],\n      [64, 53],\n      [93, 104],\n      [74, 108],\n      [44, 86],\n      [114, 188],\n      [33, 31],\n      [99, 63],\n      [7, -47],\n      [55, -44],\n      [82, -12],\n      [68, 15],\n      [13, 24],\n      [32, -3],\n      [61, 17],\n      [73, 51],\n      [74, 85],\n      [71, 121],\n      [36, 88],\n      [86, 185],\n      [68, 76],\n      [12, -68],\n      [47, -38],\n      [39, -2],\n      [39, -20],\n      [16, -82],\n      [27, 41],\n      [99, -49],\n      [15, -98],\n      [-54, -71],\n      [-35, -63],\n      [-41, -4],\n      [12, -146],\n      [81, -15],\n      [44, 59],\n      [-7, 76],\n      [16, 8],\n      [31, 67],\n      [23, 12],\n      [19, -48],\n      [4, 63],\n      [-27, 43],\n      [35, 55],\n      [21, -47],\n      [-3, 65],\n      [15, 22],\n      [71, -74],\n      [45, -66],\n      [13, -42],\n      [-11, -33],\n      [1, -109],\n      [9, -49],\n      [61, 10],\n      [35, -37],\n      [16, -40],\n      [48, 62],\n      [30, 75],\n      [112, 0],\n      [69, 42],\n      [53, -11],\n      [40, -34],\n      [84, -2],\n      [61, -32],\n      [45, -35],\n      [9, -34],\n      [-26, -11],\n      [-26, -83],\n      [-26, -30],\n      [14, -93],\n      [25, 5],\n      [19, -24],\n      [45, -6],\n      [10, -28],\n      [69, -20],\n      [33, 9],\n      [-17, -43],\n      [9, -25],\n      [-53, -26],\n      [-8, -24],\n      [20, -25],\n      [89, 6],\n      [72, -41],\n      [14, -33],\n      [28, 5],\n      [44, 86],\n      [57, 15],\n      [24, -18],\n      [10, 34],\n      [40, 7],\n      [29, -27],\n      [15, -59],\n      [42, 27],\n      [38, 8],\n      [58, 83],\n      [13, -22],\n      [45, 20],\n      [21, -15],\n      [34, 26],\n      [12, -30],\n      [66, -8],\n      [62, -72],\n      [28, -1],\n      [19, -24],\n      [26, 31],\n      [24, -8],\n      [37, -73],\n      [0, -45],\n      [35, -19],\n      [41, 51],\n      [1, -63],\n      [26, 57],\n      [81, -77],\n      [14, -67],\n      [24, -23],\n      [49, 1],\n      [43, -15],\n      [29, 36],\n      [23, -73],\n      [48, -10],\n      [29, 45],\n      [43, -12],\n      [62, 12],\n      [66, -10],\n      [49, -38],\n      [50, -3],\n      [17, 28],\n      [65, -95],\n      [28, -8],\n      [32, -54],\n      [45, -16],\n      [20, -30],\n      [45, -12],\n      [17, -26],\n      [27, 32],\n      [66, -20],\n      [45, 77],\n      [48, 6],\n      [9, 20],\n      [84, 49],\n      [18, 24],\n      [86, 30],\n      [42, -25],\n      [48, 32],\n      [9, -18],\n      [79, -73],\n      [53, -37],\n      [70, -80],\n      [26, -67],\n      [37, -11],\n      [87, -97],\n      [68, -40],\n      [52, -62],\n      [27, -47],\n      [61, -13],\n      [58, -45],\n      [0, -9012],\n      [2, -971],\n      [-1, -889],\n      [130, -95],\n      [17, 100],\n      [135, -145],\n      [81, 180],\n      [170, 20],\n      [1, -39],\n      [-33, -272],\n      [47, -112],\n      [66, -76],\n      [26, -22],\n      [11, -116],\n      [29, -80],\n      [266, -580],\n      [30, -299],\n      [-8, -93],\n      [22, 4],\n      [51, 108],\n      [111, 158],\n      [11, 23],\n      [68, 8],\n      [32, 139],\n      [-2, 209],\n      [30, -19],\n      [18, 19],\n      [19, 71],\n      [-1, 39],\n      [-32, 47],\n      [45, 48],\n      [68, 28],\n      [131, 158],\n      [62, -115],\n      [28, -88],\n      [11, -2],\n      [24, -70],\n      [0, -104],\n      [-12, -24],\n      [1, -37],\n      [16, -47],\n      [-5, -42],\n      [18, -76],\n      [73, -38],\n      [5, -66],\n      [32, -73],\n      [24, 0],\n      [29, -108],\n      [-6, -69],\n      [26, -20],\n      [-6, -46],\n      [22, -71],\n      [114, -152],\n      [32, -119],\n      [46, -120],\n      [50, -110],\n      [-23, -49],\n      [33, -134],\n      [47, -140],\n      [28, -176],\n      [57, -182],\n      [32, -161],\n      [30, -111],\n      [25, -123],\n      [53, -180],\n      [32, -155],\n      [-33, -140],\n      [89, -52],\n      [-21, -205],\n      [71, -81],\n      [-8, -61],\n      [11, -57],\n      [7, -119],\n      [71, 14],\n      [33, -77],\n      [82, -115],\n      [23, -48],\n      [85, -47],\n      [44, -115],\n      [44, -33],\n      [11, -116],\n      [23, -15],\n      [27, -36],\n      [40, 23],\n      [28, -143],\n      [-3, -90],\n      [-20, -107],\n      [-18, -67],\n      [1, -60],\n      [10, -38],\n      [-5, -118],\n      [12, -104],\n      [11, -46],\n      [6, -133],\n      [12, -63],\n      [-32, -100],\n      [-24, -122],\n      [-1, -33],\n      [-20, -90],\n      [-23, -77],\n      [-37, -97],\n      [-27, -55],\n      [-19, -14],\n      [3, -46],\n      [-19, -23],\n      [-12, 40],\n      [-1, 56],\n      [-13, 24],\n      [-1, -44],\n      [-12, -22],\n      [-18, 18],\n      [-13, 52],\n      [-4, 108],\n      [3, 57],\n      [-17, 33],\n      [8, 103],\n      [-9, 6],\n      [-16, 56],\n      [-6, 64],\n      [30, 63],\n      [17, 63],\n      [15, -8],\n      [-3, 75],\n      [-11, 82],\n      [14, 122],\n      [-9, 190],\n      [-10, 67],\n      [-43, 164],\n      [-22, 55],\n      [-12, 48],\n      [-7, -34],\n      [23, -62],\n      [25, -85],\n      [7, -72],\n      [22, -90],\n      [10, -131],\n      [-16, -43],\n      [-2, -79],\n      [7, -92],\n      [11, -62],\n      [-9, -28],\n      [-11, 96],\n      [-8, 12],\n      [3, -70],\n      [-4, -74],\n      [-36, -102],\n      [-14, -5],\n      [-24, 49],\n      [19, 73],\n      [11, 73],\n      [-3, 38],\n      [-25, -10],\n      [10, -72],\n      [-8, -42],\n      [-33, -56],\n      [-7, 1],\n      [-23, 108],\n      [-11, -45],\n      [-25, 54],\n      [-17, 18],\n      [-12, 50],\n      [-28, 68],\n      [0, 76],\n      [31, 31],\n      [22, 51],\n      [-20, 47],\n      [7, 75],\n      [-9, 39],\n      [23, 44],\n      [3, 24],\n      [-18, 1],\n      [-3, 74],\n      [7, 43],\n      [-41, -17],\n      [6, -45],\n      [11, -16],\n      [-1, -37],\n      [-13, -85],\n      [-1, -60],\n      [-19, -73],\n      [-18, 13],\n      [7, -93],\n      [-10, -43],\n      [-24, 52],\n      [-25, 22],\n      [-9, 30],\n      [-12, 132],\n      [-16, 70],\n      [21, -29],\n      [7, 75],\n      [27, 37],\n      [12, 147],\n      [-8, 102],\n      [10, 57],\n      [6, -21],\n      [12, 42],\n      [7, 92],\n      [-21, -11],\n      [-4, -58],\n      [-19, -30],\n      [-21, -61],\n      [13, -113],\n      [-8, -42],\n      [-33, 3],\n      [-12, -43],\n      [3, -30],\n      [-17, -14],\n      [-7, 34],\n      [4, 67],\n      [-19, 23],\n      [-12, 128],\n      [-32, -17],\n      [0, -48],\n      [-28, 118],\n      [-3, 123],\n      [8, 25],\n      [25, 1],\n      [7, 66],\n      [13, 49],\n      [30, 12],\n      [16, -72],\n      [7, 63],\n      [-15, 168],\n      [9, 3],\n      [30, -45],\n      [4, -59],\n      [11, -32],\n      [6, 23],\n      [-9, 77],\n      [-22, 35],\n      [-19, 48],\n      [-3, 53],\n      [-11, 13],\n      [-12, -25],\n      [-10, 49],\n      [-23, 32],\n      [-5, 57],\n      [12, 23],\n      [-4, 64],\n      [-22, 28],\n      [-37, 66],\n      [-13, 69],\n      [-15, 33],\n      [-13, 79],\n      [29, 43],\n      [-11, 58],\n      [-18, -47],\n      [-19, 18],\n      [-2, -27],\n      [-23, 58],\n      [-31, 8],\n      [-11, 56],\n      [-27, -28],\n      [-54, 76],\n      [-8, 75],\n      [15, 73],\n      [18, -22],\n      [33, 4],\n      [9, 48],\n      [-22, 3],\n      [-32, 36],\n      [2, 35],\n      [-18, 125],\n      [13, 81],\n      [-24, -10],\n      [-15, 19],\n      [-16, 53],\n      [7, 103],\n      [20, 2],\n      [16, -36],\n      [33, -24],\n      [63, -89],\n      [5, 15],\n      [-25, 58],\n      [-20, 19],\n      [-66, 130],\n      [-3, 95],\n      [-17, -15],\n      [-2, -65],\n      [-20, 3],\n      [-39, 166],\n      [-55, 147],\n      [-11, 140],\n      [9, 65],\n      [-2, 52],\n      [27, 41],\n      [-13, 100],\n      [-8, -2],\n      [-9, -85],\n      [-20, -30],\n      [0, -42],\n      [12, -22],\n      [-13, -57],\n      [-10, 10],\n      [-22, -20],\n      [-25, 11],\n      [-36, 34],\n      [-7, -15],\n      [-35, 36],\n      [-40, 174],\n      [-4, 110],\n      [-42, 140],\n      [-13, 79],\n      [19, 1],\n      [-11, 174],\n      [-19, -56],\n      [1, -58],\n      [-35, 132],\n      [-8, 177],\n      [-8, 92],\n      [-21, 135],\n      [-32, 116],\n      [-36, 37],\n      [-5, -16],\n      [28, -38],\n      [4, -41],\n      [17, -39],\n      [20, -131],\n      [-15, 11],\n      [-34, 140],\n      [-22, 36],\n      [-22, 10],\n      [41, -92],\n      [13, -85],\n      [17, -29],\n      [-7, -97],\n      [9, -88],\n      [13, -23],\n      [-5, -24],\n      [27, -124],\n      [3, -55],\n      [25, -139],\n      [2, -32],\n      [-14, 11],\n      [27, -204],\n      [9, -85],\n      [1, -69],\n      [-12, 8],\n      [-1, -61],\n      [12, -64],\n      [-29, 23],\n      [-19, 32],\n      [-14, -4],\n      [-18, 43],\n      [-15, 66],\n      [-10, 84],\n      [-22, -16],\n      [-33, 50],\n      [-27, -37],\n      [-50, -19],\n      [3, 81],\n      [-25, 16],\n      [-4, 19],\n      [30, 39],\n      [-10, 69],\n      [5, 53],\n      [-28, 109],\n      [0, 36],\n      [-22, 84],\n      [13, 24],\n      [-2, 90],\n      [-19, 64],\n      [-12, 10],\n      [15, -131],\n      [-12, -125],\n      [-27, -5],\n      [-42, 70],\n      [-26, 30],\n      [-15, 150],\n      [-11, -68],\n      [-13, -22],\n      [-44, 54],\n      [-14, -20],\n      [-10, 50],\n      [-12, -18],\n      [-3, -54],\n      [45, -35],\n      [7, 7],\n      [45, -44],\n      [33, -66],\n      [30, -104],\n      [-11, -44],\n      [-24, -44],\n      [6, -11],\n      [33, 44],\n      [7, 30],\n      [27, 1],\n      [7, -105],\n      [26, -78],\n      [16, -157],\n      [-19, -44],\n      [-43, -32],\n      [-11, 10],\n      [9, 47],\n      [-18, 16],\n      [-12, -17],\n      [7, -39],\n      [-10, -37],\n      [-43, 22],\n      [-11, -23],\n      [5, -60],\n      [-8, -35],\n      [-29, 5],\n      [-8, 78],\n      [-36, 35],\n      [3, 15],\n      [-28, 74],\n      [-17, 19],\n      [-29, -19],\n      [-35, 70],\n      [-16, 15],\n      [-56, 107],\n      [-51, 75],\n      [-2, 50],\n      [-30, 70],\n      [-37, 64],\n      [-5, 28],\n      [4, 75],\n      [-15, 48],\n      [-55, 121],\n      [-30, 47],\n      [-96, 89],\n      [-36, 71],\n      [-43, 66],\n      [-98, 104],\n      [-42, 49],\n      [-91, 144],\n      [-30, 39],\n      [5, 29],\n      [31, 89],\n      [24, -14],\n      [-9, -27],\n      [24, 3],\n      [0, 43],\n      [21, 70],\n      [-22, 7],\n      [2, 77],\n      [-14, 116],\n      [7, 35],\n      [22, 41],\n      [-5, 34],\n      [16, 30],\n      [-13, 56],\n      [-19, -51],\n      [-2, -59],\n      [-25, -21],\n      [-21, -72],\n      [-1, -49],\n      [-107, -100],\n      [-12, -28],\n      [-28, -28],\n      [-95, 22],\n      [-67, 36],\n      [-26, 32],\n      [-123, 125],\n      [-17, 56],\n      [18, -10],\n      [34, 24],\n      [11, 71],\n      [-33, 131],\n      [3, 42],\n      [-20, -17],\n      [-31, 44],\n      [6, -50],\n      [45, -120],\n      [-10, -21],\n      [-54, -51],\n      [-39, 0],\n      [-49, 55],\n      [-61, 24],\n      [-32, 23],\n      [-81, 40],\n      [-45, 11],\n      [-59, -4],\n      [-63, -33],\n      [-77, -12],\n      [-80, -28],\n      [-54, -48],\n      [-39, 39],\n      [-45, -26],\n      [-64, -120],\n      [-46, -115],\n      [6, 65],\n      [36, 103],\n      [62, 117],\n      [46, 2],\n      [-16, 66],\n      [-49, 48],\n      [-8, 25],\n      [-10, -82],\n      [-26, 84],\n      [-26, 30],\n      [-17, -9],\n      [-16, 27],\n      [-71, 19],\n      [9, 28],\n      [38, 23],\n      [-42, 33],\n      [-19, -6],\n      [-2, 25],\n      [37, 156],\n      [-15, 15],\n      [-13, -36],\n      [-29, -22],\n      [-1, -57],\n      [-20, -66],\n      [-39, 12],\n      [-70, 97],\n      [1, 31],\n      [-26, 36],\n      [-39, 26],\n      [-41, -35],\n      [-22, 27],\n      [13, 29],\n      [31, 32],\n      [25, 74],\n      [-14, 10],\n      [-18, -49],\n      [-79, -93],\n      [-29, -23],\n      [-38, 5],\n      [1, -54],\n      [60, 27],\n      [11, -24],\n      [2, -53],\n      [-17, 2],\n      [-28, -37],\n      [-18, 6],\n      [-41, -38],\n      [-41, -77],\n      [-12, 2],\n      [-12, 48],\n      [47, 77],\n      [-37, -12],\n      [-17, 11],\n      [-1, 54],\n      [23, 83],\n      [13, 27],\n      [18, 2],\n      [20, -31],\n      [24, 17],\n      [22, 41],\n      [38, 13],\n      [57, 58],\n      [42, 20],\n      [-9, 25],\n      [-19, -2],\n      [1, 71],\n      [-11, -49],\n      [-19, -20],\n      [1, 30],\n      [25, 65],\n      [1, 21],\n      [-33, -58],\n      [-45, -47],\n      [-19, -3],\n      [-4, 30],\n      [63, 112],\n      [-6, 38],\n      [-29, -60],\n      [-38, -14],\n      [-12, 26],\n      [-15, -49],\n      [-20, -14],\n      [-54, 13],\n      [-10, 58],\n      [27, 19],\n      [11, -9],\n      [18, 25],\n      [40, 16],\n      [29, 28],\n      [23, 65],\n      [-25, 2],\n      [-14, -46],\n      [-23, -19],\n      [-45, -2],\n      [-18, 68],\n      [-12, 3],\n      [-17, -69],\n      [-21, -8],\n      [-4, 59],\n      [16, 26],\n      [17, -6],\n      [-11, 44],\n      [-3, 55],\n      [13, 34],\n      [26, 114],\n      [96, 6],\n      [-7, 38],\n      [-91, -5],\n      [-21, -63],\n      [-27, -26],\n      [-21, -77],\n      [-31, -48],\n      [-23, 12],\n      [20, 36],\n      [-10, 113],\n      [-12, 53],\n      [18, 30],\n      [-22, 10],\n      [-14, -23],\n      [-1, -51],\n      [12, -63],\n      [-14, -63],\n      [1, -41],\n      [-13, -15],\n      [-26, 48],\n      [-2, -67],\n      [-27, -45],\n      [-21, 22],\n      [0, 52],\n      [-11, 19],\n      [-7, -73],\n      [-9, 15],\n      [4, 129],\n      [9, 62],\n      [-15, 11],\n      [-17, -130],\n      [9, -111],\n      [-4, -29],\n      [-19, -9],\n      [1, 49],\n      [-27, 34],\n      [-7, -46],\n      [16, -65],\n      [-13, -8],\n      [-38, 16],\n      [-34, -48],\n      [-28, 9],\n      [-5, 31],\n      [14, 95],\n      [42, 151],\n      [1, 53],\n      [49, 123],\n      [16, 81],\n      [-6, 18],\n      [-73, -211],\n      [-1, -35],\n      [-18, -58],\n      [-8, 8],\n      [-8, 69],\n      [-12, -1],\n      [-3, -81],\n      [-11, -54],\n      [-18, -42],\n      [-3, -64],\n      [-16, -68],\n      [-21, 27],\n      [-7, -44],\n      [24, -28],\n      [-5, -91],\n      [10, -8],\n      [19, 85],\n      [37, 6],\n      [11, -22],\n      [4, -91],\n      [-14, -45],\n      [-31, -32],\n      [-22, -76],\n      [1, -63],\n      [21, 20],\n      [17, 75],\n      [30, 44],\n      [30, -89],\n      [0, -44],\n      [10, -43],\n      [-23, -192],\n      [-26, 0],\n      [-9, 52],\n      [-19, 9],\n      [1, -36],\n      [-27, -44],\n      [0, -17],\n      [28, 14],\n      [23, -27],\n      [61, -124],\n      [26, -85],\n      [-15, -77],\n      [-13, -26],\n      [-34, -35],\n      [-17, 16],\n      [-14, -18],\n      [-29, -6],\n      [9, 51],\n      [-26, 67],\n      [9, 60],\n      [-17, 63],\n      [-16, -126],\n      [0, -62],\n      [-12, -41],\n      [-19, 69],\n      [-9, -8],\n      [-7, -59],\n      [-18, -33],\n      [-34, 50],\n      [-29, -40],\n      [-15, 52],\n      [-27, -21],\n      [-22, 5],\n      [-9, 28],\n      [24, 74],\n      [-9, 14],\n      [-27, -38],\n      [-29, -175],\n      [-30, -42],\n      [-9, 18],\n      [14, 55],\n      [13, 84],\n      [-15, 172],\n      [-16, 5],\n      [-5, -28],\n      [1, -81],\n      [13, -53],\n      [-10, -4],\n      [-10, -72],\n      [-17, 11],\n      [-8, -20],\n      [-5, -68],\n      [-11, -17],\n      [4, -47],\n      [25, -31],\n      [-6, -74],\n      [-27, 32],\n      [-12, 127],\n      [8, 37],\n      [-11, 78],\n      [-17, 6],\n      [6, -52],\n      [-8, -49],\n      [5, -196],\n      [-5, -64],\n      [-27, 74],\n      [-1, 43],\n      [-16, 28],\n      [-34, 31],\n      [3, -40],\n      [24, -36],\n      [-1, -63],\n      [-69, -158],\n      [-32, -91],\n      [0, -36],\n      [-16, -10],\n      [-9, -86],\n      [-12, 2],\n      [-3, 70],\n      [34, 211],\n      [0, 29],\n      [-26, -65],\n      [-19, -111],\n      [-12, 11],\n      [-9, 142],\n      [-13, -52],\n      [-11, 2],\n      [16, -62],\n      [-5, -80],\n      [-39, 0],\n      [-8, -61],\n      [-18, -24],\n      [-22, -55],\n      [7, -43],\n      [-15, -41],\n      [-16, -10],\n      [0, 54],\n      [-16, 36],\n      [-13, -45],\n      [-1, -53],\n      [-22, -17],\n      [-24, 31],\n      [-9, -23],\n      [-21, 38],\n      [-7, 43],\n      [-12, -36],\n      [-21, -27],\n      [6, -35],\n      [-20, 0],\n      [-5, -39],\n      [-41, -7],\n      [-6, 76],\n      [-22, -14],\n      [-21, 22],\n      [3, 22],\n      [-21, 8],\n      [-3, 70],\n      [8, 36],\n      [16, 18],\n      [5, 71],\n      [32, 31],\n      [9, -11],\n      [29, 51],\n      [33, 3],\n      [0, 45],\n      [33, 21],\n      [34, 62],\n      [31, -9],\n      [-11, 69],\n      [22, 26],\n      [3, 32],\n      [37, 102],\n      [-13, 15],\n      [-24, -22],\n      [-60, -109],\n      [-30, -20],\n      [-18, -39],\n      [-39, 16],\n      [-43, 67],\n      [-15, 40],\n      [-5, 46],\n      [18, 117],\n      [13, 45],\n      [15, 133],\n      [27, 79],\n      [17, 33],\n      [35, 99],\n      [11, 98],\n      [0, 71],\n      [23, 32],\n      [5, 156],\n      [4, 27],\n      [-18, 44],\n      [-22, 163],\n      [39, 35],\n      [5, 27],\n      [63, 27],\n      [89, 164],\n      [92, 118],\n      [51, -161],\n      [41, -16],\n      [13, -27],\n      [34, 112],\n      [30, 8],\n      [36, -45],\n      [19, 10],\n      [63, -48],\n      [65, -20],\n      [30, -55],\n      [-1, 27],\n      [-22, 63],\n      [-29, 36],\n      [-38, -14],\n      [-51, 63],\n      [-24, -1],\n      [-40, 42],\n      [-25, 68],\n      [-39, 66],\n      [-29, 28],\n      [18, 55],\n      [24, 9],\n      [31, 124],\n      [23, 18],\n      [8, 60],\n      [46, 27],\n      [30, 45],\n      [-32, 50],\n      [-20, 4],\n      [-43, -64],\n      [-11, -49],\n      [-19, -14],\n      [-12, -70],\n      [0, -70],\n      [-18, -31],\n      [-25, 19],\n      [-36, 7],\n      [-74, -17],\n      [-26, 43],\n      [-28, 16],\n      [-14, -52],\n      [-87, -84],\n      [-39, -154],\n      [-36, -12],\n      [-19, -31],\n      [-33, 2],\n      [-39, -63],\n      [-48, -109],\n      [-1, -29],\n      [26, -124],\n      [-2, -23],\n      [-38, 25],\n      [-19, -18],\n      [-30, -52],\n      [-21, -92],\n      [-27, -29],\n      [-32, -74],\n      [-6, -73],\n      [8, -34],\n      [19, -24],\n      [-40, -56],\n      [-9, -67],\n      [-13, -4],\n      [-28, -70],\n      [-19, -7],\n      [-9, 28],\n      [-25, -11],\n      [4, -68],\n      [16, -13],\n      [-3, -30],\n      [25, -42],\n      [8, -35],\n      [-12, -73],\n      [-19, -47],\n      [-7, -62],\n      [-25, -21],\n      [-4, -22],\n      [-39, -2],\n      [-15, 12],\n      [-40, -31],\n      [-18, 3],\n      [-19, -60],\n      [23, 16],\n      [15, -20],\n      [15, 30],\n      [19, 1],\n      [7, -50],\n      [-16, -116],\n      [-19, -16],\n      [-26, -51],\n      [-28, 37],\n      [5, -34],\n      [-13, -18],\n      [-18, 18],\n      [7, 35],\n      [2, 75],\n      [-22, 71],\n      [3, -119],\n      [-9, -55],\n      [-18, -15],\n      [-13, 25],\n      [-6, -35],\n      [16, -28],\n      [-9, -53],\n      [-49, -10],\n      [17, -93],\n      [-8, -32],\n      [-27, -21],\n      [-10, 8],\n      [-24, -45],\n      [-12, 13],\n      [-36, -37],\n      [5, -26],\n      [20, -18],\n      [-23, -32],\n      [-7, -43],\n      [2, -61],\n      [-12, -44],\n      [-24, -35],\n      [24, -26],\n      [-6, -59],\n      [10, -60],\n      [27, 63],\n      [59, -23],\n      [16, 22],\n      [12, -22],\n      [15, 25],\n      [22, -78],\n      [19, -27],\n      [19, 13],\n      [23, -34],\n      [18, -53],\n      [8, -53],\n      [15, -22],\n      [-28, -14],\n      [-14, -118],\n      [-12, -39],\n      [-30, -25],\n      [-11, -55],\n      [-24, -33],\n      [-48, 0],\n      [-15, -17],\n      [-4, -94],\n      [-12, -33],\n      [-27, 1],\n      [-5, -20],\n      [10, -79],\n      [11, -32],\n      [-27, -36],\n      [-20, 15],\n      [-2, -45],\n      [20, -46],\n      [-11, -81],\n      [-21, -30],\n      [-6, -33],\n      [9, -24],\n      [-23, 0],\n      [-14, -52],\n      [-26, 66],\n      [-9, -7],\n      [5, -57],\n      [-4, -40],\n      [-21, -3],\n      [-12, -43],\n      [-17, 16],\n      [0, 27],\n      [-20, -1],\n      [-4, -39],\n      [-22, -24],\n      [-23, 31],\n      [-28, -17],\n      [-35, -69],\n      [15, -52],\n      [-9, -51],\n      [-40, -44],\n      [-28, -2],\n      [1, -53],\n      [14, -25],\n      [-6, -40],\n      [-20, -16],\n      [-36, 59],\n      [-10, 30],\n      [-20, -20],\n      [-5, -63],\n      [1, -69],\n      [-26, -27],\n      [-3, -97],\n      [-65, -7],\n      [-21, 24],\n      [-2, -74],\n      [8, -71],\n      [-20, 0],\n      [-12, 37],\n      [-21, 3],\n      [-4, -39],\n      [-32, -27],\n      [-39, -92],\n      [-15, -12],\n      [-5, -44],\n      [13, -11],\n      [47, 64],\n      [4, -50],\n      [-6, -53],\n      [-15, -7],\n      [0, -31],\n      [18, -38],\n      [-10, -38],\n      [-18, -26],\n      [-2, -49],\n      [-26, -44],\n      [-8, -32],\n      [2, -42],\n      [-32, 14],\n      [-31, -28],\n      [-4, -70],\n      [-12, -12],\n      [-19, 75],\n      [-8, -53],\n      [-27, -42],\n      [-11, -53],\n      [-24, -6],\n      [5, -50],\n      [-17, -27],\n      [-25, 43],\n      [-24, 67],\n      [-22, -16],\n      [0, -51],\n      [11, -5],\n      [1, -36],\n      [-29, -10],\n      [-13, -67],\n      [6, -32],\n      [18, -6],\n      [5, -52],\n      [-36, -4],\n      [-24, -15],\n      [-17, 77],\n      [-51, -38],\n      [-18, -51],\n      [-16, -3],\n      [-9, -49],\n      [19, -1],\n      [27, 25],\n      [20, -17],\n      [6, -54],\n      [-16, -47],\n      [-43, 44],\n      [-23, 11],\n      [-5, -70],\n      [-33, 6],\n      [-23, 21],\n      [-20, -33],\n      [-27, -88],\n      [2, -44],\n      [47, -20],\n      [32, -36],\n      [-3, -29],\n      [-32, -42],\n      [1, -23],\n      [18, -4],\n      [25, 31],\n      [16, -7],\n      [-55, -78],\n      [-23, -63],\n      [1, -52],\n      [-13, 50],\n      [-10, -17],\n      [16, -66],\n      [-6, -50],\n      [-7, 39],\n      [-10, -2],\n      [-2, -53],\n      [-25, 80],\n      [0, 95],\n      [-19, -60],\n      [8, -73],\n      [-4, -67],\n      [-24, -6],\n      [3, 58],\n      [-35, 1],\n      [-16, -80],\n      [-25, -9],\n      [-75, -43],\n      [-29, -22],\n      [-7, -22],\n      [-3, -74],\n      [-17, 46],\n      [5, 80],\n      [-23, -19],\n      [10, -30],\n      [1, -104],\n      [-16, -71],\n      [6, -46],\n      [-24, -81],\n      [-32, -30],\n      [2, 52],\n      [24, 4],\n      [-1, 40],\n      [-10, 4],\n      [2, 111],\n      [18, 72],\n      [-29, 39],\n      [-28, 12],\n      [-13, -18],\n      [3, -45],\n      [-12, -21],\n      [-13, 22],\n      [-25, -13],\n      [-9, -82],\n      [-35, -74],\n      [-26, -20],\n      [-37, 28],\n      [-6, -29],\n      [11, -44],\n      [-20, -81],\n      [1, -31],\n      [-21, -37],\n      [-12, 105],\n      [-10, 13],\n      [-14, -37],\n      [-11, 14],\n      [-18, -31],\n      [31, -13],\n      [-2, -68],\n      [-32, -10],\n      [-16, 25],\n      [5, 39],\n      [-13, 24],\n      [-22, -22],\n      [-19, -90],\n      [-61, -85],\n      [-26, 2],\n      [-11, 29],\n      [-26, -29],\n      [-13, 4],\n      [10, 156],\n      [29, 96],\n      [1, 46],\n      [-15, 16],\n      [-31, -2],\n      [-24, -29],\n      [-24, -101],\n      [4, -129],\n      [-40, -140],\n      [-7, -12],\n      [-14, -85],\n      [-21, 36],\n      [-19, -12],\n      [13, -65],\n      [10, -17],\n      [1, -56],\n      [-25, -38],\n      [-19, 33],\n      [0, 45],\n      [-16, 15],\n      [-13, -60],\n      [10, -49],\n      [-17, -47],\n      [-14, 27],\n      [-32, -8],\n      [-16, 18],\n      [-14, 74],\n      [32, 6],\n      [-21, 47],\n      [-8, 104],\n      [-21, 56],\n      [-11, 7],\n      [-16, -33],\n      [-10, -65],\n      [7, -27],\n      [14, 0],\n      [18, -70],\n      [-11, -46],\n      [14, -95],\n      [0, -52],\n      [-22, 30],\n      [-20, -19],\n      [3, -26],\n      [-17, -30],\n      [-18, -7],\n      [-22, 28],\n      [-16, 59],\n      [4, 36],\n      [-13, 56],\n      [-21, 37],\n      [-31, -25],\n      [-10, -56],\n      [49, -85],\n      [4, -31],\n      [-50, -111],\n      [-24, -21],\n      [-20, -33],\n      [16, -56],\n      [27, 2],\n      [9, 24],\n      [22, -50],\n      [13, -83],\n      [-26, 6],\n      [8, 34],\n      [-17, 6],\n      [-10, -28],\n      [-16, 22],\n      [-17, 62],\n      [-25, -39],\n      [2, -69],\n      [-18, -1],\n      [-28, -50],\n      [-23, 18],\n      [-37, 10],\n      [-45, -5],\n      [-34, -14],\n      [-41, -40],\n      [-29, -71],\n      [-4, -69],\n      [-29, -53],\n      [-51, -33],\n      [-29, 3],\n      [-28, 28],\n      [-9, 30],\n      [-9, 74],\n      [-10, 30],\n      [-1, 55],\n      [8, 29],\n      [44, 41],\n      [14, 25],\n      [23, 110],\n      [19, 110],\n      [-1, 29],\n      [22, 54],\n      [14, 13],\n      [25, -46],\n      [38, 39],\n      [25, 49],\n      [25, 0],\n      [37, 81],\n      [34, 20],\n      [36, -14],\n      [31, 5],\n      [1, -37],\n      [28, -72],\n      [9, -61],\n      [-5, -50],\n      [27, 24],\n      [-8, 52],\n      [2, 37],\n      [30, -30],\n      [-15, 42],\n      [2, 77],\n      [-10, 109],\n      [32, 46],\n      [26, 21],\n      [42, -15],\n      [21, 14],\n      [10, 69],\n      [-16, 4],\n      [4, 28],\n      [18, 10],\n      [7, 38],\n      [18, -4],\n      [26, 99],\n      [3, -32],\n      [15, -20],\n      [21, 48],\n      [-5, 83],\n      [-20, -9],\n      [27, 68],\n      [64, 206],\n      [33, 52],\n      [23, 62],\n      [19, 13],\n      [27, 42],\n      [25, 68],\n      [27, 14],\n      [35, 39],\n      [37, 20],\n      [89, 70],\n      [30, -9],\n      [10, 18],\n      [45, 5],\n      [10, -10],\n      [-20, -27],\n      [-1, -47],\n      [14, -2],\n      [-3, -49],\n      [-29, -18],\n      [-3, -85],\n      [38, -98],\n      [11, 22],\n      [27, -39],\n      [4, 19],\n      [-29, 53],\n      [-3, 85],\n      [-6, 32],\n      [26, -28],\n      [57, 3],\n      [7, -86],\n      [23, 7],\n      [26, -36],\n      [7, 22],\n      [-14, 40],\n      [27, 15],\n      [-56, 89],\n      [-32, 36],\n      [1, 58],\n      [-16, -7],\n      [39, 166],\n      [15, 123],\n      [11, 56],\n      [23, 44],\n      [36, 96],\n      [18, 13],\n      [40, 74],\n      [30, 81],\n      [82, 96],\n      [41, 74],\n      [35, 39],\n      [68, 106],\n      [17, 42],\n      [29, -68],\n      [19, -14],\n      [31, 19],\n      [8, 59],\n      [-13, 47],\n      [-2, 46],\n      [15, 122],\n      [29, 108],\n      [41, 130],\n      [24, 62],\n      [22, 37],\n      [40, 41],\n      [21, 52],\n      [22, 87],\n      [14, 15],\n      [26, 62],\n      [30, 25],\n      [8, -74],\n      [18, -15],\n      [4, 41],\n      [-10, 105],\n      [-23, -2],\n      [-6, 34],\n      [2, 95],\n      [9, 59],\n      [25, 409],\n      [14, 42],\n      [38, 16],\n      [12, 53],\n      [-20, -9],\n      [-34, 77],\n      [-3, 62],\n      [9, 97],\n      [20, 106],\n      [27, 33],\n      [29, 101],\n      [49, 102],\n      [4, 57],\n      [19, 93],\n      [-5, 45],\n      [13, 33],\n      [-3, 43],\n      [13, 38],\n      [-20, 0],\n      [-11, -32],\n      [0, -38],\n      [-21, -53],\n      [-28, -31],\n      [-38, -27],\n      [-21, -31],\n      [-29, -22],\n      [-5, -21],\n      [-41, -28],\n      [-44, -61],\n      [-79, -73],\n      [-26, 5],\n      [-28, 53],\n      [-5, 73],\n      [-20, 49],\n      [-40, 38],\n      [2, 46],\n      [11, 17],\n      [9, 167],\n      [-12, -3],\n      [-25, -101],\n      [-41, -54],\n      [-6, -58],\n      [5, -58],\n      [-8, -37],\n      [-14, -12],\n      [-3, -32],\n      [9, -80],\n      [16, -91],\n      [19, -76],\n      [-26, -87],\n      [-28, -21],\n      [-42, 32],\n      [-39, 161],\n      [-47, 208],\n      [-26, 73],\n      [-23, 42],\n      [-31, 13],\n      [16, 65],\n      [-16, 44],\n      [-25, -9],\n      [-6, -87],\n      [-15, 7],\n      [1, -65],\n      [-29, -30],\n      [-24, 79],\n      [3, 26],\n      [-19, 19],\n      [-11, -30],\n      [-16, 6],\n      [-1, 59],\n      [-22, -18],\n      [-25, 61],\n      [18, 47],\n      [-17, 89],\n      [-44, -52],\n      [-46, -72],\n      [-31, -62],\n      [-20, -95],\n      [-13, 57],\n      [-36, -33],\n      [-94, -124],\n      [-10, -41],\n      [0, -49],\n      [-41, -38],\n      [-8, -26],\n      [-22, -10],\n      [-15, -44],\n      [-20, -15],\n      [-4, 55],\n      [-29, 45],\n      [-54, -20],\n      [-29, 33],\n      [49, 47],\n      [15, -39],\n      [18, 12],\n      [5, 50],\n      [25, 77],\n      [3, 60],\n      [-8, 85],\n      [1, 81],\n      [-16, 74],\n      [5, 21],\n      [-16, 20],\n      [-29, 97],\n      [-20, 139],\n      [29, 128],\n      [21, 23],\n      [24, 79],\n      [24, 26],\n      [-15, 77],\n      [-18, 44],\n      [-15, 64],\n      [-10, 107],\n      [-50, 162],\n      [-3, 74],\n      [-25, 67],\n      [-10, 63],\n      [-30, 85],\n      [-10, 44],\n      [-22, 9],\n      [-11, -37],\n      [-2, -74],\n      [6, -37],\n      [-8, -56],\n      [-12, -21],\n      [-27, -10],\n      [-18, 21],\n      [-19, -54],\n      [-36, -29],\n      [-50, -68],\n      [-73, -48],\n      [-88, -28],\n      [-75, 10],\n      [-51, 38],\n      [-13, 32],\n      [-13, 99],\n      [23, 18],\n      [-18, 69],\n      [-54, 62],\n      [-32, 108],\n      [-5, 34],\n      [-33, 51],\n      [-18, 62],\n      [-42, 8],\n      [-31, 42],\n      [-47, 110],\n      [23, 32],\n      [24, 55],\n      [-2, 36],\n      [-24, 6],\n      [-38, -54],\n      [-48, 10],\n      [-16, 51],\n      [11, 32],\n      [32, 1],\n      [57, 128],\n      [10, -4],\n      [17, 45],\n      [-16, 34],\n      [-4, 41],\n      [32, 24],\n      [-27, 7],\n      [5, 70],\n      [27, 78],\n      [-17, 3],\n      [-18, -48],\n      [-40, 42],\n      [-6, 40],\n      [22, 49],\n      [27, -6],\n      [19, 23],\n      [0, 45],\n      [-17, -21],\n      [-30, 32],\n      [-16, 54],\n      [2, 23],\n      [-20, 7],\n      [-13, 35],\n      [-10, -14],\n      [-12, -99],\n      [-14, -6],\n      [-38, 16],\n      [-10, 21],\n      [-10, 66],\n      [1, 129],\n      [-11, 19],\n      [-43, 10],\n      [-18, 37],\n      [-10, 98],\n      [42, 44],\n      [6, 38],\n      [-17, 46],\n      [-30, 31],\n      [-45, -27],\n      [0, -46],\n      [-21, 23],\n      [-9, 88],\n      [8, 147],\n      [6, 11],\n      [-2, -107],\n      [92, 47],\n      [0, 19],\n      [-35, 20],\n      [-20, 28],\n      [-24, 82],\n      [2, 18],\n      [36, 19],\n      [55, -8],\n      [33, 25],\n      [-29, 134],\n      [-4, 46],\n      [3, 84],\n      [21, 77],\n      [101, 278],\n      [4, 29],\n      [27, 77],\n      [29, 61],\n      [5, 70],\n      [18, 67],\n      [21, 34],\n      [19, -4],\n      [9, 23],\n      [-11, 115],\n      [26, 188],\n      [18, 70],\n      [38, 61],\n      [-18, 24],\n      [4, 22],\n      [58, 133],\n      [60, 46],\n      [48, 11],\n      [42, -45],\n      [43, -11],\n      [32, -84],\n      [24, -6],\n      [6, -26],\n      [54, -88],\n      [73, 24],\n      [61, 124],\n      [4, 47],\n      [44, 29],\n      [63, 172],\n      [23, 89],\n      [23, 39],\n      [-9, 58],\n      [14, 5],\n      [28, -28],\n      [22, -5],\n      [13, -77],\n      [52, 0],\n      [45, 20],\n      [26, -20],\n      [77, 28],\n      [48, 38],\n      [9, 51],\n      [56, 128],\n      [38, 135],\n      [0, 71],\n      [-12, 81],\n      [-23, 95],\n      [-17, 121],\n      [-1, 118],\n      [-5, 52],\n      [-71, 157],\n      [-9, 32],\n      [-41, 28],\n      [-27, 1],\n      [10, 97],\n      [27, 33],\n      [14, -25],\n      [35, -20],\n      [51, 7],\n      [-10, 45],\n      [31, 10],\n      [41, 81],\n      [2, 114],\n      [-42, 122],\n      [-47, 68],\n      [-25, 48],\n      [-1, -32],\n      [-27, -48],\n      [-20, -86],\n      [-42, -30],\n      [-42, 42],\n      [-59, -93],\n      [-81, -34],\n      [-18, -71],\n      [-85, -103],\n      [-21, -70],\n      [-5, -99],\n      [-44, -70],\n      [-4, 93],\n      [-15, 110],\n      [-23, 50],\n      [-28, -3],\n      [4, 34],\n      [-32, 46],\n      [-9, 36],\n      [-38, -60],\n      [16, -45],\n      [21, -7],\n      [16, -39],\n      [24, 11],\n      [2, -48],\n      [-22, -81],\n      [-19, -11],\n      [-22, 82],\n      [-55, 76],\n      [-41, 33],\n      [-64, 13],\n      [-41, -27],\n      [-27, 12],\n      [-52, 3],\n      [-45, -22],\n      [-108, -112],\n      [-58, -17],\n      [-111, 74],\n      [-94, 45],\n      [-47, 14],\n      [-88, 40],\n      [-49, 79],\n      [-20, 96],\n      [1, 74],\n      [20, 36],\n      [-6, 64],\n      [-28, 63],\n      [-45, 56],\n      [-1, 59],\n      [-46, 64],\n      [-10, 56],\n      [39, -33],\n      [33, 3],\n      [9, 27],\n      [24, 15],\n      [16, 32],\n      [-3, 55],\n      [35, 61],\n      [-38, 63],\n      [-19, 9],\n      [-29, -16],\n      [-39, 15],\n      [-64, 52],\n      [-104, 21],\n      [-49, 52],\n      [-38, 63],\n      [-55, 60],\n      [-46, 30],\n      [-15, 93]\n    ],\n    [\n      [2812, 78476],\n      [27, 27],\n      [-1, 59],\n      [18, 0],\n      [10, 36],\n      [0, 57],\n      [21, 33],\n      [5, 57],\n      [-10, 16],\n      [11, 87],\n      [46, 106],\n      [16, -26],\n      [27, 16],\n      [28, -3],\n      [-9, 65],\n      [-12, 5],\n      [9, 77],\n      [-6, 26],\n      [18, 76],\n      [40, 67],\n      [54, 37],\n      [29, -53],\n      [31, 1],\n      [2, -23],\n      [-21, -74],\n      [5, -60],\n      [-55, -95],\n      [-65, -72],\n      [-19, -66],\n      [-1, -36],\n      [-28, -81],\n      [-15, -58],\n      [-25, -10],\n      [-28, -71],\n      [-15, -17],\n      [-4, -51],\n      [-15, 21],\n      [-27, -49],\n      [-54, -69],\n      [13, 45]\n    ],\n    [\n      [2752, 78371],\n      [29, 49],\n      [-1, -45],\n      [-26, -25],\n      [-2, 21]\n    ],\n    [\n      [2615, 78610],\n      [4, 50],\n      [19, 16],\n      [4, -44],\n      [-9, -45],\n      [-12, -8],\n      [-6, 31]\n    ],\n    [\n      [2607, 82847],\n      [50, -13],\n      [29, 5],\n      [10, -14],\n      [-27, -68],\n      [-23, 4],\n      [-9, 46],\n      [-20, 10],\n      [-10, 30]\n    ],\n    [\n      [2611, 78728],\n      [8, -39],\n      [-15, 13],\n      [7, 26]\n    ],\n    [\n      [2547, 78457],\n      [17, 17],\n      [23, -3],\n      [-2, 19],\n      [27, 23],\n      [19, -10],\n      [10, -25],\n      [-17, -105],\n      [-30, 50],\n      [-25, -29],\n      [-19, 14],\n      [-3, 49]\n    ],\n    [\n      [2517, 78521],\n      [8, 26],\n      [23, -16],\n      [1, -31],\n      [-14, -31],\n      [-13, 16],\n      [-5, 36]\n    ],\n    [\n      [2497, 78313],\n      [4, 72],\n      [33, -18],\n      [-7, -57],\n      [-30, 3]\n    ],\n    [\n      [2431, 83489],\n      [9, 43],\n      [22, 15],\n      [12, -10],\n      [29, 22],\n      [-2, -56],\n      [-32, -62],\n      [-5, 31],\n      [-33, 17]\n    ],\n    [\n      [2316, 78170],\n      [5, 42],\n      [40, 72],\n      [31, -27],\n      [1, -27],\n      [-13, -58],\n      [-19, 2],\n      [-17, -26],\n      [-15, -48],\n      [-15, 21],\n      [2, 49]\n    ],\n    [\n      [2228, 78152],\n      [9, -32],\n      [-16, 2],\n      [7, 30]\n    ],\n    [\n      [2183, 78046],\n      [17, 42],\n      [16, -37],\n      [-12, -55],\n      [-19, -1],\n      [-2, 51]\n    ],\n    [\n      [2036, 90914],\n      [2, 37],\n      [25, 87],\n      [-3, 75],\n      [8, 18],\n      [-5, 57],\n      [21, 3],\n      [8, -42],\n      [-4, -48],\n      [12, -34],\n      [64, -57],\n      [77, -48],\n      [55, -20],\n      [58, 87],\n      [58, 58],\n      [58, -14],\n      [29, -69],\n      [23, -15],\n      [15, -104],\n      [-2, -38],\n      [53, -56],\n      [56, -14],\n      [22, -32],\n      [9, -35],\n      [36, -20],\n      [88, -20],\n      [14, 6],\n      [102, -55],\n      [-27, -131],\n      [-22, -43],\n      [-51, 35],\n      [-43, -1],\n      [-50, -29],\n      [-44, -89],\n      [-10, -61],\n      [1, -53],\n      [-20, -46],\n      [-30, 22],\n      [3, 24],\n      [-26, 119],\n      [-32, 62],\n      [-50, 60],\n      [-39, -5],\n      [-11, 69],\n      [-17, 55],\n      [-54, 80],\n      [-86, 69],\n      [-65, 11],\n      [-47, -44],\n      [-18, -58],\n      [-36, -34],\n      [-28, 33],\n      [-49, 36],\n      [-24, 83],\n      [-7, 56],\n      [3, 73]\n    ],\n    [\n      [1818, 77819],\n      [15, 59],\n      [33, 49],\n      [12, -2],\n      [27, -39],\n      [-1, -41],\n      [-28, -51],\n      [-32, -27],\n      [-22, -1],\n      [-4, 53]\n    ],\n    [\n      [1695, 87369],\n      [6, 69],\n      [25, 52],\n      [11, -3],\n      [-4, -58],\n      [12, -54],\n      [33, -70],\n      [48, -63],\n      [22, -14],\n      [25, 13],\n      [57, -94],\n      [-21, -19],\n      [-9, 37],\n      [-51, 8],\n      [-26, -17],\n      [-33, 46],\n      [-58, 136],\n      [-37, 31]\n    ],\n    [\n      [1687, 87598],\n      [8, -5],\n      [5, -84],\n      [-20, 42],\n      [7, 47]\n    ],\n    [\n      [1421, 77626],\n      [35, 0],\n      [33, -31],\n      [9, 30],\n      [14, -2],\n      [33, 27],\n      [25, -1],\n      [-6, -28],\n      [10, -29],\n      [8, 15],\n      [31, -24],\n      [23, 16],\n      [10, -11],\n      [32, 11],\n      [5, -12],\n      [41, -7],\n      [-25, -23],\n      [-16, 6],\n      [-14, -22],\n      [-44, -1],\n      [-22, -35],\n      [-8, 16],\n      [-16, -19],\n      [-19, 4],\n      [-18, 25],\n      [-52, 3],\n      [-9, -15],\n      [-29, 19],\n      [-10, 49],\n      [-11, -1],\n      [-10, 40]\n    ],\n    [\n      [1064, 77503],\n      [55, 37],\n      [11, -28],\n      [25, 50],\n      [3, -22],\n      [19, 38],\n      [5, 29],\n      [18, -29],\n      [27, 8],\n      [8, 34],\n      [6, -24],\n      [35, 37],\n      [1, 42],\n      [44, 10],\n      [-13, 41],\n      [43, -5],\n      [13, 34],\n      [-1, 36],\n      [-32, 7],\n      [-23, 29],\n      [5, 26],\n      [21, -16],\n      [12, 36],\n      [-2, 39],\n      [38, 46],\n      [33, -32],\n      [22, -76],\n      [1, -31],\n      [-21, -85],\n      [-34, 8],\n      [-4, -43],\n      [33, -79],\n      [-3, -24],\n      [-15, 21],\n      [-17, -10],\n      [-4, -27],\n      [-16, -4],\n      [-20, 23],\n      [-19, -95],\n      [-25, 31],\n      [-64, -55],\n      [-13, 29],\n      [-29, 12],\n      [-23, -6],\n      [-13, -35],\n      [-22, -8],\n      [-33, 6],\n      [-32, 25]\n    ],\n    [\n      [1013, 77451],\n      [17, 17],\n      [7, -29],\n      [-22, -4],\n      [-2, 16]\n    ],\n    [\n      [1005, 77685],\n      [16, -19],\n      [-11, -12],\n      [-5, 31]\n    ],\n    [\n      [949, 77433],\n      [5, 9],\n      [40, -3],\n      [1, -26],\n      [-19, 3],\n      [-22, -24],\n      [-5, 41]\n    ],\n    [\n      [890, 77452],\n      [11, 14],\n      [28, -1],\n      [15, -90],\n      [-16, 5],\n      [-17, 49],\n      [-21, 23]\n    ],\n    [\n      [821, 77563],\n      [14, 45],\n      [26, -9],\n      [23, -80],\n      [-20, -38],\n      [15, -56],\n      [-13, -34],\n      [-18, -2],\n      [-18, 22],\n      [3, 57],\n      [-7, 2],\n      [-8, 77],\n      [3, 16]\n    ],\n    [\n      [811, 77269],\n      [5, 56],\n      [12, 10],\n      [10, -27],\n      [19, 10],\n      [-12, 22],\n      [34, 30],\n      [10, -23],\n      [-2, -55],\n      [-23, 0],\n      [13, -52],\n      [-29, 29],\n      [2, -40],\n      [-12, 12],\n      [-5, -39],\n      [-7, 45],\n      [-15, 22]\n    ],\n    [\n      [601, 77040],\n      [11, 67],\n      [15, 16],\n      [7, 36],\n      [-13, 66],\n      [4, 27],\n      [32, 7],\n      [7, 59],\n      [-13, 69],\n      [10, 45],\n      [15, 4],\n      [18, -20],\n      [19, 59],\n      [9, -14],\n      [3, -74],\n      [-20, -29],\n      [-2, -50],\n      [13, -20],\n      [19, 4],\n      [31, 26],\n      [30, 5],\n      [7, -64],\n      [-7, -88],\n      [-15, -12],\n      [-36, 18],\n      [-13, -52],\n      [-18, -12],\n      [-13, -41],\n      [-23, 31],\n      [-6, -25],\n      [6, -48],\n      [-11, 17],\n      [-13, -26],\n      [-4, 55],\n      [-14, 29],\n      [-19, -108],\n      [-14, 11],\n      [-2, 32]\n    ],\n    [\n      [469, 77371],\n      [13, 9],\n      [2, -26],\n      [-14, -17],\n      [-1, 34]\n    ],\n    [\n      [402, 77131],\n      [18, 33],\n      [24, -17],\n      [26, 34],\n      [50, 39],\n      [21, 43],\n      [2, 128],\n      [12, 16],\n      [16, -10],\n      [15, -44],\n      [-26, -98],\n      [5, -86],\n      [-7, -38],\n      [-33, -31],\n      [-36, 61],\n      [-27, -33],\n      [-40, -10],\n      [-1, -43],\n      [-10, 5],\n      [-9, 51]\n    ],\n    [\n      [257, 77332],\n      [8, 29],\n      [29, 17],\n      [39, -5],\n      [11, -42],\n      [-2, -30],\n      [19, -32],\n      [15, 17],\n      [18, -17],\n      [33, 34],\n      [-10, -40],\n      [-41, -32],\n      [-12, -71],\n      [4, -31],\n      [-12, -31],\n      [-8, 16],\n      [-9, -44],\n      [8, -57],\n      [-8, -5],\n      [-9, 56],\n      [-14, -24],\n      [-16, 48],\n      [-13, 8],\n      [4, 28],\n      [41, 25],\n      [-3, 64],\n      [-20, 1],\n      [-13, 34],\n      [-39, 66],\n      [0, 18]\n    ],\n    [\n      [130, 77016],\n      [32, -12],\n      [-3, -18],\n      [-27, 7],\n      [-2, 23]\n    ],\n    [\n      [81, 76979],\n      [27, -17],\n      [7, -23],\n      [-25, 5],\n      [-9, 35]\n    ],\n    [\n      [77, 77233],\n      [14, 52],\n      [20, -35],\n      [0, -61],\n      [-19, -10],\n      [-15, 54]\n    ],\n    [\n      [43, 76751],\n      [8, 25],\n      [10, -22],\n      [5, -50],\n      [-12, -2],\n      [-10, -32],\n      [-1, 81]\n    ],\n    [\n      [3, 76640],\n      [12, 18],\n      [6, -59],\n      [-18, -25],\n      [0, 66]\n    ],\n    [\n      [99917, 77451],\n      [12, -2],\n      [12, 35],\n      [26, 14],\n      [31, -61],\n      [-9, -68],\n      [-24, -42],\n      [-12, -5],\n      [-25, 29],\n      [-11, 29],\n      [0, 71]\n    ],\n    [\n      [99678, 77049],\n      [5, 24],\n      [26, -29],\n      [19, 3],\n      [27, -24],\n      [4, -31],\n      [24, -42],\n      [27, -78],\n      [25, -26],\n      [11, -57],\n      [44, -11],\n      [21, -33],\n      [-18, -19],\n      [-9, 14],\n      [-29, -16],\n      [-15, 41],\n      [-41, 72],\n      [-30, 101],\n      [-30, 43],\n      [-17, -8],\n      [-22, 25],\n      [-22, 51]\n    ],\n    [\n      [99628, 77446],\n      [9, 11],\n      [20, -16],\n      [11, -33],\n      [-14, -49],\n      [-10, -4],\n      [-16, 91]\n    ],\n    [\n      [99570, 77271],\n      [19, -7],\n      [21, -67],\n      [-22, 15],\n      [-18, 59]\n    ],\n    [\n      [99530, 77510],\n      [7, 22],\n      [17, -22],\n      [3, -34],\n      [-17, -20],\n      [-10, 54]\n    ],\n    [\n      [99282, 77351],\n      [24, 27],\n      [15, 50],\n      [39, 26],\n      [6, 63],\n      [16, 96],\n      [11, 18],\n      [20, -52],\n      [-12, -32],\n      [-8, -57],\n      [-20, -53],\n      [21, -18],\n      [0, -35],\n      [-13, -10],\n      [-42, 17],\n      [-17, -31],\n      [-4, -70],\n      [-11, 2],\n      [-25, 40],\n      [0, 19]\n    ],\n    [\n      [98911, 77903],\n      [26, -13],\n      [-18, -27],\n      [-8, 40]\n    ],\n    [\n      [98408, 78327],\n      [22, -8],\n      [3, -26],\n      [-24, 15],\n      [-1, 19]\n    ],\n    [\n      [98376, 78346],\n      [14, -8],\n      [0, -29],\n      [-14, 37]\n    ],\n    [\n      [98352, 78374],\n      [20, -27],\n      [-12, -2],\n      [-8, 29]\n    ],\n    [\n      [98210, 77943],\n      [6, 31],\n      [19, 27],\n      [23, -6],\n      [26, 67],\n      [41, 5],\n      [-17, -40],\n      [-5, -37],\n      [10, -104],\n      [-21, 0],\n      [-17, 52],\n      [-35, -19],\n      [-30, 24]\n    ],\n    [\n      [97960, 78551],\n      [47, 86],\n      [33, 11],\n      [100, -20],\n      [29, -63],\n      [24, -15],\n      [35, -94],\n      [2, -18],\n      [-35, -8],\n      [-21, 38],\n      [-17, -71],\n      [-9, -13],\n      [-38, 15],\n      [-26, -41],\n      [-27, 32],\n      [-12, 40],\n      [-3, 63],\n      [-32, 56],\n      [-35, -24],\n      [-15, 26]\n    ],\n    [\n      [13347, 81071],\n      [9, 23],\n      [10, -28],\n      [-5, -52],\n      [-16, 34],\n      [2, 23]\n    ],\n    [\n      [13279, 80906],\n      [61, 56],\n      [7, -80],\n      [13, -14],\n      [-20, -68],\n      [-24, -1],\n      [-33, 63],\n      [-4, 44]\n    ],\n    [\n      [13241, 80901],\n      [26, 65],\n      [8, -25],\n      [-26, -58],\n      [-8, 18]\n    ],\n    [\n      [13234, 81005],\n      [16, 62],\n      [-2, 43],\n      [13, 20],\n      [-14, 43],\n      [-2, 70],\n      [5, 39],\n      [11, 9],\n      [19, -32],\n      [5, -35],\n      [13, -7],\n      [17, -40],\n      [0, -165],\n      [-9, -34],\n      [-27, -2],\n      [-13, 32],\n      [-23, -36],\n      [-9, 33]\n    ],\n    [\n      [13172, 81388],\n      [4, 66],\n      [6, 1],\n      [52, -135],\n      [-12, -28],\n      [-1, -68],\n      [-15, -111],\n      [-23, 74],\n      [-9, 113],\n      [-2, 88]\n    ],\n    [\n      [12999, 82714],\n      [4, 48],\n      [9, -30],\n      [-13, -18]\n    ],\n    [\n      [12979, 82569],\n      [2, 29],\n      [21, 40],\n      [21, -38],\n      [-1, -22],\n      [-24, -37],\n      [-19, 28]\n    ],\n    [\n      [12954, 82690],\n      [20, 33],\n      [17, 52],\n      [-5, -50],\n      [-18, -75],\n      [-14, 40]\n    ],\n    [\n      [12888, 80934],\n      [18, 6],\n      [-4, -53],\n      [-14, 47]\n    ],\n    [\n      [12850, 82395],\n      [7, 53],\n      [10, -24],\n      [22, -97],\n      [10, -68],\n      [-13, -15],\n      [-21, 61],\n      [-9, 4],\n      [-6, 86]\n    ],\n    [\n      [12838, 82543],\n      [18, 86],\n      [21, 30],\n      [30, -20],\n      [24, 22],\n      [28, -42],\n      [4, -36],\n      [-18, -53],\n      [6, -82],\n      [-16, -19],\n      [-44, -22],\n      [-23, 65],\n      [-24, 29],\n      [-6, 42]\n    ],\n    [\n      [12768, 81460],\n      [21, 27],\n      [-2, -46],\n      [-16, -11],\n      [-3, 30]\n    ],\n    [\n      [12700, 80811],\n      [9, 0],\n      [10, -128],\n      [-15, 29],\n      [-4, 99]\n    ],\n    [\n      [12674, 81692],\n      [9, 23],\n      [1, 61],\n      [20, -30],\n      [1, -32],\n      [-22, -72],\n      [-9, 50]\n    ],\n    [\n      [12659, 81749],\n      [12, 9],\n      [-1, -36],\n      [-11, 27]\n    ],\n    [\n      [12637, 81497],\n      [8, 92],\n      [8, 25],\n      [32, -9],\n      [10, -16],\n      [-2, -35],\n      [-16, -42],\n      [8, -16],\n      [20, 40],\n      [5, 43],\n      [13, -19],\n      [19, 68],\n      [19, -2],\n      [16, -39],\n      [-5, -60],\n      [-15, -35],\n      [-19, 15],\n      [-13, -35],\n      [17, -22],\n      [-2, -37],\n      [-22, -21],\n      [-22, -50],\n      [-9, -97],\n      [-23, 78],\n      [17, 61],\n      [-1, 78],\n      [-29, 51],\n      [-14, -16]\n    ],\n    [\n      [12629, 82086],\n      [11, 22],\n      [24, 102],\n      [28, 10],\n      [11, 20],\n      [-22, 13],\n      [-1, 47],\n      [15, -22],\n      [9, 34],\n      [-36, 62],\n      [14, 29],\n      [-10, 86],\n      [23, 49],\n      [45, -24],\n      [71, -17],\n      [24, -82],\n      [11, -73],\n      [-5, -69],\n      [14, -6],\n      [13, -68],\n      [17, -48],\n      [17, 5],\n      [57, -119],\n      [12, -52],\n      [33, -111],\n      [3, -126],\n      [29, -29],\n      [8, -82],\n      [8, -32],\n      [31, -50],\n      [13, -58],\n      [-10, -6],\n      [-19, 46],\n      [-75, 98],\n      [-3, -31],\n      [-23, -74],\n      [11, -8],\n      [14, 47],\n      [8, -19],\n      [23, 10],\n      [5, -37],\n      [20, -13],\n      [10, -29],\n      [-38, -14],\n      [8, -36],\n      [32, 21],\n      [14, -52],\n      [16, -14],\n      [11, -87],\n      [8, -9],\n      [-12, -49],\n      [-20, 9],\n      [2, -32],\n      [22, -22],\n      [11, 8],\n      [3, 46],\n      [14, 36],\n      [9, -21],\n      [5, -91],\n      [-15, -34],\n      [4, -36],\n      [-22, -94],\n      [-29, -40],\n      [18, -23],\n      [27, 59],\n      [15, -10],\n      [0, -203],\n      [7, -72],\n      [-20, -105],\n      [-37, -9],\n      [-26, 48],\n      [-14, -19],\n      [-17, 38],\n      [-1, 37],\n      [-38, -2],\n      [17, 53],\n      [27, -10],\n      [1, 39],\n      [-19, 42],\n      [-19, 13],\n      [-35, 78],\n      [9, 38],\n      [10, 115],\n      [-15, 9],\n      [-11, -58],\n      [7, 101],\n      [8, 28],\n      [-11, 39],\n      [-5, -55],\n      [-27, -21],\n      [14, -103],\n      [-18, -58],\n      [-47, 56],\n      [-4, 35],\n      [17, 58],\n      [-18, 100],\n      [-20, -5],\n      [-10, 50],\n      [-21, 3],\n      [12, -78],\n      [18, -65],\n      [6, -72],\n      [-7, -36],\n      [15, -17],\n      [20, -145],\n      [24, -26],\n      [-4, 58],\n      [24, 18],\n      [28, -65],\n      [4, -124],\n      [-14, -16],\n      [-18, 74],\n      [-7, -7],\n      [23, -170],\n      [-29, 0],\n      [-26, 32],\n      [-2, 60],\n      [-20, 40],\n      [-49, 177],\n      [-10, 22],\n      [-2, 84],\n      [-12, 10],\n      [-8, 61],\n      [29, 8],\n      [-27, 33],\n      [3, 119],\n      [-33, -28],\n      [-10, 26],\n      [-18, -19],\n      [-9, 42],\n      [6, 84],\n      [33, 30],\n      [11, -63],\n      [17, 20],\n      [-13, 29],\n      [6, 39],\n      [14, 20],\n      [14, -14],\n      [22, 44],\n      [-29, 96],\n      [14, 12],\n      [-16, 32],\n      [4, 66],\n      [-24, -21],\n      [-49, 87],\n      [-4, 28],\n      [16, -1],\n      [-9, 50],\n      [3, 35],\n      [-27, 18],\n      [6, -57],\n      [-10, -13],\n      [-32, 39],\n      [-16, 58],\n      [12, 52],\n      [28, 14],\n      [37, -54],\n      [28, 35],\n      [-17, 67],\n      [-18, 16],\n      [-12, -20],\n      [-9, 17],\n      [8, 30],\n      [-2, 42],\n      [7, 63],\n      [-5, 16],\n      [-13, -47],\n      [-27, -65],\n      [-22, -33],\n      [-23, 38],\n      [-5, 45]\n    ],\n    [\n      [12611, 83642],\n      [15, 25],\n      [14, -33],\n      [-27, -31],\n      [-2, 39]\n    ],\n    [\n      [12594, 82026],\n      [14, 28],\n      [11, -6],\n      [4, -52],\n      [-8, -48],\n      [-10, 3],\n      [-11, 75]\n    ],\n    [\n      [12476, 82024],\n      [28, 22],\n      [1, -43],\n      [31, 33],\n      [8, 75],\n      [7, -2],\n      [-9, -101],\n      [-22, -24],\n      [-20, -56],\n      [-18, 17],\n      [8, 30],\n      [-14, 49]\n    ],\n    [\n      [12463, 83115],\n      [17, 52],\n      [16, 17],\n      [7, 33],\n      [33, -1],\n      [1, 26],\n      [28, -40],\n      [11, -83],\n      [18, -54],\n      [31, -2],\n      [9, -21],\n      [10, 26],\n      [-29, 44],\n      [-13, 80],\n      [-2, 55],\n      [-35, 79],\n      [11, 53],\n      [34, 26],\n      [51, -37],\n      [25, -9],\n      [47, -44],\n      [31, -20],\n      [7, 14],\n      [57, -11],\n      [30, -74],\n      [14, -82],\n      [3, -56],\n      [9, -23],\n      [23, -11],\n      [16, -48],\n      [5, -46],\n      [33, -52],\n      [9, -64],\n      [15, -34],\n      [-31, -38],\n      [-20, -42],\n      [-26, -24],\n      [-16, 16],\n      [-31, 4],\n      [-43, 24],\n      [5, -48],\n      [-23, -51],\n      [-40, 25],\n      [-19, 29],\n      [-12, -47],\n      [-15, -20],\n      [-25, -2],\n      [-17, 15],\n      [-3, 87],\n      [-11, 32],\n      [-30, -64],\n      [13, -29],\n      [-2, -90],\n      [-23, -3],\n      [-2, -31],\n      [10, -51],\n      [-11, -51],\n      [-2, -62],\n      [-17, -50],\n      [4, -39],\n      [-9, -64],\n      [-10, -11],\n      [-25, 15],\n      [-14, -103],\n      [-15, 19],\n      [-12, 52],\n      [-7, 63],\n      [-1, 109],\n      [-10, 87],\n      [2, 75],\n      [14, 48],\n      [-3, 57],\n      [15, 101],\n      [-12, 28],\n      [-22, -1],\n      [5, 77],\n      [-20, 56],\n      [-8, 75],\n      [2, 43],\n      [-5, 91]\n    ],\n    [\n      [12311, 84926],\n      [43, -96],\n      [7, -47],\n      [14, -9],\n      [8, -130],\n      [19, 1],\n      [21, 38],\n      [11, -23],\n      [20, -2],\n      [21, -29],\n      [54, 13],\n      [-3, -89],\n      [25, -75],\n      [2, -52],\n      [21, -52],\n      [14, -87],\n      [17, -55],\n      [2, -142],\n      [21, -60],\n      [4, -65],\n      [-9, -2],\n      [-5, 47],\n      [-38, 120],\n      [-10, 115],\n      [-19, 37],\n      [-9, 53],\n      [-21, 0],\n      [26, -101],\n      [4, -34],\n      [-13, -23],\n      [35, -121],\n      [23, -49],\n      [-2, -62],\n      [24, -113],\n      [-19, 6],\n      [15, -102],\n      [0, -27],\n      [-25, -62],\n      [-20, 26],\n      [-17, -1],\n      [4, -34],\n      [-21, -104],\n      [-38, -83],\n      [-24, -25],\n      [-2, -33],\n      [-31, -65],\n      [-29, 3],\n      [-9, 89],\n      [-4, 135],\n      [21, 80],\n      [15, 23],\n      [-16, 31],\n      [-1, 69],\n      [14, 6],\n      [12, -39],\n      [6, 23],\n      [-40, 141],\n      [-1, 58],\n      [-18, 60],\n      [-5, 82],\n      [-11, 43],\n      [8, 125],\n      [-12, 81],\n      [-3, 95],\n      [-11, 91],\n      [4, 44],\n      [-20, 93],\n      [-17, 45],\n      [-9, 77],\n      [-6, 101],\n      [3, 42]\n    ],\n    [\n      [12292, 85061],\n      [35, -45],\n      [27, -125],\n      [-10, -5],\n      [-22, 115],\n      [-23, 19],\n      [-7, 41]\n    ],\n    [\n      [12202, 85643],\n      [15, -71],\n      [0, -46],\n      [-10, 29],\n      [-5, 88]\n    ],\n    [\n      [12106, 83714],\n      [16, 11],\n      [1, 26],\n      [28, 65],\n      [-4, 68],\n      [36, 64],\n      [18, -12],\n      [25, -85],\n      [15, 10],\n      [18, -58],\n      [23, -24],\n      [38, 4],\n      [22, -14],\n      [12, -79],\n      [-2, -49],\n      [-20, 35],\n      [-19, -2],\n      [-1, -22],\n      [21, -25],\n      [11, -46],\n      [29, -278],\n      [-1, -71],\n      [12, -56],\n      [0, -58],\n      [18, -142],\n      [5, -107],\n      [-5, -112],\n      [-11, 1],\n      [8, -81],\n      [3, -240],\n      [-9, -111],\n      [-11, 6],\n      [-28, 70],\n      [-10, 86],\n      [-21, 59],\n      [-40, 212],\n      [4, 48],\n      [22, 23],\n      [-18, 30],\n      [-26, -31],\n      [-14, 88],\n      [-11, -15],\n      [-17, 42],\n      [-12, 55],\n      [2, 34],\n      [-14, -22],\n      [-10, 24],\n      [-30, 2],\n      [-19, 96],\n      [19, 3],\n      [10, -29],\n      [10, 13],\n      [-3, 105],\n      [19, 53],\n      [6, 38],\n      [-39, 86],\n      [24, 63],\n      [-4, 22],\n      [14, 35],\n      [4, 53],\n      [-33, 16],\n      [-21, -28],\n      [-14, 79],\n      [-26, 72]\n    ],\n    [\n      [12097, 84881],\n      [16, 18],\n      [19, -7],\n      [16, -52],\n      [-29, -6],\n      [-22, 47]\n    ],\n    [\n      [12062, 83572],\n      [4, 48],\n      [-3, 66],\n      [25, 9],\n      [34, -62],\n      [15, -74],\n      [12, -19],\n      [17, 30],\n      [23, -10],\n      [-16, -82],\n      [-24, -14],\n      [-27, -161],\n      [-12, 6],\n      [-40, -30],\n      [-9, 8],\n      [3, 102],\n      [25, 47],\n      [1, 50],\n      [-22, 4],\n      [2, 29],\n      [-13, 31],\n      [5, 22]\n    ],\n    [\n      [11978, 85151],\n      [9, 14],\n      [7, -59],\n      [-16, 45]\n    ],\n    [\n      [11978, 84786],\n      [30, 41],\n      [3, -53],\n      [-16, -19],\n      [-17, 31]\n    ],\n    [\n      [11861, 84371],\n      [5, 174],\n      [16, 33],\n      [8, -9],\n      [29, 60],\n      [3, 51],\n      [-12, 92],\n      [32, -2],\n      [0, -54],\n      [12, -60],\n      [28, 61],\n      [29, -6],\n      [17, -20],\n      [17, 49],\n      [36, 50],\n      [14, -55],\n      [41, -30],\n      [25, -53],\n      [-12, -78],\n      [-31, -76],\n      [4, -49],\n      [12, -5],\n      [8, 60],\n      [32, 108],\n      [15, 12],\n      [34, -55],\n      [46, -10],\n      [11, -32],\n      [29, -16],\n      [15, -79],\n      [-4, -67],\n      [-22, -44],\n      [-37, 49],\n      [-10, -8],\n      [12, -40],\n      [18, -18],\n      [33, -75],\n      [-21, -29],\n      [-25, -2],\n      [4, -28],\n      [21, -13],\n      [23, 24],\n      [7, -95],\n      [14, -69],\n      [12, -143],\n      [-14, -42],\n      [-42, -11],\n      [-17, 12],\n      [-44, 95],\n      [-65, 99],\n      [-27, 50],\n      [-22, -26],\n      [-9, 29],\n      [-4, -32],\n      [30, -55],\n      [22, -8],\n      [-21, -31],\n      [6, -25],\n      [0, -72],\n      [-9, -50],\n      [-31, -87],\n      [-51, 47],\n      [-1, 38],\n      [-42, 85],\n      [-20, 90],\n      [-12, -38],\n      [-19, 43],\n      [-10, 79],\n      [4, 25],\n      [-18, 86],\n      [2, 24],\n      [-16, 57],\n      [-26, 30],\n      [-7, 49],\n      [-25, 36]\n    ],\n    [\n      [9331, 87212],\n      [28, -14],\n      [12, -44],\n      [-27, -9],\n      [-13, 67]\n    ],\n    [\n      [9232, 87245],\n      [16, 14],\n      [58, -26],\n      [-3, -31],\n      [-21, -10],\n      [-50, 53]\n    ],\n    [\n      [8867, 87809],\n      [26, 35],\n      [27, 3],\n      [15, -16],\n      [-18, -53],\n      [-50, 31]\n    ],\n    [\n      [8817, 87545],\n      [4, 86],\n      [28, 16],\n      [21, -89],\n      [-11, -44],\n      [-37, -10],\n      [-5, 41]\n    ],\n    [\n      [8816, 87079],\n      [2, 14],\n      [43, 47],\n      [1, -36],\n      [-40, -59],\n      [-6, 34]\n    ],\n    [\n      [8698, 86532],\n      [8, 21],\n      [3, 71],\n      [23, 12],\n      [-3, 42],\n      [21, 54],\n      [16, 7],\n      [-3, 41],\n      [30, 34],\n      [9, 30],\n      [43, 75],\n      [22, 118],\n      [27, 44],\n      [-3, 40],\n      [10, 71],\n      [27, 34],\n      [4, -43],\n      [24, 2],\n      [-17, -51],\n      [9, -17],\n      [24, 28],\n      [8, -22],\n      [-11, -37],\n      [-62, -118],\n      [-49, -129],\n      [-8, -80],\n      [-33, -60],\n      [30, -57],\n      [-19, -42],\n      [-23, -8],\n      [-22, 15],\n      [-17, -57],\n      [-9, 6],\n      [-45, -47],\n      [-14, 23]\n    ],\n    [\n      [8692, 87068],\n      [44, 270],\n      [11, -41],\n      [12, 13],\n      [-4, 66],\n      [44, 84],\n      [0, -54],\n      [-12, -32],\n      [-3, -82],\n      [-20, -37],\n      [20, -42],\n      [-24, -97],\n      [2, -46],\n      [-17, -104],\n      [-24, 45],\n      [-3, 25],\n      [-25, 7],\n      [-1, 25]\n    ],\n    [\n      [8672, 87628],\n      [15, 31],\n      [17, -19],\n      [17, -48],\n      [-24, -45],\n      [-25, 81]\n    ],\n    [\n      [17950, 55027],\n      [5, 31],\n      [24, -13],\n      [25, 26],\n      [-2, 40],\n      [18, 63],\n      [1, 79],\n      [-15, 136],\n      [-16, 8],\n      [-7, -13],\n      [-13, 25],\n      [-3, -17],\n      [-14, 68],\n      [7, 67],\n      [2, 142],\n      [-15, 41],\n      [9, 65],\n      [-8, 51],\n      [19, 9],\n      [28, 138],\n      [9, 24],\n      [-4, 46],\n      [4, 110],\n      [8, 12],\n      [-2, 74],\n      [-7, 64],\n      [1, 51],\n      [6, 6],\n      [-2, 55],\n      [-7, 20],\n      [28, 116],\n      [0, 69],\n      [8, 28],\n      [23, 29],\n      [10, 40],\n      [17, 21],\n      [1, 19],\n      [25, 65],\n      [-1, 49],\n      [-11, 54],\n      [-14, 19],\n      [-31, 100],\n      [-13, 7],\n      [2, 58],\n      [-26, 239],\n      [-23, 63],\n      [-7, 69],\n      [-16, 57],\n      [1, 147]\n    ],\n    [\n      [17974, 57684],\n      [6, 95],\n      [-10, 22],\n      [21, 43],\n      [0, 72],\n      [-9, 178],\n      [-6, 65],\n      [-11, 47],\n      [-4, 58],\n      [6, 36],\n      [0, 103],\n      [-9, 38],\n      [3, 39],\n      [-7, 31],\n      [3, 51],\n      [-5, 59],\n      [4, 56],\n      [9, 24],\n      [-10, 31],\n      [-12, 97],\n      [4, 43],\n      [-7, 80],\n      [25, 31],\n      [9, 29],\n      [5, -14],\n      [12, 25],\n      [17, -1],\n      [2, -25],\n      [24, 19],\n      [13, -3],\n      [18, -71],\n      [-2, -28],\n      [21, -51],\n      [24, 11],\n      [24, 183],\n      [5, 15],\n      [1, 230],\n      [-2, 272],\n      [0, 437]\n    ],\n    [\n      [18136, 60011],\n      [200, 0],\n      [222, 0],\n      [313, 1],\n      [97, 1],\n      [160, 2],\n      [6, -7],\n      [235, 0],\n      [162, 1]\n    ],\n    [\n      [19531, 60009],\n      [0, -1691],\n      [-1, -237],\n      [1, -30],\n      [0, -925],\n      [-1, -608],\n      [1, -145],\n      [-1, -113],\n      [0, -2847]\n    ],\n    [\n      [19530, 53413],\n      [-64, 2],\n      [-201, -1],\n      [-128, -1],\n      [-172, 0],\n      [-359, 476],\n      [-212, 269],\n      [-102, 136],\n      [-368, 471],\n      [5, 66],\n      [-5, 17],\n      [1, 60],\n      [8, 16],\n      [17, 103]\n    ],\n    [\n      [19530, 64667],\n      [242, 0],\n      [154, 2],\n      [327, 0],\n      [66, -5],\n      [137, -1],\n      [242, 1],\n      [7, 2],\n      [217, 2]\n    ],\n    [\n      [20922, 64668],\n      [282, 1],\n      [135, 0],\n      [140, 0],\n      [0, -1163]\n    ],\n    [\n      [21479, 63506],\n      [1, -381],\n      [0, -434],\n      [1, -193],\n      [0, -1270],\n      [1, -137],\n      [0, -1089]\n    ],\n    [\n      [21482, 60002],\n      [-183, 3],\n      [-22, 5],\n      [-62, 1]\n    ],\n    [\n      [21215, 60011],\n      [-204, -3],\n      [-169, -5],\n      [-184, 0],\n      [-34, 2],\n      [-301, -1],\n      [-186, -2],\n      [-2, 9],\n      [-152, -1],\n      [-230, -1],\n      [-222, 0]\n    ],\n    [\n      [19531, 60009],\n      [0, 583],\n      [1, 36],\n      [0, 738],\n      [-5, 129],\n      [0, 517],\n      [2, 216],\n      [0, 1857],\n      [1, 46],\n      [0, 536]\n    ],\n    [\n      [27414, 45876],\n      [14, 60],\n      [5, -33],\n      [-14, -44],\n      [-5, 17]\n    ],\n    [\n      [27386, 45813],\n      [9, 39],\n      [11, 4],\n      [-5, -33],\n      [-15, -10]\n    ],\n    [\n      [27310, 45701],\n      [52, 90],\n      [6, -30],\n      [-45, -80],\n      [-13, 20]\n    ],\n    [\n      [27118, 45540],\n      [19, 106],\n      [20, 46],\n      [25, 43],\n      [3, 23],\n      [36, 66],\n      [38, -67],\n      [4, -52],\n      [14, -43],\n      [-4, -11],\n      [-40, -48],\n      [-3, 27],\n      [-27, -5],\n      [-3, -24],\n      [-46, -73],\n      [-36, -15],\n      [0, 27]\n    ],\n    [\n      [27062, 45510],\n      [39, 24],\n      [-10, -43],\n      [-17, -14],\n      [-13, 8],\n      [1, 25]\n    ],\n    [\n      [27020, 45533],\n      [6, 35],\n      [12, -10],\n      [-5, -41],\n      [-13, 16]\n    ],\n    [\n      [26992, 48019],\n      [5, -18],\n      [19, -211],\n      [8, -28],\n      [17, -26],\n      [7, 17],\n      [14, -21],\n      [-14, -31],\n      [-9, -1],\n      [-21, 50],\n      [-7, 28],\n      [-13, 115],\n      [-6, 76],\n      [0, 50]\n    ],\n    [\n      [26806, 45614],\n      [15, 13],\n      [4, -23],\n      [-20, -10],\n      [1, 20]\n    ],\n    [\n      [26322, 51623],\n      [29, 47],\n      [0, -29],\n      [-16, -37],\n      [-11, -6],\n      [-2, 25]\n    ],\n    [\n      [26229, 53027],\n      [6, -79],\n      [11, -52],\n      [2, -83],\n      [6, -75],\n      [14, -48],\n      [136, -25],\n      [261, -56],\n      [206, -51],\n      [135, -34],\n      [-5, -14],\n      [2, -57],\n      [7, -26],\n      [-3, -71],\n      [11, -76],\n      [37, 13],\n      [0, 75],\n      [6, 47],\n      [3, 119],\n      [-12, 91],\n      [4, 60],\n      [-1, 49],\n      [8, 16],\n      [-4, 24],\n      [12, -8],\n      [9, 59],\n      [15, -7],\n      [7, -33],\n      [17, -3],\n      [18, -28],\n      [7, -25],\n      [33, -19],\n      [17, -18],\n      [14, 15],\n      [13, -19]\n    ],\n    [\n      [27221, 52688],\n      [4, -13],\n      [-4, -113],\n      [3, -92],\n      [-4, -22],\n      [10, -25],\n      [4, -95],\n      [1, -113],\n      [23, -389],\n      [13, -129],\n      [0, -51],\n      [28, -302],\n      [32, -288],\n      [29, -229],\n      [65, -412],\n      [38, -200],\n      [4, -63],\n      [10, -83],\n      [-18, -57],\n      [-4, -54],\n      [-1, -87],\n      [5, -130],\n      [6, -96],\n      [16, -145],\n      [35, -269],\n      [15, -166],\n      [5, -84],\n      [5, -29],\n      [11, -140],\n      [17, -152],\n      [9, -66],\n      [6, -94],\n      [13, -109],\n      [17, -258],\n      [-1, -235],\n      [-7, -175],\n      [-5, -210],\n      [-3, -37],\n      [-8, -286],\n      [0, -169],\n      [-3, -80],\n      [-7, -81],\n      [0, -44],\n      [-6, 23],\n      [3, 51],\n      [-5, 20],\n      [-16, -25],\n      [-10, -102],\n      [-6, -17],\n      [-1, -64],\n      [-8, -40],\n      [-2, -78],\n      [5, -33],\n      [-2, -46],\n      [6, -16],\n      [-8, -53],\n      [-8, -13],\n      [-1, -49],\n      [21, 39],\n      [25, 194],\n      [7, 41],\n      [0, -41],\n      [-8, -83],\n      [-34, -222],\n      [-9, -82],\n      [-25, -93],\n      [-34, -139],\n      [-24, -66],\n      [-3, 12],\n      [34, 122],\n      [14, 40],\n      [7, 53],\n      [3, 81],\n      [5, 32],\n      [-6, 23],\n      [-9, -11],\n      [-7, 26],\n      [-6, -18],\n      [-34, -22],\n      [-14, -41],\n      [-9, -6],\n      [-18, 45],\n      [-18, -13],\n      [-7, -41],\n      [-27, -18],\n      [-23, -6],\n      [-17, 52],\n      [-8, 68],\n      [2, 79],\n      [6, 60],\n      [6, -3],\n      [-2, 49],\n      [-12, 97],\n      [-11, 47],\n      [2, 34],\n      [-8, 62],\n      [-11, 32],\n      [-5, 85],\n      [-6, 18],\n      [-11, -15],\n      [-9, 101],\n      [-24, 31],\n      [-1, 16],\n      [-21, 38],\n      [-21, 55],\n      [-11, -13],\n      [-8, -39],\n      [-16, 126],\n      [-15, 148],\n      [-5, 173],\n      [-7, 109],\n      [-7, 57],\n      [-28, 113],\n      [-11, 9],\n      [-1, 52],\n      [-12, 23],\n      [0, -64],\n      [-14, -11],\n      [-1, 66],\n      [-8, 113],\n      [-12, 51],\n      [3, 24],\n      [13, -3],\n      [9, -39],\n      [11, 159],\n      [-2, 86],\n      [-8, 14],\n      [0, 40],\n      [8, 10],\n      [-4, 31],\n      [-12, -4],\n      [-5, -33],\n      [-11, -11],\n      [8, -148],\n      [-9, -20],\n      [-20, -11],\n      [-5, -50],\n      [0, 75],\n      [-6, 50],\n      [-17, 94],\n      [-26, 177],\n      [-9, 94],\n      [-19, 140],\n      [-27, 149],\n      [-14, 56],\n      [-4, 58],\n      [-10, 61],\n      [10, -19],\n      [1, -30],\n      [15, 30],\n      [10, 72],\n      [12, 28],\n      [13, 98],\n      [13, 34],\n      [-2, 23],\n      [14, 26],\n      [11, 84],\n      [-5, 75],\n      [-22, 21],\n      [5, -113],\n      [-22, 30],\n      [6, 34],\n      [-1, 65],\n      [-5, 39],\n      [-38, 71],\n      [1, -65],\n      [-11, -28],\n      [11, -37],\n      [16, -6],\n      [11, -110],\n      [-10, -42],\n      [0, -62],\n      [-4, -27],\n      [-21, -6],\n      [-3, -32],\n      [7, -38],\n      [-9, -30],\n      [-4, 40],\n      [2, 83],\n      [-14, 85],\n      [-9, 26],\n      [-8, 58],\n      [6, 182],\n      [-5, 66],\n      [-4, 164],\n      [9, 1],\n      [0, -93],\n      [4, -89],\n      [9, -7],\n      [-4, 153],\n      [9, 37],\n      [1, 41],\n      [8, 44],\n      [0, 38],\n      [7, 50],\n      [0, 39],\n      [9, 47],\n      [1, 91],\n      [5, 83],\n      [-6, 66],\n      [2, 56],\n      [-13, 29],\n      [4, 42],\n      [-9, 109],\n      [12, 64],\n      [-21, 110],\n      [3, 31],\n      [-8, 55],\n      [-10, 3],\n      [5, 33],\n      [-1, 49],\n      [-7, 13],\n      [-47, 23],\n      [-9, -51],\n      [-7, -4],\n      [-9, 100],\n      [3, 45],\n      [-14, 32],\n      [-12, 9],\n      [-2, 63],\n      [-7, 58],\n      [-11, 45],\n      [-15, 6],\n      [-5, 44],\n      [-24, 48],\n      [0, 111],\n      [-4, 67],\n      [-12, 7],\n      [-10, 38],\n      [-13, 17],\n      [-13, 61],\n      [0, 42],\n      [-9, 35],\n      [-5, 51],\n      [-14, 44],\n      [-28, 62],\n      [-40, 72],\n      [-26, 75],\n      [-11, -2],\n      [-26, -33],\n      [-31, 29],\n      [-1, -35],\n      [-26, -69],\n      [9, -99],\n      [-3, -28],\n      [-10, -7],\n      [-15, 15],\n      [-5, 26],\n      [-24, -22],\n      [-31, -73],\n      [-65, -132],\n      [-6, 2],\n      [7, 44],\n      [-10, 12],\n      [-7, -39],\n      [-15, -41],\n      [-36, 1],\n      [13, -49],\n      [2, -38],\n      [16, -22],\n      [30, 53],\n      [29, 40],\n      [27, 84],\n      [3, -13],\n      [-24, -82],\n      [-28, -43],\n      [-35, -66],\n      [-12, -14],\n      [-10, 33],\n      [-16, 22],\n      [-23, 51],\n      [-19, 7],\n      [-17, -28],\n      [-13, 94],\n      [-5, 119],\n      [8, 42],\n      [0, -105],\n      [6, -91],\n      [7, -22],\n      [10, 39],\n      [1, 97],\n      [-17, 105],\n      [-18, 60],\n      [-17, 13],\n      [-15, 40],\n      [-16, 71],\n      [-27, 47],\n      [-22, 69],\n      [-41, 95],\n      [-47, 76],\n      [-58, 70],\n      [-31, 20],\n      [-62, 18],\n      [-33, -5],\n      [-47, -25],\n      [-65, -49],\n      [-32, -15],\n      [-7, 10],\n      [-63, -51]\n    ],\n    [\n      [26061, 57664],\n      [39, -2],\n      [136, 6],\n      [183, 1]\n    ],\n    [\n      [26419, 57669],\n      [196, -2],\n      [-1, 6],\n      [143, 10]\n    ],\n    [\n      [26757, 57683],\n      [-3, -72],\n      [-31, -68],\n      [-26, -105],\n      [1, -36],\n      [-8, -26],\n      [3, -64],\n      [30, -82],\n      [17, -7],\n      [23, -104],\n      [23, -51],\n      [28, 16],\n      [8, -12],\n      [8, -64],\n      [3, -64],\n      [12, -30],\n      [3, -50],\n      [11, -52],\n      [0, -51],\n      [7, -68],\n      [12, -24],\n      [8, -67],\n      [14, -48],\n      [11, -101],\n      [9, -1],\n      [19, -72],\n      [29, -52],\n      [29, -98],\n      [4, -61],\n      [9, -41],\n      [1, -40],\n      [13, -38],\n      [12, -2],\n      [17, -37],\n      [18, -93],\n      [15, -26],\n      [4, -24],\n      [-7, -43],\n      [4, -39],\n      [-4, -32],\n      [28, -82],\n      [-4, -30],\n      [13, -42],\n      [11, 5],\n      [-2, -41],\n      [8, -45],\n      [27, -55],\n      [9, 1],\n      [16, -58],\n      [19, -43],\n      [-5, -67],\n      [12, -64],\n      [2, -49],\n      [9, -15],\n      [0, -85],\n      [4, -32],\n      [-5, -45],\n      [6, -8],\n      [4, -48],\n      [-5, -41],\n      [12, -48],\n      [25, -26],\n      [0, -23],\n      [23, -81],\n      [-4, -34],\n      [15, -105],\n      [4, 4],\n      [6, -76],\n      [-10, -44],\n      [11, -67],\n      [-4, -26],\n      [5, -62],\n      [21, -34],\n      [11, 17],\n      [22, -71],\n      [9, -4]\n    ],\n    [\n      [27376, 54230],\n      [12, -12],\n      [-5, -64],\n      [-14, -29],\n      [-10, 15],\n      [-6, -48],\n      [10, -8],\n      [-16, -60],\n      [-21, 23],\n      [-3, -56],\n      [11, -11],\n      [-9, -59],\n      [-17, -54],\n      [-17, 13],\n      [-3, -16],\n      [12, -33],\n      [8, 5],\n      [-1, -84],\n      [-7, -62],\n      [-28, -26],\n      [0, -22],\n      [17, 10],\n      [6, -24],\n      [-23, -131],\n      [-6, -91],\n      [7, -13],\n      [-5, -30],\n      [-5, -97],\n      [-13, -22],\n      [-8, -59],\n      [-9, -3],\n      [0, -71],\n      [-7, -69],\n      [-7, 2],\n      [-12, -44],\n      [13, -24],\n      [11, 24],\n      [1, -81],\n      [-16, -161],\n      [5, -70]\n    ],\n    [\n      [25527, 65491],\n      [15, -41],\n      [12, 20],\n      [7, -15],\n      [-6, -40],\n      [27, -23],\n      [29, 1],\n      [28, 25],\n      [52, 75],\n      [31, 59]\n    ],\n    [\n      [25722, 65552],\n      [90, -1],\n      [198, -1],\n      [187, 1],\n      [87, 1],\n      [0, -75]\n    ],\n    [\n      [26284, 65477],\n      [1, -242],\n      [0, -1380],\n      [-3, -437],\n      [0, -441],\n      [-2, -278],\n      [0, -238]\n    ],\n    [\n      [26280, 62461],\n      [-19, -45],\n      [-2, -20],\n      [16, -71],\n      [2, -31],\n      [-11, -38],\n      [3, -37],\n      [17, -7],\n      [4, -25],\n      [-13, -46],\n      [6, -44],\n      [-22, 3],\n      [-16, -23],\n      [-9, 5],\n      [-35, -63],\n      [-14, -39],\n      [-19, 10],\n      [-10, 43],\n      [-26, -7],\n      [-16, 7],\n      [-12, -33],\n      [4, -125],\n      [6, -71],\n      [-16, -40],\n      [-7, -44],\n      [-30, -34],\n      [-19, -161],\n      [-19, -39],\n      [-14, 24],\n      [-10, -13],\n      [-6, -63],\n      [-16, -72],\n      [1, -87],\n      [-5, -70],\n      [-8, -24],\n      [-23, -18],\n      [-4, -36],\n      [-13, 58],\n      [-22, 1],\n      [-26, 55],\n      [-1, 94],\n      [-21, 67],\n      [-8, -2],\n      [1, -34],\n      [13, -12],\n      [-1, -25],\n      [-13, -2],\n      [-8, -29],\n      [-8, 23],\n      [-9, -29],\n      [9, -17],\n      [-6, -42],\n      [-18, -9],\n      [-2, -94],\n      [5, -38],\n      [-23, -9],\n      [-2, -63],\n      [-11, -29],\n      [-7, 24],\n      [5, 51],\n      [-10, 10],\n      [-10, -25],\n      [-10, 22],\n      [-12, 89],\n      [-17, -2],\n      [-14, -52],\n      [-29, -27],\n      [-10, -30],\n      [-5, -97],\n      [-7, -27],\n      [-11, -3],\n      [-8, 62],\n      [-18, 13],\n      [-22, 57],\n      [-22, 44],\n      [-20, 6],\n      [-14, -37],\n      [-14, 19],\n      [-6, 49],\n      [-8, 6],\n      [-7, -66],\n      [11, -64],\n      [-13, -40],\n      [-11, 3],\n      [3, 56],\n      [-5, 30],\n      [-42, -31],\n      [-11, 52],\n      [-9, 4],\n      [-10, -40],\n      [10, -91],\n      [-12, -47],\n      [-23, 32]\n    ],\n    [\n      [25386, 60941],\n      [-11, 2],\n      [-4, 34],\n      [12, -9],\n      [-16, 92],\n      [24, -8],\n      [-15, 29],\n      [15, 67],\n      [1, 60],\n      [-8, 26],\n      [19, 19],\n      [2, 38],\n      [-12, -19],\n      [22, 73],\n      [-14, 60],\n      [-4, 59],\n      [9, -10],\n      [9, 68],\n      [5, -35],\n      [7, 41],\n      [8, -33],\n      [13, 102],\n      [8, 9],\n      [13, 84],\n      [-2, 38],\n      [24, 42],\n      [0, 66],\n      [9, 83],\n      [7, 32],\n      [14, 12],\n      [14, 76],\n      [-1, 42],\n      [-15, 94],\n      [11, 111],\n      [-18, 40],\n      [1, 79],\n      [-16, 55],\n      [-3, 73],\n      [19, 60],\n      [-9, 50],\n      [2, 60],\n      [6, 32],\n      [13, 9],\n      [0, 347],\n      [-1, 0],\n      [0, 397],\n      [1, 12],\n      [0, 294],\n      [1, 247],\n      [0, 1196],\n      [1, 254]\n    ],\n    [\n      [21479, 63506],\n      [257, -1],\n      [104, 0],\n      [263, -1],\n      [273, 1],\n      [163, 0],\n      [279, -1],\n      [263, -1],\n      [144, 0],\n      [133, 0]\n    ],\n    [\n      [23358, 63503],\n      [16, -60],\n      [13, -11],\n      [1, -43],\n      [13, 6],\n      [5, -36],\n      [26, -14],\n      [8, 41],\n      [24, -13],\n      [-4, -28],\n      [7, -33],\n      [11, -11],\n      [-4, -42],\n      [-9, -1],\n      [3, -36],\n      [12, 16],\n      [-1, -49],\n      [-10, -6],\n      [-13, 24],\n      [-5, -75],\n      [-15, -19],\n      [-7, -41],\n      [2, -41],\n      [-17, -24],\n      [1, -48],\n      [15, -41],\n      [1, -29],\n      [16, -31],\n      [12, -61],\n      [14, 0],\n      [5, -21],\n      [-9, -25],\n      [6, -79],\n      [18, -52],\n      [-3, -28],\n      [15, -13],\n      [5, -31],\n      [14, -11],\n      [9, 16],\n      [5, -31],\n      [20, -3],\n      [-5, -41],\n      [0, -444],\n      [-1, -120],\n      [0, -696],\n      [-1, -52],\n      [0, -779],\n      [-1, -97],\n      [0, -281]\n    ],\n    [\n      [23550, 60009],\n      [-249, 1],\n      [-196, -1],\n      [-169, 0],\n      [-218, 0],\n      [-208, -1],\n      [-258, 2],\n      [-103, 0],\n      [-154, 3],\n      [-149, -4],\n      [-209, -4],\n      [-155, -3]\n    ],\n    [\n      [30863, 68384],\n      [14, 7],\n      [-7, -35],\n      [-7, 28]\n    ],\n    [\n      [30827, 68345],\n      [7, 83],\n      [6, -34],\n      [19, -55],\n      [-15, -45],\n      [-5, 34],\n      [-12, 17]\n    ],\n    [\n      [30819, 68560],\n      [3, 42],\n      [11, -71],\n      [-14, 29]\n    ],\n    [\n      [30732, 68434],\n      [14, 2],\n      [3, -41],\n      [-17, 39]\n    ],\n    [\n      [30712, 67988],\n      [8, 37],\n      [1, -75],\n      [-9, 38]\n    ],\n    [\n      [30703, 68290],\n      [8, 41],\n      [25, 45],\n      [11, -50],\n      [-9, -8],\n      [14, -78],\n      [-11, -39],\n      [-18, -13],\n      [-12, 24],\n      [5, 25],\n      [-3, 50],\n      [-10, 3]\n    ],\n    [\n      [30697, 68452],\n      [13, 68],\n      [2, 64],\n      [9, 25],\n      [6, -26],\n      [-9, -35],\n      [1, -36],\n      [-8, -70],\n      [-10, -29],\n      [-4, 39]\n    ],\n    [\n      [30213, 67064],\n      [-35, 81],\n      [0, 69],\n      [6, 42],\n      [-41, 128],\n      [-9, 53],\n      [8, 101],\n      [-4, 10],\n      [6, 88],\n      [-6, 23],\n      [-5, 313],\n      [0, 89],\n      [-11, 861],\n      [-15, 757]\n    ],\n    [\n      [30107, 69679],\n      [21, 15],\n      [0, 33],\n      [25, -41],\n      [-1, -38],\n      [7, -43],\n      [11, -15],\n      [13, 85],\n      [2, 86],\n      [-6, 28],\n      [12, 36],\n      [8, -3],\n      [12, -44],\n      [21, -9],\n      [1, 39],\n      [-24, 83],\n      [-1, 32],\n      [22, 107],\n      [14, 27],\n      [11, 43],\n      [8, -1],\n      [15, 41],\n      [24, 38],\n      [-9, 71],\n      [21, 66],\n      [23, 45],\n      [5, 56],\n      [-7, 28],\n      [-14, 0],\n      [0, 66],\n      [10, 38],\n      [-8, 14],\n      [15, 51],\n      [5, 46],\n      [-15, 44],\n      [16, 115],\n      [8, 18],\n      [-1, 37],\n      [17, 32],\n      [14, 59],\n      [11, 8],\n      [17, 324],\n      [215, 890],\n      [13, -3],\n      [27, -38],\n      [11, 4],\n      [-3, -58],\n      [1, -141],\n      [4, -18],\n      [37, -73],\n      [25, 43],\n      [26, 30],\n      [28, 2],\n      [11, 52],\n      [30, 11],\n      [25, -12],\n      [0, 62],\n      [16, 23],\n      [25, -6],\n      [23, -36],\n      [4, -32],\n      [33, -68],\n      [36, -132],\n      [0, -15],\n      [28, -51],\n      [0, -545],\n      [3, -693],\n      [-1, -71],\n      [9, -30],\n      [-15, -39],\n      [14, -70],\n      [-15, -34],\n      [1, -136],\n      [23, -18],\n      [3, 20],\n      [10, -57],\n      [19, -28],\n      [30, -23],\n      [14, 19],\n      [8, -62],\n      [1, -56],\n      [-13, 8],\n      [-11, -22],\n      [7, -68],\n      [16, -63],\n      [-9, -73],\n      [-10, -41],\n      [23, -116],\n      [0, -23],\n      [18, -40],\n      [13, 28],\n      [1, 46],\n      [18, -30],\n      [19, -3],\n      [13, -56],\n      [6, -51],\n      [-8, -14],\n      [10, -32],\n      [12, -98],\n      [15, -38],\n      [1, -118],\n      [-12, -50],\n      [-10, 2],\n      [-4, -32],\n      [-32, -113],\n      [-24, -25],\n      [4, -22],\n      [-15, -8],\n      [6, 42],\n      [-4, 85],\n      [-27, -30],\n      [12, -58],\n      [-12, -43],\n      [-11, 13],\n      [-13, -58],\n      [-13, 18],\n      [-10, -12],\n      [2, -35],\n      [16, -40],\n      [-22, -57],\n      [-13, 46],\n      [-6, 57],\n      [-13, -10],\n      [-3, -38],\n      [-8, 3],\n      [-7, 59],\n      [-7, -62],\n      [-9, -14],\n      [-8, -74],\n      [-7, 19],\n      [-6, -48],\n      [-4, 42],\n      [-20, -51],\n      [-5, 27],\n      [-12, -92],\n      [-16, 39],\n      [0, 36],\n      [-10, -21],\n      [-11, 9],\n      [2, -66],\n      [-16, -71],\n      [11, -33],\n      [-35, -16],\n      [-23, 32],\n      [-16, 107],\n      [6, 29],\n      [22, 27],\n      [-9, 45],\n      [-13, -35],\n      [2, 44],\n      [-10, -3],\n      [1, -68],\n      [-5, 0],\n      [0, 64],\n      [-24, -56],\n      [5, -35],\n      [-6, -43],\n      [14, -67],\n      [-3, -45],\n      [-23, -77],\n      [9, -11],\n      [-12, -31],\n      [11, -56],\n      [-5, -69],\n      [-16, -10],\n      [-3, 85],\n      [6, 4],\n      [-3, 55],\n      [-17, 45],\n      [-4, 64],\n      [15, 51],\n      [-19, 40],\n      [6, 26],\n      [-10, 10],\n      [-18, -21],\n      [1, 113],\n      [11, 44],\n      [1, 50],\n      [-7, 14],\n      [-7, -46],\n      [-14, -40],\n      [-11, 33],\n      [-7, -32],\n      [-15, -4],\n      [14, -81],\n      [-3, -48],\n      [-12, -23],\n      [-10, -71],\n      [-4, -72],\n      [-13, -78],\n      [19, -30],\n      [-13, -28],\n      [10, -57],\n      [-10, -38],\n      [-27, 4],\n      [-13, -72],\n      [-15, -1],\n      [-2, -58],\n      [-11, -9],\n      [0, 52],\n      [7, 37],\n      [-9, 15],\n      [-3, -30],\n      [-12, -13],\n      [5, 65],\n      [-18, -9],\n      [1, -52],\n      [-16, -37],\n      [-5, -50],\n      [-12, 51],\n      [-2, -47],\n      [-15, -32],\n      [-12, 26],\n      [-3, -66],\n      [-13, 51],\n      [-13, -92],\n      [-23, -27],\n      [-5, -19],\n      [-5, 83],\n      [-16, 5],\n      [-15, -42],\n      [-5, -39],\n      [-20, 4],\n      [-7, -49],\n      [-20, 4],\n      [-10, -49],\n      [-3, -50],\n      [5, -29],\n      [-8, -32],\n      [-13, 29],\n      [-22, -31],\n      [-9, -46],\n      [6, -67],\n      [-8, -43],\n      [-10, -15],\n      [3, -33],\n      [-14, -24],\n      [-14, 4],\n      [-10, -25],\n      [-11, -98],\n      [5, -19],\n      [-14, -80],\n      [1, -22],\n      [-14, -74],\n      [-9, -13]\n    ],\n    [\n      [30332, 65028],\n      [13, -24],\n      [29, 5],\n      [18, 17],\n      [12, 70],\n      [16, -105],\n      [-1, -30],\n      [-10, -16],\n      [-33, 4],\n      [-41, 60],\n      [-3, 19]\n    ],\n    [\n      [30177, 65078],\n      [18, 0],\n      [19, 90],\n      [27, 60],\n      [11, -15],\n      [7, -70],\n      [15, -27],\n      [10, 40],\n      [-1, -84],\n      [-41, 1],\n      [-31, -9],\n      [-18, -47],\n      [-16, 61]\n    ],\n    [\n      [29500, 66699],\n      [224, -22]\n    ],\n    [\n      [29724, 66677],\n      [199, -23],\n      [126, -12],\n      [10, 46],\n      [21, 1],\n      [-1, 62],\n      [15, 36],\n      [19, -18],\n      [9, 62],\n      [36, 32],\n      [15, -30],\n      [8, 13]\n    ],\n    [\n      [30181, 66846],\n      [2, -72],\n      [9, -136],\n      [25, -47],\n      [12, 42],\n      [14, -34],\n      [-16, -90],\n      [-23, -7],\n      [-38, -35],\n      [12, -50],\n      [-18, -50],\n      [-7, 9],\n      [-5, -59],\n      [-4, 41],\n      [-11, -53],\n      [11, -74],\n      [-13, 10],\n      [-5, -28],\n      [8, -26],\n      [-5, -27],\n      [14, -14],\n      [6, 36],\n      [14, 8],\n      [9, -47],\n      [24, -28],\n      [12, -42],\n      [2, -46],\n      [21, -93],\n      [-1, -50],\n      [-7, -39],\n      [-12, -5],\n      [3, -24],\n      [21, -51],\n      [12, 8],\n      [8, -24],\n      [8, -83],\n      [-5, -50],\n      [13, -48],\n      [23, -35],\n      [34, -12],\n      [9, -23],\n      [19, 44],\n      [19, 8],\n      [27, 33],\n      [6, 25],\n      [-1, 79],\n      [-6, 61],\n      [-13, -31],\n      [0, 97],\n      [-5, 55],\n      [-15, 34],\n      [-9, -7],\n      [-5, -39],\n      [-11, 59],\n      [13, 11],\n      [21, -18],\n      [23, -58],\n      [18, -123],\n      [9, -119],\n      [2, -137],\n      [-15, -129],\n      [-2, -44],\n      [-7, 9],\n      [12, 112],\n      [-7, 23],\n      [-26, -5],\n      [-43, -40],\n      [-30, 8],\n      [-7, -28],\n      [-17, -7],\n      [-15, -62],\n      [-33, -10],\n      [-34, -66],\n      [-16, -47],\n      [-21, -28],\n      [-23, -15],\n      [6, 26],\n      [35, 34],\n      [16, 47],\n      [24, 49],\n      [5, 40],\n      [-2, 117],\n      [6, 41],\n      [-26, 26],\n      [0, -59],\n      [-7, 14],\n      [-4, -50],\n      [-14, 3],\n      [2, -32],\n      [-31, -11],\n      [-7, -49],\n      [2, -44],\n      [-6, -29],\n      [-25, -23],\n      [-12, 17],\n      [-10, -14]\n    ],\n    [\n      [30097, 65246],\n      [-3, 189],\n      [-18, 18]\n    ],\n    [\n      [30076, 65453],\n      [-8, 41]\n    ],\n    [\n      [30068, 65494],\n      [-10, 48],\n      [-19, 33],\n      [-5, 56],\n      [2, 81],\n      [-12, -6],\n      [0, 147],\n      [-116, -13]\n    ],\n    [\n      [29908, 65840],\n      [-1, 18],\n      [-202, 13],\n      [-22, -4],\n      [-42, 6],\n      [-3, -39],\n      [-14, -6],\n      [1, 45],\n      [-54, 3],\n      [-118, 14],\n      [-15, -1]\n    ],\n    [\n      [29438, 65889],\n      [-6, 42],\n      [34, 395],\n      [34, 373]\n    ],\n    [\n      [22823, 73980],\n      [83, -1],\n      [266, 0],\n      [229, -1],\n      [0, 449],\n      [27, -37],\n      [28, 20],\n      [29, -53],\n      [8, -35],\n      [14, -202],\n      [7, -25],\n      [18, -251],\n      [-6, -69],\n      [4, -54],\n      [14, -43],\n      [29, -45],\n      [24, -12],\n      [8, 19],\n      [44, -11],\n      [11, -58],\n      [61, -7],\n      [48, -21],\n      [8, -66],\n      [-3, -49],\n      [6, -12],\n      [42, 2],\n      [5, 15],\n      [22, -2],\n      [23, 20],\n      [-1, 48],\n      [33, 46],\n      [39, 18],\n      [9, -22],\n      [53, 0],\n      [72, -98],\n      [26, 4],\n      [1, -49],\n      [-19, -7],\n      [-4, -37],\n      [16, -31],\n      [41, 13],\n      [15, -54],\n      [-6, -34],\n      [6, -49],\n      [24, -127],\n      [25, 27],\n      [-8, 84],\n      [13, 45],\n      [15, -11],\n      [42, 16],\n      [16, -44],\n      [-2, -65],\n      [17, -41],\n      [14, 9],\n      [9, -36],\n      [41, -9],\n      [5, -67],\n      [-4, -31],\n      [20, -21],\n      [23, 13],\n      [-3, -75],\n      [22, 28],\n      [14, -22],\n      [19, 24],\n      [34, 17],\n      [46, 113],\n      [17, 13],\n      [13, 32],\n      [25, 30],\n      [14, -13],\n      [0, -67],\n      [17, -17],\n      [-6, -26],\n      [10, -48],\n      [16, -3],\n      [35, 29],\n      [6, -29],\n      [25, 15],\n      [26, -18],\n      [19, 13],\n      [48, 8],\n      [29, -28],\n      [9, -66],\n      [34, -53],\n      [15, 35],\n      [20, 9],\n      [13, -20],\n      [23, 6],\n      [11, -18],\n      [25, 22],\n      [-27, -56],\n      [-10, 20],\n      [-4, -34],\n      [-17, -15],\n      [-26, -58],\n      [-37, -34],\n      [-14, -37],\n      [-52, -44],\n      [-48, -54],\n      [-15, -6],\n      [-42, -45],\n      [-4, -14],\n      [-51, -77],\n      [-37, -79],\n      [-72, -183],\n      [-17, -69],\n      [-55, -178],\n      [-26, -72],\n      [-26, -41],\n      [-26, -88],\n      [-11, -11],\n      [-28, -83],\n      [-10, -10],\n      [-61, -134],\n      [-9, -25],\n      [8, -50],\n      [14, -46]\n    ],\n    [\n      [24276, 71309],\n      [-21, 50],\n      [-14, -11],\n      [-3, -29],\n      [-16, -14],\n      [9, -19],\n      [-11, -43],\n      [-22, 16],\n      [0, -685],\n      [-10, -10],\n      [-6, -59],\n      [-24, 7],\n      [-10, -56],\n      [-14, 13],\n      [-8, -38],\n      [-25, -23],\n      [-20, -47],\n      [-20, -148],\n      [-22, -49],\n      [-7, -114],\n      [1, -53],\n      [21, -21],\n      [10, 9],\n      [14, -32],\n      [-1, -31],\n      [23, -85],\n      [-1, -50],\n      [-15, -47],\n      [1, -29],\n      [-17, -49],\n      [2, -91],\n      [-4, -32],\n      [6, -91],\n      [-16, -58],\n      [11, -34],\n      [-2, -65],\n      [6, -41],\n      [-7, -42],\n      [3, -75],\n      [-12, -80],\n      [5, -36],\n      [16, -27],\n      [31, -87],\n      [-1, -24],\n      [14, -16],\n      [9, -44],\n      [50, -9],\n      [12, -17],\n      [10, -78],\n      [14, -38],\n      [50, -51],\n      [22, -39],\n      [14, -40],\n      [0, -53],\n      [8, -15],\n      [5, -84],\n      [17, -45],\n      [27, -41],\n      [3, -29],\n      [36, -90],\n      [39, -29],\n      [15, -55],\n      [30, -136],\n      [9, -75],\n      [-8, -113],\n      [2, -71],\n      [10, -37],\n      [-4, -44],\n      [8, -53]\n    ],\n    [\n      [24498, 67577],\n      [-204, 0],\n      [-224, 0],\n      [-116, -1],\n      [-223, 0],\n      [-180, 1],\n      [-313, 0],\n      [-199, 0]\n    ],\n    [\n      [23039, 67577],\n      [0, 1215],\n      [1, 101],\n      [-1, 302],\n      [0, 479],\n      [-10, 65],\n      [-36, 59],\n      [-18, 4],\n      [-14, 55],\n      [-9, 73],\n      [-26, 98],\n      [5, 46],\n      [25, 62],\n      [22, 39],\n      [12, 63],\n      [14, 46],\n      [4, 128]\n    ],\n    [\n      [23008, 70412],\n      [-4, 106],\n      [6, 37],\n      [-11, 188],\n      [-1, 129],\n      [-13, 27],\n      [-20, 98],\n      [-5, 49],\n      [-4, 119],\n      [-11, 57],\n      [-2, 39],\n      [5, 68],\n      [-6, 112],\n      [5, 17],\n      [6, 117],\n      [-6, -11],\n      [-11, 51],\n      [1, 171],\n      [-5, 92],\n      [-2, 114],\n      [3, 50],\n      [-7, 103],\n      [1, 217],\n      [-5, 3],\n      [-7, 89],\n      [-11, 92],\n      [-8, 17],\n      [-11, 101],\n      [-3, 58],\n      [-11, 34],\n      [-5, 121],\n      [-16, 101],\n      [-3, 110],\n      [7, 53],\n      [-8, 93],\n      [3, 52],\n      [-1, 107],\n      [-7, 59],\n      [7, 76],\n      [9, 24],\n      [3, 62],\n      [-15, 80],\n      [-8, 124],\n      [-6, 24],\n      [-11, 98],\n      [3, 40]\n    ],\n    [\n      [28860, 63072],\n      [14, 65]\n    ],\n    [\n      [28874, 63137],\n      [9, 32],\n      [5, 61],\n      [12, 42]\n    ],\n    [\n      [28900, 63272],\n      [17, 44],\n      [38, 25],\n      [25, 45],\n      [0, 69],\n      [16, 25],\n      [7, 33],\n      [34, 72],\n      [18, 15],\n      [12, 51],\n      [10, -8],\n      [17, 39],\n      [-14, 71],\n      [-20, 41],\n      [-7, 52],\n      [-21, 54],\n      [-7, 68],\n      [-25, 19],\n      [-4, 45],\n      [2, 95],\n      [-10, 37],\n      [-17, -5],\n      [-9, 14],\n      [-2, 83],\n      [7, 30],\n      [-8, 22],\n      [9, 100],\n      [11, -5],\n      [23, 113],\n      [-24, 120],\n      [13, 48],\n      [18, 29],\n      [16, 56],\n      [-4, 24],\n      [17, 35],\n      [11, 49],\n      [14, 124],\n      [22, 69],\n      [16, 13]\n    ],\n    [\n      [29101, 65083],\n      [88, -173],\n      [132, -246],\n      [3, -19],\n      [-20, -187],\n      [-12, -65],\n      [-4, -65],\n      [-6, -22]\n    ],\n    [\n      [29282, 64306],\n      [-7, -34]\n    ],\n    [\n      [29275, 64272],\n      [-37, -35],\n      [-4, -84],\n      [-9, -16],\n      [-3, -50]\n    ],\n    [\n      [29222, 64087],\n      [0, -43],\n      [19, -28],\n      [16, 18],\n      [24, -44],\n      [14, -9],\n      [4, 44],\n      [4, -90],\n      [-3, -107],\n      [-14, -182],\n      [-13, -247],\n      [-5, -173],\n      [-40, -241],\n      [-11, -48],\n      [-9, -9],\n      [3, -32],\n      [-10, -55],\n      [-20, -63],\n      [-1, -19],\n      [-31, -55],\n      [-32, -108],\n      [-21, -118],\n      [-22, -149],\n      [-20, -60],\n      [-19, -14],\n      [-11, 14],\n      [6, 88],\n      [15, 97],\n      [3, 69],\n      [-21, 37],\n      [-18, 4],\n      [-6, 25],\n      [-18, -3],\n      [-7, -36],\n      [-9, 24],\n      [-2, 47],\n      [-18, 37],\n      [-3, 30],\n      [-10, -12],\n      [-15, 68],\n      [-7, -8],\n      [-18, 58],\n      [-10, 56],\n      [-19, 25],\n      [6, 140],\n      [-12, 29]\n    ],\n    [\n      [28861, 63044],\n      [-1, 28]\n    ],\n    [\n      [28814, 58772],\n      [18, -19],\n      [12, -74],\n      [1, -47],\n      [-15, 9],\n      [2, 45],\n      [-18, 86]\n    ],\n    [\n      [28734, 57762],\n      [8, 60],\n      [8, 0],\n      [47, 86],\n      [15, 12],\n      [14, 33],\n      [12, 2],\n      [16, 35],\n      [13, 10],\n      [5, 74],\n      [11, 252],\n      [0, 54],\n      [-8, 95],\n      [-6, 105],\n      [3, -2],\n      [11, -106],\n      [5, -95],\n      [-3, -136],\n      [-15, -286],\n      [-24, -8],\n      [-50, -64],\n      [-43, -78],\n      [-19, -43]\n    ],\n    [\n      [27156, 59531],\n      [84, -16],\n      [55, -3],\n      [95, -15],\n      [37, 4],\n      [114, -21],\n      [48, -2],\n      [170, -2],\n      [279, 0],\n      [74, 4],\n      [264, 0],\n      [106, -1],\n      [0, 10],\n      [31, -2],\n      [120, 0],\n      [142, 0]\n    ],\n    [\n      [28775, 59487],\n      [2, -58],\n      [17, -245],\n      [16, -158],\n      [23, -156],\n      [35, -271],\n      [-9, 14],\n      [-18, 146],\n      [-14, 80],\n      [-13, 11],\n      [-9, 174],\n      [-16, 155],\n      [-8, 23],\n      [3, 39],\n      [-5, 89],\n      [-10, 30],\n      [-4, 48],\n      [-25, 13],\n      [-1, 40],\n      [-13, -20],\n      [6, -61],\n      [16, -48],\n      [11, 10],\n      [0, -67],\n      [15, -135],\n      [9, -61],\n      [-1, -26],\n      [11, -75],\n      [0, -47],\n      [-19, 64],\n      [1, 37],\n      [-13, 61],\n      [-3, 38],\n      [-12, 12],\n      [6, -38],\n      [-3, -28],\n      [14, -39],\n      [-31, 25],\n      [-32, 118],\n      [-15, 12],\n      [19, -97],\n      [10, -17],\n      [6, -52],\n      [-9, -23],\n      [-24, -14],\n      [-21, 71],\n      [7, -63],\n      [10, -27],\n      [-7, -14],\n      [-31, 45],\n      [-13, 5],\n      [-5, 29],\n      [-18, 24],\n      [23, -73],\n      [21, -23],\n      [-7, -19],\n      [-24, -8],\n      [-13, -62],\n      [-16, -22],\n      [-17, 1],\n      [-8, 31],\n      [-20, 12],\n      [-12, 121],\n      [0, 61],\n      [12, 78],\n      [-5, 13],\n      [-14, -76],\n      [-2, -76],\n      [8, -94],\n      [11, -77],\n      [-5, -42],\n      [8, -34],\n      [40, 10],\n      [37, 47],\n      [9, -49],\n      [13, 6],\n      [13, 30],\n      [26, 24],\n      [32, -1],\n      [14, -41],\n      [0, -43],\n      [-14, -78],\n      [3, -55],\n      [2, -164],\n      [9, 5],\n      [7, 115],\n      [3, 150],\n      [14, 40],\n      [-6, 33],\n      [14, 20],\n      [25, -21],\n      [16, -94],\n      [7, -65],\n      [-4, -52],\n      [7, -98],\n      [-8, -25],\n      [4, -54],\n      [-13, -54],\n      [-17, -10],\n      [-6, 18],\n      [-10, -16],\n      [-6, -40],\n      [-10, -9],\n      [-3, -43],\n      [-7, -11],\n      [-7, -71],\n      [-13, -15],\n      [-3, -46],\n      [-17, -25],\n      [-3, -24],\n      [-26, 25],\n      [-29, -4],\n      [-26, 18],\n      [-5, 25],\n      [-10, -14],\n      [-15, 45],\n      [-13, 115],\n      [31, 3],\n      [5, 45],\n      [-28, -25],\n      [-12, 11],\n      [-9, -33],\n      [9, -57],\n      [6, -86],\n      [-7, 0],\n      [-29, 47],\n      [-14, -10],\n      [-20, 34],\n      [-31, 30],\n      [-23, 48],\n      [-1, -29],\n      [17, -61],\n      [21, -5],\n      [63, -102],\n      [46, -28],\n      [8, -31],\n      [1, -40],\n      [-7, -56],\n      [-13, -54],\n      [1, -28],\n      [-9, -53],\n      [-15, -42],\n      [-50, -112],\n      [-50, 112],\n      [1, -65],\n      [24, -55],\n      [36, -43],\n      [36, 80],\n      [13, 2],\n      [27, 30],\n      [4, 62],\n      [11, -14],\n      [3, -66],\n      [8, -31],\n      [18, -5],\n      [-9, 75],\n      [20, -29],\n      [2, -85],\n      [-17, -75],\n      [-18, -13],\n      [0, -34],\n      [-11, -20],\n      [-14, -84],\n      [-7, -71],\n      [-17, 20],\n      [1, 80],\n      [-10, 19],\n      [1, -82],\n      [-16, -7],\n      [42, -64],\n      [23, 123],\n      [33, 120],\n      [24, 75],\n      [47, 176],\n      [8, -21],\n      [-28, -83],\n      [-26, -96],\n      [-22, -62],\n      [-21, -78],\n      [-18, -82],\n      [-21, -115],\n      [-3, -32],\n      [-4, 67],\n      [-35, 55],\n      [-39, 1],\n      [-60, -38],\n      [-29, -33],\n      [-20, -32],\n      [-32, -81],\n      [-39, -75],\n      [-26, -63],\n      [-37, -113],\n      [-14, -55],\n      [-25, -128],\n      [-14, -111],\n      [-10, -112],\n      [-9, -69],\n      [-4, -69],\n      [-13, 7],\n      [-3, 34],\n      [-21, 21],\n      [-23, 9],\n      [-28, -2],\n      [-30, -12],\n      [-35, -42],\n      [-8, -17]\n    ],\n    [\n      [28030, 56345],\n      [-93, 330],\n      [-104, 362],\n      [-31, 116],\n      [-88, 302],\n      [-61, 1],\n      [-74, 7],\n      [-178, 10],\n      [4, 135],\n      [-42, 199],\n      [-30, -73],\n      [-5, 21],\n      [7, 48],\n      [-2, 53],\n      [-55, 13],\n      [-105, 16],\n      [-188, 29],\n      [-23, -20],\n      [-5, 39],\n      [-12, -52],\n      [-7, 9],\n      [-20, -27],\n      [-6, 5],\n      [-29, -47],\n      [-28, -60],\n      [-7, 21],\n      [-91, -99]\n    ],\n    [\n      [26419, 57669],\n      [9, 275],\n      [22, 48],\n      [3, -26],\n      [28, 4],\n      [22, 63],\n      [-5, 57],\n      [9, 25],\n      [-4, 44],\n      [17, 62],\n      [13, 15],\n      [8, 48],\n      [16, 8],\n      [15, 45],\n      [80, 7],\n      [11, 50],\n      [22, 32],\n      [5, 26],\n      [10, -7],\n      [16, 48],\n      [4, 35],\n      [16, 4],\n      [8, 40],\n      [21, 29],\n      [24, -18],\n      [26, 115],\n      [-3, 63],\n      [10, 30],\n      [15, -36],\n      [20, 98],\n      [33, 70],\n      [10, -40],\n      [-5, -70],\n      [15, -20],\n      [28, 62],\n      [15, 93],\n      [15, 35],\n      [17, 21],\n      [12, -5],\n      [9, 33],\n      [19, -12],\n      [4, -50],\n      [15, 0],\n      [14, 28],\n      [33, 200],\n      [21, 53],\n      [11, 12],\n      [8, -23],\n      [17, 0],\n      [-10, 74],\n      [7, 65],\n      [6, 12],\n      [-4, 80],\n      [9, 60]\n    ],\n    [\n      [20923, 73979],\n      [188, -1],\n      [322, 0],\n      [212, 0],\n      [92, 0],\n      [193, 1],\n      [160, -1],\n      [135, 0],\n      [141, 1],\n      [256, 1],\n      [201, 0]\n    ],\n    [\n      [23008, 70412],\n      [-210, -1],\n      [-186, 1],\n      [-119, 1],\n      [-252, 4],\n      [-192, 2],\n      [-179, 2],\n      [-253, 1],\n      [-123, 0],\n      [-292, 1],\n      [-173, 0],\n      [-105, 0]\n    ],\n    [\n      [20924, 70423],\n      [0, 2828],\n      [-1, 17],\n      [0, 711]\n    ],\n    [\n      [23550, 60009],\n      [0, -581]\n    ],\n    [\n      [23550, 59428],\n      [6, -130],\n      [7, -206],\n      [6, -127],\n      [14, -355],\n      [4, -82],\n      [15, -387],\n      [-2, -319],\n      [-3, -261],\n      [-1, -235],\n      [-2, -170],\n      [-2, -417],\n      [-5, -642]\n    ],\n    [\n      [23587, 56097],\n      [-9, -25],\n      [-19, 73],\n      [-16, -13],\n      [-1, 23],\n      [-17, -1],\n      [-18, 79],\n      [-15, -16],\n      [-12, 5],\n      [-21, 78],\n      [-7, 58],\n      [-22, 2],\n      [-23, 85],\n      [-27, 28],\n      [-7, -68],\n      [-11, -32],\n      [-13, -7],\n      [-34, 4],\n      [0, 15],\n      [-21, -7],\n      [-7, 61],\n      [-10, 3],\n      [-24, -52],\n      [-20, 3],\n      [1, -45],\n      [-13, 9],\n      [-9, -31],\n      [-29, 61],\n      [-1, -30],\n      [-30, -29],\n      [-15, 13],\n      [1, -20],\n      [-14, 8],\n      [-8, -90],\n      [-14, -14],\n      [-19, 19],\n      [-7, -81],\n      [-12, -3],\n      [-1, 22],\n      [-17, 79],\n      [-21, -6],\n      [-8, 57],\n      [-11, -4],\n      [-16, 30],\n      [12, 58],\n      [-25, 16],\n      [-8, -86],\n      [-18, -9],\n      [-4, 42],\n      [-13, 14],\n      [-6, -33],\n      [-9, 25],\n      [-6, 95],\n      [-5, 11],\n      [-14, -27],\n      [-6, 15],\n      [3, -73],\n      [-16, -57],\n      [-13, 19],\n      [11, -42],\n      [-13, -22],\n      [3, -64],\n      [-11, -31],\n      [-11, 14],\n      [-12, 94],\n      [10, 30],\n      [-2, 66],\n      [-9, 28],\n      [-10, -19],\n      [-2, -42],\n      [-13, 19],\n      [-9, -7],\n      [-11, -64],\n      [-20, 5],\n      [-5, 30],\n      [1, 63],\n      [-12, 19],\n      [-16, -27],\n      [-11, 25],\n      [3, 41],\n      [-19, 42],\n      [-9, -3],\n      [-12, -58],\n      [-29, -92],\n      [-12, -9],\n      [-16, 34],\n      [-9, 3],\n      [4, 65],\n      [-5, -1],\n      [7, 60],\n      [-7, 20],\n      [-13, -14],\n      [-19, 11],\n      [-10, 91],\n      [8, 35],\n      [-4, 50],\n      [-17, -47],\n      [-20, 22],\n      [-15, 0],\n      [-19, 28],\n      [-11, -40],\n      [-3, -44],\n      [-20, -26],\n      [-24, 96],\n      [-21, 23],\n      [-12, -37],\n      [-21, 4],\n      [-13, 26],\n      [-13, 3],\n      [-17, 24],\n      [-19, 46],\n      [-16, -27],\n      [-9, 15],\n      [-12, -11],\n      [-2, 20],\n      [-18, -3],\n      [-5, 140],\n      [-18, 56],\n      [4, 22],\n      [-16, 5],\n      [-18, 57],\n      [-4, -92],\n      [-12, -4],\n      [-22, 47],\n      [-17, 2],\n      [-6, -49],\n      [-30, 15],\n      [-24, 78],\n      [-37, 143],\n      [-20, -19],\n      [0, 2257],\n      [-123, 0],\n      [-179, 0],\n      [-150, 0],\n      [-175, 1],\n      [-210, 0]\n    ],\n    [\n      [21214, 59429],\n      [1, 119],\n      [0, 463]\n    ],\n    [\n      [27478, 65805],\n      [48, 61],\n      [45, 74],\n      [9, 24],\n      [10, 60],\n      [13, 3],\n      [3, -28],\n      [36, 72],\n      [47, 74]\n    ],\n    [\n      [27689, 66145],\n      [0, -314],\n      [1, -2],\n      [247, -1],\n      [77, 3],\n      [167, -2],\n      [243, 1],\n      [105, 3],\n      [111, -4],\n      [169, -1],\n      [107, 2],\n      [14, -59],\n      [5, 4],\n      [8, -100],\n      [15, 4],\n      [27, -34],\n      [10, -49],\n      [-8, -32],\n      [14, -21],\n      [2, -159],\n      [-8, -12],\n      [25, -113],\n      [1, -34],\n      [11, 5],\n      [15, -33],\n      [-2, -18],\n      [25, 3],\n      [3, -22],\n      [16, 8],\n      [-1, -30],\n      [13, -55]\n    ],\n    [\n      [28900, 63272],\n      [-23, 37],\n      [-22, 6],\n      [-24, -20],\n      [-15, -34],\n      [-20, -82]\n    ],\n    [\n      [28796, 63179],\n      [-217, -1],\n      [-118, -1],\n      [-151, 0],\n      [-236, 3],\n      [-305, -2]\n    ],\n    [\n      [27769, 63178],\n      [-167, 0],\n      [-124, 0],\n      [0, 1068]\n    ],\n    [\n      [27478, 64246],\n      [0, 1559]\n    ],\n    [\n      [20920, 69320],\n      [5, 4],\n      [0, 872],\n      [-1, 227]\n    ],\n    [\n      [23039, 67577],\n      [-40, 0],\n      [5, -22],\n      [-7, -37],\n      [22, -64],\n      [-1, -110],\n      [-14, -5],\n      [8, -52],\n      [-3, -31],\n      [24, -3],\n      [2, -83],\n      [9, -35],\n      [-7, -66],\n      [-14, -16],\n      [5, -56],\n      [-8, -28],\n      [6, -21],\n      [-12, -46],\n      [0, -80],\n      [-11, -16],\n      [-3, -52],\n      [-11, -26],\n      [1, -76],\n      [15, -27],\n      [17, -60],\n      [10, -87],\n      [-4, -45],\n      [13, -31]\n    ],\n    [\n      [23041, 66402],\n      [-17, -7],\n      [-5, 30],\n      [-24, -5],\n      [-7, 53],\n      [-21, 66],\n      [7, 52],\n      [-11, 16],\n      [-21, 3],\n      [-1, 40],\n      [-28, 35],\n      [-12, -17],\n      [-8, 48],\n      [-43, 13],\n      [-5, 28],\n      [-18, 20],\n      [-1, 38],\n      [-25, 25],\n      [-15, -14],\n      [-15, 13],\n      [-7, -23],\n      [-18, 14],\n      [-16, -13],\n      [-16, 11],\n      [-18, -17],\n      [-25, 9],\n      [-20, 21],\n      [-8, -11],\n      [-9, -74],\n      [-12, -29],\n      [-19, -9],\n      [-31, 69],\n      [-36, 62],\n      [-58, 85],\n      [-9, 59],\n      [-112, 0],\n      [-186, -1],\n      [-153, 1],\n      [-214, -1],\n      [-206, -2],\n      [-62, 4],\n      [-178, 0],\n      [-143, 1],\n      [-293, 1]\n    ],\n    [\n      [20922, 66996],\n      [0, 345],\n      [-1, 8],\n      [0, 1828],\n      [-1, 143]\n    ],\n    [\n      [23587, 56097],\n      [8, 8],\n      [0, -54],\n      [11, -25],\n      [9, 6],\n      [-2, -36],\n      [10, -9],\n      [5, 27],\n      [8, -18],\n      [3, 29],\n      [21, -27],\n      [11, 46],\n      [12, -17],\n      [5, -30],\n      [6, 21],\n      [16, -22]\n    ],\n    [\n      [23710, 55996],\n      [0, 0]\n    ],\n    [\n      [23710, 55996],\n      [1, -11],\n      [0, -608]\n    ],\n    [\n      [23711, 55377],\n      [0, -1196],\n      [8, -12],\n      [11, -72],\n      [18, -31],\n      [9, -83],\n      [15, -55],\n      [-2, -34],\n      [8, -56],\n      [-7, -42],\n      [3, -45],\n      [-7, -28],\n      [6, -51],\n      [9, -32],\n      [13, -6],\n      [3, -35],\n      [-6, -27],\n      [14, -36],\n      [-1, -32],\n      [8, -15],\n      [3, -49],\n      [-6, -53],\n      [12, -47],\n      [6, 2],\n      [6, -113],\n      [19, 12],\n      [-6, -102],\n      [8, -31],\n      [2, -54],\n      [-13, -21],\n      [-1, -33],\n      [12, -55],\n      [-9, -22],\n      [-3, -38],\n      [4, -63],\n      [-9, -33],\n      [-9, -63],\n      [-3, -73],\n      [-12, -25],\n      [-2, -68],\n      [-14, -30],\n      [-3, -40],\n      [7, -24],\n      [5, -91],\n      [-13, -51],\n      [-6, -74],\n      [16, -52],\n      [1, -53],\n      [-5, -39],\n      [9, -79],\n      [-12, -70],\n      [9, -19],\n      [-11, -51],\n      [-14, -39],\n      [-7, -78],\n      [-13, -74],\n      [-17, -45],\n      [-2, -25],\n      [9, -30],\n      [17, -94]\n    ],\n    [\n      [23768, 51502],\n      [0, -14],\n      [-46, 3],\n      [-37, -40],\n      [-128, -208],\n      [-28, -61],\n      [-10, -54],\n      [-15, 7],\n      [22, 71],\n      [9, 47],\n      [13, -1],\n      [9, 19],\n      [8, 46],\n      [9, -16],\n      [11, 8],\n      [-15, 55],\n      [-54, -54],\n      [-8, 26],\n      [17, 90],\n      [4, 80],\n      [0, 74],\n      [-12, 5],\n      [-5, 23],\n      [-17, -29],\n      [-10, -41],\n      [-4, -50],\n      [-15, -24],\n      [-6, 46],\n      [-18, -45],\n      [-2, -35],\n      [9, -32],\n      [-10, -50],\n      [10, -55],\n      [20, -17],\n      [-6, -54],\n      [11, -20],\n      [2, -78],\n      [-2, -67],\n      [-8, -31],\n      [-9, 10],\n      [-19, -71],\n      [-22, -65],\n      [-3, 26],\n      [-13, -8],\n      [-2, -88],\n      [6, -26],\n      [13, 44],\n      [26, 65],\n      [3, 19],\n      [32, 99],\n      [15, 23],\n      [0, 45],\n      [26, -15],\n      [-20, -61],\n      [-62, -153],\n      [-24, -69],\n      [-4, -25],\n      [-32, -91],\n      [-40, -143],\n      [-15, -8],\n      [-69, -146],\n      [-35, -80],\n      [-53, -89],\n      [-61, -112],\n      [-34, -87],\n      [-13, -42],\n      [-15, -74],\n      [-53, -111],\n      [-24, -68],\n      [-47, -155],\n      [-32, -143],\n      [-11, -83],\n      [-14, -59],\n      [-33, -221],\n      [-24, -197],\n      [-11, -127],\n      [-10, -192],\n      [-2, -108],\n      [1, -103],\n      [8, -205],\n      [14, -207],\n      [12, -134],\n      [16, -229],\n      [11, -260],\n      [-7, 47],\n      [-5, 147],\n      [-12, 189],\n      [-11, 152],\n      [-24, 16],\n      [18, 27],\n      [-9, 83],\n      [-6, 87],\n      [-9, 88],\n      [-3, 106],\n      [1, 138],\n      [-1, 122],\n      [11, 276],\n      [16, 180],\n      [19, 148],\n      [14, 70],\n      [10, 87],\n      [8, 35],\n      [-2, 47],\n      [13, 86],\n      [18, 38],\n      [9, 45],\n      [18, 127],\n      [28, 58],\n      [8, 53],\n      [16, 2],\n      [35, 105],\n      [23, 49],\n      [24, 23],\n      [-4, 43],\n      [9, 29],\n      [-9, 16],\n      [-16, -41],\n      [-20, -35],\n      [-11, -40],\n      [-17, -5],\n      [-6, 40],\n      [0, 60],\n      [-18, 12],\n      [-6, -31],\n      [0, -84],\n      [-5, -25],\n      [6, -41],\n      [-4, -36],\n      [-20, -56],\n      [-17, -61],\n      [-8, -1],\n      [-18, 30],\n      [-3, 43],\n      [-32, -61],\n      [-17, -67],\n      [21, -22],\n      [24, 57],\n      [8, -74],\n      [-7, -23],\n      [-38, -223],\n      [-12, -2],\n      [-6, 55],\n      [-21, -10],\n      [-4, 18],\n      [-32, -11],\n      [-11, 12],\n      [-6, -38],\n      [12, -32],\n      [15, -1],\n      [11, 17],\n      [-4, -64],\n      [7, -48],\n      [15, -34],\n      [17, -18],\n      [-19, -146],\n      [-13, -185],\n      [-12, -106],\n      [-20, -27],\n      [-7, -27],\n      [-11, 18],\n      [14, 21],\n      [3, 59],\n      [-8, 3],\n      [-6, -31],\n      [-29, -75],\n      [4, -32],\n      [24, -16],\n      [25, 38],\n      [8, 2],\n      [-5, -116],\n      [3, -4],\n      [-4, -202],\n      [-6, -207],\n      [-4, -3],\n      [10, -230],\n      [8, -65],\n      [1, -84],\n      [9, -1],\n      [23, -215],\n      [5, -29],\n      [-9, -47],\n      [4, -34],\n      [-1, -62],\n      [8, -72],\n      [20, -11],\n      [1, -35],\n      [12, 18],\n      [2, -127],\n      [-23, 7],\n      [-13, -8],\n      [0, -19],\n      [-21, -12],\n      [-6, -99],\n      [-20, 11],\n      [-7, 40],\n      [-15, 3],\n      [-6, 55],\n      [-11, 4],\n      [-18, 98],\n      [-31, 12],\n      [-11, 33],\n      [-17, -9],\n      [-7, 16],\n      [-23, -17],\n      [-4, 18],\n      [-13, -1],\n      [-3, -29],\n      [-10, 31],\n      [-20, -14],\n      [-8, 22],\n      [-6, -22],\n      [-14, 20],\n      [-8, 30],\n      [3, 25],\n      [-16, 1],\n      [-3, 44],\n      [-15, -1],\n      [-21, 75],\n      [-9, -11],\n      [-25, 48],\n      [-19, -22],\n      [-13, 35],\n      [-15, 69],\n      [-10, 8],\n      [-2, 33],\n      [-8, 12],\n      [-18, -15],\n      [-21, 47],\n      [-12, -3],\n      [-8, 20],\n      [-12, -19],\n      [-9, 44],\n      [6, 50],\n      [-10, 56],\n      [-11, 13],\n      [-3, 98],\n      [-6, 42],\n      [-3, 79],\n      [-8, 25],\n      [-1, 49],\n      [-7, 64],\n      [-17, 43],\n      [2, 31],\n      [-13, 26],\n      [-7, 37],\n      [5, 20],\n      [-11, 46],\n      [-9, 7],\n      [-1, 52],\n      [6, 31],\n      [-3, 66],\n      [4, 29],\n      [-4, 86],\n      [-16, 25],\n      [1, 37],\n      [-12, 11],\n      [9, 30],\n      [5, 86],\n      [-3, 31],\n      [4, 60],\n      [-13, 10],\n      [5, 76],\n      [-12, 58],\n      [-7, -14],\n      [-7, 46],\n      [-9, -18],\n      [-9, 39],\n      [-10, -6],\n      [-18, 90],\n      [-9, 11],\n      [-3, 38],\n      [-8, -9],\n      [-10, 38],\n      [0, 50],\n      [-7, 26],\n      [3, 41],\n      [-13, 48],\n      [2, 47],\n      [-17, 16],\n      [-7, 81],\n      [-10, 23],\n      [-8, 70],\n      [-35, 53],\n      [-4, 53],\n      [-7, -2],\n      [-13, 59],\n      [2, 38],\n      [-17, 100],\n      [3, 47],\n      [-9, 39],\n      [9, 29],\n      [-12, 11],\n      [-9, 47],\n      [4, 39],\n      [-14, 28],\n      [1, 33],\n      [-15, 28],\n      [-4, 51],\n      [2, 41],\n      [-8, 26],\n      [-4, 73],\n      [-6, 1],\n      [-9, 88],\n      [-8, 1],\n      [-6, 47],\n      [1, 76],\n      [-7, 106],\n      [-18, 46],\n      [-10, 40],\n      [3, 14],\n      [-9, 71],\n      [-23, 41],\n      [-2, 30],\n      [-17, 46],\n      [-18, 25],\n      [-13, 84],\n      [0, 21],\n      [-26, 21],\n      [-6, 44],\n      [-23, 7],\n      [3, 57],\n      [-2, 65],\n      [-5, 5],\n      [-6, -67],\n      [-6, 27],\n      [2, 53],\n      [-17, 27],\n      [-13, 108],\n      [-8, -4],\n      [-9, 32],\n      [-13, -25],\n      [-7, 44],\n      [-8, -27],\n      [-37, -13],\n      [-19, 31],\n      [-6, -8],\n      [-15, 22],\n      [-22, -14],\n      [-12, 24],\n      [-17, -7],\n      [-4, -22],\n      [-26, 21],\n      [-11, 50],\n      [-13, -3],\n      [-20, 40],\n      [-14, -18],\n      [-10, -111],\n      [-34, 19],\n      [-9, -37],\n      [-7, 11],\n      [-22, -32],\n      [-7, 10],\n      [-8, -54],\n      [2, -23],\n      [-13, -40],\n      [0, -50],\n      [-7, 0],\n      [-2, -59],\n      [-11, -30],\n      [1, -33],\n      [-7, -58],\n      [2, -52],\n      [-5, -48],\n      [-10, -5],\n      [-3, -72],\n      [-5, -37],\n      [10, -22],\n      [-5, -38],\n      [-18, -38],\n      [-10, 8],\n      [-7, -67],\n      [-17, -43],\n      [-7, -36],\n      [-4, -84],\n      [-14, -8],\n      [-17, 15],\n      [-15, -11],\n      [-14, 46],\n      [-27, 24],\n      [-27, 111],\n      [-24, 33],\n      [-10, -8],\n      [-22, 38],\n      [-18, 77],\n      [-13, 24],\n      [-39, 21],\n      [-17, 28],\n      [-19, 61],\n      [-11, 12],\n      [-19, 81],\n      [0, 24],\n      [-14, 47],\n      [-21, 7],\n      [-12, 27],\n      [-5, 34],\n      [-30, 78],\n      [-9, 43],\n      [-7, 110],\n      [-12, 56],\n      [-7, 60],\n      [-13, 63],\n      [0, 59],\n      [-7, 57],\n      [6, 72],\n      [-3, 54],\n      [2, 55],\n      [-7, 68],\n      [-11, 30],\n      [-3, 44],\n      [-13, 39],\n      [-1, 30],\n      [-13, 34],\n      [2, 33],\n      [-13, 177],\n      [-7, 40],\n      [-12, 4],\n      [-11, 91],\n      [-15, 0],\n      [-14, 66],\n      [-12, 10],\n      [-3, 24],\n      [-15, 34],\n      [-12, -4],\n      [-7, 28],\n      [-31, 39],\n      [0, 39],\n      [-44, 118],\n      [-13, 107],\n      [-12, 37],\n      [-18, 26],\n      [-9, 33],\n      [-9, 2],\n      [-2, 36],\n      [-24, 106],\n      [-20, 35],\n      [-4, 54],\n      [-14, 32],\n      [-21, 7],\n      [-35, 78],\n      [-11, 88],\n      [-10, 24],\n      [-6, 68],\n      [-13, 89],\n      [-9, 41],\n      [-19, 38],\n      [-11, -19],\n      [-11, 41]\n    ],\n    [\n      [20232, 53938],\n      [-5, 28],\n      [-16, 20],\n      [1, 23],\n      [-10, 25],\n      [-3, 38],\n      [7, 18],\n      [1, 101],\n      [331, 0],\n      [250, -1],\n      [226, 0],\n      [183, 1],\n      [0, 1212],\n      [2, 254],\n      [0, 149],\n      [2, 417],\n      [2, 232],\n      [0, 1518],\n      [1, 434],\n      [0, 809],\n      [-1, 213],\n      [11, 0]\n    ],\n    [\n      [20922, 66996],\n      [0, -2328]\n    ],\n    [\n      [19530, 64667],\n      [-136, -2],\n      [-143, -1],\n      [-52, -3],\n      [-133, 1],\n      [-93, 2],\n      [0, 442],\n      [1, 219],\n      [-1, 508]\n    ],\n    [\n      [18973, 65833],\n      [0, 676],\n      [1, 163],\n      [0, 1090],\n      [-1, 26],\n      [0, 516],\n      [-1, 267],\n      [1, 140]\n    ],\n    [\n      [18973, 68711],\n      [-2, 175],\n      [-1, 282],\n      [1, 156],\n      [75, 2],\n      [22, -12],\n      [85, 2],\n      [11, 8],\n      [45, -5],\n      [25, 8],\n      [87, -2],\n      [194, 5],\n      [11, -7],\n      [221, 0],\n      [316, 0],\n      [14, -4],\n      [144, -2],\n      [178, -1],\n      [23, 7],\n      [132, 0],\n      [251, -2],\n      [115, -1]\n    ],\n    [\n      [29908, 65840],\n      [0, -107],\n      [3, -222],\n      [0, -150],\n      [-3, -209],\n      [-12, -8],\n      [3, -76],\n      [-8, -29]\n    ],\n    [\n      [29891, 65039],\n      [-7, 19],\n      [-17, 2],\n      [-21, -24],\n      [-18, 3],\n      [-13, -24],\n      [-16, 28],\n      [-6, -37],\n      [-49, -35],\n      [-3, 20],\n      [-15, 0],\n      [-27, -33],\n      [-6, 21],\n      [-26, 1],\n      [-7, -26],\n      [-18, 23],\n      [-40, -27],\n      [-3, 60],\n      [-9, -17],\n      [-19, -82],\n      [-12, 0],\n      [-22, -73],\n      [-13, 23],\n      [-24, -58],\n      [-7, 13],\n      [-23, -28],\n      [5, -22],\n      [-10, -32],\n      [-29, -11],\n      [-22, -54],\n      [-9, 15],\n      [-15, -35]\n    ],\n    [\n      [29390, 64649],\n      [1, 33],\n      [-20, 102],\n      [68, 130],\n      [-19, 97],\n      [4, 161],\n      [5, 295],\n      [9, 422]\n    ],\n    [\n      [23231, 64184],\n      [167, -9],\n      [159, -8],\n      [156, 3],\n      [130, 8],\n      [62, 0],\n      [197, 12],\n      [152, 13],\n      [101, 14],\n      [12, -38],\n      [1, -33],\n      [18, -14],\n      [-1, -36],\n      [16, -57],\n      [10, -2],\n      [1, -56],\n      [11, -31],\n      [19, -7]\n    ],\n    [\n      [24442, 63943],\n      [-8, -18],\n      [-17, -144],\n      [-2, -71],\n      [6, -165],\n      [14, -99],\n      [7, -28],\n      [-8, -66],\n      [5, -38],\n      [15, -34],\n      [4, -28],\n      [-3, -61],\n      [26, -77],\n      [15, -57],\n      [11, -14],\n      [10, -69],\n      [13, -8],\n      [11, -76],\n      [16, -54],\n      [59, -137],\n      [20, -90],\n      [3, -90],\n      [8, -78],\n      [-9, -36],\n      [11, -85],\n      [3, -65],\n      [22, -69],\n      [11, 7],\n      [11, 32],\n      [9, 66],\n      [19, 4],\n      [27, -45],\n      [16, -5],\n      [38, -82],\n      [-2, -60],\n      [-12, -29],\n      [-13, -59],\n      [10, -92],\n      [-2, -37],\n      [-22, -96],\n      [-6, -99],\n      [-17, -68],\n      [-7, -52],\n      [-1, -78],\n      [5, -70],\n      [18, -50],\n      [20, -89],\n      [25, -37],\n      [11, -54],\n      [8, 0],\n      [17, -60],\n      [16, 7],\n      [3, -27],\n      [-12, -24],\n      [6, -50],\n      [20, -5],\n      [10, 31],\n      [13, -28],\n      [1, -29],\n      [15, -12],\n      [23, -70],\n      [-2, -40],\n      [14, -3],\n      [9, -42],\n      [19, -24],\n      [0, -57],\n      [11, -68],\n      [-13, -8],\n      [2, -50],\n      [26, -161],\n      [-4, -62],\n      [-15, -12],\n      [-8, -56],\n      [17, -53],\n      [-1, -47],\n      [13, -87],\n      [11, -46],\n      [-1, -53],\n      [24, -56],\n      [10, 27],\n      [-15, 45],\n      [14, 12],\n      [17, -56],\n      [8, -53],\n      [11, 14]\n    ],\n    [\n      [25079, 59990],\n      [9, -21],\n      [-5, -90],\n      [-6, -46],\n      [-10, -9],\n      [-1, -38],\n      [17, -37],\n      [-3, -28],\n      [-16, 3],\n      [-4, -44],\n      [11, -58],\n      [-8, -29],\n      [-7, -71],\n      [-13, -18],\n      [-18, 78],\n      [-13, -13],\n      [-13, -142]\n    ],\n    [\n      [24999, 59427],\n      [-8, -40],\n      [-13, 7],\n      [2, 31]\n    ],\n    [\n      [24980, 59425],\n      [6, 38],\n      [-5, 49],\n      [-21, 2],\n      [-4, -30],\n      [9, -58]\n    ],\n    [\n      [24965, 59426],\n      [6, -22],\n      [-7, -64],\n      [10, -59],\n      [-5, -37],\n      [-24, -1],\n      [0, -37],\n      [21, -39],\n      [1, -27],\n      [-15, -15],\n      [-30, 16],\n      [-3, -21],\n      [28, -74],\n      [1, -61],\n      [-22, -40],\n      [-3, -75],\n      [-12, -23]\n    ],\n    [\n      [24911, 58847],\n      [-179, -6],\n      [16, 110],\n      [23, 58],\n      [0, 23],\n      [15, 53],\n      [16, 28],\n      [3, 43],\n      [9, 7],\n      [5, 133],\n      [-22, 44],\n      [3, 15],\n      [-5, 71],\n      [-349, -1],\n      [-323, 1],\n      [-141, 0],\n      [-222, 1],\n      [-210, 1]\n    ],\n    [\n      [23358, 63503],\n      [-31, 56],\n      [8, 79],\n      [-24, 76],\n      [-2, 77],\n      [-20, 19],\n      [1, 32],\n      [-18, 26],\n      [-12, 110],\n      [1, 39],\n      [-11, 34],\n      [-1, 40],\n      [13, 42],\n      [-11, 18],\n      [-1, -33],\n      [-20, 3],\n      [1, 63]\n    ],\n    [\n      [26900, 61666],\n      [18, -20],\n      [35, 40],\n      [23, 11],\n      [5, 49],\n      [3, 98],\n      [12, 28],\n      [16, -7],\n      [6, 30],\n      [-3, 101],\n      [-10, 105],\n      [21, 52],\n      [0, 67],\n      [14, 88],\n      [12, 27],\n      [6, 37],\n      [13, -40],\n      [11, -1],\n      [12, -79],\n      [-8, -40],\n      [11, -20],\n      [9, 22],\n      [3, 42],\n      [9, 20],\n      [9, -25],\n      [4, 111],\n      [-10, 29],\n      [-3, 43],\n      [19, 19],\n      [-3, 96],\n      [8, 41],\n      [10, 12],\n      [3, 55],\n      [31, -7],\n      [3, 83],\n      [25, 76],\n      [17, -19],\n      [6, -52],\n      [11, 3],\n      [21, 47],\n      [17, 8],\n      [11, 54],\n      [11, 8],\n      [8, 48],\n      [16, 57],\n      [30, 89],\n      [16, 9],\n      [4, 83],\n      [10, 26],\n      [-11, 50],\n      [12, 48],\n      [0, 57],\n      [10, 23],\n      [-4, 60],\n      [13, -11],\n      [-2, 52],\n      [7, 20],\n      [0, 122],\n      [9, 30],\n      [0, 58],\n      [10, 48],\n      [5, 61],\n      [10, 23],\n      [5, 65],\n      [-3, 95],\n      [4, 71],\n      [-9, 84],\n      [-11, 44],\n      [9, 50],\n      [14, -1],\n      [18, 27]\n    ],\n    [\n      [27769, 63178],\n      [-3, -600],\n      [10, 7],\n      [33, 103],\n      [12, -1],\n      [10, 67],\n      [31, 60],\n      [13, 75],\n      [11, -2],\n      [28, -36],\n      [11, 54],\n      [38, 158],\n      [13, -10],\n      [-13, -14],\n      [13, -18],\n      [2, -26],\n      [20, -34],\n      [17, 1],\n      [7, -18],\n      [28, -4],\n      [14, 38],\n      [-7, 49],\n      [13, -1],\n      [-11, 32],\n      [14, -11],\n      [9, 37],\n      [19, -23],\n      [28, 87],\n      [24, -20],\n      [17, -49],\n      [8, -40],\n      [18, 20],\n      [17, -23],\n      [14, 4],\n      [0, -37],\n      [-16, -15],\n      [12, -69],\n      [19, -41],\n      [-2, -33],\n      [9, -12],\n      [5, -43],\n      [-6, -63],\n      [10, -14]\n    ],\n    [\n      [28258, 62713],\n      [-9, -45],\n      [-21, -175],\n      [-78, 209],\n      [-66, 179],\n      [-4, -62],\n      [5, -28],\n      [-6, -36],\n      [7, -11],\n      [-23, -106],\n      [6, -15],\n      [-11, -54],\n      [10, -36],\n      [-16, -62],\n      [-7, -7],\n      [-24, -88],\n      [6, -16],\n      [-14, -63],\n      [-7, 21],\n      [-15, -66],\n      [-10, -24],\n      [0, 36],\n      [-23, -71],\n      [-20, -130],\n      [-35, 101],\n      [-9, -69],\n      [-17, -82],\n      [-1, -71],\n      [-8, 1],\n      [-10, -57],\n      [-15, -138],\n      [-28, -94],\n      [-46, 53],\n      [-17, 109],\n      [-31, 47],\n      [-14, -121],\n      [3, -65],\n      [-12, -60],\n      [-22, -87],\n      [6, -44],\n      [-12, -21],\n      [-25, -81],\n      [-7, -56],\n      [6, -29],\n      [-8, -30],\n      [-6, -60],\n      [-10, -51],\n      [-18, -51],\n      [-30, -104],\n      [-21, -112],\n      [2, -36],\n      [-12, -39],\n      [4, -41],\n      [17, -34],\n      [-12, -40],\n      [-18, -34],\n      [-1, -32],\n      [13, -4],\n      [-4, -29],\n      [-49, -99],\n      [-10, 68],\n      [-12, -9],\n      [-19, -47],\n      [-41, -71],\n      [-4, 26],\n      [-21, 38],\n      [-7, -51],\n      [9, -43],\n      [-19, -47],\n      [-17, -5],\n      [-37, -27],\n      [-31, -51],\n      [-27, 75],\n      [-11, 45],\n      [-8, -21],\n      [-8, -55],\n      [-23, -17],\n      [-2, -30],\n      [-13, -29],\n      [-34, -7],\n      [-19, 48],\n      [0, 24],\n      [-12, 25],\n      [-18, 3],\n      [-7, 52],\n      [-14, 31],\n      [-2, 90],\n      [-15, 22],\n      [-1, 33],\n      [18, 34],\n      [-11, 29]\n    ],\n    [\n      [27075, 60636],\n      [-14, -4],\n      [-28, 30],\n      [-3, 37],\n      [-8, 1],\n      [-7, 40],\n      [-9, -2],\n      [-7, 42],\n      [-15, 11],\n      [-13, 134],\n      [-10, 19],\n      [-13, 61],\n      [1, 34],\n      [-15, 19],\n      [-8, 39],\n      [11, 55],\n      [-15, 22],\n      [-9, 80],\n      [-10, 45],\n      [-15, 37],\n      [0, 38],\n      [8, 0],\n      [3, 55],\n      [-4, 20],\n      [11, 33],\n      [1, 58],\n      [-8, 36],\n      [1, 90]\n    ],\n    [\n      [24442, 63943],\n      [12, 16],\n      [-2, 50],\n      [4, 90],\n      [-11, 35],\n      [13, 69],\n      [31, 43],\n      [18, -1],\n      [18, 41],\n      [1, 61],\n      [6, 49],\n      [1, 67],\n      [10, 27],\n      [14, 66],\n      [11, 19],\n      [6, 106],\n      [-1, 98],\n      [-13, 75],\n      [-13, 6],\n      [-20, 85],\n      [11, 77],\n      [2, 74],\n      [6, 55],\n      [19, 21],\n      [13, -15],\n      [23, 40],\n      [31, -6],\n      [24, 17],\n      [16, 56],\n      [10, 13],\n      [26, -1],\n      [18, 57],\n      [16, 21],\n      [-1, 66],\n      [9, 59],\n      [0, 52],\n      [9, 29],\n      [28, 49],\n      [-1, 41],\n      [8, 72],\n      [-3, 58],\n      [7, 61],\n      [-7, 37],\n      [1, 89],\n      [-13, 41],\n      [-47, 73],\n      [-15, 74],\n      [3, 60],\n      [-16, 63],\n      [-22, 37],\n      [-2, 26],\n      [-22, 35],\n      [0, 47]\n    ],\n    [\n      [24658, 66423],\n      [45, -2],\n      [227, -2],\n      [51, -5],\n      [194, -11],\n      [41, 4],\n      [152, 1],\n      [82, -5]\n    ],\n    [\n      [25450, 66403],\n      [-2, -124],\n      [-8, -97],\n      [10, -109],\n      [21, -117],\n      [12, -37],\n      [3, -54],\n      [13, -139],\n      [4, -75],\n      [14, -93],\n      [8, -20],\n      [2, -47]\n    ],\n    [\n      [25386, 60941],\n      [-8, -66],\n      [-17, -35],\n      [-11, -56],\n      [7, -105],\n      [20, -68],\n      [-6, -50],\n      [-48, -19],\n      [-12, -11],\n      [-18, -52],\n      [-14, 26],\n      [-18, -44],\n      [-2, -55],\n      [-9, -65],\n      [2, -25],\n      [17, -65],\n      [7, -66],\n      [-10, -89],\n      [-15, -10],\n      [-13, 13],\n      [-19, 52],\n      [-35, 40],\n      [-14, 39],\n      [-31, 42],\n      [-19, 5],\n      [-13, -21],\n      [-13, -42],\n      [-9, -65],\n      [-16, -52],\n      [-4, -55],\n      [14, -52]\n    ],\n    [\n      [20232, 53938],\n      [-214, 0],\n      [-254, 0],\n      [0, -524],\n      [-234, -1]\n    ],\n    [\n      [24911, 58847],\n      [4, -38],\n      [18, -49],\n      [0, -45],\n      [-24, 23],\n      [-9, -49],\n      [20, -36],\n      [-11, -33],\n      [-11, -1],\n      [-9, -52],\n      [-17, -22],\n      [-9, 21],\n      [-15, -41],\n      [6, -68],\n      [9, -17],\n      [12, 23],\n      [3, -38],\n      [-26, -42],\n      [1, -53],\n      [9, -10],\n      [-3, -40],\n      [-22, 56],\n      [-9, -9],\n      [-5, -58],\n      [9, -42],\n      [-11, -75],\n      [-8, 88],\n      [-23, -67],\n      [-3, -46],\n      [12, -6],\n      [2, 43],\n      [15, -35],\n      [-9, -47],\n      [0, -45],\n      [-16, -10],\n      [4, -47],\n      [15, -7],\n      [6, -29],\n      [-12, -43],\n      [15, -58],\n      [-10, -25],\n      [-12, 21],\n      [-9, -26],\n      [-9, -100],\n      [-25, 13],\n      [-3, -49]\n    ],\n    [\n      [24751, 57677],\n      [17, -55],\n      [0, -45],\n      [-18, -44],\n      [-31, -44],\n      [-4, 59],\n      [-11, 2],\n      [-2, -29],\n      [8, -44],\n      [-5, -25],\n      [6, -72],\n      [-14, -19],\n      [-5, 34],\n      [2, 57],\n      [-10, -27],\n      [2, -35],\n      [-7, -14],\n      [6, -40],\n      [20, -2],\n      [2, -31],\n      [-14, -50],\n      [-11, 18],\n      [1, 49],\n      [-10, -21],\n      [0, -64],\n      [12, -61],\n      [1, -27],\n      [-13, -51],\n      [6, -83],\n      [-25, -57],\n      [0, -63],\n      [-10, 1],\n      [3, 54],\n      [-19, -1],\n      [-5, -27],\n      [8, -45],\n      [-7, -30],\n      [-19, -15],\n      [-4, -71],\n      [-16, 43],\n      [-9, -29],\n      [14, -43],\n      [20, 1],\n      [2, -25],\n      [-13, -28],\n      [-16, 33],\n      [-12, -32],\n      [9, -51],\n      [11, 3],\n      [3, -24],\n      [-8, -61],\n      [-24, -6],\n      [7, -45],\n      [-11, -16],\n      [-5, 43],\n      [-16, -23],\n      [-3, -29],\n      [22, -34],\n      [-18, -78],\n      [7, -55],\n      [16, -26],\n      [-10, -34],\n      [-8, 18],\n      [-24, -2],\n      [-1, -59],\n      [10, -26],\n      [13, 14],\n      [8, -50],\n      [-12, -18],\n      [-16, 22],\n      [-7, 35],\n      [-17, -16],\n      [-2, -28],\n      [25, -51],\n      [2, -33],\n      [-28, -41],\n      [13, -63],\n      [-14, -80],\n      [18, 16],\n      [-1, 51],\n      [14, -27],\n      [-4, -54],\n      [-17, -10],\n      [-3, -19],\n      [10, -24],\n      [17, 14],\n      [10, 73],\n      [5, -32],\n      [-23, -90],\n      [0, -64],\n      [12, -68],\n      [3, 42],\n      [10, 13],\n      [2, -23],\n      [-13, -52],\n      [2, -75],\n      [-3, -23],\n      [-14, -8],\n      [-11, 14],\n      [-5, -39],\n      [23, -62],\n      [-13, -59]\n    ],\n    [\n      [24512, 55359],\n      [-219, 4],\n      [-154, 5],\n      [-157, 7],\n      [-86, 0],\n      [-185, 2]\n    ],\n    [\n      [16868, 55911],\n      [16, -5],\n      [28, -53],\n      [21, -22],\n      [1, -25],\n      [16, -61],\n      [-5, -43],\n      [-13, 25],\n      [-26, 7],\n      [-6, 35],\n      [0, 74],\n      [-20, 16],\n      [-12, 52]\n    ],\n    [\n      [16867, 55390],\n      [9, 4],\n      [22, -117],\n      [40, -130],\n      [-10, 4],\n      [-11, -22],\n      [-17, 44],\n      [-13, 72],\n      [-14, 119],\n      [-6, 26]\n    ],\n    [\n      [16741, 55926],\n      [8, 7],\n      [1, -41],\n      [-11, 7],\n      [2, 27]\n    ],\n    [\n      [16637, 56552],\n      [8, -17],\n      [11, 14],\n      [0, -30],\n      [-17, -4],\n      [-9, 21],\n      [7, 16]\n    ],\n    [\n      [16596, 55679],\n      [14, 7],\n      [20, -35],\n      [8, -31],\n      [-13, -15],\n      [-20, 21],\n      [-9, 53]\n    ],\n    [\n      [16501, 56608],\n      [18, -7],\n      [13, -22],\n      [15, 5],\n      [19, -43],\n      [19, -4],\n      [7, 39],\n      [20, -20],\n      [-11, -43],\n      [-28, -11],\n      [-17, -31],\n      [-42, 24],\n      [-1, 61],\n      [-12, 52]\n    ],\n    [\n      [16410, 56520],\n      [22, 8],\n      [9, 21],\n      [13, -8],\n      [13, 19],\n      [0, -48],\n      [18, -13],\n      [1, -48],\n      [-41, -54],\n      [-16, 37],\n      [-19, 86]\n    ],\n    [\n      [16354, 56562],\n      [16, 17],\n      [6, 28],\n      [6, -35],\n      [13, -26],\n      [-21, -6],\n      [-20, 22]\n    ],\n    [\n      [15305, 65829],\n      [155, -4],\n      [9, 6],\n      [77, -1],\n      [56, 12],\n      [28, -8],\n      [115, 2],\n      [37, 5],\n      [95, -1],\n      [45, -5],\n      [154, -8],\n      [114, -4],\n      [197, 0],\n      [92, 2]\n    ],\n    [\n      [16479, 65825],\n      [0, -1]\n    ],\n    [\n      [16479, 65824],\n      [0, -1448],\n      [1, -34],\n      [0, -756],\n      [-1, -393],\n      [-1, -13],\n      [0, -457],\n      [-1, -122],\n      [2, -263],\n      [26, -77],\n      [115, -330],\n      [114, -336],\n      [63, -182],\n      [99, -298],\n      [125, -377],\n      [62, -186],\n      [127, -394],\n      [313, -989],\n      [234, -759],\n      [70, -234],\n      [147, -492]\n    ],\n    [\n      [17950, 55027],\n      [-416, -126],\n      [-254, -89],\n      [-3, 98],\n      [-9, 62],\n      [-8, 20],\n      [-14, -23],\n      [-3, 66],\n      [1, 71],\n      [-8, 41],\n      [9, 61],\n      [-9, 161],\n      [-13, 127],\n      [-9, 54],\n      [-40, 193],\n      [-25, 61],\n      [-10, 51],\n      [-15, 37],\n      [-9, -2],\n      [-19, 95],\n      [-26, 59],\n      [-14, 15],\n      [-20, 57],\n      [-25, 88],\n      [-24, 39],\n      [-2, -47],\n      [-21, -23],\n      [-18, 14],\n      [-10, 25],\n      [-15, 6],\n      [-4, 38],\n      [9, 34],\n      [1, 43],\n      [-14, 116],\n      [-11, 64],\n      [-17, 50],\n      [-35, 1],\n      [-22, -8],\n      [-16, -36],\n      [-14, 38],\n      [-28, 16],\n      [-37, 59],\n      [-12, 2],\n      [-24, 53],\n      [-17, 141],\n      [-10, 10],\n      [-17, 53],\n      [-4, -3],\n      [-20, 65],\n      [-21, 25],\n      [-6, 20],\n      [-32, 4],\n      [-16, -24],\n      [-18, 25],\n      [-22, -10],\n      [-37, 60],\n      [-23, 0],\n      [-15, 15],\n      [-44, -7],\n      [-48, -22],\n      [-1, 31],\n      [-13, 66],\n      [-16, 30],\n      [-12, -4],\n      [-6, 32],\n      [13, 143],\n      [-11, 60],\n      [8, 119],\n      [-17, 54],\n      [9, 115],\n      [1, 140],\n      [-18, 56],\n      [-14, 7],\n      [-3, -21],\n      [-27, 55],\n      [-11, 48],\n      [10, 131],\n      [-2, 50],\n      [-11, 53],\n      [-27, 14],\n      [-27, 102],\n      [-18, 101],\n      [-24, 25],\n      [-17, 66],\n      [-5, 81],\n      [-16, 47],\n      [-7, 37],\n      [-14, 35],\n      [-6, 99],\n      [-5, 35],\n      [-20, 29],\n      [-15, 104],\n      [-25, 94],\n      [-33, 64],\n      [-11, 45],\n      [-8, 80],\n      [1, 42],\n      [-11, 101],\n      [2, 92],\n      [-11, 16],\n      [10, 74],\n      [18, -38],\n      [9, 30],\n      [7, 61],\n      [8, 141],\n      [-21, 149],\n      [-12, 43],\n      [-10, 11],\n      [-9, -28],\n      [-37, 2],\n      [-28, 68],\n      [-22, 102],\n      [-14, 18],\n      [-2, 31],\n      [-17, 60],\n      [-4, 62],\n      [5, 129],\n      [-12, 89],\n      [-2, 52],\n      [-12, 14],\n      [-6, 33],\n      [-1, 64],\n      [5, 27],\n      [2, 77],\n      [-6, 134],\n      [14, 28],\n      [16, 8],\n      [6, -24],\n      [7, -88],\n      [-9, -9],\n      [11, -107],\n      [-2, -27],\n      [27, -23],\n      [27, -80],\n      [8, 5],\n      [14, -63],\n      [12, 3],\n      [-6, 40],\n      [-12, 19],\n      [-10, 87],\n      [-7, 109],\n      [-21, 54],\n      [-2, 46],\n      [-22, 26],\n      [9, 74],\n      [-7, 68],\n      [-15, -1],\n      [-14, 68],\n      [8, -9],\n      [9, 26],\n      [0, 40],\n      [19, -2],\n      [10, 39],\n      [-10, 71],\n      [-26, 44],\n      [-13, -30],\n      [-14, -6],\n      [2, -47],\n      [-5, -46],\n      [15, -51],\n      [-12, -25],\n      [-4, -44],\n      [19, -56],\n      [-7, -14],\n      [-11, 29],\n      [7, -71],\n      [-15, -16],\n      [-9, 38],\n      [-26, 61],\n      [-13, -12],\n      [-23, 67],\n      [-10, 53],\n      [-17, 33],\n      [-16, 8],\n      [-20, -33],\n      [14, 127],\n      [3, 48],\n      [-12, 92],\n      [7, 20],\n      [-16, 70],\n      [-11, -10],\n      [-1, 67],\n      [-17, 106],\n      [-20, 51],\n      [-14, 19],\n      [-22, 64],\n      [-37, 176],\n      [-14, 29],\n      [-8, 41],\n      [-31, 90],\n      [-24, 116],\n      [14, 78],\n      [-1, 42],\n      [-14, 126],\n      [-16, 123],\n      [-7, 105],\n      [3, 99],\n      [13, 132],\n      [-5, 52],\n      [0, 65],\n      [-14, 92],\n      [-4, 108],\n      [-16, 36],\n      [-6, 55],\n      [-35, 133],\n      [-7, 6],\n      [0, 43],\n      [-8, 43],\n      [-22, 32],\n      [-49, 151],\n      [4, 63],\n      [-4, 70],\n      [-13, 74],\n      [9, 98],\n      [14, 109],\n      [42, 265],\n      [11, 95],\n      [7, 119],\n      [-12, 37],\n      [-1, 97],\n      [4, 2],\n      [11, 99],\n      [12, 244],\n      [-5, 126],\n      [-15, 128],\n      [-8, 96],\n      [-9, -4],\n      [-17, 54],\n      [10, 74],\n      [5, 110],\n      [-3, 67]\n    ],\n    [\n      [28861, 63044],\n      [-1, 28]\n    ],\n    [\n      [28874, 63137],\n      [-6, 7],\n      [-22, -81],\n      [2, -39],\n      [11, -31],\n      [1, -49],\n      [-8, -28],\n      [0, -41],\n      [14, -52],\n      [7, -58],\n      [21, -62],\n      [10, -68],\n      [3, -58],\n      [-5, -35],\n      [2, -126],\n      [16, -48],\n      [7, -43],\n      [2, -74],\n      [34, -137],\n      [16, -29],\n      [10, 24],\n      [4, -36],\n      [5, -129],\n      [4, -244]\n    ],\n    [\n      [29002, 61700],\n      [-105, 1],\n      [-74, 9],\n      [-2, 72],\n      [-25, 1311],\n      [0, 86]\n    ],\n    [\n      [28426, 62262],\n      [21, 70],\n      [37, -118],\n      [-36, -118]\n    ],\n    [\n      [28448, 62096],\n      [0, 93],\n      [-22, 73]\n    ],\n    [\n      [6433, 39922],\n      [2, 44],\n      [19, 76],\n      [12, 7],\n      [13, 93],\n      [16, 52],\n      [3, 58],\n      [-17, 94],\n      [-4, 45],\n      [-1, 105],\n      [8, 37],\n      [18, -9],\n      [18, -32],\n      [3, -32],\n      [22, -44],\n      [15, -47],\n      [12, 6],\n      [25, -32],\n      [39, -77],\n      [13, -19],\n      [22, -61],\n      [16, -57],\n      [17, -76],\n      [-3, -47],\n      [1, -90],\n      [8, -10],\n      [16, 12],\n      [7, -57],\n      [-1, -57],\n      [22, -82],\n      [22, -39],\n      [5, -21],\n      [-4, -44],\n      [-13, -51],\n      [-17, -47],\n      [-14, -56],\n      [-23, -38],\n      [-20, -47],\n      [-20, -18],\n      [-16, 15],\n      [-9, -9],\n      [-18, -66],\n      [-16, -25],\n      [-13, -48],\n      [-14, -16],\n      [-12, -59],\n      [1, -33],\n      [-8, -37],\n      [-5, -59],\n      [-20, -63],\n      [-15, 61],\n      [-22, 52],\n      [-22, 29],\n      [-10, 95],\n      [5, 113],\n      [4, 151],\n      [-10, 106],\n      [1, 46],\n      [-9, 12],\n      [-5, 114],\n      [-7, 66],\n      [-9, 8],\n      [-8, 108]\n    ],\n    [\n      [6254, 41293],\n      [5, 69],\n      [11, 56],\n      [14, 6],\n      [13, -33],\n      [10, -78],\n      [10, -50],\n      [24, 29],\n      [18, 35],\n      [26, -21],\n      [0, -16],\n      [17, -51],\n      [10, -15],\n      [5, -40],\n      [31, -37],\n      [5, -32],\n      [0, -52],\n      [-8, -43],\n      [-13, -40],\n      [-6, 3],\n      [-17, -36],\n      [-14, 10],\n      [-30, -53],\n      [-21, -9],\n      [-17, 26],\n      [-7, 210],\n      [-7, 20],\n      [-14, -24],\n      [-26, 50],\n      [-13, 58],\n      [-6, 58]\n    ],\n    [\n      [6253, 40841],\n      [7, 29],\n      [28, 57],\n      [10, -30],\n      [-4, -44],\n      [5, -17],\n      [-13, -19],\n      [-5, 15],\n      [-18, -23],\n      [-10, 32]\n    ],\n    [\n      [6153, 41274],\n      [7, 27],\n      [13, 5],\n      [26, -19],\n      [17, -60],\n      [8, -51],\n      [-9, -65],\n      [-19, -29],\n      [-17, -5],\n      [-7, 60],\n      [-3, 73],\n      [-14, 32],\n      [-2, 32]\n    ],\n    [\n      [6084, 41504],\n      [6, 52],\n      [9, 29],\n      [-2, 58],\n      [17, -2],\n      [3, -14],\n      [54, -29],\n      [10, 34],\n      [4, -42],\n      [22, -13],\n      [27, 18],\n      [17, -25],\n      [-8, -55],\n      [-18, -51],\n      [-20, -21],\n      [-35, 32],\n      [-26, 31],\n      [-15, -14],\n      [-29, -5],\n      [-16, 17]\n    ],\n    [\n      [5814, 42059],\n      [43, 9],\n      [13, 49],\n      [4, 35],\n      [13, 48],\n      [14, 15],\n      [6, -27],\n      [6, -70],\n      [20, -84],\n      [4, -52],\n      [-4, -15],\n      [3, -47],\n      [18, -55],\n      [3, 57],\n      [12, -2],\n      [-4, -64],\n      [8, -24],\n      [-1, -29],\n      [17, -70],\n      [-12, -37],\n      [-11, 18],\n      [-21, -29],\n      [-6, 26],\n      [-17, 31],\n      [-25, 11],\n      [-30, -20],\n      [-7, 4],\n      [-7, 84],\n      [-11, 34],\n      [-1, 31],\n      [-14, 67],\n      [0, 61],\n      [-13, 45]\n    ],\n    [\n      [5394, 42585],\n      [1, 40],\n      [11, 38],\n      [4, 49],\n      [33, 72],\n      [8, 26],\n      [23, -18],\n      [3, 25],\n      [16, -11],\n      [8, 14],\n      [15, -20],\n      [10, -37],\n      [5, -45],\n      [0, -46],\n      [-11, -63],\n      [1, -106],\n      [-4, -28],\n      [-28, -78],\n      [-8, 15],\n      [-36, 12],\n      [-18, 71],\n      [-24, 29],\n      [-9, 61]\n    ],\n    [\n      [5266, 42374],\n      [4, 43],\n      [12, 44],\n      [19, 45],\n      [2, 38],\n      [11, 9],\n      [2, -31],\n      [-5, -57],\n      [2, -36],\n      [-20, -28],\n      [-16, -97],\n      [-12, 30],\n      [1, 40]\n    ],\n    [\n      [24498, 67577],\n      [-5, -52],\n      [10, -50],\n      [-1, -74],\n      [27, -41],\n      [13, -76],\n      [-18, -60],\n      [-6, -52],\n      [-9, -24],\n      [1, -108],\n      [8, -88],\n      [0, -68],\n      [12, -25],\n      [13, -169],\n      [33, -64],\n      [47, -37],\n      [17, -20],\n      [18, -109],\n      [0, -37]\n    ],\n    [\n      [23231, 64184],\n      [4, 28],\n      [-10, 56],\n      [-13, 16],\n      [-15, 58],\n      [2, 37],\n      [13, 35],\n      [-4, 83],\n      [10, 51],\n      [-7, 27],\n      [2, 66],\n      [-9, 20],\n      [1, 42],\n      [-7, 30],\n      [5, 27],\n      [-5, 93],\n      [12, 17],\n      [-24, 24],\n      [4, 37],\n      [-5, 63],\n      [13, 41],\n      [-20, 27],\n      [7, 29],\n      [-1, 116],\n      [-20, 10],\n      [2, 77],\n      [-9, 1],\n      [-2, -37],\n      [-15, 28],\n      [3, 56],\n      [-11, 39],\n      [7, 39],\n      [-8, 41],\n      [11, 18],\n      [-6, 54],\n      [8, 20],\n      [3, 46],\n      [-12, 23],\n      [-1, 38],\n      [-14, 61],\n      [6, 11],\n      [3, 66],\n      [-16, 6],\n      [1, 30],\n      [-15, 11],\n      [5, 16],\n      [-15, 25],\n      [1, 83],\n      [-22, 56],\n      [-3, 48],\n      [10, 25],\n      [-14, 103],\n      [-11, 29],\n      [0, 76],\n      [9, 44],\n      [-4, 44],\n      [-14, 8]\n    ],\n    [\n      [26280, 62461],\n      [18, 48],\n      [7, -2],\n      [15, -54],\n      [21, -28],\n      [14, 29],\n      [14, -3],\n      [8, 29],\n      [8, -8],\n      [4, -69],\n      [29, -32],\n      [10, -84],\n      [16, -83],\n      [0, -66],\n      [5, -26],\n      [40, -41],\n      [33, 19],\n      [29, -46],\n      [3, -34],\n      [15, -26],\n      [5, -50],\n      [28, -29],\n      [14, 66],\n      [26, 22],\n      [15, -32],\n      [28, -20],\n      [11, -24],\n      [5, -43],\n      [13, 24],\n      [30, -1],\n      [10, 53],\n      [18, 34],\n      [9, 39],\n      [15, 0],\n      [21, 32],\n      [7, -33],\n      [-3, -44],\n      [9, -111],\n      [13, -37],\n      [21, -6],\n      [21, -79],\n      [13, -35],\n      [2, -44]\n    ],\n    [\n      [27075, 60636],\n      [-108, -317],\n      [-37, -39],\n      [-22, -41],\n      [-19, -49],\n      [-25, -45],\n      [0, -86],\n      [-16, -39],\n      [-12, -2],\n      [-12, -33],\n      [3, -59],\n      [-6, -45],\n      [-25, -36],\n      [-29, -4],\n      [-16, -80],\n      [-2, -50],\n      [-16, -4],\n      [-33, -35],\n      [-39, -52],\n      [-21, 2],\n      [-33, -49],\n      [-8, -27]\n    ],\n    [\n      [26599, 59546],\n      [-4, -21],\n      [-83, 8],\n      [-79, 2],\n      [-76, 5],\n      [-83, 11],\n      [-51, 16],\n      [-74, 9],\n      [-55, -14],\n      [-96, 8],\n      [-56, 10],\n      [-83, 22],\n      [-49, 4],\n      [-16, -22],\n      [-7, 22],\n      [-146, -12],\n      [-92, -2],\n      [-114, -8],\n      [1, 35],\n      [-61, 17],\n      [10, -147],\n      [-6, -64],\n      [-137, 6],\n      [-126, 0],\n      [-84, 6],\n      [-33, -10]\n    ],\n    [\n      [24980, 59425],\n      [-15, 1]\n    ],\n    [\n      [28739, 61120],\n      [-14, 0]\n    ],\n    [\n      [28725, 61120],\n      [-1, 72],\n      [8, 28],\n      [11, -40],\n      [-4, -60]\n    ],\n    [\n      [28711, 61320],\n      [2, 79],\n      [11, 13],\n      [7, -30],\n      [5, -118],\n      [-15, 21],\n      [4, 27],\n      [-14, 8]\n    ],\n    [\n      [28627, 62072],\n      [5, 20],\n      [5, -46],\n      [-10, 26]\n    ],\n    [\n      [29002, 61700],\n      [-1, -43],\n      [-9, -105],\n      [-5, -15],\n      [-20, -211],\n      [-18, -120]\n    ],\n    [\n      [28949, 61206],\n      [-107, -38],\n      [-6, -55],\n      [-6, 4]\n    ],\n    [\n      [28830, 61117],\n      [-13, 30],\n      [-19, -4],\n      [-22, -64],\n      [-9, -1],\n      [-1, 67],\n      [7, 70],\n      [17, 28],\n      [-17, 2],\n      [2, 45],\n      [11, 40],\n      [-21, 9],\n      [-12, -33],\n      [-4, 28],\n      [5, 58],\n      [26, 27],\n      [-6, 39],\n      [-9, -13],\n      [-4, 36],\n      [15, 112],\n      [-15, -24],\n      [-7, -47],\n      [0, -60],\n      [-8, -1],\n      [-11, 77],\n      [11, 9],\n      [-1, 53],\n      [-8, 10],\n      [-4, -49],\n      [-9, -33],\n      [6, -27],\n      [-9, -62],\n      [-4, 29],\n      [-17, -23],\n      [-9, 12],\n      [-16, 83],\n      [-9, 13],\n      [2, 43],\n      [-24, 151],\n      [20, 14],\n      [5, 39],\n      [-8, -7],\n      [-9, 51],\n      [8, 40],\n      [12, 22],\n      [6, -25],\n      [12, 26],\n      [1, -36],\n      [22, -9],\n      [13, -39],\n      [4, 10],\n      [-16, 69],\n      [-17, 14],\n      [-8, 42],\n      [-7, -3],\n      [-16, 77],\n      [-5, -28],\n      [-12, 20],\n      [-1, -59],\n      [-7, 8],\n      [3, 101],\n      [18, 92],\n      [14, -45],\n      [8, 10],\n      [-3, 124],\n      [-8, 17],\n      [-17, -47],\n      [-12, 4],\n      [1, -48],\n      [-12, -17],\n      [4, 104],\n      [16, 101],\n      [7, -51],\n      [21, -11],\n      [11, 31],\n      [-6, 54],\n      [11, 55],\n      [-16, -9],\n      [-3, -52],\n      [4, -31],\n      [-12, 17],\n      [3, 63],\n      [-6, 59],\n      [-7, 14],\n      [16, 136],\n      [12, 42],\n      [-2, 24],\n      [14, 25],\n      [7, 37],\n      [30, -6],\n      [-11, 24],\n      [18, 70],\n      [-10, 6],\n      [12, 122],\n      [-35, -24],\n      [-6, -48],\n      [12, -24],\n      [4, -32],\n      [-12, -14],\n      [-34, -97],\n      [-7, 31],\n      [7, 54],\n      [-8, 28],\n      [0, -44],\n      [-9, -51],\n      [8, -34],\n      [-7, -46],\n      [-6, 96],\n      [-15, 14],\n      [6, -103],\n      [-8, 8],\n      [-6, -42],\n      [12, -22],\n      [-21, -44],\n      [-7, -28],\n      [-13, 8],\n      [-2, 26],\n      [-22, 46],\n      [3, -46],\n      [9, -13],\n      [2, -41],\n      [27, -54],\n      [2, -67],\n      [-5, -25],\n      [13, -48],\n      [-23, -45],\n      [7, -37],\n      [-3, -40],\n      [-9, 4],\n      [-7, -55],\n      [6, -53],\n      [-17, -58],\n      [9, -50],\n      [-2, -54],\n      [6, -73],\n      [-2, -89],\n      [7, -65],\n      [22, -80],\n      [8, -62],\n      [-9, -45],\n      [-14, 7],\n      [9, -42],\n      [9, 22],\n      [8, -14],\n      [-7, -47],\n      [4, -48],\n      [18, -92],\n      [-5, -22],\n      [5, -97],\n      [-9, 19],\n      [-11, 58],\n      [-8, 4],\n      [-5, 64],\n      [-8, -9],\n      [-2, -57],\n      [-7, 38],\n      [-8, -3],\n      [-5, 48],\n      [-12, 45],\n      [-23, 23],\n      [-35, 3],\n      [-8, 129],\n      [-8, 13],\n      [-4, -31],\n      [10, -68],\n      [-2, -22],\n      [-22, 43],\n      [-2, 34],\n      [-13, 31],\n      [-12, 114],\n      [-20, -44],\n      [-33, -56],\n      [-12, 27],\n      [-7, 115],\n      [11, 82],\n      [15, 57],\n      [20, 30],\n      [-5, 10]\n    ],\n    [\n      [28423, 61914],\n      [-1, 45],\n      [7, 27],\n      [18, 25],\n      [1, 85]\n    ],\n    [\n      [28426, 62262],\n      [-9, 37],\n      [-20, 6],\n      [-8, 17],\n      [1, 48],\n      [-26, 42],\n      [-34, 15],\n      [-6, 39],\n      [-10, 13],\n      [1, 58],\n      [9, 18],\n      [7, 49],\n      [-23, 43],\n      [-6, 45],\n      [-15, -1],\n      [-16, 25],\n      [-13, -3]\n    ],\n    [\n      [26327, 70327],\n      [8, 17],\n      [9, -60],\n      [65, -63],\n      [-17, -58],\n      [-23, 18],\n      [-14, 61],\n      [-28, 85]\n    ],\n    [\n      [26120, 70229],\n      [5, 40],\n      [7, -20],\n      [-12, -20]\n    ],\n    [\n      [26084, 70289],\n      [21, -39],\n      [-4, -36],\n      [-19, 38],\n      [2, 37]\n    ],\n    [\n      [26055, 70019],\n      [7, 48],\n      [3, 69],\n      [6, 15],\n      [1, 57],\n      [18, -7],\n      [-1, -85],\n      [4, -83],\n      [-19, -44],\n      [-19, 30]\n    ],\n    [\n      [26035, 70180],\n      [13, 8],\n      [-5, -54],\n      [-7, 1],\n      [-1, 45]\n    ],\n    [\n      [25984, 69839],\n      [13, -17],\n      [1, -59],\n      [-14, 76]\n    ],\n    [\n      [25933, 69486],\n      [6, 23],\n      [19, -25],\n      [-6, -96],\n      [-17, 52],\n      [-2, 46]\n    ],\n    [\n      [25908, 69335],\n      [11, 44],\n      [6, -47],\n      [-17, 3]\n    ],\n    [\n      [25759, 70041],\n      [20, -64],\n      [-8, -22],\n      [-4, 36],\n      [-14, 43],\n      [6, 7]\n    ],\n    [\n      [25722, 65552],\n      [30, 68],\n      [27, 87],\n      [37, 261],\n      [34, 146],\n      [19, 134],\n      [10, 99],\n      [10, 176],\n      [-1, 58],\n      [6, 87],\n      [-1, 163],\n      [-6, 182],\n      [-11, 120],\n      [-35, 230],\n      [-11, 94],\n      [-12, 138],\n      [-17, 119],\n      [0, 48],\n      [22, 102],\n      [7, 50],\n      [1, 77],\n      [-9, 134],\n      [-14, 90],\n      [4, 32],\n      [20, 51],\n      [24, 151],\n      [21, 112],\n      [4, 124],\n      [9, 134],\n      [-11, 112],\n      [1, 33],\n      [27, 43],\n      [20, 15],\n      [6, 93],\n      [-2, 74],\n      [10, 36],\n      [13, -18],\n      [16, 80],\n      [18, -35],\n      [17, 13],\n      [8, 32],\n      [9, 86],\n      [10, 16],\n      [15, 94],\n      [11, 47],\n      [9, -7],\n      [12, 35],\n      [3, -39],\n      [-19, -32],\n      [-3, -42],\n      [12, -81],\n      [-23, -81],\n      [13, 19],\n      [0, -74],\n      [-6, -7],\n      [-8, -84],\n      [7, -95],\n      [8, -2],\n      [19, 145],\n      [3, 98],\n      [13, 20],\n      [-8, -158],\n      [-15, -44],\n      [-6, -67],\n      [14, -14],\n      [8, 65],\n      [7, 13],\n      [22, 135],\n      [5, 78],\n      [-1, 56],\n      [4, 82],\n      [-6, 85],\n      [5, 94],\n      [17, 49],\n      [10, 3],\n      [18, 48],\n      [18, 16],\n      [25, -7],\n      [26, 14],\n      [12, 20],\n      [-1, 33],\n      [-33, 17],\n      [-14, 47],\n      [-8, 114],\n      [16, 75],\n      [13, 14],\n      [20, 69],\n      [-2, 31],\n      [-18, 27],\n      [60, -15],\n      [7, 49],\n      [61, -102],\n      [26, -58],\n      [13, 20],\n      [11, -16],\n      [13, 10],\n      [32, -34],\n      [24, -85],\n      [3, -57],\n      [17, -27],\n      [33, 4],\n      [8, -9],\n      [29, -77],\n      [23, -7],\n      [34, -71],\n      [29, 6],\n      [21, -78],\n      [11, -25],\n      [-9, -27],\n      [15, -96],\n      [11, -30],\n      [14, -133],\n      [-20, 21],\n      [-16, 34],\n      [-15, -41],\n      [4, -110],\n      [12, -44],\n      [21, -26],\n      [5, -59],\n      [1, -98],\n      [7, -37],\n      [-4, -71],\n      [-8, -67],\n      [2, -65],\n      [-5, -111],\n      [-1, -121],\n      [-12, -15],\n      [-14, -64],\n      [-24, 2],\n      [-8, -30],\n      [-8, -108],\n      [-4, -115],\n      [-19, -5],\n      [-8, -19],\n      [0, -49],\n      [-42, -6],\n      [-13, -35],\n      [-9, -76],\n      [-5, -124],\n      [-8, -42],\n      [13, -91],\n      [16, -32],\n      [9, 33],\n      [5, -38],\n      [20, -21],\n      [13, -38],\n      [10, 16],\n      [28, 120],\n      [14, 0],\n      [7, 25],\n      [-7, 51],\n      [9, 44],\n      [9, 87],\n      [4, -50],\n      [19, 31],\n      [5, 29],\n      [-21, 31],\n      [24, -3],\n      [11, 24],\n      [5, 41],\n      [23, 10],\n      [34, 28],\n      [9, 45],\n      [31, 30],\n      [11, -30],\n      [23, -25],\n      [15, -39],\n      [17, -123],\n      [10, -37],\n      [7, -97],\n      [5, -208],\n      [17, -178],\n      [4, -247],\n      [10, -143],\n      [18, -110],\n      [2, -48],\n      [-11, -46],\n      [-7, -145],\n      [4, -47],\n      [-12, -113],\n      [-4, -67],\n      [-18, -66],\n      [-15, 4],\n      [-12, -42],\n      [1, 66],\n      [-9, 27],\n      [10, 16],\n      [15, 62],\n      [-14, 26],\n      [-15, -5],\n      [-19, -34],\n      [-7, -32],\n      [9, -27],\n      [2, -45],\n      [-15, 4],\n      [-11, -52],\n      [1, -84],\n      [-7, -77],\n      [-17, -53],\n      [-30, -25],\n      [-18, -97],\n      [2, -127],\n      [-3, -44],\n      [-15, -25],\n      [-1, -70],\n      [-16, -39],\n      [-6, -39],\n      [-13, -4],\n      [-7, -65],\n      [-11, -11],\n      [-17, -72],\n      [5, -79],\n      [-8, -9]\n    ],\n    [\n      [26661, 65520],\n      [-86, -11],\n      [-167, -20],\n      [-124, -12]\n    ],\n    [\n      [25045, 72671],\n      [21, 69],\n      [95, 141],\n      [7, -2],\n      [43, 98],\n      [31, 42],\n      [6, -11],\n      [28, 29],\n      [-1, -28],\n      [-12, -16],\n      [-30, -80],\n      [0, -30],\n      [-25, -55],\n      [-51, -53],\n      [-42, -66],\n      [2, -20],\n      [23, 0],\n      [-59, -73],\n      [-18, 3],\n      [-18, 52]\n    ],\n    [\n      [24721, 71146],\n      [19, 40],\n      [12, 3],\n      [39, 49],\n      [38, 34],\n      [31, 77],\n      [19, 64],\n      [16, 27],\n      [33, 17],\n      [15, -17],\n      [29, 27],\n      [22, -3],\n      [52, 75],\n      [30, 94],\n      [22, 5],\n      [29, 23],\n      [10, 39],\n      [5, 51],\n      [25, 65],\n      [14, 16],\n      [30, 82],\n      [23, 23],\n      [21, 56],\n      [11, 54],\n      [20, 52],\n      [58, 85],\n      [56, 25],\n      [50, -7],\n      [23, -39],\n      [1, -45],\n      [-11, 5],\n      [-17, -24],\n      [-19, 13],\n      [-21, -10],\n      [5, -47],\n      [-32, -57],\n      [-30, -95],\n      [-19, -20],\n      [-5, -74],\n      [-7, 9],\n      [-7, -52],\n      [-14, -26],\n      [-5, -67],\n      [-12, -48],\n      [-9, -6],\n      [-12, -164],\n      [6, -52],\n      [-9, -35],\n      [11, 3],\n      [20, 87],\n      [3, 44],\n      [7, -13],\n      [29, 80],\n      [28, 43],\n      [-12, -55],\n      [-12, -24],\n      [-15, -77],\n      [30, 84],\n      [26, 18],\n      [14, -13],\n      [37, 1],\n      [15, -30],\n      [8, 8],\n      [17, -35],\n      [8, -39],\n      [15, 11],\n      [22, -63],\n      [3, -61],\n      [17, -49],\n      [6, -47],\n      [14, -49],\n      [19, -15],\n      [-2, -79],\n      [11, -28],\n      [26, -15],\n      [42, 10],\n      [25, 43],\n      [11, -8],\n      [14, -72],\n      [12, -27],\n      [19, -4],\n      [8, 46],\n      [16, -7],\n      [9, -38],\n      [4, 69],\n      [-7, 53],\n      [16, 20],\n      [7, -32],\n      [-6, -56],\n      [17, -26],\n      [26, 72],\n      [40, 62],\n      [59, 110],\n      [11, -21],\n      [61, 42],\n      [46, -16],\n      [35, -3],\n      [30, 7],\n      [62, 85],\n      [24, 12],\n      [30, -7],\n      [32, 14],\n      [-22, -84],\n      [-2, -135],\n      [2, -45],\n      [-8, -19],\n      [9, -51],\n      [16, -8],\n      [9, 16],\n      [6, -26],\n      [15, 3],\n      [17, -28],\n      [34, 49],\n      [13, -4],\n      [11, -46],\n      [-1, -35],\n      [25, 28],\n      [7, -7],\n      [10, 65],\n      [19, 24],\n      [23, -19],\n      [11, 9],\n      [8, 39],\n      [27, -5],\n      [5, -30],\n      [-10, -100],\n      [7, -120],\n      [1, -95],\n      [-29, -2],\n      [-8, -65],\n      [15, -12],\n      [5, 21],\n      [15, -4],\n      [8, -38],\n      [19, -19],\n      [-13, -40],\n      [24, -75],\n      [12, -1],\n      [20, -45],\n      [8, 38],\n      [14, -35],\n      [8, 26],\n      [-16, 100],\n      [14, -15],\n      [41, 13],\n      [12, -15],\n      [14, -91],\n      [16, -31],\n      [-10, -64],\n      [-14, -20],\n      [-27, 39],\n      [-31, -16],\n      [-31, 42],\n      [-11, -12],\n      [-27, 1],\n      [-27, 23],\n      [-60, -26],\n      [-13, -28],\n      [-37, 69],\n      [-15, 48],\n      [-13, -7],\n      [-13, 30],\n      [-10, -41],\n      [2, -51],\n      [-15, -32],\n      [1, -45],\n      [9, -63],\n      [-12, -20],\n      [-24, 42],\n      [-3, 31],\n      [-21, 37],\n      [-5, 30],\n      [-22, 64],\n      [-38, 46],\n      [-13, -7],\n      [-33, 49],\n      [-18, -5],\n      [-13, 23],\n      [-5, -20],\n      [-19, 11],\n      [-25, -75],\n      [-17, -73],\n      [-9, -8],\n      [-32, 23],\n      [-23, -15],\n      [-8, -22],\n      [2, -34],\n      [-23, 37],\n      [-21, 17],\n      [-24, -14],\n      [-10, 11],\n      [-23, -24],\n      [-13, -42],\n      [-2, -63],\n      [-9, -72],\n      [-14, 4],\n      [-7, -39],\n      [-22, -15],\n      [-6, -46],\n      [-13, -3],\n      [0, -45],\n      [-12, -9],\n      [4, -61],\n      [-20, 32],\n      [-9, 40],\n      [12, 27],\n      [1, 34],\n      [11, 31],\n      [1, 40],\n      [13, -4],\n      [15, 87],\n      [-3, 43],\n      [-12, 10],\n      [-18, -75],\n      [-38, 24],\n      [3, -51],\n      [-13, -47],\n      [-5, -56],\n      [-30, -31],\n      [-5, -27],\n      [-6, 39],\n      [3, 55],\n      [-4, 67],\n      [-8, 32],\n      [-10, -19],\n      [-5, -120],\n      [3, -12],\n      [-31, -55],\n      [-26, -129],\n      [-17, -146],\n      [-19, -65],\n      [-20, -112],\n      [-41, -174],\n      [6, -33]\n    ],\n    [\n      [25508, 69434],\n      [-19, 14],\n      [-8, 47],\n      [-13, 28],\n      [-2, 29],\n      [15, 118],\n      [11, 48],\n      [-2, 34],\n      [-11, 25],\n      [-16, -47],\n      [-27, -10]\n    ],\n    [\n      [25436, 69720],\n      [0, 0]\n    ],\n    [\n      [25436, 69720],\n      [-7, 47],\n      [7, 24],\n      [-3, 38],\n      [13, 34],\n      [6, 40],\n      [-3, 47],\n      [8, 69],\n      [-14, 75],\n      [12, 13],\n      [-8, 44],\n      [-13, 18],\n      [-6, 33],\n      [-24, 4],\n      [-9, 43],\n      [-21, -18],\n      [-18, 45],\n      [17, 52],\n      [-7, 21],\n      [0, 47],\n      [-40, 48],\n      [-14, -14],\n      [-24, 47],\n      [-12, -15],\n      [-21, 21],\n      [-2, 25],\n      [-27, -2],\n      [-3, -32],\n      [-14, 0],\n      [-4, 29],\n      [-17, 16],\n      [-12, -13],\n      [-86, 142],\n      [-287, 231],\n      [1, 27],\n      [-28, 167],\n      [-27, 16],\n      [-10, 24]\n    ],\n    [\n      [24739, 71113],\n      [0, 0]\n    ],\n    [\n      [24739, 71113],\n      [-12, -6],\n      [-6, 39]\n    ],\n    [\n      [25252, 52115],\n      [30, -13],\n      [-14, -20],\n      [-12, 9],\n      [-4, 24]\n    ],\n    [\n      [25179, 52148],\n      [16, 13],\n      [30, -29],\n      [6, -15],\n      [-24, 5],\n      [-28, 26]\n    ],\n    [\n      [25119, 52114],\n      [15, 7],\n      [15, 31],\n      [-4, -29],\n      [-21, -27],\n      [-5, 18]\n    ],\n    [\n      [25071, 52140],\n      [21, -1],\n      [8, 13],\n      [-5, -43],\n      [-10, -7],\n      [-17, 26],\n      [3, 12]\n    ],\n    [\n      [24751, 57677],\n      [229, -2],\n      [156, 1],\n      [202, 1]\n    ],\n    [\n      [25284, 52292],\n      [-4, -32],\n      [-7, 15],\n      [-10, -40],\n      [-18, 27],\n      [-13, -15],\n      [-5, 30],\n      [-18, 7],\n      [-18, -23],\n      [-23, 49],\n      [-2, -28],\n      [-21, 38],\n      [-22, -3],\n      [-31, -27],\n      [-28, -42],\n      [-30, -33],\n      [4, 54],\n      [-10, 30],\n      [-14, -27],\n      [9, -17],\n      [1, -40],\n      [-25, -57],\n      [-8, -80],\n      [-9, 10],\n      [-13, -16]\n    ],\n    [\n      [24969, 52072],\n      [-12, 0],\n      [-13, 50],\n      [-4, 66],\n      [0, 69],\n      [-15, 77],\n      [0, 54],\n      [-10, 43],\n      [-11, 19],\n      [-4, 39],\n      [-10, 34],\n      [-4, 95],\n      [-8, 14],\n      [10, 88],\n      [-4, 36],\n      [7, 25],\n      [9, 125],\n      [7, 19],\n      [-1, 45],\n      [7, 22],\n      [-7, 36],\n      [-165, -2],\n      [-134, -1],\n      [-226, 0],\n      [13, 21],\n      [7, 58],\n      [-16, 50],\n      [-1, 28],\n      [10, 46],\n      [-3, 41],\n      [-12, 30],\n      [1, 38],\n      [18, -7],\n      [17, 20],\n      [2, 43],\n      [-12, 37],\n      [-1, 45],\n      [-7, 16],\n      [9, 39],\n      [4, -50],\n      [8, -29],\n      [9, 7],\n      [0, 29],\n      [-13, 75],\n      [-1, 74],\n      [20, 18],\n      [12, 35],\n      [-4, 32],\n      [-18, -13],\n      [-9, 30],\n      [5, 38],\n      [10, -28],\n      [18, 0],\n      [1, 106],\n      [11, 35],\n      [23, 5],\n      [4, 18],\n      [-29, 11],\n      [7, 94],\n      [12, 11],\n      [2, -43],\n      [7, -17],\n      [5, 28],\n      [-6, 21],\n      [24, 78],\n      [-2, 50],\n      [7, 25],\n      [19, 14],\n      [0, 50],\n      [-19, 26],\n      [5, 25],\n      [13, -39],\n      [5, 36],\n      [12, 22],\n      [9, 69],\n      [-15, 24],\n      [2, -62],\n      [-32, 11],\n      [2, 79],\n      [27, 20],\n      [7, 27],\n      [14, -31],\n      [5, 42],\n      [-2, 53],\n      [12, -8],\n      [16, 79],\n      [-4, 18],\n      [-6, -40],\n      [-23, 17],\n      [0, 58],\n      [8, 20],\n      [-8, 35],\n      [-10, -20],\n      [-23, 49],\n      [3, 58],\n      [5, 1],\n      [17, -48],\n      [10, 7],\n      [-5, 26],\n      [-21, 50],\n      [14, 31],\n      [8, 37],\n      [-7, 37],\n      [-6, -46],\n      [-20, -26],\n      [-6, 14],\n      [-3, 52],\n      [9, 38],\n      [16, 33],\n      [2, 27],\n      [-31, 30],\n      [1, 71],\n      [5, 37],\n      [21, 52],\n      [2, 39],\n      [-9, 72],\n      [-11, -4],\n      [1, -67],\n      [-14, -26],\n      [-9, 22],\n      [3, 48],\n      [10, 50]\n    ],\n    [\n      [17580, 73980],\n      [234, -2],\n      [232, 3],\n      [190, -5],\n      [190, 2],\n      [348, -2],\n      [211, 0],\n      [232, 2],\n      [328, 0],\n      [141, 0],\n      [292, 0],\n      [227, 1],\n      [143, -1],\n      [294, 0],\n      [114, 0],\n      [167, 1]\n    ],\n    [\n      [18973, 68711],\n      [-21, 23],\n      [-6, 49],\n      [-24, 59],\n      [2, 43],\n      [-28, 117],\n      [-17, 36],\n      [-8, -52],\n      [-20, -3],\n      [5, -33],\n      [-16, -98],\n      [15, -64],\n      [-32, 26],\n      [-9, -16],\n      [-24, 13],\n      [-3, -19],\n      [-30, -40],\n      [-13, 63],\n      [-22, -8],\n      [-13, -25],\n      [-10, 13],\n      [-21, -30],\n      [-8, 22],\n      [-14, -8],\n      [-12, 35],\n      [-16, 7],\n      [-9, -35],\n      [-9, 0],\n      [-2, -61],\n      [-8, -45],\n      [-24, 38],\n      [-8, -20],\n      [-11, 24],\n      [-33, 2],\n      [-17, 22],\n      [-17, -23],\n      [-15, -72],\n      [6, -53],\n      [-9, -22],\n      [-11, 44],\n      [-18, 24],\n      [-15, 40],\n      [-6, 53],\n      [5, 34],\n      [-21, 81],\n      [9, 48],\n      [-5, 50],\n      [-18, 109],\n      [-32, 58],\n      [-26, -44],\n      [-4, 40],\n      [-28, 53],\n      [-11, 97],\n      [14, 13],\n      [2, 55],\n      [-4, 61],\n      [-19, 39],\n      [2, 26],\n      [-17, 15],\n      [-7, 73],\n      [-24, 73],\n      [-1, 35],\n      [-14, 54],\n      [2, 70],\n      [-8, 19],\n      [-6, 57],\n      [6, 30],\n      [-1, 46],\n      [-19, 0],\n      [7, 95],\n      [-15, 25],\n      [-12, -2],\n      [2, 26],\n      [-10, 44],\n      [-15, 26],\n      [-9, -13],\n      [2, -41],\n      [-15, -35],\n      [-19, -82],\n      [-19, -26],\n      [-13, 12],\n      [-3, -58],\n      [-24, -42],\n      [-5, 36],\n      [-14, 22],\n      [-13, 60],\n      [-25, 0],\n      [4, 53],\n      [-8, 36],\n      [18, 37],\n      [1, 48],\n      [-19, 74],\n      [18, 89],\n      [25, 1],\n      [7, 44],\n      [-13, 54],\n      [6, 49],\n      [-19, 27],\n      [-4, 54],\n      [9, 58],\n      [-17, 33],\n      [2, 49],\n      [19, 7],\n      [-1, 79],\n      [-6, 30],\n      [13, 24],\n      [1, 116],\n      [13, 65],\n      [-7, 69],\n      [12, 3],\n      [10, 123],\n      [-3, 58],\n      [-8, 10],\n      [-26, -23],\n      [-4, -21],\n      [-22, 15],\n      [-19, -5],\n      [-8, 39],\n      [6, 39],\n      [-7, 30],\n      [-14, 9],\n      [-4, -30],\n      [-15, -21],\n      [-6, 17],\n      [6, 55],\n      [-34, 58],\n      [-16, 59],\n      [4, 71],\n      [-20, 60],\n      [-13, -1],\n      [-6, 60],\n      [-19, 82],\n      [-17, 54],\n      [-12, 13],\n      [-5, 37],\n      [-11, 7],\n      [2, 38],\n      [-9, 41],\n      [-24, 10],\n      [-32, 45],\n      [-7, 54],\n      [-47, 87],\n      [-11, -2],\n      [12, 36],\n      [22, 8],\n      [3, 22],\n      [-16, 7],\n      [-5, 57],\n      [-11, 5],\n      [2, 34],\n      [13, 32],\n      [-12, 55],\n      [2, 63],\n      [-13, 24],\n      [-7, 47],\n      [-8, -6],\n      [-8, 88],\n      [-15, 21],\n      [-39, 152],\n      [-1, 279],\n      [1, 109],\n      [0, 804]\n    ],\n    [\n      [29991, 69339],\n      [3, 68],\n      [18, 64],\n      [-3, 15],\n      [11, 74],\n      [-13, 36],\n      [18, 11],\n      [4, 26],\n      [22, 42],\n      [15, -61],\n      [28, -5],\n      [13, 70]\n    ],\n    [\n      [30213, 67064],\n      [-30, -174],\n      [-2, -44]\n    ],\n    [\n      [29724, 66677],\n      [-9, 53],\n      [-6, -10],\n      [-12, 102],\n      [9, 73],\n      [1, 57],\n      [13, 10],\n      [8, 45],\n      [-6, 52],\n      [9, 33],\n      [-5, 65],\n      [4, 138],\n      [12, 64],\n      [-6, 60],\n      [10, 135],\n      [-5, 35],\n      [5, 74],\n      [15, 33],\n      [6, 109],\n      [9, 44],\n      [19, 43],\n      [6, 44],\n      [-1, 64],\n      [19, 67],\n      [0, 85],\n      [12, 44],\n      [12, 69],\n      [0, 47],\n      [-10, 68],\n      [6, 57],\n      [-6, 34],\n      [10, 61],\n      [35, 32],\n      [10, -13],\n      [16, 21],\n      [5, 52],\n      [24, 14],\n      [14, 39],\n      [7, 45],\n      [16, 22],\n      [-6, 59],\n      [11, 13],\n      [2, 73],\n      [-10, 38],\n      [-11, 102],\n      [15, 52],\n      [4, 64],\n      [18, 75],\n      [-13, 89],\n      [11, 30]\n    ],\n    [\n      [29842, 64964],\n      [3, 18],\n      [27, 22],\n      [-21, -43],\n      [-9, 3]\n    ],\n    [\n      [29812, 64781],\n      [5, 20],\n      [11, -16],\n      [0, -50],\n      [-6, 35],\n      [-10, 11]\n    ],\n    [\n      [29792, 64880],\n      [16, 16],\n      [-12, -43],\n      [-4, 27]\n    ],\n    [\n      [29275, 64272],\n      [5, -67],\n      [-9, -39],\n      [-38, -78],\n      [-11, -1]\n    ],\n    [\n      [28633, 68013],\n      [16, 50],\n      [-5, -45],\n      [-11, -5]\n    ],\n    [\n      [28611, 68032],\n      [12, 40],\n      [9, -5],\n      [-21, -35]\n    ],\n    [\n      [27689, 66145],\n      [33, 53],\n      [53, 111],\n      [29, 91],\n      [30, 50],\n      [26, 25],\n      [11, 70],\n      [13, 36],\n      [4, 52],\n      [36, 56],\n      [19, 54],\n      [-4, 80],\n      [-13, 40],\n      [2, 43],\n      [-7, 37],\n      [-23, 35],\n      [1, 92],\n      [-18, 15],\n      [9, 77],\n      [-5, 125],\n      [-3, 13],\n      [28, 22],\n      [38, 42],\n      [56, 47],\n      [40, 20],\n      [33, 2],\n      [38, -9],\n      [36, 8],\n      [86, -42],\n      [23, -19],\n      [15, -47],\n      [23, -46],\n      [12, -10],\n      [40, 49],\n      [35, 1],\n      [43, 12],\n      [21, -19],\n      [23, -1],\n      [14, 25],\n      [30, 20],\n      [18, 40],\n      [9, 1],\n      [19, 80],\n      [30, 64],\n      [10, 8],\n      [19, 54],\n      [14, 5],\n      [20, -15],\n      [17, 19],\n      [9, 53],\n      [2, 87],\n      [-9, 180],\n      [-20, 40],\n      [11, 50],\n      [14, 11],\n      [2, -33],\n      [21, 41],\n      [-3, 43],\n      [-19, 47],\n      [-22, -15],\n      [5, 29],\n      [-15, 51],\n      [-15, 1],\n      [1, 80],\n      [16, 115],\n      [19, 5],\n      [23, 42],\n      [0, 48],\n      [18, 22],\n      [27, 55],\n      [9, -5],\n      [16, 29],\n      [25, 75],\n      [4, 46],\n      [12, 51],\n      [41, 121],\n      [31, 100],\n      [56, 141],\n      [-1, 12],\n      [68, 109],\n      [26, 62],\n      [18, 0],\n      [22, 37],\n      [27, -29],\n      [19, 10],\n      [91, -8],\n      [53, -1],\n      [107, 14],\n      [24, -1],\n      [93, 10]\n    ],\n    [\n      [29478, 69336],\n      [1, -109],\n      [-7, -30],\n      [-4, -63],\n      [13, -57],\n      [-10, -55],\n      [-2, -92],\n      [-4, -31],\n      [4, -70],\n      [19, -88],\n      [4, -69],\n      [-12, -80],\n      [7, -114],\n      [-4, -36],\n      [-19, -63],\n      [-5, -89],\n      [-8, -79],\n      [9, -27],\n      [-1, -103],\n      [10, -67],\n      [-5, -64],\n      [12, -57],\n      [-16, -97],\n      [-7, -114],\n      [10, -26],\n      [7, 66],\n      [19, 0],\n      [2, -53],\n      [13, -29],\n      [-2, -343],\n      [-6, -422],\n      [0, -74],\n      [-4, -37],\n      [8, -65]\n    ],\n    [\n      [29390, 64649],\n      [-7, -42],\n      [-21, -42],\n      [-2, -79],\n      [-13, 2],\n      [9, -60],\n      [18, 87],\n      [11, -15],\n      [10, 42],\n      [21, 27],\n      [18, 2],\n      [4, 33],\n      [22, -30],\n      [2, 41],\n      [9, -28],\n      [20, -8],\n      [18, -23],\n      [23, 28],\n      [2, 43],\n      [17, 8],\n      [10, -12],\n      [75, 3],\n      [39, 20],\n      [14, 18],\n      [30, 63],\n      [9, 40],\n      [12, 13],\n      [13, 50],\n      [21, 21],\n      [12, -2],\n      [-18, -52],\n      [-9, -6],\n      [15, -31],\n      [5, -44],\n      [17, -12],\n      [11, 25],\n      [16, -72],\n      [15, 17],\n      [23, 48],\n      [2, 28],\n      [17, 11],\n      [12, -12],\n      [-5, -21],\n      [-67, -94],\n      [-78, -123],\n      [-50, -62],\n      [-81, -93],\n      [-53, -78],\n      [-43, -41],\n      [-27, -12],\n      [-6, 15],\n      [-64, -60],\n      [-61, 10],\n      [-46, -55],\n      [3, 38],\n      [-23, -2],\n      [3, 25],\n      [-11, 39],\n      [7, 35],\n      [-8, 36]\n    ],\n    [\n      [26861, 65369],\n      [16, 17],\n      [-2, -36],\n      [-14, 19]\n    ],\n    [\n      [26831, 65420],\n      [6, 90],\n      [11, -35],\n      [-3, -35],\n      [-14, -42],\n      [0, 22]\n    ],\n    [\n      [26661, 65520],\n      [1, -26],\n      [21, -28],\n      [13, 17],\n      [37, -82],\n      [25, -20],\n      [11, -21],\n      [18, -66],\n      [19, -29],\n      [18, 23],\n      [2, 50],\n      [7, 13],\n      [14, -55],\n      [19, 2],\n      [-1, -37],\n      [29, -96],\n      [16, -33],\n      [22, -21],\n      [41, 57],\n      [22, 4],\n      [17, 35],\n      [51, 60],\n      [37, -38],\n      [19, 15],\n      [20, -9],\n      [29, 61],\n      [29, 86],\n      [8, 10],\n      [16, 58],\n      [44, 102],\n      [10, 1],\n      [67, 108],\n      [30, 17],\n      [24, 34],\n      [65, 69],\n      [17, 24]\n    ],\n    [\n      [15490, 70789],\n      [21, 10],\n      [13, -45],\n      [-1, -55],\n      [17, -42],\n      [25, -1],\n      [32, 51],\n      [14, -4],\n      [59, -119],\n      [7, -61],\n      [18, -81],\n      [1, -57],\n      [7, -52],\n      [-3, -67],\n      [10, -88],\n      [-4, -41],\n      [3, -50],\n      [33, -54],\n      [46, -35],\n      [11, -19],\n      [17, 14],\n      [13, -32],\n      [18, -5],\n      [23, 39],\n      [23, 7],\n      [54, 83],\n      [12, 45],\n      [15, 16],\n      [21, -15],\n      [29, 12],\n      [28, 26],\n      [19, -30],\n      [17, -9],\n      [18, 14],\n      [34, -40],\n      [9, -75],\n      [14, 4],\n      [19, 50],\n      [34, 4],\n      [13, -16],\n      [11, 34],\n      [47, 51],\n      [15, 35],\n      [21, -9],\n      [21, -51],\n      [22, 6],\n      [34, 26],\n      [20, 5],\n      [11, 42],\n      [28, 27],\n      [29, 46],\n      [46, 27],\n      [37, 10],\n      [13, 57],\n      [14, 23],\n      [24, -22],\n      [64, 39],\n      [17, -14],\n      [19, 6],\n      [28, 42],\n      [11, 36],\n      [163, 1],\n      [250, -3],\n      [164, -3]\n    ],\n    [\n      [17338, 70482],\n      [16, -107],\n      [11, -27],\n      [16, -75],\n      [18, 5],\n      [10, -47],\n      [19, -2],\n      [16, -48],\n      [0, -53],\n      [13, -49],\n      [7, -54],\n      [-24, -108],\n      [-1, -55],\n      [-10, -23],\n      [-24, -150],\n      [1, -36],\n      [-9, -51],\n      [-7, -116],\n      [-13, -40],\n      [-6, -53],\n      [-14, -44],\n      [-3, -51],\n      [7, -58],\n      [-9, -68],\n      [-18, -76],\n      [0, -21],\n      [-32, -49],\n      [-14, -93],\n      [-8, -97],\n      [-10, -66],\n      [-18, -48],\n      [3, -66],\n      [-8, -36],\n      [15, -69],\n      [-8, -56],\n      [13, -35],\n      [19, 25],\n      [16, -59],\n      [20, 12],\n      [2, -53],\n      [18, -17],\n      [1, -31],\n      [-10, -62],\n      [-12, -17],\n      [1, -42],\n      [11, -32],\n      [-1, -43],\n      [-12, -81],\n      [0, -54],\n      [-11, -11],\n      [-2, -59],\n      [0, -2105]\n    ],\n    [\n      [17307, 65831],\n      [-166, -2],\n      [-273, -5],\n      [-26, -3],\n      [-143, 2],\n      [-220, 2]\n    ],\n    [\n      [15305, 65829],\n      [-21, 55],\n      [-15, 55],\n      [-7, 69],\n      [2, 33],\n      [-14, 81],\n      [2, 32],\n      [-7, 63],\n      [-2, 126],\n      [13, 147],\n      [-7, 107],\n      [-17, 87],\n      [-11, 2],\n      [-11, 123],\n      [15, 90],\n      [12, 96],\n      [6, 83],\n      [0, 52],\n      [9, 80],\n      [6, 99],\n      [-6, 42],\n      [17, 53],\n      [8, 43],\n      [16, 132],\n      [15, 193],\n      [15, 283],\n      [7, 225],\n      [4, 188],\n      [-2, 8],\n      [10, 197],\n      [-1, 69],\n      [7, 184],\n      [0, 92],\n      [-5, 39],\n      [8, 91],\n      [12, 227],\n      [8, 117],\n      [4, 157],\n      [-3, 66],\n      [3, 109],\n      [-4, 69],\n      [5, 24],\n      [5, 176],\n      [-1, 76],\n      [-11, 41],\n      [6, 87],\n      [-2, 83],\n      [-7, 45],\n      [16, 36],\n      [1, 109],\n      [-19, 193],\n      [27, -79],\n      [14, -14],\n      [-3, 38],\n      [23, 10],\n      [7, 17],\n      [11, -28],\n      [12, 31],\n      [15, 0],\n      [20, 51]\n    ],\n    [\n      [26599, 59546],\n      [33, -4],\n      [78, 1],\n      [5, -5],\n      [157, -1],\n      [61, 3],\n      [151, -2],\n      [3, 26],\n      [77, -5],\n      [-8, -28]\n    ],\n    [\n      [18139, 65823],\n      [61, -6],\n      [262, 13],\n      [192, 2],\n      [5, -5],\n      [196, 3],\n      [118, 3]\n    ],\n    [\n      [18136, 60011],\n      [0, 880],\n      [1, 11],\n      [-1, 272],\n      [1, 173],\n      [-1, 298],\n      [1, 318],\n      [0, 1661],\n      [1, 149],\n      [0, 628],\n      [1, 266],\n      [0, 1156]\n    ],\n    [\n      [28738, 60998],\n      [7, -15],\n      [-7, -27],\n      [0, 42]\n    ],\n    [\n      [28949, 61206],\n      [-16, -79],\n      [-15, -98],\n      [-8, -27],\n      [-5, 21],\n      [-15, -7],\n      [-19, -78],\n      [-12, -70],\n      [-11, -126],\n      [1, -64],\n      [-23, -128],\n      [7, -14],\n      [-18, -91],\n      [-12, -79],\n      [-9, -11],\n      [1, -57],\n      [-11, -86],\n      [-18, -64],\n      [-16, 2],\n      [4, -35],\n      [-9, -5],\n      [-1, 84],\n      [-10, 55],\n      [-4, 61],\n      [2, 70],\n      [9, 59],\n      [3, 89],\n      [10, 105],\n      [4, 76],\n      [16, 79],\n      [18, 110],\n      [-4, 34],\n      [21, 17],\n      [15, 65],\n      [1, 28],\n      [-20, 21],\n      [25, 54]\n    ],\n    [\n      [28739, 61120],\n      [-11, -44],\n      [-3, 44]\n    ],\n    [\n      [28423, 61914],\n      [-20, -21],\n      [-13, 21],\n      [0, -52],\n      [-18, -113],\n      [-4, -52],\n      [2, -76],\n      [15, -59],\n      [29, 15],\n      [6, 26],\n      [15, 0],\n      [12, 38],\n      [9, -30],\n      [-6, -74],\n      [19, -64],\n      [0, -49],\n      [35, -59],\n      [25, -2],\n      [7, -28],\n      [6, 21],\n      [24, -9],\n      [4, -44],\n      [16, -39],\n      [8, -59],\n      [13, -15],\n      [15, -54],\n      [20, -23],\n      [30, -68],\n      [-5, -65],\n      [-15, -24],\n      [-2, -107],\n      [4, -29],\n      [-11, -46],\n      [13, -23],\n      [-19, -30],\n      [-31, 64],\n      [-11, -27],\n      [-7, 25],\n      [0, 41],\n      [-13, 81],\n      [-19, 32],\n      [-8, 35],\n      [-12, 12],\n      [-21, 103],\n      [-11, 11],\n      [-4, 45],\n      [-13, 30],\n      [-2, -30],\n      [28, -89],\n      [20, -114],\n      [15, -24],\n      [1, -25],\n      [16, -14],\n      [10, -96],\n      [11, -53],\n      [30, -4],\n      [7, -36],\n      [31, -24],\n      [-14, -29],\n      [-1, -37],\n      [13, -8],\n      [4, 22],\n      [8, -41],\n      [5, -110],\n      [-8, -90],\n      [-18, 63],\n      [-21, 45],\n      [-9, -42],\n      [11, -39],\n      [7, -55],\n      [9, -14],\n      [-22, -24],\n      [-18, -4],\n      [6, -39],\n      [22, 11],\n      [-2, -76],\n      [14, 12],\n      [4, -31],\n      [12, -20],\n      [6, -49],\n      [-9, -97],\n      [-4, 15],\n      [-16, -18],\n      [-15, -34],\n      [-10, 68],\n      [-29, 61],\n      [-14, 45],\n      [4, 48],\n      [-13, 71],\n      [-22, -9],\n      [-8, -25],\n      [-10, 46],\n      [-18, 11],\n      [-4, 23],\n      [-21, -35],\n      [11, -33],\n      [12, 8],\n      [18, -13],\n      [15, -55],\n      [9, -2],\n      [8, 58],\n      [8, -119],\n      [1, -67],\n      [22, -19],\n      [25, -82],\n      [1, -65],\n      [27, 4],\n      [9, 27],\n      [1, -33],\n      [9, -11],\n      [-3, 86],\n      [17, 6],\n      [13, -29],\n      [35, -36],\n      [17, 27],\n      [11, -11],\n      [8, -128],\n      [12, -140],\n      [9, -71],\n      [7, -94]\n    ],\n    [\n      [15775, 72069],\n      [4, 105],\n      [10, 72],\n      [12, -52],\n      [-2, -58],\n      [19, -32],\n      [-18, -27],\n      [-5, -26],\n      [-18, -12],\n      [-2, 30]\n    ],\n    [\n      [15740, 73454],\n      [0, 40],\n      [20, -41],\n      [-17, -26],\n      [-3, 27]\n    ],\n    [\n      [15720, 73667],\n      [6, 14],\n      [26, -115],\n      [-18, 42],\n      [-14, 59]\n    ],\n    [\n      [15715, 73495],\n      [8, 29],\n      [12, -47],\n      [-15, -33],\n      [-5, 51]\n    ],\n    [\n      [15707, 73080],\n      [13, 89],\n      [14, 59],\n      [2, 55],\n      [16, 11],\n      [7, -19],\n      [0, -49],\n      [19, -38],\n      [3, -26],\n      [-15, -19],\n      [-17, 15],\n      [-1, -29],\n      [-13, -34],\n      [-14, -7],\n      [3, -24],\n      [23, 10],\n      [11, -42],\n      [8, -84],\n      [-4, -14],\n      [10, -100],\n      [8, 27],\n      [-5, 67],\n      [10, -3],\n      [16, -57],\n      [16, -13],\n      [7, -94],\n      [-8, -58],\n      [-14, 13],\n      [-12, 86],\n      [-21, -25],\n      [2, 30],\n      [-19, 44],\n      [3, 93],\n      [-5, 56],\n      [-18, -4],\n      [-3, 30],\n      [-22, 54]\n    ],\n    [\n      [15649, 73739],\n      [11, -4],\n      [34, -53],\n      [-8, -8],\n      [-22, 20],\n      [-15, 45]\n    ],\n    [\n      [15623, 73630],\n      [17, 26],\n      [2, -33],\n      [-19, 7]\n    ],\n    [\n      [15618, 73982],\n      [15, 0],\n      [4, -29],\n      [-17, -2],\n      [-2, 31]\n    ],\n    [\n      [15586, 73509],\n      [7, 30],\n      [20, 1],\n      [2, -29],\n      [15, -33],\n      [17, -9],\n      [-18, 69],\n      [37, 108],\n      [12, -2],\n      [37, -58],\n      [-19, -50],\n      [11, -66],\n      [-2, -62],\n      [-11, -25],\n      [4, -69],\n      [-20, -12],\n      [-15, 50],\n      [-9, -12],\n      [-22, 11],\n      [-31, 62],\n      [-6, 76],\n      [-9, 20]\n    ],\n    [\n      [15577, 73617],\n      [18, -10],\n      [18, -54],\n      [-30, 41],\n      [-6, 23]\n    ],\n    [\n      [17306, 73978],\n      [-1, -290],\n      [0, -441],\n      [-2, -286],\n      [0, -702],\n      [1, -52],\n      [0, -1247],\n      [-7, -48],\n      [20, -76],\n      [8, -54],\n      [0, -63],\n      [12, -40],\n      [-17, -93],\n      [7, -11],\n      [11, -93]\n    ],\n    [\n      [15490, 70789],\n      [-34, 9],\n      [-3, 34],\n      [-12, 6],\n      [-10, -31],\n      [-13, 10],\n      [-19, -51],\n      [-9, 7],\n      [-21, 74],\n      [-10, 8],\n      [-7, -47],\n      [-10, -10],\n      [6, 139],\n      [1, 124],\n      [-4, 165],\n      [13, -61],\n      [-2, -100],\n      [4, -137],\n      [17, 0],\n      [1, 37],\n      [-10, 40],\n      [0, 61],\n      [12, -37],\n      [14, 83],\n      [-19, 116],\n      [11, 42],\n      [25, 53],\n      [-17, 37],\n      [-6, -27],\n      [-18, -2],\n      [4, -23],\n      [-16, 4],\n      [-20, 44],\n      [-1, 55],\n      [-11, 130],\n      [8, 8],\n      [6, -52],\n      [11, 31],\n      [52, 63],\n      [-10, 27],\n      [-34, 23],\n      [-2, 45],\n      [-27, 14],\n      [-8, -24],\n      [8, -90],\n      [-16, -21],\n      [3, 38],\n      [-4, 206],\n      [-14, 176],\n      [-24, 80],\n      [-9, 207],\n      [-5, 77],\n      [-15, 162],\n      [-14, 36],\n      [-4, 55],\n      [-14, 23],\n      [-5, 31],\n      [-19, 29],\n      [-12, 110],\n      [-8, 101],\n      [1, 53],\n      [-11, 56],\n      [12, 58],\n      [9, 138],\n      [-19, 46],\n      [3, 22],\n      [17, 1],\n      [40, -55],\n      [32, -64],\n      [10, -1],\n      [25, -39],\n      [6, 12],\n      [41, -55],\n      [-1, -20],\n      [35, -41],\n      [56, -11],\n      [21, 13],\n      [31, -37],\n      [9, 19],\n      [10, -18],\n      [24, 7],\n      [12, -32],\n      [41, 2],\n      [32, 71],\n      [-3, -24],\n      [22, -42],\n      [7, -45],\n      [17, 17],\n      [17, -5],\n      [-3, -32],\n      [14, -20],\n      [1, -59],\n      [10, 6],\n      [3, 53],\n      [-14, 34],\n      [0, 40],\n      [12, 28],\n      [21, 10],\n      [3, -31],\n      [-15, -34],\n      [10, -50],\n      [7, 6],\n      [2, 48],\n      [10, 14],\n      [8, -100],\n      [-15, -10],\n      [11, -42],\n      [8, -78],\n      [13, -21],\n      [-8, -25],\n      [-16, 2],\n      [2, -42],\n      [-17, -36],\n      [-9, -113],\n      [-14, -9],\n      [11, 113],\n      [-6, 17],\n      [-19, -101],\n      [-4, -53],\n      [-21, -70],\n      [-38, -183],\n      [-13, -119],\n      [12, 8],\n      [23, -13],\n      [12, 27],\n      [21, 17],\n      [3, 38],\n      [-44, -62],\n      [-17, 27],\n      [42, 226],\n      [31, 74],\n      [29, 28],\n      [3, 73],\n      [16, 73],\n      [31, 68],\n      [-9, 97],\n      [22, -40],\n      [14, -187],\n      [-22, 0],\n      [3, -40],\n      [11, -14],\n      [-4, -56],\n      [7, -19],\n      [0, -53],\n      [-14, -38],\n      [-1, -38],\n      [15, -16],\n      [-10, -48],\n      [-6, -87],\n      [4, -21],\n      [-10, -57],\n      [7, -49],\n      [-15, -79],\n      [-27, 78],\n      [8, 96],\n      [-16, -42],\n      [-6, -63],\n      [30, -83],\n      [-10, -16],\n      [1, -48],\n      [-11, -26],\n      [-16, 46],\n      [-20, 105],\n      [12, 37],\n      [1, 61],\n      [-7, 25],\n      [0, -51],\n      [-12, -57],\n      [7, -72],\n      [-6, -48],\n      [13, 14],\n      [11, -66],\n      [27, -22],\n      [11, 37],\n      [0, 33],\n      [13, 16],\n      [8, 79],\n      [10, 53],\n      [-2, 30],\n      [25, -58],\n      [10, 25],\n      [-4, 36],\n      [27, 34],\n      [0, 50],\n      [-8, 58],\n      [-8, 11],\n      [6, 35],\n      [-10, 40],\n      [-7, 71],\n      [22, 38],\n      [-24, 58],\n      [16, 82],\n      [-6, 91],\n      [15, 46],\n      [9, 119],\n      [22, 25],\n      [-1, 69],\n      [-14, 23],\n      [-23, 86],\n      [1, 74],\n      [-10, 49],\n      [-15, 4],\n      [3, -24],\n      [-11, -28],\n      [10, -67],\n      [18, -50],\n      [1, -35],\n      [-26, 85],\n      [-12, 4],\n      [-7, 58],\n      [2, 77],\n      [18, 24],\n      [16, -22],\n      [10, 42],\n      [-10, 45],\n      [-28, 45],\n      [-13, 48],\n      [1, 39],\n      [-29, -33],\n      [-7, 33],\n      [4, 45],\n      [-13, -17],\n      [3, 39],\n      [24, 28],\n      [13, -15],\n      [9, -49],\n      [19, 7],\n      [-10, 108],\n      [17, 6],\n      [5, 34],\n      [-21, 66],\n      [-5, 66],\n      [8, 44],\n      [-13, 30],\n      [-17, -6],\n      [-11, -41],\n      [9, -44],\n      [-19, 40],\n      [8, 57],\n      [-10, 25],\n      [-9, -14],\n      [-1, 65],\n      [-21, 54],\n      [11, 21],\n      [-5, 36],\n      [-13, 16],\n      [16, 54],\n      [184, 0],\n      [97, -6],\n      [145, 5],\n      [143, -2],\n      [190, 0],\n      [169, 0],\n      [165, 1],\n      [178, 0],\n      [325, -2]\n    ],\n    [\n      [25685, 69733],\n      [6, 80],\n      [31, -17],\n      [-23, -128],\n      [-14, 65]\n    ],\n    [\n      [25568, 69555],\n      [12, 14],\n      [2, -63],\n      [-14, 23],\n      [0, 26]\n    ],\n    [\n      [24707, 71654],\n      [8, 83],\n      [12, 4],\n      [-5, -75],\n      [-15, -12]\n    ],\n    [\n      [24691, 71507],\n      [21, 33],\n      [-14, -47],\n      [-7, 14]\n    ],\n    [\n      [24655, 71564],\n      [5, 21],\n      [30, 29],\n      [5, -13],\n      [-11, -48],\n      [-24, -11],\n      [-5, 22]\n    ],\n    [\n      [24625, 71464],\n      [3, 27],\n      [20, 41],\n      [1, -19],\n      [-24, -49]\n    ],\n    [\n      [24631, 71609],\n      [14, -54],\n      [-13, -3],\n      [-8, 37],\n      [7, 20]\n    ],\n    [\n      [24621, 71679],\n      [35, 36],\n      [11, -55],\n      [14, 34],\n      [2, -44],\n      [-16, -9],\n      [-17, -49],\n      [-11, 42],\n      [-16, 20],\n      [-2, 25]\n    ],\n    [\n      [24616, 71401],\n      [17, 18],\n      [32, 86],\n      [14, -32],\n      [-30, -33],\n      [5, -35],\n      [-17, -4],\n      [-20, -37],\n      [-1, 37]\n    ],\n    [\n      [24563, 71635],\n      [15, 17],\n      [-1, -44],\n      [-14, 27]\n    ],\n    [\n      [24276, 71309],\n      [20, -30],\n      [34, 11],\n      [49, 52],\n      [19, 27],\n      [18, 0],\n      [48, 70],\n      [25, 27],\n      [6, 26],\n      [17, -22],\n      [7, 33],\n      [25, 10],\n      [22, 70],\n      [14, -12],\n      [14, 35],\n      [10, -4],\n      [24, -81],\n      [-14, -76],\n      [-24, -78],\n      [9, -73],\n      [-16, -35],\n      [-11, -77],\n      [13, -16],\n      [42, 73],\n      [5, 54],\n      [42, -108],\n      [13, -22],\n      [9, 10],\n      [25, -27]\n    ],\n    [\n      [25508, 69434],\n      [-10, -58],\n      [-1, -80],\n      [-37, -13],\n      [-21, -40],\n      [3, -47],\n      [-11, -59],\n      [-9, -15],\n      [-11, -83],\n      [-12, -42],\n      [-7, -104],\n      [3, -25],\n      [-13, -50],\n      [20, -42],\n      [12, 7],\n      [7, 53],\n      [26, 64],\n      [10, 3],\n      [15, 63],\n      [0, 36],\n      [31, 133],\n      [26, 36],\n      [11, -7],\n      [11, 34],\n      [15, -32],\n      [-6, 46],\n      [12, 97],\n      [27, 109],\n      [7, 100],\n      [12, -5],\n      [21, 32],\n      [1, 59],\n      [17, 60],\n      [22, -3],\n      [-2, -87],\n      [-16, -5],\n      [-2, -142],\n      [-12, -40],\n      [-8, 4],\n      [-5, -53],\n      [-14, -52],\n      [5, -43],\n      [-13, -39],\n      [4, -26],\n      [-18, -33],\n      [-13, -62],\n      [-8, -87],\n      [-17, -107],\n      [-9, -26],\n      [-9, -62],\n      [-21, -268],\n      [9, -94],\n      [-2, -71],\n      [-12, -41],\n      [-23, -46],\n      [-3, -62],\n      [-8, -37],\n      [-14, -162],\n      [2, -82],\n      [8, -50],\n      [-2, -102],\n      [-21, -118],\n      [-7, -136],\n      [-20, -107],\n      [-9, -156],\n      [8, -76],\n      [-5, -38],\n      [8, -85],\n      [-7, -57],\n      [14, -62],\n      [0, -85],\n      [6, -63],\n      [16, -59],\n      [-4, -89],\n      [-11, -107],\n      [6, -145]\n    ],\n    [\n      [2682, 386],\n      [26, 11],\n      [1, -51],\n      [-9, 8],\n      [-8, -28],\n      [-10, 60]\n    ],\n    [\n      [2636, 452],\n      [21, 8],\n      [-4, -21],\n      [-13, -12],\n      [-4, 25]\n    ],\n    [\n      [2313, 271],\n      [13, 35],\n      [16, 2],\n      [19, 68],\n      [4, -20],\n      [27, 2],\n      [4, -44],\n      [-7, 13],\n      [-29, -30],\n      [-23, -89],\n      [-11, 47],\n      [-13, 16]\n    ],\n    [\n      [90204, 32599],\n      [5, 15],\n      [34, 16],\n      [21, 137],\n      [6, 65],\n      [7, -11],\n      [7, -43],\n      [14, -11],\n      [-10, -88],\n      [-32, -109],\n      [-9, -44],\n      [-2, -111],\n      [-12, -56],\n      [-18, 30],\n      [-7, 101],\n      [8, 50],\n      [-12, 59]\n    ],\n    [\n      [90597, 35570],\n      [10, 43],\n      [4, -16],\n      [-8, -45],\n      [-6, 18]\n    ],\n    [\n      [90537, 37432],\n      [5, 20],\n      [1, -49],\n      [-6, 29]\n    ],\n    [\n      [90507, 37973],\n      [14, 53],\n      [0, 59],\n      [11, 0],\n      [0, -66],\n      [-9, -13],\n      [-10, -55],\n      [-6, 22]\n    ],\n    [\n      [90501, 34555],\n      [4, 28],\n      [2, 101],\n      [9, -12],\n      [20, 67],\n      [5, -22],\n      [-14, -80],\n      [4, -63],\n      [-13, 7],\n      [0, -73],\n      [-12, 18],\n      [-5, 29]\n    ],\n    [\n      [90487, 38800],\n      [6, 39],\n      [11, -28],\n      [-1, -51],\n      [-8, -23],\n      [-7, 25],\n      [-1, 38]\n    ],\n    [\n      [90486, 35993],\n      [20, 2],\n      [3, -36],\n      [-19, -8],\n      [-4, 42]\n    ],\n    [\n      [90472, 34420],\n      [4, 45],\n      [13, 54],\n      [5, -54],\n      [-4, -24],\n      [7, -40],\n      [-2, -61],\n      [-9, -29],\n      [-14, 109]\n    ],\n    [\n      [90343, 33382],\n      [11, 51],\n      [21, 35],\n      [15, -9],\n      [-2, -35],\n      [-12, -13],\n      [-8, -39],\n      [-11, -6],\n      [-5, 23],\n      [-9, -7]\n    ],\n    [\n      [28030, 56345],\n      [-13, -8],\n      [-36, -51],\n      [-27, -66],\n      [-35, -121],\n      [-18, -79],\n      [-7, -45],\n      [-16, -58],\n      [-14, -93],\n      [-13, -174],\n      [3, -55],\n      [-7, -48],\n      [-14, -47],\n      [-23, -41],\n      [-9, -97],\n      [-17, 10],\n      [-17, -16],\n      [-11, 39],\n      [-16, -33],\n      [-10, -63],\n      [3, -31],\n      [8, 10],\n      [0, -33],\n      [-15, -20],\n      [-18, -45],\n      [-9, -52],\n      [-34, -59],\n      [-10, 38],\n      [-11, -7],\n      [-1, -32],\n      [17, -22],\n      [-5, -59],\n      [-25, -52],\n      [-7, -40],\n      [-10, 5],\n      [-24, -22],\n      [-17, -59],\n      [-6, 18],\n      [-36, -90],\n      [-8, 21],\n      [-15, -28],\n      [-2, 30],\n      [-13, -1],\n      [-4, -42],\n      [15, -83],\n      [-7, -74],\n      [-32, -62],\n      [-19, -20],\n      [-2, 41],\n      [-19, 40],\n      [-11, -22],\n      [-2, -31],\n      [12, -15],\n      [14, -59],\n      [-15, -65],\n      [-25, -59],\n      [-9, 0],\n      [-17, -67],\n      [5, -21]\n    ],\n    [\n      [31708, 38299],\n      [11, -21],\n      [12, 13],\n      [9, -36],\n      [-17, -36],\n      [-12, 19],\n      [-3, 61]\n    ],\n    [\n      [31642, 38028],\n      [49, 54],\n      [35, -32],\n      [-18, -26],\n      [-21, -7],\n      [-11, -24],\n      [-8, 12],\n      [-17, -17],\n      [-9, 40]\n    ],\n    [\n      [31637, 38350],\n      [7, -14],\n      [0, -44],\n      [-7, 58]\n    ],\n    [\n      [31170, 38320],\n      [15, 18],\n      [17, 49],\n      [-4, 63],\n      [7, 32],\n      [14, 12],\n      [20, -6],\n      [17, -25],\n      [50, 2],\n      [20, -22],\n      [24, 26],\n      [18, -5],\n      [25, -25],\n      [8, 20],\n      [28, 0],\n      [27, -20],\n      [16, 1],\n      [7, -19],\n      [6, 24],\n      [37, -35],\n      [4, 19],\n      [18, -18],\n      [6, 7],\n      [31, -33],\n      [14, -49],\n      [7, 13],\n      [5, -27],\n      [10, -6],\n      [14, 22],\n      [-5, -40],\n      [3, -84],\n      [13, -30],\n      [-7, -43],\n      [-11, 19],\n      [3, -28],\n      [-10, 2],\n      [-7, -32],\n      [-13, 1],\n      [-11, -59],\n      [-7, -83],\n      [-8, -6],\n      [-1, -44],\n      [-25, -46],\n      [-15, -9],\n      [-12, 12],\n      [-7, -27],\n      [-10, 13],\n      [-21, -43],\n      [-10, 9],\n      [-9, -29],\n      [-8, 9],\n      [-18, 66],\n      [-12, -10],\n      [-7, -34],\n      [-21, 60],\n      [-8, 0],\n      [-25, -33],\n      [-14, 24],\n      [-12, -19],\n      [-25, 47],\n      [-7, -39],\n      [-14, -27],\n      [-21, -3],\n      [-12, -18],\n      [-8, 41],\n      [-21, 8],\n      [-11, -32],\n      [-19, 19],\n      [-12, -12],\n      [1, 53],\n      [10, 31],\n      [-11, 12],\n      [3, 65],\n      [5, 15],\n      [1, 75],\n      [7, 31],\n      [-10, 101],\n      [-13, 21],\n      [-9, 78]\n    ],\n    [\n      [30985, 38023],\n      [20, 12],\n      [5, -43],\n      [-15, -38],\n      [-12, 32],\n      [2, 37]\n    ],\n    [\n      [31858, 38286],\n      [13, 39],\n      [11, -4],\n      [15, -28],\n      [-13, -4],\n      [1, -49],\n      [-9, 20],\n      [-13, -5],\n      [-5, 31]\n    ],\n    [\n      [31828, 37522],\n      [7, 36],\n      [-4, 40],\n      [7, 30],\n      [10, -13],\n      [8, 22],\n      [17, 3],\n      [6, -29],\n      [39, 5],\n      [2, -18],\n      [-32, -48],\n      [-41, -30],\n      [-19, 2]\n    ],\n    [\n      [31779, 38288],\n      [6, 50],\n      [10, -23],\n      [12, 26],\n      [19, -21],\n      [33, 6],\n      [-2, -23],\n      [-14, -4],\n      [9, -42],\n      [-16, -11],\n      [-15, 23],\n      [-7, -20],\n      [-12, 49],\n      [-23, -10]\n    ],\n    [\n      [17306, 73978],\n      [171, 1],\n      [103, 1]\n    ],\n    [\n      [18139, 65823],\n      [-119, 3],\n      [-36, -2],\n      [-58, 9],\n      [-63, -7],\n      [-79, 0],\n      [-293, 0],\n      [-184, 5]\n    ],\n    [\n      [29478, 69336],\n      [71, 5],\n      [115, 0],\n      [40, -9],\n      [62, -5],\n      [57, 2],\n      [168, 10]\n    ],\n    [\n      [25149, 51924],\n      [13, -63],\n      [5, -76],\n      [-3, -101],\n      [-10, -105],\n      [-4, 3],\n      [8, 90],\n      [4, 100],\n      [-1, 46],\n      [-12, 106]\n    ],\n    [\n      [25020, 51931],\n      [11, 38],\n      [32, 81],\n      [2, -14],\n      [-13, -63],\n      [2, -28],\n      [13, -33],\n      [-15, -50],\n      [-3, 47],\n      [-10, -10],\n      [-17, 10],\n      [-2, 22]\n    ],\n    [\n      [24941, 51321],\n      [17, 10],\n      [-9, -42],\n      [-8, 32]\n    ],\n    [\n      [24732, 50824],\n      [7, 27],\n      [13, -65],\n      [-8, -14],\n      [-12, 52]\n    ],\n    [\n      [24681, 50807],\n      [39, -33],\n      [-19, -8],\n      [-20, 41]\n    ],\n    [\n      [24628, 50763],\n      [25, 19],\n      [2, -17],\n      [-26, -20],\n      [-1, 18]\n    ],\n    [\n      [24275, 51386],\n      [10, 27],\n      [12, -5],\n      [3, 26],\n      [22, -6],\n      [23, -61],\n      [9, 7],\n      [6, -29],\n      [-15, -36],\n      [-1, -40],\n      [-14, -19],\n      [-59, 115],\n      [4, 21]\n    ],\n    [\n      [24969, 52072],\n      [-17, -35],\n      [-8, 7],\n      [-17, -56],\n      [-2, -38],\n      [-12, -15],\n      [3, -40],\n      [-28, 17],\n      [-11, -45],\n      [5, -68],\n      [18, -10],\n      [13, 25],\n      [-4, -59],\n      [8, -34],\n      [15, -19],\n      [13, 11],\n      [6, 29],\n      [5, 101],\n      [-2, 13],\n      [24, 54],\n      [3, 44],\n      [18, -34],\n      [13, 6],\n      [0, -21],\n      [-17, -34],\n      [0, -34],\n      [15, -17],\n      [3, -61],\n      [15, 14],\n      [11, 82],\n      [16, -25],\n      [-4, -55],\n      [-13, 0],\n      [-12, -44],\n      [22, 2],\n      [-3, -29],\n      [-31, -22],\n      [13, -66],\n      [11, 22],\n      [-7, -59],\n      [-9, 26],\n      [-14, 11],\n      [-12, -55],\n      [-1, -99],\n      [-9, -5],\n      [-6, 86],\n      [-11, 1],\n      [-2, -66],\n      [13, -58],\n      [-13, 33],\n      [-14, 5],\n      [-8, -17],\n      [-15, 6],\n      [18, -39],\n      [0, -32],\n      [-23, 49],\n      [0, -25],\n      [12, -32],\n      [-12, -14],\n      [1, -34],\n      [11, -36],\n      [20, -11],\n      [-1, -22],\n      [12, -24],\n      [-1, -34],\n      [7, -46],\n      [9, 30],\n      [5, -21],\n      [22, -2],\n      [16, -34],\n      [3, 30],\n      [20, -91],\n      [11, 44],\n      [24, -111],\n      [0, -59],\n      [6, -13],\n      [18, 28],\n      [7, -41],\n      [-24, -15],\n      [-2, -33],\n      [16, -3],\n      [-8, -52],\n      [-11, 24],\n      [-12, -96],\n      [2, -44],\n      [-21, 36],\n      [-2, 55],\n      [-8, 16],\n      [-31, -138],\n      [-15, -41],\n      [7, 67],\n      [9, 29],\n      [5, 48],\n      [9, 21],\n      [0, 54],\n      [9, 23],\n      [-1, 51],\n      [-10, 24],\n      [-4, -62],\n      [-16, -29],\n      [-12, 29],\n      [-14, 77],\n      [-34, 43],\n      [-10, 45],\n      [-56, 33],\n      [-12, -14],\n      [-48, -143],\n      [-46, -115],\n      [-7, 10],\n      [4, 41],\n      [-12, 16],\n      [-2, 41],\n      [6, 3],\n      [-12, 100],\n      [-11, 27],\n      [-9, -1],\n      [1, -28],\n      [-8, -36],\n      [2, 76],\n      [-10, 56],\n      [-13, -64],\n      [-14, 14],\n      [-7, -22],\n      [-7, 31],\n      [-6, -27],\n      [10, -63],\n      [-12, 4],\n      [-7, -27],\n      [-4, -54],\n      [-8, 7],\n      [-5, -57],\n      [-8, 12],\n      [-19, -33],\n      [-6, -76],\n      [-16, 16],\n      [5, 21],\n      [-13, 67],\n      [-18, 57],\n      [-11, -13],\n      [-26, 21],\n      [-10, 33],\n      [-25, 12],\n      [-16, 25],\n      [-16, 60],\n      [12, 14],\n      [7, 58],\n      [8, -12],\n      [12, -52],\n      [7, 22],\n      [-1, -68],\n      [15, -17],\n      [-4, 104],\n      [-23, 64],\n      [0, 42],\n      [-11, 7],\n      [-9, -41],\n      [-13, -13],\n      [2, 41],\n      [-10, -7],\n      [3, 39],\n      [9, 28],\n      [-10, 40],\n      [-29, -50],\n      [-10, 80],\n      [-10, -8],\n      [-6, 118],\n      [-26, 1],\n      [6, 33],\n      [1, 85],\n      [-32, 16],\n      [-13, -10],\n      [-20, -38],\n      [-7, 57],\n      [8, 41],\n      [8, -3],\n      [-2, 46],\n      [-16, 8],\n      [-14, -22],\n      [-9, 20],\n      [-2, -40],\n      [-24, -36],\n      [-14, -34],\n      [-6, 32],\n      [-18, -16],\n      [0, -32],\n      [9, -30],\n      [18, -8],\n      [-9, -30],\n      [8, -63],\n      [20, 21],\n      [5, -18],\n      [-13, -14],\n      [6, -20],\n      [-32, -6],\n      [-26, -49],\n      [-20, -9],\n      [-82, 63],\n      [-35, 42],\n      [-57, 101],\n      [-23, 32],\n      [-41, 40],\n      [-33, 5],\n      [-14, -14],\n      [-36, 7],\n      [-58, -25],\n      [-17, -13],\n      [-26, -53]\n    ],\n    [\n      [30097, 65246],\n      [-20, -46],\n      [-6, 102],\n      [2, 64],\n      [-10, 22],\n      [2, -159],\n      [-17, 2],\n      [-2, -35],\n      [-10, -7],\n      [-1, 55],\n      [16, 95],\n      [8, 68],\n      [17, 46]\n    ],\n    [\n      [30029, 65436],\n      [5, 7],\n      [11, -52],\n      [-5, -7],\n      [-11, 52]\n    ],\n    [\n      [30019, 65203],\n      [6, 51],\n      [-4, 23],\n      [5, 57],\n      [4, -20],\n      [0, -85],\n      [-11, -26]\n    ],\n    [\n      [29960, 64853],\n      [11, 80],\n      [5, -14],\n      [1, -76],\n      [-17, 10]\n    ],\n    [\n      [30068, 65494],\n      [-3, -45],\n      [-14, -41],\n      [-6, 42],\n      [4, 35],\n      [-19, 54],\n      [-8, 40],\n      [5, -129],\n      [-22, 17],\n      [12, -39],\n      [1, -75],\n      [-12, -11],\n      [8, -53],\n      [0, -72],\n      [-10, -45],\n      [-8, -73],\n      [-12, 6],\n      [-27, -18],\n      [-27, -34],\n      [-38, -30],\n      [-1, 16]\n    ]\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-custom/Example.tsx",
    "content": "/* eslint-disable react/jsx-handler-names */\nimport React, { useState } from 'react';\nimport * as topojson from 'topojson-client';\nimport { scaleQuantize } from '@visx/scale';\nimport { CustomProjection, Graticule } from '@visx/geo';\nimport type { Projection } from '@visx/geo';\nimport {\n  geoConicConformal,\n  geoTransverseMercator,\n  geoNaturalEarth1,\n  geoConicEquidistant,\n  geoOrthographic,\n  geoStereographic,\n} from '@visx/vendor/d3-geo';\nimport { Zoom } from '@visx/zoom';\nimport topology from './world-topo.json';\n\nexport type GeoCustomProps = {\n  width: number;\n  height: number;\n  events?: boolean;\n};\n\ninterface FeatureShape {\n  type: 'Feature';\n  id: string;\n  geometry: { coordinates: [number, number][][]; type: 'Polygon' };\n  properties: { name: string };\n}\n\nexport const background = '#252b7e';\nconst purple = '#201c4e';\nconst PROJECTIONS: { [projection: string]: Projection } = {\n  geoConicConformal,\n  geoTransverseMercator,\n  geoNaturalEarth1,\n  geoConicEquidistant,\n  geoOrthographic,\n  geoStereographic,\n};\n\n// @ts-expect-error\nconst world = topojson.feature(topology, topology.objects.units) as {\n  type: 'FeatureCollection';\n  features: FeatureShape[];\n};\n\nconst color = scaleQuantize({\n  domain: [\n    Math.min(...world.features.map((f) => f.geometry.coordinates.length)),\n    Math.max(...world.features.map((f) => f.geometry.coordinates.length)),\n  ],\n  range: [\n    '#019ece',\n    '#f4448b',\n    '#fccf35',\n    '#82b75d',\n    '#b33c88',\n    '#fc5e2f',\n    '#f94b3a',\n    '#f63a48',\n    '#dde1fe',\n    '#8993f9',\n    '#b6c8fb',\n    '#65fe8d',\n  ],\n});\n\nexport default function GeoCustom({ width, height, events = true }: GeoCustomProps) {\n  const [projection, setProjection] = useState<keyof typeof PROJECTIONS>('geoConicConformal');\n\n  const centerX = width / 2;\n  const centerY = height / 2;\n  const initialScale = (width / 630) * 100;\n\n  return width < 10 ? null : (\n    <>\n      <Zoom<SVGSVGElement>\n        width={width}\n        height={height}\n        scaleXMin={100}\n        scaleXMax={1000}\n        scaleYMin={100}\n        scaleYMax={1000}\n        initialTransformMatrix={{\n          scaleX: initialScale,\n          scaleY: initialScale,\n          translateX: centerX,\n          translateY: centerY,\n          skewX: 0,\n          skewY: 0,\n        }}\n      >\n        {(zoom) => (\n          <div className=\"container\">\n            <svg\n              width={width}\n              height={height}\n              className={zoom.isDragging ? 'dragging' : undefined}\n              ref={zoom.containerRef}\n              style={{ touchAction: 'none' }}\n            >\n              <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />\n              <CustomProjection<FeatureShape>\n                projection={PROJECTIONS[projection]}\n                data={world.features}\n                scale={zoom.transformMatrix.scaleX}\n                translate={[zoom.transformMatrix.translateX, zoom.transformMatrix.translateY]}\n              >\n                {(customProjection) => (\n                  <g>\n                    <Graticule graticule={(g) => customProjection.path(g) || ''} stroke={purple} />\n                    {customProjection.features.map(({ feature, path }, i) => (\n                      <path\n                        key={`map-feature-${i}`}\n                        d={path || ''}\n                        fill={color(feature.geometry.coordinates.length)}\n                        stroke={background}\n                        strokeWidth={0.5}\n                        onClick={() => {\n                          if (events) alert(`Clicked: ${feature.properties.name} (${feature.id})`);\n                        }}\n                      />\n                    ))}\n                  </g>\n                )}\n              </CustomProjection>\n\n              {/** intercept all mouse events */}\n              <rect\n                x={0}\n                y={0}\n                width={width}\n                height={height}\n                rx={14}\n                fill=\"transparent\"\n                onTouchStart={zoom.dragStart}\n                onTouchMove={zoom.dragMove}\n                onTouchEnd={zoom.dragEnd}\n                onMouseDown={zoom.dragStart}\n                onMouseMove={zoom.dragMove}\n                onMouseUp={zoom.dragEnd}\n                onMouseLeave={() => {\n                  if (zoom.isDragging) zoom.dragEnd();\n                }}\n              />\n            </svg>\n            {events && (\n              <div className=\"controls\">\n                <button\n                  className=\"btn btn-zoom\"\n                  onClick={() => zoom.scale({ scaleX: 1.2, scaleY: 1.2 })}\n                >\n                  +\n                </button>\n                <button\n                  className=\"btn btn-zoom btn-bottom\"\n                  onClick={() => zoom.scale({ scaleX: 0.8, scaleY: 0.8 })}\n                >\n                  -\n                </button>\n                <button className=\"btn btn-lg\" onClick={zoom.reset}>\n                  Reset\n                </button>\n              </div>\n            )}\n          </div>\n        )}\n      </Zoom>\n      <label>\n        projection:{' '}\n        <select onChange={(event) => setProjection(event.target.value)}>\n          {Object.keys(PROJECTIONS).map((projectionName) => (\n            <option key={projectionName} value={projectionName}>\n              {projectionName}\n            </option>\n          ))}\n        </select>\n      </label>\n      <style jsx>{`\n        .container {\n          position: relative;\n        }\n        svg {\n          cursor: grab;\n        }\n        svg.dragging {\n          cursor: grabbing;\n        }\n        .btn {\n          margin: 0;\n          text-align: center;\n          border: none;\n          background: #dde1fe;\n          color: #222;\n          padding: 0 4px;\n          border-top: 1px solid #8993f9;\n        }\n        .btn-lg {\n          font-size: 12px;\n          line-height: 1;\n          padding: 4px;\n        }\n        .btn-zoom {\n          width: 26px;\n          font-size: 22px;\n        }\n        .btn-bottom {\n          margin-bottom: 1rem;\n        }\n        .controls {\n          position: absolute;\n          bottom: 20px;\n          right: 15px;\n          display: flex;\n          flex-direction: column;\n          align-items: flex-end;\n        }\n        label {\n          font-size: 12px;\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-custom/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-custom/package.json",
    "content": "{\n  \"name\": \"@visx/demo-geo-custom\",\n  \"description\": \"Standalone visx geo-custom demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/geo\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"@visx/zoom\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"topojson-client\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"geo\", \n    \"maps\",\n    \"projection\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-custom/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-custom/world-topo.d.ts",
    "content": "declare module '*.json';\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-custom/world-topo.json",
    "content": "{\n  \"arcs\": [\n    [\n      [7080, 7327],\n      [-5, 4],\n      [-10, -10],\n      [5, -6]\n    ],\n    [\n      [7070, 7315],\n      [-16, -12],\n      [-9, 5],\n      [-28, -4],\n      [-12, -6],\n      [-1, -5],\n      [-17, -18],\n      [-11, -16],\n      [6, -10],\n      [6, -18],\n      [-2, -15],\n      [3, -8],\n      [-18, -35],\n      [4, -12],\n      [-2, -18],\n      [-7, -5],\n      [-13, 0],\n      [-13, 4],\n      [3, -16],\n      [6, -6],\n      [-1, -9],\n      [4, -9],\n      [-12, -14],\n      [-8, 0],\n      [-6, -18],\n      [2, -7],\n      [-6, -11],\n      [2, -30],\n      [-8, -17],\n      [-6, -1],\n      [-2, 8],\n      [-15, 4],\n      [-3, -8],\n      [-14, -12],\n      [6, -9],\n      [-11, -7],\n      [-13, 6],\n      [-7, -15],\n      [-8, -7],\n      [-3, -19],\n      [2, -9],\n      [-4, -35],\n      [-32, -17],\n      [-16, 2],\n      [-11, -11],\n      [-14, 6],\n      [-30, -5],\n      [-46, 26]\n    ],\n    [\n      [6689, 6902],\n      [27, 56],\n      [1, 10],\n      [-4, 21],\n      [-24, 7],\n      [-1, 9],\n      [1, 35],\n      [-7, 43],\n      [0, 9],\n      [7, 14],\n      [1, 9],\n      [-10, 5],\n      [0, 31],\n      [11, 8],\n      [-5, 13],\n      [7, 6],\n      [5, 26],\n      [-1, 11],\n      [4, 19]\n    ],\n    [\n      [6701, 7234],\n      [8, -10],\n      [13, -1],\n      [6, -7],\n      [1, -9],\n      [5, 8],\n      [5, -4],\n      [13, 13],\n      [0, 24],\n      [9, 0],\n      [4, 6],\n      [20, 11],\n      [9, 15],\n      [0, 16],\n      [5, 14],\n      [-1, 9],\n      [9, 8],\n      [12, 0],\n      [4, 16],\n      [4, 3],\n      [15, -14],\n      [5, 2]\n    ],\n    [\n      [6847, 7334],\n      [14, 2],\n      [7, -12],\n      [6, 6],\n      [8, -6]\n    ],\n    [\n      [6882, 7324],\n      [7, -15],\n      [7, 10],\n      [15, 9],\n      [2, 5],\n      [10, -14],\n      [5, 7],\n      [-2, 13],\n      [4, 8],\n      [21, 2],\n      [-3, 18],\n      [5, 4],\n      [12, 26],\n      [9, -2],\n      [7, -9],\n      [-1, -21],\n      [6, 3],\n      [2, -8],\n      [-3, -14],\n      [-1, -35],\n      [3, -12],\n      [7, -4],\n      [15, 19],\n      [9, 1],\n      [3, 11],\n      [14, 14],\n      [13, -2],\n      [-1, -12],\n      [14, 8],\n      [12, 2],\n      [7, -9]\n    ],\n    [\n      [5665, 4557],\n      [3, -32],\n      [-3, -9],\n      [0, -36],\n      [2, -12],\n      [-5, -22],\n      [4, -12],\n      [-56, 0],\n      [0, -182],\n      [3, -21],\n      [6, -7],\n      [15, -33],\n      [6, -7],\n      [3, -10],\n      [6, -7]\n    ],\n    [\n      [5649, 4167],\n      [-53, -21],\n      [-11, 4],\n      [-8, -4],\n      [-13, 9],\n      [-8, -3],\n      [-17, 2],\n      [-5, 4],\n      [-10, 0],\n      [-7, 9],\n      [-5, 14],\n      [-52, 0],\n      [-66, 0],\n      [-7, -1],\n      [-12, 17],\n      [-4, 9],\n      [-6, 1],\n      [-18, -16],\n      [-15, 4],\n      [-6, -6]\n    ],\n    [\n      [5326, 4189],\n      [0, 28],\n      [2, -1],\n      [-2, 58],\n      [7, 9],\n      [1, 23],\n      [6, 24],\n      [2, 20],\n      [0, 23],\n      [5, 12],\n      [0, 26],\n      [4, 4],\n      [8, 20],\n      [0, 10],\n      [6, 12],\n      [5, 0],\n      [8, 20],\n      [5, 28],\n      [-1, 20],\n      [2, 29],\n      [-2, 15],\n      [-7, 15],\n      [-8, 46],\n      [-7, 29],\n      [6, 16],\n      [6, 7],\n      [-1, 21],\n      [-3, 9],\n      [-10, 48],\n      [-2, 4],\n      [0, 21],\n      [-8, 16],\n      [-8, 30],\n      [16, 4],\n      [10, 11]\n    ],\n    [\n      [5366, 4846],\n      [4, -2],\n      [18, 2],\n      [12, -3],\n      [21, 2],\n      [32, 1],\n      [7, -4],\n      [4, -15],\n      [0, -22],\n      [3, -16],\n      [3, -3],\n      [0, -19],\n      [10, -23],\n      [0, -8],\n      [9, -20],\n      [7, 4],\n      [6, -4],\n      [2, 6],\n      [33, 0],\n      [1, 20],\n      [4, 12],\n      [-2, 8],\n      [2, 18],\n      [21, 0],\n      [9, 5],\n      [-3, -22],\n      [36, 0],\n      [1, -22],\n      [-2, -20],\n      [5, -23],\n      [-4, -53],\n      [1, -14],\n      [6, -17],\n      [3, -2],\n      [4, -23],\n      [0, -22],\n      [-4, -9],\n      [3, -18],\n      [6, 7],\n      [13, -4],\n      [14, 9],\n      [12, -3],\n      [2, 8]\n    ],\n    [\n      [5363, 4916],\n      [-7, -5],\n      [-8, -18],\n      [-1, -40],\n      [-8, -2]\n    ],\n    [\n      [5339, 4851],\n      [-2, 5],\n      [2, 14],\n      [-6, 24]\n    ],\n    [\n      [5333, 4894],\n      [10, 23],\n      [7, 3],\n      [4, 10],\n      [9, -14]\n    ],\n    [\n      [5582, 7537],\n      [-1, 0]\n    ],\n    [\n      [5581, 7537],\n      [1, 0]\n    ],\n    [\n      [5537, 7617],\n      [1, 0]\n    ],\n    [\n      [5538, 7617],\n      [-1, 0]\n    ],\n    [\n      [5557, 7633],\n      [4, -13],\n      [7, -4],\n      [3, -22]\n    ],\n    [\n      [5571, 7594],\n      [-4, -21],\n      [6, -24]\n    ],\n    [\n      [5573, 7549],\n      [2, -10]\n    ],\n    [\n      [5575, 7539],\n      [6, -2]\n    ],\n    [\n      [5581, 7537],\n      [1, -1]\n    ],\n    [\n      [5582, 7536],\n      [0, 0]\n    ],\n    [\n      [5582, 7536],\n      [0, -5]\n    ],\n    [\n      [5582, 7531],\n      [1, -5]\n    ],\n    [\n      [5583, 7526],\n      [0, 0]\n    ],\n    [\n      [5583, 7526],\n      [-2, -13],\n      [-5, -2],\n      [-2, -17],\n      [-11, -8],\n      [3, -12],\n      [-6, -8],\n      [-5, 3]\n    ],\n    [\n      [5555, 7469],\n      [-3, 19],\n      [-11, 9],\n      [-1, 22],\n      [-4, 4],\n      [4, 16],\n      [-1, 29],\n      [5, 23],\n      [-7, 2]\n    ],\n    [\n      [5537, 7593],\n      [1, 14]\n    ],\n    [\n      [5538, 7607],\n      [0, 13]\n    ],\n    [\n      [5538, 7620],\n      [9, 19],\n      [3, -11],\n      [7, 5]\n    ],\n    [\n      [5553, 8659],\n      [10, -5],\n      [-7, -11],\n      [-10, 6],\n      [7, 10]\n    ],\n    [\n      [5047, 7630],\n      [-7, -5],\n      [-1, 11]\n    ],\n    [\n      [5039, 7636],\n      [8, 1],\n      [0, -7]\n    ],\n    [\n      [6563, 6637],\n      [0, 0]\n    ],\n    [\n      [6563, 6659],\n      [2, -2],\n      [1, -36]\n    ],\n    [\n      [6566, 6621],\n      [-8, -14],\n      [-3, 13],\n      [-6, -4],\n      [-1, -38],\n      [7, -9],\n      [-11, -3],\n      [-4, -6],\n      [2, -9],\n      [-10, -44],\n      [0, -17]\n    ],\n    [\n      [6532, 6490],\n      [-2, -5],\n      [-70, 18],\n      [-3, 5],\n      [-25, 63],\n      [0, 9]\n    ],\n    [\n      [6432, 6580],\n      [6, -1],\n      [0, -13],\n      [12, -3],\n      [10, 11],\n      [24, -2],\n      [11, -4],\n      [15, 12],\n      [6, 14],\n      [1, 15],\n      [11, 12],\n      [13, 31],\n      [11, 13],\n      [5, 19]\n    ],\n    [\n      [6557, 6684],\n      [3, -2],\n      [-1, -22],\n      [4, -1]\n    ],\n    [\n      [6562, 6642],\n      [0, 0]\n    ],\n    [\n      [3093, 2021],\n      [0, 6]\n    ],\n    [\n      [3093, 2027],\n      [0, -6]\n    ],\n    [\n      [3093, 2028],\n      [0, 123]\n    ],\n    [\n      [3093, 2151],\n      [10, -17],\n      [-8, -15],\n      [11, -6],\n      [5, -17],\n      [12, -13],\n      [7, -13],\n      [17, -13],\n      [11, -14],\n      [12, -7],\n      [20, 0],\n      [-5, -16],\n      [-18, 1],\n      [-11, -8],\n      [-12, 6],\n      [-51, 9]\n    ],\n    [\n      [3259, 3902],\n      [11, -14],\n      [7, -29],\n      [9, -17],\n      [15, -17],\n      [3, -11],\n      [17, -13],\n      [11, -1],\n      [15, -18],\n      [4, -9],\n      [15, -17],\n      [9, -5],\n      [5, -8],\n      [13, -5],\n      [8, -20],\n      [-6, -14],\n      [-3, -19],\n      [-8, -10],\n      [-1, -25],\n      [-3, -14],\n      [-5, -4],\n      [-5, -15],\n      [4, -5],\n      [13, 1],\n      [19, -8],\n      [5, -5],\n      [7, 4],\n      [5, -5],\n      [6, 3],\n      [4, -8],\n      [3, 12],\n      [5, 5],\n      [10, -9],\n      [5, 8],\n      [-1, 8],\n      [6, 12],\n      [6, 0],\n      [11, 18],\n      [5, 40],\n      [0, 22]\n    ],\n    [\n      [3483, 3710],\n      [5, -4],\n      [6, 7],\n      [9, -9],\n      [1, -17],\n      [5, -14],\n      [-2, -9],\n      [0, -25],\n      [-2, -17],\n      [-13, -19],\n      [-15, -5],\n      [-6, -19],\n      [-8, -4],\n      [-6, -13],\n      [-7, -5],\n      [3, -10],\n      [-6, -4],\n      [-20, -39],\n      [-2, -11],\n      [-12, -25],\n      [-5, -2],\n      [-1, -10],\n      [-8, -11]\n    ],\n    [\n      [3399, 3445],\n      [0, -7],\n      [-7, -12],\n      [2, -23],\n      [-3, -20],\n      [-5, -13],\n      [3, -4],\n      [-2, -14],\n      [-4, -5],\n      [3, -25],\n      [-3, -8]\n    ],\n    [\n      [3383, 3314],\n      [2, -25],\n      [-2, -12],\n      [-6, 0],\n      [-4, -34],\n      [5, -29],\n      [-4, -14],\n      [5, -12],\n      [23, -21],\n      [11, -25],\n      [-7, -19],\n      [0, -13],\n      [7, -17],\n      [12, -6],\n      [1, -29],\n      [-11, -30],\n      [-13, -26],\n      [-2, -16],\n      [-27, -24],\n      [-37, -16],\n      [-27, -8],\n      [-27, 0],\n      [-15, 11],\n      [3, -32],\n      [5, -9],\n      [-2, -21],\n      [-4, 3],\n      [-1, -21],\n      [-4, -5],\n      [6, -17],\n      [-2, -18],\n      [-20, -16],\n      [-21, 0],\n      [-26, 20],\n      [-8, 2],\n      [-4, -10],\n      [5, -32],\n      [-2, -24],\n      [6, -16],\n      [11, -4],\n      [-4, -10],\n      [13, 0],\n      [2, 10],\n      [-6, 0],\n      [14, 11],\n      [5, -13],\n      [1, -17],\n      [-3, -12],\n      [-12, -5],\n      [-3, 16],\n      [-13, 5],\n      [-9, -15],\n      [19, -13],\n      [-20, -17],\n      [-8, -19],\n      [3, -43],\n      [-4, -11],\n      [-9, -7],\n      [0, -20],\n      [-14, 3],\n      [-8, -5],\n      [-1, -8],\n      [-14, -5],\n      [-9, -18],\n      [0, -9],\n      [-6, -9],\n      [-2, -14],\n      [7, -25],\n      [7, -6],\n      [8, -16],\n      [6, -4],\n      [17, 0],\n      [6, -6],\n      [2, -20],\n      [-5, -33],\n      [-6, -2],\n      [-12, -18],\n      [-16, -14],\n      [-3, -10],\n      [-9, -10],\n      [-6, -22],\n      [2, -16],\n      [-5, -18],\n      [-5, -6],\n      [-23, -14],\n      [-5, -12],\n      [-2, -21],\n      [2, -24],\n      [9, -34],\n      [11, -24],\n      [-3, -1]\n    ],\n    [\n      [3098, 2168],\n      [-15, 10],\n      [-26, 10],\n      [-55, 1],\n      [-4, 12],\n      [-11, 13],\n      [6, 19],\n      [-5, 7],\n      [5, 13],\n      [-2, 14],\n      [-13, 1],\n      [-11, -8],\n      [-3, 26],\n      [-7, 9],\n      [2, 22],\n      [-3, 11],\n      [3, 15],\n      [9, 1],\n      [3, 17],\n      [12, 10],\n      [1, 22],\n      [7, 7],\n      [-1, 15],\n      [-5, 7],\n      [6, 30],\n      [8, 13],\n      [2, 22],\n      [8, 9],\n      [-3, 32],\n      [4, 11],\n      [-4, 4],\n      [0, 15],\n      [8, 5],\n      [5, 13],\n      [-8, 17],\n      [-14, 5],\n      [7, 5],\n      [17, 3],\n      [2, 17],\n      [-18, 3],\n      [-1, 18],\n      [5, 7],\n      [-4, 14],\n      [3, 7],\n      [-6, 16],\n      [5, 9],\n      [-11, 7],\n      [0, 45],\n      [3, 8],\n      [8, 1],\n      [-5, 26],\n      [2, 43],\n      [-3, 11],\n      [4, 27],\n      [5, 21],\n      [-2, 18],\n      [8, 13],\n      [0, 25],\n      [15, 13],\n      [-3, 15],\n      [-1, 21],\n      [-5, 20],\n      [3, 35],\n      [-2, 24],\n      [3, 12],\n      [10, 4],\n      [-1, 8],\n      [10, 14],\n      [-2, 40],\n      [-4, 4],\n      [6, 6],\n      [0, 12],\n      [9, 39],\n      [6, 2],\n      [-2, 34],\n      [3, 18],\n      [-9, 9],\n      [3, 18],\n      [-4, 6],\n      [0, 16],\n      [-5, 12],\n      [-2, 14],\n      [3, 9],\n      [-5, 2],\n      [-3, 15],\n      [1, 24],\n      [6, 8],\n      [0, 13],\n      [5, 19],\n      [7, 8],\n      [2, 10],\n      [-4, 4],\n      [2, 16],\n      [-4, 31],\n      [7, 10],\n      [1, 26],\n      [4, 17],\n      [13, 33],\n      [9, 38],\n      [6, -3],\n      [8, 7],\n      [0, 10],\n      [-8, 21],\n      [0, 10],\n      [5, 9],\n      [-2, 26],\n      [-3, 17],\n      [2, 15],\n      [5, 4],\n      [-6, 14],\n      [2, 14],\n      [7, 13],\n      [25, 20],\n      [9, 54],\n      [-5, 17]\n    ],\n    [\n      [3133, 3869],\n      [5, 9],\n      [0, 8],\n      [7, 6],\n      [2, 12],\n      [9, 5],\n      [4, 19],\n      [3, -2],\n      [10, -17],\n      [21, 0],\n      [12, -5],\n      [6, -38],\n      [3, 20],\n      [8, 29],\n      [32, 1],\n      [4, -14]\n    ],\n    [\n      [6265, 7522],\n      [0, 0]\n    ],\n    [\n      [6249, 7560],\n      [2, -10],\n      [15, -14],\n      [-6, -16],\n      [6, -11],\n      [11, -10],\n      [-3, -13],\n      [-7, 2],\n      [15, -25],\n      [9, -1],\n      [-3, -13],\n      [5, -7],\n      [-5, -5],\n      [3, -15]\n    ],\n    [\n      [6291, 7422],\n      [-10, -2]\n    ],\n    [\n      [6281, 7420],\n      [-4, 23],\n      [-7, 7],\n      [1, 10],\n      [-13, -1],\n      [-8, 14],\n      [-7, -4]\n    ],\n    [\n      [6243, 7469],\n      [-8, 16],\n      [-12, 1],\n      [-11, 7],\n      [-3, 20],\n      [5, 12],\n      [-3, 17],\n      [-5, 8]\n    ],\n    [\n      [6206, 7550],\n      [9, 0],\n      [11, 7],\n      [10, -3],\n      [13, 6]\n    ],\n    [\n      [6249, 7546],\n      [0, 0]\n    ],\n    [\n      [6255, 7542],\n      [0, 0]\n    ],\n    [\n      [488, 408],\n      [24, -7],\n      [-48, -4],\n      [-13, 16],\n      [37, -5]\n    ],\n    [\n      [542, 484],\n      [-90, 7],\n      [20, 11],\n      [65, -10],\n      [5, -8]\n    ],\n    [\n      [3331, 592],\n      [8, -3],\n      [-1, -57],\n      [-23, -11],\n      [-52, 4],\n      [-17, 17],\n      [-32, -10],\n      [-67, 20],\n      [3, 10],\n      [19, -10],\n      [115, 3],\n      [8, 27],\n      [39, 10]\n    ],\n    [\n      [4135, 588],\n      [34, -2],\n      [-10, -10],\n      [-44, 8],\n      [-5, 11],\n      [25, -7]\n    ],\n    [\n      [3120, 602],\n      [25, -4],\n      [35, -20],\n      [-20, -7],\n      [-40, 31]\n    ],\n    [\n      [3137, 618],\n      [-11, -15],\n      [-30, 6],\n      [41, 9]\n    ],\n    [\n      [4054, 618],\n      [1, -6],\n      [-76, 3],\n      [30, 13],\n      [45, -10]\n    ],\n    [\n      [547, 618],\n      [21, -9],\n      [14, -23],\n      [-47, -2],\n      [-90, 25],\n      [-10, 7],\n      [5, 17],\n      [24, 15],\n      [25, 0],\n      [58, -30]\n    ],\n    [\n      [3143, 666],\n      [-58, -38],\n      [-39, -36],\n      [-31, 3],\n      [-10, 10],\n      [11, 23],\n      [23, 11],\n      [92, 33],\n      [12, -6]\n    ],\n    [\n      [9654, 680],\n      [-35, -8],\n      [-8, 14],\n      [21, -7],\n      [22, 11],\n      [0, -10]\n    ],\n    [\n      [3740, 650],\n      [1, -7],\n      [44, 2],\n      [21, -39],\n      [-7, -30],\n      [-18, -1],\n      [9, -11],\n      [-158, -26],\n      [-16, -9],\n      [-121, -4],\n      [1, 17],\n      [22, 27],\n      [26, -4],\n      [60, 37],\n      [-13, 14],\n      [14, 40],\n      [31, 33],\n      [52, 14],\n      [37, -3],\n      [38, -11],\n      [19, -13],\n      [-4, -20],\n      [-38, -6]\n    ],\n    [\n      [9641, 732],\n      [63, -13],\n      [-27, -10],\n      [-42, -2],\n      [-19, 12],\n      [25, 13]\n    ],\n    [\n      [839, 754],\n      [14, -14],\n      [-32, 3],\n      [-11, 7],\n      [29, 4]\n    ],\n    [\n      [938, 754],\n      [-21, -7],\n      [-2, 12],\n      [23, -5]\n    ],\n    [\n      [951, 834],\n      [16, -10],\n      [-24, 3],\n      [8, 7]\n    ],\n    [\n      [9561, 885],\n      [-8, -14],\n      [-7, 9],\n      [15, 5]\n    ],\n    [\n      [1342, 903],\n      [19, -12],\n      [-6, -6],\n      [-27, 12],\n      [14, 6]\n    ],\n    [\n      [1458, 897],\n      [-1, -13],\n      [-17, 20],\n      [18, -7]\n    ],\n    [\n      [1760, 918],\n      [-17, -8],\n      [-3, 7],\n      [26, 11],\n      [-6, -10]\n    ],\n    [\n      [1680, 914],\n      [-12, 3],\n      [10, 17],\n      [17, -2],\n      [-1, -10],\n      [-14, -8]\n    ],\n    [\n      [1635, 935],\n      [17, 0],\n      [7, -14],\n      [-23, -10],\n      [0, -10],\n      [-32, -4],\n      [-22, 7],\n      [3, 11],\n      [15, 12],\n      [-27, 3],\n      [7, 10],\n      [55, -5]\n    ],\n    [\n      [4425, 917],\n      [9, -22],\n      [-14, 0],\n      [-4, 16],\n      [-29, 3],\n      [20, 7],\n      [12, 19],\n      [11, 1],\n      [-5, -24]\n    ],\n    [\n      [9717, 944],\n      [-11, 3],\n      [8, 14],\n      [3, -17]\n    ],\n    [\n      [1498, 961],\n      [13, -7],\n      [9, -16],\n      [-11, -7],\n      [29, 6],\n      [17, -9],\n      [7, -11],\n      [-6, -12],\n      [-22, 3],\n      [-48, 22],\n      [0, 8],\n      [-19, 7],\n      [-3, 16],\n      [34, 0]\n    ],\n    [\n      [2955, 972],\n      [-2, -10],\n      [-13, 0],\n      [15, 10]\n    ],\n    [\n      [2514, 979],\n      [-20, -5],\n      [-4, 5],\n      [22, 8],\n      [2, -8]\n    ],\n    [\n      [2918, 987],\n      [18, -3],\n      [-8, -40],\n      [-36, 14],\n      [-7, 10],\n      [11, 7],\n      [18, 0],\n      [-19, 10],\n      [23, 2]\n    ],\n    [\n      [2474, 988],\n      [-3, -19],\n      [-14, -1],\n      [6, 17],\n      [-10, 16],\n      [23, 1],\n      [-2, -14]\n    ],\n    [\n      [2365, 999],\n      [-10, 3],\n      [18, 7],\n      [-8, -10]\n    ],\n    [\n      [2270, 1031],\n      [14, -3],\n      [-2, 14],\n      [10, 0],\n      [2, -17],\n      [10, 19],\n      [19, 1],\n      [5, -10],\n      [-23, -11],\n      [8, -3],\n      [27, 11],\n      [-6, -10],\n      [13, -10],\n      [-15, -1],\n      [1, -9],\n      [-72, 2],\n      [2, 5],\n      [-24, -1],\n      [6, 7],\n      [-29, 6],\n      [-58, 7],\n      [6, 10],\n      [57, 7],\n      [8, -11],\n      [7, 7],\n      [23, -12],\n      [-13, 13],\n      [17, 9],\n      [15, -6],\n      [-8, -14]\n    ],\n    [\n      [4919, 1112],\n      [8, -10],\n      [14, 1],\n      [-17, -19],\n      [-8, 18],\n      [-16, 10],\n      [19, 0]\n    ],\n    [\n      [2947, 1119],\n      [8, -13],\n      [-22, -10],\n      [-48, -11],\n      [-9, 4],\n      [2, 12],\n      [33, 5],\n      [9, 12],\n      [8, -13],\n      [3, 14],\n      [16, 0]\n    ],\n    [\n      [3313, 1111],\n      [-7, 10],\n      [11, 1],\n      [-4, -11]\n    ],\n    [\n      [4835, 1126],\n      [-5, -10],\n      [-10, 9],\n      [15, 1]\n    ],\n    [\n      [5082, 1116],\n      [-11, 6],\n      [19, 4],\n      [-8, -10]\n    ],\n    [\n      [4913, 1121],\n      [-10, 0],\n      [6, 12],\n      [12, 3],\n      [2, -14],\n      [-10, -1]\n    ],\n    [\n      [7004, 1113],\n      [-10, 3],\n      [-5, 16],\n      [16, -11],\n      [-1, -8]\n    ],\n    [\n      [5124, 1122],\n      [-12, 11],\n      [12, 5],\n      [0, -16]\n    ],\n    [\n      [5745, 1129],\n      [-22, 0],\n      [-2, 11],\n      [19, 6],\n      [5, -17]\n    ],\n    [\n      [5040, 1146],\n      [-7, -18],\n      [-5, 21],\n      [12, -3]\n    ],\n    [\n      [2924, 1165],\n      [8, -12],\n      [-12, -13],\n      [-23, 5],\n      [-1, 13],\n      [8, 7],\n      [20, 0]\n    ],\n    [\n      [5449, 1148],\n      [-17, 8],\n      [11, 12],\n      [19, -1],\n      [-11, -8],\n      [-2, -11]\n    ],\n    [\n      [3001, 1170],\n      [-23, 2],\n      [-6, 7],\n      [17, 4],\n      [12, -13]\n    ],\n    [\n      [3283, 1179],\n      [-6, -12],\n      [-16, 30],\n      [11, 2],\n      [11, -20]\n    ],\n    [\n      [3055, 1197],\n      [19, -24],\n      [1, -17],\n      [16, -26],\n      [11, -25],\n      [3, -60],\n      [-6, -23],\n      [-20, -7],\n      [-2, -10],\n      [-40, -7],\n      [-49, 0],\n      [-21, 13],\n      [10, 8],\n      [16, -3],\n      [45, -2],\n      [14, 8],\n      [-7, 6],\n      [-28, -9],\n      [-18, 10],\n      [35, 8],\n      [1, 5],\n      [-31, 0],\n      [-14, 17],\n      [-11, -17],\n      [-31, 2],\n      [10, -8],\n      [-14, -9],\n      [-38, 14],\n      [-1, 15],\n      [15, 8],\n      [16, -8],\n      [-4, 12],\n      [9, 4],\n      [16, -13],\n      [-4, 14],\n      [29, -2],\n      [9, 7],\n      [-23, 7],\n      [10, 6],\n      [30, -6],\n      [19, 11],\n      [20, 0],\n      [13, -11],\n      [-2, 16],\n      [-35, 7],\n      [5, 17],\n      [24, 8],\n      [15, -4],\n      [-18, 14],\n      [-20, -4],\n      [-27, 14],\n      [7, 34],\n      [-10, 5],\n      [0, 20],\n      [45, 10],\n      [9, -7],\n      [2, -18]\n    ],\n    [\n      [7385, 1327],\n      [-15, 4],\n      [8, 9],\n      [7, -13]\n    ],\n    [\n      [3111, 1321],\n      [9, -5],\n      [-16, -13],\n      [-8, -22],\n      [-11, 0],\n      [-7, 9],\n      [22, 44],\n      [15, 12],\n      [5, -5],\n      [-10, -11],\n      [1, -9]\n    ],\n    [\n      [7686, 1378],\n      [4, -8],\n      [-14, -2],\n      [10, 10]\n    ],\n    [\n      [3174, 1408],\n      [-3, -16],\n      [-10, -2],\n      [6, 17],\n      [7, 1]\n    ],\n    [\n      [7805, 1401],\n      [-19, 0],\n      [-1, 7],\n      [12, 10],\n      [15, -7],\n      [-7, -10]\n    ],\n    [\n      [7870, 1413],\n      [-16, 19],\n      [9, -2],\n      [7, -17]\n    ],\n    [\n      [3410, 1465],\n      [-6, 6],\n      [14, 7],\n      [-8, -13]\n    ],\n    [\n      [3242, 1481],\n      [-2, -9],\n      [14, -8],\n      [-14, -12],\n      [-26, 3],\n      [20, 26],\n      [8, 0]\n    ],\n    [\n      [3270, 1492],\n      [2, -17],\n      [-12, -8],\n      [10, 25]\n    ],\n    [\n      [3394, 1508],\n      [-2, -9],\n      [20, -7],\n      [-8, -17],\n      [-7, 6],\n      [-7, -7],\n      [-14, 20],\n      [5, 8],\n      [13, 6]\n    ],\n    [\n      [3446, 1521],\n      [-9, 7],\n      [15, -2],\n      [-6, -5]\n    ],\n    [\n      [0, 324],\n      [46, 3],\n      [68, -14],\n      [19, 8],\n      [194, -14],\n      [21, -11],\n      [128, -2],\n      [122, -11],\n      [81, -3],\n      [-58, 13],\n      [54, 1],\n      [-124, 12],\n      [-104, 7],\n      [24, 11],\n      [-55, 17],\n      [37, 2],\n      [-52, 17],\n      [-71, -3],\n      [-37, 23],\n      [-127, 27],\n      [73, -2],\n      [18, -14],\n      [73, -4],\n      [20, 4],\n      [70, -3],\n      [6, -14],\n      [50, 10],\n      [19, -11],\n      [127, 8],\n      [18, 9],\n      [-44, 5],\n      [81, 5],\n      [16, 14],\n      [70, 14],\n      [-10, 10],\n      [-54, 26],\n      [31, 11],\n      [-19, 10],\n      [-74, 13],\n      [17, 11],\n      [109, 6],\n      [135, 7],\n      [0, 5],\n      [-77, 24],\n      [-11, 11],\n      [13, 10],\n      [43, -4],\n      [46, 10],\n      [-17, 11],\n      [-75, 12],\n      [-55, 17],\n      [-3, 5],\n      [-68, 8],\n      [-43, 21],\n      [14, 11],\n      [48, 6],\n      [-2, 14],\n      [-71, -7],\n      [-47, 23],\n      [14, 18],\n      [-3, 26],\n      [9, 1],\n      [24, -17],\n      [21, 17],\n      [21, -5],\n      [18, 4],\n      [38, -10],\n      [-9, -10],\n      [36, -3],\n      [2, 10],\n      [72, -30],\n      [30, 16],\n      [30, 6],\n      [-36, 7],\n      [7, 14],\n      [32, -17],\n      [21, 7],\n      [13, -13],\n      [27, 0],\n      [-16, 13],\n      [21, 1],\n      [-31, 15],\n      [29, -5],\n      [-22, 20],\n      [-27, 16],\n      [-38, -3],\n      [-33, 3],\n      [2, 9],\n      [28, 4],\n      [9, 7],\n      [69, -21],\n      [6, 8],\n      [-27, 13],\n      [9, 11],\n      [56, 6],\n      [1, 10],\n      [41, 4],\n      [2, 6],\n      [19, -3],\n      [9, -14],\n      [18, 0],\n      [-10, 14],\n      [29, 6],\n      [16, 14],\n      [61, 4],\n      [30, -4],\n      [-16, 9],\n      [4, 14],\n      [30, 0],\n      [11, 11],\n      [22, -4],\n      [18, -16],\n      [30, 9],\n      [58, -4],\n      [20, -5],\n      [64, 13],\n      [93, 0],\n      [8, -7],\n      [45, 3],\n      [41, 0],\n      [59, 10],\n      [-3, 10],\n      [24, 6],\n      [6, -12],\n      [33, -3],\n      [51, 6],\n      [-7, 21],\n      [11, 10],\n      [21, 0],\n      [-9, -7],\n      [19, 2],\n      [-8, -12],\n      [4, -14],\n      [15, 3],\n      [-18, -16],\n      [-6, -21],\n      [9, 6],\n      [46, 8],\n      [15, 0],\n      [-10, 11],\n      [0, 20],\n      [15, 6],\n      [35, -17],\n      [-5, -19],\n      [-34, -18],\n      [4, -7],\n      [45, 4],\n      [84, -10],\n      [53, 13],\n      [28, -3],\n      [14, 4],\n      [49, -4],\n      [-3, -8],\n      [20, -8],\n      [70, 13],\n      [-27, 6],\n      [2, 10],\n      [-34, 3],\n      [17, 7],\n      [3, 14],\n      [-46, 3],\n      [5, 11],\n      [-7, 15],\n      [-33, 5],\n      [-4, 20],\n      [42, -4],\n      [3, -6],\n      [47, 2],\n      [-5, 21],\n      [-41, 3],\n      [-46, 0],\n      [-11, 7],\n      [-4, 20],\n      [11, 7],\n      [26, -4],\n      [-17, -12],\n      [21, -4],\n      [33, 4],\n      [84, -1],\n      [9, -7],\n      [44, -11],\n      [17, 7],\n      [24, -7],\n      [21, 8],\n      [46, 0],\n      [33, -7],\n      [16, 10],\n      [25, 1],\n      [6, 10],\n      [-10, 17],\n      [33, -4],\n      [1, -10],\n      [-15, -14],\n      [9, -9],\n      [30, 6],\n      [8, -11],\n      [38, 11],\n      [5, -13],\n      [28, -10],\n      [20, 2],\n      [43, -19],\n      [29, 9],\n      [-2, 28],\n      [24, -11],\n      [-8, 25],\n      [28, -2],\n      [24, -17],\n      [-2, -16],\n      [55, 8],\n      [5, -7],\n      [-15, -14],\n      [48, 6],\n      [7, 5],\n      [34, -5],\n      [26, 15],\n      [57, 12],\n      [21, -2],\n      [42, 10],\n      [35, 16],\n      [22, 43],\n      [-1, 7],\n      [-20, 21],\n      [-4, 13],\n      [6, 23],\n      [-15, 38],\n      [-15, 16],\n      [4, 21],\n      [-13, 16],\n      [15, 0],\n      [-1, 7],\n      [25, -14],\n      [5, 14],\n      [11, 6],\n      [0, 11],\n      [-18, 7],\n      [14, 5],\n      [-5, 17],\n      [6, 14],\n      [-9, 16],\n      [12, 3],\n      [6, 21],\n      [-10, 5],\n      [-19, -1],\n      [15, 30],\n      [6, 0],\n      [-2, -17],\n      [15, -6],\n      [1, 26],\n      [-4, 14],\n      [8, 4],\n      [14, -7],\n      [5, 34],\n      [14, -2],\n      [-5, 11],\n      [19, -4],\n      [3, 23],\n      [16, 1],\n      [-5, 27],\n      [11, 6],\n      [16, -7],\n      [-4, 11],\n      [20, 14],\n      [11, -3],\n      [9, 12],\n      [10, 1],\n      [-1, 10],\n      [14, 4],\n      [-1, 13],\n      [30, 14],\n      [13, -2],\n      [3, 10],\n      [12, 2],\n      [1, 8],\n      [21, 4],\n      [7, 8],\n      [13, 6],\n      [11, -3],\n      [7, -20],\n      [-10, -3],\n      [-2, 12],\n      [-15, -12],\n      [-10, 0],\n      [-15, -17],\n      [-9, -22],\n      [-9, -6],\n      [-7, 7],\n      [-6, -6],\n      [-19, -5],\n      [-17, -29],\n      [-20, 3],\n      [6, -10],\n      [-18, -10],\n      [9, -14],\n      [-14, -14],\n      [13, -19],\n      [16, 3],\n      [0, 10],\n      [21, -2],\n      [-16, -14],\n      [-16, 0],\n      [-2, -16],\n      [-5, 16],\n      [-19, -3],\n      [1, -28],\n      [-16, 27],\n      [-15, 3],\n      [-10, -29],\n      [11, -10],\n      [-9, -4],\n      [-14, 11],\n      [-12, -15],\n      [6, -16],\n      [-15, -6],\n      [-8, 5],\n      [-3, -33],\n      [10, -6],\n      [-12, -11],\n      [21, 6],\n      [6, -6],\n      [-20, -7],\n      [14, -6],\n      [-10, -7],\n      [36, -17],\n      [-2, 17],\n      [23, 7],\n      [-14, -17],\n      [15, -6],\n      [-5, -8],\n      [14, -25],\n      [14, -7],\n      [-2, -21],\n      [15, -13],\n      [-1, -11],\n      [-10, 4],\n      [5, -18],\n      [22, 1],\n      [-16, -24],\n      [20, 4],\n      [9, -21],\n      [-5, -12],\n      [-12, -1],\n      [-14, -13],\n      [14, -1],\n      [11, 10],\n      [9, -8],\n      [-7, -12],\n      [-38, -3],\n      [36, -14],\n      [13, 10],\n      [0, -26],\n      [-19, -2],\n      [6, -18],\n      [17, 8],\n      [-7, -24],\n      [25, 4],\n      [-11, -19],\n      [-9, 8],\n      [-3, -13],\n      [-15, 12],\n      [-21, 5],\n      [13, -17],\n      [21, -10],\n      [-7, -23],\n      [-21, 5],\n      [21, -13],\n      [-23, -13],\n      [31, 7],\n      [-9, -17],\n      [-36, 6],\n      [17, -17],\n      [-10, -13],\n      [-13, -3],\n      [-2, 17],\n      [-17, 2],\n      [6, -15],\n      [-14, 3],\n      [-10, -10],\n      [18, 2],\n      [7, -9],\n      [-35, -4],\n      [-2, -7],\n      [33, -3],\n      [-85, -34],\n      [-52, -9],\n      [4, -3],\n      [-60, -13],\n      [4, -11],\n      [-17, -7],\n      [-31, -1],\n      [-20, 4],\n      [-46, 0],\n      [-31, 8],\n      [-64, 0],\n      [34, -42],\n      [23, -15],\n      [10, 6],\n      [66, -8],\n      [-25, -26],\n      [-38, -9],\n      [-61, 13],\n      [-95, 13],\n      [-30, -6],\n      [118, -34],\n      [-9, -17],\n      [-71, -7],\n      [-61, 21],\n      [-37, 30],\n      [12, -23],\n      [-13, -4],\n      [17, -20],\n      [42, -17],\n      [17, -23],\n      [18, -7],\n      [2, 20],\n      [108, -4],\n      [17, -13],\n      [-20, -24],\n      [-22, -3],\n      [-62, 0],\n      [55, -10],\n      [39, 6],\n      [24, -26],\n      [-8, -7],\n      [24, -16],\n      [19, 7],\n      [38, -10],\n      [7, 13],\n      [39, 9],\n      [21, -6],\n      [9, -14],\n      [46, -9],\n      [89, -24],\n      [77, -3],\n      [-92, -8],\n      [62, -5],\n      [-2, -4],\n      [-62, -1],\n      [-6, -25],\n      [26, -5],\n      [52, 8],\n      [75, 3],\n      [-64, -17],\n      [33, -33],\n      [-6, -17],\n      [66, -4],\n      [49, 30],\n      [72, 31],\n      [52, 14],\n      [16, -1],\n      [53, 11],\n      [65, 5],\n      [59, -2],\n      [6, -17],\n      [-17, -11],\n      [31, -7],\n      [67, 24],\n      [-2, 10],\n      [36, 18],\n      [9, 16],\n      [79, 27],\n      [42, -13],\n      [34, 10],\n      [18, 17],\n      [53, 0],\n      [40, 12],\n      [42, -3],\n      [-21, 10],\n      [37, 0],\n      [5, 7],\n      [153, 6],\n      [48, 10],\n      [-61, 7],\n      [-165, 11],\n      [31, 17],\n      [-27, 0],\n      [9, 15],\n      [-73, -12],\n      [-96, 23],\n      [-5, 14],\n      [12, 23],\n      [11, 3],\n      [8, 18],\n      [24, 0],\n      [-7, 12],\n      [28, 18],\n      [34, 10],\n      [17, 0],\n      [5, 10],\n      [28, 7],\n      [15, 13],\n      [36, 16],\n      [52, 10],\n      [29, 14],\n      [48, 10],\n      [53, 7],\n      [31, -4],\n      [22, 14],\n      [17, -6],\n      [43, 6],\n      [-18, 11],\n      [29, 26],\n      [-3, 10],\n      [14, 17],\n      [24, 3],\n      [23, -7],\n      [39, 33],\n      [-10, 4],\n      [-27, -10],\n      [-22, 3],\n      [17, 4],\n      [-20, 7],\n      [1, 13],\n      [28, 23],\n      [18, 3],\n      [12, -9],\n      [16, 11],\n      [-15, 16],\n      [29, -7],\n      [14, 11],\n      [42, 13],\n      [3, 19],\n      [10, 20],\n      [-18, 0],\n      [-18, 7],\n      [-1, 18],\n      [16, 2],\n      [1, -9],\n      [21, -10],\n      [7, 17],\n      [16, 9],\n      [-12, 10],\n      [13, 4],\n      [3, -10],\n      [22, -7],\n      [10, -28],\n      [15, 7],\n      [15, -5],\n      [-4, 9],\n      [6, 23],\n      [-11, 13],\n      [13, 5],\n      [25, -7],\n      [16, 14],\n      [13, -8],\n      [-20, -29],\n      [71, -3],\n      [7, -9],\n      [4, 12],\n      [18, 3],\n      [5, -6],\n      [28, -5],\n      [7, 11],\n      [12, -7],\n      [-4, -14],\n      [12, -9],\n      [21, 25],\n      [13, 8],\n      [41, 14],\n      [105, 20],\n      [19, 0],\n      [28, 7],\n      [-5, 17],\n      [12, 2],\n      [-1, -17],\n      [11, -3],\n      [25, 9],\n      [-8, 8],\n      [9, 9],\n      [22, -23],\n      [31, -14],\n      [21, -5],\n      [14, 25],\n      [18, 7],\n      [-16, 10],\n      [16, 1],\n      [8, -13],\n      [22, -4],\n      [22, 3],\n      [27, -4],\n      [3, 9],\n      [17, 3],\n      [-3, -18],\n      [45, -4],\n      [11, 1],\n      [-6, 11],\n      [17, 9],\n      [11, -10],\n      [-10, -23],\n      [10, -10],\n      [23, -1],\n      [26, 4],\n      [3, 13],\n      [16, 24],\n      [24, -18],\n      [-21, -6],\n      [14, -7],\n      [26, -5],\n      [13, 26],\n      [15, -4],\n      [0, -15],\n      [27, -15],\n      [31, -3],\n      [35, 17],\n      [23, 3],\n      [38, 21],\n      [40, 5],\n      [38, 11],\n      [7, 7],\n      [2, 33],\n      [-12, 13],\n      [-1, 13],\n      [20, 12],\n      [28, 0],\n      [4, -8],\n      [-21, -13],\n      [24, -1],\n      [20, -13],\n      [-2, -23],\n      [45, 4],\n      [8, -15],\n      [7, 9],\n      [26, -1],\n      [-5, -7],\n      [19, -19],\n      [2, 12],\n      [13, 7],\n      [-1, 10],\n      [15, 4],\n      [-2, 32],\n      [4, 14],\n      [26, 6],\n      [21, 15],\n      [28, 4],\n      [8, 17],\n      [32, 8],\n      [24, 0],\n      [-6, 5],\n      [34, 13],\n      [14, -6],\n      [-2, 23],\n      [18, 5],\n      [14, -8],\n      [-13, -7],\n      [10, -3],\n      [6, -12],\n      [9, 8],\n      [16, -6],\n      [-5, -17],\n      [13, 20],\n      [-3, 14],\n      [16, 5],\n      [2, 11],\n      [-19, -3],\n      [-6, 13],\n      [27, 6],\n      [-2, -9],\n      [15, 2],\n      [0, -13],\n      [11, 8],\n      [11, -7],\n      [10, 7],\n      [-14, 3],\n      [10, 16],\n      [-16, 1],\n      [-1, 12],\n      [9, 14],\n      [23, 4],\n      [11, 12],\n      [30, 4],\n      [25, 7],\n      [40, -6],\n      [19, -10],\n      [15, -20],\n      [11, 3],\n      [13, -8],\n      [1, -9],\n      [-36, 3],\n      [15, -8],\n      [-11, -23],\n      [1, -12],\n      [7, 13],\n      [33, 10],\n      [23, -11],\n      [12, 1],\n      [5, -20],\n      [12, -4],\n      [4, 11],\n      [24, 0],\n      [18, -7],\n      [45, -7],\n      [24, 9],\n      [30, -9],\n      [45, -7],\n      [48, -4],\n      [9, -3],\n      [35, 8],\n      [-1, -15],\n      [14, -30],\n      [-13, -3],\n      [-7, -17],\n      [13, 0],\n      [-16, -9],\n      [12, -8],\n      [0, -9],\n      [-27, -3],\n      [17, -14],\n      [-13, -6],\n      [9, -5],\n      [-17, -12],\n      [-13, 18],\n      [-18, -29],\n      [13, -14],\n      [34, 8],\n      [1, -21],\n      [-15, -30],\n      [-17, -8],\n      [-5, -19],\n      [-10, -7],\n      [-6, -33],\n      [-12, -36],\n      [-15, -8],\n      [25, -10],\n      [22, 10],\n      [-3, 26],\n      [14, 11],\n      [34, 3],\n      [8, 20],\n      [20, 6],\n      [-6, 7],\n      [17, 12],\n      [14, 3],\n      [-11, 7],\n      [16, 40],\n      [17, 7],\n      [14, 12],\n      [-6, 15],\n      [22, 23],\n      [15, 5],\n      [8, -12],\n      [28, 6],\n      [5, -7],\n      [13, 8],\n      [-3, 16],\n      [35, 18],\n      [22, 5],\n      [7, 21],\n      [16, 4],\n      [-7, 13],\n      [9, 12],\n      [19, 10],\n      [73, 24],\n      [30, 4],\n      [13, -3],\n      [-6, 13],\n      [29, 18],\n      [36, -4],\n      [9, 7],\n      [18, 0],\n      [34, 17],\n      [8, -5],\n      [14, 4],\n      [23, -4],\n      [23, 1],\n      [19, 14],\n      [25, 5],\n      [12, -6],\n      [34, 1],\n      [4, -10],\n      [31, 17],\n      [11, -4],\n      [8, -10],\n      [13, 6],\n      [16, 0],\n      [16, 6],\n      [13, -10],\n      [14, 13],\n      [9, 0],\n      [8, -26],\n      [8, 11],\n      [13, 3],\n      [9, 9],\n      [27, 7],\n      [14, 17],\n      [0, 7],\n      [27, 0],\n      [8, 6],\n      [27, -9],\n      [24, -3],\n      [65, -22],\n      [29, -6],\n      [-3, -17],\n      [12, 13],\n      [16, -19],\n      [18, 0],\n      [29, 17],\n      [7, 0],\n      [-5, 20],\n      [13, 14],\n      [62, 17],\n      [35, -27],\n      [-3, -15],\n      [21, 2],\n      [16, -8],\n      [3, -10],\n      [-17, -16],\n      [-31, -8],\n      [-11, -15],\n      [25, 3],\n      [22, 10],\n      [32, 6],\n      [13, 10],\n      [-3, -10],\n      [19, 3],\n      [5, -6],\n      [32, -1],\n      [41, 14],\n      [0, -3],\n      [-45, -17],\n      [5, -7],\n      [73, 19],\n      [18, 14],\n      [58, 14],\n      [13, -9],\n      [11, 6],\n      [8, 14],\n      [14, 6],\n      [12, -14],\n      [14, 6],\n      [-8, -12],\n      [3, -11],\n      [11, 0],\n      [0, -16],\n      [28, 6],\n      [11, -7],\n      [10, 7],\n      [6, -10],\n      [11, 13],\n      [2, 21],\n      [16, 19],\n      [18, 8],\n      [28, -7],\n      [30, 4],\n      [8, 6],\n      [19, -2],\n      [13, -11],\n      [-5, -11],\n      [19, 10],\n      [11, 0],\n      [9, 12],\n      [4, -14],\n      [13, 7],\n      [8, -8],\n      [30, 1],\n      [20, -11],\n      [35, -3],\n      [12, -6],\n      [28, -3],\n      [10, -5],\n      [20, 3],\n      [14, -13],\n      [27, 10],\n      [12, -6],\n      [-4, -11],\n      [21, 8],\n      [5, -6],\n      [-22, -38],\n      [0, -10],\n      [11, 0],\n      [26, 23],\n      [9, -10],\n      [14, 7],\n      [14, -31],\n      [13, 5],\n      [-8, -14],\n      [8, -7],\n      [23, 3],\n      [4, -6],\n      [39, 4],\n      [35, -1],\n      [10, 4],\n      [-1, -21],\n      [16, -13],\n      [0, 14],\n      [24, 0],\n      [17, -11],\n      [23, 7],\n      [-5, 24],\n      [5, 3],\n      [24, -14],\n      [2, -10],\n      [16, -13],\n      [14, -3],\n      [17, -14],\n      [19, 3],\n      [6, -10],\n      [6, 8],\n      [17, -1],\n      [45, -17],\n      [14, -20],\n      [-16, 0],\n      [28, -13],\n      [19, -34],\n      [-3, -13],\n      [18, 0],\n      [2, 34],\n      [16, 3],\n      [22, -23],\n      [21, 2],\n      [-3, 7],\n      [38, -3],\n      [13, -6],\n      [12, 5],\n      [13, -6],\n      [-9, -6],\n      [27, 2],\n      [18, -20],\n      [10, -3],\n      [48, -30],\n      [2, 21],\n      [19, -31],\n      [-5, -6],\n      [-13, 7],\n      [-13, -34],\n      [12, 6],\n      [-5, -17],\n      [-39, 15],\n      [-11, -1],\n      [16, -13],\n      [29, -8],\n      [-8, -19],\n      [-20, -10],\n      [-14, 16],\n      [-2, -13],\n      [-32, 1],\n      [-12, 5],\n      [1, -16],\n      [9, 6],\n      [23, -6],\n      [-20, -4],\n      [-5, -9],\n      [-34, 0],\n      [9, -14],\n      [-26, -1],\n      [1, 15],\n      [-11, 9],\n      [-4, -20],\n      [17, -14],\n      [-15, 0],\n      [13, -30],\n      [-24, 1],\n      [-20, -6],\n      [-3, 16],\n      [-30, -30],\n      [9, -7],\n      [-5, -13],\n      [-22, 2],\n      [-34, -12],\n      [45, -1],\n      [-4, -7],\n      [21, -16],\n      [-2, -16],\n      [-18, -5],\n      [18, -3],\n      [4, -13],\n      [-13, -11],\n      [14, -5],\n      [-14, -17],\n      [18, 0],\n      [20, -30],\n      [-7, -11],\n      [27, -7],\n      [-11, -20],\n      [14, -7],\n      [20, 8],\n      [12, -14],\n      [36, -4],\n      [-15, -13],\n      [-12, 9],\n      [-47, -2],\n      [-37, -7],\n      [-14, -13],\n      [-34, 22],\n      [20, -29],\n      [-38, 2],\n      [-9, -8],\n      [9, -14],\n      [-23, -14],\n      [27, 3],\n      [-37, -16],\n      [52, -4],\n      [-72, -17],\n      [-6, -13],\n      [61, 6],\n      [7, -8],\n      [-35, -4],\n      [40, -4],\n      [-17, -13],\n      [9, -23],\n      [-22, 5],\n      [25, -20],\n      [40, -9],\n      [38, -31],\n      [-89, -12],\n      [59, -2],\n      [53, 8],\n      [73, -27],\n      [12, -14],\n      [24, 3],\n      [-3, -20],\n      [86, -9],\n      [66, -23],\n      [124, -12],\n      [-9955, -15]\n    ],\n    [\n      [3456, 1546],\n      [12, -3],\n      [-1, -9],\n      [-17, 4],\n      [-19, -9],\n      [3, 13],\n      [22, 4]\n    ],\n    [\n      [3431, 1556],\n      [12, -2],\n      [-6, -9],\n      [-6, 11]\n    ],\n    [\n      [3331, 1581],\n      [7, -5],\n      [-12, -7],\n      [-4, 7],\n      [-20, -3],\n      [-1, 6],\n      [30, 2]\n    ],\n    [\n      [3392, 1616],\n      [7, -6],\n      [-33, -7],\n      [10, 13],\n      [16, 0]\n    ],\n    [\n      [3470, 1665],\n      [-6, -10],\n      [-5, 8],\n      [11, 2]\n    ],\n    [\n      [6916, 2373],\n      [5, -3],\n      [-5, -12],\n      [16, -14],\n      [19, 13],\n      [7, -1],\n      [-1, -15],\n      [-9, 1],\n      [-11, -5],\n      [2, -7],\n      [13, 1],\n      [-1, -9],\n      [-22, 3],\n      [-7, 8],\n      [-5, -13],\n      [-8, 4],\n      [5, 20],\n      [-5, 14],\n      [1, 12],\n      [6, 3]\n    ],\n    [\n      [9093, 2685],\n      [-7, -6],\n      [5, 12],\n      [2, -6]\n    ],\n    [\n      [9020, 2837],\n      [14, -3],\n      [13, -8],\n      [2, -6],\n      [17, -8],\n      [24, 13],\n      [5, -4],\n      [5, 11],\n      [5, -4],\n      [4, 9],\n      [10, -13],\n      [-1, -28],\n      [1, -39],\n      [-7, 1],\n      [-1, -22],\n      [-4, -21],\n      [3, -1],\n      [0, -21],\n      [-10, 9],\n      [6, 10],\n      [-14, 1],\n      [-4, -23],\n      [-2, 6],\n      [-8, -26],\n      [-9, 6],\n      [-14, -1],\n      [-3, 20],\n      [-2, -6],\n      [-4, 15],\n      [-7, 9],\n      [-6, 24],\n      [0, 13],\n      [9, -9],\n      [-13, 31],\n      [-11, 37],\n      [-2, 13],\n      [4, 15]\n    ],\n    [\n      [9121, 2859],\n      [-9, -6],\n      [0, 6],\n      [9, 0]\n    ],\n    [\n      [9109, 2896],\n      [9, -16],\n      [1, -14],\n      [-5, -2],\n      [-11, 22],\n      [6, 10]\n    ],\n    [\n      [9001, 2876],\n      [-5, -4],\n      [-1, 25],\n      [7, 3],\n      [-1, -24]\n    ],\n    [\n      [8822, 3134],\n      [-1, -10],\n      [12, 1],\n      [0, -11],\n      [-11, 1],\n      [-5, -10],\n      [-20, 1],\n      [-4, 17],\n      [21, 11],\n      [8, 0]\n    ],\n    [\n      [9263, 3604],\n      [-1, -18],\n      [-2, 14],\n      [3, 4]\n    ],\n    [\n      [9261, 3608],\n      [-2, 17],\n      [3, 2],\n      [-1, -19]\n    ],\n    [\n      [8136, 3714],\n      [7, -36],\n      [-7, 19],\n      [0, 17]\n    ],\n    [\n      [9257, 3758],\n      [2, -20],\n      [-10, -37],\n      [1, 32],\n      [5, 7],\n      [-2, 14],\n      [4, 4]\n    ],\n    [\n      [9195, 3832],\n      [5, -3],\n      [0, -17],\n      [-7, 17],\n      [2, 3]\n    ],\n    [\n      [9061, 4133],\n      [3, -7],\n      [-3, -7],\n      [-4, 13],\n      [4, 1]\n    ],\n    [\n      [8880, 4236],\n      [-7, -7],\n      [0, -6],\n      [-8, 0],\n      [1, 8],\n      [10, 8],\n      [4, -3]\n    ],\n    [\n      [8805, 4285],\n      [2, -15],\n      [-4, 8],\n      [2, 7]\n    ],\n    [\n      [8797, 4395],\n      [0, -9],\n      [6, 2],\n      [-5, -8],\n      [-1, -14],\n      [6, -6],\n      [-8, 0],\n      [-6, 5],\n      [-1, 14],\n      [9, 16]\n    ],\n    [\n      [8621, 4522],\n      [5, -21],\n      [-7, 4],\n      [-8, -2],\n      [5, 9],\n      [-2, 9],\n      [6, 10],\n      [1, -9]\n    ],\n    [\n      [8624, 4533],\n      [6, -6],\n      [14, 10],\n      [6, -2],\n      [1, -21],\n      [-14, -18],\n      [-13, 16],\n      [-3, 29],\n      [3, -8]\n    ],\n    [\n      [8682, 4547],\n      [1, -13],\n      [-4, 6],\n      [3, 7]\n    ],\n    [\n      [8959, 4566],\n      [-1, -8],\n      [6, -7],\n      [3, -19],\n      [0, -30],\n      [10, -9],\n      [-4, -20],\n      [6, -4],\n      [4, -11],\n      [-2, -17],\n      [5, 2],\n      [-1, -13],\n      [3, -19],\n      [-2, -19],\n      [5, -20],\n      [3, -22],\n      [5, -2],\n      [15, 18],\n      [4, -22],\n      [18, -23],\n      [-3, -12],\n      [2, -6],\n      [2, -37],\n      [3, -8],\n      [-2, -16],\n      [6, -22],\n      [9, -9],\n      [-1, -11],\n      [5, -19],\n      [1, -16],\n      [-3, -34],\n      [9, -15],\n      [-2, -17],\n      [5, -14],\n      [13, -15],\n      [4, 7],\n      [2, -12],\n      [8, 0],\n      [4, -6],\n      [1, -14],\n      [19, -12],\n      [1, -10],\n      [7, 5],\n      [3, -13],\n      [4, 1],\n      [1, -10],\n      [-4, -1],\n      [-1, -10],\n      [15, -24],\n      [-1, -8],\n      [8, -30],\n      [0, -14],\n      [3, -20],\n      [8, -7],\n      [5, -13],\n      [-3, 22],\n      [4, 5],\n      [3, -9],\n      [10, -13],\n      [2, 13],\n      [6, -21],\n      [-2, -15],\n      [3, -36],\n      [4, 0],\n      [4, -13],\n      [5, -4],\n      [6, -13],\n      [6, 3],\n      [4, -6],\n      [6, -27],\n      [8, -7],\n      [4, -25],\n      [10, -6],\n      [0, -27],\n      [6, -16],\n      [-2, -19],\n      [4, -40],\n      [-4, -3],\n      [10, -41],\n      [1, -17],\n      [3, -4],\n      [1, -40],\n      [-7, -21],\n      [-2, -39],\n      [-7, -32],\n      [0, -30],\n      [-3, -28],\n      [-5, -21],\n      [-6, -11],\n      [0, -23],\n      [-13, -15],\n      [-11, -20],\n      [-6, -26],\n      [-5, -3],\n      [0, -26],\n      [-9, -18],\n      [-3, -27],\n      [-4, -14],\n      [2, -9],\n      [-8, -7],\n      [-9, -34],\n      [0, -24],\n      [-7, -34],\n      [4, -21],\n      [-2, -14],\n      [-13, -16],\n      [-33, -2],\n      [-16, -10],\n      [-10, -13],\n      [-13, -24],\n      [-19, -4],\n      [3, -12],\n      [4, 7],\n      [-2, -20],\n      [-6, 16],\n      [-8, -3],\n      [-4, 16],\n      [-3, -3],\n      [-8, 9],\n      [5, 8],\n      [-2, 9],\n      [-6, 0],\n      [-1, -10],\n      [-8, -5],\n      [-6, 8],\n      [8, 1],\n      [3, 17],\n      [-6, 10],\n      [-15, -14],\n      [10, -2],\n      [-2, -8],\n      [-6, 0],\n      [-10, -11],\n      [-14, -22],\n      [-32, 28],\n      [-5, -2],\n      [-8, 7],\n      [-9, -1],\n      [1, -6],\n      [-8, 1],\n      [-4, 13],\n      [-14, 5],\n      [-10, 11],\n      [-3, 13],\n      [-13, 23],\n      [-3, 18],\n      [5, 6],\n      [0, 13],\n      [-9, 34],\n      [-14, 26],\n      [6, 2],\n      [3, 10],\n      [-4, 3],\n      [-21, -20],\n      [-8, 0],\n      [-1, 7],\n      [9, 12],\n      [3, 33],\n      [-8, 16],\n      [-3, 16],\n      [-7, -13],\n      [-1, -20],\n      [-5, -23],\n      [-7, 4],\n      [-15, -11],\n      [3, 23],\n      [11, -3],\n      [3, 21],\n      [-1, 25],\n      [4, 17],\n      [9, 19],\n      [-3, 19],\n      [6, 4],\n      [-8, 34],\n      [0, -26],\n      [-3, 2],\n      [-6, -11],\n      [-5, -27],\n      [-25, -26],\n      [-8, -24],\n      [-4, -3],\n      [-4, -16],\n      [6, 2],\n      [0, -12],\n      [-5, 7],\n      [-6, -5],\n      [-6, 18],\n      [-1, 21],\n      [-3, 17],\n      [-11, 20],\n      [-4, 27],\n      [-12, 0],\n      [-2, 13],\n      [-4, 1],\n      [7, 15],\n      [-5, 12],\n      [-8, -5],\n      [3, 9],\n      [-8, 16],\n      [-14, -5],\n      [-10, 14],\n      [-7, 1],\n      [-9, -6],\n      [-12, 18],\n      [-18, 14],\n      [-9, -7],\n      [-18, 2],\n      [-33, -7],\n      [-27, -23],\n      [-20, -11],\n      [-17, -2],\n      [-14, 5],\n      [-18, -19],\n      [-15, -10],\n      [-2, -6],\n      [-17, -8],\n      [-4, -5],\n      [-5, -28],\n      [-7, -16],\n      [-6, -7],\n      [-4, 3],\n      [-6, -7],\n      [-3, 9],\n      [-19, -3],\n      [-8, -6],\n      [0, 8],\n      [-14, 3],\n      [-20, -2],\n      [-13, -6],\n      [-16, -1],\n      [-9, -16],\n      [-2, -12],\n      [-16, 1],\n      [-3, -11],\n      [-7, -4],\n      [-2, -11],\n      [-20, -8],\n      [-2, -5],\n      [-12, 7],\n      [-18, -1],\n      [-15, 14],\n      [-10, 19],\n      [-10, 9],\n      [-4, -3],\n      [-4, 15],\n      [0, 32],\n      [6, -7],\n      [7, 3],\n      [6, 18],\n      [-1, 36],\n      [3, 8],\n      [0, 43],\n      [-18, 66],\n      [-4, 34],\n      [1, 32],\n      [-5, 22],\n      [-7, 17],\n      [0, 16],\n      [-11, 24],\n      [-2, 38],\n      [-5, 16],\n      [-11, 32],\n      [-7, 13],\n      [5, 14],\n      [6, -26],\n      [7, 6],\n      [0, 9],\n      [-9, 14],\n      [-4, 27],\n      [2, 4],\n      [7, -20],\n      [-1, -17],\n      [5, 14],\n      [2, -22],\n      [7, -2],\n      [0, 30],\n      [-5, 13],\n      [-6, 26],\n      [-4, 4],\n      [-3, 21],\n      [-5, 16],\n      [1, 26],\n      [4, 22],\n      [5, 6],\n      [0, 24],\n      [2, 10],\n      [-5, 22],\n      [3, 7],\n      [7, 33],\n      [4, 4],\n      [-2, -20],\n      [1, -21],\n      [7, 4],\n      [8, 34],\n      [23, 20],\n      [13, 26],\n      [21, 22],\n      [5, -3],\n      [8, 6],\n      [7, -7],\n      [12, 7],\n      [8, 14],\n      [17, 3],\n      [10, 20],\n      [12, -6],\n      [7, 6],\n      [12, 3],\n      [16, 11],\n      [11, 13],\n      [9, 25],\n      [3, 19],\n      [4, 4],\n      [16, 39],\n      [-4, 1],\n      [-2, 36],\n      [3, 14],\n      [8, 17],\n      [6, 3],\n      [0, 10],\n      [7, 12],\n      [-1, -15],\n      [5, -3],\n      [0, -14],\n      [12, -37],\n      [-1, 10],\n      [3, 13],\n      [-2, 11],\n      [7, -10],\n      [-3, 24],\n      [-6, 5],\n      [6, 13],\n      [-5, 8],\n      [5, 2],\n      [7, -7],\n      [-1, 9],\n      [7, -9],\n      [16, -1],\n      [-10, 3],\n      [-1, 9],\n      [6, 4],\n      [1, 18],\n      [-4, -11],\n      [-3, 18],\n      [1, 9],\n      [6, 1],\n      [3, 9],\n      [5, 0],\n      [4, -9],\n      [1, 10],\n      [-6, 3],\n      [4, 17],\n      [11, -10],\n      [0, 9],\n      [-8, 16],\n      [10, 14],\n      [3, -4],\n      [7, 6],\n      [1, -11],\n      [3, 5],\n      [4, 26],\n      [-5, 5],\n      [4, 7],\n      [3, -19],\n      [9, 16],\n      [1, -16],\n      [4, 14],\n      [4, 0],\n      [-3, 11],\n      [6, 4],\n      [4, -14],\n      [9, 1],\n      [11, -28],\n      [10, -16],\n      [-3, -17],\n      [0, -13],\n      [4, -1],\n      [-1, 11],\n      [5, 14],\n      [4, 3],\n      [12, -5],\n      [9, -11],\n      [-1, 11],\n      [7, -5],\n      [3, -14],\n      [4, 1],\n      [-3, 18],\n      [5, -1],\n      [-6, 15],\n      [-7, 11],\n      [4, 20],\n      [7, 4],\n      [1, 18],\n      [4, 9],\n      [11, 12],\n      [-5, 9],\n      [0, 14],\n      [6, 2],\n      [0, 12],\n      [6, 6],\n      [2, 11],\n      [7, -14],\n      [0, 17],\n      [4, -2],\n      [-1, 12],\n      [9, 5],\n      [3, -13],\n      [13, 4],\n      [4, -5],\n      [9, 5],\n      [7, 9],\n      [2, 24],\n      [-7, 12],\n      [-9, -5],\n      [-5, 12],\n      [-5, 0],\n      [7, 11],\n      [10, -1],\n      [9, -21],\n      [6, 10],\n      [7, -21],\n      [14, -7],\n      [4, 6],\n      [4, -11],\n      [3, 4],\n      [4, -12],\n      [6, -1],\n      [8, 7],\n      [11, -18],\n      [13, 11],\n      [6, 2],\n      [-4, -8],\n      [2, -6],\n      [5, 7],\n      [5, -5],\n      [-2, -11],\n      [7, -1],\n      [3, 14],\n      [-5, 3],\n      [10, 9],\n      [4, -17],\n      [3, 7],\n      [4, -11],\n      [-12, -28],\n      [4, -6],\n      [-9, -21],\n      [0, 9],\n      [-5, -6],\n      [0, 8],\n      [-7, -9],\n      [0, -26],\n      [4, 3],\n      [-4, -29],\n      [-3, -3],\n      [-7, -24],\n      [-4, -4],\n      [2, -13],\n      [22, -27],\n      [0, -8],\n      [10, -11],\n      [4, -9],\n      [7, 1],\n      [10, -14],\n      [10, -7],\n      [9, -21],\n      [7, -8],\n      [20, -9],\n      [4, -7],\n      [1, -15],\n      [22, -24],\n      [14, 4],\n      [10, 13],\n      [3, 24],\n      [7, 18],\n      [3, 26],\n      [3, 9],\n      [-2, 9],\n      [3, 25],\n      [5, 20],\n      [-4, 40],\n      [3, 16],\n      [-4, 13],\n      [1, 21],\n      [5, 21],\n      [-2, 18],\n      [6, 14],\n      [-2, 11],\n      [-5, -4],\n      [6, 28],\n      [6, 1],\n      [-2, 8],\n      [6, 41],\n      [0, 14],\n      [5, 2],\n      [6, 11]\n    ],\n    [\n      [5470, 7982],\n      [-2, -9],\n      [5, -23],\n      [3, -3]\n    ],\n    [\n      [5476, 7947],\n      [-3, -17],\n      [-12, 3],\n      [-6, -6],\n      [7, -3],\n      [-5, -12],\n      [-1, -22],\n      [-9, -9]\n    ],\n    [\n      [5447, 7881],\n      [-19, -12],\n      [-16, -2],\n      [-9, -14],\n      [-23, 9]\n    ],\n    [\n      [5380, 7862],\n      [-32, 7],\n      [-12, 17],\n      [2, 7],\n      [-12, -5],\n      [-17, -1],\n      [-4, -11],\n      [-15, 6]\n    ],\n    [\n      [5290, 7882],\n      [-2, 7],\n      [-6, -8],\n      [-16, 12]\n    ],\n    [\n      [5266, 7893],\n      [-2, 12]\n    ],\n    [\n      [5264, 7905],\n      [1, 14]\n    ],\n    [\n      [5265, 7919],\n      [4, 2]\n    ],\n    [\n      [5269, 7921],\n      [7, 0],\n      [8, -16],\n      [6, 15],\n      [12, -1],\n      [2, -7],\n      [9, 1],\n      [9, 10],\n      [32, 4],\n      [6, -11],\n      [3, 9],\n      [-5, 5],\n      [1, 13],\n      [-6, 9],\n      [4, 7],\n      [12, 5],\n      [4, 16],\n      [7, -3],\n      [3, 13]\n    ],\n    [\n      [5383, 7990],\n      [7, -9],\n      [18, 0],\n      [7, 11],\n      [0, 12],\n      [11, -1],\n      [20, -13],\n      [10, 3],\n      [13, -6],\n      [1, -5]\n    ],\n    [\n      [6281, 7420],\n      [-19, 8],\n      [-9, 14],\n      [-9, 24]\n    ],\n    [\n      [6244, 7466],\n      [-1, 3]\n    ],\n    [\n      [6289, 7594],\n      [9, -6],\n      [11, -12],\n      [5, -17],\n      [16, -3],\n      [5, 15],\n      [9, 6],\n      [5, 16]\n    ],\n    [\n      [6349, 7593],\n      [15, -31],\n      [1, -11],\n      [10, -28],\n      [15, -3],\n      [8, -10],\n      [-11, -3],\n      [-13, -11],\n      [0, -11],\n      [-6, -28],\n      [4, -11],\n      [-5, 0],\n      [-1, -17],\n      [-7, 10],\n      [-2, -43]\n    ],\n    [\n      [6357, 7396],\n      [-7, -2],\n      [-6, 12],\n      [-11, 12],\n      [1, 8],\n      [7, 2],\n      [-5, 18],\n      [6, 7],\n      [-10, 16],\n      [-4, -1],\n      [-26, -29],\n      [-11, -17]\n    ],\n    [\n      [6249, 7560],\n      [8, 10],\n      [13, -8],\n      [8, -9],\n      [6, 1],\n      [6, -8],\n      [4, 3],\n      [1, 15],\n      [-10, 9],\n      [-3, 13],\n      [7, 8]\n    ],\n    [\n      [5848, 5045],\n      [-4, -15],\n      [2, -14],\n      [9, -5],\n      [0, -17],\n      [-9, -13],\n      [-9, -34],\n      [-11, -21],\n      [-3, 1]\n    ],\n    [\n      [5823, 4927],\n      [-9, 39],\n      [1, 21],\n      [-4, 4]\n    ],\n    [\n      [5811, 4991],\n      [0, 18],\n      [-4, 5],\n      [-2, 12]\n    ],\n    [\n      [5805, 5026],\n      [4, 7],\n      [5, -4],\n      [0, -9],\n      [11, 1],\n      [5, 7],\n      [1, 21],\n      [6, -6],\n      [7, 7],\n      [4, -5]\n    ],\n    [\n      [5166, 8104],\n      [10, -14],\n      [1, -10],\n      [-8, -11]\n    ],\n    [\n      [5169, 8069],\n      [-7, -3],\n      [-4, -16],\n      [2, -14]\n    ],\n    [\n      [5160, 8036],\n      [-9, -3],\n      [-4, 10],\n      [-13, 7],\n      [-1, 21],\n      [-9, -13],\n      [-10, 3],\n      [2, 15],\n      [-5, 5],\n      [-10, 0],\n      [0, 6],\n      [-11, 5],\n      [-4, 15],\n      [-7, -6],\n      [-7, 8],\n      [-2, 15]\n    ],\n    [\n      [5070, 8124],\n      [16, 14],\n      [7, 3]\n    ],\n    [\n      [5093, 8141],\n      [0, -6],\n      [16, -3],\n      [8, 9]\n    ],\n    [\n      [5117, 8141],\n      [1, 0]\n    ],\n    [\n      [5118, 8141],\n      [3, 3],\n      [16, -1],\n      [7, -8],\n      [9, 0],\n      [9, -11],\n      [-6, -13],\n      [10, -7]\n    ],\n    [\n      [5099, 5856],\n      [-3, -17],\n      [7, -16],\n      [0, -19],\n      [3, -5],\n      [-1, -16],\n      [-5, 0],\n      [1, -14],\n      [-3, -18],\n      [-6, -3],\n      [0, -9],\n      [-5, -12],\n      [-2, -20],\n      [-8, -4],\n      [-2, -15],\n      [0, -41],\n      [-1, -12],\n      [2, -25],\n      [1, -42],\n      [-2, -18]\n    ],\n    [\n      [5075, 5550],\n      [-31, -9]\n    ],\n    [\n      [5044, 5541],\n      [5, 3],\n      [-5, 18],\n      [1, 24],\n      [0, 73],\n      [-1, 5],\n      [0, 43],\n      [-6, 13],\n      [-1, 37],\n      [-16, 23],\n      [0, 19],\n      [4, 17]\n    ],\n    [\n      [5025, 5816],\n      [5, 3],\n      [1, 13],\n      [4, -1],\n      [3, 11],\n      [6, -3],\n      [11, 2],\n      [8, 13],\n      [3, 14]\n    ],\n    [\n      [5066, 5868],\n      [-1, 19],\n      [14, 10],\n      [10, -21],\n      [2, -8],\n      [6, -4],\n      [2, -8]\n    ],\n    [\n      [5006, 6041],\n      [-2, -21],\n      [6, -16],\n      [-1, -9],\n      [7, -24],\n      [5, 0],\n      [7, -13],\n      [7, -7],\n      [-9, -1],\n      [0, -15],\n      [6, -6],\n      [11, -19],\n      [8, -1],\n      [3, 7],\n      [5, -3],\n      [3, -15],\n      [-6, -4],\n      [10, -26]\n    ],\n    [\n      [5025, 5816],\n      [-12, 0],\n      [-18, 8]\n    ],\n    [\n      [4995, 5824],\n      [-8, -3],\n      [-5, -10],\n      [-2, 5],\n      [-59, 0],\n      [-3, -22],\n      [3, -11],\n      [2, -25],\n      [0, -24],\n      [2, -5]\n    ],\n    [\n      [4925, 5729],\n      [-4, -4],\n      [-10, 24],\n      [-6, 5],\n      [-10, 1],\n      [-11, -7],\n      [-4, -11],\n      [-11, 3],\n      [-4, 12],\n      [-3, -1],\n      [-4, 24],\n      [-9, 1],\n      [-3, 7]\n    ],\n    [\n      [4846, 5783],\n      [3, 24],\n      [-2, 14],\n      [6, 9],\n      [1, 19],\n      [-4, 14],\n      [8, 10],\n      [9, 1],\n      [10, 18],\n      [-1, 24],\n      [6, 0],\n      [0, 14],\n      [-3, 11],\n      [10, 13],\n      [15, -13],\n      [5, 7],\n      [0, 25],\n      [6, -5],\n      [5, 21],\n      [11, 16],\n      [12, -6],\n      [1, 16],\n      [8, 3],\n      [11, 13],\n      [8, 5],\n      [8, 15],\n      [8, -4],\n      [8, 2],\n      [11, -8]\n    ],\n    [\n      [7529, 6456],\n      [0, 16],\n      [3, -11],\n      [-3, -5]\n    ],\n    [\n      [7521, 6458],\n      [-5, -7],\n      [2, 29],\n      [-4, 4],\n      [3, 11],\n      [6, -20],\n      [-2, -17]\n    ],\n    [\n      [7571, 6448],\n      [0, -29],\n      [2, -10],\n      [-12, 7],\n      [1, -20]\n    ],\n    [\n      [7562, 6396],\n      [1, -15],\n      [-7, 20],\n      [-1, 27],\n      [-3, 9],\n      [-2, 29],\n      [-11, 31],\n      [-5, -14],\n      [-9, 0],\n      [-8, 26],\n      [1, 14],\n      [-4, 6],\n      [-9, 4],\n      [11, -11],\n      [-4, -10],\n      [2, -12],\n      [-3, -8],\n      [5, -13],\n      [-2, -18],\n      [-6, -9],\n      [-1, -11],\n      [-7, 1],\n      [1, 7],\n      [-5, 6],\n      [-2, -15],\n      [-12, -7],\n      [0, 14],\n      [-4, -18],\n      [-4, 10],\n      [-1, 18]\n    ],\n    [\n      [7473, 6457],\n      [-6, 48],\n      [2, 14],\n      [-7, 2],\n      [3, 13],\n      [-6, 8],\n      [0, 11],\n      [5, 8],\n      [0, 22],\n      [-7, 0],\n      [-11, 12],\n      [-2, 7],\n      [4, 12],\n      [5, 1],\n      [3, 18],\n      [13, -1],\n      [-3, 18],\n      [-8, 1],\n      [-3, 11],\n      [-9, 14],\n      [2, 12],\n      [5, 4],\n      [4, 14],\n      [5, -9],\n      [11, -3],\n      [7, -14],\n      [7, -2],\n      [2, 15],\n      [6, -18],\n      [-2, -4],\n      [1, -32],\n      [15, -8],\n      [23, 2],\n      [7, -3],\n      [18, 3],\n      [11, -14],\n      [-6, -2],\n      [-5, -31],\n      [-5, -2],\n      [0, -9],\n      [-8, 2],\n      [0, -6],\n      [-7, 0],\n      [-7, -21],\n      [2, -14],\n      [9, -30],\n      [7, 5],\n      [0, 15],\n      [5, 8],\n      [-1, 11],\n      [5, 4],\n      [8, -22],\n      [0, -25],\n      [3, -12],\n      [3, -42]\n    ],\n    [\n      [5793, 7702],\n      [0, -17],\n      [-11, -3],\n      [-6, -14],\n      [-2, -26],\n      [-4, 1],\n      [-8, -16],\n      [5, 1],\n      [11, -28]\n    ],\n    [\n      [5778, 7600],\n      [-13, -4],\n      [-6, 9],\n      [-21, -5],\n      [-7, -15]\n    ],\n    [\n      [5731, 7585],\n      [-8, 0],\n      [2, -21],\n      [-25, -7],\n      [-9, 10],\n      [-8, 1],\n      [-2, 6],\n      [-14, 0],\n      [-8, -7],\n      [-13, 0],\n      [-10, -4]\n    ],\n    [\n      [5636, 7563],\n      [3, 22],\n      [-5, 18],\n      [-9, 5],\n      [-5, 11]\n    ],\n    [\n      [5620, 7619],\n      [5, 6],\n      [-3, 23],\n      [9, 5],\n      [7, 17],\n      [-13, 15],\n      [-4, 15],\n      [1, 17],\n      [8, 13]\n    ],\n    [\n      [5630, 7730],\n      [9, -8],\n      [-4, -15],\n      [17, 3],\n      [18, -8],\n      [10, 3],\n      [21, -5],\n      [4, -4],\n      [11, 5],\n      [9, 16],\n      [25, 10],\n      [10, -10],\n      [15, -2],\n      [8, -13],\n      [10, 0]\n    ],\n    [\n      [6402, 6694],\n      [3, 0],\n      [0, -24],\n      [-4, 8],\n      [1, 16]\n    ],\n    [\n      [2971, 6401],\n      [-3, -10],\n      [-15, -3],\n      [-1, 6],\n      [9, 10],\n      [4, -4],\n      [6, 12],\n      [0, -11]\n    ],\n    [\n      [2969, 6475],\n      [8, -3],\n      [-7, -3],\n      [-1, 6]\n    ],\n    [\n      [2948, 6491],\n      [0, -14],\n      [-5, 9],\n      [5, 5]\n    ],\n    [\n      [2889, 6546],\n      [9, -13],\n      [-10, 9],\n      [1, 4]\n    ],\n    [\n      [2908, 6546],\n      [6, -21],\n      [0, -8],\n      [7, -10],\n      [0, -8],\n      [-7, 15],\n      [-1, 14],\n      [-5, 18]\n    ],\n    [\n      [2840, 6572],\n      [6, 0],\n      [0, -20],\n      [-8, 5],\n      [-3, 13],\n      [5, 2]\n    ],\n    [\n      [2908, 6577],\n      [-3, 0],\n      [-4, 16],\n      [7, -16]\n    ],\n    [\n      [2830, 6632],\n      [3, 0],\n      [8, -40],\n      [-8, -11],\n      [-10, 14],\n      [7, 37]\n    ],\n    [\n      [2869, 6655],\n      [0, -4],\n      [16, -20],\n      [-1, -29],\n      [-2, 7],\n      [3, 17],\n      [-6, 14],\n      [-11, 8],\n      [1, 7]\n    ],\n    [\n      [2819, 6722],\n      [15, -4],\n      [-21, -5],\n      [6, 9]\n    ],\n    [\n      [2839, 6733],\n      [5, 0],\n      [16, -25],\n      [0, -11],\n      [-4, -3],\n      [0, -19],\n      [-6, 5],\n      [4, 8],\n      [0, 18],\n      [-8, 23],\n      [-7, 4]\n    ],\n    [\n      [5528, 7765],\n      [9, 0],\n      [-7, -29],\n      [14, -17],\n      [-10, -5],\n      [7, -13],\n      [-1, -8],\n      [-7, -3]\n    ],\n    [\n      [5533, 7690],\n      [-8, -3],\n      [0, -8],\n      [-7, -6],\n      [-1, -13],\n      [-4, 0],\n      [-1, -26]\n    ],\n    [\n      [5512, 7634],\n      [-22, 19]\n    ],\n    [\n      [5490, 7653],\n      [-2, 3]\n    ],\n    [\n      [5488, 7656],\n      [0, 8],\n      [-35, 57],\n      [-8, 32],\n      [-7, 3],\n      [0, 29],\n      [6, 2],\n      [10, -12],\n      [3, 10],\n      [9, -1],\n      [4, 7],\n      [4, -7],\n      [22, -6],\n      [4, 4],\n      [19, -3],\n      [2, -11],\n      [7, -3]\n    ],\n    [\n      [5781, 8416],\n      [4, -6],\n      [9, 3],\n      [3, -8],\n      [9, 4],\n      [11, -6],\n      [1, -13],\n      [12, 9],\n      [16, -3],\n      [11, -11],\n      [-2, -19],\n      [6, -15],\n      [-7, -13],\n      [11, -10],\n      [-3, -7],\n      [7, -14],\n      [15, -15],\n      [-3, -11],\n      [10, 1],\n      [11, -9],\n      [6, -11],\n      [-15, -22],\n      [-22, 5],\n      [-4, -9],\n      [8, -10],\n      [2, -30],\n      [5, -13]\n    ],\n    [\n      [5882, 8183],\n      [-23, -2],\n      [-12, -29],\n      [3, -14],\n      [-7, -1],\n      [-6, 11],\n      [-15, -1],\n      [-9, -6],\n      [-5, 14],\n      [-13, -11],\n      [-11, 13],\n      [-16, -10],\n      [1, 7],\n      [-13, 0],\n      [-1, 7],\n      [-21, 5],\n      [-10, 6],\n      [-28, 2],\n      [-19, -4],\n      [-11, -18],\n      [-11, 3],\n      [0, -5]\n    ],\n    [\n      [5655, 8150],\n      [0, 34],\n      [-12, 10],\n      [6, 13],\n      [15, 11],\n      [0, 18],\n      [-7, 25],\n      [-5, 28]\n    ],\n    [\n      [5652, 8289],\n      [20, 1],\n      [5, -4],\n      [12, 5],\n      [-1, 7],\n      [19, 11],\n      [1, -8],\n      [8, 6],\n      [-7, 3],\n      [9, 37],\n      [8, 1],\n      [3, 10],\n      [9, -1],\n      [6, 10],\n      [-8, 1],\n      [2, 20]\n    ],\n    [\n      [5738, 8388],\n      [11, 10],\n      [17, -2],\n      [8, 17],\n      [7, 3]\n    ],\n    [\n      [2547, 6247],\n      [-3, -6],\n      [9, 0],\n      [-1, -18],\n      [-5, -28],\n      [4, -4],\n      [-4, -10],\n      [2, -16],\n      [-2, -24],\n      [-7, -21],\n      [-5, -2],\n      [-5, -20]\n    ],\n    [\n      [2530, 6098],\n      [-9, 0],\n      [2, 51],\n      [0, 60]\n    ],\n    [\n      [2523, 6209],\n      [4, 10],\n      [4, -6],\n      [9, 26],\n      [0, 6],\n      [7, 2]\n    ],\n    [\n      [3084, 4249],\n      [-4, -1]\n    ],\n    [\n      [3080, 4248],\n      [4, 1]\n    ],\n    [\n      [3384, 4022],\n      [-1, 21],\n      [-24, 29],\n      [-24, 0],\n      [-51, -22],\n      [-4, -23],\n      [-10, -28],\n      [0, -29],\n      [-8, -54],\n      [-3, -14]\n    ],\n    [\n      [3133, 3869],\n      [-10, -5],\n      [-9, 4],\n      [1, 16],\n      [-3, 11],\n      [0, 16],\n      [-4, 7],\n      [-3, 23],\n      [0, 15],\n      [-6, 20],\n      [-4, 2],\n      [2, 18],\n      [-6, 6],\n      [1, 10],\n      [-3, 14],\n      [6, 2],\n      [1, 8],\n      [-5, 11],\n      [7, 16],\n      [-13, 23],\n      [-3, 34],\n      [-3, 18],\n      [2, 6],\n      [-7, 5],\n      [0, 8],\n      [-5, 18]\n    ],\n    [\n      [3069, 4175],\n      [-4, 17],\n      [7, 8],\n      [10, 30]\n    ],\n    [\n      [3082, 4230],\n      [5, -3],\n      [-1, 11],\n      [8, 5],\n      [0, 6],\n      [-7, 0],\n      [-1, 9],\n      [4, 4],\n      [-7, 3],\n      [0, 7],\n      [-10, 17]\n    ],\n    [\n      [3073, 4289],\n      [6, 16],\n      [-7, 15],\n      [6, 28],\n      [5, 6],\n      [3, 20],\n      [-6, 22],\n      [4, 8],\n      [-1, 36],\n      [7, 11],\n      [2, 12],\n      [-16, 55],\n      [-9, 34]\n    ],\n    [\n      [3067, 4552],\n      [23, -3],\n      [-1, -8],\n      [10, 6],\n      [9, 20],\n      [11, 3],\n      [11, 19],\n      [7, 3],\n      [11, 20],\n      [19, 8],\n      [7, 1],\n      [4, -5],\n      [5, 9],\n      [3, -32],\n      [-4, -13],\n      [3, -21],\n      [-2, -18],\n      [2, -19],\n      [3, -2],\n      [1, -14],\n      [4, -2],\n      [1, -12],\n      [5, -1],\n      [4, -10],\n      [6, -4],\n      [1, -11],\n      [13, -4],\n      [4, 4],\n      [10, -7],\n      [4, -8],\n      [5, 4],\n      [9, -20],\n      [4, 1],\n      [8, -10],\n      [7, 0],\n      [0, -6],\n      [8, -17],\n      [22, 4],\n      [18, -27],\n      [-2, -20],\n      [5, -18],\n      [1, -28],\n      [-9, -1],\n      [9, -20],\n      [3, -47],\n      [47, -4],\n      [3, 3],\n      [0, -13],\n      [-4, -8],\n      [2, -34],\n      [11, -15],\n      [6, -1],\n      [0, -8],\n      [6, -27],\n      [0, -10],\n      [-6, -46],\n      [-9, -38],\n      [7, -13],\n      [-8, -10]\n    ],\n    [\n      [3651, 3581],\n      [1, 22],\n      [3, 0],\n      [-4, -22]\n    ],\n    [\n      [3650, 3661],\n      [-4, 8],\n      [6, 7],\n      [-2, -15]\n    ],\n    [\n      [3919, 4412],\n      [0, -16],\n      [-4, 16],\n      [4, 0]\n    ],\n    [\n      [3660, 5124],\n      [-3, 3],\n      [4, 9],\n      [-1, -12]\n    ],\n    [\n      [3588, 5149],\n      [0, -7],\n      [-8, -7],\n      [1, 9],\n      [7, 5]\n    ],\n    [\n      [3577, 5151],\n      [2, -5],\n      [-4, -19],\n      [-3, -11],\n      [-15, -19],\n      [0, 13],\n      [7, 10],\n      [0, 14],\n      [2, 11],\n      [8, 8],\n      [3, -2]\n    ],\n    [\n      [3573, 5156],\n      [5, 19],\n      [0, -10],\n      [-5, -9]\n    ],\n    [\n      [3608, 5175],\n      [11, -6],\n      [9, 5],\n      [27, -7],\n      [-2, -14],\n      [-1, -20],\n      [-4, -14],\n      [-5, -5],\n      [0, -14],\n      [-7, -5],\n      [-3, 7],\n      [0, -11],\n      [-9, 1],\n      [-6, -12],\n      [-14, 3],\n      [-4, -6],\n      [-5, 2],\n      [-7, 28],\n      [1, 13],\n      [6, -5],\n      [1, 8],\n      [-7, -1],\n      [0, 23],\n      [2, 17],\n      [4, 10],\n      [5, 5],\n      [8, -2]\n    ],\n    [\n      [3586, 5165],\n      [-4, 4],\n      [1, 13],\n      [7, 3],\n      [2, -9],\n      [-6, -11]\n    ],\n    [\n      [3625, 5187],\n      [3, -5],\n      [-2, -7],\n      [-11, 2],\n      [10, 10]\n    ],\n    [\n      [3599, 5183],\n      [-5, 0],\n      [-2, 9],\n      [6, -1],\n      [1, -8]\n    ],\n    [\n      [3624, 5200],\n      [-6, -5],\n      [-3, -12],\n      [-14, 0],\n      [-1, 12],\n      [8, 1],\n      [15, 9],\n      [1, -5]\n    ],\n    [\n      [3600, 5213],\n      [1, -14],\n      [-2, -7],\n      [0, 23],\n      [1, -2]\n    ],\n    [\n      [3609, 5216],\n      [-6, -13],\n      [1, 14],\n      [5, -1]\n    ],\n    [\n      [3608, 5236],\n      [0, -10],\n      [-5, 0],\n      [5, 10]\n    ],\n    [\n      [3600, 5305],\n      [1, -11],\n      [-5, 4],\n      [4, 7]\n    ],\n    [\n      [3431, 5295],\n      [13, -7],\n      [2, 14],\n      [-6, 10],\n      [5, 17],\n      [6, -8],\n      [11, 2],\n      [0, 4],\n      [10, 2],\n      [8, -5],\n      [3, -7]\n    ],\n    [\n      [3483, 5317],\n      [3, -7],\n      [8, -3],\n      [7, 3],\n      [6, 9],\n      [5, -7],\n      [6, 5],\n      [9, -9],\n      [9, 11],\n      [8, 31],\n      [1, 14],\n      [4, 7],\n      [15, 44]\n    ],\n    [\n      [3564, 5415],\n      [5, 24],\n      [8, -16],\n      [1, -21],\n      [3, 4],\n      [-1, -29],\n      [3, -31],\n      [7, -22],\n      [1, -18],\n      [6, -18],\n      [13, -4],\n      [4, -8],\n      [0, -19],\n      [-7, -4],\n      [7, -3],\n      [-11, -17],\n      [-5, -12],\n      [-4, -17],\n      [-5, -11],\n      [-5, -1],\n      [-9, -17],\n      [-4, -19],\n      [-8, -19],\n      [0, -14],\n      [-7, -8],\n      [-1, -13],\n      [-6, 4],\n      [-14, -13],\n      [13, 2],\n      [0, -10],\n      [9, 7],\n      [7, 10],\n      [11, 11],\n      [13, 17],\n      [-5, -12],\n      [5, -5],\n      [0, -14],\n      [4, -9],\n      [0, -11],\n      [7, -14],\n      [4, 9],\n      [6, 4],\n      [5, -7],\n      [12, 10],\n      [1, -7],\n      [-5, -41],\n      [2, -2],\n      [8, 40],\n      [7, 18],\n      [2, -8],\n      [8, 21],\n      [3, -12],\n      [1, 19],\n      [4, -2],\n      [4, 16],\n      [1, 15],\n      [5, 0],\n      [5, 12],\n      [2, -11],\n      [4, 10],\n      [11, -7],\n      [19, -9],\n      [0, -10],\n      [7, -6],\n      [8, 5],\n      [1, -7],\n      [10, -9],\n      [1, -8],\n      [6, 9],\n      [-2, -11],\n      [1, -13],\n      [3, 11],\n      [5, 4],\n      [10, -14],\n      [-3, -5],\n      [6, -1],\n      [3, -8],\n      [-5, -16],\n      [5, 5],\n      [3, -14],\n      [-4, 0],\n      [-5, -36],\n      [2, -9],\n      [6, 14],\n      [1, 23],\n      [8, 8],\n      [1, -9],\n      [-7, -12],\n      [7, -2],\n      [2, 14],\n      [9, 4],\n      [6, -4],\n      [-1, 12],\n      [4, 0],\n      [18, -13],\n      [6, -11],\n      [15, -5],\n      [3, 6],\n      [5, -9],\n      [29, 4],\n      [3, 2],\n      [14, -3],\n      [25, -31],\n      [3, -1],\n      [8, -15],\n      [5, -2],\n      [11, -27],\n      [14, -26],\n      [9, -6],\n      [4, -12],\n      [6, -1],\n      [6, -8],\n      [16, -1],\n      [5, 3],\n      [13, -6],\n      [4, -13],\n      [9, -57],\n      [1, -24],\n      [5, -21],\n      [-1, -53],\n      [-7, -40],\n      [-7, -25],\n      [-10, -27],\n      [-3, 5],\n      [-2, -16],\n      [-12, -24],\n      [-3, -13],\n      [-10, -10],\n      [-5, -9],\n      [-11, -37],\n      [-15, -52],\n      [-13, -34],\n      [-5, 0],\n      [0, 14],\n      [-4, 9],\n      [-4, -16],\n      [0, -17],\n      [-4, -7],\n      [0, -27],\n      [-2, -5],\n      [2, -28],\n      [-3, -20],\n      [2, -9],\n      [0, -24],\n      [2, -28],\n      [2, -6],\n      [-4, -25],\n      [-6, -53],\n      [1, -31],\n      [-2, -9],\n      [-7, -8],\n      [-7, -30],\n      [2, -51],\n      [-3, -13],\n      [-6, -6],\n      [-9, -44],\n      [-13, -31],\n      [-8, -25],\n      [4, -27],\n      [-5, -10],\n      [-12, -7],\n      [-13, -20],\n      [0, -21],\n      [-17, 1],\n      [-11, -3],\n      [0, 18],\n      [-7, -5],\n      [2, -13],\n      [-22, -7],\n      [10, 7],\n      [-9, 3],\n      [-8, -7],\n      [-2, 7],\n      [-9, -7],\n      [1, -17],\n      [-10, -3],\n      [-2, -6],\n      [-10, -7],\n      [-1, -11],\n      [-12, 4],\n      [-8, -7],\n      [-1, -7],\n      [-11, -6],\n      [-11, -13],\n      [-5, -12],\n      [-10, -9],\n      [-10, -15],\n      [-1, -15],\n      [-8, -7],\n      [-6, 4],\n      [1, -17],\n      [-4, -17],\n      [-1, -19],\n      [-5, -6],\n      [4, -6],\n      [-3, -16],\n      [3, -6],\n      [2, -32],\n      [-2, -52],\n      [-4, -17],\n      [-17, -23],\n      [-5, -12],\n      [-14, -39],\n      [-8, -37],\n      [-10, -34],\n      [-12, -25],\n      [-22, -27],\n      [-3, -9],\n      [0, 17],\n      [5, -4],\n      [11, 20],\n      [5, 3],\n      [4, 11],\n      [-1, 12],\n      [5, 1],\n      [0, 10],\n      [9, 9],\n      [-1, 22],\n      [4, -6],\n      [1, 12],\n      [-12, -4],\n      [-9, 8],\n      [3, -7],\n      [-6, -21],\n      [-1, -24],\n      [-6, -10],\n      [-9, -4],\n      [-3, -21],\n      [-4, -3],\n      [-1, -14],\n      [5, -10],\n      [-5, -7],\n      [-6, -30],\n      [-7, -26],\n      [-18, -28]\n    ],\n    [\n      [3517, 3240],\n      [-4, 10]\n    ],\n    [\n      [3513, 3250],\n      [2, 1],\n      [1, 23],\n      [5, 4],\n      [2, 13],\n      [5, 6],\n      [5, -10],\n      [6, 18],\n      [-4, 16],\n      [-12, -19]\n    ],\n    [\n      [3523, 3302],\n      [-11, 11],\n      [-5, 23],\n      [-15, 14],\n      [-9, 21],\n      [-8, 3],\n      [-4, 8],\n      [-7, 3],\n      [-2, 10],\n      [-8, 11],\n      [-6, -13],\n      [-4, 0],\n      [0, 16],\n      [-23, 40],\n      [-7, 0],\n      [-2, -8],\n      [-11, -2],\n      [-2, 6]\n    ],\n    [\n      [3483, 3710],\n      [0, 8]\n    ],\n    [\n      [3483, 3718],\n      [5, 3],\n      [0, 26],\n      [4, 16],\n      [0, 34]\n    ],\n    [\n      [3492, 3797],\n      [-9, 15],\n      [-10, -10],\n      [-13, 1],\n      [-3, 21],\n      [1, 11],\n      [-4, 23],\n      [1, 21],\n      [-7, 19],\n      [-9, 1],\n      [-6, 12],\n      [-12, -10],\n      [-31, 8],\n      [0, 36],\n      [3, 16],\n      [-9, 61]\n    ],\n    [\n      [3067, 4552],\n      [-11, 2],\n      [-7, -8],\n      [-12, 3],\n      [0, 41],\n      [1, 29],\n      [2, 20],\n      [-10, -14],\n      [-2, -7],\n      [-9, -11],\n      [-25, 0],\n      [-3, 27],\n      [-14, 7],\n      [-11, 0],\n      [7, 16],\n      [0, 8],\n      [-6, 17],\n      [-4, 2],\n      [-1, 11],\n      [-5, 6],\n      [-2, 15],\n      [-5, 9],\n      [2, 9],\n      [-8, 14],\n      [1, 11],\n      [7, 2],\n      [-3, 13],\n      [2, 13],\n      [11, 17],\n      [5, 3],\n      [1, 12],\n      [-3, 14],\n      [8, 24],\n      [1, 30],\n      [14, 14],\n      [14, 21],\n      [17, 5],\n      [10, 6],\n      [5, 11],\n      [9, 1],\n      [3, -6],\n      [10, -5],\n      [0, 5]\n    ],\n    [\n      [3056, 4939],\n      [6, 58],\n      [0, 9],\n      [5, 46],\n      [0, 10],\n      [5, 54],\n      [-4, 13],\n      [-2, 24],\n      [-13, 21],\n      [1, 42],\n      [12, 4],\n      [3, 5],\n      [10, -6],\n      [-2, 21],\n      [-4, 4],\n      [-14, 0],\n      [0, 37],\n      [8, 4],\n      [5, -3],\n      [34, 0],\n      [-1, 16],\n      [7, -15],\n      [5, 4],\n      [9, 19],\n      [4, -5],\n      [7, -29],\n      [-1, -21],\n      [6, 2]\n    ],\n    [\n      [3142, 5253],\n      [11, -21],\n      [10, -7],\n      [10, 14],\n      [6, -1],\n      [-1, -17],\n      [11, 17],\n      [1, 10],\n      [11, 6],\n      [10, 16],\n      [0, -8],\n      [9, 16],\n      [0, 14],\n      [19, 16],\n      [1, 14],\n      [-20, 4],\n      [2, 15],\n      [-6, 20],\n      [0, 30],\n      [-13, 22],\n      [-4, 12],\n      [2, 5],\n      [4, -10],\n      [12, 0],\n      [4, -14],\n      [10, 4],\n      [4, -5],\n      [4, 7],\n      [4, -5],\n      [7, -18],\n      [7, 5],\n      [-1, 20],\n      [6, 1],\n      [4, 9],\n      [7, -6],\n      [18, 12],\n      [0, 6],\n      [16, 10],\n      [10, 22],\n      [-2, 13],\n      [-3, 1]\n    ],\n    [\n      [3312, 5482],\n      [11, 0],\n      [3, 4],\n      [8, -12],\n      [-3, -33],\n      [6, 0],\n      [5, -8],\n      [-2, -8],\n      [4, -14],\n      [0, -10],\n      [-7, -12],\n      [1, -13],\n      [-4, -17],\n      [-1, -22],\n      [2, -17],\n      [5, -5],\n      [0, -26],\n      [6, -8],\n      [8, -19],\n      [8, -4],\n      [4, -7],\n      [8, 5],\n      [0, 10],\n      [5, 9],\n      [9, -5],\n      [6, 11],\n      [7, 0],\n      [3, 11],\n      [9, 7],\n      [9, -8],\n      [9, 4]\n    ],\n    [\n      [3347, 5935],\n      [-4, 3],\n      [0, 13],\n      [6, -10],\n      [-2, -6]\n    ],\n    [\n      [8198, 5465],\n      [5, -34],\n      [-7, 5],\n      [-2, 24]\n    ],\n    [\n      [8194, 5460],\n      [4, 5]\n    ],\n    [\n      [8166, 5448],\n      [6, -1],\n      [7, 5],\n      [7, 12],\n      [9, 10],\n      [-2, -10]\n    ],\n    [\n      [8193, 5464],\n      [-7, -9],\n      [2, -17],\n      [0, -14],\n      [-7, -10],\n      [-7, 23],\n      [-8, 11]\n    ],\n    [\n      [7545, 6781],\n      [-2, -8],\n      [5, -11],\n      [6, 3],\n      [3, -10],\n      [-3, -11],\n      [3, -13],\n      [-5, -4],\n      [-33, -3],\n      [-10, 8],\n      [-6, -9],\n      [-11, -3],\n      [-12, 9],\n      [-6, -2],\n      [-7, 7],\n      [-3, 12],\n      [4, 10]\n    ],\n    [\n      [7468, 6756],\n      [3, 13],\n      [13, 29],\n      [11, 14],\n      [12, 3],\n      [0, -5],\n      [9, -1],\n      [-4, -10],\n      [18, -5],\n      [5, 6],\n      [10, -8],\n      [0, -11]\n    ],\n    [\n      [5701, 4158],\n      [-1, -8],\n      [8, -27],\n      [7, -13],\n      [6, -21],\n      [4, -29],\n      [8, -13],\n      [14, -17],\n      [7, -3],\n      [3, -9],\n      [0, -15],\n      [12, -1],\n      [-1, -34],\n      [6, -12],\n      [3, -15],\n      [18, -5],\n      [12, -10],\n      [1, -14],\n      [7, -7]\n    ],\n    [\n      [5815, 3905],\n      [-9, -3],\n      [-3, -13],\n      [-8, -7],\n      [-12, -4],\n      [-12, -27],\n      [-5, -6],\n      [-2, -10],\n      [-11, -7],\n      [-4, -13],\n      [-5, -31],\n      [-8, -10],\n      [-3, -10],\n      [-15, -6],\n      [0, -10],\n      [-8, -41],\n      [-5, -7],\n      [-10, 1],\n      [-4, -5],\n      [-17, 5],\n      [-10, 6],\n      [-13, 20],\n      [-7, 1],\n      [-7, -5],\n      [-6, -23],\n      [0, -14],\n      [-6, -13],\n      [-8, -7],\n      [-6, -18],\n      [-7, -2],\n      [-2, -10],\n      [-15, 0],\n      [-15, 4],\n      [0, 21],\n      [5, 11],\n      [0, 19],\n      [-4, 13],\n      [-1, 14],\n      [-10, 29],\n      [-8, 10]\n    ],\n    [\n      [5554, 3757],\n      [0, 159],\n      [28, 0],\n      [0, 212],\n      [23, 4],\n      [21, 9],\n      [21, 5],\n      [9, -27],\n      [15, 26],\n      [7, 4],\n      [4, -6],\n      [7, 13],\n      [12, 2]\n    ],\n    [\n      [5634, 5812],\n      [4, -14],\n      [8, -14],\n      [10, -31],\n      [1, -16],\n      [-1, -21],\n      [-5, -6],\n      [3, -9],\n      [-2, -17],\n      [19, -1]\n    ],\n    [\n      [5671, 5683],\n      [2, -7],\n      [-4, -11],\n      [3, -6],\n      [16, -5],\n      [8, -17],\n      [5, -3],\n      [1, -11],\n      [-4, -4],\n      [6, -14],\n      [18, -19],\n      [2, -10],\n      [8, -10],\n      [-2, -16],\n      [8, -21],\n      [6, -2],\n      [13, -23],\n      [-1, -15],\n      [6, -14]\n    ],\n    [\n      [5762, 5475],\n      [-12, 7],\n      [-4, -8],\n      [-10, -1],\n      [-12, 12],\n      [-6, -3],\n      [-11, 9],\n      [-4, -5],\n      [0, -13],\n      [-18, -7],\n      [-5, 11],\n      [-6, -10],\n      [-27, -19],\n      [-12, 12],\n      [-9, -34],\n      [-3, -5],\n      [-23, 9],\n      [-2, -3],\n      [-20, 12],\n      [-7, -2],\n      [-6, 20],\n      [-13, 14],\n      [-3, 7],\n      [-10, 1],\n      [-17, -34],\n      [-1, -7],\n      [-6, -3],\n      [2, -12],\n      [-1, -27],\n      [1, -13]\n    ],\n    [\n      [5517, 5383],\n      [-4, 9],\n      [-11, -4],\n      [-16, 7],\n      [-8, -6],\n      [-15, -2],\n      [-4, -7],\n      [-3, -27],\n      [1, -7],\n      [-8, -34]\n    ],\n    [\n      [5449, 5312],\n      [-2, 8],\n      [0, 26],\n      [-4, 13],\n      [-5, 3],\n      [-15, 32],\n      [-6, 21],\n      [4, 1],\n      [-3, 14],\n      [-10, 19],\n      [-1, 31],\n      [-4, 6],\n      [2, 8],\n      [1, 27],\n      [-7, 10],\n      [10, 13],\n      [5, 24],\n      [3, 4],\n      [6, 30],\n      [6, 14]\n    ],\n    [\n      [5429, 5616],\n      [9, -4],\n      [7, 8],\n      [10, 5],\n      [4, 11],\n      [2, -12],\n      [5, -7],\n      [23, 26],\n      [7, -2],\n      [5, 4],\n      [15, 1],\n      [15, 36],\n      [-6, 7],\n      [0, 8],\n      [5, 5],\n      [17, 0],\n      [10, 7],\n      [9, -1],\n      [4, 12],\n      [8, 5],\n      [5, 19],\n      [13, 24],\n      [5, 4],\n      [3, 10],\n      [-1, 14],\n      [8, 5],\n      [0, 5],\n      [14, 9],\n      [9, -3]\n    ],\n    [\n      [2957, 7804],\n      [-12, -5],\n      [13, 16],\n      [-1, -11]\n    ],\n    [\n      [2699, 7829],\n      [2, -7],\n      [13, 9],\n      [3, -9],\n      [5, 9],\n      [9, -4],\n      [2, -11],\n      [-7, -12],\n      [-23, 15],\n      [-15, 6],\n      [11, 4]\n    ],\n    [\n      [2665, 7849],\n      [6, -2],\n      [-2, -11],\n      [-4, 13]\n    ],\n    [\n      [3319, 7889],\n      [6, -10],\n      [-2, -13],\n      [-7, -22],\n      [5, 3],\n      [-19, -34],\n      [10, 5],\n      [9, 11],\n      [-10, 0],\n      [12, 21],\n      [4, -8],\n      [11, 0],\n      [-7, -23],\n      [-16, -12],\n      [-6, 3],\n      [-13, -5],\n      [-5, 21],\n      [1, 13],\n      [6, 7],\n      [10, 30],\n      [7, 14],\n      [4, -1]\n    ],\n    [\n      [3221, 7879],\n      [6, -21],\n      [3, 6],\n      [12, -8],\n      [33, 3],\n      [3, -3],\n      [-17, -10],\n      [4, -13],\n      [-11, -3],\n      [-2, 12],\n      [-19, 2],\n      [-4, 11],\n      [-11, 0],\n      [2, 14],\n      [-9, -1],\n      [4, 16],\n      [7, 9],\n      [-1, -14]\n    ],\n    [\n      [3503, 7956],\n      [10, 3],\n      [-1, -7],\n      [-9, 4]\n    ],\n    [\n      [2562, 7993],\n      [-9, -6],\n      [0, 8],\n      [9, -2]\n    ],\n    [\n      [2924, 7774],\n      [20, 14],\n      [8, 11],\n      [6, 0],\n      [2, 17],\n      [7, 17],\n      [14, 11],\n      [5, 9],\n      [17, 17],\n      [5, -2],\n      [32, 22],\n      [14, 22],\n      [0, 4],\n      [14, 20],\n      [0, 5],\n      [16, 23],\n      [21, 20],\n      [44, 28],\n      [28, 8],\n      [18, -3],\n      [10, -5],\n      [11, -14],\n      [1, -8],\n      [-11, 8],\n      [11, -15],\n      [-4, -13],\n      [-11, -4],\n      [-1, -6],\n      [-18, -13],\n      [-16, 11],\n      [-3, -5],\n      [-11, 0],\n      [18, -11],\n      [9, -15],\n      [8, 9],\n      [12, 0],\n      [3, -6],\n      [-7, -14],\n      [-1, -10],\n      [-11, -13],\n      [16, 0],\n      [-3, -15],\n      [11, -32],\n      [20, -8],\n      [-8, -6],\n      [7, -7],\n      [10, 0],\n      [4, -9],\n      [5, 5],\n      [24, -6],\n      [10, 10],\n      [5, -15],\n      [7, 3],\n      [7, -12],\n      [-7, -5],\n      [14, -3],\n      [-1, -4],\n      [-18, -7],\n      [0, -3],\n      [-32, -21],\n      [-9, 4],\n      [-4, -9],\n      [-8, 1],\n      [1, -9],\n      [-11, 0],\n      [1, 10],\n      [-9, -5],\n      [-4, -8],\n      [2, -10],\n      [-6, -5],\n      [-8, -19],\n      [-9, -10],\n      [-6, 1],\n      [-9, -11],\n      [-5, 14],\n      [-9, 5],\n      [-1, 14],\n      [7, 29],\n      [21, 24],\n      [22, 18],\n      [1, -13],\n      [7, 8],\n      [20, 9],\n      [-34, 2],\n      [-5, -6],\n      [-4, 6],\n      [13, 15],\n      [-3, 9],\n      [-5, -12],\n      [-16, -9],\n      [-17, -16],\n      [-4, 4],\n      [-10, -10],\n      [-12, -1],\n      [-8, 6]\n    ],\n    [\n      [3134, 7784],\n      [-9, 6],\n      [1, 19]\n    ],\n    [\n      [3126, 7809],\n      [-10, 9]\n    ],\n    [\n      [3116, 7818],\n      [1, 1],\n      [-1, 74],\n      [-14, 17],\n      [-16, -11],\n      [-9, 17],\n      [-19, -37],\n      [-4, -23],\n      [-7, -12],\n      [1, -17],\n      [-12, -20],\n      [1, -11],\n      [-18, -5],\n      [-6, -16],\n      [-89, -1]\n    ],\n    [\n      [1546, 8044],\n      [6, -11],\n      [-14, 13],\n      [8, -2]\n    ],\n    [\n      [1479, 8054],\n      [4, -13],\n      [-7, 0],\n      [-4, 9],\n      [7, 4]\n    ],\n    [\n      [3218, 8058],\n      [33, -11],\n      [15, -14],\n      [11, -6],\n      [10, -14],\n      [-16, -6],\n      [-24, 11],\n      [-14, 9],\n      [-2, 9],\n      [-22, 16],\n      [9, 6]\n    ],\n    [\n      [1494, 8104],\n      [-11, -4],\n      [6, 9],\n      [5, -5]\n    ],\n    [\n      [1448, 8112],\n      [20, -17],\n      [22, -5],\n      [26, -13],\n      [5, -19],\n      [9, -12],\n      [4, -16],\n      [22, -13],\n      [10, -22],\n      [8, -25],\n      [-6, -6],\n      [-11, 3],\n      [-22, 14],\n      [-14, 12],\n      [9, 11],\n      [-18, -4],\n      [-9, 9],\n      [4, 11],\n      [-8, 0],\n      [-1, 10],\n      [-14, -3],\n      [0, 11],\n      [7, 3],\n      [-8, 5],\n      [-1, 10],\n      [-15, -2],\n      [-33, 43],\n      [-2, 7],\n      [16, 8]\n    ],\n    [\n      [3447, 8155],\n      [6, -8],\n      [7, 7],\n      [-5, -17],\n      [-12, 4],\n      [2, -12],\n      [7, -5],\n      [-28, -60],\n      [-3, -27],\n      [6, 13],\n      [13, 21],\n      [12, -13],\n      [7, 0],\n      [-17, -14],\n      [11, -17],\n      [15, 9],\n      [-2, -16],\n      [12, 1],\n      [8, 14],\n      [9, -8],\n      [5, 3],\n      [15, -10],\n      [-4, -13],\n      [-17, -15],\n      [10, 3],\n      [-3, -15],\n      [12, -7],\n      [3, 10],\n      [4, -6],\n      [7, 9],\n      [-5, -19],\n      [-11, -9],\n      [-7, 0],\n      [6, -14],\n      [-6, -9],\n      [8, -15],\n      [2, 13],\n      [6, 14],\n      [12, 6],\n      [-9, -18],\n      [-1, -22],\n      [8, 8],\n      [3, 14],\n      [5, -19],\n      [-5, -10],\n      [-2, -19],\n      [-5, -17],\n      [-6, 3],\n      [-10, -3],\n      [4, 26],\n      [-2, 5],\n      [-14, -23],\n      [-4, 1],\n      [8, 31],\n      [1, 14],\n      [-5, 15],\n      [-18, -29],\n      [-10, -9],\n      [0, -8],\n      [-8, -11],\n      [-9, -1],\n      [-9, 5],\n      [3, 7],\n      [11, 3],\n      [15, 28],\n      [-11, 3],\n      [-6, -12],\n      [-10, 12],\n      [-28, -4],\n      [-25, 3],\n      [-6, 4],\n      [-18, -6],\n      [-15, -2],\n      [-4, 17],\n      [27, 37],\n      [-9, 3],\n      [-14, -6],\n      [8, 9],\n      [6, -3],\n      [9, 33],\n      [10, -9],\n      [-2, 9],\n      [8, 4],\n      [-11, 4],\n      [25, 78],\n      [8, 11],\n      [8, 28],\n      [24, 18]\n    ],\n    [\n      [1448, 8147],\n      [-7, 0],\n      [2, 14],\n      [5, -14]\n    ],\n    [\n      [1445, 8181],\n      [-2, -17],\n      [-4, 14],\n      [6, 3]\n    ],\n    [\n      [2798, 8181],\n      [-3, -7],\n      [-8, 3],\n      [11, 4]\n    ],\n    [\n      [1462, 8192],\n      [-15, -17],\n      [2, 14],\n      [17, 12],\n      [-4, -9]\n    ],\n    [\n      [1430, 8212],\n      [1, -9],\n      [-8, 2],\n      [7, 7]\n    ],\n    [\n      [2738, 8248],\n      [8, -1],\n      [10, -15],\n      [3, -12],\n      [-10, 1],\n      [-29, 15],\n      [6, 10],\n      [12, 2]\n    ],\n    [\n      [1339, 8249],\n      [4, -12],\n      [-6, -9],\n      [6, -21],\n      [17, -18],\n      [-5, -5],\n      [-20, 26],\n      [-16, 32],\n      [20, 7]\n    ],\n    [\n      [1427, 8244],\n      [3, -10],\n      [-2, -21],\n      [-14, 7],\n      [-3, 12],\n      [2, 20],\n      [14, -8]\n    ],\n    [\n      [1419, 8255],\n      [-7, 1],\n      [4, 10],\n      [3, -11]\n    ],\n    [\n      [1382, 8268],\n      [9, -8],\n      [5, -15],\n      [-7, 0],\n      [-15, 26],\n      [8, -3]\n    ],\n    [\n      [1386, 8270],\n      [-9, 4],\n      [2, 6],\n      [7, -10]\n    ],\n    [\n      [1395, 8273],\n      [11, -17],\n      [-5, -9],\n      [-21, 36],\n      [3, 5],\n      [12, -15]\n    ],\n    [\n      [1380, 8293],\n      [-2, -10],\n      [-7, 7],\n      [9, 3]\n    ],\n    [\n      [1305, 8302],\n      [20, -3],\n      [5, -14],\n      [-15, -10],\n      [13, -2],\n      [2, 21],\n      [12, 6],\n      [-8, -28],\n      [0, -22],\n      [-13, -7],\n      [-9, 10],\n      [7, 6],\n      [-11, 3],\n      [-7, 25],\n      [4, 15]\n    ],\n    [\n      [2815, 8428],\n      [-1, -10],\n      [-7, -3],\n      [4, 17],\n      [4, -4]\n    ],\n    [\n      [2787, 8429],\n      [-11, -11],\n      [1, 8],\n      [10, 3]\n    ],\n    [\n      [2801, 8446],\n      [-3, -6],\n      [9, -8],\n      [-12, -27],\n      [-8, -3],\n      [2, 12],\n      [-9, -16],\n      [-3, 4],\n      [14, 23],\n      [3, -5],\n      [3, 26],\n      [4, 0]\n    ],\n    [\n      [3293, 8462],\n      [1, -19],\n      [-7, 7],\n      [6, 12]\n    ],\n    [\n      [3204, 8666],\n      [5, -10],\n      [-11, 7],\n      [6, 3]\n    ],\n    [\n      [3109, 8672],\n      [7, -7],\n      [-4, -10],\n      [-10, -6],\n      [-3, 7],\n      [5, 16],\n      [5, 0]\n    ],\n    [\n      [3200, 8731],\n      [-2, -16],\n      [-16, 19],\n      [18, -3]\n    ],\n    [\n      [2793, 8775],\n      [5, -7],\n      [-8, -30],\n      [-8, -9],\n      [-10, 11],\n      [-2, 14],\n      [12, 23],\n      [11, -2]\n    ],\n    [\n      [3203, 8784],\n      [8, 0],\n      [-6, -10],\n      [-9, 3],\n      [7, 7]\n    ],\n    [\n      [3033, 8802],\n      [15, -11],\n      [0, -7],\n      [-13, 1],\n      [-7, 15],\n      [5, 2]\n    ],\n    [\n      [2719, 8809],\n      [7, -3],\n      [-2, -12],\n      [-27, -27],\n      [-23, -5],\n      [-6, 18],\n      [18, 27],\n      [8, -5],\n      [9, 6],\n      [16, 1]\n    ],\n    [\n      [2822, 8839],\n      [21, -4],\n      [4, -9],\n      [-13, -10],\n      [-16, 17],\n      [4, 6]\n    ],\n    [\n      [3216, 8833],\n      [-8, 14],\n      [5, 2],\n      [3, -16]\n    ],\n    [\n      [2857, 8849],\n      [12, -6],\n      [0, -11],\n      [-20, 14],\n      [8, 3]\n    ],\n    [\n      [3204, 8862],\n      [4, -12],\n      [-12, 8],\n      [8, 4]\n    ],\n    [\n      [3186, 8910],\n      [2, -6],\n      [-13, -6],\n      [11, 12]\n    ],\n    [\n      [2625, 8972],\n      [12, -9],\n      [-7, -5],\n      [11, -20],\n      [9, 16],\n      [14, -17],\n      [20, -4],\n      [4, -10],\n      [19, -12],\n      [5, 2],\n      [16, -14],\n      [5, -23],\n      [19, -8],\n      [-1, 8],\n      [22, -21],\n      [-8, -2],\n      [-19, -16],\n      [-26, 14],\n      [-12, -1],\n      [-1, 17],\n      [-15, -1],\n      [2, 13],\n      [-19, -10],\n      [2, -14],\n      [-19, -8],\n      [-9, -19],\n      [-25, -10],\n      [-5, 33],\n      [-27, -2],\n      [-14, -5],\n      [8, 20],\n      [20, 13],\n      [-6, 24],\n      [6, 15],\n      [0, 28],\n      [5, 23],\n      [13, 12],\n      [1, -7]\n    ],\n    [\n      [2638, 8984],\n      [9, -10],\n      [0, -16],\n      [-12, 13],\n      [3, 13]\n    ],\n    [\n      [2657, 8990],\n      [18, -11],\n      [-3, -6],\n      [15, -10],\n      [-15, 2],\n      [-15, 25]\n    ],\n    [\n      [2936, 9103],\n      [24, -5],\n      [1, -12],\n      [-28, 0],\n      [-10, 16],\n      [13, 1]\n    ],\n    [\n      [2601, 9095],\n      [-7, -12],\n      [-8, 5],\n      [-3, 16],\n      [9, 13],\n      [7, -6],\n      [2, -16]\n    ],\n    [\n      [2900, 9117],\n      [16, -9],\n      [-4, -11],\n      [3, -24],\n      [-9, -11],\n      [-14, -6],\n      [-31, -1],\n      [-7, 12],\n      [0, 22],\n      [15, 25],\n      [31, 3]\n    ],\n    [\n      [2096, 9122],\n      [-15, 8],\n      [14, 1],\n      [1, -9]\n    ],\n    [\n      [2919, 9131],\n      [3, -14],\n      [-16, 10],\n      [2, 12],\n      [11, -8]\n    ],\n    [\n      [2173, 9144],\n      [-3, -12],\n      [-12, 5],\n      [15, 7]\n    ],\n    [\n      [2218, 9152],\n      [-13, -10],\n      [2, 17],\n      [11, -7]\n    ],\n    [\n      [2820, 9179],\n      [-10, -28],\n      [-16, -3],\n      [26, 31]\n    ],\n    [\n      [2860, 9180],\n      [10, -6],\n      [-13, -11],\n      [-6, 16],\n      [9, 1]\n    ],\n    [\n      [2315, 9189],\n      [14, 0],\n      [-4, -11],\n      [-10, 11]\n    ],\n    [\n      [2342, 9191],\n      [8, -12],\n      [-14, -3],\n      [6, 15]\n    ],\n    [\n      [3114, 9197],\n      [-2, -10],\n      [-10, 3],\n      [12, 7]\n    ],\n    [\n      [2834, 9196],\n      [-16, -12],\n      [-9, 1],\n      [20, 15],\n      [5, -4]\n    ],\n    [\n      [2787, 9204],\n      [9, -8],\n      [-21, -3],\n      [4, -8],\n      [-24, 10],\n      [16, 8],\n      [16, 1]\n    ],\n    [\n      [2294, 9191],\n      [5, 5],\n      [10, -12],\n      [22, -14],\n      [6, -20],\n      [18, -3],\n      [-17, -6],\n      [-13, -15],\n      [-33, 4],\n      [-9, 7],\n      [-25, 7],\n      [-3, 8],\n      [-11, -6],\n      [-11, 11],\n      [33, 17],\n      [-4, 16],\n      [12, -9],\n      [-6, 16],\n      [10, 11],\n      [18, -11],\n      [-2, -6]\n    ],\n    [\n      [3004, 9275],\n      [14, -3],\n      [-20, -12],\n      [-5, 8],\n      [11, 7]\n    ],\n    [\n      [2924, 7774],\n      [-11, -4],\n      [-19, -25]\n    ],\n    [\n      [2894, 7745],\n      [-6, -7],\n      [-19, -10],\n      [-11, -18],\n      [-17, 9],\n      [-5, -3],\n      [-30, -8],\n      [-17, -15],\n      [-5, -17],\n      [13, -6],\n      [7, 4]\n    ],\n    [\n      [2804, 7674],\n      [-1, -9]\n    ],\n    [\n      [2803, 7665],\n      [5, -11],\n      [-36, -7],\n      [-9, -13],\n      [-11, 6],\n      [-12, -1],\n      [-32, -36],\n      [-12, -2],\n      [-5, 4],\n      [0, 12],\n      [5, 4],\n      [13, -1],\n      [1, 10],\n      [-6, 4]\n    ],\n    [\n      [2704, 7634],\n      [5, 9],\n      [1, 17]\n    ],\n    [\n      [2710, 7660],\n      [8, 4],\n      [12, 20],\n      [-1, 38],\n      [4, 14],\n      [9, 16],\n      [0, 12],\n      [-12, 25],\n      [11, 0],\n      [1, -14],\n      [14, -17],\n      [18, -14],\n      [0, 17],\n      [4, 6],\n      [6, -5],\n      [-9, 17],\n      [2, 14],\n      [-10, 3],\n      [-10, 32],\n      [-12, 0],\n      [-10, 8],\n      [-39, 6],\n      [-3, 0],\n      [-30, 10]\n    ],\n    [\n      [2663, 7852],\n      [0, 10],\n      [-10, -4]\n    ],\n    [\n      [2653, 7858],\n      [-3, 4],\n      [4, 24],\n      [-8, 1],\n      [3, 23],\n      [-11, 14],\n      [5, 20],\n      [-25, 0],\n      [-8, 9],\n      [-12, 39],\n      [-22, -2],\n      [-24, 14],\n      [-2, -22],\n      [-7, -2],\n      [3, 15],\n      [-6, -2],\n      [-5, -26],\n      [-5, -3],\n      [3, 16],\n      [-10, -5],\n      [-5, -22],\n      [-7, -6]\n    ],\n    [\n      [2511, 7947],\n      [-9, -1],\n      [-4, 7],\n      [-20, 0],\n      [-2, 7],\n      [-16, -11],\n      [-8, 4],\n      [-10, 14],\n      [-8, -7],\n      [-3, 12],\n      [-14, 11],\n      [-22, -6],\n      [-3, 7],\n      [-17, 3],\n      [-6, 5],\n      [-4, 31],\n      [-9, 3],\n      [0, -22],\n      [-79, 0],\n      [-80, 0],\n      [-55, 0],\n      [-79, 0],\n      [-79, 0],\n      [-49, 0],\n      [-49, 0],\n      [-80, 0],\n      [-61, 0],\n      [-74, 0],\n      [-81, 0]\n    ],\n    [\n      [1590, 8004],\n      [-8, 0]\n    ],\n    [\n      [1582, 8004],\n      [-1, 0]\n    ],\n    [\n      [1581, 8004],\n      [-7, 20],\n      [2, 14],\n      [-8, -11],\n      [-12, 8],\n      [-1, 15],\n      [-14, 0],\n      [-6, 8],\n      [3, 18],\n      [-3, 5],\n      [-9, 0],\n      [-20, 12],\n      [-13, -2],\n      [6, 17],\n      [-14, 1],\n      [-10, 6],\n      [-4, -6],\n      [-14, 11],\n      [-8, 12],\n      [9, 23],\n      [13, 3],\n      [-9, 3],\n      [-10, -15],\n      [-4, 12],\n      [0, 14],\n      [19, 25],\n      [0, 13],\n      [-12, -16],\n      [-7, -5],\n      [-8, 17],\n      [-4, -12],\n      [4, 26],\n      [-10, 9],\n      [-10, 34],\n      [10, -5],\n      [-8, 12],\n      [5, 21],\n      [-17, -20],\n      [-3, -14],\n      [-21, 32],\n      [-4, 26],\n      [-6, -3],\n      [1, 17],\n      [7, 4],\n      [10, 33],\n      [-5, 0],\n      [-4, 28],\n      [2, 8]\n    ],\n    [\n      [1387, 8402],\n      [0, 0]\n    ],\n    [\n      [1387, 8402],\n      [-1, 12],\n      [-9, 1],\n      [-9, 13],\n      [-10, 3],\n      [-14, 11],\n      [-7, 0],\n      [0, 11],\n      [-7, 4],\n      [2, 10],\n      [-29, 56],\n      [-20, 40],\n      [-12, 8],\n      [-4, 12],\n      [-21, 22],\n      [3, 8],\n      [-13, 13],\n      [-25, -11],\n      [-2, -20],\n      [-27, -20],\n      [-5, 17],\n      [-43, 50],\n      [3, 16],\n      [-17, -1],\n      [-9, -8],\n      [-12, 6],\n      [-16, 1],\n      [0, 538]\n    ],\n    [\n      [1083, 9194],\n      [29, -2],\n      [23, -6],\n      [15, -16],\n      [50, -21],\n      [26, 2],\n      [-3, 18],\n      [20, 5],\n      [-1, 8],\n      [29, 8],\n      [12, -5],\n      [-9, -9],\n      [24, 4],\n      [10, 14],\n      [16, 0],\n      [45, 28],\n      [22, -4],\n      [5, 11],\n      [9, -11],\n      [-45, -25],\n      [-27, -6],\n      [-3, -10],\n      [-18, -6],\n      [-4, -15],\n      [-9, 3],\n      [-4, -11],\n      [24, -3],\n      [-11, 15],\n      [29, 13],\n      [15, 12],\n      [12, -9],\n      [14, 21],\n      [35, 9],\n      [0, -10],\n      [23, 16],\n      [-2, 9],\n      [22, 7],\n      [-13, 3],\n      [0, 17],\n      [23, -16],\n      [14, -32],\n      [15, -16],\n      [20, -9],\n      [9, 4],\n      [-8, 12],\n      [10, 9],\n      [8, 18],\n      [10, -1],\n      [-2, -19],\n      [12, 0],\n      [-13, -19],\n      [24, -2],\n      [14, 8],\n      [6, 20],\n      [36, -3],\n      [23, -10],\n      [23, -16],\n      [31, -5],\n      [23, -13],\n      [57, -13],\n      [-9, 8],\n      [11, 4],\n      [38, -17],\n      [18, -18],\n      [-3, -9],\n      [-26, 2],\n      [-8, -18],\n      [-9, -3],\n      [47, -13],\n      [40, -1],\n      [3, 4],\n      [36, 1],\n      [22, 14],\n      [13, -16],\n      [18, 0],\n      [7, -21],\n      [6, 15],\n      [20, -23],\n      [-7, -21],\n      [25, -29],\n      [-12, 23],\n      [1, 18],\n      [16, -14],\n      [-4, 15],\n      [-9, 8],\n      [0, 15],\n      [-12, 12],\n      [7, 19],\n      [35, 18],\n      [21, 5],\n      [1, 13],\n      [-24, -7],\n      [2, -8],\n      [-22, -7],\n      [-16, 5],\n      [7, -11],\n      [-22, -3],\n      [-2, 12],\n      [-10, -3],\n      [14, 20],\n      [27, 5],\n      [31, 14],\n      [12, -3],\n      [9, -11],\n      [4, -20],\n      [19, -6],\n      [4, -12],\n      [20, -1],\n      [9, 8],\n      [5, -11],\n      [27, -14],\n      [21, -3],\n      [23, 10],\n      [26, -1],\n      [15, -7],\n      [25, 5],\n      [22, -12],\n      [12, 11],\n      [-16, 12],\n      [-10, -9],\n      [-10, 10],\n      [3, 9],\n      [-11, 11],\n      [27, 1],\n      [-8, 9],\n      [21, -3],\n      [5, -12],\n      [18, 3],\n      [-11, -15],\n      [26, 12],\n      [-16, -41],\n      [11, -19],\n      [10, 8],\n      [11, -20],\n      [4, 16],\n      [-15, 26],\n      [7, 19],\n      [17, -3],\n      [18, 14],\n      [18, 33],\n      [-10, 8],\n      [-5, -13],\n      [-15, 0],\n      [11, 34],\n      [18, -2],\n      [2, 13],\n      [-22, -5],\n      [-9, 14],\n      [-7, -7],\n      [-25, 10],\n      [-21, 22],\n      [1, 14],\n      [9, 15],\n      [-12, 9],\n      [5, 30],\n      [14, 6],\n      [8, -7],\n      [5, 12],\n      [-13, 4],\n      [18, 9],\n      [2, 13],\n      [18, 3],\n      [4, -19],\n      [7, 7],\n      [32, -24],\n      [4, -30],\n      [37, -41],\n      [-25, 2],\n      [-4, -6],\n      [18, -3],\n      [-25, -18],\n      [20, -9],\n      [18, 7],\n      [10, -9],\n      [19, -1],\n      [-23, -12],\n      [14, -11],\n      [6, -20],\n      [-2, -17],\n      [9, -12],\n      [11, 12],\n      [4, 31],\n      [11, 15],\n      [9, 1],\n      [28, -27],\n      [5, -32],\n      [-16, 2],\n      [1, -19],\n      [8, -19],\n      [17, -15],\n      [-1, -14],\n      [15, 7],\n      [-3, 7],\n      [14, -1],\n      [1, 20],\n      [17, 23],\n      [7, 37],\n      [25, 0],\n      [-10, 13],\n      [11, 7],\n      [-20, 11],\n      [-2, 10],\n      [6, 23],\n      [7, -4],\n      [20, 5],\n      [16, -9],\n      [30, -1],\n      [15, -23],\n      [22, -5],\n      [-6, -12],\n      [-12, -5],\n      [20, -5],\n      [1, -10],\n      [-20, -13],\n      [-17, 6],\n      [-2, -7],\n      [18, -11],\n      [-5, -13],\n      [26, -30],\n      [-7, -27],\n      [-13, -1],\n      [-17, -24],\n      [-12, -1],\n      [-10, -11],\n      [-25, 21],\n      [16, -30],\n      [-4, -2],\n      [-19, 14],\n      [4, -14],\n      [-25, 7],\n      [-5, 17],\n      [-19, -5],\n      [-18, 2],\n      [7, -12],\n      [19, -9],\n      [-16, -15],\n      [-3, -13],\n      [-23, -20],\n      [-16, 0],\n      [-17, 15],\n      [-31, 20],\n      [-10, -3],\n      [-30, 2],\n      [32, -7],\n      [14, -11],\n      [11, -16],\n      [56, -5],\n      [2, -11],\n      [-16, -20],\n      [-14, -27],\n      [-18, -15],\n      [-24, 1],\n      [-12, 10],\n      [4, -14],\n      [-10, -17],\n      [-21, -3],\n      [-19, 10],\n      [-14, 0],\n      [-37, 16],\n      [-8, -2],\n      [11, -10],\n      [4, 5],\n      [31, -11],\n      [-10, -11],\n      [18, 11],\n      [6, -8],\n      [25, -12],\n      [2, -18],\n      [-22, -16],\n      [-19, 5],\n      [-10, -3],\n      [15, -16],\n      [-19, 5],\n      [-2, -20],\n      [-8, -12],\n      [-18, -12],\n      [11, -4],\n      [-17, -12],\n      [-19, -60],\n      [-8, -31],\n      [3, -40],\n      [-3, -17],\n      [13, -17],\n      [3, 4],\n      [29, -1],\n      [2, -15],\n      [10, -37],\n      [9, -24],\n      [-3, -25],\n      [12, 2],\n      [30, 12],\n      [15, -3],\n      [15, -12],\n      [30, -8],\n      [12, -15],\n      [13, -10],\n      [7, -15],\n      [10, -12],\n      [11, -1],\n      [32, -17],\n      [21, -20],\n      [12, -3],\n      [19, 5],\n      [15, -6],\n      [12, 1],\n      [18, -9],\n      [3, -14],\n      [-6, -25],\n      [0, -12],\n      [8, -17],\n      [-2, -23],\n      [3, -13],\n      [-5, -19],\n      [20, -28],\n      [6, -21],\n      [10, -5],\n      [15, -30],\n      [1, -10],\n      [19, -11],\n      [1, 16],\n      [10, 15],\n      [11, -20],\n      [6, 11],\n      [-9, 15],\n      [13, 19],\n      [2, 22],\n      [-6, 4],\n      [1, 19],\n      [-5, 0],\n      [-5, 42],\n      [-2, 32],\n      [-7, 2],\n      [-6, 25],\n      [-5, 1],\n      [39, 22],\n      [16, 14],\n      [19, 23],\n      [12, 21],\n      [4, 16],\n      [0, 44],\n      [-8, 34],\n      [-9, 20],\n      [-24, 23],\n      [-13, 16],\n      [-2, 16],\n      [22, 21],\n      [-1, 20],\n      [14, 6],\n      [-1, 13],\n      [-7, 2],\n      [-7, 35],\n      [6, 6],\n      [-16, 2],\n      [10, 15],\n      [2, 20],\n      [6, 5],\n      [-13, 13],\n      [-4, 34],\n      [18, 16],\n      [21, -4],\n      [32, -14],\n      [34, -1],\n      [14, 12],\n      [18, -9],\n      [17, -14],\n      [-1, -8],\n      [30, -19],\n      [-9, -10],\n      [14, -16],\n      [23, -5],\n      [11, 2],\n      [2, -11],\n      [12, -1],\n      [2, 12],\n      [5, -18],\n      [-12, -15],\n      [6, -26],\n      [2, -26],\n      [-6, -6],\n      [3, -9],\n      [11, -2],\n      [-8, -8],\n      [2, -18],\n      [-19, -7],\n      [10, -3],\n      [15, 12],\n      [13, 1],\n      [11, -6],\n      [5, -24],\n      [7, 10],\n      [9, -20],\n      [28, 15],\n      [6, 21],\n      [10, -9],\n      [5, 18],\n      [7, 3],\n      [-2, 12],\n      [8, 8],\n      [-3, 22],\n      [8, 2],\n      [7, 25],\n      [14, 2],\n      [0, -12],\n      [9, -6],\n      [-1, -17],\n      [6, 0],\n      [5, -15],\n      [12, -13],\n      [-11, -9],\n      [13, 3],\n      [1, -13],\n      [7, 1],\n      [4, -11],\n      [-9, -11],\n      [16, 0],\n      [-2, -19],\n      [15, -12],\n      [7, -20],\n      [-14, -11],\n      [10, 2],\n      [6, -6],\n      [-6, -7],\n      [18, -7],\n      [-8, -18],\n      [-7, 0],\n      [5, -13],\n      [-9, -4],\n      [11, -10],\n      [-12, -2],\n      [5, -5],\n      [14, 1],\n      [-3, -13],\n      [10, -2],\n      [1, -7],\n      [22, -5],\n      [-4, -5],\n      [3, -16],\n      [-4, -16],\n      [20, 12],\n      [-2, -10],\n      [10, -5],\n      [10, 9],\n      [6, -22],\n      [30, -6],\n      [14, -10],\n      [-9, -11],\n      [-15, -1],\n      [-1, -6],\n      [-33, -12],\n      [21, 5],\n      [3, -3],\n      [-30, -15],\n      [-13, -3],\n      [2, -15],\n      [-11, -14],\n      [38, 24],\n      [6, 15],\n      [19, 9],\n      [-5, 7],\n      [24, -1],\n      [11, -22],\n      [-12, -11],\n      [6, -9],\n      [9, 15],\n      [30, -19],\n      [4, -15],\n      [-6, -7],\n      [5, -9],\n      [-7, -12],\n      [8, -9],\n      [4, -17],\n      [-8, -15],\n      [-20, -17],\n      [-10, -13],\n      [-8, 5],\n      [-25, -14],\n      [-8, 3],\n      [-7, -12],\n      [-8, -5],\n      [1, -12],\n      [-13, -8],\n      [0, -8],\n      [-11, -6],\n      [-3, -10],\n      [-38, -3],\n      [-10, -5],\n      [-6, 7],\n      [-51, 4],\n      [-26, -2],\n      [-37, 0],\n      [-5, -5],\n      [-8, 5],\n      [-19, -25],\n      [-3, -23],\n      [-4, -6],\n      [-19, -3],\n      [-4, -11],\n      [-24, -18],\n      [-10, -28],\n      [-7, -9],\n      [-19, 14],\n      [-5, -2],\n      [22, -14],\n      [-5, -20],\n      [-10, -17],\n      [-6, -3],\n      [-6, -17],\n      [-17, -23],\n      [-15, -1],\n      [-21, -24],\n      [-10, -4],\n      [-7, -18],\n      [-12, -11],\n      [-7, -11],\n      [-6, -2],\n      [5, -8],\n      [-15, -12],\n      [-6, -8]\n    ],\n    [\n      [1827, 9404],\n      [6, -29],\n      [-17, -11],\n      [32, 3],\n      [-4, 6],\n      [17, 15],\n      [49, -17],\n      [-3, -15],\n      [17, 6],\n      [18, -8],\n      [8, 4],\n      [-26, 29],\n      [23, -2],\n      [24, -23],\n      [11, -1],\n      [-1, -11],\n      [13, -38],\n      [6, -4],\n      [21, 15],\n      [-15, 14],\n      [-9, 45],\n      [0, 25],\n      [29, -10],\n      [8, 7],\n      [26, -17],\n      [18, -30],\n      [4, -24],\n      [19, -29],\n      [-7, -28],\n      [16, -17],\n      [25, -16],\n      [8, 1],\n      [35, -23],\n      [16, 4],\n      [4, -24],\n      [-13, -6],\n      [-4, 13],\n      [-5, -14],\n      [-19, 11],\n      [-14, -26],\n      [22, 5],\n      [-2, -17],\n      [9, -10],\n      [-19, -8],\n      [-24, -5],\n      [-49, 6],\n      [4, 12],\n      [-40, 5],\n      [-4, 18],\n      [-10, -16],\n      [-17, -13],\n      [-28, -6],\n      [-12, -9],\n      [-56, -11],\n      [-59, -3],\n      [-16, 19],\n      [2, 22],\n      [-18, 5],\n      [-26, -3],\n      [-22, 4],\n      [-18, 9],\n      [0, 6],\n      [-18, 12],\n      [-4, 14],\n      [39, 12],\n      [41, 5],\n      [53, -7],\n      [9, 7],\n      [22, -3],\n      [-18, 14],\n      [-19, 2],\n      [-18, 8],\n      [-58, -6],\n      [-19, 4],\n      [-40, -1],\n      [-19, 23],\n      [17, 8],\n      [41, 11],\n      [13, 11],\n      [-48, -10],\n      [-21, 6],\n      [13, 5],\n      [-36, 7],\n      [0, 11],\n      [16, 17],\n      [13, 3],\n      [-13, 15],\n      [34, 25],\n      [50, 16],\n      [27, 11],\n      [10, -5]\n    ],\n    [\n      [2094, 9405],\n      [-16, -22],\n      [-8, 1],\n      [-18, 19],\n      [-26, 12],\n      [13, 13],\n      [42, 1],\n      [16, -10],\n      [-3, -14]\n    ],\n    [\n      [2768, 9430],\n      [25, -7],\n      [37, 2],\n      [19, -6],\n      [32, -26],\n      [-1, -17],\n      [-52, 5],\n      [-28, -9],\n      [-22, 6],\n      [-4, 22],\n      [-21, 5],\n      [1, 25],\n      [14, 0]\n    ],\n    [\n      [2595, 9436],\n      [41, -3],\n      [4, -8],\n      [-30, -21],\n      [-18, -26],\n      [10, -20],\n      [-3, -28],\n      [9, -14],\n      [19, -16],\n      [14, -5],\n      [-16, -13],\n      [-13, 0],\n      [-8, -10],\n      [21, 10],\n      [18, -2],\n      [8, 17],\n      [-4, 14],\n      [-16, -1],\n      [-8, 13],\n      [2, 21],\n      [16, 1],\n      [-18, 12],\n      [-3, 25],\n      [14, 2],\n      [-6, 11],\n      [26, -5],\n      [-19, 15],\n      [63, 24],\n      [37, -1],\n      [11, -27],\n      [14, -5],\n      [0, -14],\n      [10, -10],\n      [-26, -24],\n      [18, 11],\n      [-11, -18],\n      [5, -13],\n      [12, 5],\n      [16, 25],\n      [23, -13],\n      [11, 14],\n      [26, 14],\n      [67, -15],\n      [7, -14],\n      [-14, -14],\n      [33, 4],\n      [0, -15],\n      [-32, -17],\n      [31, 12],\n      [19, -1],\n      [-10, -9],\n      [-4, -17],\n      [12, 19],\n      [3, -12],\n      [15, -7],\n      [13, 23],\n      [32, -12],\n      [8, -11],\n      [-10, -12],\n      [-11, 3],\n      [-13, -14],\n      [4, -6],\n      [25, 7],\n      [4, 9],\n      [15, 2],\n      [3, -9],\n      [-13, -17],\n      [30, 15],\n      [-3, -16],\n      [15, 10],\n      [31, -11],\n      [-10, -16],\n      [-31, -9],\n      [32, 3],\n      [-1, -16],\n      [12, 9],\n      [6, 14],\n      [24, -23],\n      [2, -12],\n      [-26, 3],\n      [-15, -11],\n      [19, -8],\n      [19, 1],\n      [16, -11],\n      [-2, -8],\n      [-26, 2],\n      [-15, 8],\n      [-22, 3],\n      [22, -8],\n      [13, -10],\n      [-8, -4],\n      [5, -11],\n      [-43, 2],\n      [33, -6],\n      [-9, -8],\n      [29, -2],\n      [23, -6],\n      [-10, -6],\n      [8, -11],\n      [37, -12],\n      [12, 7],\n      [-2, -12],\n      [18, -4],\n      [13, -28],\n      [-21, -10],\n      [47, 10],\n      [-7, -18],\n      [22, -5],\n      [5, 9],\n      [18, -10],\n      [10, -16],\n      [-20, -10],\n      [14, -3],\n      [-30, -8],\n      [14, -7],\n      [-7, -17],\n      [-15, -3],\n      [7, -7],\n      [-17, -1],\n      [-7, 16],\n      [3, -21],\n      [-9, -4],\n      [9, -9],\n      [-5, -24],\n      [-17, 9],\n      [-9, 14],\n      [-1, -9],\n      [-18, 16],\n      [-1, 14],\n      [-9, 5],\n      [19, 17],\n      [-31, -5],\n      [-2, 9],\n      [-22, 20],\n      [2, 8],\n      [-13, -6],\n      [-6, -11],\n      [-16, 12],\n      [7, -15],\n      [16, -12],\n      [-1, -7],\n      [-20, -1],\n      [-9, 18],\n      [-2, -18],\n      [12, -16],\n      [14, 3],\n      [-2, -10],\n      [10, -2],\n      [10, -39],\n      [1, 14],\n      [31, -16],\n      [-3, -16],\n      [17, 0],\n      [-10, -10],\n      [11, -14],\n      [11, -5],\n      [-9, -11],\n      [12, -6],\n      [0, -25],\n      [-7, 5],\n      [-4, 18],\n      [-2, -14],\n      [10, -29],\n      [-17, 5],\n      [8, -19],\n      [-7, -5],\n      [-1, 13],\n      [-12, 11],\n      [-12, -3],\n      [-13, 13],\n      [-5, -5],\n      [-20, 21],\n      [-6, 12],\n      [-1, -16],\n      [-27, 24],\n      [-8, -3],\n      [23, -33],\n      [17, -6],\n      [17, -21],\n      [5, 0],\n      [16, -26],\n      [7, -2],\n      [-9, -20],\n      [-30, 16],\n      [-35, 7],\n      [-12, 7],\n      [-25, 24],\n      [-9, -2],\n      [-38, 22],\n      [-5, 14],\n      [15, 10],\n      [-16, 12],\n      [-2, -7],\n      [-15, 9],\n      [-13, 14],\n      [-15, 33],\n      [-20, -9],\n      [4, 15],\n      [-14, -6],\n      [-5, -14],\n      [-30, 14],\n      [-5, -12],\n      [-24, -12],\n      [-14, 2],\n      [-18, 11],\n      [-4, 27],\n      [5, 9],\n      [18, 8],\n      [-3, 15],\n      [21, -2],\n      [25, -11],\n      [9, -9],\n      [-6, -7],\n      [10, -12],\n      [-2, 16],\n      [-16, 17],\n      [23, -3],\n      [1, 7],\n      [15, -3],\n      [11, 12],\n      [19, -5],\n      [-7, 19],\n      [-8, 4],\n      [-13, 18],\n      [41, 32],\n      [5, 19],\n      [15, 6],\n      [-4, 22],\n      [-12, 18],\n      [-4, 23],\n      [-23, 5],\n      [3, 18],\n      [-19, -6],\n      [-13, 16],\n      [2, 15],\n      [-9, -11],\n      [-10, 2],\n      [-32, -14],\n      [0, 20],\n      [28, 3],\n      [1, 9],\n      [-30, 19],\n      [-15, 5],\n      [10, 9],\n      [-23, 0],\n      [0, 21],\n      [-20, 2],\n      [-10, 12],\n      [-21, 2],\n      [21, -15],\n      [3, -13],\n      [-29, -7],\n      [-6, 8],\n      [-39, 3],\n      [15, -14],\n      [-9, -2],\n      [-14, 13],\n      [-15, -11],\n      [-25, 12],\n      [-15, -3],\n      [-31, 3],\n      [-5, 4],\n      [-39, 2],\n      [-21, 21],\n      [1, -11],\n      [-47, 11],\n      [-21, 25],\n      [9, 7],\n      [22, -4],\n      [27, 0],\n      [-15, 18],\n      [-6, -3],\n      [-47, 6],\n      [-5, 7],\n      [5, 17],\n      [-9, 11],\n      [5, 24],\n      [25, 52],\n      [36, 27],\n      [33, 8]\n    ],\n    [\n      [2227, 9438],\n      [17, -9],\n      [57, 6],\n      [4, -12],\n      [-12, -6],\n      [8, -7],\n      [-19, -7],\n      [-19, -16],\n      [35, -3],\n      [9, -16],\n      [12, 3],\n      [5, -18],\n      [-9, -6],\n      [3, -27],\n      [-25, -13],\n      [-26, 2],\n      [9, -8],\n      [-13, -13],\n      [-19, 3],\n      [-13, 25],\n      [-27, 24],\n      [-21, 3],\n      [-34, 24],\n      [-4, 9],\n      [14, 16],\n      [11, -4],\n      [16, -18],\n      [24, 2],\n      [10, 8],\n      [-4, 14],\n      [-11, 1],\n      [-28, 20],\n      [11, 7],\n      [16, -9],\n      [3, 8],\n      [-13, 12],\n      [33, 5]\n    ],\n    [\n      [2287, 9448],\n      [-13, -11],\n      [-23, -4],\n      [-12, 7],\n      [34, 10],\n      [14, -2]\n    ],\n    [\n      [2423, 9449],\n      [18, -8],\n      [8, 5],\n      [45, -7],\n      [-28, -33],\n      [-12, -21],\n      [-14, -14],\n      [-33, 4],\n      [-13, -4],\n      [10, -16],\n      [-18, -22],\n      [-29, -6],\n      [-2, 33],\n      [-11, 9],\n      [-2, 60],\n      [11, 2],\n      [1, 14],\n      [44, 9],\n      [25, -5]\n    ],\n    [\n      [1623, 9476],\n      [28, -12],\n      [41, -10],\n      [46, 4],\n      [58, -41],\n      [-3, -6],\n      [-28, -9],\n      [-76, -37],\n      [-3, -15],\n      [-14, -8],\n      [-13, 1],\n      [-3, -32],\n      [-7, -11],\n      [-22, -7],\n      [-9, 5],\n      [-11, -12],\n      [-27, -10],\n      [-26, 36],\n      [-34, 14],\n      [-14, 0],\n      [0, 10],\n      [14, 22],\n      [9, 4],\n      [-4, 18],\n      [17, 2],\n      [-12, 9],\n      [14, 21],\n      [16, 15],\n      [-10, 9],\n      [-14, 28],\n      [87, 12]\n    ],\n    [\n      [2118, 9518],\n      [-3, -12],\n      [-30, 4],\n      [15, 17],\n      [18, -9]\n    ],\n    [\n      [2378, 9537],\n      [25, -20],\n      [2, -24],\n      [-5, -11],\n      [-41, 1],\n      [-43, 18],\n      [23, 30],\n      [25, 8],\n      [14, -2]\n    ],\n    [\n      [2325, 9539],\n      [-16, -17],\n      [-5, 9],\n      [21, 8]\n    ],\n    [\n      [2164, 9558],\n      [-14, -12],\n      [-20, -1],\n      [7, 9],\n      [27, 4]\n    ],\n    [\n      [2380, 9546],\n      [-17, 10],\n      [11, 3],\n      [6, -13]\n    ],\n    [\n      [2157, 9563],\n      [-38, -10],\n      [11, 8],\n      [27, 2]\n    ],\n    [\n      [1732, 9567],\n      [5, -3],\n      [-22, -28],\n      [-10, -5],\n      [-22, 5],\n      [20, 18],\n      [29, 13]\n    ],\n    [\n      [2805, 9567],\n      [0, -15],\n      [-16, -3],\n      [16, 18]\n    ],\n    [\n      [2149, 9575],\n      [-6, -11],\n      [-43, 0],\n      [2, 8],\n      [47, 3]\n    ],\n    [\n      [2113, 9595],\n      [25, -12],\n      [-38, -5],\n      [-7, 16],\n      [20, 1]\n    ],\n    [\n      [2266, 9598],\n      [21, -11],\n      [7, -58],\n      [-18, 1],\n      [14, -20],\n      [-11, -7],\n      [-47, -3],\n      [-20, 3],\n      [-11, 19],\n      [33, 20],\n      [-52, -5],\n      [-33, -7],\n      [2, 14],\n      [20, 10],\n      [-6, 28],\n      [18, 3],\n      [35, -31],\n      [7, 21],\n      [-30, 12],\n      [15, 9],\n      [23, 0],\n      [13, -10],\n      [20, 12]\n    ],\n    [\n      [2213, 9601],\n      [-38, -8],\n      [20, 9],\n      [18, -1]\n    ],\n    [\n      [2508, 9589],\n      [-10, -2],\n      [-15, 15],\n      [17, 6],\n      [8, -19]\n    ],\n    [\n      [1981, 9607],\n      [-3, -11],\n      [20, -20],\n      [-11, -11],\n      [22, -7],\n      [-10, -10],\n      [27, 5],\n      [12, 10],\n      [31, -10],\n      [1, -18],\n      [-15, -30],\n      [-28, -8],\n      [-21, 7],\n      [-19, -7],\n      [-5, 8],\n      [-25, -11],\n      [-22, -4],\n      [-24, -12],\n      [-34, -10],\n      [-29, 0],\n      [-27, 17],\n      [52, 17],\n      [27, 0],\n      [19, 13],\n      [-36, -6],\n      [-3, 5],\n      [-44, -9],\n      [-5, 24],\n      [-10, -23],\n      [-35, -6],\n      [-55, 16],\n      [12, 13],\n      [30, 0],\n      [31, 14],\n      [-30, -8],\n      [-32, 0],\n      [10, 12],\n      [57, 5],\n      [-39, 0],\n      [-12, 12],\n      [23, 10],\n      [10, 12],\n      [36, 1],\n      [7, -17],\n      [28, 5],\n      [33, -21],\n      [14, -22],\n      [62, -1],\n      [6, 7],\n      [-32, 17],\n      [18, 11],\n      [-30, 11],\n      [18, 11],\n      [15, 19],\n      [15, 0]\n    ],\n    [\n      [1840, 9610],\n      [3, -10],\n      [-34, 3],\n      [31, 7]\n    ],\n    [\n      [2354, 9618],\n      [44, -6],\n      [16, -16],\n      [46, 3],\n      [26, -13],\n      [-26, 0],\n      [59, -9],\n      [-2, -7],\n      [-52, -1],\n      [30, -6],\n      [28, -18],\n      [2, -16],\n      [14, 11],\n      [11, -8],\n      [26, 6],\n      [13, -9],\n      [59, 10],\n      [21, 10],\n      [23, -5],\n      [16, 6],\n      [39, -3],\n      [40, -18],\n      [6, -11],\n      [-25, -15],\n      [16, 1],\n      [10, -9],\n      [-23, -7],\n      [-1, -11],\n      [-29, 0],\n      [-12, -6],\n      [-33, 5],\n      [-7, 16],\n      [-11, -16],\n      [-84, -5],\n      [-53, 2],\n      [2, 20],\n      [-21, -15],\n      [-21, -3],\n      [-30, 10],\n      [-10, -4],\n      [-19, 9],\n      [1, 10],\n      [-13, 14],\n      [11, 38],\n      [-14, 8],\n      [-14, 21],\n      [-17, -6],\n      [-37, -3],\n      [6, 7],\n      [-27, 3],\n      [-11, 14],\n      [-18, 4],\n      [15, 6],\n      [-15, 7],\n      [13, 6],\n      [32, -1]\n    ],\n    [\n      [1774, 9644],\n      [20, -9],\n      [-25, -7],\n      [-2, -15],\n      [13, -14],\n      [-30, -8],\n      [-9, -17],\n      [-20, 9],\n      [5, 24],\n      [-19, -6],\n      [-1, -22],\n      [-34, -26],\n      [-19, -3],\n      [-7, 19],\n      [-15, -12],\n      [-46, 8],\n      [9, 15],\n      [31, 5],\n      [9, 14],\n      [22, 7],\n      [15, 17],\n      [27, 15],\n      [26, 1],\n      [18, -6],\n      [32, 11]\n    ],\n    [\n      [2491, 9653],\n      [17, -10],\n      [-11, -14],\n      [-30, 11],\n      [0, 13],\n      [24, 0]\n    ],\n    [\n      [2083, 9641],\n      [18, -11],\n      [-11, -7],\n      [-23, 12],\n      [-14, 25],\n      [13, 0],\n      [17, -19]\n    ],\n    [\n      [2350, 9662],\n      [51, 0],\n      [13, -7],\n      [-11, -10],\n      [-70, 0],\n      [-6, 13],\n      [23, 4]\n    ],\n    [\n      [2196, 9660],\n      [-42, -1],\n      [0, 9],\n      [21, 1],\n      [21, -9]\n    ],\n    [\n      [1824, 9675],\n      [20, -11],\n      [-15, -6],\n      [-27, 14],\n      [22, 3]\n    ],\n    [\n      [1955, 9679],\n      [-35, -12],\n      [21, -5],\n      [-3, -16],\n      [-52, -10],\n      [-31, 11],\n      [3, 23],\n      [51, 10],\n      [46, -1]\n    ],\n    [\n      [1933, 9718],\n      [31, -15],\n      [-4, -11],\n      [-50, 5],\n      [-52, -7],\n      [-5, 8],\n      [40, 8],\n      [40, 12]\n    ],\n    [\n      [2308, 9715],\n      [18, -10],\n      [40, -9],\n      [-15, -7],\n      [9, -16],\n      [-51, -11],\n      [-22, 18],\n      [22, 2],\n      [-33, 10],\n      [-10, 12],\n      [7, 18],\n      [35, -7]\n    ],\n    [\n      [2120, 9752],\n      [22, -6],\n      [10, -21],\n      [25, 12],\n      [58, -29],\n      [-8, -16],\n      [22, -13],\n      [0, -11],\n      [-25, -6],\n      [-19, 5],\n      [-12, 19],\n      [-45, 10],\n      [-50, -6],\n      [-10, 18],\n      [38, -3],\n      [1, 15],\n      [-18, 11],\n      [-27, -9],\n      [10, 11],\n      [-26, 2],\n      [4, 16],\n      [50, 1]\n    ],\n    [\n      [2237, 9796],\n      [21, -8],\n      [-5, -17],\n      [-36, 22],\n      [20, 3]\n    ],\n    [\n      [2423, 9866],\n      [56, -44],\n      [40, -1],\n      [1, -15],\n      [22, 9],\n      [22, -2],\n      [19, -26],\n      [-9, -26],\n      [20, 9],\n      [23, -2],\n      [24, -19],\n      [-46, -14],\n      [-69, -50],\n      [-26, 25],\n      [15, -26],\n      [-24, 10],\n      [0, -11],\n      [-49, 4],\n      [-22, 17],\n      [34, 3],\n      [-45, 2],\n      [-28, 21],\n      [25, 12],\n      [79, 3],\n      [-58, 1],\n      [0, 12],\n      [-36, -11],\n      [-3, 7],\n      [-33, -6],\n      [-14, 15],\n      [27, 4],\n      [-31, 3],\n      [-21, 14],\n      [-4, 14],\n      [53, -6],\n      [21, 9],\n      [-36, -4],\n      [-32, 9],\n      [14, 17],\n      [41, 2],\n      [7, 8],\n      [-33, 3],\n      [17, 15],\n      [39, 0],\n      [7, 9],\n      [-28, 8],\n      [41, -2]\n    ],\n    [\n      [3064, 9969],\n      [92, -13],\n      [-63, -13],\n      [33, 0],\n      [64, 14],\n      [63, -22],\n      [36, -2],\n      [8, -17],\n      [-85, -27],\n      [-75, -6],\n      [11, -7],\n      [-78, -18],\n      [137, 21],\n      [-4, -9],\n      [-119, -45],\n      [-9, -11],\n      [-28, -4],\n      [-23, -32],\n      [-31, -8],\n      [-32, 7],\n      [7, -13],\n      [-52, -10],\n      [-85, -2],\n      [20, -4],\n      [80, -3],\n      [-1, -11],\n      [-35, 3],\n      [-9, 7],\n      [-57, -2],\n      [56, -5],\n      [-45, -3],\n      [55, -3],\n      [-14, -6],\n      [38, -1],\n      [8, -15],\n      [-22, -5],\n      [-30, 2],\n      [38, -10],\n      [-14, -14],\n      [-35, -13],\n      [-43, 0],\n      [19, -17],\n      [-14, -13],\n      [-47, -6],\n      [-38, 9],\n      [-17, 14],\n      [5, -14],\n      [18, -8],\n      [57, -7],\n      [-10, -14],\n      [19, -6],\n      [18, 11],\n      [7, -22],\n      [-21, -10],\n      [-5, 7],\n      [-22, -15],\n      [-42, -11],\n      [8, 17],\n      [-36, 5],\n      [-6, -7],\n      [-40, 2],\n      [-13, 10],\n      [-6, -17],\n      [-23, -1],\n      [-61, 10],\n      [-4, -7],\n      [-37, 4],\n      [-15, 10],\n      [-1, 17],\n      [33, 15],\n      [23, -1],\n      [15, 8],\n      [-21, 5],\n      [-15, 25],\n      [29, 7],\n      [27, -6],\n      [22, -23],\n      [54, -3],\n      [27, 35],\n      [-39, -27],\n      [-38, 10],\n      [15, 39],\n      [-21, -13],\n      [-21, 5],\n      [-35, -4],\n      [1, 19],\n      [24, 20],\n      [44, 7],\n      [35, -5],\n      [56, 1],\n      [-53, 4],\n      [-30, 6],\n      [11, 9],\n      [-23, 27],\n      [-37, 6],\n      [0, 32],\n      [75, -4],\n      [67, -35],\n      [-7, 16],\n      [-44, 23],\n      [80, 9],\n      [54, 8],\n      [-44, 0],\n      [94, 17],\n      [-62, -3],\n      [-2, 9],\n      [57, 26],\n      [-37, -9],\n      [-40, -28],\n      [-44, -11],\n      [-53, -5],\n      [27, 11],\n      [-48, 2],\n      [1, -13],\n      [-55, -1],\n      [-26, 5],\n      [26, 19],\n      [85, 11],\n      [-93, -8],\n      [-33, -21],\n      [-58, 14],\n      [99, 12],\n      [30, 12],\n      [-43, -8],\n      [-98, -8],\n      [-15, 8],\n      [12, 11],\n      [45, 14],\n      [-57, -12],\n      [12, 13],\n      [-22, 4],\n      [-21, -8],\n      [-14, 7],\n      [27, 11],\n      [83, 15],\n      [87, -6],\n      [-56, 12],\n      [43, 5],\n      [-12, 10],\n      [30, 1],\n      [59, -23],\n      [-11, 12],\n      [82, -19],\n      [-75, 24],\n      [18, 17],\n      [41, -8],\n      [-28, 15],\n      [47, -2],\n      [16, 12],\n      [41, -3],\n      [44, -11],\n      [-31, 15],\n      [35, 4],\n      [54, -3],\n      [10, -8],\n      [24, 12],\n      [91, 2]\n    ],\n    [\n      [5255, 7927],\n      [0, 0]\n    ],\n    [\n      [5255, 7927],\n      [0, 0]\n    ],\n    [\n      [5255, 7927],\n      [10, -8]\n    ],\n    [\n      [5264, 7905],\n      [2, -12]\n    ],\n    [\n      [5290, 7882],\n      [-2, -13],\n      [-10, -7],\n      [4, -15],\n      [-6, 6],\n      [-12, -4],\n      [-2, 10],\n      [-5, 0],\n      [-1, -14],\n      [-5, -6],\n      [-1, -18],\n      [-7, 10],\n      [2, 5],\n      [-11, 9],\n      [0, 13],\n      [-10, -11],\n      [1, -8],\n      [-9, -12],\n      [-8, 4],\n      [-13, -4]\n    ],\n    [\n      [5195, 7827],\n      [-7, 15],\n      [0, 14]\n    ],\n    [\n      [5188, 7856],\n      [-5, 6],\n      [-8, -4],\n      [-3, -9]\n    ],\n    [\n      [5172, 7849],\n      [-4, 7],\n      [2, 10],\n      [8, 9],\n      [0, 11],\n      [7, 4],\n      [12, 28],\n      [8, -5],\n      [5, 10]\n    ],\n    [\n      [5210, 7923],\n      [14, -1],\n      [9, 5],\n      [4, 9],\n      [9, -9],\n      [9, 0]\n    ],\n    [\n      [3101, 2016],\n      [-9, -10],\n      [13, -7],\n      [6, -18],\n      [-2, -7],\n      [-8, 14],\n      [-15, -2],\n      [2, 19],\n      [-18, -5],\n      [-1, -4],\n      [-14, 10],\n      [3, 5],\n      [39, 9],\n      [4, -4]\n    ],\n    [\n      [3116, 2021],\n      [14, -1],\n      [7, -9],\n      [-5, -12],\n      [-7, 7],\n      [-9, -6],\n      [-8, 1],\n      [-2, 15],\n      [10, 5]\n    ],\n    [\n      [3041, 2018],\n      [7, -9],\n      [-19, 2],\n      [-1, 8],\n      [13, -1]\n    ],\n    [\n      [3069, 2021],\n      [8, -5],\n      [-19, -3],\n      [-1, 8],\n      [12, 0]\n    ],\n    [\n      [3013, 2074],\n      [7, -1],\n      [8, -15],\n      [-5, -7],\n      [-8, 10],\n      [-4, -3],\n      [-2, 16],\n      [4, 0]\n    ],\n    [\n      [3003, 2080],\n      [6, -2],\n      [-5, -24],\n      [-11, 16],\n      [0, 7],\n      [10, 3]\n    ],\n    [\n      [3044, 2081],\n      [2, -8],\n      [-9, 4],\n      [3, -17],\n      [-9, 10],\n      [-1, 10],\n      [8, 1],\n      [-2, 10],\n      [6, 7],\n      [2, -17]\n    ],\n    [\n      [2972, 2103],\n      [2, 3],\n      [22, -21],\n      [-6, -2],\n      [-14, -18],\n      [4, 15],\n      [-9, 1],\n      [-7, -7],\n      [1, 12],\n      [-8, 1],\n      [3, 17],\n      [12, -1]\n    ],\n    [\n      [2925, 2147],\n      [15, -16],\n      [8, 0],\n      [21, -22],\n      [-10, 3],\n      [-11, 14],\n      [-13, -1],\n      [-10, 22]\n    ],\n    [\n      [3093, 2028],\n      [0, -1]\n    ],\n    [\n      [3093, 2021],\n      [-12, -3],\n      [-17, 9],\n      [-13, -4],\n      [-23, 10],\n      [-10, 10],\n      [-17, -8],\n      [-1, 12],\n      [8, -7],\n      [10, 12],\n      [7, -9],\n      [6, 12],\n      [-2, 12],\n      [20, -15],\n      [7, 5],\n      [13, -4],\n      [10, -11],\n      [3, 8],\n      [-28, 18],\n      [-4, 19],\n      [24, 15],\n      [-1, 8],\n      [-25, -6],\n      [-6, 8],\n      [1, 17],\n      [9, 1],\n      [0, 8],\n      [12, 7],\n      [2, 13],\n      [6, 4],\n      [5, -11],\n      [16, 0]\n    ],\n    [\n      [2952, 2165],\n      [-2, -17],\n      [-9, 0],\n      [-2, 7],\n      [13, 10]\n    ],\n    [\n      [2921, 2176],\n      [8, -2],\n      [-6, -7],\n      [-2, 9]\n    ],\n    [\n      [2938, 2182],\n      [8, -11],\n      [-5, -6],\n      [-3, 17]\n    ],\n    [\n      [2920, 2209],\n      [3, -4],\n      [-3, -19],\n      [-5, 7],\n      [5, 16]\n    ],\n    [\n      [2943, 2211],\n      [3, -10],\n      [-9, 5],\n      [6, 5]\n    ],\n    [\n      [2925, 2234],\n      [1, -8],\n      [-9, 1],\n      [8, 7]\n    ],\n    [\n      [2931, 2257],\n      [2, -13],\n      [-14, -1],\n      [-1, 9],\n      [9, -2],\n      [4, 7]\n    ],\n    [\n      [2924, 2263],\n      [1, -11],\n      [-8, 7],\n      [7, 4]\n    ],\n    [\n      [2906, 2275],\n      [8, 0],\n      [-10, -15],\n      [2, 15]\n    ],\n    [\n      [2931, 2276],\n      [3, 1],\n      [5, -22],\n      [-5, 0],\n      [-6, 13],\n      [3, 8]\n    ],\n    [\n      [2908, 2302],\n      [14, -5],\n      [0, -6],\n      [-18, -9],\n      [1, 12],\n      [7, -5],\n      [-4, 13]\n    ],\n    [\n      [2903, 2329],\n      [8, -14],\n      [-12, 3],\n      [4, 11]\n    ],\n    [\n      [2914, 2359],\n      [5, -2],\n      [0, -12],\n      [-9, 10],\n      [4, 4]\n    ],\n    [\n      [2906, 2359],\n      [2, -6],\n      [-9, -5],\n      [7, 11]\n    ],\n    [\n      [2925, 2377],\n      [5, 0],\n      [2, -27],\n      [-3, -27],\n      [3, -13],\n      [-9, -10],\n      [-4, 6],\n      [1, 25],\n      [-4, -21],\n      [-7, 11],\n      [-2, 25],\n      [13, -3],\n      [2, 12],\n      [-7, 18],\n      [10, 4]\n    ],\n    [\n      [2906, 2392],\n      [1, -9],\n      [-7, -5],\n      [-2, 13],\n      [8, 1]\n    ],\n    [\n      [2924, 2406],\n      [4, -8],\n      [2, -18],\n      [-14, 4],\n      [-1, 6],\n      [9, 16]\n    ],\n    [\n      [2913, 2413],\n      [9, -4],\n      [-1, -11],\n      [-7, -2],\n      [-5, 19],\n      [4, -2]\n    ],\n    [\n      [2907, 2415],\n      [7, -32],\n      [-6, 0],\n      [0, 16],\n      [-5, -5],\n      [-3, 20],\n      [7, 1]\n    ],\n    [\n      [2921, 2430],\n      [3, -17],\n      [-11, 6],\n      [-1, 6],\n      [9, 5]\n    ],\n    [\n      [2945, 2427],\n      [4, -6],\n      [-19, 2],\n      [7, 7],\n      [8, -3]\n    ],\n    [\n      [2914, 2436],\n      [-3, -8],\n      [-5, 6],\n      [8, 2]\n    ],\n    [\n      [2924, 2545],\n      [-1, -11],\n      [-10, 7],\n      [11, 4]\n    ],\n    [\n      [2936, 2556],\n      [-5, -9],\n      [0, 15],\n      [5, -6]\n    ],\n    [\n      [2955, 2556],\n      [-6, -2],\n      [3, 11],\n      [3, -9]\n    ],\n    [\n      [2948, 2591],\n      [3, -16],\n      [-7, 2],\n      [-6, 12],\n      [10, 2]\n    ],\n    [\n      [2946, 2594],\n      [-9, -4],\n      [3, 9],\n      [6, -5]\n    ],\n    [\n      [2946, 2613],\n      [2, -4],\n      [-11, -6],\n      [-4, 10],\n      [13, 0]\n    ],\n    [\n      [2974, 2623],\n      [6, -4],\n      [-12, -23],\n      [-4, -1],\n      [-5, 16],\n      [7, 2],\n      [-1, 11],\n      [9, -1]\n    ],\n    [\n      [2948, 2662],\n      [3, -7],\n      [-11, 0],\n      [8, 7]\n    ],\n    [\n      [2945, 2775],\n      [11, 1],\n      [5, -30],\n      [-8, -2],\n      [-4, -15],\n      [9, -10],\n      [-6, -5],\n      [6, -13],\n      [-7, -2],\n      [2, -14],\n      [-17, 3],\n      [-3, 4],\n      [7, 21],\n      [-1, 36],\n      [4, 8],\n      [2, 18]\n    ],\n    [\n      [3098, 2168],\n      [-21, 9],\n      [-7, -4],\n      [-3, -12],\n      [-8, -1],\n      [-27, -20],\n      [-3, -19],\n      [-1, -36],\n      [-7, -5],\n      [-24, 11],\n      [-10, 15],\n      [5, 11],\n      [15, 1],\n      [10, 5],\n      [6, 18],\n      [-5, 1],\n      [-22, -19],\n      [-5, 6],\n      [-7, -20],\n      [1, -10],\n      [-20, 22],\n      [9, 0],\n      [-1, 20],\n      [14, 1],\n      [13, 9],\n      [14, 0],\n      [-2, 5],\n      [-21, 3],\n      [-19, -19],\n      [1, -11],\n      [-6, -4],\n      [-8, 6],\n      [6, 5],\n      [-9, 6],\n      [9, 1],\n      [2, 11],\n      [-11, -5],\n      [0, 29],\n      [6, -2],\n      [15, 16],\n      [9, -1],\n      [0, 13],\n      [-7, -6],\n      [-15, 13],\n      [10, -15],\n      [-6, -4],\n      [-4, -13],\n      [-8, 7],\n      [0, 17],\n      [-9, 7],\n      [-1, 13],\n      [6, 2],\n      [1, 13],\n      [-6, -6],\n      [-7, 4],\n      [-1, 17],\n      [11, -2],\n      [-1, 9],\n      [-6, -4],\n      [-5, 21],\n      [-13, 14],\n      [9, 8],\n      [1, 26],\n      [3, 6],\n      [-5, 9],\n      [0, 44],\n      [10, 11],\n      [-11, 13],\n      [-3, 13],\n      [21, -4],\n      [6, -13],\n      [5, 5],\n      [-10, 27],\n      [-1, -6],\n      [-21, 1],\n      [-2, 12],\n      [9, -2],\n      [-7, 11],\n      [6, 12],\n      [5, 0],\n      [6, 11],\n      [-6, 2],\n      [-3, 12],\n      [-11, 0],\n      [-1, -5],\n      [-11, 14],\n      [4, 11],\n      [-13, -16],\n      [2, -11],\n      [-6, -3],\n      [-4, 19],\n      [13, 13],\n      [3, 10],\n      [12, 11],\n      [0, 11],\n      [14, 3],\n      [6, -14],\n      [-1, -8],\n      [7, -4],\n      [-7, -18],\n      [4, -3],\n      [5, 16],\n      [4, 49],\n      [8, 10],\n      [-3, 20],\n      [4, -1],\n      [14, 13],\n      [1, 15],\n      [-14, 13],\n      [4, 39],\n      [-1, 17],\n      [9, 12],\n      [-3, 14],\n      [0, 18],\n      [5, 2],\n      [-3, 15],\n      [5, 3],\n      [4, -15],\n      [0, 27],\n      [-8, -3],\n      [-4, 6],\n      [8, 12],\n      [-10, 13],\n      [-3, -13],\n      [-12, -6],\n      [-7, 4],\n      [2, 7],\n      [-5, 11],\n      [-2, 27],\n      [5, 20],\n      [1, 37],\n      [9, 7],\n      [4, 19],\n      [1, 19],\n      [-9, 38],\n      [2, 30],\n      [-6, 26],\n      [1, 22],\n      [9, -3],\n      [5, 16],\n      [0, 18],\n      [4, -4],\n      [5, 42],\n      [6, 9],\n      [-1, 15],\n      [6, 18],\n      [5, 6],\n      [1, 15],\n      [4, 12],\n      [1, 31],\n      [6, 21],\n      [4, 4],\n      [1, 12],\n      [-4, 23],\n      [6, 5],\n      [4, 37],\n      [-4, 9],\n      [1, 25],\n      [-5, 52],\n      [0, 24],\n      [2, 12],\n      [7, 5],\n      [2, 44],\n      [-5, 10],\n      [-1, 19],\n      [6, 11],\n      [4, 20],\n      [0, 18],\n      [3, 22],\n      [4, 2],\n      [-1, 30],\n      [4, 5],\n      [2, 15],\n      [2, 41],\n      [-2, 11],\n      [2, 19],\n      [6, 8],\n      [-1, 24],\n      [-2, 5],\n      [1, 62],\n      [3, 17],\n      [-6, 0],\n      [1, 25],\n      [6, 1],\n      [4, 33],\n      [0, 23],\n      [2, 25],\n      [2, 3],\n      [0, 24],\n      [-3, 10],\n      [0, 37],\n      [2, 6],\n      [-1, 31],\n      [-5, 51],\n      [0, 21],\n      [-2, 8]\n    ],\n    [\n      [3044, 4127],\n      [12, 4],\n      [4, 9],\n      [0, 26],\n      [9, 9]\n    ],\n    [\n      [8073, 6343],\n      [8, -9],\n      [1, -20],\n      [-9, -13],\n      [-7, -43],\n      [-4, 0],\n      [-5, -15],\n      [-9, -1],\n      [-2, -11],\n      [-14, 6],\n      [-14, 12],\n      [-1, 42],\n      [10, 19],\n      [8, 9],\n      [-1, 10],\n      [7, -3],\n      [5, 9],\n      [8, -6],\n      [10, 10],\n      [8, -9],\n      [1, 13]\n    ],\n    [\n      [8066, 6398],\n      [4, -5],\n      [-8, -2],\n      [4, 7]\n    ],\n    [\n      [8393, 6916],\n      [2, -7],\n      [-8, 4],\n      [6, 3]\n    ],\n    [\n      [8386, 6994],\n      [-10, 4],\n      [-11, 15],\n      [6, 2],\n      [9, -11],\n      [8, -5],\n      [-2, -5]\n    ],\n    [\n      [8689, 7778],\n      [-2, 10],\n      [-10, 6],\n      [-11, -7]\n    ],\n    [\n      [8666, 7787],\n      [-4, 7],\n      [-12, -22],\n      [-11, -4],\n      [0, -9],\n      [6, -40],\n      [-2, -28],\n      [3, -6],\n      [-5, -31],\n      [-19, -10],\n      [3, -13]\n    ],\n    [\n      [8625, 7631],\n      [-8, 13],\n      [0, 9],\n      [-9, 7],\n      [-4, -13],\n      [-1, -19],\n      [-14, -5],\n      [-1, -10],\n      [-7, -10],\n      [-26, -3],\n      [8, -20],\n      [-3, -13],\n      [-30, 7],\n      [-2, 12],\n      [-9, 1],\n      [-12, -34],\n      [-9, -16],\n      [-6, 0],\n      [-8, -10],\n      [-16, -14],\n      [-14, -21]\n    ],\n    [\n      [8454, 7492],\n      [-5, -13],\n      [-6, -5],\n      [-9, 3],\n      [-11, -3],\n      [-28, -28],\n      [-3, -9],\n      [-8, -11],\n      [-3, 5],\n      [-7, -13],\n      [-10, -4],\n      [0, 12],\n      [15, 8],\n      [-10, 29],\n      [6, 0],\n      [-2, 11],\n      [12, 12],\n      [11, 27],\n      [-3, 13],\n      [-22, 14],\n      [-12, -7],\n      [0, -7],\n      [-10, -13],\n      [-4, -16],\n      [-14, -7],\n      [-17, -19],\n      [-1, -19],\n      [-10, -15],\n      [-10, 0],\n      [-7, -8],\n      [-11, 11],\n      [-6, -6],\n      [-5, -28],\n      [5, -14],\n      [10, -13],\n      [14, -4],\n      [7, 5],\n      [12, -25],\n      [-7, -1],\n      [-2, -21],\n      [10, -12],\n      [13, 1],\n      [2, 11],\n      [10, 10],\n      [3, 9],\n      [12, 10],\n      [11, -8],\n      [0, -6],\n      [9, -7],\n      [34, -4],\n      [-7, -15],\n      [3, -13],\n      [-9, -5],\n      [-5, 9],\n      [-28, -23],\n      [-6, 3],\n      [4, -11],\n      [-7, -1],\n      [0, -17],\n      [-11, -5],\n      [2, 8],\n      [-8, 2],\n      [2, -13],\n      [-7, -22],\n      [-8, -4],\n      [-7, -26],\n      [-5, -3],\n      [1, -16],\n      [12, -14],\n      [17, -12],\n      [6, -38],\n      [11, -36],\n      [-1, -21],\n      [15, -16],\n      [0, -13],\n      [11, -10],\n      [4, -16],\n      [-8, 1],\n      [-9, 9],\n      [-10, -3],\n      [-4, 11],\n      [-11, 2],\n      [-5, -7],\n      [-7, 4],\n      [-3, 16],\n      [-6, 2],\n      [3, -11],\n      [11, -13],\n      [16, 4],\n      [2, -9],\n      [7, -5],\n      [8, -15],\n      [9, -9],\n      [6, -12],\n      [2, -13],\n      [-9, -2],\n      [-12, -10],\n      [-8, -11],\n      [-5, -15],\n      [6, -2],\n      [6, 9],\n      [6, -1],\n      [8, -19],\n      [13, -6],\n      [-13, -19],\n      [7, 5],\n      [0, -22],\n      [-4, -6],\n      [-5, 3],\n      [1, -27],\n      [-5, -3],\n      [5, -23],\n      [-5, 2],\n      [-4, -10],\n      [-3, 12],\n      [-9, -28],\n      [-8, -17],\n      [-3, -23],\n      [-6, -4],\n      [-1, -11],\n      [-9, -7],\n      [-1, -8],\n      [-5, 9],\n      [-4, -6],\n      [5, -6],\n      [2, -11],\n      [-5, 4],\n      [2, -10],\n      [-5, -15],\n      [5, -3],\n      [-3, -18],\n      [-4, 0],\n      [6, -17],\n      [-11, 10],\n      [-4, -8],\n      [5, -14],\n      [-9, 1],\n      [-3, -9],\n      [3, -10],\n      [-10, 0],\n      [4, -9],\n      [-3, -8],\n      [-6, 3],\n      [-5, -5],\n      [-2, 8],\n      [-5, -13],\n      [3, -11],\n      [-5, -4],\n      [-1, -10],\n      [-6, -1],\n      [-7, -13],\n      [-4, 1],\n      [-5, -14],\n      [-6, 5],\n      [0, -9],\n      [-10, -21],\n      [-1, -10],\n      [-6, 1],\n      [-13, -12],\n      [-7, 6],\n      [0, -11],\n      [-14, 8],\n      [-5, -13],\n      [-6, 11],\n      [-5, -7],\n      [4, -8],\n      [-4, -3],\n      [-2, 9],\n      [-5, -3]\n    ],\n    [\n      [8172, 6482],\n      [-4, -2]\n    ],\n    [\n      [8168, 6480],\n      [-7, -3],\n      [-2, 17],\n      [-3, -1],\n      [-2, 15],\n      [-6, -8],\n      [6, -17],\n      [0, -15],\n      [-2, -9],\n      [-10, 20],\n      [7, -19],\n      [-10, -14],\n      [-5, 1],\n      [-13, -12],\n      [-10, 3],\n      [-11, -15],\n      [-25, -8],\n      [-3, -10],\n      [-6, -1],\n      [-7, -13],\n      [5, -7],\n      [-1, -13],\n      [7, -9],\n      [-4, -10],\n      [-13, -2],\n      [-1, 10],\n      [-7, 25],\n      [3, 28],\n      [5, 0],\n      [0, 8],\n      [-8, 1],\n      [-2, 14],\n      [-1, -16],\n      [-12, 1],\n      [0, 6],\n      [-9, 2],\n      [-9, 13],\n      [2, -16],\n      [-6, 7],\n      [0, -8],\n      [-9, -5]\n    ],\n    [\n      [7999, 6420],\n      [-7, 10],\n      [-9, -4],\n      [-12, 14],\n      [1, 6],\n      [-10, 2],\n      [0, 14],\n      [-4, 7],\n      [0, 14],\n      [5, 0],\n      [0, 16],\n      [-14, 0],\n      [-18, 12],\n      [-7, 14],\n      [-14, -13],\n      [1, -9],\n      [-14, -14],\n      [-3, 8],\n      [-6, -8],\n      [0, -9],\n      [-11, 16],\n      [-4, -12],\n      [-5, 11],\n      [-7, -21],\n      [-5, 10],\n      [-13, 9],\n      [-4, -20],\n      [-3, 0]\n    ],\n    [\n      [7836, 6473],\n      [-13, 3],\n      [-4, -12],\n      [1, -10],\n      [5, -15],\n      [0, -39],\n      [-5, 6],\n      [-9, -2],\n      [-2, 20]\n    ],\n    [\n      [7809, 6424],\n      [-2, 12],\n      [-7, -6],\n      [-3, -8],\n      [-8, -4],\n      [-2, 5],\n      [-5, -6],\n      [-2, 13],\n      [-4, 3],\n      [-1, 19],\n      [-14, 5],\n      [-6, -1],\n      [0, 16],\n      [4, 5],\n      [-1, 14],\n      [6, 11],\n      [-5, 13],\n      [-8, -2],\n      [-7, 5],\n      [2, 6],\n      [-6, 40],\n      [6, 9],\n      [-9, -3],\n      [-13, 1],\n      [-14, -14],\n      [-2, 5],\n      [5, 10],\n      [-1, 18],\n      [-4, 0],\n      [0, 17],\n      [7, 8],\n      [-2, 12],\n      [4, 11],\n      [2, -3],\n      [6, 10],\n      [0, 13],\n      [6, -3],\n      [3, 13],\n      [7, 6],\n      [-4, 6],\n      [5, 33],\n      [0, 29],\n      [-2, 31],\n      [-7, 4],\n      [-1, -9],\n      [-7, 20],\n      [0, 16],\n      [-8, 13],\n      [-9, 9],\n      [-5, -18]\n    ],\n    [\n      [7703, 6808],\n      [-7, 9],\n      [-4, -3],\n      [-7, 15],\n      [-7, 1],\n      [5, 6],\n      [-4, 17],\n      [-9, 21],\n      [-12, -9],\n      [-6, 0],\n      [-6, -9],\n      [-9, 4],\n      [-9, 11],\n      [-8, -6],\n      [-3, -16],\n      [-9, -6],\n      [-6, -8],\n      [-7, -1],\n      [-9, -16],\n      [-12, -14],\n      [0, -11],\n      [-9, -9],\n      [-12, -5],\n      [-8, 2]\n    ],\n    [\n      [7468, 6756],\n      [-4, 12],\n      [3, 18],\n      [-1, 10],\n      [-6, 5],\n      [-13, -14]\n    ],\n    [\n      [7447, 6787],\n      [-8, 2],\n      [-4, -5],\n      [-15, 1],\n      [-3, 7],\n      [-14, 9],\n      [-4, -11],\n      [-9, 10],\n      [-3, -11],\n      [-2, 13],\n      [-6, 7],\n      [-16, 3],\n      [2, 17],\n      [-4, 3],\n      [-7, -6],\n      [-9, 11],\n      [-7, 12],\n      [-2, 16],\n      [-5, 5],\n      [-13, -7],\n      [-9, 26],\n      [-9, 2],\n      [-9, 15],\n      [-10, 8],\n      [-1, 15],\n      [-14, 5],\n      [-11, -23],\n      [-7, 11]\n    ],\n    [\n      [7248, 6922],\n      [-11, 15],\n      [-10, 6],\n      [1, 9],\n      [-14, 15],\n      [-4, -3],\n      [-9, 13],\n      [-5, 16],\n      [-9, -8],\n      [-2, 12],\n      [4, 5],\n      [-4, 7],\n      [2, 15],\n      [-9, 14],\n      [-2, 20],\n      [9, 4],\n      [6, -16],\n      [10, 8],\n      [7, 13],\n      [-5, 14],\n      [0, 12],\n      [-7, 3],\n      [-8, 16],\n      [-3, 33],\n      [8, 8],\n      [0, 7],\n      [-10, 12],\n      [-9, 5],\n      [-8, 41],\n      [1, 9],\n      [-7, 0]\n    ],\n    [\n      [7160, 7227],\n      [-18, 1],\n      [-11, 8]\n    ],\n    [\n      [7131, 7236],\n      [-5, 6],\n      [0, 8],\n      [-13, -4],\n      [-4, 10],\n      [1, 27],\n      [-7, 15],\n      [-9, 1],\n      [0, 7],\n      [-8, 7],\n      [-7, -2],\n      [-9, 4]\n    ],\n    [\n      [7080, 7327],\n      [7, 10],\n      [-8, 13],\n      [3, 7],\n      [-5, 17],\n      [-1, 26],\n      [-12, 9],\n      [-6, 0],\n      [-2, -9],\n      [-6, 3],\n      [-4, 16],\n      [4, 9],\n      [-6, 12],\n      [1, 14]\n    ],\n    [\n      [7045, 7454],\n      [8, 8],\n      [-3, 9],\n      [4, 18],\n      [11, 3],\n      [10, 14],\n      [3, 10],\n      [11, -4],\n      [8, 11],\n      [4, -20],\n      [18, 4],\n      [9, 13],\n      [0, 10],\n      [5, 15],\n      [18, -2],\n      [11, 5],\n      [5, -2],\n      [8, 19],\n      [26, 23],\n      [27, 15],\n      [-1, 8]\n    ],\n    [\n      [7227, 7611],\n      [1, 3],\n      [-3, 23],\n      [3, 11],\n      [9, 6],\n      [-7, 5],\n      [13, 6],\n      [-4, 13],\n      [2, 7],\n      [-11, 37],\n      [0, 32],\n      [5, 5],\n      [-18, 8],\n      [7, 9],\n      [21, 5],\n      [23, 13],\n      [3, -9],\n      [13, 3],\n      [7, -7],\n      [4, 17],\n      [-11, 7],\n      [7, 21],\n      [9, 47],\n      [5, 14],\n      [0, 14],\n      [24, -13],\n      [21, 1],\n      [4, -10],\n      [13, 13],\n      [7, 0],\n      [5, 9],\n      [-4, 41],\n      [4, 25],\n      [25, 10],\n      [4, 10],\n      [0, 17],\n      [4, 6],\n      [12, -1]\n    ],\n    [\n      [7424, 8009],\n      [15, 5]\n    ],\n    [\n      [7439, 8014],\n      [-4, -17],\n      [9, -8],\n      [-2, -9],\n      [16, -10],\n      [2, -12],\n      [14, -12],\n      [11, 1],\n      [7, -11],\n      [9, 3],\n      [11, -21],\n      [0, -11],\n      [15, -34],\n      [1, -11],\n      [-5, -14],\n      [3, -17],\n      [-7, -13],\n      [-2, -16],\n      [6, -17],\n      [6, 2],\n      [16, -9],\n      [23, -4],\n      [11, 2],\n      [23, -8],\n      [6, -13],\n      [7, 0],\n      [14, -19],\n      [9, -5],\n      [11, 2],\n      [-2, -16],\n      [6, -3],\n      [9, -41],\n      [12, -19],\n      [2, -11],\n      [23, 4],\n      [63, -13],\n      [14, 6],\n      [49, -12],\n      [7, -15],\n      [29, -11],\n      [18, -15],\n      [23, 7],\n      [0, -12],\n      [13, -5],\n      [6, 10],\n      [44, 30],\n      [36, 10],\n      [20, -3],\n      [20, 4],\n      [25, 19],\n      [15, 29],\n      [18, 12],\n      [10, 13],\n      [-9, 18],\n      [-7, 23],\n      [11, 33],\n      [5, 4],\n      [13, -1],\n      [5, -10],\n      [14, -6],\n      [13, -3],\n      [16, 16],\n      [14, 24],\n      [6, -3],\n      [23, 5],\n      [15, 18],\n      [-1, 7],\n      [11, 24],\n      [6, 3],\n      [15, -1],\n      [1, 13],\n      [9, -4],\n      [16, 12],\n      [12, -3],\n      [3, 5],\n      [14, -8],\n      [11, -1],\n      [5, 6],\n      [-4, 23],\n      [-18, 25],\n      [0, 6],\n      [-10, 7],\n      [-6, 11],\n      [-10, 5],\n      [-12, -3]\n    ],\n    [\n      [8270, 7946],\n      [-7, -13]\n    ],\n    [\n      [8263, 7933],\n      [-5, -6],\n      [-13, 13],\n      [-17, -1],\n      [-11, -9],\n      [-7, 10],\n      [-2, 13],\n      [8, 8],\n      [-1, 12],\n      [25, 79]\n    ],\n    [\n      [8240, 8052],\n      [16, -12],\n      [14, -6],\n      [12, 9],\n      [13, 17],\n      [12, 1],\n      [7, 6],\n      [1, 14],\n      [-4, 6],\n      [8, 27],\n      [7, 10],\n      [1, 11],\n      [8, 23],\n      [16, 14],\n      [3, 17],\n      [-4, 7],\n      [3, 13],\n      [-8, 5],\n      [-12, -1],\n      [22, 37],\n      [12, 1],\n      [26, 11],\n      [19, 0],\n      [11, 6],\n      [28, -11],\n      [4, -9],\n      [20, -1],\n      [17, -13],\n      [23, -49],\n      [-3, -10],\n      [6, -23],\n      [6, -9],\n      [1, -20],\n      [10, -19],\n      [1, -23],\n      [7, -6],\n      [-2, -23],\n      [5, -9],\n      [11, -7],\n      [20, 2],\n      [7, -14],\n      [13, -3],\n      [9, -7],\n      [11, -17],\n      [12, 0],\n      [-4, -13],\n      [6, -8],\n      [2, -13],\n      [-4, -13],\n      [7, -20],\n      [15, 2],\n      [13, -5],\n      [17, 3],\n      [3, 9],\n      [12, 14],\n      [12, -1],\n      [6, 9],\n      [18, 8],\n      [9, -7],\n      [-4, -13],\n      [6, -17],\n      [-8, -19],\n      [-9, -6],\n      [-4, -38],\n      [-5, -13],\n      [2, -9],\n      [-11, -22],\n      [-1, -15],\n      [-8, -8],\n      [-2, -21],\n      [-8, -3]\n    ],\n    [\n      [4913, 5477],\n      [0, -1]\n    ],\n    [\n      [4913, 5476],\n      [0, 1]\n    ],\n    [\n      [4925, 5729],\n      [-2, -26],\n      [3, -1],\n      [4, -47],\n      [-8, -15],\n      [-6, -39],\n      [-7, -28],\n      [2, -31],\n      [2, -4],\n      [4, -31],\n      [5, -1],\n      [2, -13],\n      [-3, -14]\n    ],\n    [\n      [4921, 5479],\n      [-10, 3],\n      [-3, -4],\n      [-15, 4],\n      [-5, 4],\n      [-18, 3],\n      [-3, -9],\n      [16, 7],\n      [6, -3],\n      [-22, -5],\n      [-22, -3],\n      [-38, -25],\n      [-5, -8],\n      [-12, -10]\n    ],\n    [\n      [4790, 5433],\n      [-1, 2],\n      [0, 41],\n      [5, 10],\n      [-1, 33],\n      [-10, 7],\n      [-1, 13],\n      [-6, 7],\n      [-10, 3],\n      [-6, 8],\n      [8, 15],\n      [1, 23],\n      [-5, 23]\n    ],\n    [\n      [4764, 5618],\n      [7, -1],\n      [3, 10],\n      [3, 27],\n      [-7, 4],\n      [2, 14],\n      [7, 0],\n      [5, -7],\n      [2, 15],\n      [-8, 9],\n      [1, 12],\n      [5, 5],\n      [-5, 6],\n      [2, 13],\n      [-5, -2],\n      [-3, 7],\n      [1, 32],\n      [4, 6]\n    ],\n    [\n      [4778, 5768],\n      [4, 2],\n      [5, 14],\n      [5, 1],\n      [3, -12],\n      [9, -6],\n      [2, 12],\n      [7, -1],\n      [1, 18],\n      [8, -5],\n      [-1, 8],\n      [5, 2],\n      [2, -15],\n      [-2, -13],\n      [6, -3],\n      [3, 9],\n      [11, 4]\n    ],\n    [\n      [5402, 5930],\n      [2, -13],\n      [7, -8],\n      [3, -17],\n      [-1, -10],\n      [5, -3],\n      [2, -34],\n      [-2, -3],\n      [-1, -26],\n      [3, -28],\n      [9, -22],\n      [6, -8],\n      [-7, -3],\n      [-9, 3],\n      [-10, -4],\n      [-15, 3],\n      [-7, -19],\n      [11, -27],\n      [17, -29],\n      [3, -1],\n      [8, -30],\n      [2, -17],\n      [4, -2],\n      [-3, -16]\n    ],\n    [\n      [5449, 5312],\n      [-3, -5],\n      [2, -25],\n      [-18, 15],\n      [-7, 3],\n      [-10, -2],\n      [-8, 12],\n      [-9, -3],\n      [-27, 0]\n    ],\n    [\n      [5369, 5307],\n      [-6, 5],\n      [-48, 3],\n      [-1, -7]\n    ],\n    [\n      [5314, 5308],\n      [-38, 0],\n      [-4, 10]\n    ],\n    [\n      [5272, 5318],\n      [0, 12],\n      [4, 27],\n      [-1, 12],\n      [-8, 18],\n      [-2, 13],\n      [6, 11],\n      [-2, 8],\n      [-10, -11],\n      [-10, 10],\n      [-2, 29],\n      [-11, -4],\n      [2, 17]\n    ],\n    [\n      [5238, 5460],\n      [6, 19],\n      [1, 41],\n      [4, 2],\n      [10, 24],\n      [10, 13],\n      [2, 14],\n      [10, 13],\n      [3, -8],\n      [7, 1],\n      [1, 9],\n      [8, -5],\n      [7, -14],\n      [1, -16],\n      [7, 1],\n      [6, 15],\n      [-1, 8],\n      [10, 15],\n      [-2, 17],\n      [5, 9],\n      [0, 9],\n      [5, 14],\n      [1, 25],\n      [16, 23],\n      [2, 34],\n      [9, 9],\n      [2, 17],\n      [-1, 14],\n      [6, 5],\n      [3, 30],\n      [12, 34],\n      [6, -1],\n      [11, 14],\n      [1, 37],\n      [-3, 10],\n      [-10, 4],\n      [-3, 40]\n    ],\n    [\n      [5390, 5936],\n      [7, 0]\n    ],\n    [\n      [5397, 5936],\n      [-1, -11],\n      [6, 5]\n    ],\n    [\n      [5398, 5936],\n      [1, 0]\n    ],\n    [\n      [5399, 5936],\n      [-1, 0]\n    ],\n    [\n      [5944, 7202],\n      [0, 0]\n    ],\n    [\n      [5944, 7202],\n      [-3, 0]\n    ],\n    [\n      [5941, 7202],\n      [0, 0]\n    ],\n    [\n      [5941, 7202],\n      [3, 0]\n    ],\n    [\n      [5905, 7208],\n      [0, 1]\n    ],\n    [\n      [5905, 7209],\n      [1, 0]\n    ],\n    [\n      [5906, 7209],\n      [1, 0]\n    ],\n    [\n      [5907, 7209],\n      [-2, -1]\n    ],\n    [\n      [5935, 7200],\n      [1, -2]\n    ],\n    [\n      [5936, 7198],\n      [-7, -1],\n      [-1, 11],\n      [-17, -6],\n      [-3, 7]\n    ],\n    [\n      [5908, 7209],\n      [0, 0]\n    ],\n    [\n      [5908, 7209],\n      [3, -5],\n      [17, 6],\n      [1, -10],\n      [6, 0]\n    ],\n    [\n      [5807, 5072],\n      [0, -19],\n      [-2, 6],\n      [2, 13]\n    ],\n    [\n      [5762, 5475],\n      [2, -10],\n      [7, -8],\n      [0, -10],\n      [16, -18],\n      [12, 12],\n      [6, 1],\n      [5, -9],\n      [7, 12],\n      [0, 6],\n      [10, -5],\n      [0, -12],\n      [4, -3],\n      [7, -21],\n      [10, -6],\n      [0, -14],\n      [6, 4],\n      [2, -10]\n    ],\n    [\n      [5856, 5384],\n      [2, -7],\n      [-5, -19],\n      [3, -15],\n      [-4, -19],\n      [8, -3],\n      [8, -13]\n    ],\n    [\n      [5868, 5308],\n      [-10, -15],\n      [-12, -24],\n      [0, -15]\n    ],\n    [\n      [5846, 5254],\n      [-7, -6],\n      [-2, -13],\n      [-6, -5],\n      [0, -21],\n      [-3, -7],\n      [-4, -25]\n    ],\n    [\n      [5824, 5177],\n      [-7, -9],\n      [-3, -12],\n      [1, -13],\n      [8, 12]\n    ],\n    [\n      [5823, 5155],\n      [-1, -6],\n      [-1, -46]\n    ],\n    [\n      [5821, 5103],\n      [-7, -8],\n      [-3, -9]\n    ],\n    [\n      [5811, 5086],\n      [-3, 1],\n      [-7, -28],\n      [3, -9],\n      [-3, -10]\n    ],\n    [\n      [5801, 5040],\n      [4, -14]\n    ],\n    [\n      [5811, 4991],\n      [-2, -3],\n      [-1, -49],\n      [4, 11],\n      [-1, -27],\n      [-3, -5],\n      [0, -30],\n      [7, -28],\n      [-1, -13],\n      [-4, -5],\n      [10, -49],\n      [6, -14],\n      [6, -6],\n      [6, -13],\n      [2, -29],\n      [7, -10],\n      [2, -12]\n    ],\n    [\n      [5849, 4709],\n      [-28, -8],\n      [-19, -7]\n    ],\n    [\n      [5802, 4694],\n      [-16, -35],\n      [0, -23],\n      [4, -2],\n      [2, 9]\n    ],\n    [\n      [5792, 4643],\n      [4, -21],\n      [-1, -21],\n      [1, -34],\n      [-5, -16],\n      [0, -10],\n      [-4, -17],\n      [4, -25],\n      [9, -11],\n      [6, -17],\n      [14, -4],\n      [-2, 11],\n      [9, 5],\n      [0, -75],\n      [-5, 1],\n      [-1, 12],\n      [-10, -10],\n      [-7, 1],\n      [-2, 14],\n      [-6, 17],\n      [-4, -2],\n      [-1, 13],\n      [-5, 13],\n      [-16, 7],\n      [-6, 6],\n      [-3, 16],\n      [-5, 7],\n      [-1, 12],\n      [-5, 0],\n      [-1, -16],\n      [-7, -8],\n      [-10, 6],\n      [-11, 0],\n      [-4, 7],\n      [-14, 8],\n      [0, 26],\n      [-17, -7],\n      [-8, -8],\n      [-4, 5],\n      [3, 14],\n      [-8, 6],\n      [-4, 9]\n    ],\n    [\n      [5366, 4846],\n      [-9, 2],\n      [-4, -10],\n      [-7, -3],\n      [-7, 16]\n    ],\n    [\n      [5363, 4916],\n      [8, -9],\n      [0, -6],\n      [8, 11],\n      [1, 14],\n      [7, -2],\n      [12, 12],\n      [2, -8],\n      [-3, -7],\n      [1, -20],\n      [9, 0],\n      [4, 6],\n      [10, 27],\n      [8, 8],\n      [1, 8],\n      [9, 4],\n      [10, 35],\n      [-1, 29],\n      [1, 13],\n      [-1, 26],\n      [12, 25],\n      [0, 7],\n      [11, 30],\n      [8, 5],\n      [12, 27],\n      [0, 21],\n      [3, 25],\n      [3, 7],\n      [-2, 14],\n      [1, 28],\n      [5, 27],\n      [-1, 34],\n      [16, 57],\n      [0, 19]\n    ],\n    [\n      [5333, 4894],\n      [-5, 13],\n      [0, 10],\n      [-15, 33],\n      [-5, 6]\n    ],\n    [\n      [5308, 4956],\n      [2, 12],\n      [8, 13],\n      [5, -10],\n      [5, -2],\n      [4, 22],\n      [-8, 9],\n      [3, 10],\n      [-7, 12],\n      [2, 7],\n      [-1, 20],\n      [4, -5],\n      [6, 5],\n      [4, -5],\n      [11, 5],\n      [-1, 24],\n      [5, 5],\n      [5, -5],\n      [5, -26],\n      [11, -4],\n      [9, 13],\n      [1, 6],\n      [9, -22],\n      [5, 9],\n      [0, 20],\n      [5, 5],\n      [1, 41],\n      [-2, 10],\n      [3, 23],\n      [-9, 9],\n      [-3, 11],\n      [-5, 0],\n      [0, 27],\n      [5, 19],\n      [5, 0],\n      [6, 16],\n      [-5, 18],\n      [0, 11],\n      [-14, 6],\n      [-7, -9],\n      [-7, -3],\n      [-4, 22],\n      [2, 23],\n      [3, 9]\n    ],\n    [\n      [3018, 5865],\n      [-19, -13],\n      [-7, -27],\n      [-6, -1],\n      [-7, -26],\n      [-5, -13],\n      [-2, -37],\n      [-11, -37],\n      [11, 7],\n      [1, -11],\n      [4, 2],\n      [4, -28],\n      [8, -16],\n      [1, -19],\n      [-4, -7],\n      [1, -28],\n      [7, -3],\n      [3, -18],\n      [7, -5],\n      [5, 4],\n      [18, -4],\n      [9, 7],\n      [10, -10],\n      [7, -1],\n      [18, -46],\n      [5, -2],\n      [7, 8],\n      [11, -5],\n      [29, 8],\n      [4, -18],\n      [-6, -10],\n      [0, -17],\n      [-5, -6],\n      [0, -66],\n      [5, -28],\n      [4, -2],\n      [5, -17],\n      [-15, -35],\n      [7, -6],\n      [11, -18],\n      [0, -12],\n      [4, -17],\n      [5, -39]\n    ],\n    [\n      [3056, 4939],\n      [-8, 22],\n      [-6, -2],\n      [-7, 6],\n      [18, 59],\n      [0, 7],\n      [-26, 25],\n      [-10, -10],\n      [-2, 7],\n      [-8, 7],\n      [-6, -11],\n      [-10, -7],\n      [-8, 6],\n      [-9, -5],\n      [-7, 8],\n      [2, 12],\n      [-2, 17],\n      [-10, 6],\n      [1, 12],\n      [-4, 13],\n      [-7, 3],\n      [-5, 10],\n      [-5, 2],\n      [-4, 26],\n      [-6, 11],\n      [-5, 2],\n      [-8, 14],\n      [-5, -2]\n    ],\n    [\n      [2909, 5177],\n      [-11, 11],\n      [-3, -1],\n      [-7, 15],\n      [-8, 7],\n      [-3, -12],\n      [-9, -1],\n      [-19, 10],\n      [-1, 14],\n      [-7, 11],\n      [-11, 5],\n      [-13, 16],\n      [-7, 13]\n    ],\n    [\n      [2810, 5265],\n      [-5, 10],\n      [5, 13],\n      [7, -2],\n      [-3, 14],\n      [0, 13],\n      [7, 19],\n      [10, -5],\n      [0, 9],\n      [9, -4],\n      [1, 22],\n      [12, 29],\n      [0, 6],\n      [7, 20],\n      [-6, -5],\n      [-4, 5],\n      [-1, 15],\n      [3, 16],\n      [-2, 57],\n      [-5, 2],\n      [9, 12],\n      [0, 7],\n      [-7, 20],\n      [3, 5],\n      [1, 19],\n      [-5, 6],\n      [-3, 17],\n      [-7, 14]\n    ],\n    [\n      [2836, 5599],\n      [2, 14],\n      [13, 12],\n      [1, 13],\n      [4, 2],\n      [-6, 28],\n      [-3, 3],\n      [3, 11]\n    ],\n    [\n      [2850, 5682],\n      [12, -31],\n      [1, -12],\n      [5, 0],\n      [-1, 29],\n      [-4, 10],\n      [7, 5],\n      [10, 15],\n      [6, 23],\n      [12, 4],\n      [2, 15],\n      [-3, 1],\n      [3, 13],\n      [-1, 20],\n      [3, 2],\n      [0, 16],\n      [8, 14],\n      [11, 14],\n      [9, -5],\n      [-3, -8],\n      [7, -4],\n      [4, 18],\n      [1, 14],\n      [10, -3],\n      [15, 1],\n      [6, 12],\n      [10, 13],\n      [13, 10],\n      [3, 11],\n      [-1, 9],\n      [6, 1],\n      [12, 10],\n      [8, -6],\n      [3, -18],\n      [-6, -10]\n    ],\n    [\n      [6235, 4487],\n      [1, -17],\n      [-4, 8],\n      [3, 9]\n    ],\n    [\n      [6207, 4496],\n      [-7, 9],\n      [1, 21],\n      [4, 1],\n      [-1, -12],\n      [3, -19]\n    ],\n    [\n      [4324, 6037],\n      [-5, 9],\n      [5, 2],\n      [0, -11]\n    ],\n    [\n      [4340, 6065],\n      [8, -16],\n      [-5, -7],\n      [-4, 7],\n      [1, 16]\n    ],\n    [\n      [4365, 6116],\n      [5, -8],\n      [-8, -3],\n      [3, 11]\n    ],\n    [\n      [4303, 6173],\n      [3, -6],\n      [-7, -10],\n      [-3, 11],\n      [7, 5]\n    ],\n    [\n      [2676, 5812],\n      [7, -32],\n      [16, -36],\n      [7, -10]\n    ],\n    [\n      [2706, 5734],\n      [-3, -5],\n      [-5, 7],\n      [-2, -8],\n      [0, -23],\n      [6, -10],\n      [-5, -4],\n      [2, -19],\n      [-6, -11],\n      [4, -16]\n    ],\n    [\n      [2697, 5645],\n      [-2, 11],\n      [-5, 9],\n      [0, 15],\n      [-9, 5],\n      [5, -10],\n      [0, -10],\n      [-12, 12],\n      [3, 27],\n      [-8, 14],\n      [-10, 11],\n      [-11, 8],\n      [1, 10],\n      [-12, 21],\n      [-4, -7],\n      [9, -12],\n      [-6, -16],\n      [-6, 15],\n      [-10, 5],\n      [-5, 19],\n      [1, 16],\n      [3, 2],\n      [1, 15],\n      [-8, 5],\n      [7, 2],\n      [0, 9]\n    ],\n    [\n      [2619, 5821],\n      [2, 7],\n      [21, -15],\n      [5, 7],\n      [13, -10],\n      [0, -5],\n      [8, -5],\n      [8, 5],\n      [0, 7]\n    ],\n    [\n      [2698, 6446],\n      [5, -3],\n      [4, -17],\n      [-10, -9],\n      [-8, 8],\n      [7, 1],\n      [-4, 15],\n      [6, 5]\n    ],\n    [\n      [2836, 6454],\n      [6, -1],\n      [-1, -7],\n      [-5, 8]\n    ],\n    [\n      [2823, 6481],\n      [-2, -7],\n      [-7, 5],\n      [9, 2]\n    ],\n    [\n      [2914, 6329],\n      [-1, 4]\n    ],\n    [\n      [2913, 6333],\n      [-1, 0]\n    ],\n    [\n      [2912, 6333],\n      [-2, -4]\n    ],\n    [\n      [2910, 6329],\n      [-10, -1],\n      [-15, 6],\n      [-21, -3],\n      [-2, -3],\n      [-21, -3],\n      [6, 17],\n      [9, 10],\n      [3, 9],\n      [-8, 15],\n      [-19, -1],\n      [-13, 20],\n      [-1, 18],\n      [-6, 16],\n      [-14, -5],\n      [-10, 8],\n      [-8, 0],\n      [-10, 11],\n      [-5, 10],\n      [-13, -1],\n      [-13, 8],\n      [-13, 4],\n      [-7, 11],\n      [12, 1],\n      [1, 7],\n      [-7, 6],\n      [-25, 1],\n      [-10, -21],\n      [-7, -9],\n      [-15, 0],\n      [-2, -15],\n      [-3, 2],\n      [-11, -11],\n      [1, 10],\n      [-11, -3],\n      [10, 9],\n      [5, 0],\n      [-2, 15],\n      [3, 11],\n      [12, 15],\n      [14, 8],\n      [3, 6],\n      [19, 3],\n      [9, 8],\n      [27, -2],\n      [3, -6],\n      [15, 2],\n      [6, -8],\n      [10, 1],\n      [11, -12],\n      [9, -20],\n      [15, -1],\n      [13, -13],\n      [5, -1],\n      [7, -16],\n      [12, -5],\n      [-3, 9],\n      [12, -16],\n      [5, -11],\n      [23, -17],\n      [0, -5],\n      [12, 2],\n      [3, -6],\n      [-5, -10],\n      [2, -9],\n      [20, 1],\n      [7, -5],\n      [9, -19],\n      [5, 2],\n      [2, -9],\n      [-3, -6],\n      [-13, 0],\n      [-10, -9]\n    ],\n    [\n      [3089, 5876],\n      [-11, 16],\n      [3, 2],\n      [8, -18]\n    ],\n    [\n      [5905, 7209],\n      [1, 0]\n    ],\n    [\n      [5941, 7202],\n      [-6, -2]\n    ],\n    [\n      [5908, 7209],\n      [6, 1],\n      [0, 11],\n      [14, -4],\n      [17, 8],\n      [15, 13],\n      [0, -3],\n      [-19, -22],\n      [3, -11]\n    ],\n    [\n      [5938, 7197],\n      [0, 0]\n    ],\n    [\n      [5938, 7197],\n      [0, 0]\n    ],\n    [\n      [5937, 7198],\n      [0, 0]\n    ],\n    [\n      [5944, 7202],\n      [-3, -6]\n    ],\n    [\n      [5941, 7196],\n      [0, 6]\n    ],\n    [\n      [5936, 7198],\n      [0, -1]\n    ],\n    [\n      [5936, 7197],\n      [-3, -9],\n      [-16, -11]\n    ],\n    [\n      [5917, 7177],\n      [-8, 1]\n    ],\n    [\n      [5909, 7178],\n      [-7, 3],\n      [-5, 11],\n      [1, 9],\n      [7, 7]\n    ],\n    [\n      [5907, 7209],\n      [1, 0]\n    ],\n    [\n      [5411, 8112],\n      [4, 8],\n      [9, -9],\n      [14, -7],\n      [6, -6],\n      [12, -3],\n      [-7, -8],\n      [13, -20],\n      [10, 7],\n      [-4, 12],\n      [9, -2],\n      [19, -24],\n      [4, 4],\n      [7, -7],\n      [8, 0],\n      [8, -23]\n    ],\n    [\n      [5523, 8034],\n      [-8, -1],\n      [-12, -15],\n      [-1, -11],\n      [-15, -14],\n      [-9, 4],\n      [-8, -15]\n    ],\n    [\n      [5383, 7990],\n      [-10, 11],\n      [-13, 20],\n      [-10, 9],\n      [-7, 17],\n      [3, 13],\n      [-5, 11],\n      [6, 13],\n      [26, 11],\n      [3, 8],\n      [9, 1],\n      [13, 9],\n      [-2, 8],\n      [15, -9]\n    ],\n    [\n      [5255, 7927],\n      [0, 0]\n    ],\n    [\n      [5394, 8289],\n      [0, -4]\n    ],\n    [\n      [5394, 8285],\n      [0, 4]\n    ],\n    [\n      [5371, 8330],\n      [6, -3],\n      [4, -14],\n      [-11, -5],\n      [-6, 4],\n      [1, 12],\n      [6, 6]\n    ],\n    [\n      [5262, 8339],\n      [4, 3],\n      [12, -11],\n      [5, -15],\n      [13, -5],\n      [11, 2],\n      [1, -9],\n      [-10, -8],\n      [12, -2],\n      [8, -7],\n      [5, 14],\n      [11, 2],\n      [14, 11],\n      [13, 4],\n      [3, -10],\n      [10, -8],\n      [6, 2],\n      [3, -17],\n      [13, -10]\n    ],\n    [\n      [5396, 8275],\n      [3, -23],\n      [-5, -27],\n      [12, -14],\n      [-3, -9],\n      [7, -21],\n      [-4, -20],\n      [2, -11],\n      [7, -4],\n      [2, -14],\n      [-6, -20]\n    ],\n    [\n      [5269, 7921],\n      [-15, 12],\n      [1, -6]\n    ],\n    [\n      [5210, 7923],\n      [-2, 4],\n      [8, 55],\n      [9, 11],\n      [2, 10],\n      [-16, 4],\n      [-4, 7],\n      [-18, -1],\n      [-13, 17]\n    ],\n    [\n      [5176, 8030],\n      [4, 20],\n      [-6, 3],\n      [-5, 16]\n    ],\n    [\n      [5166, 8104],\n      [-3, 14],\n      [9, 22],\n      [0, 9],\n      [-8, 12],\n      [5, 10],\n      [8, -4],\n      [10, 5],\n      [8, 28],\n      [-10, 5],\n      [2, 9],\n      [8, 1],\n      [4, 18],\n      [0, 16]\n    ],\n    [\n      [5199, 8249],\n      [-3, 19],\n      [6, 6],\n      [21, 2],\n      [6, -18],\n      [0, 12],\n      [8, -4],\n      [2, 20],\n      [9, 1],\n      [-8, 29],\n      [10, 6],\n      [-9, 13],\n      [-1, 9]\n    ],\n    [\n      [5240, 8344],\n      [22, -5]\n    ],\n    [\n      [6201, 5844],\n      [-9, -28]\n    ],\n    [\n      [6192, 5816],\n      [-6, 4],\n      [-22, -7],\n      [-4, 8]\n    ],\n    [\n      [6160, 5821],\n      [0, 12]\n    ],\n    [\n      [6160, 5833],\n      [0, 24],\n      [10, 22],\n      [7, 22]\n    ],\n    [\n      [6177, 5901],\n      [8, -6],\n      [3, 9],\n      [9, 11]\n    ],\n    [\n      [6197, 5915],\n      [6, -14],\n      [2, -25],\n      [-10, -14],\n      [-7, -3],\n      [-3, -11],\n      [13, 3],\n      [3, -7]\n    ],\n    [\n      [3294, 6081],\n      [4, -5],\n      [0, -15],\n      [-3, -3],\n      [-3, 16],\n      [2, 7]\n    ],\n    [\n      [5312, 8347],\n      [17, -10],\n      [-1, -7],\n      [-10, -1],\n      [-8, 6],\n      [2, 12]\n    ],\n    [\n      [5348, 8350],\n      [-12, -5],\n      [4, 7],\n      [8, -2]\n    ],\n    [\n      [5272, 8355],\n      [7, -12],\n      [-8, 2],\n      [1, 10]\n    ],\n    [\n      [5413, 8363],\n      [6, -13],\n      [-9, 3],\n      [3, 10]\n    ],\n    [\n      [5287, 8385],\n      [7, 0],\n      [6, -15],\n      [-2, -16],\n      [-19, 1],\n      [-11, 24],\n      [19, 6]\n    ],\n    [\n      [5342, 8415],\n      [7, -3],\n      [0, -22],\n      [-11, -12],\n      [8, -11],\n      [-13, -8],\n      [5, -3],\n      [-8, -10],\n      [8, -5],\n      [-9, -11],\n      [-4, 32],\n      [-13, 0],\n      [-2, 28],\n      [13, 12],\n      [5, -13],\n      [14, 26]\n    ],\n    [\n      [5247, 8463],\n      [-2, -13],\n      [-9, 0],\n      [11, 13]\n    ],\n    [\n      [5240, 8344],\n      [-2, 32],\n      [-14, 7],\n      [3, 14],\n      [6, 5],\n      [-4, 11],\n      [-4, -6],\n      [0, 34],\n      [16, 1],\n      [7, 12],\n      [9, -10],\n      [-3, 15],\n      [18, 12],\n      [-32, -9],\n      [-5, -13],\n      [-7, 3],\n      [11, 20],\n      [17, 1],\n      [9, 6],\n      [10, 19],\n      [20, 10],\n      [-6, -10],\n      [3, -20],\n      [-7, -15],\n      [2, -23],\n      [12, -1],\n      [5, -6],\n      [-6, -16],\n      [-11, 2],\n      [-4, -20],\n      [-20, -21],\n      [6, -16],\n      [-7, -5],\n      [8, -8],\n      [-8, -10]\n    ],\n    [\n      [3006, 6222],\n      [2, 16],\n      [-6, 10]\n    ],\n    [\n      [3002, 6248],\n      [0, 0]\n    ],\n    [\n      [3002, 6248],\n      [-1, 2]\n    ],\n    [\n      [3001, 6250],\n      [-1, 4]\n    ],\n    [\n      [3000, 6254],\n      [8, 11],\n      [-2, 9],\n      [4, 12],\n      [-4, 32]\n    ],\n    [\n      [3006, 6318],\n      [3, 11],\n      [14, -4],\n      [4, 6],\n      [11, -10],\n      [5, 1],\n      [4, -8],\n      [11, 0],\n      [4, -20],\n      [6, 2],\n      [11, -3],\n      [-2, -5],\n      [-11, 2],\n      [0, -8],\n      [24, -7],\n      [12, -20],\n      [-9, -23],\n      [-8, 11],\n      [-17, 0],\n      [-9, 4],\n      [-8, -14],\n      [-9, -2],\n      [-3, 12],\n      [-9, -8],\n      [-5, 2],\n      [1, -9],\n      [-10, -31],\n      [-6, 8],\n      [-4, 17]\n    ],\n    [\n      [5238, 7310],\n      [2, -6],\n      [-7, -4],\n      [1, -6],\n      [-8, -8],\n      [6, -5],\n      [-4, -35],\n      [3, -10],\n      [-1, -19],\n      [4, -5],\n      [-4, -8],\n      [-3, -30],\n      [-11, -11],\n      [-1, -9],\n      [-7, -8],\n      [-1, -14],\n      [7, -25],\n      [0, -11],\n      [10, -7],\n      [6, -15],\n      [2, -20],\n      [19, -24],\n      [7, -62],\n      [6, -44]\n    ],\n    [\n      [5264, 6924],\n      [-7, -7],\n      [11, -29],\n      [5, -37],\n      [-2, -44],\n      [4, -19],\n      [-5, -34],\n      [2, -21],\n      [3, -4],\n      [-2, -20],\n      [-10, -9],\n      [-3, -10],\n      [18, -52],\n      [0, -25],\n      [5, -5],\n      [1, -10],\n      [6, -6],\n      [7, 5],\n      [21, -13],\n      [3, -4],\n      [11, -43]\n    ],\n    [\n      [5332, 6537],\n      [-28, -35],\n      [-99, -122],\n      [-24, -40],\n      [-17, -32],\n      [-8, -8],\n      [-39, -15]\n    ],\n    [\n      [5117, 6285],\n      [-26, -9],\n      [-5, 7],\n      [4, 15],\n      [-2, 11],\n      [1, 14],\n      [-8, 8],\n      [-12, 4],\n      [-9, 16],\n      [-2, -4],\n      [-9, 5],\n      [-4, 14],\n      [-14, 12],\n      [1, 19],\n      [-14, 18],\n      [-28, 40],\n      [-8, 9],\n      [-36, 49],\n      [-21, 30],\n      [-8, 9],\n      [-51, 70]\n    ],\n    [\n      [4866, 6622],\n      [-64, 78],\n      [-16, 21],\n      [-28, 33]\n    ],\n    [\n      [4758, 6754],\n      [0, 22]\n    ],\n    [\n      [4758, 6776],\n      [0, 59],\n      [12, 18],\n      [18, 22],\n      [7, 0],\n      [8, 8],\n      [10, 0],\n      [27, 5],\n      [6, -5],\n      [7, 21],\n      [11, 17],\n      [11, 11],\n      [6, 11],\n      [17, 8],\n      [3, 14],\n      [-8, 21],\n      [4, 4],\n      [1, 15],\n      [23, 9],\n      [-3, 14],\n      [12, 5],\n      [35, -3],\n      [0, 17],\n      [6, 7],\n      [-11, 14],\n      [-4, 11],\n      [2, 8],\n      [-5, 10],\n      [2, 18],\n      [-4, 8],\n      [2, 24],\n      [-4, 15],\n      [3, 6],\n      [-4, 7],\n      [2, 9],\n      [-12, 19]\n    ],\n    [\n      [4938, 7203],\n      [8, 0],\n      [18, 16],\n      [2, 12],\n      [11, 12],\n      [8, 0],\n      [1, 7],\n      [6, -5],\n      [8, 2],\n      [5, 15],\n      [24, 22],\n      [25, 4],\n      [10, 4],\n      [8, -2],\n      [11, 13],\n      [3, -4],\n      [12, 2],\n      [9, 8],\n      [21, -1],\n      [13, -7],\n      [8, -8],\n      [10, 11],\n      [14, 5],\n      [6, 10],\n      [12, -12],\n      [8, 2],\n      [0, 9],\n      [9, -1],\n      [7, -10],\n      [13, 4],\n      [10, -1]\n    ],\n    [\n      [2774, 5010],\n      [-4, -1],\n      [0, 11],\n      [5, 9],\n      [5, -3],\n      [-6, -16]\n    ],\n    [\n      [2519, 5143],\n      [-4, -14],\n      [-5, 0],\n      [9, 14]\n    ],\n    [\n      [2493, 5154],\n      [0, -14],\n      [-8, 2],\n      [1, 11],\n      [7, 1]\n    ],\n    [\n      [2459, 5168],\n      [2, -12],\n      [-7, 2],\n      [-1, 8],\n      [6, 2]\n    ],\n    [\n      [2478, 5174],\n      [6, -6],\n      [-5, -6],\n      [-4, 5],\n      [3, 7]\n    ],\n    [\n      [2463, 5192],\n      [4, -22],\n      [6, -11],\n      [-1, -9],\n      [6, -10],\n      [-4, -13],\n      [-13, -3],\n      [-3, 10],\n      [12, 14],\n      [-9, 21],\n      [-3, 18],\n      [5, 5]\n    ],\n    [\n      [2909, 5177],\n      [-10, 0],\n      [6, -20],\n      [4, -4],\n      [-1, -13],\n      [2, -13],\n      [-5, 0],\n      [-4, -27],\n      [-15, -40],\n      [-16, -25],\n      [-33, -24],\n      [-9, -21],\n      [1, -7],\n      [-6, 5],\n      [-1, -22],\n      [-8, -31],\n      [-1, -17],\n      [-4, -3],\n      [-1, -12],\n      [-4, -7],\n      [-8, 2],\n      [-5, 16],\n      [0, 9],\n      [-8, 2],\n      [-9, 11],\n      [-8, -11],\n      [-2, 5],\n      [4, 10],\n      [-5, 9],\n      [10, 10],\n      [-2, 22],\n      [-3, 6]\n    ],\n    [\n      [2768, 4987],\n      [11, 12],\n      [6, 40],\n      [-3, 5],\n      [-4, -11],\n      [-1, 15],\n      [-7, -22],\n      [-11, 18],\n      [-7, 5],\n      [5, 13],\n      [-1, 22],\n      [-2, 5],\n      [2, 15],\n      [-4, 19],\n      [10, 7],\n      [3, 21],\n      [-1, 11],\n      [12, 24],\n      [1, 31],\n      [-2, 13],\n      [12, 11],\n      [19, 9],\n      [4, 15]\n    ],\n    [\n      [5949, 6986],\n      [2, -6]\n    ],\n    [\n      [5951, 6980],\n      [17, -99]\n    ],\n    [\n      [5968, 6881],\n      [-4, -12],\n      [-3, -33],\n      [-5, -16],\n      [0, -26],\n      [-5, -14],\n      [-13, 15],\n      [-6, 17],\n      [-10, 16],\n      [-1, 26],\n      [-8, 12],\n      [-5, 14],\n      [-2, 23],\n      [-4, -1],\n      [-4, -16],\n      [6, -10],\n      [3, -16],\n      [0, -14],\n      [4, -6],\n      [14, -42],\n      [5, -5],\n      [5, -36],\n      [4, -4],\n      [5, -25],\n      [0, -11],\n      [11, -43],\n      [15, -51],\n      [8, -35],\n      [15, -29],\n      [-8, 3],\n      [2, -41],\n      [3, -16],\n      [6, -13],\n      [10, -6],\n      [2, -8],\n      [16, -29]\n    ],\n    [\n      [6024, 6449],\n      [-78, 0],\n      [-73, 0],\n      [0, 14],\n      [-6, -14],\n      [-57, 0],\n      [-71, 0],\n      [-46, 0]\n    ],\n    [\n      [5693, 6449],\n      [0, 421],\n      [-3, 10],\n      [-1, 24],\n      [-4, 13],\n      [6, 20],\n      [3, 17],\n      [-4, 22],\n      [0, 14],\n      [8, 16]\n    ],\n    [\n      [5698, 7006],\n      [1, -7],\n      [7, -2],\n      [12, 7],\n      [14, -6],\n      [27, -8],\n      [1, -7],\n      [8, -5],\n      [5, 4],\n      [4, -9],\n      [21, -6],\n      [8, -9],\n      [13, 7],\n      [16, 22],\n      [4, -4],\n      [4, 14],\n      [3, -3],\n      [11, 6],\n      [-9, -10],\n      [9, 2],\n      [7, 11],\n      [13, -9],\n      [8, 5],\n      [-3, -15],\n      [7, -4],\n      [1, -7],\n      [6, 2],\n      [0, 9],\n      [6, -10],\n      [7, -4],\n      [31, 7],\n      [9, 9]\n    ],\n    [\n      [6111, 6097],\n      [3, -11],\n      [8, -6],\n      [-12, 2],\n      [-2, 8],\n      [3, 7]\n    ],\n    [\n      [6177, 5901],\n      [-6, 15],\n      [-8, 12],\n      [-5, 18],\n      [-14, 19],\n      [-7, 23],\n      [-5, 10],\n      [-10, 7],\n      [-5, 9],\n      [-9, -1],\n      [-10, 9],\n      [-10, -6],\n      [-5, 10],\n      [-3, -8],\n      [-13, -5],\n      [-6, 16],\n      [-3, -1],\n      [-6, 12],\n      [-9, -45],\n      [-6, 19],\n      [-5, 1],\n      [-2, -8],\n      [-10, 1],\n      [-6, -4]\n    ],\n    [\n      [6014, 6004],\n      [-3, 51],\n      [6, 17],\n      [1, 18],\n      [3, 5],\n      [5, 24],\n      [-2, 23],\n      [3, 6],\n      [-1, 17],\n      [12, -2],\n      [3, 17],\n      [21, 13],\n      [5, 18],\n      [5, 9]\n    ],\n    [\n      [6072, 6220],\n      [9, -35],\n      [0, -9],\n      [6, -31],\n      [1, -24],\n      [3, -23],\n      [4, -4],\n      [0, -17],\n      [5, -2],\n      [2, -22],\n      [4, -1],\n      [-2, 18],\n      [3, 4],\n      [6, -7],\n      [0, -17],\n      [6, -8],\n      [3, 5],\n      [6, -3],\n      [3, -12],\n      [12, -6],\n      [12, -31],\n      [2, -9],\n      [9, -6],\n      [3, -12],\n      [3, 1],\n      [4, -13],\n      [1, -13],\n      [4, 2],\n      [6, -13],\n      [0, -8],\n      [10, -9]\n    ],\n    [\n      [5941, 7196],\n      [-3, 1]\n    ],\n    [\n      [5938, 7197],\n      [-2, 0]\n    ],\n    [\n      [4503, 6784],\n      [-3, -9],\n      [-5, 3],\n      [8, 6]\n    ],\n    [\n      [4571, 6803],\n      [1, -17],\n      [-5, -6],\n      [-6, 6],\n      [2, 19],\n      [8, -2]\n    ],\n    [\n      [4552, 6828],\n      [-7, -11],\n      [-2, -14],\n      [-7, -8],\n      [-6, 21],\n      [12, 4],\n      [4, 8],\n      [6, 0]\n    ],\n    [\n      [4604, 6803],\n      [7, 35],\n      [5, -4],\n      [-4, -26],\n      [-8, -5]\n    ],\n    [\n      [4503, 6844],\n      [4, -7],\n      [-3, -16],\n      [-4, 14],\n      [3, 9]\n    ],\n    [\n      [4626, 6861],\n      [0, -6],\n      [-9, -10],\n      [-1, 11],\n      [10, 5]\n    ],\n    [\n      [4919, 7214],\n      [-1, 3]\n    ],\n    [\n      [4918, 7217],\n      [1, -3]\n    ],\n    [\n      [4851, 7247],\n      [-1, 5]\n    ],\n    [\n      [4850, 7252],\n      [1, -5]\n    ],\n    [\n      [5043, 7435],\n      [2, -6],\n      [-6, -9],\n      [-6, 2],\n      [10, 13]\n    ],\n    [\n      [5088, 7483],\n      [0, -11],\n      [8, 0],\n      [-7, -23],\n      [-4, -6],\n      [-8, 7],\n      [-3, 10],\n      [-9, 0],\n      [9, 14],\n      [14, 9]\n    ],\n    [\n      [5114, 7490],\n      [6, -11],\n      [-3, -3],\n      [-12, 12],\n      [9, 2]\n    ],\n    [\n      [5055, 7627],\n      [0, 0]\n    ],\n    [\n      [4950, 7681],\n      [11, -8],\n      [1, -9],\n      [16, -8],\n      [6, -11],\n      [6, 3],\n      [8, -7],\n      [20, 0],\n      [0, 9],\n      [18, -7],\n      [3, -7]\n    ],\n    [\n      [5047, 7630],\n      [8, -9],\n      [8, 4],\n      [6, -5],\n      [12, 8],\n      [7, -3]\n    ],\n    [\n      [5088, 7625],\n      [4, -5],\n      [-6, -6],\n      [3, -18],\n      [-4, -6],\n      [-23, -20],\n      [-3, -10],\n      [-17, -6],\n      [-15, -8],\n      [-8, -13],\n      [5, -6],\n      [-8, -7],\n      [-7, -18],\n      [-8, -14],\n      [-11, -32],\n      [3, -21],\n      [6, -15],\n      [7, -7],\n      [-21, -22],\n      [-9, -36],\n      [4, -6],\n      [-19, -4],\n      [-12, -20],\n      [-2, -15],\n      [-7, -12],\n      [-5, 6],\n      [-7, -1],\n      [-3, -8],\n      [-6, 4],\n      [-42, -1],\n      [-7, -13],\n      [-15, -5],\n      [-4, -16]\n    ],\n    [\n      [4851, 7264],\n      [0, 0]\n    ],\n    [\n      [4851, 7264],\n      [-6, -7],\n      [-14, 11],\n      [-9, 24],\n      [-2, 18],\n      [-12, 13],\n      [-14, 2]\n    ],\n    [\n      [4794, 7325],\n      [-3, 18],\n      [7, 27],\n      [6, 2],\n      [3, 10],\n      [-5, 0],\n      [-6, 14],\n      [1, 17],\n      [6, 6],\n      [3, 12],\n      [-5, 3],\n      [-5, 22],\n      [-6, 12],\n      [14, 0],\n      [4, 14],\n      [-4, 17],\n      [7, 8],\n      [-1, 30],\n      [-3, 6],\n      [8, 16],\n      [6, 4],\n      [6, 14],\n      [-10, 6],\n      [0, 16],\n      [-16, 2],\n      [-2, -7],\n      [-11, -3],\n      [-3, 3],\n      [-13, -3],\n      [3, 13],\n      [-4, 6],\n      [-15, -10]\n    ],\n    [\n      [4756, 7600],\n      [-4, 7],\n      [8, 12],\n      [-7, 6],\n      [1, 13],\n      [-6, -4],\n      [1, 10],\n      [-7, 18],\n      [12, 17],\n      [5, -3],\n      [11, 5],\n      [-2, 4],\n      [13, 17],\n      [6, 2],\n      [13, -13],\n      [36, 2],\n      [14, -2],\n      [17, -9],\n      [16, 0],\n      [17, 6],\n      [3, -6],\n      [11, -2],\n      [10, 4],\n      [16, -8],\n      [10, 5]\n    ],\n    [\n      [5628, 8557],\n      [8, 2],\n      [12, -10],\n      [-17, -13],\n      [-15, -4],\n      [-10, 7],\n      [0, 13],\n      [22, 5]\n    ],\n    [\n      [5631, 8581],\n      [8, -10],\n      [-15, -8],\n      [-3, 11],\n      [-9, 4],\n      [19, 3]\n    ],\n    [\n      [5778, 8608],\n      [4, -7]\n    ],\n    [\n      [5782, 8601],\n      [-5, -1]\n    ],\n    [\n      [5777, 8600],\n      [3, -1]\n    ],\n    [\n      [5780, 8599],\n      [-7, -9]\n    ],\n    [\n      [5773, 8590],\n      [-4, -10]\n    ],\n    [\n      [5769, 8580],\n      [-12, 1],\n      [-9, -8],\n      [13, -28],\n      [6, -22]\n    ],\n    [\n      [5767, 8523],\n      [5, -8],\n      [-7, -3],\n      [-6, -16]\n    ],\n    [\n      [5759, 8496],\n      [-14, 5],\n      [-8, -6],\n      [-15, 19],\n      [-26, 13],\n      [-21, -12]\n    ],\n    [\n      [5675, 8515],\n      [7, 26],\n      [-10, -3],\n      [-13, 5],\n      [-6, 13],\n      [-3, 20],\n      [6, 3],\n      [-5, 14],\n      [18, 5],\n      [6, 10],\n      [30, 1],\n      [8, 10],\n      [35, -13],\n      [27, -2],\n      [3, 4]\n    ],\n    [\n      [6160, 5833],\n      [0, -12]\n    ],\n    [\n      [6192, 5816],\n      [-8, -22],\n      [5, -23],\n      [5, -13],\n      [6, -8],\n      [1, -13],\n      [4, -12],\n      [5, -4],\n      [12, -21],\n      [51, -34],\n      [31, -23],\n      [28, 0]\n    ],\n    [\n      [6332, 5643],\n      [-21, -43],\n      [-31, -61],\n      [-14, -31],\n      [-14, -34],\n      [-5, -9],\n      [-27, 3],\n      [-20, -14],\n      [-8, -12],\n      [-1, -8],\n      [-9, -7],\n      [-12, -2],\n      [-7, -13]\n    ],\n    [\n      [6163, 5412],\n      [-19, -3],\n      [-3, 2],\n      [-9, 19],\n      [-26, -24],\n      [-8, -27],\n      [-25, 12],\n      [-15, 0],\n      [-7, 11],\n      [-28, 36],\n      [-23, 1],\n      [-3, 10]\n    ],\n    [\n      [5997, 5449],\n      [-4, 8],\n      [0, 27],\n      [-2, 9],\n      [-11, -2],\n      [-1, 9],\n      [-5, 7],\n      [-3, 12],\n      [0, 13],\n      [-4, 11],\n      [-3, 24],\n      [-6, 5],\n      [0, 8],\n      [-6, 4],\n      [-7, 24],\n      [-9, 16],\n      [-19, 8],\n      [-1, 9],\n      [5, 9],\n      [0, 17],\n      [12, 3],\n      [2, -5],\n      [7, 3],\n      [5, 9],\n      [-1, 50]\n    ],\n    [\n      [5946, 5727],\n      [4, 33],\n      [3, 9],\n      [-1, 22],\n      [7, 18],\n      [6, -7],\n      [5, 5],\n      [0, 25],\n      [4, 16],\n      [-1, 14],\n      [6, 8],\n      [2, 12],\n      [11, 31],\n      [11, 1],\n      [0, 19],\n      [3, 19],\n      [6, 24],\n      [2, 28]\n    ],\n    [\n      [5634, 8649],\n      [-3, -11],\n      [-9, 9],\n      [12, 2]\n    ],\n    [\n      [5804, 9158],\n      [-14, -7],\n      [8, -9],\n      [-8, -12],\n      [7, -21],\n      [18, -7],\n      [18, -21],\n      [-2, -10],\n      [-23, -30],\n      [-1, -9],\n      [13, -20],\n      [11, -25],\n      [5, -23],\n      [-10, -1],\n      [2, -32],\n      [-7, -6],\n      [6, -11],\n      [9, -1],\n      [-2, -23],\n      [14, -8],\n      [1, -11],\n      [-17, -18],\n      [14, -16],\n      [21, -15],\n      [9, -17],\n      [-9, -24],\n      [-25, -28],\n      [-15, -23],\n      [-18, -22],\n      [-10, -7],\n      [-27, -31]\n    ],\n    [\n      [5772, 8670],\n      [-31, -8],\n      [-19, -2],\n      [-8, -8],\n      [-15, 0],\n      [-6, -6],\n      [-38, -11],\n      [-10, -6],\n      [-10, 17],\n      [3, 10],\n      [-12, -6],\n      [2, 10],\n      [-10, 0],\n      [-12, 14],\n      [-5, -7],\n      [-8, 8],\n      [-2, 23],\n      [5, 3],\n      [3, 23],\n      [-5, 25],\n      [-5, 3],\n      [3, 22],\n      [-6, 2],\n      [3, 27],\n      [13, 9],\n      [-5, 12],\n      [11, -3],\n      [13, 8],\n      [-5, 9],\n      [17, 9],\n      [3, 10],\n      [13, 6],\n      [10, 18],\n      [17, 18],\n      [5, 16],\n      [25, 8],\n      [-4, 14],\n      [2, 17],\n      [-33, 19]\n    ],\n    [\n      [5671, 8973],\n      [-15, 37],\n      [10, 20],\n      [-12, 20],\n      [5, 16],\n      [-7, 26],\n      [5, 3],\n      [-23, 26],\n      [-21, 5],\n      [-41, 32]\n    ],\n    [\n      [5572, 9158],\n      [12, 1],\n      [7, 14],\n      [10, -2],\n      [21, -31],\n      [22, -6],\n      [20, 12],\n      [27, -15],\n      [7, 13],\n      [18, 12],\n      [-1, 17],\n      [6, 22],\n      [15, 15],\n      [16, -2],\n      [22, 10],\n      [17, -16],\n      [18, -7],\n      [6, -12],\n      [-14, -14],\n      [3, -11]\n    ],\n    [\n      [9954, 4093],\n      [-5, -13],\n      [-7, 0],\n      [12, 13]\n    ],\n    [\n      [9951, 4184],\n      [0, -5],\n      [9, -12],\n      [2, -26],\n      [-10, -2],\n      [-3, -6],\n      [-10, -2],\n      [-15, 11],\n      [-1, 12],\n      [5, 7],\n      [-2, 6],\n      [7, 12],\n      [18, 5]\n    ],\n    [\n      [0, 4252],\n      [9987, -23],\n      [-2, -11],\n      [4, 2],\n      [7, 14],\n      [0, -17],\n      [-16, -2],\n      [-1, 7],\n      [-11, -10],\n      [-4, -9],\n      [-7, 15],\n      [12, 16],\n      [13, 4],\n      [2, 8],\n      [-9984, 6]\n    ],\n    [\n      [3351, 2225],\n      [4, -3],\n      [-17, -28],\n      [-11, -4],\n      [-4, -11],\n      [-8, -4],\n      [-11, 12],\n      [16, 3],\n      [-4, 17],\n      [12, 1],\n      [-13, 15],\n      [11, -5],\n      [9, 6],\n      [15, -3],\n      [1, 4]\n    ],\n    [\n      [3368, 2227],\n      [7, 2],\n      [4, -8],\n      [12, 3],\n      [4, -18],\n      [-17, -11],\n      [-16, 0],\n      [8, -4],\n      [-12, -6],\n      [1, -10],\n      [-11, 5],\n      [3, -11],\n      [-9, 12],\n      [6, 17],\n      [13, 11],\n      [-3, 14],\n      [10, 4]\n    ],\n    [\n      [6541, 3981],\n      [5, -2],\n      [5, -13],\n      [-1, -13],\n      [-7, -1],\n      [-6, 6],\n      [-4, 14],\n      [8, 9]\n    ],\n    [\n      [6252, 4454],\n      [4, -5],\n      [-1, -13],\n      [-3, -1],\n      [0, 19]\n    ],\n    [\n      [3483, 5317],\n      [7, 10],\n      [4, 16],\n      [2, 29],\n      [4, 19],\n      [-10, 24],\n      [-3, 26],\n      [-1, 25],\n      [4, 16],\n      [5, 9]\n    ],\n    [\n      [3495, 5491],\n      [3, 5],\n      [3, 18],\n      [12, -10],\n      [11, -4],\n      [6, -6],\n      [10, -19],\n      [22, -31],\n      [3, -18],\n      [-1, -11]\n    ],\n    [\n      [3306, 6034],\n      [4, -11],\n      [-1, -7],\n      [-9, 13],\n      [1, 11],\n      [5, -6]\n    ],\n    [\n      [3288, 6120],\n      [2, -14],\n      [-4, -5],\n      [-3, 22],\n      [5, -3]\n    ],\n    [\n      [3295, 6124],\n      [5, -5],\n      [-9, -3],\n      [1, 18],\n      [3, -10]\n    ],\n    [\n      [5262, 7641],\n      [2, -7],\n      [1, -27],\n      [-4, -7],\n      [-2, -24],\n      [-7, -9],\n      [-8, 9],\n      [3, 8],\n      [-7, 3],\n      [2, 19],\n      [-5, 15],\n      [3, 10],\n      [13, 13],\n      [6, -1],\n      [3, 16],\n      [0, -18]\n    ],\n    [\n      [5160, 8036],\n      [5, -6],\n      [11, 0]\n    ],\n    [\n      [5172, 7849],\n      [16, 7]\n    ],\n    [\n      [5195, 7827],\n      [-7, -5],\n      [5, -18],\n      [5, -6],\n      [-2, -11],\n      [-13, -6],\n      [3, -11],\n      [8, -5],\n      [1, -9],\n      [-6, -11],\n      [4, -14],\n      [10, -7],\n      [9, 3],\n      [-4, -22]\n    ],\n    [\n      [5208, 7705],\n      [-2, -3]\n    ],\n    [\n      [5206, 7702],\n      [-2, -1]\n    ],\n    [\n      [5204, 7701],\n      [-11, -10],\n      [-9, -23],\n      [-14, -6],\n      [-22, 9],\n      [0, 7],\n      [-15, 1],\n      [-7, 6],\n      [-11, 0],\n      [-5, 6],\n      [-13, -17],\n      [-10, -6],\n      [-3, -9],\n      [0, -26],\n      [4, -8]\n    ],\n    [\n      [4950, 7681],\n      [9, 13],\n      [6, 48],\n      [-1, 11],\n      [4, 49],\n      [11, -11],\n      [0, 8],\n      [-14, 16],\n      [3, 6],\n      [1, 26],\n      [-20, 14],\n      [-9, 18],\n      [4, 14],\n      [-5, 12],\n      [-8, 1],\n      [-3, 15],\n      [-6, -3],\n      [-11, 11],\n      [-18, 6],\n      [-4, 6],\n      [-11, -5],\n      [0, 7],\n      [-9, 7],\n      [12, 5],\n      [-14, 12],\n      [1, 13],\n      [10, 6],\n      [22, 0],\n      [2, 9],\n      [12, 2],\n      [10, -20],\n      [12, 9],\n      [16, -4],\n      [4, 8],\n      [-1, 28],\n      [-6, 8],\n      [0, 18],\n      [16, 0],\n      [-1, -11],\n      [5, -6],\n      [30, -4],\n      [8, 7],\n      [-5, 3],\n      [2, 11],\n      [10, 9],\n      [18, 7],\n      [11, 15],\n      [0, 37],\n      [10, 8],\n      [17, 4]\n    ],\n    [\n      [4800, 8771],\n      [13, -21],\n      [-14, 13],\n      [1, 8]\n    ],\n    [\n      [4808, 8772],\n      [9, -11],\n      [-11, 3],\n      [2, 8]\n    ],\n    [\n      [9394, 5584],\n      [3, -9],\n      [-4, -1],\n      [1, 10]\n    ],\n    [\n      [5308, 4956],\n      [-3, 13],\n      [-10, 15],\n      [0, 9],\n      [-17, 28],\n      [-8, 19],\n      [7, -8],\n      [5, 3],\n      [-8, 8],\n      [-7, 1],\n      [-2, 13],\n      [-9, 21],\n      [1, 10],\n      [8, 2],\n      [-2, 7],\n      [-4, -5],\n      [-9, 16],\n      [-1, 11],\n      [-6, 18],\n      [5, 6],\n      [2, -7],\n      [2, 12],\n      [6, 13],\n      [1, 14],\n      [-1, 27],\n      [2, -7],\n      [11, -2],\n      [-8, 7],\n      [-5, 19],\n      [9, -6],\n      [-2, 24],\n      [3, 7],\n      [4, -4]\n    ],\n    [\n      [5272, 5240],\n      [6, 1],\n      [36, -1],\n      [0, 68]\n    ],\n    [\n      [4964, 8107],\n      [6, -6],\n      [-7, -6],\n      [-6, 6],\n      [7, 6]\n    ],\n    [\n      [4883, 8252],\n      [-4, -10],\n      [-6, 16],\n      [10, -6]\n    ],\n    [\n      [4825, 8298],\n      [-11, -2],\n      [-8, 20],\n      [-10, -17],\n      [-14, 5],\n      [-9, 13],\n      [11, 10],\n      [-5, 6],\n      [11, 2],\n      [8, 19]\n    ],\n    [\n      [4798, 8354],\n      [20, 10],\n      [13, -2],\n      [0, -8],\n      [18, -35],\n      [-7, -6],\n      [-11, -19],\n      [-6, 4]\n    ],\n    [\n      [4857, 8375],\n      [-7, 14],\n      [7, -1],\n      [0, -13]\n    ],\n    [\n      [4830, 8398],\n      [2, -9],\n      [-7, -6],\n      [-6, 6],\n      [1, 10],\n      [10, -1]\n    ],\n    [\n      [4839, 8409],\n      [-5, -13],\n      [-4, 6],\n      [9, 7]\n    ],\n    [\n      [4832, 8443],\n      [11, -10],\n      [-2, -5],\n      [-18, -4],\n      [7, 10],\n      [-7, 5],\n      [9, 4]\n    ],\n    [\n      [4795, 8489],\n      [3, -18],\n      [-4, 1],\n      [1, 17]\n    ],\n    [\n      [4800, 8503],\n      [1, -8],\n      [-10, 7],\n      [9, 1]\n    ],\n    [\n      [4824, 8506],\n      [5, -20],\n      [14, -6],\n      [-9, -6],\n      [-10, 1],\n      [-13, 15],\n      [11, 5],\n      [2, 11]\n    ],\n    [\n      [4827, 8543],\n      [-5, -20],\n      [-16, -15],\n      [3, 11],\n      [-7, 3],\n      [2, 15],\n      [23, 15],\n      [0, -9]\n    ],\n    [\n      [4907, 8560],\n      [9, 0],\n      [-6, -20],\n      [-22, -20],\n      [6, -7],\n      [-8, -14],\n      [22, 8],\n      [20, -3],\n      [16, 2],\n      [7, -13],\n      [-6, -9],\n      [-6, -24],\n      [-9, -18],\n      [-10, -8],\n      [8, -10],\n      [-21, -15],\n      [9, -4],\n      [11, 6],\n      [13, -8],\n      [14, -19],\n      [4, -29],\n      [8, -27],\n      [19, -9],\n      [4, -13],\n      [8, -7],\n      [-4, -5],\n      [11, -24],\n      [-7, 1],\n      [12, -23],\n      [-7, -19],\n      [8, -7],\n      [5, 11],\n      [20, -2],\n      [11, -10],\n      [3, -16],\n      [-5, -24],\n      [-4, 0],\n      [-14, -26],\n      [-11, -12],\n      [12, -3],\n      [13, 1],\n      [-3, -14],\n      [-11, -13],\n      [-5, 1],\n      [-14, -11],\n      [-12, 6],\n      [-18, -6],\n      [-3, 7],\n      [-18, -7],\n      [-14, -1],\n      [2, -8],\n      [-27, 9],\n      [-13, -6],\n      [-2, -17],\n      [-8, -7],\n      [-11, 10],\n      [-16, -3],\n      [-12, -21],\n      [-8, 10],\n      [19, 25],\n      [7, 14],\n      [1, 12],\n      [6, -1],\n      [2, 11],\n      [12, 3],\n      [11, -4],\n      [11, 2],\n      [8, 20],\n      [-23, -9],\n      [-8, 12],\n      [-13, -3],\n      [0, 6],\n      [-10, 3],\n      [-8, -7],\n      [-10, 18],\n      [13, 6],\n      [20, 18],\n      [2, 9],\n      [-2, 24],\n      [-17, -4],\n      [11, 12],\n      [5, 11],\n      [27, 10],\n      [8, 19],\n      [-4, 11],\n      [5, 2],\n      [-1, 14],\n      [-9, -6],\n      [-11, 23],\n      [9, 26],\n      [-19, -10],\n      [-11, 5],\n      [1, -10],\n      [-13, 10],\n      [-5, -5],\n      [-1, 21],\n      [11, 19],\n      [-15, 29],\n      [-8, -15],\n      [-4, -23],\n      [-5, -1],\n      [3, 22],\n      [-1, 18],\n      [5, 24],\n      [8, 18],\n      [-12, -13],\n      [-5, 11],\n      [0, 17],\n      [5, 10],\n      [-6, 19],\n      [7, 25],\n      [12, 0],\n      [-5, 20],\n      [11, 21],\n      [20, -6],\n      [26, 7]\n    ],\n    [\n      [4912, 8589],\n      [-2, -13],\n      [-4, 10],\n      [6, 3]\n    ],\n    [\n      [4964, 8673],\n      [4, -27],\n      [-15, 5],\n      [9, 7],\n      [2, 15]\n    ],\n    [\n      [6206, 7550],\n      [-23, 27],\n      [-5, -9],\n      [-8, 5],\n      [-9, -5],\n      [-8, 5]\n    ],\n    [\n      [6153, 7573],\n      [7, 17],\n      [-8, 51],\n      [-10, 6],\n      [-3, 11],\n      [-21, 13],\n      [-8, 10]\n    ],\n    [\n      [6110, 7681],\n      [2, 9],\n      [16, 0],\n      [27, -19],\n      [21, 2],\n      [7, -6],\n      [6, 1],\n      [10, -14],\n      [17, -9],\n      [-2, -8],\n      [6, -4],\n      [16, 12],\n      [7, -8],\n      [4, 8],\n      [11, -14],\n      [11, 0],\n      [-2, -18],\n      [8, -10],\n      [14, -9]\n    ],\n    [\n      [4995, 5824],\n      [5, -3],\n      [-3, -26],\n      [10, -13],\n      [3, -27],\n      [-4, -30],\n      [8, 0],\n      [-2, -24],\n      [2, -8],\n      [-4, -8],\n      [9, -19],\n      [-3, -11],\n      [0, -28],\n      [-3, -15],\n      [4, -3],\n      [-1, -23],\n      [-3, -2],\n      [6, -28],\n      [8, -9],\n      [5, -13]\n    ],\n    [\n      [5032, 5534],\n      [-7, -19],\n      [-15, 1],\n      [-21, -17],\n      [-12, -16],\n      [-6, 0],\n      [-6, -7],\n      [-11, -5],\n      [-10, -15],\n      [-7, 8],\n      [-24, 12]\n    ],\n    [\n      [4913, 5477],\n      [8, 2]\n    ],\n    [\n      [4851, 7264],\n      [0, 0]\n    ],\n    [\n      [4683, 5897],\n      [-3, -14],\n      [6, -9],\n      [6, 11],\n      [4, 0],\n      [8, -17],\n      [4, 13],\n      [5, 5],\n      [16, -11],\n      [2, 7],\n      [14, 19],\n      [5, -5],\n      [2, -20],\n      [3, -1],\n      [-1, -21],\n      [13, -17],\n      [-9, -23],\n      [5, 5],\n      [6, -3],\n      [0, -28],\n      [9, -12],\n      [0, -8]\n    ],\n    [\n      [4764, 5618],\n      [-6, 8],\n      [-1, -12],\n      [-11, -17],\n      [-5, 13],\n      [-4, 0],\n      [3, 19],\n      [-5, 25],\n      [0, 11],\n      [-8, 10],\n      [-7, -7],\n      [-6, 3]\n    ],\n    [\n      [4714, 5671],\n      [-3, 1],\n      [-5, -11],\n      [-3, 4],\n      [5, 15],\n      [-3, 10],\n      [0, 15],\n      [-4, 1],\n      [2, 13],\n      [-15, 39],\n      [-19, 0],\n      [-17, -7],\n      [-5, -26],\n      [-12, -21],\n      [-5, -1]\n    ],\n    [\n      [4630, 5703],\n      [4, 8],\n      [-12, 23],\n      [0, 12],\n      [-4, -2],\n      [-6, 13],\n      [-20, 29],\n      [4, 20],\n      [-5, -10],\n      [-3, 21],\n      [-4, -14],\n      [-2, 11]\n    ],\n    [\n      [4582, 5814],\n      [8, 30],\n      [12, 8],\n      [16, 4],\n      [0, 19],\n      [-6, 11],\n      [7, 3],\n      [-1, 24]\n    ],\n    [\n      [4618, 5913],\n      [19, -3],\n      [-1, -8],\n      [17, -6],\n      [3, -5],\n      [7, 6],\n      [20, 0]\n    ],\n    [\n      [4534, 5935],\n      [-2, 17],\n      [4, 7],\n      [8, -14],\n      [5, 5],\n      [-8, 2],\n      [-1, 13]\n    ],\n    [\n      [4540, 5965],\n      [29, 0],\n      [4, 12],\n      [7, 2],\n      [8, -5],\n      [2, -7],\n      [6, 1],\n      [4, -10],\n      [12, 7],\n      [3, -14],\n      [-15, -6],\n      [-5, 7],\n      [-11, 6],\n      [-6, 7],\n      [-1, -9],\n      [-5, -4],\n      [-12, -1],\n      [0, -11],\n      [-24, 1],\n      [-2, -6]\n    ],\n    [\n      [4553, 5826],\n      [1, -7],\n      [-6, 3],\n      [5, 4]\n    ],\n    [\n      [4582, 5814],\n      [-1, 9],\n      [-5, -7],\n      [-7, 20],\n      [5, 15],\n      [8, -2],\n      [-9, 7],\n      [-2, -8],\n      [-3, 8],\n      [2, 11],\n      [8, -1],\n      [-5, 6],\n      [-6, -7],\n      [-11, -6],\n      [3, 14],\n      [-7, -6],\n      [-6, 6],\n      [1, 13],\n      [-5, -2],\n      [-7, 9]\n    ],\n    [\n      [4535, 5893],\n      [14, 7],\n      [15, -1],\n      [13, 14],\n      [41, 0]\n    ],\n    [\n      [5272, 5240],\n      [-3, 6],\n      [-10, 3],\n      [3, 15],\n      [10, 28],\n      [0, 26]\n    ],\n    [\n      [5243, 5399],\n      [5, -8],\n      [-8, -24],\n      [-6, 4],\n      [0, 10],\n      [4, 1],\n      [1, 11],\n      [4, 6]\n    ],\n    [\n      [5663, 7229],\n      [13, -11],\n      [9, 5],\n      [22, -8],\n      [8, 3],\n      [-1, -12],\n      [9, 6],\n      [7, -7],\n      [-2, -5],\n      [-25, -2],\n      [-16, -4],\n      [0, 9],\n      [-10, 6],\n      [-24, 5],\n      [1, 17],\n      [4, 5],\n      [5, -7]\n    ],\n    [\n      [5756, 7245],\n      [-1, -17],\n      [-3, -5],\n      [4, 22]\n    ],\n    [\n      [5640, 7268],\n      [-4, -2],\n      [0, 12],\n      [4, -10]\n    ],\n    [\n      [5784, 7281],\n      [-5, -19],\n      [-8, -12],\n      [-2, 13],\n      [5, 13],\n      [10, 5]\n    ],\n    [\n      [5710, 7319],\n      [-4, -10],\n      [-2, 10],\n      [6, 0]\n    ],\n    [\n      [5731, 7350],\n      [-10, -7],\n      [2, 7],\n      [8, 0]\n    ],\n    [\n      [5748, 7357],\n      [-5, -6],\n      [-5, 6],\n      [10, 0]\n    ],\n    [\n      [5576, 7363],\n      [5, -7],\n      [-4, -5],\n      [-5, 10],\n      [4, 2]\n    ],\n    [\n      [5690, 7366],\n      [3, -13],\n      [-8, 16],\n      [5, -3]\n    ],\n    [\n      [5571, 7398],\n      [6, -23],\n      [-8, 2],\n      [-3, 14],\n      [5, 7]\n    ],\n    [\n      [5723, 7405],\n      [3, -16],\n      [-4, -9],\n      [-5, 25],\n      [6, 0]\n    ],\n    [\n      [5651, 7423],\n      [11, -14],\n      [8, 0],\n      [5, -29],\n      [7, 0],\n      [0, -10],\n      [-7, 1],\n      [-8, 23],\n      [-11, 0],\n      [-1, 9],\n      [-12, 17],\n      [-9, -1],\n      [13, 12],\n      [4, -8]\n    ],\n    [\n      [5733, 7446],\n      [6, -17],\n      [-13, 0],\n      [4, 10],\n      [-10, -4],\n      [-2, 8],\n      [13, 8],\n      [2, -5]\n    ],\n    [\n      [5553, 7474],\n      [-2, -18],\n      [-5, 18],\n      [7, 0]\n    ],\n    [\n      [5706, 7488],\n      [-2, -14],\n      [-9, 3],\n      [0, 9],\n      [11, 2]\n    ],\n    [\n      [5688, 7522],\n      [-8, 1],\n      [4, 10],\n      [4, -11]\n    ],\n    [\n      [5586, 7536],\n      [18, 3],\n      [4, 11],\n      [23, 3],\n      [5, 10]\n    ],\n    [\n      [5731, 7585],\n      [7, -8],\n      [1, -14],\n      [-8, -6],\n      [0, -15],\n      [-8, -13]\n    ],\n    [\n      [5723, 7529],\n      [-3, 5],\n      [-11, 2],\n      [-11, 8],\n      [-12, -10],\n      [-8, 6],\n      [-9, -12],\n      [-11, 1],\n      [4, -19],\n      [-4, -10],\n      [8, -6],\n      [-1, -11],\n      [-9, 17],\n      [-8, 0],\n      [0, -6],\n      [10, -14],\n      [-9, 6],\n      [-2, 14],\n      [-12, 9],\n      [0, 14],\n      [-6, -6],\n      [-3, -28],\n      [8, -15],\n      [2, -11],\n      [5, -6],\n      [7, -17],\n      [-11, 9],\n      [-4, -7],\n      [6, -16],\n      [-9, -6],\n      [17, -11],\n      [0, -9],\n      [8, -2],\n      [13, -15],\n      [-2, -5],\n      [2, -25],\n      [-3, -1],\n      [-12, 22],\n      [-15, -11],\n      [5, -3],\n      [0, -11],\n      [10, -10],\n      [-11, -8],\n      [-11, 16],\n      [0, -8],\n      [7, -21],\n      [3, -20],\n      [0, -17],\n      [-11, 22],\n      [-5, -6],\n      [-4, -14],\n      [0, 13],\n      [-6, 19],\n      [-6, -1],\n      [0, -14],\n      [-7, 3],\n      [-3, 13],\n      [3, 14],\n      [-3, 15],\n      [-13, 17],\n      [7, 16],\n      [7, 2],\n      [6, 9],\n      [19, -10],\n      [10, -12],\n      [9, 10],\n      [-5, 6],\n      [-17, 14],\n      [-1, -6],\n      [-12, 4],\n      [-12, -7],\n      [-4, 8],\n      [-8, -4],\n      [-5, 24],\n      [-4, -1],\n      [-1, 16],\n      [-13, 20],\n      [-2, 14],\n      [-5, 4]\n    ],\n    [\n      [5583, 7526],\n      [0, 0]\n    ],\n    [\n      [5582, 7531],\n      [4, 5]\n    ],\n    [\n      [3288, 5876],\n      [-5, -2],\n      [5, 13],\n      [0, -11]\n    ],\n    [\n      [3786, 8632],\n      [-12, -4],\n      [4, 9],\n      [8, -5]\n    ],\n    [\n      [3787, 8645],\n      [3, -11],\n      [-11, 4],\n      [-4, 10],\n      [12, -3]\n    ],\n    [\n      [3846, 8835],\n      [12, -11],\n      [-9, 0],\n      [-12, 15],\n      [9, -4]\n    ],\n    [\n      [3579, 8886],\n      [3, 14],\n      [6, -4],\n      [-9, -10]\n    ],\n    [\n      [3876, 8910],\n      [-1, -14],\n      [-10, 26],\n      [11, -12]\n    ],\n    [\n      [3961, 8973],\n      [2, -9],\n      [-18, -2],\n      [0, 10],\n      [16, 1]\n    ],\n    [\n      [3583, 9209],\n      [9, -5],\n      [-9, -16],\n      [-11, 9],\n      [11, 12]\n    ],\n    [\n      [3535, 9210],\n      [20, -7],\n      [5, -10],\n      [-9, -9],\n      [-40, -14],\n      [-19, 9],\n      [8, 9],\n      [-21, 2],\n      [3, 11],\n      [-6, 23],\n      [14, 9],\n      [30, -7],\n      [15, -16]\n    ],\n    [\n      [4292, 9258],\n      [5, -6],\n      [-22, -8],\n      [-56, -5],\n      [5, 12],\n      [24, 14],\n      [11, 0],\n      [27, 11],\n      [6, -18]\n    ],\n    [\n      [3513, 9274],\n      [-13, 6],\n      [9, 10],\n      [4, -16]\n    ],\n    [\n      [3537, 9281],\n      [-14, 10],\n      [21, 1],\n      [-7, -11]\n    ],\n    [\n      [3472, 9375],\n      [-13, -11],\n      [-4, 9],\n      [17, 2]\n    ],\n    [\n      [4335, 9380],\n      [22, -3],\n      [33, -25],\n      [-20, 4],\n      [17, -11],\n      [-5, -9],\n      [-50, 20],\n      [-10, 8],\n      [0, 15],\n      [13, 1]\n    ],\n    [\n      [4354, 9391],\n      [36, -8],\n      [-3, -13],\n      [-17, -1],\n      [-14, 11],\n      [-38, 1],\n      [0, 5],\n      [36, 5]\n    ],\n    [\n      [4333, 9407],\n      [21, -8],\n      [-47, 6],\n      [55, -12],\n      [-48, -4],\n      [-29, 9],\n      [13, 12],\n      [35, -3]\n    ],\n    [\n      [4418, 9469],\n      [11, -1],\n      [11, -14],\n      [-32, -5],\n      [-18, 7],\n      [3, 8],\n      [25, 5]\n    ],\n    [\n      [4439, 9496],\n      [13, -2],\n      [-12, -10],\n      [-14, 7],\n      [13, 5]\n    ],\n    [\n      [4505, 9520],\n      [-7, -8],\n      [21, -2],\n      [-15, -6],\n      [-30, -2],\n      [2, 17],\n      [29, 1]\n    ],\n    [\n      [4481, 9596],\n      [3, -41],\n      [-16, 34],\n      [13, 7]\n    ],\n    [\n      [2994, 9643],\n      [23, -5],\n      [-21, -3],\n      [-2, 8]\n    ],\n    [\n      [4445, 9674],\n      [18, -11],\n      [-32, 9],\n      [14, 2]\n    ],\n    [\n      [4519, 9788],\n      [-33, -16],\n      [-26, 9],\n      [49, 14],\n      [10, -7]\n    ],\n    [\n      [3575, 9904],\n      [-53, 7],\n      [4, 13],\n      [49, -20]\n    ],\n    [\n      [3722, 9942],\n      [44, -15],\n      [-28, -11],\n      [-44, 11],\n      [-20, 15],\n      [48, 0]\n    ],\n    [\n      [3880, 9983],\n      [38, -14],\n      [-47, 9],\n      [9, 5]\n    ],\n    [\n      [4105, 9998],\n      [43, -1],\n      [139, -17],\n      [-12, -6],\n      [-116, -3],\n      [-142, -14],\n      [100, 5],\n      [47, 8],\n      [96, -4],\n      [39, 6],\n      [2, -18],\n      [34, 4],\n      [72, -17],\n      [-31, -17],\n      [-54, -4],\n      [-152, -7],\n      [-81, -17],\n      [1, -9],\n      [30, 8],\n      [107, 13],\n      [89, -4],\n      [-3, -12],\n      [-44, -9],\n      [-2, -11],\n      [85, 20],\n      [2, 14],\n      [51, 4],\n      [11, -19],\n      [-7, -14],\n      [-56, -36],\n      [-16, -18],\n      [53, 26],\n      [58, 30],\n      [75, -8],\n      [37, 24],\n      [53, -1],\n      [57, -12],\n      [13, -8],\n      [-64, -27],\n      [-24, 0],\n      [7, -12],\n      [-31, -8],\n      [-46, 1],\n      [36, -15],\n      [-18, -11],\n      [-40, -3],\n      [-44, 6],\n      [-25, -22],\n      [11, -12],\n      [20, 3],\n      [-9, -21],\n      [17, -12],\n      [-27, -8],\n      [0, -11],\n      [-28, -2],\n      [-11, -42],\n      [-18, -22],\n      [18, 0],\n      [10, 17],\n      [51, -16],\n      [-6, -10],\n      [-19, 10],\n      [-22, -2],\n      [38, -26],\n      [10, 6],\n      [21, -5],\n      [2, -18],\n      [-10, -12],\n      [-35, 13],\n      [-27, -3],\n      [-24, -13],\n      [-13, 12],\n      [-14, -8],\n      [10, -12],\n      [18, 1],\n      [0, -16],\n      [19, 4],\n      [30, -4],\n      [6, -11],\n      [-15, -4],\n      [21, -14],\n      [3, -29],\n      [-17, -4],\n      [-4, 9],\n      [-16, -2],\n      [-26, 17],\n      [8, -12],\n      [24, -14],\n      [-8, -27],\n      [30, -5],\n      [7, 6],\n      [13, -11],\n      [-18, -15],\n      [-16, 2],\n      [-7, 11],\n      [-36, -2],\n      [-11, -18],\n      [9, -27],\n      [-2, 21],\n      [9, 3],\n      [36, -10],\n      [-7, -26],\n      [-28, 3],\n      [-18, -14],\n      [-36, 11],\n      [-14, 9],\n      [-1, 13],\n      [-10, -16],\n      [-25, -4],\n      [-17, -16],\n      [24, -7],\n      [-16, -14],\n      [22, -6],\n      [6, -12],\n      [-19, -7],\n      [21, 1],\n      [23, -15],\n      [33, -16],\n      [-17, -14],\n      [20, 9],\n      [14, -3],\n      [-17, -11],\n      [2, -17],\n      [9, 14],\n      [10, -1],\n      [0, -35],\n      [8, -18],\n      [-13, -10],\n      [-11, 3],\n      [-7, 22],\n      [-2, -22],\n      [-19, 0],\n      [-16, 10],\n      [-9, 27],\n      [-24, 13],\n      [-15, 14],\n      [-20, 5],\n      [-16, -3],\n      [-26, 23],\n      [-16, -2],\n      [31, -13],\n      [-8, -6],\n      [26, -8],\n      [25, 1],\n      [11, -12],\n      [-16, -13],\n      [-24, -7],\n      [-44, 2],\n      [14, -7],\n      [-11, -17],\n      [2, -11],\n      [40, 7],\n      [13, -6],\n      [-17, -3],\n      [-27, -14],\n      [-16, -3],\n      [34, -3],\n      [11, 16],\n      [15, -4],\n      [29, 13],\n      [23, -11],\n      [25, -7],\n      [33, 0],\n      [0, -8],\n      [-14, 0],\n      [-4, -12],\n      [-19, -2],\n      [1, -10],\n      [-13, -8],\n      [-17, -1],\n      [2, -9],\n      [-26, -21],\n      [-31, -10],\n      [-13, -9],\n      [-23, 1],\n      [1, -6],\n      [-24, -7],\n      [-9, 4],\n      [-5, -11],\n      [-18, 10],\n      [-1, -16],\n      [-30, -3],\n      [-30, 17],\n      [6, -17],\n      [-4, -12],\n      [-11, 1],\n      [-16, -12],\n      [-12, -33],\n      [-13, -5],\n      [-1, -15],\n      [-27, -26],\n      [-15, -2],\n      [-14, -18],\n      [-13, 3],\n      [-20, -12],\n      [-17, 14],\n      [15, 16],\n      [-12, 0],\n      [-7, -21],\n      [-14, -1],\n      [8, -16],\n      [-17, 1],\n      [-7, -6],\n      [-8, 9],\n      [-14, -12],\n      [2, -15],\n      [-14, -14],\n      [-10, 8],\n      [-13, -3],\n      [1, -12],\n      [14, -11],\n      [-1, -13],\n      [-13, -9],\n      [-12, 1],\n      [3, -8],\n      [18, -1],\n      [7, -27],\n      [-13, 0],\n      [6, -7],\n      [-18, -12],\n      [-13, 6],\n      [12, -15],\n      [-4, -15],\n      [-21, -8],\n      [-6, -11],\n      [9, -15],\n      [-21, 9],\n      [12, -11],\n      [9, -1],\n      [-8, -21],\n      [11, 5],\n      [-6, -22],\n      [-8, -6],\n      [7, -7],\n      [-17, -13],\n      [9, -6],\n      [-3, -17],\n      [-20, 3],\n      [20, -7],\n      [-12, -15],\n      [-11, 5],\n      [14, -18],\n      [0, -9],\n      [-29, 6],\n      [-13, -12],\n      [-12, 10],\n      [3, 19],\n      [-9, 0],\n      [6, 10],\n      [-15, -11],\n      [-11, 20],\n      [6, 8],\n      [-3, 10],\n      [-10, -9],\n      [-22, -8],\n      [3, 7],\n      [-19, -8],\n      [-17, 0],\n      [14, 12],\n      [-20, 6],\n      [-4, 9],\n      [7, 5],\n      [-20, 5],\n      [-1, 9],\n      [-10, 13],\n      [8, 10],\n      [-10, 16],\n      [-15, 2],\n      [-8, 9],\n      [5, 28],\n      [-12, 7],\n      [15, 8],\n      [-28, -3],\n      [-2, 19],\n      [-11, 10],\n      [3, 23],\n      [-6, 8],\n      [14, -1],\n      [13, 13],\n      [6, 16],\n      [9, -13],\n      [-4, 16],\n      [-11, 4],\n      [-15, -12],\n      [2, 10],\n      [-19, -33],\n      [-9, 0],\n      [1, 29],\n      [22, 16],\n      [-10, 2],\n      [-8, -13],\n      [-23, 50],\n      [-12, 0],\n      [-4, 23],\n      [19, 15],\n      [18, 9],\n      [21, 21],\n      [-21, -13],\n      [-3, -7],\n      [-33, -23],\n      [-9, 1],\n      [1, 22],\n      [11, 11],\n      [16, -1],\n      [5, 10],\n      [-34, 3],\n      [-6, 14],\n      [49, 13],\n      [17, -3],\n      [12, 6],\n      [-28, -2],\n      [-28, -7],\n      [-21, -2],\n      [2, 10],\n      [25, 18],\n      [15, 2],\n      [12, -7],\n      [24, 4],\n      [-49, 5],\n      [-24, -17],\n      [0, 18],\n      [22, 10],\n      [-5, 12],\n      [15, -1],\n      [16, -8],\n      [21, 2],\n      [-6, 8],\n      [7, 12],\n      [-13, 0],\n      [9, -8],\n      [-31, -6],\n      [-3, 7],\n      [-15, -1],\n      [13, 14],\n      [18, 4],\n      [23, -2],\n      [-5, 11],\n      [7, 22],\n      [16, -8],\n      [0, 19],\n      [-17, -7],\n      [10, 18],\n      [-2, 11],\n      [15, 4],\n      [-8, 11],\n      [-24, 0],\n      [-25, 5],\n      [-25, 17],\n      [-22, 4],\n      [-15, 18],\n      [11, 6],\n      [48, -8],\n      [25, -15],\n      [24, -6],\n      [5, 11],\n      [-14, -6],\n      [1, 16],\n      [-24, 21],\n      [17, -6],\n      [-5, 9],\n      [-22, -1],\n      [16, 9],\n      [-4, 6],\n      [-19, -12],\n      [5, 13],\n      [24, 4],\n      [-8, 4],\n      [-21, -8],\n      [-7, 9],\n      [25, 4],\n      [-41, 6],\n      [-4, 7],\n      [-14, -11],\n      [0, -11],\n      [-14, -5],\n      [-24, 1],\n      [-17, 17],\n      [17, 13],\n      [-8, 8],\n      [19, 13],\n      [-21, 11],\n      [17, 5],\n      [10, 12],\n      [-3, 15],\n      [-18, 4],\n      [4, 18],\n      [-30, 38],\n      [7, 13],\n      [-16, 5],\n      [7, 11],\n      [-21, 13],\n      [4, 8],\n      [-31, 10],\n      [-14, 17],\n      [13, 3],\n      [-7, 17],\n      [-16, -2],\n      [-4, 10],\n      [-26, 9],\n      [-17, -2],\n      [-4, 9],\n      [-42, 5],\n      [-31, 8],\n      [-6, -11],\n      [-27, 5],\n      [1, -9],\n      [-35, -1],\n      [7, 10],\n      [-15, 1],\n      [-6, -12],\n      [-18, 11],\n      [-7, -6],\n      [23, -12],\n      [-58, 9],\n      [-30, 15],\n      [36, 17],\n      [-57, 7],\n      [-26, 11],\n      [12, 12],\n      [50, 5],\n      [21, 6],\n      [50, -3],\n      [14, 9],\n      [-19, 13],\n      [-24, -11],\n      [-45, -4],\n      [-29, 6],\n      [21, 8],\n      [-33, -1],\n      [13, 9],\n      [-30, -4],\n      [-44, 23],\n      [8, 21],\n      [91, 16],\n      [8, 10],\n      [43, 9],\n      [42, -2],\n      [31, 23],\n      [-5, 30],\n      [-56, 2],\n      [-12, 15],\n      [39, 20],\n      [28, 7],\n      [8, 12],\n      [46, 13],\n      [44, -9],\n      [16, 6],\n      [6, 19],\n      [-19, 15],\n      [104, 24],\n      [90, 11],\n      [24, -14],\n      [-6, -33],\n      [24, 17],\n      [-1, 11],\n      [85, -18],\n      [-31, 13],\n      [44, 0],\n      [-31, 12],\n      [-15, 20],\n      [65, -8],\n      [77, -19],\n      [22, -14],\n      [25, 1],\n      [-8, 28],\n      [38, -1],\n      [-68, 26],\n      [132, 2],\n      [-157, 7],\n      [28, 14],\n      [74, 4],\n      [6, 5],\n      [54, -17],\n      [95, 1],\n      [-42, 3],\n      [53, 5],\n      [-49, 3],\n      [0, 13],\n      [180, 11]\n    ],\n    [\n      [2530, 6098],\n      [8, -8],\n      [4, 5],\n      [7, -7]\n    ],\n    [\n      [2549, 6088],\n      [-17, -28],\n      [-9, -9],\n      [-2, -15],\n      [2, -14],\n      [-6, -9]\n    ],\n    [\n      [2517, 6013],\n      [-6, -1],\n      [2, -10],\n      [-5, -3],\n      [-10, -17],\n      [-1, -9]\n    ],\n    [\n      [2497, 5973],\n      [-15, 12],\n      [-19, 1],\n      [-9, 9],\n      [-17, 25]\n    ],\n    [\n      [2437, 6020],\n      [3, 7],\n      [-1, 33],\n      [1, 10],\n      [11, 38],\n      [36, 0],\n      [2, 20],\n      [-7, 4],\n      [-4, 17],\n      [-8, 7],\n      [-1, 7],\n      [-9, 13],\n      [12, 0],\n      [1, 33],\n      [50, 0]\n    ],\n    [\n      [9022, 5957],\n      [-2, -11],\n      [-3, 10],\n      [5, 12],\n      [4, -3],\n      [-4, -8]\n    ],\n    [\n      [3409, 5499],\n      [-2, -9],\n      [4, -10],\n      [-2, -8],\n      [-13, -2],\n      [-5, -8],\n      [2, -9],\n      [-6, -39],\n      [4, -7],\n      [2, -13],\n      [5, -8],\n      [0, -8],\n      [10, 0],\n      [2, -28],\n      [6, -15],\n      [0, -8],\n      [9, -27],\n      [6, -5]\n    ],\n    [\n      [3312, 5482],\n      [-18, 43],\n      [8, 14],\n      [-2, 28],\n      [9, 7],\n      [5, -2],\n      [11, 21],\n      [-7, 0],\n      [-5, 21],\n      [5, 19],\n      [5, 3],\n      [15, 22],\n      [-6, 18]\n    ],\n    [\n      [3332, 5676],\n      [4, -9],\n      [7, -3],\n      [15, -20],\n      [17, -36],\n      [1, -15],\n      [-4, -18],\n      [1, -10],\n      [3, 13],\n      [4, 2],\n      [10, -8],\n      [9, -18],\n      [2, -9],\n      [6, -1],\n      [5, -11],\n      [0, -27],\n      [-3, -7]\n    ],\n    [\n      [8172, 6482],\n      [5, -7],\n      [-5, -9],\n      [-9, 5],\n      [5, 9]\n    ],\n    [\n      [7037, 2130],\n      [10, -6],\n      [-7, -4],\n      [-3, 10]\n    ],\n    [\n      [2691, 6046],\n      [-12, -1],\n      [-4, -8],\n      [-12, -4],\n      [-8, -7],\n      [-8, 2],\n      [-3, 9],\n      [-6, -6],\n      [-4, -11],\n      [0, -12],\n      [-5, -3],\n      [-5, -13],\n      [-6, -5],\n      [0, -7],\n      [-8, 9],\n      [-8, -14],\n      [-13, -2],\n      [2, -26],\n      [-6, -2],\n      [0, -10],\n      [-11, -5]\n    ],\n    [\n      [2574, 5930],\n      [-4, 22],\n      [-10, 3]\n    ],\n    [\n      [2560, 5955],\n      [3, 17],\n      [-2, 12],\n      [-6, -1],\n      [-3, 6],\n      [-10, -8],\n      [0, 7],\n      [-7, 3],\n      [-8, 17],\n      [-10, 5]\n    ],\n    [\n      [2549, 6088],\n      [8, 9],\n      [7, 2],\n      [7, -7],\n      [2, 4],\n      [12, -6],\n      [4, 3],\n      [12, -1],\n      [13, 11],\n      [15, -6],\n      [11, 6],\n      [18, -9],\n      [13, -22],\n      [-8, 6],\n      [10, -19],\n      [8, 0],\n      [-7, 9],\n      [9, -6],\n      [4, -13],\n      [4, -3]\n    ],\n    [\n      [5512, 7634],\n      [1, -9]\n    ],\n    [\n      [5513, 7625],\n      [-8, 12],\n      [-27, 21],\n      [12, -5]\n    ],\n    [\n      [5466, 7679],\n      [-8, -5],\n      [-2, 8],\n      [10, -3]\n    ],\n    [\n      [5412, 7751],\n      [11, -14],\n      [-10, 8],\n      [-1, 6]\n    ],\n    [\n      [5401, 7772],\n      [0, -20],\n      [-5, 27],\n      [5, -7]\n    ],\n    [\n      [5404, 7789],\n      [3, -10],\n      [-5, -3],\n      [2, 13]\n    ],\n    [\n      [5458, 7861],\n      [5, -3],\n      [18, -29],\n      [6, 0],\n      [9, -10],\n      [17, 0],\n      [11, 9]\n    ],\n    [\n      [5524, 7828],\n      [3, -33],\n      [12, -10],\n      [-10, -3],\n      [-1, -17]\n    ],\n    [\n      [5488, 7656],\n      [-12, 12],\n      [-6, 13],\n      [-14, 10],\n      [-11, -4],\n      [-2, 10],\n      [-14, 14],\n      [-9, 17],\n      [8, 5],\n      [-15, 23],\n      [-1, 23],\n      [-9, 12],\n      [-7, 2],\n      [-3, -20],\n      [-8, -11],\n      [-8, 20],\n      [0, 20]\n    ],\n    [\n      [5377, 7802],\n      [9, -3],\n      [13, 3],\n      [6, 6],\n      [20, -9],\n      [-2, 17],\n      [12, 6],\n      [-2, 20],\n      [9, 5],\n      [8, 12],\n      [8, 2]\n    ],\n    [\n      [3002, 6248],\n      [-1, 2]\n    ],\n    [\n      [2977, 6260],\n      [-12, 8],\n      [1, 7],\n      [11, -10],\n      [0, -5]\n    ],\n    [\n      [3000, 6254],\n      [2, -6]\n    ],\n    [\n      [3006, 6222],\n      [-8, 11],\n      [-24, -5],\n      [-11, 6],\n      [-8, 0],\n      [-6, -5],\n      [1, -8],\n      [-12, 16],\n      [-7, 4],\n      [2, 15],\n      [6, 2],\n      [16, -10],\n      [24, -4],\n      [4, 8],\n      [7, -2],\n      [0, 7],\n      [-13, 23],\n      [1, 19],\n      [3, 2],\n      [-9, 11],\n      [-11, 1],\n      [-2, 6],\n      [8, 10],\n      [11, 2],\n      [13, -11],\n      [15, -2]\n    ],\n    [\n      [5614, 7970],\n      [21, -26]\n    ],\n    [\n      [5635, 7944],\n      [-8, -11],\n      [-4, 2],\n      [-13, -17],\n      [-4, -19],\n      [-5, -6],\n      [-4, -21],\n      [-6, -5],\n      [-1, -12],\n      [-6, -10],\n      [-7, 2],\n      [-5, -8],\n      [-10, -1]\n    ],\n    [\n      [5562, 7838],\n      [-16, 4],\n      [-11, -11],\n      [-11, -3]\n    ],\n    [\n      [5458, 7861],\n      [-7, 21],\n      [-4, -1]\n    ],\n    [\n      [5476, 7947],\n      [6, -1],\n      [10, -13],\n      [15, 0],\n      [14, 3],\n      [-1, 10],\n      [7, 4],\n      [14, 3],\n      [4, 7],\n      [8, -7],\n      [12, 11],\n      [3, 13],\n      [9, 3],\n      [9, -5],\n      [11, 3],\n      [5, -11],\n      [12, 3]\n    ],\n    [\n      [8426, 4574],\n      [2, -3],\n      [-6, -11],\n      [-11, -6],\n      [0, 8],\n      [6, 3],\n      [10, 17],\n      [-1, -8]\n    ],\n    [\n      [8386, 4582],\n      [-1, -10],\n      [-6, 2],\n      [7, 8]\n    ],\n    [\n      [8333, 4644],\n      [9, -18],\n      [4, 2],\n      [10, -24],\n      [-10, -15],\n      [-9, 5],\n      [-5, 14],\n      [-10, 12],\n      [-15, 3],\n      [-4, 11],\n      [10, 10],\n      [20, 0]\n    ],\n    [\n      [8473, 4637],\n      [-2, -11],\n      [-16, -29],\n      [-8, 0],\n      [-2, -6],\n      [-12, -5],\n      [-3, 9],\n      [7, 6],\n      [-5, 10],\n      [2, 16],\n      [10, 18]\n    ],\n    [\n      [8444, 4645],\n      [2, -5],\n      [7, 4],\n      [3, 10]\n    ],\n    [\n      [8456, 4654],\n      [13, 13]\n    ],\n    [\n      [8469, 4667],\n      [7, -5],\n      [0, -8],\n      [-6, -2],\n      [3, -15]\n    ],\n    [\n      [8318, 4695],\n      [-3, -16],\n      [1, 18],\n      [2, -2]\n    ],\n    [\n      [8424, 4708],\n      [1, -8],\n      [-8, -2],\n      [4, 11],\n      [3, -1]\n    ],\n    [\n      [8242, 4700],\n      [-7, -24],\n      [3, -4],\n      [-11, -3],\n      [-10, 6],\n      [6, 6],\n      [-1, 15],\n      [7, 13],\n      [8, -1],\n      [5, -8]\n    ],\n    [\n      [8442, 4708],\n      [-5, -4],\n      [-10, -16],\n      [-5, 4],\n      [7, 9],\n      [-2, 6],\n      [12, 4],\n      [3, -3]\n    ],\n    [\n      [8450, 4700],\n      [-5, -10],\n      [-4, 6],\n      [11, 16],\n      [-2, -12]\n    ],\n    [\n      [8858, 4702],\n      [-10, -1],\n      [7, 12],\n      [3, -11]\n    ],\n    [\n      [8265, 4700],\n      [-2, 12],\n      [5, 2],\n      [-3, -14]\n    ],\n    [\n      [8459, 4715],\n      [2, -3],\n      [13, 1],\n      [1, -11],\n      [-22, -6],\n      [3, 18],\n      [3, 1]\n    ],\n    [\n      [8550, 4716],\n      [8, -3],\n      [-2, -6],\n      [-6, 9]\n    ],\n    [\n      [8276, 4716],\n      [4, 0],\n      [5, -15],\n      [6, 7],\n      [6, -6],\n      [8, 2],\n      [1, -19],\n      [-18, -12],\n      [0, 10],\n      [-7, -11],\n      [-12, -2],\n      [-9, -9],\n      [-7, -2],\n      [-11, 5],\n      [2, 11],\n      [-1, 13],\n      [12, 14],\n      [6, -8],\n      [4, 5],\n      [6, -18],\n      [14, 4],\n      [-6, 11],\n      [-4, 1],\n      [-6, 16],\n      [7, 3]\n    ],\n    [\n      [8415, 4713],\n      [2, -8],\n      [-7, -8],\n      [2, -8],\n      [-13, -10],\n      [-8, 1],\n      [-9, -9],\n      [-11, 5],\n      [-1, -7],\n      [-12, 0],\n      [-2, 6],\n      [-7, 2],\n      [-9, -3],\n      [-13, 4],\n      [0, 11],\n      [13, 18],\n      [19, -4],\n      [15, -16],\n      [15, 11],\n      [6, -12],\n      [6, 1],\n      [0, 7],\n      [12, 12],\n      [-4, 4],\n      [3, 8],\n      [3, -5]\n    ],\n    [\n      [8208, 4712],\n      [5, -15],\n      [-14, -15],\n      [-7, 13],\n      [-11, 8],\n      [-3, 14],\n      [12, -6],\n      [8, 8],\n      [10, -7]\n    ],\n    [\n      [8604, 4733],\n      [0, -14],\n      [-5, 14],\n      [5, 0]\n    ],\n    [\n      [8519, 4741],\n      [-6, -15],\n      [-15, 2],\n      [-5, -7],\n      [5, 21],\n      [11, -2],\n      [8, 7],\n      [2, -6]\n    ],\n    [\n      [8857, 4720],\n      [-12, -20],\n      [-23, 0],\n      [5, 24],\n      [6, 21],\n      [6, 8],\n      [11, 6],\n      [5, -1],\n      [7, -11],\n      [-5, -27]\n    ],\n    [\n      [8656, 4770],\n      [0, -26],\n      [-8, -16],\n      [-7, -6],\n      [3, 28],\n      [10, 23],\n      [2, -3]\n    ],\n    [\n      [8664, 4774],\n      [1, -9],\n      [-7, 7],\n      [6, 2]\n    ],\n    [\n      [8166, 4787],\n      [3, -6],\n      [-12, -8],\n      [-3, -6],\n      [-12, -1],\n      [-12, 5],\n      [4, 15],\n      [32, 1]\n    ],\n    [\n      [8204, 4789],\n      [6, -5],\n      [-10, -1],\n      [4, 6]\n    ],\n    [\n      [8738, 4813],\n      [-1, -5],\n      [-6, 7],\n      [3, 6],\n      [4, -8]\n    ],\n    [\n      [8733, 4812],\n      [3, -8],\n      [-6, -16],\n      [-7, 2],\n      [2, 30],\n      [-1, 7],\n      [9, -15]\n    ],\n    [\n      [7948, 4837],\n      [3, 4],\n      [13, -9],\n      [8, 1],\n      [0, 9],\n      [9, -3],\n      [2, -10],\n      [7, -5],\n      [6, 2],\n      [5, -8],\n      [8, 5],\n      [5, -14],\n      [2, -16],\n      [11, -1],\n      [10, -5],\n      [4, 4],\n      [11, -7],\n      [7, 4],\n      [5, -7],\n      [7, 8],\n      [2, 19],\n      [4, 5],\n      [7, -1],\n      [3, -15],\n      [12, 3],\n      [12, -14],\n      [16, 1],\n      [0, -13],\n      [6, -8],\n      [-2, -17],\n      [16, -15],\n      [12, 4],\n      [7, 6],\n      [13, -11],\n      [-3, -41],\n      [7, -10],\n      [-18, 4],\n      [-20, 20],\n      [-6, -1],\n      [-10, -8],\n      [-9, 6],\n      [-16, 4],\n      [-2, -6],\n      [-9, 6],\n      [-11, 0],\n      [-13, 8],\n      [-14, 14],\n      [-18, 10],\n      [-23, 1],\n      [-2, -7],\n      [-18, 4],\n      [-11, 14],\n      [-25, 5],\n      [-4, 10],\n      [4, 15],\n      [-7, -1],\n      [-7, 10],\n      [-20, -2],\n      [3, 10],\n      [2, -8],\n      [4, 17],\n      [5, 1],\n      [1, 18],\n      [5, 17],\n      [4, -6]\n    ],\n    [\n      [8346, 4810],\n      [-1, 39],\n      [3, -8],\n      [-2, -31]\n    ],\n    [\n      [8685, 4859],\n      [3, -16],\n      [-4, 0],\n      [1, 16]\n    ],\n    [\n      [8737, 4870],\n      [5, -12],\n      [1, -27],\n      [-5, -14],\n      [-8, 8],\n      [-1, 9],\n      [2, 19],\n      [6, 17]\n    ],\n    [\n      [7843, 4868],\n      [-9, 8],\n      [9, -3],\n      [0, -5]\n    ],\n    [\n      [8386, 4889],\n      [2, 1],\n      [2, -20],\n      [-3, -2],\n      [-4, 10],\n      [3, 11]\n    ],\n    [\n      [8410, 4898],\n      [-4, -6],\n      [0, -18],\n      [-10, -1],\n      [3, 23],\n      [-2, 8],\n      [11, 13],\n      [2, -19]\n    ],\n    [\n      [8422, 4913],\n      [0, -9],\n      [-5, 6],\n      [-2, -24],\n      [7, -6],\n      [-2, -7],\n      [-8, -5],\n      [0, -10],\n      [-6, -1],\n      [-2, 9],\n      [5, 17],\n      [3, 22],\n      [0, 15],\n      [4, 10],\n      [6, -17]\n    ],\n    [\n      [8418, 4952],\n      [5, -5],\n      [-3, -8],\n      [-5, 6],\n      [3, 7]\n    ],\n    [\n      [8564, 4977],\n      [-2, -8],\n      [-9, -3],\n      [3, 10],\n      [8, 1]\n    ],\n    [\n      [8225, 4951],\n      [-3, 23],\n      [3, 18],\n      [4, 5],\n      [1, -36],\n      [-5, -10]\n    ],\n    [\n      [8523, 5004],\n      [7, -6],\n      [-2, -7],\n      [6, -2],\n      [0, -14],\n      [-15, -15],\n      [-15, 15],\n      [-5, 14],\n      [1, 12],\n      [11, 5],\n      [12, -2]\n    ],\n    [\n      [8598, 5023],\n      [14, -13],\n      [8, 1],\n      [7, -8],\n      [1, -15],\n      [7, -11],\n      [-1, -17],\n      [-24, 23],\n      [-3, 8],\n      [-9, 2],\n      [-2, -10],\n      [-15, 7],\n      [-2, 8],\n      [-6, -10],\n      [-7, -2],\n      [-6, 20],\n      [-4, -17],\n      [-6, 11],\n      [8, 6],\n      [1, 12],\n      [21, 0],\n      [5, -5],\n      [13, 10]\n    ],\n    [\n      [7789, 5006],\n      [0, -13],\n      [-7, 21],\n      [0, 8],\n      [6, -7],\n      [1, -9]\n    ],\n    [\n      [7994, 5036],\n      [13, -12],\n      [-2, -21],\n      [-6, -7],\n      [-3, 11],\n      [-8, -10],\n      [0, 26],\n      [2, 12],\n      [4, 1]\n    ],\n    [\n      [7782, 5024],\n      [-5, -4],\n      [0, 20],\n      [5, -16]\n    ],\n    [\n      [7769, 5060],\n      [4, -12],\n      [-4, 1],\n      [-5, 11],\n      [5, 0]\n    ],\n    [\n      [8501, 5041],\n      [-3, 3],\n      [-3, 21],\n      [4, 3],\n      [2, -27]\n    ],\n    [\n      [8483, 5079],\n      [15, 1],\n      [11, -2],\n      [-2, -3],\n      [-24, -4],\n      [0, 8]\n    ],\n    [\n      [8620, 5085],\n      [2, -15],\n      [-6, -6],\n      [-14, 10],\n      [10, 9],\n      [8, 2]\n    ],\n    [\n      [8458, 5089],\n      [22, -6],\n      [0, -9],\n      [-8, -3],\n      [-7, 2],\n      [-10, -6],\n      [-1, 20],\n      [4, 2]\n    ],\n    [\n      [8762, 5091],\n      [20, -3],\n      [6, -5],\n      [14, -4],\n      [-11, -5],\n      [-15, 5],\n      [-14, 12]\n    ],\n    [\n      [7940, 5097],\n      [5, -5],\n      [4, -17],\n      [0, -18],\n      [4, -16],\n      [14, -6],\n      [-5, -8],\n      [-2, -12],\n      [4, -10],\n      [-22, 15],\n      [0, 21],\n      [-3, 4],\n      [-1, 14],\n      [-18, 4],\n      [0, 8],\n      [7, 9],\n      [-3, 5],\n      [9, 9],\n      [2, -13],\n      [3, 1],\n      [-2, 12],\n      [4, 3]\n    ],\n    [\n      [8550, 5100],\n      [9, -9],\n      [-6, -5],\n      [-11, -3],\n      [-5, 6],\n      [1, 9],\n      [6, 8],\n      [6, -6]\n    ],\n    [\n      [8421, 5116],\n      [1, -14],\n      [3, 9],\n      [6, -1],\n      [0, -10],\n      [-4, -5],\n      [-3, 6],\n      [-1, -12],\n      [-3, 18],\n      [-6, -15],\n      [-4, 10],\n      [3, 13],\n      [8, 1]\n    ],\n    [\n      [8044, 5127],\n      [4, -10],\n      [-9, -8],\n      [0, 18],\n      [5, 0]\n    ],\n    [\n      [7746, 5129],\n      [7, -31],\n      [4, -7],\n      [-2, -11],\n      [-9, 6],\n      [-9, 29],\n      [3, 13],\n      [6, 1]\n    ],\n    [\n      [8636, 5129],\n      [4, -8],\n      [-2, -16],\n      [-7, 6],\n      [-3, 15],\n      [8, 3]\n    ],\n    [\n      [8634, 5139],\n      [-7, -9],\n      [-4, 6],\n      [11, 3]\n    ],\n    [\n      [8761, 5145],\n      [12, -2],\n      [9, -20],\n      [6, -4],\n      [-7, -7],\n      [-7, 2],\n      [-4, 22],\n      [-3, -4],\n      [-6, 13]\n    ],\n    [\n      [8536, 5138],\n      [-5, 0],\n      [3, 9],\n      [2, -9]\n    ],\n    [\n      [8915, 5033],\n      [0, -218],\n      [-3, -12],\n      [3, -17],\n      [0, -128]\n    ],\n    [\n      [8915, 4658],\n      [-10, 18],\n      [-4, 12],\n      [-15, 28],\n      [-17, -5],\n      [-3, 6],\n      [-7, -8],\n      [-1, 19],\n      [5, 19],\n      [-4, 4],\n      [-7, 18],\n      [13, -3],\n      [-12, 8],\n      [-4, 13],\n      [10, 2],\n      [-8, 7],\n      [1, 5],\n      [-7, 13],\n      [-3, 32],\n      [-8, 7],\n      [0, 12],\n      [-4, 8],\n      [-15, 20],\n      [-21, 12],\n      [-18, 18],\n      [-14, 4],\n      [-7, -1],\n      [-16, 20],\n      [1, 11],\n      [-4, -6],\n      [-5, 9],\n      [-1, -9],\n      [-5, 7],\n      [1, 8],\n      [-6, -4],\n      [-4, 14],\n      [-3, -5],\n      [0, 28],\n      [6, 6],\n      [-1, 9],\n      [-6, -11],\n      [0, -14],\n      [-7, -21],\n      [1, -8],\n      [-5, -11],\n      [-7, -3],\n      [-6, 11],\n      [-2, 14],\n      [6, 8],\n      [-9, 15],\n      [-3, 12],\n      [-6, 8],\n      [-6, -2],\n      [-2, 12],\n      [5, 5],\n      [10, -2],\n      [4, -6],\n      [9, 18],\n      [7, 5],\n      [7, -10],\n      [8, 7],\n      [4, 12],\n      [-1, 9],\n      [-7, -8],\n      [-11, 2],\n      [-16, -6],\n      [-4, 7],\n      [-6, -5],\n      [-8, 11],\n      [-4, 22],\n      [-5, 11],\n      [-9, 2],\n      [-5, -3],\n      [-7, 4],\n      [3, 13],\n      [5, 6],\n      [0, 18],\n      [7, 5],\n      [8, 0],\n      [10, 17],\n      [8, 5],\n      [8, -1],\n      [12, -10],\n      [6, -11],\n      [17, 0],\n      [5, -8],\n      [-4, -5],\n      [7, -22],\n      [-1, -12],\n      [-4, -7],\n      [2, -39],\n      [5, -10],\n      [3, -17],\n      [1, 17],\n      [5, -3],\n      [1, -23],\n      [5, -17],\n      [6, -6],\n      [11, 0],\n      [2, 7],\n      [10, 16],\n      [1, 11],\n      [9, 14],\n      [3, 18],\n      [9, -2],\n      [14, 10],\n      [-3, 16],\n      [19, 18],\n      [4, 0],\n      [11, -13],\n      [9, -4],\n      [5, -10],\n      [7, -3],\n      [20, -21],\n      [10, 3],\n      [16, -10],\n      [-2, -6],\n      [8, 0]\n    ],\n    [\n      [7903, 5160],\n      [0, -12],\n      [-8, 7],\n      [6, 9],\n      [2, -4]\n    ],\n    [\n      [8544, 5159],\n      [1, -17],\n      [6, 0],\n      [-1, -9],\n      [-5, 6],\n      [-5, -3],\n      [0, 10],\n      [-5, 11],\n      [6, 9],\n      [3, -7]\n    ],\n    [\n      [8533, 5168],\n      [1, -14],\n      [-4, -1],\n      [0, 14],\n      [3, 1]\n    ],\n    [\n      [7735, 5153],\n      [-4, 0],\n      [3, 16],\n      [1, -16]\n    ],\n    [\n      [7881, 5163],\n      [-8, -1],\n      [3, 8],\n      [5, -7]\n    ],\n    [\n      [8633, 5183],\n      [14, -10],\n      [-2, -13],\n      [-6, 2],\n      [-11, 13],\n      [8, -16],\n      [-6, -1],\n      [-1, 8],\n      [-9, 2],\n      [-2, 9],\n      [15, 6]\n    ],\n    [\n      [7737, 5167],\n      [-5, 8],\n      [0, 8],\n      [5, -16]\n    ],\n    [\n      [7904, 5183],\n      [11, -16],\n      [-7, 4],\n      [-8, -1],\n      [4, 13]\n    ],\n    [\n      [7850, 5240],\n      [4, 0],\n      [7, -11],\n      [-14, -1],\n      [-1, 20],\n      [4, -8]\n    ],\n    [\n      [7861, 5243],\n      [2, -12],\n      [-8, 11],\n      [-5, -1],\n      [5, 9],\n      [6, -7]\n    ],\n    [\n      [7892, 5248],\n      [-1, -8],\n      [-5, 3],\n      [6, 5]\n    ],\n    [\n      [7904, 5252],\n      [2, -10],\n      [-2, -11],\n      [-3, 13],\n      [-6, -3],\n      [2, 9],\n      [7, 2]\n    ],\n    [\n      [7845, 5238],\n      [-6, 7],\n      [-1, 17],\n      [3, 2],\n      [5, -9],\n      [-1, -17]\n    ],\n    [\n      [7704, 5270],\n      [3, -2],\n      [6, -18],\n      [6, -7],\n      [-2, -28],\n      [-4, 1],\n      [-3, 14],\n      [-5, 7],\n      [-8, 26],\n      [7, 7]\n    ],\n    [\n      [7839, 5273],\n      [7, -4],\n      [0, -13],\n      [-10, 11],\n      [-2, 10],\n      [5, -4]\n    ],\n    [\n      [8473, 5279],\n      [5, -11],\n      [-3, -3],\n      [-6, -26],\n      [-5, -5],\n      [-7, -25],\n      [-24, -11],\n      [-11, 3],\n      [-4, 10],\n      [-24, 0],\n      [-12, -4],\n      [-6, 6],\n      [-13, -7],\n      [-11, 7],\n      [-10, -4],\n      [-7, -19],\n      [-3, -19],\n      [3, -26],\n      [4, -13],\n      [5, -1],\n      [5, -12],\n      [2, -17],\n      [13, 1],\n      [2, 12],\n      [8, 18],\n      [5, -3],\n      [13, 0],\n      [1, 9],\n      [15, -2],\n      [7, 4],\n      [-7, 4],\n      [10, 6],\n      [9, -5],\n      [0, -20],\n      [-3, -4],\n      [-4, 11],\n      [-9, -3],\n      [-8, -23],\n      [-9, -17],\n      [-12, -6],\n      [-3, -12],\n      [-10, 8],\n      [0, -8],\n      [8, -15],\n      [5, -3],\n      [11, -32],\n      [7, -26],\n      [-5, -8],\n      [-1, -14],\n      [13, -17],\n      [-1, -9],\n      [7, -3],\n      [0, -15],\n      [-4, -6],\n      [-4, 6],\n      [-14, -7],\n      [-2, -7],\n      [2, -12],\n      [-12, 1],\n      [-5, 9],\n      [1, 25],\n      [3, 8],\n      [-8, 7],\n      [-13, 25],\n      [0, 9],\n      [5, 10],\n      [1, 26],\n      [-8, 8],\n      [-17, -20],\n      [6, -16],\n      [0, -25],\n      [-2, -12],\n      [1, -36],\n      [2, -7],\n      [-4, -14],\n      [-1, -14],\n      [5, -24],\n      [-15, -2],\n      [-4, -8],\n      [-11, 16],\n      [0, 14],\n      [3, 7],\n      [0, 18],\n      [4, 19],\n      [0, 23],\n      [-5, 19],\n      [2, 12],\n      [-6, 3],\n      [-10, -8],\n      [-3, 14],\n      [2, 27],\n      [-4, 0],\n      [1, 13],\n      [3, -1],\n      [7, 11],\n      [-1, 15],\n      [3, 13],\n      [4, 2],\n      [-2, 14],\n      [0, 26],\n      [5, 11],\n      [1, 11],\n      [7, 11],\n      [1, 50],\n      [3, 16],\n      [4, 4],\n      [-1, 10],\n      [9, 8],\n      [7, -3],\n      [6, 14],\n      [0, 15],\n      [3, 3],\n      [10, -7],\n      [5, 3],\n      [0, -9],\n      [5, -4],\n      [8, 2],\n      [8, -5],\n      [7, 1],\n      [10, -12],\n      [4, 8],\n      [19, -6],\n      [8, 1],\n      [10, 8],\n      [9, 23],\n      [10, 19],\n      [2, -4]\n    ],\n    [\n      [7825, 5301],\n      [0, -16],\n      [-7, -2],\n      [-2, 18],\n      [9, 0]\n    ],\n    [\n      [8556, 5309],\n      [-6, -20],\n      [5, -6],\n      [0, -25],\n      [-11, -20],\n      [3, -8],\n      [6, 3],\n      [0, 8],\n      [7, 8],\n      [-3, 5],\n      [3, 9],\n      [11, 11],\n      [4, -1],\n      [-1, -29],\n      [-11, -9],\n      [0, -14],\n      [11, -6],\n      [0, -13],\n      [-20, 8],\n      [-3, -10],\n      [1, -20],\n      [5, -25],\n      [10, -24],\n      [-11, 11],\n      [-5, 20],\n      [-5, 6],\n      [1, 34],\n      [-4, 4],\n      [-2, 38],\n      [-3, 10],\n      [4, 12],\n      [0, 12],\n      [4, 16],\n      [10, 15]\n    ],\n    [\n      [8571, 5333],\n      [3, -7],\n      [-3, -21],\n      [-8, -7],\n      [-3, 16],\n      [5, 13],\n      [6, 6]\n    ],\n    [\n      [7663, 5350],\n      [2, -7],\n      [14, -20],\n      [-5, 0],\n      [-14, 13],\n      [-4, 9],\n      [7, 5]\n    ],\n    [\n      [8268, 5370],\n      [-4, 6],\n      [4, 4],\n      [0, -10]\n    ],\n    [\n      [8489, 5385],\n      [-4, -3],\n      [0, 16],\n      [4, -13]\n    ],\n    [\n      [8269, 5423],\n      [5, -1]\n    ],\n    [\n      [8274, 5422],\n      [-2, -7],\n      [-3, 8]\n    ],\n    [\n      [8008, 5418],\n      [2, -16],\n      [-2, -7],\n      [-8, 11],\n      [-1, 9],\n      [7, 11],\n      [2, -8]\n    ],\n    [\n      [8265, 5422],\n      [-5, 1],\n      [11, -21],\n      [-1, -10],\n      [-15, -1],\n      [7, -13],\n      [-5, -10],\n      [11, -13],\n      [-4, -4],\n      [16, -37],\n      [-8, -15],\n      [1, -8],\n      [7, -13],\n      [9, -10],\n      [10, -16],\n      [6, -14],\n      [-7, -9],\n      [-16, 4],\n      [-8, 12],\n      [4, -17],\n      [-6, 2],\n      [-6, -18],\n      [-4, -26],\n      [2, -2],\n      [-3, -17],\n      [1, -14],\n      [4, 4],\n      [-3, -14],\n      [4, -4],\n      [-9, -8],\n      [-1, 5],\n      [-7, -22],\n      [-14, -16],\n      [1, -8],\n      [-9, -10],\n      [6, 1],\n      [-2, -24],\n      [6, 0],\n      [-2, -19],\n      [-4, -2],\n      [0, -18],\n      [-5, -7],\n      [-6, -36],\n      [-38, -32],\n      [0, 28],\n      [-14, 23],\n      [-6, -9],\n      [-9, 3],\n      [0, 12],\n      [-6, -6],\n      [-9, 20],\n      [-3, -10],\n      [3, -3],\n      [-14, -16],\n      [-9, 6],\n      [-7, -11],\n      [-4, -1],\n      [1, 27],\n      [-4, 17],\n      [0, -10],\n      [-4, -4],\n      [-7, 5],\n      [-9, -9],\n      [-7, 6],\n      [-2, -5],\n      [-3, 12],\n      [-7, -8],\n      [-6, 62],\n      [-5, 8],\n      [3, 3],\n      [2, 20],\n      [-4, 16],\n      [-7, 11],\n      [-7, 4],\n      [-2, -4],\n      [-7, 21],\n      [0, 34],\n      [5, -2],\n      [-5, 14],\n      [-5, 4],\n      [0, 20],\n      [3, 50],\n      [7, 9],\n      [1, 14],\n      [9, 9]\n    ],\n    [\n      [8045, 5303],\n      [-3, -16],\n      [3, -12],\n      [17, -35],\n      [7, -8],\n      [8, 3],\n      [2, 6],\n      [10, 4],\n      [7, -6],\n      [9, 2],\n      [8, 7],\n      [2, 18],\n      [8, 7],\n      [15, 0],\n      [-2, -8],\n      [9, -3],\n      [11, -8],\n      [7, 12],\n      [16, -1],\n      [5, 12],\n      [1, 13],\n      [3, 2],\n      [-1, 20],\n      [12, 14],\n      [-4, 12],\n      [1, 10],\n      [5, 10],\n      [6, -1],\n      [4, 65],\n      [5, 11],\n      [6, -4],\n      [3, 5],\n      [7, -4],\n      [10, 4],\n      [13, 0],\n      [10, -12]\n    ],\n    [\n      [8523, 5442],\n      [2, -13],\n      [-3, -14],\n      [-4, -2],\n      [2, 32],\n      [3, -3]\n    ],\n    [\n      [7652, 5506],\n      [11, -6],\n      [4, -11],\n      [10, -6],\n      [12, 4],\n      [10, -8],\n      [9, 6],\n      [11, -21],\n      [3, -16],\n      [6, -9],\n      [0, -16],\n      [13, -17],\n      [3, -9],\n      [6, -5],\n      [20, -26],\n      [7, -15],\n      [-1, -13],\n      [3, -5],\n      [3, 6],\n      [6, -23],\n      [14, -21],\n      [-2, 19],\n      [6, 1],\n      [8, -16],\n      [1, -14],\n      [10, -6],\n      [12, -18],\n      [1, -19],\n      [7, -15],\n      [13, -3],\n      [5, -14],\n      [-13, -13],\n      [8, 1],\n      [12, 15],\n      [11, -13],\n      [2, -18],\n      [-7, 0],\n      [-6, -21],\n      [7, -4],\n      [-5, -5],\n      [1, -12],\n      [4, -12],\n      [9, -1],\n      [7, -6],\n      [6, 2],\n      [2, -16],\n      [1, -28],\n      [4, -14],\n      [7, -5],\n      [-1, -9],\n      [8, -5],\n      [13, -1],\n      [0, -13],\n      [5, -6],\n      [0, -10],\n      [6, -4],\n      [2, -14],\n      [-6, -14],\n      [-1, -15],\n      [3, -5],\n      [-4, -25],\n      [2, -13],\n      [0, -26],\n      [-2, -53],\n      [-7, 2],\n      [-7, 19],\n      [-3, -6],\n      [0, -12],\n      [-8, 6],\n      [-9, 11],\n      [-1, -4],\n      [5, -19],\n      [-4, -3],\n      [-3, 11],\n      [-10, 17],\n      [-5, 19],\n      [-7, 10],\n      [-11, 12],\n      [-28, 46],\n      [-1, 17],\n      [-17, 23],\n      [-8, 29],\n      [-9, 16],\n      [-5, 17],\n      [2, 7],\n      [-9, 34],\n      [0, 8],\n      [-5, 3],\n      [1, 11],\n      [-9, 30],\n      [-9, 14],\n      [0, 13],\n      [-4, 9],\n      [-9, 10],\n      [-5, 1],\n      [-1, 21],\n      [-9, 45],\n      [0, 20],\n      [-3, 0],\n      [-7, 14],\n      [-5, 2],\n      [-9, 14],\n      [-7, 6],\n      [-2, 27],\n      [-5, 5],\n      [-4, 14],\n      [-3, 5],\n      [-8, 23],\n      [-11, 6],\n      [-8, 21],\n      [-6, 5],\n      [-13, 28],\n      [-5, 27],\n      [-3, 6],\n      [0, 17],\n      [8, 2]\n    ],\n    [\n      [4872, 8298],\n      [-4, 5],\n      [8, 13],\n      [4, -7],\n      [-8, -11]\n    ],\n    [\n      [7606, 5598],\n      [2, -16],\n      [-2, -11],\n      [-5, 16],\n      [0, 9],\n      [5, 2]\n    ],\n    [\n      [7571, 5804],\n      [0, -12],\n      [-5, 0],\n      [-1, 12],\n      [6, 0]\n    ],\n    [\n      [7583, 5964],\n      [1, -29],\n      [-3, 1],\n      [1, -36],\n      [-3, -2],\n      [1, -13],\n      [-5, -6],\n      [2, -9],\n      [-2, -25],\n      [-5, 13],\n      [5, 34],\n      [0, 29],\n      [2, 1],\n      [0, 26],\n      [6, 16]\n    ],\n    [\n      [7448, 6428],\n      [-4, 1],\n      [4, 13],\n      [0, -14]\n    ],\n    [\n      [7248, 6922],\n      [-16, -24],\n      [0, -12],\n      [-5, -9],\n      [1, -17],\n      [-7, -14],\n      [9, -14],\n      [9, -1],\n      [7, -10],\n      [9, -6],\n      [2, -11],\n      [15, -17],\n      [6, 3],\n      [11, -14],\n      [7, 2],\n      [1, -11],\n      [12, -4],\n      [18, 0],\n      [8, 4],\n      [6, -8],\n      [8, -2],\n      [1, -18],\n      [8, -3],\n      [10, -14],\n      [9, 7],\n      [7, -16],\n      [4, 5],\n      [9, -3],\n      [11, -11],\n      [7, 7],\n      [9, -11],\n      [13, 6],\n      [7, -5],\n      [4, 17],\n      [0, 13],\n      [-6, 11],\n      [2, 24],\n      [3, 21]\n    ],\n    [\n      [7703, 6808],\n      [0, -19],\n      [-13, -15],\n      [0, -11],\n      [7, -21],\n      [-7, 6],\n      [-4, 10],\n      [-21, -9],\n      [-2, -10],\n      [-14, -19],\n      [-9, -5],\n      [-2, -21],\n      [4, -12],\n      [-4, -6],\n      [0, -10],\n      [-10, -18],\n      [-2, -16],\n      [3, -3],\n      [-2, -22],\n      [-3, -2],\n      [-6, -22],\n      [-5, -27],\n      [-11, 9],\n      [-11, -2],\n      [4, -18],\n      [-2, -30],\n      [-9, -21],\n      [2, -34],\n      [-3, 1],\n      [-1, -12],\n      [-8, 9],\n      [-3, -10]\n    ],\n    [\n      [7473, 6457],\n      [-4, -11],\n      [5, -18],\n      [-6, 2],\n      [-4, -6],\n      [-2, 22],\n      [-5, -3],\n      [-1, -16],\n      [-7, 0],\n      [-1, 26],\n      [-8, -18],\n      [-21, -14],\n      [-8, -19],\n      [6, -28],\n      [-7, -10],\n      [-4, -16],\n      [-4, -3],\n      [-6, -16],\n      [-19, -10],\n      [-5, 9],\n      [-5, -13],\n      [5, 1],\n      [-15, -26],\n      [-9, -26],\n      [-13, -29],\n      [-9, -8],\n      [-6, -10],\n      [-9, -22],\n      [-21, -21],\n      [-6, -16],\n      [3, -5],\n      [-1, -14],\n      [-6, -9],\n      [-11, -8],\n      [-10, 4],\n      [-4, -3],\n      [-1, -20],\n      [-10, -15],\n      [-1, 10],\n      [-6, -1],\n      [-9, -10],\n      [-3, -17],\n      [-2, -18],\n      [3, -24],\n      [-1, -30],\n      [3, -29],\n      [-5, -4],\n      [7, -9],\n      [0, -14],\n      [-3, -37],\n      [-8, -24],\n      [-4, -26],\n      [2, -16],\n      [0, -46],\n      [1, -17],\n      [-15, 0],\n      [-2, -15],\n      [-8, -21],\n      [-2, -13],\n      [5, -9],\n      [-20, -12],\n      [-5, -12],\n      [-2, -22],\n      [-2, -8],\n      [-16, -16],\n      [-7, 6],\n      [-11, 22],\n      [-7, 19],\n      [-6, 25],\n      [-3, 32],\n      [4, -10],\n      [0, 11],\n      [-6, 7],\n      [-2, 18],\n      [-6, 30],\n      [-1, 14],\n      [-9, 36],\n      [-9, 17],\n      [-6, 25],\n      [-6, 34],\n      [-2, 33],\n      [-8, 39],\n      [-1, 14],\n      [-7, 14],\n      [-2, 12],\n      [-4, 5],\n      [0, 15],\n      [-3, 4],\n      [-4, 24],\n      [-4, 8],\n      [-5, 29],\n      [-1, 37],\n      [-5, 30],\n      [-6, 45],\n      [1, 7],\n      [-3, 22],\n      [-1, 23],\n      [-3, 24],\n      [2, 33],\n      [4, 12],\n      [-2, 36],\n      [-3, -4],\n      [-3, 11],\n      [2, 16],\n      [12, 11],\n      [-16, -3],\n      [2, 14],\n      [-2, 14],\n      [9, 5],\n      [-13, 4],\n      [-2, -15],\n      [-8, -7],\n      [8, -18],\n      [-6, -25],\n      [-17, -17],\n      [-14, -11],\n      [-5, 0],\n      [-10, 9],\n      [-11, 17],\n      [-15, 33],\n      [-15, 29],\n      [0, 10],\n      [7, 1],\n      [0, -9],\n      [14, 12],\n      [3, -3],\n      [9, 7],\n      [7, 23],\n      [-10, -1],\n      [-9, -10],\n      [-13, 5],\n      [-11, 10],\n      [-9, 15],\n      [-4, 19],\n      [-6, 14]\n    ],\n    [\n      [6893, 6556],\n      [5, 7],\n      [10, 0],\n      [0, 19],\n      [13, -3],\n      [11, 2],\n      [5, -7],\n      [6, 0],\n      [3, 8],\n      [13, 7],\n      [0, -8],\n      [6, -3],\n      [9, 10],\n      [-4, 12],\n      [3, 3],\n      [-5, 27],\n      [-6, 14],\n      [0, 17],\n      [-10, 1],\n      [-6, 14],\n      [2, 35],\n      [-9, 2],\n      [-10, 11],\n      [1, 17],\n      [10, 20],\n      [6, 22],\n      [7, 12],\n      [6, 1],\n      [4, -16],\n      [4, -2],\n      [9, 7],\n      [20, 8],\n      [0, 9],\n      [8, 16],\n      [5, 21],\n      [16, 16],\n      [9, 29],\n      [3, 22],\n      [12, 8],\n      [4, 7],\n      [-2, 10],\n      [6, 11],\n      [6, 19],\n      [10, 12],\n      [-4, 2],\n      [3, 17],\n      [-2, 24],\n      [7, 10],\n      [14, 8],\n      [1, 10],\n      [-8, 8],\n      [-11, 2],\n      [0, 14],\n      [-9, 2],\n      [0, 13],\n      [-9, 10],\n      [4, 22],\n      [-5, 5],\n      [1, 10],\n      [7, 10],\n      [-9, 1],\n      [1, 16],\n      [-5, 3],\n      [4, 19],\n      [13, 6],\n      [7, -5],\n      [16, -2],\n      [11, -9],\n      [11, 11],\n      [17, 3],\n      [3, 10],\n      [5, 1],\n      [4, 11]\n    ],\n    [\n      [7140, 7205],\n      [20, 22]\n    ],\n    [\n      [4825, 8298],\n      [2, -37],\n      [6, -29],\n      [-6, -16],\n      [-4, -28],\n      [-10, 1],\n      [-8, -4],\n      [-12, 0],\n      [-5, -10],\n      [-7, 0],\n      [-4, -8],\n      [-7, -1],\n      [-12, -14],\n      [-20, 0],\n      [-11, -8],\n      [10, 14],\n      [-20, -4],\n      [12, 13],\n      [-11, -6],\n      [-7, 10],\n      [13, 14],\n      [-15, -2],\n      [5, 10],\n      [13, -2],\n      [-1, 11],\n      [8, 12],\n      [-10, -5],\n      [12, 12],\n      [5, 21],\n      [10, 8],\n      [-16, -2],\n      [-14, 9],\n      [-3, 9],\n      [6, 13],\n      [0, 24],\n      [-5, 4],\n      [22, 4],\n      [23, -3],\n      [-5, 4],\n      [12, 9],\n      [3, 8],\n      [-15, -1],\n      [-2, 7],\n      [10, 6],\n      [2, 18],\n      [15, 2],\n      [6, -6],\n      [4, 17],\n      [13, -9],\n      [-9, -9]\n    ],\n    [\n      [6560, 6732],\n      [-4, -9],\n      [-5, 0],\n      [-16, -12],\n      [0, 7],\n      [13, 7],\n      [13, 13],\n      [-1, -6]\n    ],\n    [\n      [6357, 7396],\n      [3, -38],\n      [4, -9],\n      [9, -7],\n      [13, -2],\n      [9, -5],\n      [2, -13],\n      [21, -24],\n      [23, -9],\n      [43, 18],\n      [16, -4],\n      [-3, 30]\n    ],\n    [\n      [6497, 7333],\n      [8, -1],\n      [16, 11],\n      [1, 13],\n      [9, 13],\n      [9, 7],\n      [24, 0],\n      [3, 10],\n      [17, -4],\n      [5, 4],\n      [3, -17],\n      [23, -10],\n      [8, -9],\n      [10, 3],\n      [11, -10],\n      [10, -21],\n      [13, -7],\n      [8, -22],\n      [23, 0],\n      [2, -31],\n      [-3, -8],\n      [4, -5],\n      [0, -15]\n    ],\n    [\n      [6689, 6902],\n      [14, -27],\n      [0, -8],\n      [6, -21],\n      [10, -20],\n      [14, -8],\n      [5, -10],\n      [5, -1],\n      [-1, -12],\n      [2, -18],\n      [-1, -26],\n      [11, 2],\n      [4, -8],\n      [-4, -17],\n      [0, -11],\n      [-12, 0],\n      [-12, -7],\n      [-2, -10],\n      [-11, -7],\n      [-7, -59]\n    ],\n    [\n      [6710, 6634],\n      [-5, -8],\n      [-10, 9],\n      [-12, 4],\n      [-1, 9],\n      [-5, -6],\n      [-24, 3],\n      [-2, 4],\n      [-12, -4],\n      [-6, 10],\n      [-7, 2],\n      [-14, -2],\n      [-4, 8],\n      [-17, 5],\n      [-4, 19],\n      [-4, 42],\n      [-6, 17],\n      [-11, 3],\n      [-8, -2],\n      [-5, -8],\n      [-9, -4],\n      [-3, -11],\n      [-6, 2],\n      [-13, -17],\n      [-11, 5],\n      [-3, 7],\n      [-17, 0],\n      [-8, 16],\n      [-10, 6],\n      [-13, 16],\n      [-4, 16],\n      [-12, 11],\n      [-9, -1],\n      [-8, 6],\n      [-9, 35],\n      [0, 12],\n      [-8, 13],\n      [2, 10],\n      [-6, 0],\n      [1, 16],\n      [-15, 30],\n      [0, 10],\n      [-5, 6],\n      [-11, -12],\n      [-2, 9],\n      [-7, -1],\n      [-9, 13],\n      [8, -1],\n      [0, 9],\n      [-9, -8],\n      [1, -20],\n      [-11, -4]\n    ],\n    [\n      [6347, 6908],\n      [-3, 15],\n      [-11, 14],\n      [0, 31],\n      [-9, 0],\n      [0, 23],\n      [4, 21],\n      [-9, 22],\n      [-5, 19],\n      [-6, -1],\n      [-14, 21],\n      [-16, 15],\n      [4, 5],\n      [-4, 15],\n      [-11, 15],\n      [-5, 22],\n      [3, 14],\n      [-4, 8],\n      [2, 8],\n      [6, -3],\n      [-2, 9],\n      [7, 21],\n      [7, 2],\n      [1, 7],\n      [-6, 16],\n      [1, 10],\n      [6, 2],\n      [-4, 9],\n      [-6, -3],\n      [-14, 14],\n      [-3, 21],\n      [-5, 0],\n      [-1, 18],\n      [-6, 5],\n      [2, 12],\n      [-3, 7]\n    ],\n    [\n      [6243, 7322],\n      [0, 10],\n      [-6, 6],\n      [1, 17],\n      [-10, 17],\n      [6, 20],\n      [-4, 0],\n      [-3, 45],\n      [-5, 13],\n      [11, 4],\n      [4, 19],\n      [7, -7]\n    ],\n    [\n      [6347, 6908],\n      [-13, 5],\n      [-3, -3]\n    ],\n    [\n      [6331, 6910],\n      [-7, 6],\n      [-9, 0],\n      [-6, -5],\n      [-8, -33],\n      [-9, -20]\n    ],\n    [\n      [6292, 6858],\n      [-5, -2],\n      [-46, 8],\n      [-62, 91],\n      [-11, 18],\n      [-47, 49],\n      [-34, 10]\n    ],\n    [\n      [6087, 7032],\n      [4, 8],\n      [-7, 3],\n      [0, 11],\n      [-8, 51]\n    ],\n    [\n      [6076, 7105],\n      [4, 3],\n      [43, 44],\n      [14, 11],\n      [7, 22],\n      [1, 40],\n      [3, 8],\n      [-2, 23]\n    ],\n    [\n      [6146, 7256],\n      [0, 0]\n    ],\n    [\n      [6146, 7256],\n      [0, 20],\n      [3, 10],\n      [13, 5],\n      [15, 26],\n      [-1, 3]\n    ],\n    [\n      [6176, 7320],\n      [6, 2],\n      [6, 13],\n      [9, 0],\n      [10, -7],\n      [12, -2],\n      [8, 4],\n      [1, -18],\n      [11, 12],\n      [4, -2]\n    ],\n    [\n      [4554, 9014],\n      [7, -14],\n      [12, -7],\n      [12, 13],\n      [-4, -20],\n      [10, 2],\n      [-2, -20],\n      [12, 4],\n      [0, -8],\n      [21, -10],\n      [-4, -10],\n      [6, -8],\n      [-13, -25],\n      [-13, -4],\n      [-2, -15],\n      [-24, -8],\n      [-39, -26],\n      [-31, -6],\n      [-1, -11],\n      [-23, -7],\n      [-27, 8],\n      [-12, 0],\n      [-28, 20],\n      [-42, -4],\n      [4, 9],\n      [14, 4],\n      [10, 10],\n      [2, 11],\n      [-13, -6],\n      [-9, 29],\n      [-32, 1],\n      [-11, -4],\n      [-3, 8],\n      [23, 2],\n      [15, 8],\n      [25, -2],\n      [-21, 7],\n      [22, 16],\n      [-39, 7],\n      [-20, -9],\n      [-18, 6],\n      [7, 8],\n      [12, -7],\n      [-8, 15],\n      [17, -5],\n      [-9, 12],\n      [10, 17],\n      [20, -8],\n      [-5, 7],\n      [9, 16],\n      [11, -11],\n      [25, -14],\n      [-2, -19],\n      [9, -29],\n      [0, 13],\n      [9, 15],\n      [9, -10],\n      [5, 13],\n      [-5, 20],\n      [9, 3],\n      [13, -22],\n      [6, -1],\n      [-1, 19],\n      [22, 6],\n      [16, -26],\n      [-6, 27],\n      [10, -1],\n      [10, -11],\n      [12, 14],\n      [6, -6],\n      [13, 3],\n      [-3, 19],\n      [15, 2]\n    ],\n    [\n      [5993, 7068],\n      [-6, -5],\n      [0, -15]\n    ],\n    [\n      [5987, 7048],\n      [-10, 8],\n      [-6, -14],\n      [0, -19],\n      [6, -9],\n      [-7, -11],\n      [-2, -14],\n      [10, 1],\n      [5, 6]\n    ],\n    [\n      [5983, 6996],\n      [0, -9]\n    ],\n    [\n      [5983, 6987],\n      [0, -6]\n    ],\n    [\n      [5983, 6981],\n      [1, -8]\n    ],\n    [\n      [5984, 6973],\n      [-8, -34],\n      [0, -21],\n      [-6, -33]\n    ],\n    [\n      [5970, 6885],\n      [-2, -4]\n    ],\n    [\n      [5951, 6980],\n      [8, 18],\n      [-2, 4]\n    ],\n    [\n      [5957, 7002],\n      [7, 21],\n      [6, 44],\n      [5, 21]\n    ],\n    [\n      [5975, 7088],\n      [10, 0],\n      [1, 9],\n      [8, 10]\n    ],\n    [\n      [5994, 7107],\n      [-1, -9],\n      [3, -19],\n      [-3, -11]\n    ],\n    [\n      [5434, 7386],\n      [-12, -29],\n      [-3, -25],\n      [6, -18],\n      [-6, -11],\n      [1, -8],\n      [-10, 1],\n      [-8, 6],\n      [-3, 10],\n      [-7, 8],\n      [-7, -1],\n      [-25, 27],\n      [-10, 1],\n      [-4, 6],\n      [0, 19],\n      [7, 6],\n      [6, -6],\n      [4, 10],\n      [7, 1],\n      [10, -13],\n      [9, 4],\n      [9, -2],\n      [17, 10],\n      [4, -4],\n      [12, 11],\n      [3, -3]\n    ],\n    [\n      [5256, 7557],\n      [8, -6],\n      [8, -34],\n      [-5, -14],\n      [3, -13],\n      [-2, -30],\n      [-6, -24],\n      [-10, 6],\n      [-5, -19],\n      [-8, 0],\n      [-7, 17],\n      [5, 39],\n      [-4, 1],\n      [2, 23],\n      [-5, 17],\n      [-4, 0],\n      [2, 16],\n      [8, -2],\n      [9, 6],\n      [11, 17]\n    ],\n    [\n      [5380, 7862],\n      [-9, -16],\n      [7, -7],\n      [-4, -8],\n      [3, -12],\n      [8, -10],\n      [-5, -1]\n    ],\n    [\n      [5380, 7808],\n      [1, 7],\n      [-18, 1],\n      [-3, -5],\n      [-16, -12],\n      [-4, 2],\n      [-1, -16],\n      [9, -13],\n      [-6, -7],\n      [-2, -13],\n      [2, -18],\n      [8, -16],\n      [9, -7],\n      [19, -21],\n      [12, -54],\n      [18, -28],\n      [12, -11],\n      [25, 0],\n      [4, -9],\n      [-8, -15],\n      [19, -17],\n      [13, -7],\n      [14, -18],\n      [13, -8],\n      [0, -6],\n      [12, -15],\n      [2, -10],\n      [-4, -18],\n      [-9, 6],\n      [-5, 23],\n      [-11, 0],\n      [-14, 11],\n      [-11, -25],\n      [-2, -21],\n      [9, -5],\n      [9, -11],\n      [-1, -29],\n      [-11, -1],\n      [-5, -8],\n      [1, -18],\n      [-8, -10],\n      [-8, -20],\n      [-10, 4],\n      [0, 15],\n      [5, 3],\n      [3, 12],\n      [-3, 8],\n      [9, 5],\n      [2, 12],\n      [-4, 8],\n      [-2, 21],\n      [-4, 6],\n      [-2, 20],\n      [-7, 11],\n      [-5, -5],\n      [-12, 13],\n      [2, 8],\n      [-6, 18],\n      [-8, 1],\n      [-5, 8],\n      [-7, 3],\n      [-10, 22],\n      [-10, 1],\n      [-8, -3],\n      [-5, 11],\n      [-7, 2],\n      [-12, 24],\n      [-10, 10],\n      [-8, 18],\n      [-10, 5],\n      [-3, 12],\n      [-9, 9],\n      [1, 6],\n      [-8, 2],\n      [1, 18],\n      [-7, 17],\n      [0, 14],\n      [-5, 13],\n      [-7, 1],\n      [-16, 17],\n      [-15, 5],\n      [-14, -19],\n      [-3, -11],\n      [-17, -6]\n    ],\n    [\n      [5344, 7711],\n      [0, 0]\n    ],\n    [\n      [5345, 7596],\n      [0, 0]\n    ],\n    [\n      [2849, 6246],\n      [15, -3],\n      [3, -8],\n      [12, -7],\n      [4, -14],\n      [-9, -3],\n      [-10, 6],\n      [-1, -7],\n      [-6, 3],\n      [-1, -11],\n      [-7, 10],\n      [-8, -1],\n      [-7, 10],\n      [-3, 10],\n      [-8, 2],\n      [5, 12],\n      [10, 5],\n      [11, -4]\n    ],\n    [\n      [6087, 7032],\n      [-4, -6],\n      [-57, -30],\n      [15, -28],\n      [13, -29],\n      [-9, -10],\n      [-4, -18],\n      [-21, -8],\n      [-7, -22],\n      [-12, -17],\n      [-31, 9]\n    ],\n    [\n      [5970, 6873],\n      [0, 12]\n    ],\n    [\n      [5984, 6973],\n      [-1, 8]\n    ],\n    [\n      [5983, 6987],\n      [4, 0],\n      [0, 25]\n    ],\n    [\n      [5987, 7012],\n      [0, 36]\n    ],\n    [\n      [5993, 7068],\n      [7, -5],\n      [10, -16],\n      [12, -3],\n      [54, 61]\n    ],\n    [\n      [8563, 6721],\n      [-5, -10],\n      [-7, -5],\n      [-4, -21],\n      [0, 20],\n      [7, 8],\n      [-3, 7],\n      [7, -1],\n      [4, 12],\n      [1, -10]\n    ],\n    [\n      [8603, 6820],\n      [-13, -15],\n      [0, 9],\n      [11, 11],\n      [2, -5]\n    ],\n    [\n      [8624, 6937],\n      [5, -5],\n      [-7, -8],\n      [2, 13]\n    ],\n    [\n      [8639, 6942],\n      [-5, -5],\n      [6, 22],\n      [-1, -17]\n    ],\n    [\n      [8616, 7056],\n      [0, -12],\n      [-6, -7],\n      [1, 18],\n      [5, 1]\n    ],\n    [\n      [8578, 7069],\n      [-1, -10],\n      [-6, 2],\n      [7, 8]\n    ],\n    [\n      [8638, 7135],\n      [3, -16],\n      [7, -3],\n      [9, 6],\n      [1, -15],\n      [-5, -9],\n      [10, 1],\n      [0, -17],\n      [5, -2],\n      [-11, -22],\n      [-6, -38],\n      [0, -16],\n      [-3, -14],\n      [-7, 5],\n      [1, -11],\n      [-12, -13],\n      [2, 20],\n      [-5, 12],\n      [-2, -4],\n      [0, -22],\n      [-9, 5],\n      [4, 18],\n      [-5, 12],\n      [1, 21],\n      [2, -2],\n      [8, 19],\n      [-2, 11],\n      [3, 12],\n      [-5, 15],\n      [-8, 2],\n      [7, -19],\n      [-6, -11],\n      [1, 11],\n      [-10, -10],\n      [-6, 18],\n      [1, 10],\n      [4, -14],\n      [5, -1],\n      [-1, 10],\n      [-11, 11],\n      [1, 10],\n      [6, -2],\n      [18, 22],\n      [2, 9],\n      [6, 4],\n      [7, -3]\n    ],\n    [\n      [8726, 7162],\n      [8, -9],\n      [5, 1],\n      [-1, -13],\n      [4, -10],\n      [-10, -11],\n      [-5, -23],\n      [-8, 15],\n      [-5, 2],\n      [-13, -11],\n      [0, -7],\n      [-7, -11],\n      [-1, -16],\n      [-10, 0],\n      [3, 9],\n      [-6, 1],\n      [-6, 31],\n      [11, 14],\n      [2, 17],\n      [6, 6],\n      [5, -10],\n      [10, 2],\n      [3, 14],\n      [8, 9],\n      [7, 0]\n    ],\n    [\n      [8747, 7160],\n      [-3, -8],\n      [-3, 8],\n      [8, 15],\n      [-2, -15]\n    ],\n    [\n      [8595, 7181],\n      [-2, -23],\n      [-3, 4],\n      [1, 16],\n      [4, 3]\n    ],\n    [\n      [8845, 7375],\n      [1, -10],\n      [-6, -6],\n      [-1, 17],\n      [8, 13],\n      [-2, -14]\n    ],\n    [\n      [8923, 7564],\n      [5, 3],\n      [-1, -34],\n      [2, -14],\n      [8, -11],\n      [5, -22],\n      [4, -26],\n      [-5, -14],\n      [0, -12],\n      [-7, -6],\n      [-5, -25],\n      [1, -17],\n      [-6, 9],\n      [-7, -6],\n      [-3, -24],\n      [3, -14],\n      [-2, -39],\n      [-5, -8],\n      [-5, -19],\n      [-1, -20],\n      [8, -27],\n      [-11, -7],\n      [-2, -21],\n      [-16, -17],\n      [2, 30],\n      [5, 11],\n      [-8, 0],\n      [-4, -12],\n      [1, -16],\n      [-7, 11],\n      [-8, -5],\n      [0, -21],\n      [-9, -16],\n      [-1, 25],\n      [-6, 4],\n      [-6, -11],\n      [-4, -18],\n      [-17, 5],\n      [-15, -6],\n      [7, 9],\n      [-13, 1],\n      [0, 16],\n      [-5, -3],\n      [-3, -22],\n      [9, -9],\n      [1, -10],\n      [-7, 3],\n      [-10, -9],\n      [0, -10],\n      [-6, -8],\n      [-3, -15],\n      [-5, -7],\n      [-10, 5],\n      [-1, 8],\n      [-9, 11],\n      [3, 8],\n      [-3, 14],\n      [10, 17],\n      [-2, 9],\n      [-11, -4],\n      [-6, 7],\n      [-7, 0],\n      [-20, -18],\n      [-10, 1],\n      [-3, -9],\n      [-6, 2],\n      [-15, -9],\n      [-1, 9],\n      [-8, -6],\n      [-2, -24],\n      [-11, 13],\n      [-16, -7],\n      [-4, 7],\n      [-3, -8],\n      [-1, 25],\n      [3, 5],\n      [12, -1],\n      [3, 10],\n      [7, 5],\n      [17, 28],\n      [7, 7],\n      [-1, 9],\n      [17, 8],\n      [5, -8],\n      [24, 6],\n      [7, 7],\n      [11, -2],\n      [8, 7],\n      [-1, -12],\n      [13, -4],\n      [12, 10],\n      [-3, 18],\n      [5, 16],\n      [7, 8],\n      [10, 28],\n      [-1, 26],\n      [11, 10],\n      [6, 1],\n      [-3, -13],\n      [-9, -5],\n      [4, -6],\n      [-2, -13],\n      [10, -6],\n      [3, 10],\n      [21, 13],\n      [10, 12],\n      [10, 29],\n      [14, 15],\n      [1, 16],\n      [9, 23],\n      [3, 24],\n      [4, 10],\n      [1, 17],\n      [-4, 11],\n      [-5, -3],\n      [7, 19],\n      [1, 11],\n      [-5, 13],\n      [5, 10],\n      [7, 3],\n      [1, 26],\n      [9, -5],\n      [3, -20],\n      [3, 9],\n      [8, -6],\n      [3, 19],\n      [-13, -5],\n      [3, 23],\n      [10, -10]\n    ],\n    [\n      [8944, 7799],\n      [15, -24],\n      [4, -13],\n      [19, -27],\n      [11, -7],\n      [0, -6],\n      [12, 0],\n      [3, -7],\n      [13, -4],\n      [15, 25],\n      [1, -8],\n      [-7, -17],\n      [-1, -9],\n      [8, -28],\n      [8, 6],\n      [-4, -12],\n      [-6, 0],\n      [-8, -10],\n      [-27, -4],\n      [-11, -14],\n      [-8, -20],\n      [-3, -23],\n      [-8, 11],\n      [-14, 9],\n      [-8, 11],\n      [-12, 9],\n      [-8, -3],\n      [-12, -15],\n      [-9, 15],\n      [-5, 0],\n      [-6, -18],\n      [12, -8],\n      [13, -20],\n      [-13, -1],\n      [-8, -7],\n      [-6, -13],\n      [-7, 10],\n      [5, 14],\n      [-3, 17],\n      [-7, 6],\n      [3, 26],\n      [12, 7],\n      [5, 11],\n      [-5, 13],\n      [6, 8],\n      [8, -9],\n      [10, -3],\n      [7, 10],\n      [-3, 22],\n      [9, 14],\n      [0, 22],\n      [3, 6],\n      [1, 20],\n      [-6, 23],\n      [3, 12],\n      [9, 3]\n    ],\n    [\n      [6762, 7807],\n      [-15, 8],\n      [-3, 11],\n      [1, 13],\n      [12, 14],\n      [11, -3],\n      [7, -11],\n      [1, -13],\n      [-4, -11],\n      [-10, -8]\n    ],\n    [\n      [7140, 7205],\n      [-9, 31]\n    ],\n    [\n      [6651, 7782],\n      [-20, 19]\n    ],\n    [\n      [6631, 7801],\n      [12, 18],\n      [8, -37]\n    ],\n    [\n      [7227, 7611],\n      [-6, 13],\n      [-15, 4],\n      [-12, 17],\n      [-14, 6],\n      [-14, 0],\n      [-19, 2],\n      [-14, 5],\n      [-13, -5],\n      [-16, 1],\n      [-3, -6],\n      [-13, 2],\n      [-12, 8],\n      [-12, 13],\n      [-21, -10],\n      [-5, -27],\n      [3, -9],\n      [-22, 14],\n      [-27, 9],\n      [-10, -1],\n      [-10, -13],\n      [-5, -15],\n      [3, -3]\n    ],\n    [\n      [6970, 7616],\n      [-6, -3],\n      [-4, -11],\n      [-4, 5],\n      [-9, -16],\n      [-20, -15],\n      [0, -5],\n      [-10, -5],\n      [0, -10],\n      [-13, -17],\n      [1, -19],\n      [-4, 0],\n      [-13, 13],\n      [4, 14],\n      [-5, 7],\n      [-33, -3],\n      [-5, 20],\n      [-2, 30],\n      [-14, 0],\n      [2, 57],\n      [-8, -7],\n      [-8, 26],\n      [-7, 5],\n      [-10, 19],\n      [-12, -10],\n      [-37, 4],\n      [-32, -8],\n      [-23, 38],\n      [-2, 12],\n      [-28, 28]\n    ],\n    [\n      [6668, 7765],\n      [0, 34],\n      [-2, 9],\n      [-7, -1],\n      [3, 20],\n      [17, -5],\n      [8, 16],\n      [12, 7],\n      [2, 14],\n      [-11, 2],\n      [-3, 9],\n      [-13, 3],\n      [-8, -7],\n      [4, -13],\n      [17, 0],\n      [2, -11],\n      [-4, -6],\n      [-24, 2],\n      [-2, 12],\n      [-7, 0],\n      [7, -14],\n      [-3, -17],\n      [-8, -6],\n      [-4, 5],\n      [4, 13],\n      [-15, -3],\n      [-6, -23]\n    ],\n    [\n      [6627, 7805],\n      [-73, -31],\n      [0, -212]\n    ],\n    [\n      [6554, 7562],\n      [-14, -3],\n      [-15, 32],\n      [0, 6],\n      [-20, 23],\n      [-20, -3],\n      [-14, -9],\n      [-15, -21]\n    ],\n    [\n      [6456, 7587],\n      [-1, 20],\n      [6, 15],\n      [3, 22],\n      [-15, 9],\n      [-8, -3],\n      [-6, 18],\n      [-12, 0],\n      [1, 23],\n      [-4, 4],\n      [-8, 33],\n      [-17, 9],\n      [1, 17],\n      [16, -1],\n      [4, -6],\n      [16, -2],\n      [-17, 20],\n      [12, 28],\n      [9, 5],\n      [22, 0],\n      [11, -6],\n      [10, 2],\n      [-15, 10],\n      [0, 6],\n      [9, 18],\n      [4, 40],\n      [-8, 19],\n      [-13, 2],\n      [-10, -10],\n      [-16, 14],\n      [-9, 3],\n      [-12, -11],\n      [-9, -2],\n      [-18, -21],\n      [-13, 2],\n      [-2, -14]\n    ],\n    [\n      [6367, 7850],\n      [-9, 9],\n      [-10, 5],\n      [0, 12],\n      [6, -6],\n      [7, 6],\n      [-9, 19],\n      [-4, 15],\n      [-14, 23],\n      [-11, 0],\n      [-7, 5],\n      [-1, -9],\n      [-7, 7],\n      [0, 26],\n      [-18, 8],\n      [8, 30],\n      [8, 10],\n      [-7, 14],\n      [3, 28],\n      [12, 12],\n      [-1, 14],\n      [9, 9],\n      [22, -37],\n      [13, 11],\n      [-5, 20],\n      [0, 13],\n      [20, 17],\n      [0, 15],\n      [11, 0],\n      [15, 12],\n      [6, 17],\n      [5, 6],\n      [14, -3],\n      [1, -11],\n      [11, -1],\n      [6, 12],\n      [11, 6],\n      [5, -16],\n      [23, 0],\n      [9, -7],\n      [1, -9],\n      [7, -1],\n      [6, -13],\n      [10, -7],\n      [-3, -16],\n      [8, 2],\n      [1, 24],\n      [10, -13],\n      [16, -15],\n      [13, 11],\n      [11, 20],\n      [18, 0],\n      [5, -11],\n      [11, 1],\n      [1, 13],\n      [22, -4],\n      [0, -11],\n      [10, -11],\n      [16, -3],\n      [1, -9],\n      [7, 4],\n      [5, 18],\n      [9, -10],\n      [15, -1],\n      [17, 10],\n      [2, 19],\n      [4, 6],\n      [-7, 11],\n      [-10, 1],\n      [-3, 8],\n      [-16, 3],\n      [3, 8],\n      [-12, 4],\n      [11, 15],\n      [7, 1],\n      [10, 11],\n      [-10, 23],\n      [22, 16],\n      [17, -3],\n      [1, 7],\n      [-13, 9],\n      [-14, 3],\n      [2, 12],\n      [-6, 8],\n      [5, 11],\n      [-6, 3],\n      [12, 10],\n      [4, -6],\n      [43, 7],\n      [25, 14],\n      [25, 5],\n      [9, -4],\n      [-1, 10],\n      [7, 7],\n      [15, -1],\n      [15, 6],\n      [33, 8],\n      [13, 6],\n      [2, 13],\n      [10, 0],\n      [2, 9],\n      [8, -4],\n      [-1, 9],\n      [8, -6],\n      [13, 0],\n      [14, -11],\n      [8, 9],\n      [14, -12],\n      [1, -18],\n      [6, -3],\n      [-1, -23],\n      [-6, 0],\n      [6, -13],\n      [3, 6],\n      [11, -4],\n      [10, 5],\n      [3, 9],\n      [9, -14],\n      [-3, -13],\n      [9, 3],\n      [-4, 10],\n      [11, -1],\n      [3, -8],\n      [11, -2],\n      [8, 7],\n      [-3, -12],\n      [-6, 1],\n      [-6, -17],\n      [6, -8],\n      [13, 12],\n      [14, -10],\n      [1, 12],\n      [9, 9],\n      [7, -2],\n      [12, 11],\n      [-2, 4],\n      [31, 15],\n      [12, 8],\n      [-7, -19],\n      [-8, 1],\n      [3, -9],\n      [34, -36],\n      [7, -11],\n      [42, -97],\n      [12, -38],\n      [15, 7],\n      [-1, 14],\n      [6, 6],\n      [15, -7],\n      [-3, -15],\n      [9, 2],\n      [2, -13],\n      [11, 3],\n      [6, -4],\n      [17, 5],\n      [18, 12],\n      [13, -7],\n      [11, -20],\n      [0, -15],\n      [23, -14],\n      [-2, -7],\n      [9, -19],\n      [19, -1],\n      [6, -7],\n      [12, 20],\n      [0, -10],\n      [12, -22],\n      [7, -9]\n    ],\n    [\n      [6163, 5412],\n      [-17, -50],\n      [-9, -17],\n      [0, -175],\n      [1, -39],\n      [15, -39],\n      [0, -7]\n    ],\n    [\n      [6153, 5085],\n      [-6, -15],\n      [-9, -4],\n      [-4, -20],\n      [-5, -9],\n      [-5, 0],\n      [-9, -13],\n      [2, -12],\n      [-3, -18],\n      [-6, -12],\n      [-3, -25],\n      [-4, -11],\n      [-7, -30],\n      [-6, -3]\n    ],\n    [\n      [6088, 4913],\n      [-21, 33],\n      [-19, 27],\n      [-5, 13],\n      [4, 6],\n      [-1, 14],\n      [-100, 116]\n    ],\n    [\n      [5946, 5122],\n      [3, 12],\n      [-4, 7],\n      [0, 10],\n      [4, 7],\n      [9, -1],\n      [-2, 6],\n      [11, 4],\n      [-4, 11],\n      [-10, -6],\n      [2, -6],\n      [-9, 7],\n      [-3, 12],\n      [1, 12]\n    ],\n    [\n      [5944, 5197],\n      [4, 21],\n      [7, 12],\n      [2, 15],\n      [9, 9],\n      [2, 18],\n      [3, 6],\n      [0, 26],\n      [-3, 18],\n      [2, 3],\n      [-14, 40],\n      [-2, 17],\n      [2, 13],\n      [-8, 5],\n      [-3, 24],\n      [-2, 2]\n    ],\n    [\n      [5943, 5426],\n      [11, 23],\n      [15, 14],\n      [14, 9],\n      [4, -7],\n      [2, -16],\n      [8, 0]\n    ],\n    [\n      [7045, 7454],\n      [-13, -5],\n      [-15, 2],\n      [-9, -5],\n      [-2, -6],\n      [-5, 10],\n      [-7, -7],\n      [-2, 12],\n      [-8, 8],\n      [-12, -11],\n      [-8, -1],\n      [-4, 11],\n      [-36, -5],\n      [-2, 14],\n      [7, 20],\n      [14, 6],\n      [18, -12],\n      [1, 7],\n      [8, 8]\n    ],\n    [\n      [6970, 7500],\n      [12, 3],\n      [11, -7],\n      [9, 15],\n      [8, -3],\n      [0, 14],\n      [7, -6],\n      [4, 9],\n      [10, 8],\n      [-13, 3],\n      [-5, 9],\n      [-9, -1],\n      [0, 10],\n      [-8, 0],\n      [-6, 22],\n      [-1, -10],\n      [-6, -2],\n      [0, -13],\n      [-6, -1],\n      [-12, 7],\n      [-4, 14],\n      [-4, -4],\n      [-9, 10],\n      [8, 7],\n      [22, 29],\n      [-8, 3]\n    ],\n    [\n      [6976, 7489],\n      [-6, 4],\n      [2, -14],\n      [4, 10]\n    ],\n    [\n      [6993, 7480],\n      [0, 0]\n    ],\n    [\n      [6961, 7477],\n      [0, 0]\n    ],\n    [\n      [7901, 5783],\n      [-6, 7],\n      [-11, 2],\n      [-7, -4],\n      [-3, 5],\n      [5, 13],\n      [0, 15],\n      [-4, 5],\n      [-3, -16],\n      [-9, 2],\n      [-2, 38],\n      [-3, 3]\n    ],\n    [\n      [7858, 5853],\n      [0, 7],\n      [-6, 22],\n      [0, 22],\n      [-6, 7],\n      [0, 21],\n      [-3, 7],\n      [-2, 25],\n      [6, 0],\n      [10, 26],\n      [1, 11],\n      [9, 8],\n      [12, 5],\n      [9, -5],\n      [5, 3],\n      [11, -2],\n      [5, 4],\n      [6, -3],\n      [2, -10],\n      [4, 8]\n    ],\n    [\n      [7921, 6009],\n      [3, -14],\n      [13, -1],\n      [3, -9],\n      [6, -1],\n      [2, 7],\n      [-6, 19],\n      [7, 7],\n      [6, -2],\n      [3, 6],\n      [8, -14],\n      [4, 0],\n      [8, 11],\n      [5, 2],\n      [2, 10]\n    ],\n    [\n      [7985, 6030],\n      [0, -14],\n      [-3, -2],\n      [-2, -19],\n      [3, -10],\n      [0, -10],\n      [5, -22],\n      [-5, -20],\n      [4, -24],\n      [-2, -15],\n      [-2, -6],\n      [-4, 5],\n      [-8, -14],\n      [-8, -7],\n      [-8, -1],\n      [0, -17],\n      [-11, 7],\n      [-4, -13],\n      [-1, -15],\n      [9, -13],\n      [1, -17],\n      [-9, 3],\n      [-3, 10],\n      [-10, -2],\n      [-3, -7],\n      [-7, 6],\n      [1, -11],\n      [-6, -13],\n      [-9, 0],\n      [-2, -6]\n    ],\n    [\n      [627, 5299],\n      [5, -18],\n      [-8, 8],\n      [3, 10]\n    ],\n    [\n      [8522, 7115],\n      [1, -14],\n      [-17, -6],\n      [-2, 8],\n      [5, 8],\n      [13, 4]\n    ],\n    [\n      [8508, 7172],\n      [1, -8],\n      [-7, 2],\n      [6, 6]\n    ],\n    [\n      [8575, 7196],\n      [-1, -14],\n      [-5, 11],\n      [6, 3]\n    ],\n    [\n      [8518, 7361],\n      [8, 22],\n      [5, 6],\n      [27, 0],\n      [7, 17]\n    ],\n    [\n      [8565, 7406],\n      [7, -27],\n      [14, -31],\n      [6, -25],\n      [4, -25],\n      [-2, -7],\n      [-1, -33],\n      [4, -6],\n      [-2, -25],\n      [-9, -23],\n      [-18, 0],\n      [-1, -15],\n      [-3, 6],\n      [-17, 1],\n      [-2, -20],\n      [-4, 14],\n      [0, -13],\n      [-5, -9],\n      [-3, 13],\n      [-6, -5],\n      [-3, -11],\n      [-4, 3],\n      [-4, -10],\n      [-2, 15],\n      [-7, 2],\n      [0, 9],\n      [6, -7],\n      [2, 11],\n      [-4, 1],\n      [-2, 18],\n      [2, 17],\n      [6, 9],\n      [-4, 4],\n      [8, 7],\n      [-7, 10],\n      [5, 1],\n      [-5, 11],\n      [-1, 31],\n      [-3, 8],\n      [3, 12],\n      [7, -1],\n      [-6, 42],\n      [4, 3]\n    ],\n    [\n      [5598, 7616],\n      [-9, -9],\n      [-3, 6],\n      [-10, -8],\n      [0, -11],\n      [-5, 0]\n    ],\n    [\n      [5557, 7633],\n      [8, 15]\n    ],\n    [\n      [5565, 7648],\n      [9, 17],\n      [-2, 6],\n      [14, -7],\n      [8, -19],\n      [10, -5],\n      [-6, -24]\n    ],\n    [\n      [6338, 6909],\n      [5, -15],\n      [-4, -7],\n      [-5, 12],\n      [4, 10]\n    ],\n    [\n      [6345, 6826],\n      [-22, 0],\n      [-6, 27],\n      [-25, 5]\n    ],\n    [\n      [6331, 6910],\n      [7, -26],\n      [-6, 2],\n      [-7, -12],\n      [10, -1],\n      [2, -19],\n      [8, -28]\n    ],\n    [\n      [7836, 6473],\n      [2, -9],\n      [8, -12],\n      [6, -22],\n      [2, 9],\n      [5, -5],\n      [0, -9],\n      [-2, -23],\n      [7, -19],\n      [15, -11],\n      [2, 8],\n      [9, 10],\n      [5, -4],\n      [9, -13],\n      [-1, -9],\n      [-6, -3],\n      [9, -6],\n      [0, -8],\n      [7, -2],\n      [0, -11],\n      [-2, -10],\n      [-9, -12],\n      [-8, 6],\n      [-4, -15],\n      [-6, -7],\n      [18, -21],\n      [4, -8],\n      [9, -5],\n      [5, -6],\n      [-2, -12],\n      [6, -14],\n      [5, 0],\n      [7, -30],\n      [13, -24],\n      [9, -17],\n      [0, -18],\n      [4, -11],\n      [5, 5],\n      [4, -14],\n      [8, -12],\n      [4, -1],\n      [-1, -8],\n      [-6, -5],\n      [2, -12],\n      [7, -8],\n      [5, -12],\n      [-5, -33]\n    ],\n    [\n      [7921, 6009],\n      [9, 11],\n      [0, 20],\n      [1, 5],\n      [-3, 11],\n      [3, 6],\n      [2, 24],\n      [-5, 5],\n      [0, 13],\n      [-11, 7],\n      [0, 8],\n      [-8, 15],\n      [0, 29],\n      [2, 20],\n      [-3, 9],\n      [-7, 7],\n      [-6, 14],\n      [-7, 24],\n      [-18, 8],\n      [-2, -10],\n      [-9, -15],\n      [-9, -6],\n      [-16, 16],\n      [-4, -9],\n      [-19, -26],\n      [-4, -7],\n      [-5, 6],\n      [3, 19],\n      [4, 9],\n      [0, 17],\n      [-3, 3],\n      [5, 14],\n      [0, 15],\n      [3, 7],\n      [-3, 6],\n      [-1, 19],\n      [2, 7],\n      [-12, 2],\n      [-2, -7],\n      [-7, 0],\n      [-3, 9],\n      [3, 29],\n      [-5, 15],\n      [-6, -5]\n    ],\n    [\n      [7780, 6353],\n      [0, 15],\n      [7, 14],\n      [4, -1],\n      [0, 13],\n      [6, 16],\n      [3, 0],\n      [9, 14]\n    ],\n    [\n      [5975, 7088],\n      [14, 52],\n      [1, 19],\n      [9, 12],\n      [0, 7]\n    ],\n    [\n      [5999, 7178],\n      [13, -3],\n      [4, -23],\n      [-9, -14],\n      [2, -8],\n      [-6, 2],\n      [-6, -12],\n      [3, -5],\n      [-6, -8]\n    ],\n    [\n      [4790, 5433],\n      [-19, 13],\n      [-21, 22],\n      [-9, 12],\n      [-21, 40],\n      [-9, 19],\n      [-12, 7],\n      [-1, 10],\n      [-14, 13],\n      [-3, 12]\n    ],\n    [\n      [4681, 5581],\n      [3, 14],\n      [6, 12],\n      [15, 23],\n      [0, 16],\n      [8, 8],\n      [1, 17]\n    ],\n    [\n      [5693, 6449],\n      [0, -115],\n      [-27, 0],\n      [0, -28]\n    ],\n    [\n      [5666, 6306],\n      [-66, 66],\n      [-3, 4],\n      [-45, 45],\n      [-34, 36],\n      [-45, 45],\n      [-30, 31],\n      [-27, -26]\n    ],\n    [\n      [5416, 6507],\n      [-22, -22],\n      [-20, 33],\n      [-42, 19]\n    ],\n    [\n      [5264, 6924],\n      [10, 7],\n      [11, 30],\n      [-5, 31],\n      [6, 17],\n      [5, 1],\n      [10, 22],\n      [19, 18],\n      [-2, 10],\n      [1, 34]\n    ],\n    [\n      [5319, 7094],\n      [10, -6],\n      [12, -14],\n      [15, -2],\n      [14, 6],\n      [6, -6],\n      [17, -5],\n      [8, -12],\n      [20, -6],\n      [5, -13],\n      [0, -14],\n      [7, -25],\n      [4, -7],\n      [17, -9],\n      [10, 0],\n      [18, -8],\n      [23, -18],\n      [3, -7],\n      [18, -22],\n      [8, 0],\n      [14, 14],\n      [10, 24],\n      [1, 18],\n      [-6, 24],\n      [0, 16],\n      [3, 12],\n      [15, 24],\n      [14, 13],\n      [10, 1],\n      [5, 7],\n      [21, -3],\n      [21, -14],\n      [-1, -18],\n      [6, -6],\n      [19, -7],\n      [2, -5],\n      [25, -2],\n      [5, -18]\n    ],\n    [\n      [3307, 5973],\n      [-4, 11],\n      [5, 10],\n      [-1, -21]\n    ],\n    [\n      [7235, 5735],\n      [7, -13],\n      [17, -49],\n      [5, -36],\n      [5, -8],\n      [4, -24],\n      [0, -20],\n      [-2, -22],\n      [-12, -22],\n      [-22, -17],\n      [-9, 5],\n      [-4, 7],\n      [-7, 43],\n      [-1, 50],\n      [1, 40],\n      [2, 10],\n      [0, 17],\n      [6, 17],\n      [-2, 7],\n      [4, 10],\n      [6, 1],\n      [-14, 10],\n      [2, 7],\n      [7, -3],\n      [7, -10]\n    ],\n    [\n      [5798, 3530],\n      [6, -12],\n      [10, -10],\n      [3, -14],\n      [-4, -17],\n      [-5, -7],\n      [1, -10],\n      [-8, -9],\n      [-13, -4],\n      [-5, -7],\n      [-4, -22],\n      [-8, 2],\n      [-16, 35],\n      [-5, 22],\n      [8, 6],\n      [12, 35],\n      [8, 2],\n      [4, 10],\n      [13, 8],\n      [3, -8]\n    ],\n    [\n      [5582, 8366],\n      [-1, 0]\n    ],\n    [\n      [5581, 8366],\n      [1, 0]\n    ],\n    [\n      [5652, 8289],\n      [0, 9],\n      [-14, 16],\n      [-6, -1]\n    ],\n    [\n      [5632, 8313],\n      [-3, 6],\n      [5, 24],\n      [-8, 11],\n      [-15, 1],\n      [-21, 9]\n    ],\n    [\n      [5590, 8364],\n      [-6, 32],\n      [0, 16]\n    ],\n    [\n      [5584, 8412],\n      [8, 9],\n      [22, 11],\n      [15, -4],\n      [8, 3],\n      [29, -5],\n      [4, -4],\n      [22, 8],\n      [5, -12],\n      [15, -2],\n      [26, -28]\n    ],\n    [\n      [5759, 8496],\n      [14, -14],\n      [-6, -26],\n      [14, -17],\n      [0, -23]\n    ],\n    [\n      [5584, 8412],\n      [-2, 19],\n      [2, 24],\n      [10, 12],\n      [0, 15],\n      [8, 15],\n      [22, 11],\n      [18, -21],\n      [4, -17],\n      [12, -7],\n      [19, 15],\n      [-2, 37]\n    ],\n    [\n      [3249, 6221],\n      [-2, 2]\n    ],\n    [\n      [3247, 6223],\n      [2, -2]\n    ],\n    [\n      [4851, 7247],\n      [2, -14],\n      [14, -21],\n      [11, -5],\n      [19, 8],\n      [6, -5],\n      [15, 7]\n    ],\n    [\n      [4919, 7214],\n      [2, -9],\n      [17, -2]\n    ],\n    [\n      [4758, 6776],\n      [-3, 0],\n      [1, -30],\n      [-18, -3],\n      [-7, -11],\n      [-16, -2],\n      [-9, 7],\n      [-10, 1],\n      [-13, -7],\n      [2, -15],\n      [-4, -6],\n      [-8, -25],\n      [-8, -3],\n      [-4, -23],\n      [-3, -30],\n      [-3, -13],\n      [-6, -12],\n      [-12, -16],\n      [-6, -22],\n      [-16, -16],\n      [-4, -13],\n      [-6, -53],\n      [0, -16],\n      [-12, -26],\n      [1, -7],\n      [-4, -14],\n      [-11, -4],\n      [-22, 4],\n      [-18, -1],\n      [-12, -4]\n    ],\n    [\n      [4527, 6416],\n      [1, 21],\n      [4, 20],\n      [10, 13],\n      [4, 26],\n      [5, 11],\n      [-2, 5],\n      [13, 42],\n      [-4, 0],\n      [8, 12],\n      [11, 26],\n      [5, 4],\n      [5, 17],\n      [0, 22],\n      [10, 45],\n      [0, 9],\n      [9, 16],\n      [7, 4],\n      [10, 14],\n      [10, 53],\n      [7, 16],\n      [24, 8],\n      [16, 14],\n      [11, 23],\n      [15, 15],\n      [21, 49],\n      [5, 19],\n      [1, 14],\n      [-7, 13],\n      [0, 26],\n      [2, 26],\n      [3, 11],\n      [9, 18],\n      [3, 24],\n      [-1, 7],\n      [11, 17],\n      [10, 23],\n      [26, 19],\n      [21, 25],\n      [15, 48],\n      [2, 15],\n      [9, 39],\n      [14, 7]\n    ],\n    [\n      [5206, 7702],\n      [-2, -1]\n    ],\n    [\n      [5783, 7801],\n      [-3, 21],\n      [1, 26],\n      [3, 22],\n      [-4, 18],\n      [-6, 5],\n      [-17, 36],\n      [-10, 30],\n      [-8, 3]\n    ],\n    [\n      [5739, 7962],\n      [20, 10],\n      [14, -2],\n      [6, -9],\n      [21, -8],\n      [10, -13],\n      [-1, -25],\n      [7, -10],\n      [5, 2],\n      [0, -20],\n      [10, -9],\n      [-1, -16],\n      [6, -9],\n      [-15, 0],\n      [-3, 6],\n      [-7, -6],\n      [-1, 9],\n      [-7, -4],\n      [1, -26],\n      [-13, -19],\n      [0, -11],\n      [-8, -1]\n    ],\n    [\n      [6384, 4200],\n      [0, 8],\n      [5, 14],\n      [-5, -22]\n    ],\n    [\n      [6370, 4487],\n      [-2, -11],\n      [7, -4],\n      [1, -18],\n      [7, -8],\n      [4, -13],\n      [-1, -9],\n      [5, -25],\n      [3, -37],\n      [0, -29],\n      [8, -27],\n      [-4, -34],\n      [-3, -9],\n      [-6, 7],\n      [-3, 25],\n      [-8, -7],\n      [3, -23],\n      [-2, -5],\n      [5, -11],\n      [-1, -25],\n      [-5, -13],\n      [-6, -24],\n      [2, -29],\n      [-4, -39],\n      [-3, -11],\n      [-10, -59],\n      [-2, -19],\n      [-7, -32],\n      [-3, -29],\n      [-10, -57],\n      [-4, -16],\n      [-2, -24],\n      [-7, -48],\n      [-1, -16],\n      [-4, -13],\n      [-8, -47],\n      [-14, -15],\n      [-11, -2],\n      [-13, -11],\n      [-6, -9],\n      [-12, -2],\n      [-11, 17],\n      [-10, 2],\n      [-10, 15],\n      [-2, 20],\n      [-7, 14],\n      [-1, 45],\n      [3, 10],\n      [-4, 6],\n      [-1, 16],\n      [-6, 12],\n      [-4, 36],\n      [3, 27],\n      [4, 6],\n      [0, 17],\n      [7, 4],\n      [11, 46],\n      [4, 7],\n      [6, 29],\n      [-3, 4],\n      [2, 24],\n      [-6, 18],\n      [1, 16],\n      [-6, 22],\n      [-1, 35],\n      [-3, 15],\n      [15, 49],\n      [0, 30],\n      [12, -1],\n      [11, 16],\n      [10, -2],\n      [0, 7],\n      [8, 4],\n      [4, -6],\n      [1, 9],\n      [6, 5],\n      [18, 25],\n      [3, -7],\n      [-3, -10],\n      [7, 2],\n      [-4, 18],\n      [4, 5],\n      [2, 12],\n      [6, 8],\n      [-3, -22],\n      [11, 28],\n      [-3, 11],\n      [3, 11],\n      [4, -2],\n      [3, 11],\n      [-4, 9],\n      [0, 19],\n      [7, -1],\n      [1, -10],\n      [4, -1],\n      [0, 14],\n      [5, 1],\n      [-1, 9],\n      [6, -4],\n      [3, 5],\n      [1, 16],\n      [3, 8],\n      [-2, 22],\n      [3, 13],\n      [5, 4],\n      [3, 18],\n      [2, -8]\n    ],\n    [\n      [2590, 6367],\n      [-7, -17],\n      [2, 17],\n      [5, 0]\n    ],\n    [\n      [1889, 6595],\n      [7, -4],\n      [1, -9],\n      [-8, 13]\n    ],\n    [\n      [1800, 6801],\n      [-5, -1],\n      [5, 12],\n      [0, -11]\n    ],\n    [\n      [1880, 6866],\n      [3, -12],\n      [-3, -16],\n      [-7, 7],\n      [2, 17],\n      [5, 4]\n    ],\n    [\n      [1847, 6884],\n      [4, -14],\n      [5, -1],\n      [2, -17],\n      [-11, 17],\n      [-3, 9],\n      [3, 6]\n    ],\n    [\n      [2186, 6889],\n      [0, -8],\n      [7, -2]\n    ],\n    [\n      [2193, 6879],\n      [11, -20],\n      [1, -12],\n      [9, -31],\n      [6, -12],\n      [9, -27],\n      [7, -6],\n      [-1, -15],\n      [2, -15]\n    ],\n    [\n      [2237, 6741],\n      [3, -16],\n      [3, 2],\n      [2, -14]\n    ],\n    [\n      [2245, 6713],\n      [2, -9],\n      [20, -12],\n      [4, -8],\n      [16, -2],\n      [9, -10],\n      [5, 6]\n    ],\n    [\n      [2301, 6678],\n      [0, -14],\n      [-8, -31],\n      [-6, -38],\n      [-2, -30],\n      [-1, -43],\n      [1, -16],\n      [-4, -22],\n      [3, -29],\n      [5, -34],\n      [15, -57],\n      [9, -17],\n      [9, -27],\n      [3, -25],\n      [5, -5],\n      [1, -9],\n      [7, -19],\n      [7, -4],\n      [11, 2],\n      [5, -9],\n      [6, -2],\n      [8, -21],\n      [10, 3],\n      [16, 11],\n      [17, 3],\n      [15, 13],\n      [10, 2],\n      [6, -12],\n      [10, -3],\n      [6, 17],\n      [-5, 8],\n      [14, 16],\n      [5, 11],\n      [1, 21],\n      [7, 14],\n      [-1, 6],\n      [1, 39],\n      [3, 15],\n      [16, 17],\n      [19, 4],\n      [17, 12],\n      [14, 2],\n      [20, -9],\n      [6, 9],\n      [6, -10],\n      [2, -17],\n      [-3, -16],\n      [-9, -18],\n      [-7, -19],\n      [-1, -19],\n      [-8, -16],\n      [9, -8],\n      [-6, -40],\n      [-3, -10],\n      [-2, -23],\n      [-3, 14],\n      [-4, 3],\n      [2, 18],\n      [-5, -4],\n      [-3, -15]\n    ],\n    [\n      [2437, 6020],\n      [-20, 42],\n      [-19, 33],\n      [-11, 16],\n      [-10, 10],\n      [-1, -6],\n      [-8, 1],\n      [-4, 13],\n      [-5, -9],\n      [9, -4],\n      [-11, -1],\n      [-8, -12],\n      [-15, -9],\n      [-7, -8],\n      [-8, -2],\n      [-15, 10],\n      [-4, 6],\n      [-17, 3],\n      [-8, 13],\n      [-13, 6],\n      [-6, 14],\n      [-5, 0],\n      [-15, 8],\n      [-5, 0],\n      [-5, 9],\n      [-31, 22],\n      [-6, 11],\n      [-13, 14],\n      [-4, 13],\n      [-7, 6],\n      [-5, -4],\n      [-32, 20],\n      [-8, 21],\n      [-9, 14],\n      [-12, 13],\n      [-15, 12],\n      [-3, 14],\n      [-5, 6],\n      [-8, 22],\n      [0, 10],\n      [-4, 8],\n      [3, 8],\n      [10, 6],\n      [-7, 15],\n      [7, 12],\n      [1, 22],\n      [-6, 8],\n      [-7, 23],\n      [-2, 32],\n      [-9, 17],\n      [-15, 34],\n      [-12, 32],\n      [-21, 28],\n      [7, -7],\n      [0, 9],\n      [-5, -1],\n      [-9, 13],\n      [-6, 18],\n      [7, 0],\n      [-22, 24],\n      [0, 5],\n      [-9, -3],\n      [6, 9],\n      [-7, -1],\n      [-8, 9],\n      [0, 14],\n      [4, 9],\n      [0, 19],\n      [-4, 9],\n      [-10, 3],\n      [-5, 23],\n      [-9, 2],\n      [-7, 13],\n      [-2, 26],\n      [2, 3],\n      [-14, 4],\n      [-8, 12],\n      [-5, 13],\n      [-5, 5],\n      [-13, 29],\n      [-2, 20],\n      [-5, 2],\n      [1, 9],\n      [-11, 23],\n      [0, 16],\n      [-10, 36],\n      [3, 20],\n      [-16, 10],\n      [-1, 10],\n      [-7, 6],\n      [-9, -6],\n      [-10, 15],\n      [-8, 2],\n      [0, -41],\n      [4, -8],\n      [3, -27],\n      [-1, -19],\n      [7, -21],\n      [4, -1],\n      [17, -27],\n      [3, -23],\n      [7, -3],\n      [11, -32],\n      [3, -25],\n      [4, -12],\n      [8, -6],\n      [4, -20],\n      [6, -7],\n      [-1, -6],\n      [8, -25],\n      [-3, 20],\n      [8, -10],\n      [0, -9],\n      [5, -13],\n      [1, -29],\n      [9, -25],\n      [10, -36],\n      [-2, -15],\n      [3, -15],\n      [8, -8],\n      [0, 13],\n      [14, -16],\n      [4, -23],\n      [7, -10],\n      [0, -14],\n      [-11, -19],\n      [-7, 0],\n      [-6, 36],\n      [-8, 9],\n      [-12, 22],\n      [-14, 16],\n      [-5, 14],\n      [-4, -3],\n      [-4, 14],\n      [-3, -1],\n      [-2, 25],\n      [3, 3],\n      [0, 27],\n      [-9, 30],\n      [-3, 0],\n      [-17, 21],\n      [-1, 21],\n      [-4, -13],\n      [-10, -1],\n      [-5, 13],\n      [-8, 9],\n      [-10, 6],\n      [0, 9],\n      [-16, 20],\n      [-1, 8],\n      [15, -5],\n      [7, 6],\n      [5, -13],\n      [-1, 17],\n      [2, 28],\n      [-9, 26],\n      [-4, 3],\n      [-12, 26],\n      [-6, 2],\n      [-14, 19],\n      [-4, 12],\n      [0, 19],\n      [-5, 4],\n      [-1, 26],\n      [-7, 9],\n      [0, 11],\n      [-10, 22],\n      [1, 15],\n      [-8, 14],\n      [-6, 28]\n    ],\n    [\n      [1746, 7056],\n      [66, 10],\n      [-1, -12],\n      [46, -30],\n      [58, -37],\n      [79, 0],\n      [0, 26],\n      [46, 0],\n      [11, -20],\n      [8, -8],\n      [14, -26],\n      [6, -4],\n      [7, -12],\n      [6, -21],\n      [-1, -10],\n      [5, -21],\n      [14, -20],\n      [25, -19],\n      [8, 14],\n      [4, 30],\n      [8, 2],\n      [3, 6],\n      [5, -5],\n      [20, -2],\n      [3, -8]\n    ],\n    [\n      [2290, 6649],\n      [-4, -5],\n      [0, -32],\n      [-2, -53],\n      [6, 67],\n      [4, 13],\n      [-4, 10]\n    ],\n    [\n      [5582, 7536],\n      [0, 0]\n    ],\n    [\n      [5586, 7536],\n      [-4, 1]\n    ],\n    [\n      [5581, 7537],\n      [0, 0]\n    ],\n    [\n      [5575, 7539],\n      [-2, 10]\n    ],\n    [\n      [5598, 7616],\n      [20, 7],\n      [2, -4]\n    ],\n    [\n      [5117, 6285],\n      [0, -124],\n      [-1, -33],\n      [-4, -7],\n      [-4, -29],\n      [-11, -17],\n      [0, -8],\n      [-14, 4],\n      [0, -5],\n      [-47, -3],\n      [-9, -17],\n      [-9, -3],\n      [-13, 3],\n      [1, -5]\n    ],\n    [\n      [4683, 5897],\n      [-1, 36],\n      [-6, 21],\n      [-5, -5],\n      [-8, 23],\n      [4, 5],\n      [-2, 28],\n      [-5, 6],\n      [1, 18],\n      [-2, 5]\n    ],\n    [\n      [4659, 6034],\n      [5, -2],\n      [7, 8],\n      [0, 24],\n      [3, 11],\n      [6, 7],\n      [14, -22],\n      [3, -2],\n      [4, 13],\n      [12, 1],\n      [14, -4],\n      [13, 7],\n      [65, 0],\n      [41, 0],\n      [5, 45],\n      [-8, 15],\n      [-1, 33],\n      [-2, 21],\n      [-1, 36],\n      [-2, 22],\n      [-6, 109],\n      [0, 17],\n      [-3, 39],\n      [-6, 104],\n      [0, 14],\n      [-3, 39],\n      [0, 16],\n      [-3, 37],\n      [50, 0]\n    ],\n    [\n      [7737, 5862],\n      [0, -11],\n      [-4, -2],\n      [-1, 13],\n      [5, 0]\n    ],\n    [\n      [7733, 5907],\n      [-2, -14],\n      [-1, 20],\n      [3, -6]\n    ],\n    [\n      [7622, 6095],\n      [-2, 9],\n      [7, 13],\n      [2, -6],\n      [-7, -16]\n    ],\n    [\n      [7710, 6117],\n      [-4, 12],\n      [2, 5],\n      [2, -17]\n    ],\n    [\n      [7602, 6269],\n      [-2, -10],\n      [-5, 9],\n      [7, 1]\n    ],\n    [\n      [7604, 6305],\n      [6, -6],\n      [-6, -6],\n      [-3, 10],\n      [3, 2]\n    ],\n    [\n      [7780, 6353],\n      [-9, 6],\n      [0, -6],\n      [-10, 2],\n      [3, -11],\n      [-6, -6],\n      [-8, 1],\n      [-1, -17],\n      [-21, -7],\n      [-6, 8],\n      [0, -9],\n      [-5, -4],\n      [-2, -10],\n      [1, -18],\n      [-4, -10],\n      [3, -19],\n      [-10, -8],\n      [5, -6],\n      [5, -22],\n      [-2, -10],\n      [11, -23],\n      [4, -17],\n      [7, -8],\n      [-1, -11],\n      [6, -28],\n      [6, 5],\n      [-2, -15],\n      [-7, -3],\n      [0, -40],\n      [-9, -4],\n      [-2, -12],\n      [2, -16],\n      [6, -13],\n      [3, -15],\n      [11, -14],\n      [4, -11],\n      [3, -67],\n      [6, -9],\n      [1, -25],\n      [2, 1],\n      [3, -19],\n      [-6, -12],\n      [-1, -12],\n      [-5, -17],\n      [-6, -8],\n      [0, -8],\n      [-5, -4],\n      [-2, -23]\n    ],\n    [\n      [7742, 5779],\n      [-7, -20],\n      [0, 24],\n      [-1, 18],\n      [7, 10],\n      [1, 45],\n      [-5, 2],\n      [4, 20],\n      [-6, 11],\n      [5, 21],\n      [-3, 32],\n      [-9, 31],\n      [-4, -1],\n      [0, 27],\n      [-3, 9],\n      [-5, 30],\n      [0, 32],\n      [-2, 26],\n      [-4, 14],\n      [2, 25],\n      [-8, -2],\n      [-5, 13],\n      [0, 18],\n      [-3, 12],\n      [-6, 8],\n      [0, -23],\n      [-2, -16],\n      [-5, -11],\n      [-11, 3],\n      [2, -12],\n      [-16, -8],\n      [-2, -16],\n      [-7, -13],\n      [-9, 8],\n      [-6, -4],\n      [0, 12],\n      [-5, -9],\n      [-3, 5],\n      [3, 21],\n      [-12, -19],\n      [-1, 11],\n      [4, 22],\n      [2, 38],\n      [4, 9],\n      [0, 22],\n      [-2, 3],\n      [-2, 30],\n      [-6, 24],\n      [-5, 8],\n      [0, 20],\n      [-2, -4],\n      [-1, -16],\n      [-7, 9],\n      [-6, 22],\n      [9, -10],\n      [6, 14],\n      [-11, 14],\n      [3, 13],\n      [-4, -3],\n      [-6, 11],\n      [-10, -1],\n      [2, 16],\n      [-4, -12],\n      [-5, 6],\n      [5, 4],\n      [-5, 9],\n      [0, -11],\n      [-7, 22],\n      [-3, 3],\n      [-3, 21]\n    ],\n    [\n      [5533, 7690],\n      [8, -17],\n      [11, -8],\n      [13, -12],\n      [0, -5]\n    ],\n    [\n      [5538, 7620],\n      [0, -3]\n    ],\n    [\n      [5537, 7617],\n      [-6, 0],\n      [7, -10]\n    ],\n    [\n      [5537, 7593],\n      [-14, 24],\n      [-10, 8]\n    ],\n    [\n      [8263, 7933],\n      [2, -6],\n      [9, 9],\n      [-4, 10]\n    ],\n    [\n      [7439, 8014],\n      [9, 6],\n      [1, 10],\n      [19, 0],\n      [8, 3],\n      [15, 13],\n      [-2, 11],\n      [25, 18],\n      [5, 0],\n      [8, 12],\n      [11, 0],\n      [12, 16],\n      [9, -2],\n      [7, 10],\n      [7, -10],\n      [9, 6],\n      [2, -10],\n      [33, -2],\n      [3, -22],\n      [8, -10],\n      [8, 1],\n      [15, -8],\n      [9, 7],\n      [21, -9],\n      [11, 2],\n      [9, -10],\n      [7, 11],\n      [15, 6],\n      [5, 15],\n      [2, 14],\n      [-8, 6],\n      [-6, 22],\n      [7, 27],\n      [5, 0],\n      [3, 14],\n      [8, 4],\n      [7, 20],\n      [11, -11],\n      [11, -3],\n      [9, -10],\n      [14, 0],\n      [23, -15],\n      [7, 1],\n      [17, -9],\n      [2, -43],\n      [17, -15],\n      [11, -7],\n      [20, -3],\n      [13, 10],\n      [19, 4],\n      [4, 6],\n      [21, -6],\n      [4, -6],\n      [13, 3],\n      [14, -20],\n      [22, -3],\n      [-1, -15],\n      [17, -20],\n      [16, 1],\n      [31, -10],\n      [3, 4],\n      [9, -6],\n      [20, 14],\n      [18, 1],\n      [11, 8],\n      [10, -2],\n      [8, 5],\n      [3, 12],\n      [27, 27],\n      [17, -1],\n      [17, -20],\n      [9, -1],\n      [12, 8],\n      [12, -5],\n      [3, -6]\n    ],\n    [\n      [5913, 3637],\n      [-22, 0]\n    ],\n    [\n      [5891, 3637],\n      [1, 15],\n      [-3, 17],\n      [1, 16],\n      [-3, 3]\n    ],\n    [\n      [5887, 3688],\n      [1, 16],\n      [0, 71],\n      [-4, 30],\n      [-3, 5],\n      [-6, 24],\n      [1, 14],\n      [-7, 44]\n    ],\n    [\n      [5869, 3892],\n      [31, 64],\n      [-2, 10],\n      [4, 10],\n      [-1, 17],\n      [6, 7],\n      [9, 29],\n      [1, 14],\n      [-6, 6],\n      [1, 36],\n      [-5, 2],\n      [0, 11],\n      [6, 3],\n      [-1, 14],\n      [4, 4],\n      [-2, 36],\n      [3, 14],\n      [-1, 17],\n      [-5, 22],\n      [4, 14],\n      [-7, -1],\n      [-1, 6],\n      [-13, 9],\n      [-9, 1],\n      [-5, 12],\n      [-5, 1],\n      [-7, 10],\n      [-9, -2],\n      [-2, 4],\n      [-13, -1],\n      [0, 21]\n    ],\n    [\n      [5844, 4282],\n      [-1, 18],\n      [-4, 20],\n      [19, 14],\n      [14, 6],\n      [19, 16],\n      [4, 1],\n      [27, 19]\n    ],\n    [\n      [5922, 4376],\n      [6, -21],\n      [7, -13],\n      [1, 6],\n      [17, 6],\n      [5, -11],\n      [2, -41],\n      [-5, -11],\n      [0, -9],\n      [-5, -10],\n      [5, -13],\n      [1, -14],\n      [9, -15],\n      [5, -13],\n      [5, -4],\n      [0, -17],\n      [5, 0],\n      [-2, 38],\n      [4, 19],\n      [9, 2],\n      [3, 5],\n      [1, 35],\n      [-1, 16],\n      [3, 15],\n      [-2, 14],\n      [-21, 54],\n      [-6, 11]\n    ],\n    [\n      [5968, 4405],\n      [-2, 10],\n      [-1, 28],\n      [2, 8],\n      [-4, 14],\n      [0, 16],\n      [6, 10],\n      [2, 25]\n    ],\n    [\n      [5971, 4516],\n      [19, 0],\n      [5, 10],\n      [9, -10],\n      [1, -7],\n      [15, 1],\n      [7, 6],\n      [12, -8],\n      [11, 10],\n      [1, 13],\n      [7, 4],\n      [11, -8],\n      [11, 13],\n      [11, 0],\n      [5, 9],\n      [9, 4],\n      [18, 27]\n    ],\n    [\n      [6123, 4580],\n      [6, -13],\n      [-7, -32],\n      [0, -23],\n      [3, -18],\n      [0, -28],\n      [3, -20],\n      [-6, -8],\n      [5, -1],\n      [-2, -39],\n      [4, -23],\n      [-4, -8],\n      [6, -2],\n      [-3, -8],\n      [6, -5],\n      [0, -22],\n      [-5, -7],\n      [1, -8],\n      [-3, -24],\n      [-13, -26],\n      [-3, -14],\n      [-7, -7],\n      [3, -7],\n      [-21, -26],\n      [-1, -7],\n      [-11, -2],\n      [-16, -16],\n      [-6, -3],\n      [-20, -22],\n      [-11, -32],\n      [-8, -15],\n      [-2, -13],\n      [-5, 5],\n      [1, -12],\n      [-4, 6],\n      [-13, -18],\n      [-6, -17],\n      [-16, -26],\n      [-3, 4],\n      [0, -25],\n      [-3, -12],\n      [6, -15],\n      [3, 0],\n      [4, -39],\n      [4, -16],\n      [2, -20],\n      [-1, -24],\n      [5, 16],\n      [2, -16],\n      [-2, -10],\n      [3, -20],\n      [-7, -50],\n      [6, -4],\n      [-3, -17],\n      [-9, -26],\n      [-13, -11],\n      [-26, -17],\n      [-11, -10],\n      [-12, -16],\n      [-5, -18],\n      [-4, -6],\n      [3, -12],\n      [7, -5],\n      [-1, -33]\n    ],\n    [\n      [4659, 6034],\n      [-6, 12],\n      [-12, 16],\n      [-1, 13],\n      [-8, 8],\n      [-2, 17],\n      [-5, 13],\n      [-10, -2],\n      [-6, 16],\n      [-8, 14],\n      [-16, 0],\n      [-20, -9],\n      [-19, 1],\n      [-1, -15],\n      [-3, -3],\n      [-2, -22]\n    ],\n    [\n      [4540, 6093],\n      [0, 30],\n      [2, 18],\n      [8, 33],\n      [4, 26],\n      [0, 28],\n      [-3, 40],\n      [-5, 20],\n      [-6, 11],\n      [9, 24],\n      [0, 28],\n      [-9, 26],\n      [0, -9],\n      [-5, 11],\n      [-4, 19],\n      [-4, -3],\n      [-1, -16]\n    ],\n    [\n      [4526, 6379],\n      [-1, 6],\n      [3, 26],\n      [55, 0],\n      [55, 0],\n      [0, 15],\n      [-4, 71],\n      [3, 10],\n      [12, 16],\n      [17, 11],\n      [0, 146],\n      [56, 0],\n      [36, 0],\n      [0, 74]\n    ],\n    [\n      [6603, 4026],\n      [2, -11],\n      [-3, -12],\n      [-9, -1],\n      [0, 15],\n      [4, 13],\n      [6, -4]\n    ],\n    [\n      [5969, 4525],\n      [0, 2]\n    ],\n    [\n      [5969, 4527],\n      [0, -2]\n    ],\n    [\n      [5964, 4534],\n      [0, 2]\n    ],\n    [\n      [5964, 4536],\n      [0, -2]\n    ],\n    [\n      [5952, 4624],\n      [-3, 6]\n    ],\n    [\n      [5949, 4630],\n      [3, -6]\n    ],\n    [\n      [5946, 4634],\n      [0, 1]\n    ],\n    [\n      [5946, 4635],\n      [0, -1]\n    ],\n    [\n      [5941, 4623],\n      [2, -16],\n      [8, -22],\n      [-1, -51],\n      [3, -25],\n      [-8, -21],\n      [0, -15],\n      [4, -4],\n      [0, -16],\n      [4, -12],\n      [-1, -26],\n      [2, -9],\n      [7, -10],\n      [-2, -24],\n      [7, -10],\n      [2, 11],\n      [8, -16],\n      [4, 0],\n      [-6, 34],\n      [-6, 2],\n      [0, 12]\n    ],\n    [\n      [5922, 4376],\n      [-7, -1],\n      [-2, 12],\n      [-6, 14],\n      [6, 8],\n      [4, 49],\n      [9, 3],\n      [5, 11],\n      [-4, 0],\n      [-4, 11],\n      [2, 15],\n      [-3, 27],\n      [5, 15],\n      [-4, 17],\n      [7, 6],\n      [5, 11],\n      [-4, 20],\n      [-6, 8],\n      [1, 15],\n      [-4, 12],\n      [-7, 1],\n      [-1, 11]\n    ],\n    [\n      [5914, 4641],\n      [10, -5],\n      [4, -7],\n      [9, 1],\n      [4, -7]\n    ],\n    [\n      [8093, 5320],\n      [-2, 3],\n      [0, 20],\n      [2, -2],\n      [0, -21]\n    ],\n    [\n      [8269, 5423],\n      [5, -1]\n    ],\n    [\n      [7786, 5497],\n      [-1, -11],\n      [-3, 11],\n      [4, 0]\n    ],\n    [\n      [7773, 5553],\n      [-3, -8],\n      [-3, 8],\n      [6, 0]\n    ],\n    [\n      [7834, 5543],\n      [9, -7],\n      [3, -14],\n      [18, -29],\n      [9, -33],\n      [1, -32],\n      [-4, -8],\n      [0, -23],\n      [4, -12],\n      [-2, -6],\n      [1, -32],\n      [10, -15],\n      [3, -23],\n      [8, -23],\n      [1, -24],\n      [-16, 4],\n      [-4, -10],\n      [-5, 15],\n      [-15, 19],\n      [-7, 11],\n      [-10, 9],\n      [-11, 21],\n      [-14, 15],\n      [2, 9],\n      [-2, 17],\n      [-6, 17],\n      [-11, 19],\n      [2, 9],\n      [-4, 6],\n      [1, 21],\n      [-2, 19],\n      [-6, 11],\n      [2, 6],\n      [-2, 23],\n      [0, 26],\n      [-7, 25]\n    ],\n    [\n      [7780, 5554],\n      [2, 15],\n      [4, -9],\n      [12, -7],\n      [2, -11],\n      [7, 1],\n      [0, -19],\n      [-3, -9],\n      [3, -8],\n      [5, 9],\n      [9, 7],\n      [6, -10],\n      [7, 30]\n    ],\n    [\n      [8045, 5303],\n      [0, -10],\n      [8, -13],\n      [9, 1],\n      [16, -8],\n      [6, -6],\n      [0, 16],\n      [5, 22],\n      [0, 18],\n      [4, 0],\n      [2, 16],\n      [5, 8],\n      [11, 2],\n      [20, 10],\n      [9, 9],\n      [12, 33],\n      [7, 12],\n      [6, 19],\n      [1, 16]\n    ],\n    [\n      [8193, 5464],\n      [1, -4]\n    ],\n    [\n      [8198, 5465],\n      [6, 1],\n      [6, 15],\n      [-6, 9],\n      [6, 11],\n      [6, 0],\n      [3, 14],\n      [4, 4],\n      [1, 17],\n      [6, 6],\n      [1, 8],\n      [8, 18],\n      [3, 19],\n      [3, -3],\n      [-2, -22],\n      [6, 8],\n      [3, 15],\n      [4, -2],\n      [1, -18],\n      [7, -3],\n      [6, -10],\n      [-4, -13],\n      [5, -16],\n      [6, 9],\n      [3, -14],\n      [8, -1],\n      [9, -15],\n      [15, -10],\n      [0, -11],\n      [-15, -13],\n      [-7, -1],\n      [-2, 6],\n      [-7, -8],\n      [5, -14],\n      [9, -13],\n      [-18, -12],\n      [-11, 10],\n      [-1, -14]\n    ],\n    [\n      [8256, 5598],\n      [-5, -6],\n      [0, 10],\n      [6, 4],\n      [-1, -8]\n    ],\n    [\n      [5649, 4167],\n      [22, 9],\n      [17, -1],\n      [7, -5],\n      [6, -12]\n    ],\n    [\n      [5554, 3757],\n      [1, -13],\n      [0, -196],\n      [-12, -8],\n      [-2, -9],\n      [-7, -5],\n      [-3, -11],\n      [-11, 7],\n      [-16, -4],\n      [-16, 13],\n      [-5, -1],\n      [-2, 28],\n      [-4, 0],\n      [-3, 11],\n      [-5, -2],\n      [-4, -12],\n      [0, -11],\n      [-8, -7]\n    ],\n    [\n      [5457, 3537],\n      [-5, 4],\n      [-15, 27],\n      [-12, 41],\n      [-2, 21],\n      [-5, 18],\n      [2, 11],\n      [-5, 7],\n      [0, 21],\n      [-3, 11],\n      [-1, 23],\n      [1, 20],\n      [-11, 53],\n      [1, 33],\n      [-2, 25],\n      [3, 10],\n      [-1, 27],\n      [-14, 39],\n      [-4, 18],\n      [-13, 37],\n      [-5, 37],\n      [-3, 3],\n      [-4, 20],\n      [-7, 22],\n      [-3, 18],\n      [-8, 23],\n      [-8, 14],\n      [-5, 21],\n      [-3, 36],\n      [1, 12]\n    ],\n    [\n      [9665, 3952],\n      [5, -3],\n      [-1, -13],\n      [-7, 3],\n      [-2, 12],\n      [5, 1]\n    ],\n    [\n      [9646, 3990],\n      [4, -27],\n      [-9, 7],\n      [-1, 8],\n      [6, 12]\n    ],\n    [\n      [9555, 4026],\n      [7, -13],\n      [6, 0],\n      [16, -24],\n      [5, -3],\n      [11, -30],\n      [7, -3],\n      [15, -20],\n      [4, -10],\n      [11, -14],\n      [2, -10],\n      [-3, -5],\n      [-12, 8],\n      [-2, -4],\n      [-6, 8],\n      [-2, 13],\n      [-4, -1],\n      [-7, 14],\n      [-13, 7],\n      [-4, 13],\n      [-12, 16],\n      [-1, 8],\n      [-6, 6],\n      [-12, 44]\n    ],\n    [\n      [5416, 6507],\n      [4, -53],\n      [1, -34],\n      [12, -31],\n      [-1, -12],\n      [11, -21],\n      [-7, -29],\n      [0, -21],\n      [-6, -142],\n      [-1, -9],\n      [-22, -46],\n      [-12, -29],\n      [-13, -39],\n      [0, -11],\n      [-9, -19],\n      [4, -39]\n    ],\n    [\n      [5377, 5972],\n      [-6, 1],\n      [-4, -10],\n      [-5, 0],\n      [-14, -18],\n      [-2, -10],\n      [-10, 2],\n      [-7, 9],\n      [-12, 6],\n      [-22, 1],\n      [-13, -6],\n      [-7, -7],\n      [-8, -20],\n      [-18, 2],\n      [-10, 7],\n      [-15, 20],\n      [-9, 1],\n      [-10, -12],\n      [-6, 0],\n      [-3, -7],\n      [-7, 4],\n      [-4, 15],\n      [-12, 21],\n      [-3, -3],\n      [-16, 14],\n      [-8, -8],\n      [-12, 2],\n      [-11, -6],\n      [-9, -11],\n      [-1, -28],\n      [-4, -14],\n      [-8, -13],\n      [-1, -25],\n      [1, -21],\n      [-2, -2]\n    ],\n    [\n      [5377, 5972],\n      [13, -36]\n    ],\n    [\n      [5238, 5460],\n      [-5, -4],\n      [-6, 14],\n      [5, -21],\n      [-2, -4],\n      [-17, -3],\n      [-14, 10],\n      [0, -10],\n      [-4, -4],\n      [0, 13],\n      [-4, 2],\n      [3, -18],\n      [-25, -6],\n      [-7, 6],\n      [-8, 17],\n      [-3, 12],\n      [-3, 27],\n      [-4, 8],\n      [-3, 17],\n      [-6, 13],\n      [-13, 20],\n      [-15, 4],\n      [-12, -1],\n      [4, 6],\n      [-5, 2],\n      [0, -9],\n      [-19, -1]\n    ],\n    [\n      [2691, 6046],\n      [-6, -4],\n      [4, -35],\n      [-7, -20],\n      [-4, -40],\n      [2, -21],\n      [-1, -19],\n      [2, -10],\n      [-4, -2],\n      [1, 15],\n      [-5, -4],\n      [4, -12],\n      [-5, -31],\n      [3, 2],\n      [1, -14],\n      [-6, -11],\n      [1, -16],\n      [5, -12]\n    ],\n    [\n      [2619, 5821],\n      [-6, 13],\n      [-12, 18],\n      [-7, 15],\n      [-4, 17],\n      [-26, 41],\n      [4, 10],\n      [6, -5]\n    ],\n    [\n      [5093, 8141],\n      [24, 0]\n    ],\n    [\n      [5162, 8210],\n      [-10, -17],\n      [-10, 7],\n      [15, 13],\n      [5, -3]\n    ],\n    [\n      [5118, 8141],\n      [-21, 6],\n      [1, 7],\n      [9, 1],\n      [7, -11],\n      [-3, 33],\n      [8, 7],\n      [6, 13],\n      [6, 36],\n      [10, -1],\n      [14, 21],\n      [11, 5],\n      [24, 3],\n      [9, -12]\n    ],\n    [\n      [5140, 8230],\n      [7, -10],\n      [-8, -8],\n      [0, -15],\n      [12, -5],\n      [12, 14],\n      [-12, 20],\n      [-2, 13],\n      [-9, -9]\n    ],\n    [\n      [5157, 8665],\n      [-10, 4],\n      [10, 9],\n      [0, -13]\n    ],\n    [\n      [5249, 8849],\n      [3, -8],\n      [-16, -5],\n      [-3, 7],\n      [16, 6]\n    ],\n    [\n      [5244, 8857],\n      [-2, -7],\n      [-13, 0],\n      [15, 7]\n    ],\n    [\n      [5344, 8955],\n      [3, -6],\n      [-12, -11],\n      [9, 17]\n    ],\n    [\n      [5387, 9114],\n      [3, -5],\n      [-17, -6],\n      [5, 13],\n      [9, -2]\n    ],\n    [\n      [5420, 9124],\n      [-11, -11],\n      [-15, -6],\n      [9, 15],\n      [17, 2]\n    ],\n    [\n      [5441, 9154],\n      [2, -15],\n      [8, 12],\n      [8, -5],\n      [-1, -15],\n      [-21, -8],\n      [-4, -7],\n      [-17, -3],\n      [6, 18],\n      [6, 0],\n      [6, 23],\n      [7, 0]\n    ],\n    [\n      [5421, 9152],\n      [6, -15],\n      [-9, -5],\n      [-18, 7],\n      [21, 13]\n    ],\n    [\n      [5439, 9158],\n      [-11, -3],\n      [20, 19],\n      [-9, -16]\n    ],\n    [\n      [5492, 9188],\n      [10, -7],\n      [-3, -14],\n      [-32, -8],\n      [9, 12],\n      [-6, 8],\n      [22, 9]\n    ],\n    [\n      [5523, 9207],\n      [6, -7],\n      [-8, -11],\n      [-17, -2],\n      [5, 15],\n      [14, 5]\n    ],\n    [\n      [5533, 9218],\n      [12, -6],\n      [-15, -10],\n      [-9, 7],\n      [12, 9]\n    ],\n    [\n      [5652, 9249],\n      [5, -8],\n      [-16, -11],\n      [-6, 7],\n      [17, 12]\n    ],\n    [\n      [5649, 9262],\n      [-11, -16],\n      [-24, -4],\n      [7, 13],\n      [17, -3],\n      [11, 10]\n    ],\n    [\n      [5856, 9203],\n      [2, -15],\n      [-17, 4],\n      [-10, -15],\n      [-16, -3],\n      [-11, -16]\n    ],\n    [\n      [5572, 9158],\n      [-14, 0],\n      [7, -8],\n      [-11, -20],\n      [0, -11],\n      [-42, 13],\n      [-8, -3],\n      [1, -19],\n      [-8, -13],\n      [-16, 8],\n      [-15, -11],\n      [-5, -16],\n      [-14, -13],\n      [9, -12],\n      [-1, -10],\n      [-27, -31],\n      [2, -13],\n      [-12, -7],\n      [-15, -1],\n      [3, -17],\n      [-3, -30],\n      [-5, -12],\n      [-20, -30],\n      [14, -8],\n      [1, -15],\n      [-5, -10],\n      [-21, 5],\n      [-15, -8],\n      [-14, -21],\n      [-5, -18],\n      [6, -16],\n      [-4, -24],\n      [7, -20],\n      [-5, -30],\n      [20, -20],\n      [-4, -18],\n      [-13, -4],\n      [10, -29],\n      [-3, -21],\n      [-10, -13],\n      [-7, 0],\n      [-6, -16],\n      [4, -21],\n      [-6, -21],\n      [-5, 6]\n    ],\n    [\n      [5317, 8580],\n      [-2, 7],\n      [-16, 4],\n      [-5, 22],\n      [-5, -3],\n      [1, -15],\n      [-5, -12],\n      [-15, -2],\n      [-28, -36],\n      [-16, -16],\n      [-15, -5],\n      [-30, 5],\n      [4, 7],\n      [-19, 9],\n      [-10, 9],\n      [-4, 11],\n      [2, 18],\n      [14, -10],\n      [-5, 13],\n      [9, 14],\n      [-12, 11],\n      [2, -11],\n      [-10, -4],\n      [-8, 9],\n      [8, 18],\n      [11, 0],\n      [-5, 7],\n      [7, 5],\n      [5, 15],\n      [10, 13],\n      [-13, -9],\n      [-6, -16],\n      [-6, 16],\n      [-6, -8],\n      [-6, 8],\n      [3, 14],\n      [12, -3],\n      [-1, 14],\n      [-10, -9],\n      [-10, 14],\n      [3, 16],\n      [10, 0],\n      [-13, 10],\n      [0, 10],\n      [11, 7],\n      [-11, 5],\n      [11, 16],\n      [33, -6],\n      [-31, 8],\n      [-7, -3],\n      [7, 17],\n      [13, 1],\n      [25, 16],\n      [-12, -3],\n      [12, 13],\n      [22, -8],\n      [-1, 10],\n      [-16, 2],\n      [-2, 12],\n      [10, 5],\n      [7, -6],\n      [16, 2],\n      [4, 11],\n      [12, -2],\n      [-5, 11],\n      [34, 19],\n      [7, -14],\n      [24, 5],\n      [-2, 8],\n      [19, 14],\n      [2, 9],\n      [-18, -7],\n      [2, -9],\n      [-26, -14],\n      [-12, 16],\n      [15, 11],\n      [-3, 9],\n      [14, 10],\n      [12, 17],\n      [13, -11],\n      [0, 17],\n      [11, 5],\n      [4, 17],\n      [19, 3],\n      [-10, 6],\n      [10, 12],\n      [-8, 12],\n      [27, 33],\n      [-8, 8],\n      [9, 16],\n      [12, 10],\n      [-7, 6],\n      [20, 4],\n      [10, 13],\n      [22, -3],\n      [0, 5],\n      [-28, 1],\n      [28, 31],\n      [-15, -9],\n      [4, 15],\n      [30, 7],\n      [-22, 1],\n      [23, 8],\n      [5, -17],\n      [6, 8],\n      [-11, 14],\n      [17, 8],\n      [32, -1],\n      [-9, 8],\n      [-29, -5],\n      [2, 11],\n      [24, 6],\n      [6, 22],\n      [10, 6],\n      [4, 14],\n      [19, 5],\n      [11, 13],\n      [26, 10],\n      [8, -11],\n      [15, 2],\n      [11, 14],\n      [19, -17],\n      [-5, 14],\n      [-18, 15],\n      [28, 3],\n      [20, -6],\n      [5, -14],\n      [11, 25],\n      [29, 23],\n      [0, 11],\n      [37, -7],\n      [-19, -17],\n      [-9, -26],\n      [8, -1],\n      [6, 15],\n      [33, 35],\n      [-3, -34],\n      [17, 22],\n      [11, 6],\n      [-8, 10],\n      [28, 3],\n      [8, -5],\n      [-19, -29],\n      [14, 2],\n      [11, 20],\n      [9, 1],\n      [21, -14],\n      [8, 4],\n      [27, -25],\n      [-16, -2],\n      [-10, -10],\n      [-39, 6],\n      [-3, -4],\n      [29, -8],\n      [-2, -12],\n      [34, 3]\n    ],\n    [\n      [5713, 9281],\n      [11, -11],\n      [-15, -3],\n      [-6, 9],\n      [10, 5]\n    ],\n    [\n      [4778, 9282],\n      [-1, -9],\n      [-15, -2],\n      [16, 11]\n    ],\n    [\n      [5647, 9686],\n      [-7, -11],\n      [38, -10],\n      [-33, -33],\n      [-23, 0],\n      [10, 17],\n      [-53, -6],\n      [22, 27],\n      [-22, 9],\n      [23, 8],\n      [45, -1]\n    ],\n    [\n      [5596, 9708],\n      [21, -5],\n      [1, -13],\n      [-43, -4],\n      [-15, 17],\n      [36, 5]\n    ],\n    [\n      [5313, 9706],\n      [24, -18],\n      [-29, 12],\n      [-16, 19],\n      [13, 4],\n      [8, -17]\n    ],\n    [\n      [5467, 9783],\n      [4, 5],\n      [53, -31],\n      [2, -16],\n      [23, 1],\n      [8, -9],\n      [40, -9],\n      [-5, -12],\n      [-44, -1],\n      [-22, -10],\n      [3, -21],\n      [-18, -4],\n      [-5, -31],\n      [-14, 1],\n      [-11, -30],\n      [-12, -11],\n      [3, -11],\n      [-20, 6],\n      [-35, 25],\n      [-18, 3],\n      [-9, 22],\n      [50, -2],\n      [-31, 7],\n      [59, 9],\n      [-36, 4],\n      [-50, -9],\n      [-5, 19],\n      [40, 3],\n      [17, 12],\n      [27, 1],\n      [-3, 22],\n      [-14, -14],\n      [-16, -1],\n      [-1, 23],\n      [-28, -21],\n      [10, -6],\n      [-25, -10],\n      [-23, -1],\n      [-17, 20],\n      [-20, 10],\n      [21, 16],\n      [-19, 4],\n      [10, 14],\n      [-23, -12],\n      [-16, 26],\n      [31, 17],\n      [9, -10],\n      [47, 12],\n      [-3, -10],\n      [-33, -9],\n      [37, -1],\n      [19, 16],\n      [20, -12],\n      [5, -15],\n      [28, -25],\n      [-14, 23],\n      [-7, 33],\n      [24, 9],\n      [7, -9]\n    ],\n    [\n      [5642, 9812],\n      [113, -16],\n      [-1, -15],\n      [-37, -13],\n      [-5, -13],\n      [-38, -5],\n      [-6, -7],\n      [-32, 2],\n      [-1, 11],\n      [-57, -2],\n      [-32, 10],\n      [22, 8],\n      [39, 1],\n      [0, 7],\n      [-66, -7],\n      [-28, 4],\n      [-12, 23],\n      [33, -5],\n      [33, 19],\n      [53, -25],\n      [3, 26],\n      [19, -3]\n    ],\n    [\n      [9617, 2273],\n      [0, -19],\n      [-6, 6],\n      [6, 13]\n    ],\n    [\n      [9665, 2494],\n      [6, -10],\n      [0, -14],\n      [-12, -2],\n      [-5, -8],\n      [1, 13],\n      [5, 6],\n      [-1, 14],\n      [6, 1]\n    ],\n    [\n      [96, 2665],\n      [10, -1],\n      [-9, -6],\n      [6, -11],\n      [-9, -5],\n      [3, 13],\n      [-9, 8],\n      [8, 2]\n    ],\n    [\n      [9802, 2850],\n      [-4, 0],\n      [-2, -14],\n      [9, -2],\n      [1, -21],\n      [4, -9],\n      [10, 14],\n      [6, 3],\n      [3, -10],\n      [3, 13],\n      [9, -2],\n      [-4, -7],\n      [3, -10],\n      [-6, -8],\n      [6, -18],\n      [-8, -17],\n      [-3, -13],\n      [-9, -13],\n      [-6, -23],\n      [-15, -16],\n      [-1, -24],\n      [9, -5],\n      [1, -9],\n      [-7, -4],\n      [-10, 10],\n      [-7, -9],\n      [-25, -22],\n      [-4, -20],\n      [0, -17],\n      [-7, -15],\n      [-5, -25],\n      [0, -16],\n      [-8, -3],\n      [-17, -24],\n      [-4, -11],\n      [-13, -7],\n      [-11, 0],\n      [-1, 6],\n      [-13, -4],\n      [-5, 16],\n      [-11, -2],\n      [-2, 10],\n      [-8, 3],\n      [-3, -7],\n      [-16, 3],\n      [1, 13],\n      [-9, 0],\n      [0, 10],\n      [9, 6],\n      [-2, 8],\n      [4, 17],\n      [8, -7],\n      [-4, 16],\n      [36, 56],\n      [2, 7],\n      [10, 1],\n      [19, 21],\n      [8, 4],\n      [16, 27],\n      [14, 12],\n      [13, 29],\n      [6, 37],\n      [9, 4],\n      [8, 16],\n      [1, 31],\n      [15, 21],\n      [7, 0]\n    ],\n    [\n      [9872, 3102],\n      [4, -10],\n      [-7, 5],\n      [3, 5]\n    ],\n    [\n      [9807, 3201],\n      [-1, -14],\n      [3, -11],\n      [8, -8],\n      [8, 2],\n      [10, -9],\n      [2, -9],\n      [5, 4],\n      [1, -13],\n      [5, -10],\n      [-2, -23],\n      [9, -16],\n      [-3, -21],\n      [7, -17],\n      [8, 0],\n      [4, -17],\n      [5, 3],\n      [-4, 18],\n      [3, 20],\n      [3, -14],\n      [7, -9],\n      [1, -35],\n      [2, -7],\n      [14, -7],\n      [19, -13],\n      [10, 4],\n      [5, 14],\n      [8, 7],\n      [8, 0],\n      [7, -10],\n      [-6, -15],\n      [-1, -32],\n      [-10, -9],\n      [-2, -34],\n      [-1, 12],\n      [-12, 1],\n      [-10, -8],\n      [-4, -10],\n      [1, -13],\n      [4, -3],\n      [-5, -25],\n      [-8, -21],\n      [-6, -9],\n      [-9, -30],\n      [-8, -14],\n      [-13, -14],\n      [-3, 11],\n      [-9, -1],\n      [-8, 12],\n      [4, 4],\n      [10, 24],\n      [4, 27],\n      [-5, 17],\n      [-15, 10],\n      [-6, 12],\n      [-9, 4],\n      [-6, 8],\n      [1, 14],\n      [22, 19],\n      [3, 41],\n      [4, 20],\n      [-3, 30],\n      [4, 10],\n      [-3, 8],\n      [-8, -6],\n      [-2, 16],\n      [-6, 19],\n      [7, -12],\n      [-2, 22],\n      [-11, 8],\n      [1, -9],\n      [-26, 61],\n      [2, 16],\n      [-12, 29],\n      [10, 1]\n    ],\n    [\n      [6629, 6344],\n      [-1, 12],\n      [8, 19],\n      [-7, -31]\n    ],\n    [\n      [6474, 6141],\n      [-8, 37],\n      [-2, 0],\n      [-11, 55],\n      [-10, 44]\n    ],\n    [\n      [6443, 6277],\n      [13, 8],\n      [52, 37],\n      [19, 12],\n      [9, 56],\n      [9, 61],\n      [-13, 39]\n    ],\n    [\n      [6566, 6621],\n      [6, -28],\n      [6, -15],\n      [10, -17],\n      [31, -18],\n      [8, 2],\n      [6, -11],\n      [13, -39],\n      [7, -13],\n      [8, -2],\n      [0, -17],\n      [-9, -27],\n      [-4, -19],\n      [-12, -17],\n      [-11, -42],\n      [-8, 1],\n      [1, 11],\n      [-5, -3],\n      [-3, -13],\n      [-4, -4],\n      [-1, -20],\n      [-3, -10],\n      [2, -31],\n      [2, -11],\n      [-3, -4],\n      [-15, -2],\n      [-8, -6],\n      [-7, -12],\n      [-3, -28],\n      [-5, -10],\n      [-5, 1],\n      [-21, -7],\n      [-6, -19],\n      [2, -9],\n      [-7, -20],\n      [-8, -3],\n      [-4, 5],\n      [-16, -3],\n      [-12, -14],\n      [-7, 0],\n      [-7, -6]\n    ],\n    [\n      [6557, 6684],\n      [2, 8],\n      [9, -6],\n      [-5, -27]\n    ],\n    [\n      [6893, 6556],\n      [-1, -9],\n      [-8, 10],\n      [-6, -3],\n      [-8, 15],\n      [-5, 42],\n      [-13, 5],\n      [1, 20],\n      [-5, 7],\n      [-3, 13],\n      [-7, 1],\n      [2, -7],\n      [-16, -8],\n      [-13, 2],\n      [-1, -4],\n      [-23, -1],\n      [-19, 6],\n      [-4, -11],\n      [-28, 4],\n      [-5, -6],\n      [-17, -8],\n      [1, 8],\n      [-5, 2]\n    ],\n    [\n      [2729, 5623],\n      [3, -19],\n      [-7, 12],\n      [4, 7]\n    ],\n    [\n      [2836, 5599],\n      [-8, 16],\n      [-7, 31],\n      [5, 4],\n      [0, 10],\n      [5, 8],\n      [-5, 3],\n      [-4, -7],\n      [-3, 16],\n      [-10, 15],\n      [-6, 5],\n      [-10, 2],\n      [-9, -12],\n      [0, -13],\n      [-8, -11],\n      [-12, -10],\n      [0, -8],\n      [10, -19],\n      [4, -14],\n      [-10, -6],\n      [-2, -9],\n      [-13, -2],\n      [0, 7],\n      [-8, 30],\n      [-1, -14],\n      [-10, 8],\n      [-3, 19],\n      [-9, 8],\n      [-6, -1],\n      [0, 8],\n      [-8, -4],\n      [-9, 2],\n      [-2, -16]\n    ],\n    [\n      [2706, 5734],\n      [6, -10],\n      [3, -23],\n      [13, -4],\n      [-4, 11],\n      [5, -3],\n      [6, -15],\n      [10, -1],\n      [9, 5],\n      [7, 12],\n      [14, 8],\n      [14, 22],\n      [10, -4],\n      [7, 2],\n      [-2, -7],\n      [16, -2],\n      [17, -19],\n      [3, -9],\n      [10, -15]\n    ],\n    [\n      [3073, 4289],\n      [-8, 13],\n      [-7, 0],\n      [2, -20],\n      [-3, 4],\n      [-3, -15],\n      [17, -10],\n      [-2, -8],\n      [7, -8],\n      [4, 3]\n    ],\n    [\n      [3084, 4249],\n      [-2, -19]\n    ],\n    [\n      [3044, 4127],\n      [-14, 19],\n      [0, 3],\n      [-13, 15],\n      [0, 13],\n      [-3, 10],\n      [-18, 16],\n      [-6, 15],\n      [-10, 5],\n      [-17, 20],\n      [-17, 13],\n      [-3, 8],\n      [-32, 34],\n      [-1, 9],\n      [-9, 19],\n      [-10, 12],\n      [-6, 25],\n      [-4, 2],\n      [0, 15],\n      [3, 23],\n      [-10, 34],\n      [0, 7],\n      [-8, 20],\n      [1, 6],\n      [-7, 9],\n      [-3, 11],\n      [-2, 23],\n      [-4, 10],\n      [-8, 9],\n      [1, 11],\n      [-4, 20],\n      [-12, 36],\n      [-1, 20],\n      [-4, 9],\n      [-2, 18],\n      [-5, 8],\n      [-4, 33],\n      [-6, 23],\n      [-14, 29],\n      [-6, 35],\n      [-7, 12],\n      [-6, 16],\n      [-16, 16],\n      [-11, 17],\n      [0, 11],\n      [8, 6],\n      [-2, 16],\n      [-7, 11],\n      [3, 15],\n      [-8, 19],\n      [2, 25],\n      [12, 23],\n      [0, 5],\n      [14, 21]\n    ],\n    [\n      [8339, 5486],\n      [-9, -12],\n      [-3, 4],\n      [12, 8]\n    ],\n    [\n      [8361, 5534],\n      [5, -6],\n      [-8, -6],\n      [3, 12]\n    ],\n    [\n      [8390, 5552],\n      [-3, 0],\n      [-4, 14],\n      [7, 5],\n      [7, -7],\n      [-7, -12]\n    ],\n    [\n      [8493, 5581],\n      [-3, 9],\n      [3, 5],\n      [0, -14]\n    ],\n    [\n      [8251, 5645],\n      [-2, -13],\n      [-1, 14],\n      [3, -1]\n    ],\n    [\n      [8489, 5736],\n      [9, -8],\n      [3, -13],\n      [4, 4],\n      [-1, -13],\n      [4, -7],\n      [0, -10],\n      [-6, -9],\n      [8, -6],\n      [-1, -20],\n      [3, 3],\n      [-2, -23],\n      [5, -6],\n      [1, -27],\n      [-4, -16],\n      [-6, -12],\n      [-1, -28],\n      [-4, 20],\n      [1, 8],\n      [-6, 19],\n      [-1, 14],\n      [-5, -4],\n      [0, -9],\n      [-5, -8],\n      [-3, -22],\n      [6, -6],\n      [3, -20],\n      [-1, -12],\n      [-7, -21],\n      [-7, 13],\n      [3, 8],\n      [-3, 9],\n      [-3, -14],\n      [-10, 5],\n      [-13, 14],\n      [-5, 15],\n      [0, 20],\n      [-2, 0],\n      [1, 19],\n      [6, 8],\n      [0, 9],\n      [-5, 11],\n      [-15, 13],\n      [-3, -12],\n      [1, -15],\n      [-4, 9],\n      [-4, -1],\n      [0, 12],\n      [-4, -14],\n      [-6, 0],\n      [1, 16],\n      [-9, -3],\n      [-7, -26],\n      [-2, -17],\n      [-3, -3],\n      [-5, 9],\n      [7, 30],\n      [-1, 11],\n      [7, 16],\n      [16, 6],\n      [3, 21],\n      [8, 1],\n      [2, 11],\n      [3, -6],\n      [6, 1],\n      [4, -13],\n      [0, -15],\n      [11, 6],\n      [2, 17],\n      [3, 4],\n      [6, -8],\n      [3, 5],\n      [0, 23],\n      [4, 1],\n      [5, -9],\n      [5, 10],\n      [7, 1],\n      [0, 17],\n      [-4, 21],\n      [2, 8],\n      [5, -12]\n    ],\n    [\n      [8503, 5750],\n      [-4, -2],\n      [2, 14],\n      [2, -12]\n    ],\n    [\n      [8453, 5767],\n      [7, -6],\n      [-1, -12],\n      [-7, -13],\n      [-12, 2],\n      [-2, 9],\n      [7, 10],\n      [3, 10],\n      [5, 0]\n    ],\n    [\n      [8479, 5754],\n      [-4, 9],\n      [3, 3],\n      [1, -12]\n    ],\n    [\n      [8490, 5782],\n      [1, -31],\n      [-5, 11],\n      [0, 15],\n      [4, 5]\n    ],\n    [\n      [8332, 5791],\n      [-6, -5],\n      [2, 10],\n      [4, -5]\n    ],\n    [\n      [8408, 5792],\n      [-5, -9],\n      [0, 11],\n      [4, 7],\n      [1, -9]\n    ],\n    [\n      [8423, 5815],\n      [8, -4],\n      [1, -7],\n      [-7, -25],\n      [-1, -15],\n      [-4, -13],\n      [0, -19],\n      [5, -11],\n      [-2, -12],\n      [-7, -5],\n      [-3, 15],\n      [-9, 8],\n      [-5, 15],\n      [2, 15],\n      [11, 6],\n      [-1, 23],\n      [4, 23],\n      [8, 6]\n    ],\n    [\n      [8444, 5821],\n      [1, -35],\n      [-2, -9],\n      [-9, -14],\n      [0, -7],\n      [-6, -27],\n      [-3, -4],\n      [2, 34],\n      [9, 27],\n      [5, 33],\n      [3, 2]\n    ],\n    [\n      [8319, 5836],\n      [0, -30],\n      [6, -17],\n      [-10, -11],\n      [-4, -14],\n      [-13, -9],\n      [1, -12],\n      [-9, -26],\n      [-10, -10],\n      [-1, -9],\n      [-8, -14],\n      [-6, -2],\n      [-1, -9],\n      [-9, 0],\n      [19, 43],\n      [4, 0],\n      [9, 23],\n      [7, 11],\n      [6, 20],\n      [12, 17],\n      [4, 32],\n      [0, 14],\n      [3, 3]\n    ],\n    [\n      [8456, 5842],\n      [7, -8],\n      [4, 7],\n      [6, -10],\n      [-1, -30],\n      [5, -8],\n      [2, -19],\n      [-8, -4],\n      [2, -10],\n      [-8, 7],\n      [-1, 14],\n      [2, 19],\n      [-2, 11],\n      [-5, 5],\n      [-4, -4],\n      [1, 30]\n    ],\n    [\n      [8456, 5856],\n      [5, -12],\n      [-5, 0],\n      [0, 12]\n    ],\n    [\n      [8396, 5860],\n      [10, -14],\n      [4, 6],\n      [3, -11],\n      [7, 8],\n      [-1, -24],\n      [-9, -10],\n      [-1, -11],\n      [-6, -6],\n      [-9, -2],\n      [-6, -13],\n      [-2, 20],\n      [4, 17],\n      [0, 39],\n      [-6, 1],\n      [3, 10],\n      [9, -10]\n    ],\n    [\n      [8332, 5870],\n      [2, -13],\n      [-3, -2],\n      [-2, 15],\n      [3, 0]\n    ],\n    [\n      [8331, 5890],\n      [11, -11],\n      [0, -5],\n      [-10, 1],\n      [-1, 15]\n    ],\n    [\n      [8405, 5890],\n      [-5, 12],\n      [6, 0],\n      [-1, -12]\n    ],\n    [\n      [8469, 5906],\n      [10, -3],\n      [2, -13],\n      [5, -4],\n      [-2, -6],\n      [1, -33],\n      [6, -24],\n      [-14, 0],\n      [-2, 10],\n      [-4, 0],\n      [-4, 10],\n      [6, 17],\n      [-5, 0],\n      [-6, 16],\n      [-8, 11],\n      [-3, 20],\n      [7, -3],\n      [11, 2]\n    ],\n    [\n      [8426, 5905],\n      [6, -6],\n      [5, -13],\n      [4, -1],\n      [4, -15],\n      [0, -12],\n      [-17, 28],\n      [-8, -17],\n      [3, 13],\n      [-1, 26],\n      [4, -3]\n    ],\n    [\n      [8392, 5910],\n      [-3, -30],\n      [-3, 11],\n      [2, 17],\n      [4, 2]\n    ],\n    [\n      [8434, 5912],\n      [3, -18],\n      [-5, 16],\n      [2, 2]\n    ],\n    [\n      [8421, 5926],\n      [-7, 8],\n      [2, 6],\n      [5, -14]\n    ],\n    [\n      [8360, 5962],\n      [15, -22],\n      [-1, -23],\n      [-3, -26],\n      [-4, -5],\n      [-9, 17],\n      [-4, 15],\n      [0, 14],\n      [-7, 12],\n      [-4, 18],\n      [10, -4],\n      [7, 4]\n    ],\n    [\n      [8385, 5963],\n      [7, -9],\n      [-4, -11],\n      [-5, 8],\n      [2, 12]\n    ],\n    [\n      [8450, 5993],\n      [5, -11],\n      [0, -12],\n      [-7, -8],\n      [-4, 7],\n      [3, 5],\n      [0, 20],\n      [3, -1]\n    ],\n    [\n      [8387, 6049],\n      [2, -18],\n      [-3, -5],\n      [-3, 23],\n      [4, 0]\n    ],\n    [\n      [8358, 6252],\n      [7, 4],\n      [10, -14],\n      [13, -6],\n      [4, 13],\n      [3, 0],\n      [2, -15],\n      [-4, -8],\n      [-1, -29],\n      [3, -15],\n      [4, 0],\n      [2, -28],\n      [-8, -32],\n      [1, -4],\n      [-18, -18],\n      [2, -10],\n      [-7, -28],\n      [9, -32],\n      [-3, -1],\n      [4, -30],\n      [5, -10],\n      [10, -2],\n      [-3, 13],\n      [8, 9],\n      [8, -1],\n      [9, -20],\n      [-1, -12],\n      [5, -3],\n      [3, 17],\n      [17, -13],\n      [1, -4],\n      [-12, -1],\n      [0, -8],\n      [5, -8],\n      [4, -16],\n      [6, -8],\n      [2, -12],\n      [-2, -14],\n      [-6, 5],\n      [-1, 13],\n      [-7, 1],\n      [-8, 7],\n      [0, 14],\n      [-3, 11],\n      [-7, 6],\n      [-5, 16],\n      [-9, 7],\n      [2, -18],\n      [5, -15],\n      [-3, -12],\n      [-7, 25],\n      [-17, 19],\n      [-8, -8],\n      [1, -6],\n      [-11, -4],\n      [-4, 16],\n      [-6, 2],\n      [-2, -7],\n      [-1, 24],\n      [11, 17],\n      [-4, 14],\n      [-9, -4],\n      [2, -13],\n      [-4, -3],\n      [-4, 23],\n      [-7, 4],\n      [-1, 23],\n      [-4, 8],\n      [1, 26],\n      [-4, 3],\n      [0, 23],\n      [9, -15],\n      [9, 5],\n      [-3, 17],\n      [0, 21],\n      [4, 10],\n      [-1, 11],\n      [0, 43],\n      [5, 23],\n      [-1, 10],\n      [10, 4]\n    ],\n    [\n      [8740, 5620],\n      [-2, -13],\n      [-3, 3],\n      [5, 10]\n    ],\n    [\n      [9256, 4529],\n      [13, -10],\n      [0, -5],\n      [-10, 3],\n      [-3, 12]\n    ],\n    [\n      [9195, 4611],\n      [7, -2],\n      [-2, -10],\n      [-8, 2],\n      [-5, 23],\n      [8, -13]\n    ],\n    [\n      [9184, 4640],\n      [3, 2],\n      [5, -15],\n      [-14, 1],\n      [0, 16],\n      [6, -4]\n    ],\n    [\n      [9176, 4644],\n      [-1, -9],\n      [-5, 5],\n      [-1, 9],\n      [6, 1],\n      [1, -6]\n    ],\n    [\n      [9234, 4667],\n      [10, -3],\n      [5, -11],\n      [-10, 2],\n      [-5, 12]\n    ],\n    [\n      [8989, 4680],\n      [-11, 16],\n      [11, -11],\n      [0, -5]\n    ],\n    [\n      [8981, 4701],\n      [6, 0],\n      [1, -7],\n      [-7, 7]\n    ],\n    [\n      [9105, 4867],\n      [7, -7],\n      [-1, -11],\n      [-7, 10],\n      [1, 8]\n    ],\n    [\n      [9299, 4867],\n      [8, -4],\n      [3, -17],\n      [6, -8],\n      [1, -9],\n      [5, -4],\n      [8, -16],\n      [2, -14],\n      [-7, -8],\n      [-5, 1],\n      [-10, 17],\n      [1, 14],\n      [-14, 25],\n      [0, 19],\n      [2, 4]\n    ],\n    [\n      [9089, 4870],\n      [-4, 0],\n      [-2, 11],\n      [3, 3],\n      [3, -14]\n    ],\n    [\n      [9296, 4889],\n      [-2, -21],\n      [-1, 25],\n      [3, -4]\n    ],\n    [\n      [9228, 4941],\n      [-2, -6],\n      [7, -2],\n      [0, -17],\n      [-5, -20],\n      [-8, -1],\n      [5, -25],\n      [-8, -9],\n      [-11, 3],\n      [2, -8],\n      [-14, -21],\n      [-15, -13],\n      [-24, -2],\n      [-3, 10],\n      [-6, 4],\n      [-6, -5],\n      [-2, 7],\n      [-10, 12],\n      [-9, 7],\n      [4, 14],\n      [11, -5],\n      [3, 4],\n      [7, -8],\n      [20, 6],\n      [2, 24],\n      [4, -27],\n      [8, 6],\n      [8, -5],\n      [8, 6],\n      [0, 10],\n      [10, 20],\n      [7, -3],\n      [2, 5],\n      [-2, 23],\n      [-3, 16],\n      [7, 0],\n      [5, -8],\n      [2, 8],\n      [6, 0]\n    ],\n    [\n      [8915, 5033],\n      [7, -1],\n      [25, -25],\n      [25, -17],\n      [13, -4],\n      [9, -11],\n      [5, -11],\n      [15, -2],\n      [0, -8],\n      [9, -6],\n      [5, -15],\n      [8, -3],\n      [13, -25],\n      [-1, -38],\n      [14, -4],\n      [18, -16],\n      [5, -7],\n      [12, -3],\n      [9, -22],\n      [0, -18],\n      [-25, -3],\n      [0, -12],\n      [5, -13],\n      [1, -15],\n      [7, -6],\n      [8, -21],\n      [12, -8],\n      [3, -30],\n      [7, -9],\n      [2, -19],\n      [21, 3],\n      [-4, -19],\n      [1, -9],\n      [7, -6],\n      [15, -2],\n      [1, -5],\n      [-9, -5],\n      [8, -16],\n      [10, -7],\n      [12, -3],\n      [-4, -5],\n      [-9, -1],\n      [10, -10],\n      [-7, -9],\n      [-13, 6],\n      [2, 7],\n      [-9, 8],\n      [-7, -1],\n      [-8, 6],\n      [-12, 0],\n      [1, 5],\n      [-11, -3],\n      [-2, 5],\n      [-17, 1],\n      [-11, 33],\n      [-5, 2],\n      [-7, 22],\n      [-8, 6],\n      [-4, 23],\n      [-10, 30],\n      [-13, 9],\n      [-5, -1],\n      [-7, 8],\n      [-9, 2],\n      [-6, 12],\n      [-6, -1],\n      [2, -13],\n      [-7, 10],\n      [1, -8],\n      [-13, 8],\n      [4, -19],\n      [-11, -4],\n      [1, -12],\n      [-18, -5],\n      [-6, 1],\n      [11, -10],\n      [7, -15],\n      [1, -11],\n      [-22, -23],\n      [-11, 10],\n      [-20, -3],\n      [-6, 4],\n      [-3, -5],\n      [-6, 7]\n    ],\n    [\n      [9195, 5027],\n      [10, -11],\n      [11, -17],\n      [7, -3],\n      [14, -33],\n      [11, -10],\n      [5, -22],\n      [-2, -14],\n      [-5, -10],\n      [-6, 14],\n      [1, 21],\n      [-5, 19],\n      [-10, 21],\n      [-6, 2],\n      [-9, 16],\n      [-5, 4],\n      [-9, 15],\n      [-10, 7],\n      [8, 1]\n    ],\n    [\n      [9172, 5046],\n      [6, -5],\n      [0, -12],\n      [-8, 0],\n      [-3, 9],\n      [5, 8]\n    ],\n    [\n      [9079, 5070],\n      [12, -5],\n      [-3, -8],\n      [-17, 0],\n      [0, 11],\n      [8, 2]\n    ],\n    [\n      [9154, 5105],\n      [6, -13],\n      [-6, 5],\n      [0, 8]\n    ],\n    [\n      [5544, 8319],\n      [0, -1]\n    ],\n    [\n      [5544, 8318],\n      [4, -1]\n    ],\n    [\n      [5548, 8317],\n      [63, -4],\n      [21, 0]\n    ],\n    [\n      [5655, 8150],\n      [1, -13],\n      [14, -27],\n      [-5, 0],\n      [4, -18],\n      [-10, -8],\n      [-18, -24],\n      [-13, -25],\n      [4, -28],\n      [-6, 2]\n    ],\n    [\n      [5626, 8009],\n      [-15, 8],\n      [-11, 12],\n      [-16, -2],\n      [-4, -6],\n      [-6, 6],\n      [-10, 0],\n      [-14, -12],\n      [-1, 12],\n      [-10, 11],\n      [-7, -11],\n      [-9, 7]\n    ],\n    [\n      [5396, 8275],\n      [8, -3],\n      [0, 13],\n      [-10, 0]\n    ],\n    [\n      [5394, 8289],\n      [54, 20],\n      [12, 16],\n      [10, 2],\n      [11, 9],\n      [27, 5],\n      [7, -23],\n      [12, -6],\n      [17, 7]\n    ],\n    [\n      [3138, 6248],\n      [29, -2],\n      [9, -6],\n      [2, -7],\n      [-7, -13],\n      [-9, -5],\n      [-17, 3],\n      [-12, -1],\n      [1, 15],\n      [-3, 7],\n      [3, 10],\n      [4, -1]\n    ],\n    [\n      [8625, 7631],\n      [5, -14]\n    ],\n    [\n      [8630, 7617],\n      [-7, 4],\n      [-11, -15],\n      [-11, -27],\n      [4, -15],\n      [-3, -11],\n      [1, -19],\n      [-11, -5],\n      [-7, -16],\n      [-13, -11],\n      [-8, -14],\n      [-9, 1],\n      [-4, -9],\n      [-10, -8],\n      [2, -9],\n      [-6, -13],\n      [2, -13],\n      [9, -2],\n      [17, -29]\n    ],\n    [\n      [8518, 7361],\n      [-8, 4],\n      [-8, -9],\n      [-8, 15],\n      [-7, 1],\n      [2, -14],\n      [-10, 9],\n      [-7, -2],\n      [3, 9],\n      [-13, 4],\n      [9, 5],\n      [-3, 9],\n      [10, 20],\n      [-3, 4],\n      [4, 21],\n      [5, 14],\n      [-4, 8],\n      [-16, 7],\n      [-11, 14],\n      [1, 12]\n    ],\n    [\n      [4525, 7072],\n      [11, -2],\n      [-3, -7],\n      [-10, 3],\n      [2, 6]\n    ],\n    [\n      [4286, 7362],\n      [15, 1],\n      [0, -6],\n      [-10, -3],\n      [-5, 8]\n    ],\n    [\n      [4220, 7396],\n      [-11, -2],\n      [-2, 9],\n      [13, -7]\n    ],\n    [\n      [4248, 7409],\n      [-8, 0],\n      [0, 8],\n      [6, 0],\n      [2, -8]\n    ],\n    [\n      [4794, 7325],\n      [-12, -12],\n      [-21, 8],\n      [-10, -7],\n      [4, 24],\n      [1, 44],\n      [-4, 18],\n      [-8, -2],\n      [-1, 11],\n      [8, 6],\n      [-2, 7],\n      [-4, -11],\n      [-9, 1],\n      [4, 38],\n      [6, 7],\n      [7, 36],\n      [-1, 3],\n      [7, 47],\n      [-6, 50],\n      [3, 7]\n    ],\n    [\n      [3492, 3797],\n      [-1, -17],\n      [-4, -23],\n      [-1, -22],\n      [-3, -17]\n    ],\n    [\n      [5949, 6986],\n      [8, 16]\n    ],\n    [\n      [5987, 7012],\n      [-4, -16]\n    ],\n    [\n      [853, 4163],\n      [-9, -2],\n      [-1, 11],\n      [5, 3],\n      [5, -12]\n    ],\n    [\n      [6422, 6601],\n      [-8, -2],\n      [-3, 9]\n    ],\n    [\n      [6411, 6608],\n      [1, 10],\n      [-3, 15],\n      [1, 20],\n      [3, 6],\n      [4, 24],\n      [6, 6],\n      [4, -12],\n      [5, -2],\n      [1, -9],\n      [-4, -14],\n      [4, -14],\n      [0, -15],\n      [-4, -17],\n      [-7, -5]\n    ],\n    [\n      [5783, 7801],\n      [3, -8],\n      [11, -6],\n      [14, 12],\n      [10, -3],\n      [2, -9]\n    ],\n    [\n      [5823, 7787],\n      [-1, -22],\n      [-14, -4],\n      [-3, 13],\n      [-4, -3],\n      [-6, -35],\n      [1, -21],\n      [-3, -13]\n    ],\n    [\n      [5630, 7730],\n      [-6, 15],\n      [8, 5],\n      [-10, 9],\n      [-6, -14],\n      [-5, 9],\n      [-10, 2],\n      [-9, 9],\n      [5, 16],\n      [-15, 12],\n      [-6, 9],\n      [1, 16],\n      [-13, 13],\n      [-2, 7]\n    ],\n    [\n      [5635, 7944],\n      [10, 8],\n      [7, -5],\n      [20, -6],\n      [10, 3],\n      [9, -14],\n      [10, 11],\n      [26, 6],\n      [3, 12],\n      [9, 3]\n    ],\n    [\n      [9064, 7741],\n      [7, 1],\n      [-12, -10],\n      [-16, -24],\n      [15, 37],\n      [6, -4]\n    ],\n    [\n      [9133, 7793],\n      [-15, -6],\n      [-10, -15],\n      [-5, 0],\n      [-7, -11],\n      [-18, -19],\n      [10, 17],\n      [-3, 3],\n      [25, 28],\n      [9, 0],\n      [12, 15],\n      [2, -12]\n    ],\n    [\n      [9182, 7845],\n      [-21, -27],\n      [-10, -9],\n      [15, 27],\n      [16, 9]\n    ],\n    [\n      [9227, 7898],\n      [-1, -8],\n      [-10, -14],\n      [11, 22]\n    ],\n    [\n      [9301, 8041],\n      [-1, -17],\n      [-6, 3],\n      [7, 14]\n    ],\n    [\n      [9336, 8091],\n      [-7, -15],\n      [-9, -4],\n      [-5, -11],\n      [-5, 16],\n      [15, 9],\n      [4, 15],\n      [7, 3],\n      [0, -13]\n    ],\n    [\n      [9344, 8100],\n      [-7, 6],\n      [7, 7],\n      [0, -13]\n    ],\n    [\n      [8967, 8309],\n      [5, -11],\n      [-3, -7],\n      [8, -35],\n      [4, -38],\n      [-6, -46],\n      [5, -11],\n      [-2, -12],\n      [6, 0],\n      [9, -69],\n      [10, -33],\n      [0, -7],\n      [8, -36],\n      [-9, 14],\n      [-23, 9],\n      [3, -6],\n      [-10, -7],\n      [-2, -16],\n      [-12, -57],\n      [6, -26],\n      [8, -11],\n      [0, -11],\n      [5, -21],\n      [9, 4],\n      [1, -28],\n      [-3, -6],\n      [-2, 22],\n      [-17, 3],\n      [-2, 6],\n      [-7, -5],\n      [-6, -32],\n      [-5, -9],\n      [-3, 6],\n      [-4, 29],\n      [7, 30],\n      [-3, 31],\n      [7, 21],\n      [-3, 26],\n      [-5, 12],\n      [7, 55],\n      [0, 46],\n      [-3, 10],\n      [1, 17],\n      [5, 19],\n      [-5, 18],\n      [-11, 14],\n      [-1, 38],\n      [4, 5],\n      [3, 26],\n      [-4, 26],\n      [13, 9],\n      [1, -9],\n      [10, 9],\n      [-4, 8],\n      [9, 2],\n      [-2, 12],\n      [-10, 21],\n      [5, -2],\n      [5, 11],\n      [3, -8]\n    ],\n    [\n      [9669, 8321],\n      [-19, 19],\n      [4, 0],\n      [15, -19]\n    ],\n    [\n      [8810, 8355],\n      [-14, -11],\n      [8, 11],\n      [6, 0]\n    ],\n    [\n      [8827, 8358],\n      [9, -8],\n      [-12, -22],\n      [-6, 15],\n      [-6, 1],\n      [8, 17],\n      [7, -3]\n    ],\n    [\n      [5548, 8317],\n      [18, 15],\n      [-10, 2],\n      [-12, -16]\n    ],\n    [\n      [5544, 8319],\n      [10, 17],\n      [0, 12],\n      [12, -1],\n      [15, 19]\n    ],\n    [\n      [5582, 8366],\n      [-12, -19],\n      [12, -3],\n      [7, 5],\n      [1, 15]\n    ],\n    [\n      [9609, 8371],\n      [18, -27],\n      [1, -11],\n      [-13, 14],\n      [-4, 13],\n      [-7, 6],\n      [5, 5]\n    ],\n    [\n      [9571, 8591],\n      [3, -16],\n      [-8, -2],\n      [-23, -18],\n      [9, 26],\n      [19, 10]\n    ],\n    [\n      [5777, 8600],\n      [3, -1]\n    ],\n    [\n      [6924, 9029],\n      [21, -5],\n      [-5, -13],\n      [-16, 18]\n    ],\n    [\n      [6396, 9167],\n      [-24, -22],\n      [-23, -4],\n      [-10, 9],\n      [1, 19],\n      [15, 16],\n      [13, 1],\n      [28, -19]\n    ],\n    [\n      [9482, 9188],\n      [-3, -8],\n      [6, -25],\n      [-10, 6],\n      [-2, 19],\n      [9, 8]\n    ],\n    [\n      [9705, 9201],\n      [-6, -12],\n      [-29, 7],\n      [-11, 8],\n      [14, 11],\n      [32, -8],\n      [0, -6]\n    ],\n    [\n      [6648, 9234],\n      [5, -8],\n      [26, -17],\n      [0, -11],\n      [-25, -1],\n      [-5, 11],\n      [-10, -2],\n      [-13, 12],\n      [-1, 15],\n      [13, 8],\n      [10, -7]\n    ],\n    [\n      [6464, 9295],\n      [14, -14],\n      [-6, -11],\n      [-7, 12],\n      [-15, 9],\n      [14, 4]\n    ],\n    [\n      [0, 9271],\n      [9990, -7],\n      [-25, -4],\n      [-4, 14],\n      [8, 11],\n      [30, 17],\n      [-9999, -31]\n    ],\n    [\n      [8829, 9305],\n      [-3, -9],\n      [-20, 5],\n      [23, 4]\n    ],\n    [\n      [0, 9302],\n      [26, 4],\n      [18, -3],\n      [27, -17],\n      [-12, -12],\n      [-42, -8],\n      [-17, 5],\n      [0, 31]\n    ],\n    [\n      [7160, 9347],\n      [-27, 1],\n      [22, 18],\n      [21, -9],\n      [-16, -10]\n    ],\n    [\n      [8580, 9366],\n      [-7, -7],\n      [-15, 7],\n      [22, 0]\n    ],\n    [\n      [8592, 9374],\n      [-28, 2],\n      [18, 7],\n      [10, -9]\n    ],\n    [\n      [7209, 9382],\n      [0, -11],\n      [-19, 1],\n      [-8, 7],\n      [16, 13],\n      [11, -10]\n    ],\n    [\n      [7078, 9392],\n      [-5, -14],\n      [-16, 10],\n      [21, 4]\n    ],\n    [\n      [6536, 9406],\n      [31, -6],\n      [-8, -26],\n      [-15, -9],\n      [-7, -32],\n      [5, -18],\n      [16, -29],\n      [23, -20],\n      [19, -10],\n      [-49, -5],\n      [-16, 3],\n      [-2, -8],\n      [-14, 12],\n      [-18, -1],\n      [-11, 7],\n      [-11, 34],\n      [-11, -4],\n      [-10, 10],\n      [-19, -6],\n      [-8, 6],\n      [-3, 22],\n      [11, 12],\n      [15, -5],\n      [9, 22],\n      [11, 9],\n      [-20, 7],\n      [7, 8],\n      [21, 1],\n      [-7, 12],\n      [17, 12],\n      [13, -2],\n      [20, 9],\n      [11, -5]\n    ],\n    [\n      [6970, 9416],\n      [1, -13],\n      [11, -6],\n      [-42, -7],\n      [3, 20],\n      [27, 6]\n    ],\n    [\n      [8951, 9436],\n      [32, -18],\n      [0, -21],\n      [-33, 3],\n      [-40, 10],\n      [-27, -4],\n      [2, 8],\n      [17, 1],\n      [17, 22],\n      [32, -1]\n    ],\n    [\n      [8903, 9439],\n      [-10, 16],\n      [20, 5],\n      [2, -17],\n      [-12, -4]\n    ],\n    [\n      [8148, 9464],\n      [-16, -15],\n      [-37, 13],\n      [18, 14],\n      [34, -4],\n      [1, -8]\n    ],\n    [\n      [7281, 9528],\n      [-4, -16],\n      [-14, 11],\n      [18, 5]\n    ],\n    [\n      [9075, 9530],\n      [47, -4],\n      [5, -12],\n      [15, 3],\n      [49, -6],\n      [-8, -15],\n      [-25, -8],\n      [-43, 2],\n      [-58, 24],\n      [7, 20],\n      [11, -4]\n    ],\n    [\n      [8773, 9524],\n      [-11, -1],\n      [6, 29],\n      [14, -16],\n      [-9, -12]\n    ],\n    [\n      [8863, 9565],\n      [40, -20],\n      [10, 14],\n      [19, 1],\n      [-8, 10],\n      [35, -19],\n      [29, 1],\n      [50, -20],\n      [-19, -5],\n      [5, -8],\n      [-16, -15],\n      [-40, 6],\n      [-11, 13],\n      [15, 13],\n      [-3, 8],\n      [-25, -4],\n      [5, -18],\n      [12, -15],\n      [30, -9],\n      [-38, -6],\n      [-14, 10],\n      [-49, -10],\n      [-6, 8],\n      [-17, -18],\n      [-33, 8],\n      [-25, 20],\n      [-2, 34],\n      [18, 1],\n      [-9, 9],\n      [42, 18],\n      [5, -7]\n    ],\n    [\n      [7674, 9577],\n      [3, -9],\n      [-30, 3],\n      [27, 6]\n    ],\n    [\n      [8125, 9595],\n      [2, -10],\n      [-18, 11],\n      [16, -1]\n    ],\n    [\n      [9145, 9596],\n      [-23, 0],\n      [29, 8],\n      [-6, -8]\n    ],\n    [\n      [6893, 9615],\n      [24, -15],\n      [-21, -24],\n      [-51, -17],\n      [-116, -32],\n      [-47, -18],\n      [0, -15],\n      [-22, -8],\n      [-2, -8],\n      [-17, 8],\n      [1, -16],\n      [-26, 8],\n      [15, -17],\n      [-16, -8],\n      [-16, -31],\n      [-24, -20],\n      [-36, 4],\n      [-11, 6],\n      [-20, -6],\n      [-4, 9],\n      [24, 12],\n      [-30, -4],\n      [-2, 8],\n      [26, 12],\n      [-3, 6],\n      [26, 13],\n      [-3, 20],\n      [24, 4],\n      [-14, 7],\n      [18, 4],\n      [-18, 4],\n      [-3, 9],\n      [21, -4],\n      [14, 19],\n      [19, -4],\n      [-5, 11],\n      [38, 20],\n      [23, 3],\n      [14, 11],\n      [23, -2],\n      [0, 12],\n      [52, -5],\n      [61, 15],\n      [49, 28],\n      [35, 1]\n    ],\n    [\n      [7679, 9622],\n      [-33, -4],\n      [35, 11],\n      [-2, -7]\n    ],\n    [\n      [8666, 7787],\n      [3, -13],\n      [-2, -13],\n      [9, -14],\n      [7, 9],\n      [6, 22]\n    ],\n    [\n      [6367, 7850],\n      [-12, -15],\n      [-2, -14],\n      [-4, 9],\n      [-10, -14],\n      [-17, 0],\n      [-7, -31],\n      [-8, -23],\n      [-10, -8],\n      [0, -13],\n      [14, -11],\n      [8, -28],\n      [-2, -14],\n      [6, 19],\n      [-5, -26],\n      [0, -21],\n      [7, -10],\n      [4, -16],\n      [12, -26],\n      [2, -11],\n      [6, -4]\n    ],\n    [\n      [6110, 7681],\n      [-15, 21],\n      [-1, 6],\n      [-18, 24],\n      [-15, 7],\n      [-11, 15],\n      [-9, 1],\n      [-8, 19],\n      [-17, 11],\n      [8, 3],\n      [-1, 11],\n      [8, -6],\n      [11, 2],\n      [5, -4],\n      [0, 16],\n      [-4, 2],\n      [8, 10],\n      [2, 14],\n      [4, -6],\n      [2, 11],\n      [11, 0],\n      [-13, 17],\n      [-5, 0],\n      [-4, 15],\n      [6, -3],\n      [13, 14],\n      [24, 9],\n      [0, 13],\n      [-30, -8]\n    ],\n    [\n      [6061, 7895],\n      [-1, 12],\n      [5, 17],\n      [11, 5],\n      [3, 10],\n      [25, -3],\n      [0, 13],\n      [6, 12],\n      [-8, 29],\n      [10, 5],\n      [-8, 3],\n      [11, 26],\n      [-1, 14],\n      [-10, -2],\n      [-5, 10],\n      [-7, 0],\n      [-5, 9],\n      [-6, -5],\n      [-8, 10],\n      [-18, -4],\n      [-8, 11],\n      [-8, 20],\n      [-16, -6],\n      [-6, -7],\n      [-10, 4],\n      [-5, 8],\n      [-13, -5],\n      [-6, 10],\n      [2, 10],\n      [-4, 19],\n      [-7, 12],\n      [-11, -3],\n      [-13, 12],\n      [-3, 17],\n      [8, 9],\n      [-8, 8],\n      [-1, 10],\n      [-11, 13],\n      [-13, 1],\n      [-9, -8],\n      [-15, 5],\n      [-1, -11],\n      [-12, -7],\n      [-3, 5]\n    ],\n    [\n      [5767, 8523],\n      [9, -9],\n      [6, 9],\n      [-6, 10],\n      [-10, -2],\n      [7, 19],\n      [-4, 30]\n    ],\n    [\n      [5773, 8590],\n      [9, 11]\n    ],\n    [\n      [5778, 8608],\n      [-1, 16],\n      [11, -5],\n      [3, 11],\n      [10, -4],\n      [7, 12],\n      [29, -8],\n      [2, 8],\n      [-9, 9],\n      [-25, 2],\n      [-10, 28],\n      [-16, -9],\n      [-7, 2]\n    ],\n    [\n      [5856, 9203],\n      [15, -9],\n      [19, 18],\n      [16, -11],\n      [14, -3],\n      [-7, -8],\n      [-20, 4],\n      [6, -7],\n      [19, -3],\n      [-6, -7],\n      [19, 4],\n      [5, -5],\n      [35, -7],\n      [23, -1],\n      [52, -28],\n      [21, -21],\n      [14, -2],\n      [16, -14],\n      [13, -3],\n      [30, -21],\n      [1, -23],\n      [7, -2],\n      [-5, -24],\n      [-21, -24],\n      [-30, -15],\n      [-22, -4],\n      [-28, 5],\n      [-22, 9],\n      [-27, 3],\n      [-27, 15],\n      [-36, 7],\n      [-24, 23],\n      [-11, 0],\n      [8, -15],\n      [18, -11],\n      [3, -9],\n      [13, -6],\n      [-4, -7],\n      [14, -3],\n      [21, -20],\n      [-4, -21],\n      [-6, -7],\n      [13, -46],\n      [-6, -4],\n      [16, -15],\n      [15, 2],\n      [12, -18],\n      [31, -13],\n      [16, 9],\n      [1, 21],\n      [-25, 5],\n      [-16, 19],\n      [-3, 12],\n      [10, 2],\n      [7, 12],\n      [18, -9],\n      [10, -13],\n      [0, -9],\n      [10, 10],\n      [31, -15],\n      [9, 7],\n      [18, -7],\n      [-4, 22],\n      [-19, 30],\n      [4, 9],\n      [18, 12],\n      [6, 9],\n      [18, 5],\n      [22, 27],\n      [11, -8],\n      [20, 3],\n      [22, -21],\n      [1, 11],\n      [11, 23],\n      [0, 16],\n      [-20, 19],\n      [10, 28],\n      [3, 31],\n      [-25, 18],\n      [18, -4],\n      [37, 0],\n      [18, -6],\n      [16, -18],\n      [5, -18],\n      [-38, -5],\n      [-12, -22],\n      [17, -9],\n      [8, -17],\n      [20, -5],\n      [34, 13],\n      [5, 22],\n      [-3, 11],\n      [26, 7],\n      [1, 6],\n      [24, 9],\n      [31, 22],\n      [8, -1],\n      [31, 13],\n      [-1, -12],\n      [16, 4],\n      [-12, 10],\n      [32, 18],\n      [15, -3],\n      [-7, -14],\n      [6, -13],\n      [-21, -8],\n      [29, -3],\n      [7, 6],\n      [11, -7],\n      [1, 12],\n      [29, 14],\n      [38, -5],\n      [18, 17],\n      [25, 8],\n      [15, -13],\n      [-10, -8],\n      [1, -13],\n      [16, -4],\n      [8, 10],\n      [-6, 7],\n      [20, 5],\n      [13, 11],\n      [0, 10],\n      [-22, 28],\n      [15, 6],\n      [2, 10],\n      [74, -10],\n      [20, -7],\n      [19, -15],\n      [62, -29],\n      [33, -25],\n      [2, -9],\n      [17, 25],\n      [7, 19],\n      [-21, 2],\n      [-10, 16],\n      [-1, 12],\n      [-35, 14],\n      [3, 16],\n      [12, 3],\n      [-6, 9],\n      [6, 15],\n      [-1, 20],\n      [-16, -3],\n      [-2, 17],\n      [8, 14],\n      [28, 12],\n      [15, 17],\n      [14, 51],\n      [12, 16],\n      [5, -5],\n      [52, 1],\n      [39, -11],\n      [1, -25],\n      [-16, -26],\n      [1, -7],\n      [-15, -11],\n      [8, -13],\n      [16, -10],\n      [5, -15],\n      [-2, -25],\n      [-10, -9],\n      [8, -25],\n      [-5, -11],\n      [3, -21],\n      [-3, -16],\n      [5, -8],\n      [26, -20],\n      [-15, -16],\n      [3, -22],\n      [-18, -13],\n      [-9, -27],\n      [-20, -14],\n      [2, -15],\n      [-15, -1],\n      [-10, -7],\n      [-22, 21],\n      [-22, -6],\n      [8, -15],\n      [27, -10],\n      [22, 2],\n      [24, -8],\n      [10, 6],\n      [2, 16],\n      [13, 2],\n      [26, 20],\n      [1, 17],\n      [24, 24],\n      [-1, 25],\n      [-11, 15],\n      [3, 17],\n      [29, 12],\n      [31, 4],\n      [1, -11],\n      [19, -15],\n      [-5, -15],\n      [5, -20],\n      [-7, -7],\n      [18, -13],\n      [18, -1],\n      [-25, 13],\n      [0, 18],\n      [20, 10],\n      [-11, 14],\n      [-5, 24],\n      [-19, 5],\n      [-24, 13],\n      [-17, 1],\n      [-20, -10],\n      [-27, 5],\n      [3, 18],\n      [-10, 15],\n      [6, 25],\n      [17, 20],\n      [-21, 41],\n      [-15, 12],\n      [14, 22],\n      [39, 16],\n      [5, 17],\n      [-4, 28],\n      [15, -7],\n      [6, -30],\n      [-13, -17],\n      [7, -17],\n      [-5, -18],\n      [11, -4],\n      [57, -7],\n      [6, -11],\n      [12, 0],\n      [-4, 17],\n      [-17, 2],\n      [-39, 16],\n      [-8, 20],\n      [27, 8],\n      [17, -13],\n      [15, 3],\n      [-5, 14],\n      [-15, -2],\n      [15, 14],\n      [16, 5],\n      [28, -3],\n      [51, -35],\n      [23, -3],\n      [18, 5],\n      [14, -7],\n      [-14, -16],\n      [-16, -6],\n      [-2, -17],\n      [7, -12],\n      [-10, -12],\n      [11, 2],\n      [0, 11],\n      [10, 11],\n      [9, -6],\n      [-4, -27],\n      [-10, -9],\n      [14, -10],\n      [-7, 14],\n      [18, 0],\n      [6, 8],\n      [-17, 44],\n      [13, 23],\n      [-6, 11],\n      [-32, 15],\n      [-3, 11],\n      [-26, 4],\n      [-14, 11],\n      [4, 23],\n      [-11, 9],\n      [2, 28],\n      [39, 5],\n      [43, -1],\n      [59, 10],\n      [40, 3],\n      [-23, -18],\n      [25, 2],\n      [10, 13],\n      [-19, 21],\n      [-22, 4],\n      [14, 18],\n      [-21, 4],\n      [13, 10],\n      [16, -7],\n      [68, 47],\n      [67, 8],\n      [66, 16],\n      [-28, 9],\n      [19, 3],\n      [22, -5],\n      [25, 7],\n      [21, -3],\n      [-16, -13],\n      [58, 10],\n      [32, 12],\n      [29, -10],\n      [-29, 24],\n      [18, -3],\n      [40, 4],\n      [1, 26],\n      [63, 39],\n      [43, 3],\n      [33, -17],\n      [-21, -13],\n      [-24, -3],\n      [82, -7],\n      [6, -6],\n      [-27, -21],\n      [36, -1],\n      [4, 12],\n      [38, 1],\n      [19, -4],\n      [27, 5],\n      [47, -24],\n      [3, -16],\n      [19, 4],\n      [3, -28],\n      [-21, 5],\n      [1, -12],\n      [22, -1],\n      [-2, -14],\n      [-20, -17],\n      [-20, -6],\n      [-12, -13],\n      [-47, -16],\n      [-2, -9],\n      [-32, -15],\n      [-20, -19],\n      [-27, -1],\n      [-12, -18],\n      [-17, -2],\n      [-6, -15],\n      [-15, -12],\n      [23, 6],\n      [7, 17],\n      [37, -2],\n      [15, 8],\n      [51, 12],\n      [23, 10],\n      [-7, 6],\n      [-25, -5],\n      [-6, 8],\n      [13, 10],\n      [25, -6],\n      [7, 7],\n      [8, -13],\n      [19, -6],\n      [22, 5],\n      [-2, 12],\n      [16, -20],\n      [-8, -12],\n      [44, 9],\n      [19, 7],\n      [100, -13],\n      [-18, -4],\n      [1, -11],\n      [38, -12],\n      [36, -5],\n      [25, 2],\n      [21, -8],\n      [-7, 11],\n      [19, -6],\n      [11, 17],\n      [-8, 10],\n      [3, 16],\n      [17, -2],\n      [10, 10],\n      [23, -14],\n      [29, 0],\n      [12, -16],\n      [7, 15],\n      [30, -4],\n      [7, -12],\n      [34, -14],\n      [-34, -12],\n      [30, -6],\n      [-39, -3],\n      [20, -10],\n      [18, -1],\n      [6, -12],\n      [-15, -11],\n      [-19, 8],\n      [27, -37],\n      [13, -27],\n      [40, -21],\n      [13, 12],\n      [18, 43],\n      [10, 14],\n      [13, -19],\n      [23, -12],\n      [22, 0],\n      [4, 6],\n      [31, 8],\n      [22, -6],\n      [19, -11],\n      [11, -13],\n      [7, 27],\n      [16, 4],\n      [12, -13],\n      [17, 2],\n      [-3, 27],\n      [15, 17],\n      [-29, 0],\n      [12, 16],\n      [37, 2],\n      [4, 10],\n      [-12, 9],\n      [23, -1],\n      [23, -9],\n      [38, 0],\n      [50, -8],\n      [39, -12],\n      [-37, 1],\n      [-16, 4],\n      [-13, -15],\n      [27, 6],\n      [42, 2],\n      [-26, -26],\n      [10, 16],\n      [-12, 4],\n      [-3, -17],\n      [-23, -12],\n      [29, 4],\n      [30, 31],\n      [36, 0],\n      [34, -9],\n      [13, -13],\n      [-12, -9],\n      [-7, 7],\n      [-9, -11],\n      [25, -2],\n      [-2, -11],\n      [20, 2],\n      [0, -13],\n      [24, 3],\n      [18, -20],\n      [-13, 0],\n      [26, -9],\n      [28, 3],\n      [65, 12],\n      [45, -1],\n      [26, -6],\n      [33, -17],\n      [11, -25],\n      [-11, -19],\n      [3, -8],\n      [31, -8],\n      [3, -28],\n      [11, -11],\n      [-10, -25],\n      [14, 22],\n      [-2, 26],\n      [19, 17],\n      [51, 7],\n      [23, -12],\n      [23, 2],\n      [11, -5],\n      [24, -1],\n      [21, 16],\n      [16, -13],\n      [2, -19],\n      [29, -8],\n      [7, -18],\n      [22, 4],\n      [17, 12],\n      [-13, 32],\n      [-11, -1],\n      [11, 11],\n      [-1, 19],\n      [41, -7],\n      [22, -1],\n      [17, -10],\n      [1, 9],\n      [37, -6],\n      [20, 2],\n      [28, -7],\n      [71, -27],\n      [17, -16],\n      [-9958, -15],\n      [3, -12],\n      [28, -11],\n      [2, -9],\n      [12, 1],\n      [20, -19],\n      [16, -2],\n      [-10, -7],\n      [12, -5],\n      [0, 10],\n      [12, -7],\n      [8, -20],\n      [10, -2],\n      [-3, -18],\n      [5, -13],\n      [-7, -6],\n      [14, -8],\n      [-1, -14],\n      [17, 13],\n      [-11, 3],\n      [9, 6],\n      [-2, 17],\n      [-9, 6],\n      [27, 1],\n      [20, -12],\n      [-5, 9],\n      [32, -6],\n      [10, -17],\n      [13, -7],\n      [10, -17],\n      [5, 4],\n      [17, -14],\n      [-9, 0],\n      [-14, -11],\n      [-5, -15],\n      [-21, 13],\n      [11, -20],\n      [-32, 3],\n      [4, -27],\n      [-19, -12],\n      [-8, -11],\n      [16, -5],\n      [6, -9],\n      [-13, -1],\n      [-12, -9],\n      [-23, 10],\n      [-2, 8],\n      [-16, 10],\n      [-33, 12],\n      [-4, 29],\n      [-29, 10],\n      [-12, -10],\n      [-30, 4],\n      [-11, 27],\n      [9, 7],\n      [2, 15],\n      [-7, -11],\n      [-28, -4],\n      [0, -16],\n      [13, -11],\n      [-7, -23],\n      [9982, -11],\n      [-10, -13],\n      [-34, -9],\n      [-21, 8],\n      [-1, 8],\n      [-16, 9],\n      [12, -16],\n      [-24, 2],\n      [-11, 7],\n      [20, -23],\n      [20, 12],\n      [-3, -16],\n      [17, -17],\n      [8, 8],\n      [12, -25],\n      [2, -16],\n      [-5, -13],\n      [18, -9],\n      [2, -20],\n      [7, -16],\n      [-12, -7],\n      [0, -10],\n      [-28, 12],\n      [-22, 3],\n      [-10, 16],\n      [2, -16],\n      [-21, -16],\n      [-25, -11],\n      [-25, -18],\n      [-12, 2],\n      [-7, -10],\n      [-8, 4],\n      [-1, -10],\n      [-10, -10],\n      [-11, 2],\n      [5, -8],\n      [-22, -13],\n      [-3, -12],\n      [-17, -4],\n      [-1, -9],\n      [-15, -7],\n      [-10, -16],\n      [-6, -18],\n      [-8, 8],\n      [-7, 21],\n      [-13, 9],\n      [-32, 0],\n      [-35, -20],\n      [-16, -23],\n      [-4, 0],\n      [8, 39],\n      [-33, -24],\n      [-5, -14],\n      [-7, -2],\n      [-2, 11],\n      [-30, 3],\n      [2, -9],\n      [-9, -4],\n      [-5, -19],\n      [4, -12],\n      [-12, -10],\n      [4, -10],\n      [-18, -16],\n      [-10, -26],\n      [1, -19],\n      [13, -7],\n      [1, 11],\n      [18, -8],\n      [3, -6],\n      [-15, -21],\n      [1, -36],\n      [11, 1],\n      [4, -32],\n      [-9, -10],\n      [-12, 13],\n      [8, 11],\n      [-6, 4],\n      [-8, -7],\n      [6, -6],\n      [-16, -12],\n      [-7, -25],\n      [-1, -16],\n      [11, -34],\n      [-11, -14],\n      [-13, -1],\n      [-6, 6],\n      [-15, -9],\n      [-13, -15],\n      [-6, -22],\n      [4, -13],\n      [-3, -6],\n      [5, -22],\n      [-13, 10],\n      [-9, -5],\n      [-21, -25],\n      [1, -26],\n      [-7, -19],\n      [-10, -20],\n      [-11, -7],\n      [-2, -8],\n      [-17, -22],\n      [-9, 17],\n      [-1, 40],\n      [-4, 33],\n      [-7, 23],\n      [-4, 46],\n      [-9, 60],\n      [-2, 29],\n      [4, 46],\n      [6, 29],\n      [6, 15],\n      [17, 15],\n      [7, 17],\n      [-5, 22],\n      [16, 0],\n      [7, 14],\n      [15, 0],\n      [20, 19],\n      [24, 33],\n      [3, 13],\n      [13, 12],\n      [5, 12],\n      [8, 2],\n      [18, 25],\n      [14, 14],\n      [-1, 8],\n      [30, 21],\n      [21, 9],\n      [-8, 4],\n      [15, 18],\n      [-7, 9],\n      [8, 12],\n      [2, 33],\n      [14, 12],\n      [17, -5],\n      [-18, 17],\n      [-15, -1],\n      [-22, -8],\n      [3, -11],\n      [-8, -6],\n      [3, -9],\n      [-6, -15],\n      [10, -9],\n      [-10, -7],\n      [-5, 11],\n      [-10, -2],\n      [-12, -18],\n      [-32, -32],\n      [-19, -14],\n      [8, 27],\n      [-17, -7],\n      [5, 11],\n      [-3, 9],\n      [14, 29],\n      [-3, 10],\n      [-12, -14],\n      [-10, -2],\n      [-3, 12],\n      [-13, 2],\n      [-26, -10],\n      [-15, 3],\n      [-22, -15],\n      [-1, -18],\n      [-20, -20],\n      [0, -9],\n      [-27, -20],\n      [-13, -28],\n      [-7, -1],\n      [-2, -23],\n      [14, 5],\n      [16, -14],\n      [-1, -7],\n      [-11, -3],\n      [-8, 5],\n      [-13, -10],\n      [-19, 11],\n      [0, -8],\n      [-10, -2],\n      [-2, -8],\n      [-16, 8],\n      [-9, -11],\n      [-17, -2],\n      [-9, 15],\n      [10, 4],\n      [18, -1],\n      [6, 4],\n      [-15, 8],\n      [-10, 14],\n      [-13, -8],\n      [-12, 2],\n      [-2, 7],\n      [-23, 8],\n      [-16, -8],\n      [5, -5],\n      [-14, -5],\n      [6, -12],\n      [-14, 2],\n      [-2, 7],\n      [-12, 0],\n      [-10, -9],\n      [-31, 13],\n      [-3, -16],\n      [-8, -3],\n      [-6, 9],\n      [4, 6],\n      [-27, -1],\n      [-32, 2],\n      [-19, -3],\n      [-25, -13],\n      [-19, -30],\n      [-17, -11],\n      [-8, -13],\n      [-5, -20],\n      [-15, -9],\n      [-4, -11],\n      [-11, -12],\n      [-14, -9],\n      [-22, -32],\n      [-12, -26],\n      [-26, -27],\n      [-8, -4],\n      [-15, -23],\n      [-19, -15],\n      [0, -12],\n      [14, -9],\n      [30, 5],\n      [0, -28],\n      [-4, -21],\n      [12, 0],\n      [5, 14],\n      [-6, 6],\n      [10, 10],\n      [8, -2],\n      [-8, -11],\n      [9, -11],\n      [-12, -22],\n      [16, 4],\n      [11, 9],\n      [7, 14],\n      [1, -9],\n      [-10, -15],\n      [7, -3],\n      [8, 26],\n      [-1, 20],\n      [16, -8],\n      [9, 5],\n      [17, -12],\n      [0, -11],\n      [27, -32],\n      [6, -10],\n      [-13, -12],\n      [8, -5],\n      [1, -15],\n      [-4, -13],\n      [11, -12],\n      [-6, -3],\n      [3, -9],\n      [-9, -16],\n      [-6, -3],\n      [0, -12],\n      [-6, -8],\n      [0, -18],\n      [-4, -4],\n      [-3, -20],\n      [1, -32],\n      [3, -23],\n      [-6, -17],\n      [1, -17],\n      [-6, -17],\n      [0, -14],\n      [-26, -38],\n      [-7, -28],\n      [-13, -18],\n      [-5, -27],\n      [-18, -41],\n      [-15, -25],\n      [-10, -11],\n      [-8, -20],\n      [-6, -6],\n      [-5, -15],\n      [-7, -5],\n      [-11, -25],\n      [-3, -14],\n      [-5, 0],\n      [-1, -12],\n      [-18, -20],\n      [-9, -6],\n      [-7, -11],\n      [-8, 0],\n      [-12, -10],\n      [-6, 7],\n      [-4, -4],\n      [-12, 10],\n      [-3, -4],\n      [-1, 23],\n      [-9, -11],\n      [1, 15],\n      [-16, -21],\n      [-1, -11],\n      [-14, -11],\n      [-4, -17]\n    ],\n    [\n      [7858, 9748],\n      [0, -12],\n      [30, 4],\n      [14, -16],\n      [16, -1],\n      [8, -19],\n      [-16, -10],\n      [-31, -5],\n      [-68, -3],\n      [-33, -14],\n      [-21, 5],\n      [21, 17],\n      [6, 19],\n      [36, 39],\n      [19, -6],\n      [2, 11],\n      [17, -9]\n    ],\n    [\n      [7118, 9769],\n      [37, -6],\n      [-27, -3],\n      [-10, 9]\n    ],\n    [\n      [7523, 9794],\n      [79, -8],\n      [-18, -13],\n      [-55, 8],\n      [-6, 13]\n    ],\n    [\n      [6659, 9787],\n      [-27, 3],\n      [21, 7],\n      [6, -10]\n    ],\n    [\n      [7715, 9797],\n      [-5, -21],\n      [25, 17],\n      [20, 0],\n      [24, -16],\n      [-9, -24],\n      [-19, -5],\n      [25, -18],\n      [-39, -10],\n      [-38, 4],\n      [-11, 8],\n      [-50, 2],\n      [-18, 12],\n      [-1, 14],\n      [-33, 3],\n      [29, 14],\n      [23, 19],\n      [77, 1]\n    ],\n    [\n      [6585, 9810],\n      [-4, -16],\n      [-28, 0],\n      [1, 14],\n      [31, 2]\n    ],\n    [\n      [6481, 9813],\n      [15, -7],\n      [-35, -6],\n      [20, 13]\n    ],\n    [\n      [6646, 9809],\n      [-52, -12],\n      [-13, 20],\n      [42, 0],\n      [23, -8]\n    ],\n    [\n      [6329, 9836],\n      [-38, -20],\n      [-39, 11],\n      [77, 9]\n    ],\n    [\n      [6729, 9835],\n      [-5, -10],\n      [-29, -12],\n      [-38, 1],\n      [-13, 13],\n      [14, 11],\n      [65, 2],\n      [6, -5]\n    ],\n    [\n      [6537, 9839],\n      [-13, -8],\n      [-22, 8],\n      [35, 0]\n    ],\n    [\n      [6388, 9840],\n      [7, -8],\n      [30, 3],\n      [-9, -14],\n      [-60, -9],\n      [4, -14],\n      [-38, -4],\n      [16, 15],\n      [-22, 8],\n      [63, 10],\n      [-18, 7],\n      [27, 6]\n    ],\n    [\n      [7225, 9845],\n      [-28, -9],\n      [2, 9],\n      [26, 0]\n    ],\n    [\n      [6560, 9854],\n      [57, -11],\n      [-29, -1],\n      [-28, 12]\n    ],\n    [\n      [6542, 9848],\n      [13, 2],\n      [47, -13],\n      [-19, -7],\n      [-41, 18]\n    ],\n    [\n      [6797, 9859],\n      [20, -16],\n      [-28, -11],\n      [-36, -3],\n      [-17, 9],\n      [46, 10],\n      [15, 11]\n    ],\n    [\n      [7536, 9852],\n      [-37, 1],\n      [2, 7],\n      [38, -2],\n      [-3, -6]\n    ],\n    [\n      [7665, 9859],\n      [54, -29],\n      [-20, -3],\n      [0, -24],\n      [-75, -6],\n      [-22, -7],\n      [-63, 20],\n      [36, 9],\n      [15, 17],\n      [-22, -3],\n      [16, 14],\n      [81, 12]\n    ],\n    [\n      [6577, 9869],\n      [28, -6],\n      [-38, -6],\n      [10, 12]\n    ],\n    [\n      [6605, 9878],\n      [14, -9],\n      [-44, 4],\n      [30, 5]\n    ],\n    [\n      [5846, 5121],\n      [2, -14],\n      [5, -5],\n      [3, -11],\n      [1, -26],\n      [-1, -18],\n      [-8, -2]\n    ],\n    [\n      [5801, 5040],\n      [6, 7],\n      [8, 22],\n      [-4, 17]\n    ],\n    [\n      [5821, 5103],\n      [7, 4],\n      [4, -9],\n      [5, 7],\n      [5, 16],\n      [4, 0]\n    ],\n    [\n      [4526, 6379],\n      [-1, 15],\n      [2, 22]\n    ],\n    [\n      [6163, 6147],\n      [4, 4],\n      [4, -6],\n      [-8, 2]\n    ],\n    [\n      [6345, 6826],\n      [6, -29],\n      [6, -11],\n      [0, -14],\n      [11, -4],\n      [-4, -5],\n      [5, -5],\n      [11, -23],\n      [8, -6],\n      [0, -16],\n      [6, -10],\n      [-2, -18],\n      [-4, 4],\n      [7, -31],\n      [8, -17],\n      [0, -12],\n      [8, -21]\n    ],\n    [\n      [6422, 6601],\n      [7, -4],\n      [-5, -9],\n      [8, -8]\n    ],\n    [\n      [6443, 6277],\n      [-4, -2],\n      [-58, -16],\n      [-17, -4],\n      [-27, -27],\n      [-16, -40],\n      [-3, -19],\n      [-9, -11],\n      [-5, 1],\n      [-7, 19],\n      [-11, -3],\n      [-25, 5],\n      [-5, 6],\n      [-16, 1],\n      [-15, -5],\n      [-11, 0],\n      [-7, 10],\n      [-9, -11],\n      [-1, -24],\n      [2, -15],\n      [-11, -16]\n    ],\n    [\n      [6188, 6126],\n      [-2, 21],\n      [-5, 8],\n      [0, 8],\n      [-6, 9],\n      [0, 15],\n      [-15, 23],\n      [-9, 25],\n      [0, 8],\n      [-7, 16],\n      [-2, 14],\n      [-11, 49],\n      [-18, 29],\n      [-9, 3],\n      [-6, 13],\n      [-13, 43],\n      [3, 7],\n      [-7, 28],\n      [4, 20],\n      [0, 19],\n      [-8, 23],\n      [0, 8],\n      [-14, 46],\n      [-18, 21],\n      [-2, -3],\n      [-12, 35],\n      [3, 0],\n      [0, 20],\n      [-4, 7],\n      [-4, 18],\n      [-8, 11],\n      [1, 11],\n      [-5, 5],\n      [-8, 30],\n      [-4, 7],\n      [-8, 26],\n      [-7, 15],\n      [-6, 24],\n      [-8, 14],\n      [-6, -3],\n      [-6, 7],\n      [5, 20],\n      [4, 47]\n    ],\n    [\n      [6024, 6449],\n      [0, -20],\n      [6, -21],\n      [2, -34],\n      [2, -65],\n      [5, -40],\n      [4, -8],\n      [10, -8],\n      [5, -9],\n      [1, -10],\n      [10, -6],\n      [3, -8]\n    ],\n    [\n      [5946, 5727],\n      [-6, 5],\n      [3, 17],\n      [-2, 21],\n      [-20, 35],\n      [-3, 45],\n      [2, 5],\n      [2, 31],\n      [-13, 0],\n      [0, -12],\n      [-18, 0],\n      [7, -17],\n      [0, -27],\n      [2, -11],\n      [-14, -24],\n      [-1, -9],\n      [-18, -39],\n      [-13, -4],\n      [-14, 23],\n      [-7, 8],\n      [-11, -12],\n      [-4, -17],\n      [-13, -9],\n      [-5, -10],\n      [1, -6],\n      [-23, 0],\n      [-4, 15],\n      [-22, 1],\n      [-14, -7],\n      [-11, 27],\n      [-8, 12],\n      [-2, 15],\n      [-21, -7],\n      [-3, -21],\n      [-5, -6],\n      [0, -19],\n      [-3, -6],\n      [-3, -29],\n      [-11, -12]\n    ],\n    [\n      [5634, 5812],\n      [3, 13],\n      [-1, 15],\n      [-4, -1],\n      [-7, 16],\n      [3, 23],\n      [-5, -2],\n      [0, 34],\n      [-7, 7],\n      [-6, -7],\n      [-5, 9],\n      [6, 21],\n      [7, 14],\n      [-5, 25],\n      [4, 9],\n      [9, 9],\n      [-4, 7],\n      [-1, 18],\n      [8, 6],\n      [0, 10],\n      [7, 15],\n      [2, 15],\n      [-2, 11],\n      [7, 9],\n      [12, 2],\n      [11, -2],\n      [0, 218]\n    ],\n    [\n      [5943, 5426],\n      [-14, -28],\n      [-9, 2],\n      [-3, 6],\n      [-5, -5],\n      [-13, -3],\n      [-6, -13],\n      [-7, 5],\n      [-4, 12],\n      [-7, -8],\n      [-11, 7],\n      [-8, -17]\n    ],\n    [\n      [4535, 5893],\n      [-1, 42]\n    ],\n    [\n      [4540, 5965],\n      [-5, 11],\n      [-1, 13],\n      [-14, 41],\n      [-8, 3],\n      [11, 9],\n      [8, 18],\n      [9, 33]\n    ],\n    [\n      [7884, 5266],\n      [4, -3],\n      [-4, -7],\n      [-7, 2],\n      [7, 8]\n    ],\n    [\n      [3953, 2073],\n      [22, -4],\n      [11, -7],\n      [17, -21],\n      [3, -11],\n      [-10, -7],\n      [-10, 20],\n      [-12, 11],\n      [-22, 11],\n      [1, 8]\n    ],\n    [\n      [9445, 4521],\n      [15, -17],\n      [-6, 0],\n      [-3, 9],\n      [-8, 4],\n      [2, 4]\n    ],\n    [\n      [9612, 4569],\n      [-6, -12],\n      [-3, 7],\n      [9, 5]\n    ],\n    [\n      [9481, 4595],\n      [13, -14],\n      [8, 0],\n      [5, -13],\n      [0, -8],\n      [-12, 4],\n      [-9, 10],\n      [-1, 11],\n      [-6, 3],\n      [2, 7]\n    ],\n    [\n      [9483, 4641],\n      [4, -12],\n      [0, -10],\n      [-5, 7],\n      [1, 15]\n    ],\n    [\n      [9442, 4640],\n      [13, 0],\n      [11, -20],\n      [-4, -9],\n      [-10, 7],\n      [-13, 1],\n      [-6, 13],\n      [0, 16],\n      [3, 2],\n      [6, -10]\n    ],\n    [\n      [9388, 4691],\n      [3, -9],\n      [-6, 0],\n      [3, 9]\n    ],\n    [\n      [9371, 4689],\n      [-5, 3],\n      [5, 6],\n      [0, -9]\n    ],\n    [\n      [9466, 4701],\n      [6, -16],\n      [-2, -11],\n      [5, -5],\n      [7, -34],\n      [-14, 21],\n      [-3, 10],\n      [-5, 37],\n      [6, -2]\n    ],\n    [\n      [9378, 4711],\n      [4, -3],\n      [3, -19],\n      [-7, 4],\n      [-2, 13],\n      [-9, -2],\n      [-1, 6],\n      [6, 13],\n      [5, -1],\n      [1, -11]\n    ],\n    [\n      [9365, 4716],\n      [-5, 1],\n      [-1, 9],\n      [4, 5],\n      [2, -15]\n    ],\n    [\n      [9349, 4747],\n      [6, -9],\n      [-4, -9],\n      [-5, 14],\n      [3, 4]\n    ],\n    [\n      [9405, 4746],\n      [4, 0],\n      [9, -16],\n      [12, -12],\n      [9, -15],\n      [1, -13],\n      [-7, 12],\n      [-11, 9],\n      [-18, 25],\n      [-3, 13],\n      [4, -3]\n    ],\n    [\n      [9349, 4800],\n      [13, -15],\n      [3, -16],\n      [10, -7],\n      [-2, -7],\n      [-15, 13],\n      [-7, 18],\n      [-6, 9],\n      [4, 5]\n    ],\n    [\n      [4650, 5621],\n      [2, -12],\n      [-12, 10],\n      [10, 2]\n    ],\n    [\n      [4681, 5581],\n      [-6, 9],\n      [-23, 18],\n      [1, 15],\n      [-7, 4],\n      [-6, 10],\n      [2, 3],\n      [-3, 18],\n      [-5, -4],\n      [-3, 18],\n      [7, 1],\n      [-6, 7],\n      [0, 11],\n      [4, 7],\n      [-6, 5]\n    ],\n    [\n      [2560, 5955],\n      [-2, -14],\n      [-12, 0],\n      [-13, 5],\n      [-14, 14],\n      [-14, 2],\n      [-8, 11]\n    ],\n    [\n      [6359, 5831],\n      [0, -104],\n      [-27, -84]\n    ],\n    [\n      [6201, 5844],\n      [18, -44],\n      [13, -18],\n      [15, 0],\n      [11, 15],\n      [4, 0],\n      [10, 12],\n      [11, -4],\n      [6, -7],\n      [6, 4],\n      [21, 25],\n      [8, -5],\n      [14, 3],\n      [9, 10],\n      [12, -4]\n    ],\n    [\n      [6359, 5831],\n      [14, 5],\n      [4, 7],\n      [7, 0],\n      [12, 7],\n      [13, 23],\n      [15, -9],\n      [-5, -19],\n      [-1, -18],\n      [2, -35],\n      [8, -8],\n      [-14, -6],\n      [-3, -53],\n      [-4, -8],\n      [-1, -12],\n      [-6, -10],\n      [-3, -22],\n      [-6, -20],\n      [-8, -13],\n      [0, -11],\n      [-6, -25],\n      [-10, -29],\n      [-4, -29],\n      [-12, -48],\n      [-13, -33],\n      [-7, -26],\n      [-12, -30],\n      [-14, -28],\n      [-10, -24],\n      [-9, -15],\n      [-8, -19],\n      [-21, -26],\n      [-8, -7],\n      [-18, -27],\n      [-8, -17],\n      [-10, -15],\n      [-22, -48],\n      [-11, -21],\n      [-18, -49],\n      [-9, -28]\n    ],\n    [\n      [5183, 5187],\n      [-3, -2],\n      [-1, 13],\n      [5, 8],\n      [3, -11],\n      [-4, -8]\n    ],\n    [\n      [3409, 5499],\n      [3, 3],\n      [1, 20],\n      [5, 7],\n      [8, -2],\n      [20, -10],\n      [2, 10],\n      [33, 0],\n      [18, -8],\n      [-1, -20],\n      [-3, -8]\n    ],\n    [\n      [5626, 8009],\n      [-12, -39]\n    ],\n    [\n      [5377, 7802],\n      [3, 6]\n    ],\n    [\n      [5474, 8485],\n      [-7, -30],\n      [-12, -34],\n      [0, 19],\n      [19, 45]\n    ],\n    [\n      [5521, 8514],\n      [8, 1],\n      [-8, -14],\n      [-2, -22],\n      [-10, -8],\n      [-5, 7],\n      [-1, 19],\n      [10, 16],\n      [8, 1]\n    ],\n    [\n      [5327, 8537],\n      [-2, -9],\n      [-9, 3],\n      [11, 6]\n    ],\n    [\n      [5671, 8973],\n      [-41, -2],\n      [-9, 5],\n      [1, -19],\n      [-16, 0],\n      [3, -8],\n      [-13, 0],\n      [4, -13],\n      [-10, -13],\n      [-4, -15],\n      [12, -15],\n      [-17, -17],\n      [-4, -15],\n      [-13, -13],\n      [-8, 1],\n      [-11, -13],\n      [-32, -24],\n      [0, -9],\n      [-17, -3],\n      [5, -11],\n      [-5, -7],\n      [-15, -2],\n      [5, -14],\n      [-5, -29],\n      [-7, -9],\n      [5, -32],\n      [0, -18],\n      [10, -10],\n      [10, 4],\n      [14, -25],\n      [9, -2],\n      [6, -19],\n      [-20, -23],\n      [-6, 3],\n      [8, -16],\n      [-17, -16],\n      [-18, -13],\n      [-13, -2],\n      [8, -8],\n      [-6, -3],\n      [3, -15],\n      [-10, -16],\n      [6, -8],\n      [0, -17],\n      [-6, -10],\n      [-3, -37],\n      [-3, 0],\n      [-6, -23],\n      [-5, -8],\n      [-6, 5],\n      [-27, -3],\n      [-11, -14],\n      [-2, -11],\n      [5, -10],\n      [-6, -9],\n      [-11, 3],\n      [-10, -5],\n      [-14, 2],\n      [4, 15],\n      [-14, 31],\n      [8, 6],\n      [-6, 8],\n      [8, 2],\n      [-15, 26],\n      [-18, 47],\n      [4, 27],\n      [-4, 8],\n      [-9, -4],\n      [-4, 9],\n      [-1, 39],\n      [6, -6]\n    ],\n    [\n      [5891, 3637],\n      [-3, 2],\n      [-1, -29],\n      [-12, 0],\n      [-11, 7],\n      [-9, 22],\n      [0, 24],\n      [7, 17],\n      [1, 10],\n      [8, 11],\n      [14, -15],\n      [2, 2]\n    ],\n    [\n      [3249, 6221],\n      [-2, 2]\n    ],\n    [\n      [5999, 7178],\n      [-3, 27],\n      [1, 18],\n      [-4, 4],\n      [1, 20],\n      [3, 4]\n    ],\n    [\n      [5997, 7251],\n      [7, -5],\n      [5, 9],\n      [0, 11],\n      [9, 3],\n      [-4, 14],\n      [4, 21],\n      [8, -5],\n      [2, -7],\n      [12, 0],\n      [5, 6],\n      [18, 10],\n      [10, -11],\n      [16, -3],\n      [21, 8],\n      [20, 17],\n      [22, -1],\n      [16, 7],\n      [4, 7],\n      [4, -12]\n    ],\n    [\n      [5402, 5930],\n      [5, 0],\n      [0, 13],\n      [-4, 3],\n      [-6, -5],\n      [2, -5]\n    ],\n    [\n      [5398, 5936],\n      [-1, 0]\n    ],\n    [\n      [5044, 5541],\n      [-12, -7]\n    ],\n    [\n      [7728, 5654],\n      [6, -7],\n      [0, -10],\n      [-6, -6],\n      [0, 23]\n    ],\n    [\n      [7840, 5883],\n      [5, -11],\n      [-4, 1],\n      [-1, 10]\n    ],\n    [\n      [7858, 5853],\n      [-4, 22],\n      [-5, 11],\n      [-1, -7],\n      [-12, 18],\n      [0, 8],\n      [-5, 0],\n      [-8, 10],\n      [-7, -5],\n      [-16, 5],\n      [3, 15],\n      [-3, 7],\n      [4, 21],\n      [-11, 5],\n      [-15, -8],\n      [-2, -9],\n      [4, -13],\n      [-4, -16],\n      [0, -27],\n      [2, -5],\n      [-7, -15],\n      [0, -11],\n      [-4, -13],\n      [-5, -20],\n      [0, -15],\n      [-9, -32],\n      [2, -7],\n      [-2, -27],\n      [5, -21],\n      [-3, -10],\n      [16, 5],\n      [4, -12],\n      [1, -29],\n      [9, -16],\n      [0, -12],\n      [4, -37],\n      [4, -16],\n      [-4, 4],\n      [-3, 29],\n      [-6, -2],\n      [2, -13],\n      [6, -18],\n      [6, 0],\n      [9, -18],\n      [12, 1],\n      [6, -4],\n      [6, -21],\n      [7, -12]\n    ],\n    [\n      [7780, 5554],\n      [-4, 13],\n      [-8, 12],\n      [2, 14],\n      [-6, 2],\n      [-5, 10],\n      [-2, 18],\n      [-7, 5],\n      [1, 7],\n      [-5, 11],\n      [-4, 1],\n      [-3, 18],\n      [-5, -2],\n      [-2, -12],\n      [-4, 5],\n      [-2, 18],\n      [2, 14],\n      [4, 19],\n      [0, 16],\n      [3, 16],\n      [7, 40]\n    ],\n    [\n      [6962, 7540],\n      [0, 0]\n    ],\n    [\n      [6882, 7324],\n      [1, 20],\n      [12, 24],\n      [3, 15],\n      [-7, 12],\n      [-2, 14],\n      [4, 10],\n      [-2, 9],\n      [-12, 1],\n      [0, 7],\n      [-9, 4],\n      [2, 16],\n      [8, 9],\n      [18, -6],\n      [7, 6],\n      [0, 11],\n      [8, 4],\n      [1, 14],\n      [-10, 2],\n      [13, 4],\n      [7, -3],\n      [1, 9],\n      [-4, 11],\n      [5, 14],\n      [8, -8],\n      [18, 14],\n      [5, 7],\n      [8, -18],\n      [-11, -19],\n      [7, -10],\n      [9, 3]\n    ],\n    [\n      [6497, 7333],\n      [-3, 23],\n      [2, 30],\n      [-1, 22],\n      [4, 15],\n      [-12, 17],\n      [0, 9],\n      [-11, 0],\n      [1, 8],\n      [14, 2],\n      [-9, 14],\n      [6, 10],\n      [-5, 3],\n      [-14, -3],\n      [-5, 6],\n      [0, 25],\n      [4, 9],\n      [2, 19],\n      [4, -11],\n      [13, -1],\n      [5, -8],\n      [16, 6],\n      [1, 12],\n      [8, -6],\n      [3, 14],\n      [-19, 23],\n      [-4, 34],\n      [-6, 5],\n      [-16, -3],\n      [-5, -6],\n      [-5, -17],\n      [4, 0],\n      [-3, -19],\n      [-7, 9],\n      [-3, 13]\n    ],\n    [\n      [6554, 7562],\n      [29, -5],\n      [4, 7],\n      [-4, 7],\n      [-2, 23],\n      [4, 3]\n    ],\n    [\n      [6585, 7597],\n      [4, -18],\n      [11, -2],\n      [7, 14],\n      [-6, 6],\n      [0, 13]\n    ],\n    [\n      [6601, 7610],\n      [5, 1],\n      [4, 19],\n      [7, -2],\n      [-3, 10],\n      [11, 1],\n      [2, 6],\n      [8, -12],\n      [7, -2],\n      [7, -14],\n      [13, 2],\n      [5, -8],\n      [-1, -12],\n      [6, -8],\n      [-5, -4],\n      [4, -10],\n      [-3, -10],\n      [11, -11],\n      [18, 1],\n      [6, -3],\n      [7, 6],\n      [9, -10],\n      [8, -36],\n      [4, -2],\n      [5, -29],\n      [27, -31],\n      [4, -10],\n      [13, -16],\n      [5, 2],\n      [10, -14],\n      [27, -29],\n      [7, 1],\n      [19, -14],\n      [3, -4],\n      [-4, -9],\n      [0, -25]\n    ],\n    [\n      [8444, 4645],\n      [12, 9]\n    ],\n    [\n      [8469, 4667],\n      [5, 9],\n      [1, 10],\n      [20, 8],\n      [10, -1],\n      [6, 5],\n      [3, -4],\n      [11, 10],\n      [11, -6],\n      [-13, -19],\n      [-8, -3],\n      [-4, -9],\n      [-7, -2],\n      [-6, -8],\n      [-10, -3],\n      [-15, -17]\n    ],\n    [\n      [130, 3966],\n      [6, 0],\n      [-1, -7],\n      [-5, 7]\n    ],\n    [\n      [3308, 5807],\n      [-4, -9],\n      [1, -31],\n      [-4, -4],\n      [-14, -1],\n      [-5, 4],\n      [10, 7],\n      [0, 20],\n      [-5, 5],\n      [8, 7],\n      [13, 2]\n    ],\n    [\n      [5303, 7135],\n      [4, -6],\n      [-9, -6],\n      [0, 11],\n      [5, 1]\n    ],\n    [\n      [5238, 7310],\n      [7, 2],\n      [10, 15],\n      [13, 6],\n      [17, -9],\n      [-4, -1],\n      [6, -17],\n      [-5, -4],\n      [10, -3],\n      [14, 20],\n      [3, -14],\n      [-10, -23],\n      [-6, -4],\n      [-3, -16],\n      [6, -18],\n      [11, -10],\n      [-1, -16],\n      [3, -7],\n      [-3, -11],\n      [-12, -28],\n      [-14, -14],\n      [-2, -16],\n      [4, -12],\n      [9, -10],\n      [6, 4],\n      [0, -13],\n      [11, 4],\n      [2, -20],\n      [9, -1]\n    ],\n    [\n      [5778, 7600],\n      [-2, -9],\n      [6, -15],\n      [20, -17],\n      [6, -2],\n      [-3, -13],\n      [-14, -1],\n      [-9, 6],\n      [-6, -7],\n      [-12, 1],\n      [-9, -20],\n      [-14, -10],\n      [-15, -24],\n      [2, 17],\n      [13, 10],\n      [3, 7],\n      [-20, -3],\n      [-1, 9]\n    ],\n    [\n      [5997, 7251],\n      [2, 5],\n      [-6, 17],\n      [12, 18],\n      [0, 11],\n      [-6, 7],\n      [-10, -18],\n      [-8, -3],\n      [-18, 15],\n      [-11, -13],\n      [-17, -26],\n      [-7, 1],\n      [-17, -8],\n      [-13, 9],\n      [-7, 18],\n      [-21, 18],\n      [-18, 5],\n      [-3, -3],\n      [0, -18],\n      [-5, -18],\n      [-4, 6],\n      [-13, -10],\n      [-12, 5],\n      [-7, 9],\n      [0, 16],\n      [-7, -1],\n      [-7, 9],\n      [-10, 3],\n      [-3, -6],\n      [-11, 1],\n      [-2, -6],\n      [-9, 3],\n      [8, 5],\n      [12, 0],\n      [-1, 7],\n      [8, 7],\n      [-15, -3],\n      [-12, 2],\n      [-1, 8],\n      [7, -2],\n      [-10, 13],\n      [0, 14],\n      [-5, 5],\n      [7, 4],\n      [-1, 13],\n      [-17, 7],\n      [-11, 9],\n      [7, 6],\n      [-4, 14],\n      [4, 3],\n      [5, -20],\n      [14, 8],\n      [-7, 0],\n      [-5, 16],\n      [6, 2],\n      [3, 10],\n      [-6, -2],\n      [0, 14],\n      [-6, 9],\n      [9, 16],\n      [-24, -6],\n      [2, 29],\n      [16, 25],\n      [16, 3],\n      [2, -7],\n      [11, -1],\n      [-1, 11],\n      [8, -2],\n      [-2, -7],\n      [11, 3],\n      [19, -3],\n      [1, 7],\n      [-8, 3],\n      [5, 6],\n      [27, 5],\n      [-15, 3],\n      [-11, 13],\n      [6, 13],\n      [19, -6],\n      [11, 5],\n      [15, -8],\n      [9, 1],\n      [7, 11],\n      [29, 28],\n      [14, 6],\n      [10, 9],\n      [28, -6],\n      [10, 0],\n      [10, 9],\n      [1, -10],\n      [6, -11],\n      [9, -5],\n      [10, 6],\n      [4, -16],\n      [8, -13],\n      [5, 8],\n      [12, -5],\n      [0, -6],\n      [13, -8],\n      [8, 0],\n      [15, -7],\n      [32, 11],\n      [4, -6],\n      [14, -5],\n      [12, 7],\n      [24, 20],\n      [3, 7]\n    ],\n    [\n      [8378, 6635],\n      [10, -12],\n      [-5, -8],\n      [1, -22],\n      [-6, -18],\n      [-4, -43],\n      [-3, -19],\n      [-6, -20],\n      [-4, -5],\n      [-4, -17],\n      [-1, -27],\n      [-5, 7],\n      [-1, 16],\n      [-11, 20],\n      [-2, 22],\n      [-3, 0],\n      [2, 15],\n      [0, 20],\n      [17, 58],\n      [3, 3],\n      [4, 18],\n      [12, 7],\n      [2, 9],\n      [4, -4]\n    ],\n    [\n      [6108, 4736],\n      [-7, -14],\n      [1, 11],\n      [6, 3]\n    ],\n    [\n      [6093, 4842],\n      [6, -26],\n      [-4, -4],\n      [-7, 16],\n      [0, 15],\n      [5, -1]\n    ],\n    [\n      [6102, 4899],\n      [5, -11],\n      [-3, -19],\n      [-2, 30]\n    ],\n    [\n      [5914, 5071],\n      [5, -1],\n      [2, -12],\n      [-9, 7],\n      [2, 6]\n    ],\n    [\n      [5882, 5125],\n      [1, 0]\n    ],\n    [\n      [5883, 5125],\n      [1, 0]\n    ],\n    [\n      [5884, 5125],\n      [-1, -28],\n      [-2, 0],\n      [-1, -30],\n      [-2, -20],\n      [4, 2],\n      [0, -28],\n      [2, 8],\n      [4, -3],\n      [0, 13],\n      [5, -3],\n      [-3, 10],\n      [7, 6],\n      [2, -10],\n      [12, -2],\n      [8, 5],\n      [3, -7],\n      [17, 17],\n      [-2, 8],\n      [-4, -6],\n      [-10, 4],\n      [5, 8],\n      [-3, 9],\n      [5, -1],\n      [5, 9],\n      [-1, 12],\n      [6, 0],\n      [-2, 7],\n      [8, 17]\n    ],\n    [\n      [6088, 4913],\n      [1, -10],\n      [-4, -16],\n      [-3, -25],\n      [-5, -21],\n      [2, -26],\n      [5, -5],\n      [12, -22],\n      [2, -15],\n      [-4, -5],\n      [-4, -23],\n      [1, -10],\n      [4, -2],\n      [0, -13],\n      [-4, -14],\n      [2, -25],\n      [4, -7],\n      [0, -16],\n      [4, -4],\n      [0, -15],\n      [4, -21],\n      [-2, -8],\n      [15, -16],\n      [5, -14]\n    ],\n    [\n      [5971, 4516],\n      [-2, 9]\n    ],\n    [\n      [5969, 4527],\n      [-5, 7]\n    ],\n    [\n      [5964, 4536],\n      [-4, 14],\n      [2, 20],\n      [-2, 4],\n      [-1, 30],\n      [-7, 20]\n    ],\n    [\n      [5949, 4630],\n      [-3, 4]\n    ],\n    [\n      [5946, 4635],\n      [-4, -2],\n      [-1, -10]\n    ],\n    [\n      [5914, 4641],\n      [-12, 10],\n      [-3, 6],\n      [-13, 6],\n      [-6, 6],\n      [-4, 13],\n      [-11, 6]\n    ],\n    [\n      [5865, 4688],\n      [0, 10],\n      [-4, 5],\n      [-1, 11],\n      [-11, 36],\n      [1, 11],\n      [-3, 8],\n      [2, 12],\n      [-5, 9],\n      [-7, 21],\n      [-6, -1],\n      [-6, 12],\n      [0, 13],\n      [6, 7],\n      [-5, 32],\n      [1, 21],\n      [-6, 5],\n      [2, 27]\n    ],\n    [\n      [5846, 5121],\n      [10, 4],\n      [26, 0]\n    ],\n    [\n      [5883, 5125],\n      [1, 0]\n    ],\n    [\n      [5944, 5197],\n      [-8, -3],\n      [1, 8],\n      [-8, -8],\n      [-3, 15],\n      [-5, -3],\n      [-2, -12],\n      [-6, -7],\n      [0, 7],\n      [-6, -6],\n      [0, 10],\n      [-8, -17],\n      [-9, 0],\n      [-4, -9],\n      [3, -7],\n      [-9, -26],\n      [2, -14]\n    ],\n    [\n      [5823, 5155],\n      [5, 6],\n      [2, 14],\n      [-6, 2]\n    ],\n    [\n      [5846, 5254],\n      [4, -12],\n      [9, 28],\n      [10, 11],\n      [3, 11],\n      [-1, 25],\n      [-3, -9]\n    ],\n    [\n      [6061, 7895],\n      [-18, 0],\n      [-6, -11],\n      [-4, 2],\n      [-12, -13],\n      [-4, 3],\n      [-22, -8],\n      [-14, -18],\n      [-4, 3],\n      [-11, -12],\n      [4, -22],\n      [15, -28],\n      [18, 10],\n      [13, -3],\n      [-5, -9],\n      [1, -11],\n      [-17, -4],\n      [-9, 7],\n      [-4, -10],\n      [-23, -12],\n      [-12, -18],\n      [-10, -2],\n      [-11, 11],\n      [5, 5],\n      [1, 24],\n      [-8, 3],\n      [-11, 13],\n      [-9, -2],\n      [-1, 8],\n      [24, 21],\n      [8, 2],\n      [-1, 14],\n      [-6, -3],\n      [-5, 10],\n      [-3, -6],\n      [-18, -3],\n      [-17, 14],\n      [4, 8],\n      [-7, 6],\n      [17, -5],\n      [4, 9],\n      [-11, -4],\n      [-6, 5],\n      [-25, -2],\n      [-24, -46],\n      [-5, 1],\n      [-10, -23],\n      [4, 2],\n      [-3, -14]\n    ],\n    [\n      [5836, 7853],\n      [9, -17],\n      [2, 3],\n      [-11, 14]\n    ],\n    [\n      [5948, 7848],\n      [0, -9],\n      [-11, 7],\n      [3, -13],\n      [4, 5],\n      [21, -17],\n      [6, -8],\n      [4, -20],\n      [9, -4],\n      [-12, 23],\n      [-7, 26],\n      [-10, -6],\n      [-7, 16]\n    ],\n    [\n      [3523, 3302],\n      [-5, -5],\n      [0, -12],\n      [-8, -5],\n      [3, -30]\n    ],\n    [\n      [3517, 3240],\n      [-4, -18],\n      [-7, -13],\n      [0, -7],\n      [-13, -16],\n      [-20, -17],\n      [-12, 10],\n      [-14, 0],\n      [-7, -8],\n      [-20, 15],\n      [-8, 13],\n      [-18, -1],\n      [-16, 29],\n      [-2, 10],\n      [3, 27],\n      [-1, 10],\n      [9, 9],\n      [-4, 31]\n    ],\n    [\n      [677, 6342],\n      [13, -11],\n      [2, -12],\n      [8, -13],\n      [-6, -10],\n      [-16, -13],\n      [-3, -11],\n      [-7, 9],\n      [1, 15],\n      [-4, 25],\n      [5, 12],\n      [-1, 17],\n      [8, -8]\n    ],\n    [\n      [649, 6394],\n      [3, -7],\n      [7, 2],\n      [8, -8],\n      [0, -7],\n      [-9, -6],\n      [-4, 2],\n      [0, 10],\n      [-7, 7],\n      [2, 7]\n    ],\n    [\n      [631, 6405],\n      [16, -4],\n      [-2, -5],\n      [-15, 2],\n      [1, 7]\n    ],\n    [\n      [613, 6427],\n      [6, -8],\n      [1, -12],\n      [-13, 2],\n      [-3, 14],\n      [7, 10],\n      [2, -6]\n    ],\n    [\n      [571, 6463],\n      [4, -3],\n      [-1, -14],\n      [-8, -3],\n      [-6, 11],\n      [11, 9]\n    ],\n    [\n      [2301, 6687],\n      [-6, 35],\n      [0, 12],\n      [6, -47]\n    ],\n    [\n      [2761, 6828],\n      [-2, -18],\n      [-2, 17],\n      [4, 1]\n    ],\n    [\n      [2366, 6873],\n      [3, -1],\n      [-11, -13],\n      [8, 14]\n    ],\n    [\n      [1707, 7111],\n      [7, -9],\n      [-6, 0],\n      [-1, 9]\n    ],\n    [\n      [1671, 7144],\n      [8, -4],\n      [-8, -2],\n      [0, 6]\n    ],\n    [\n      [2993, 7551],\n      [-6, -11],\n      [8, 7],\n      [8, -1],\n      [-20, -15],\n      [-36, -12],\n      [-4, 1],\n      [4, 11],\n      [7, 6],\n      [29, 6],\n      [10, 8]\n    ],\n    [\n      [2582, 7791],\n      [0, -10],\n      [-7, -17],\n      [-3, 8],\n      [10, 19]\n    ],\n    [\n      [2679, 7836],\n      [1, -8],\n      [-10, 3],\n      [9, 5]\n    ],\n    [\n      [2563, 7913],\n      [-19, -17],\n      [-6, 0],\n      [5, 14],\n      [8, 6],\n      [12, -3]\n    ],\n    [\n      [2541, 7956],\n      [-2, -6],\n      [-15, -14],\n      [0, 8],\n      [17, 12]\n    ],\n    [\n      [1595, 7969],\n      [-3, -9],\n      [8, -13],\n      [-1, -5],\n      [-9, 17],\n      [5, 10]\n    ],\n    [\n      [1582, 8004],\n      [-1, 0]\n    ],\n    [\n      [2511, 7947],\n      [-14, -11],\n      [-19, -11],\n      [-20, -29],\n      [-17, -21],\n      [9, -3],\n      [22, 14],\n      [6, 0],\n      [-5, -19],\n      [14, -2],\n      [11, 5],\n      [7, 9],\n      [14, 4],\n      [10, 7],\n      [7, 13],\n      [7, -14],\n      [-1, -10],\n      [10, 6],\n      [9, -1],\n      [12, -22],\n      [11, 0],\n      [9, -4],\n      [14, 14],\n      [18, -2],\n      [13, 6],\n      [0, -17],\n      [15, -1]\n    ],\n    [\n      [2663, 7852],\n      [-3, -10],\n      [9, -12],\n      [-16, 1],\n      [-5, 4],\n      [-2, -11],\n      [-7, 9],\n      [-15, 5],\n      [-3, -7],\n      [-25, -7],\n      [-13, 0],\n      [-15, -39],\n      [-3, -12],\n      [-10, -17],\n      [2, -8],\n      [10, 17],\n      [7, -3],\n      [-11, -49],\n      [1, -13],\n      [-6, -26],\n      [0, -14],\n      [4, -15],\n      [-2, -28],\n      [9, -33],\n      [8, -4],\n      [16, 14],\n      [7, 22],\n      [5, 26],\n      [0, 15],\n      [-9, 37],\n      [3, 10],\n      [-3, 17],\n      [8, 20],\n      [0, 14],\n      [5, 15],\n      [7, 2],\n      [7, 15],\n      [-3, -22],\n      [4, -4],\n      [4, 14],\n      [0, 16],\n      [11, 5],\n      [-3, 15],\n      [9, 10],\n      [13, -8],\n      [6, -11],\n      [16, -7],\n      [6, -13],\n      [-4, -11],\n      [4, -6],\n      [-1, -28],\n      [-6, -5],\n      [-1, -13],\n      [-7, -2],\n      [-3, -18],\n      [6, -5],\n      [7, 6],\n      [6, 16],\n      [9, 5],\n      [7, -10],\n      [4, -37],\n      [3, -14]\n    ],\n    [\n      [2704, 7634],\n      [-5, 5],\n      [-3, -17],\n      [-6, -8],\n      [-3, -17],\n      [-6, -12],\n      [15, -11],\n      [7, 0],\n      [5, -7],\n      [9, 4],\n      [14, 3],\n      [9, 12],\n      [24, 15],\n      [26, 21],\n      [14, 21],\n      [5, 2],\n      [-1, 17],\n      [-5, 3]\n    ],\n    [\n      [2804, 7674],\n      [10, 6],\n      [16, 2],\n      [13, -8],\n      [18, 0],\n      [8, 5],\n      [15, 19],\n      [-3, 9],\n      [4, 4],\n      [-7, 11],\n      [15, 16],\n      [1, 7]\n    ],\n    [\n      [3116, 7818],\n      [10, -9]\n    ],\n    [\n      [3134, 7784],\n      [3, -9],\n      [-3, -20],\n      [-20, -16],\n      [-6, 5],\n      [-13, -5],\n      [1, -9],\n      [-12, 11],\n      [-3, -22],\n      [-14, -14],\n      [-10, 3],\n      [-8, -8],\n      [1, -9],\n      [-11, -15],\n      [-6, -22],\n      [1, -15],\n      [5, 1],\n      [-13, -19],\n      [9, -7],\n      [5, -23],\n      [17, -8],\n      [-14, -3],\n      [-6, -6],\n      [0, 11],\n      [-15, -14],\n      [0, 12],\n      [-5, 5],\n      [-1, -17],\n      [-12, -9],\n      [-29, -2],\n      [-6, -9],\n      [-8, -1],\n      [-23, -27],\n      [-1, -10],\n      [8, -1],\n      [-2, -29],\n      [-3, -14],\n      [-7, -9],\n      [-1, -11],\n      [-12, -24],\n      [-1, 15],\n      [-7, 2],\n      [-10, 13],\n      [3, -23],\n      [9, -21],\n      [1, -16],\n      [-10, -31],\n      [-7, -13],\n      [-8, -30],\n      [-2, 11],\n      [4, 20],\n      [6, 17],\n      [-6, -2],\n      [1, 9],\n      [-13, 21],\n      [-1, 17],\n      [4, 11],\n      [-2, 15],\n      [11, 15],\n      [-5, 0],\n      [-11, -10],\n      [2, -16],\n      [-4, -6],\n      [0, -23],\n      [4, -6],\n      [1, -20],\n      [-9, 11],\n      [-8, -2],\n      [9, -4],\n      [11, -13],\n      [-2, -17],\n      [-6, 3],\n      [8, -12],\n      [-7, -12],\n      [6, -8],\n      [-4, -8],\n      [12, -4],\n      [5, -35],\n      [7, -23],\n      [-5, 9],\n      [-6, 38],\n      [-2, -15],\n      [6, -17],\n      [-9, 5],\n      [0, -7],\n      [-15, -4],\n      [-2, -6],\n      [15, 3],\n      [13, -8],\n      [-1, -17],\n      [-3, 2],\n      [-5, -13],\n      [-13, 1],\n      [-2, 9],\n      [-4, -8],\n      [7, -6],\n      [-2, -11],\n      [-11, -8],\n      [17, -2],\n      [-7, -11],\n      [-15, -4],\n      [-15, -18],\n      [-9, -27],\n      [-11, 1],\n      [-13, -12],\n      [-5, -10],\n      [-4, -21],\n      [-22, -32],\n      [-14, -8],\n      [1, -8],\n      [-12, -15],\n      [1, -5],\n      [-11, -14],\n      [-3, -12],\n      [2, -18],\n      [-4, -5],\n      [-3, -19],\n      [8, -63],\n      [9, -38],\n      [9, -26],\n      [-5, 0],\n      [0, -10],\n      [18, -75],\n      [3, -31],\n      [-2, -12],\n      [-1, -28],\n      [-4, -11],\n      [-4, -29],\n      [-12, -1],\n      [-7, -4],\n      [0, 14],\n      [-6, 25],\n      [-6, 7],\n      [-6, 0],\n      [-3, 31],\n      [-6, 5],\n      [0, 20],\n      [-7, -2],\n      [-6, 21],\n      [-3, 18],\n      [7, 15],\n      [-1, 8],\n      [-7, 6],\n      [0, -19],\n      [-5, 8],\n      [2, 21],\n      [4, 14],\n      [0, 26],\n      [-4, 16],\n      [-7, 0],\n      [-10, 20],\n      [-6, 20],\n      [-11, 14],\n      [-10, -4],\n      [-10, -15],\n      [-16, -5],\n      [0, 7],\n      [-11, 20],\n      [-22, 14],\n      [-15, -1],\n      [-2, 9],\n      [-4, -11],\n      [-14, -5],\n      [-4, 7],\n      [-1, 16],\n      [-3, 2],\n      [-2, -22],\n      [-5, 5],\n      [-5, -5],\n      [-10, 6],\n      [-14, -7],\n      [-7, -9],\n      [-11, 7],\n      [-4, 7],\n      [-8, -12],\n      [2, -7],\n      [10, -1],\n      [3, 4],\n      [6, -14],\n      [5, 12],\n      [3, -3],\n      [-8, -29],\n      [4, -8],\n      [11, -5],\n      [3, -9],\n      [-4, -9],\n      [-3, 10],\n      [-15, 9],\n      [2, 4],\n      [-12, 11],\n      [4, -9],\n      [-2, -16],\n      [-10, 12],\n      [-8, -14],\n      [-15, 9],\n      [0, 13],\n      [-7, 3],\n      [-3, 12],\n      [-6, 5],\n      [-9, -8],\n      [4, -6],\n      [-13, -2],\n      [-21, 13],\n      [-16, -5],\n      [2, 17],\n      [-8, -18],\n      [-17, -13],\n      [-1, 19],\n      [-8, -5],\n      [-1, -9],\n      [4, -12],\n      [-8, -12],\n      [1, -4],\n      [-14, -18],\n      [-16, -9],\n      [-12, 8],\n      [1, -9],\n      [6, -8],\n      [-7, -6],\n      [-5, 6],\n      [1, -12],\n      [-12, -8],\n      [1, -14],\n      [-7, -33],\n      [-3, -26],\n      [7, -32],\n      [1, -16],\n      [3, -1]\n    ],\n    [\n      [2245, 6713],\n      [1, 7],\n      [-9, 21]\n    ],\n    [\n      [2193, 6879],\n      [-7, 10]\n    ],\n    [\n      [1746, 7056],\n      [-4, 10],\n      [-2, 27],\n      [-8, 16],\n      [-15, 18],\n      [-6, 2],\n      [-3, 12],\n      [-9, 0],\n      [-10, 6],\n      [-10, 18],\n      [-21, 3],\n      [-9, 5],\n      [0, 33],\n      [-7, 5],\n      [0, 12],\n      [-12, 15],\n      [-5, 18],\n      [-9, 13],\n      [-4, 23],\n      [5, 9],\n      [-3, 11],\n      [-6, -1],\n      [-8, 13],\n      [-3, 21],\n      [3, 5],\n      [9, -11],\n      [-10, 29],\n      [8, 6],\n      [-7, 6],\n      [-2, -19],\n      [-16, 13],\n      [5, 3],\n      [-7, 20],\n      [-7, 6],\n      [-10, 20],\n      [1, 10],\n      [-4, 16],\n      [2, 10],\n      [-2, 15],\n      [-7, 17],\n      [-8, 9],\n      [0, 19],\n      [8, 15],\n      [-2, 17],\n      [3, 16],\n      [-2, 16],\n      [-5, 5],\n      [3, 12],\n      [-5, 8],\n      [-1, 32],\n      [-5, 10],\n      [9, 41],\n      [4, 25],\n      [2, 52],\n      [2, 11],\n      [1, 62],\n      [13, 7],\n      [-14, -2],\n      [1, 29],\n      [-4, -2],\n      [6, 13],\n      [-7, 6],\n      [-10, 44],\n      [-7, 20],\n      [6, 11],\n      [15, -11],\n      [24, 0],\n      [7, -6],\n      [4, -14],\n      [-9, -15],\n      [12, 8],\n      [2, -20],\n      [-7, -10],\n      [2, -4],\n      [10, 14],\n      [-1, 29],\n      [5, 8],\n      [-5, 18],\n      [-9, 6],\n      [8, 12],\n      [-10, 16],\n      [1, 6]\n    ],\n    [\n      [60, 8169],\n      [1, -9],\n      [-11, 9],\n      [10, 0]\n    ],\n    [\n      [80, 8161],\n      [-11, 0],\n      [12, 11],\n      [-1, -11]\n    ],\n    [\n      [96, 8175],\n      [2, -14],\n      [-10, 0],\n      [1, 14],\n      [7, 0]\n    ],\n    [\n      [177, 8186],\n      [18, -5],\n      [-12, -3],\n      [-15, 5],\n      [9, 3]\n    ],\n    [\n      [162, 8200],\n      [5, -4],\n      [-4, -12],\n      [-7, -4],\n      [-27, -2],\n      [22, 6],\n      [9, 7],\n      [-7, 4],\n      [9, 5]\n    ],\n    [\n      [9827, 8206],\n      [-2, -8],\n      [-9, 2],\n      [11, 6]\n    ],\n    [\n      [9802, 8235],\n      [12, -10],\n      [-11, -5],\n      [-1, 15]\n    ],\n    [\n      [332, 8268],\n      [5, -12],\n      [-32, -29],\n      [11, 24],\n      [7, 1],\n      [-1, 9],\n      [10, 7]\n    ],\n    [\n      [367, 8291],\n      [6, -8],\n      [9, 8],\n      [-9, -15],\n      [8, 1],\n      [-14, -16],\n      [-4, 1],\n      [-20, -13],\n      [-6, 4],\n      [19, 9],\n      [1, 25],\n      [10, 4]\n    ],\n    [\n      [391, 8303],\n      [7, -5],\n      [-10, -3],\n      [3, 8]\n    ],\n    [\n      [451, 8354],\n      [5, -1],\n      [6, -16],\n      [-8, -9],\n      [-16, 0],\n      [-4, -9],\n      [-14, -3],\n      [-3, 11],\n      [7, 3],\n      [10, 16],\n      [3, -2],\n      [14, 10]\n    ],\n    [\n      [1304, 8361],\n      [8, -30],\n      [-14, 25],\n      [6, 5]\n    ],\n    [\n      [558, 8363],\n      [-9, -20],\n      [4, 19],\n      [5, 1]\n    ],\n    [\n      [1355, 8404],\n      [7, -16],\n      [-1, -16],\n      [-6, -11],\n      [-13, 9],\n      [-5, 8],\n      [5, 20],\n      [13, 6]\n    ],\n    [\n      [1295, 8417],\n      [2, -9],\n      [-14, -4],\n      [5, 11],\n      [7, 2]\n    ],\n    [\n      [1319, 8419],\n      [9, -1],\n      [0, -12],\n      [-13, 5],\n      [4, 8]\n    ],\n    [\n      [1289, 8428],\n      [10, -1],\n      [4, -16],\n      [13, -7],\n      [9, -30],\n      [9, -9],\n      [-1, -33],\n      [-16, 17],\n      [2, 8],\n      [-21, 10],\n      [8, 20],\n      [-11, -1],\n      [6, 13],\n      [-3, 17],\n      [-9, 2],\n      [0, 10]\n    ],\n    [\n      [1315, 8433],\n      [-5, -12],\n      [-6, 8],\n      [11, 4]\n    ],\n    [\n      [1328, 8428],\n      [4, -13],\n      [-9, 9],\n      [0, 12],\n      [5, -8]\n    ],\n    [\n      [1308, 8454],\n      [9, -14],\n      [-10, -3],\n      [1, 17]\n    ],\n    [\n      [1278, 8457],\n      [7, -4],\n      [1, -11],\n      [-6, -6],\n      [-6, -28],\n      [-3, 4],\n      [0, 20],\n      [-4, 26],\n      [11, -1]\n    ],\n    [\n      [1283, 8470],\n      [24, -10],\n      [-2, -17],\n      [-9, 13],\n      [7, -18],\n      [-16, -4],\n      [0, 23],\n      [-10, 9],\n      [6, 4]\n    ],\n    [\n      [745, 8475],\n      [8, 0],\n      [-14, -10],\n      [6, 10]\n    ],\n    [\n      [1234, 8479],\n      [-1, -12],\n      [-6, -2],\n      [-1, 19],\n      [8, -5]\n    ],\n    [\n      [1237, 8491],\n      [8, 2],\n      [9, -14],\n      [7, -29],\n      [-1, -30],\n      [-5, 0],\n      [-13, 33],\n      [-1, 15],\n      [-10, 18],\n      [6, 5]\n    ],\n    [\n      [749, 8519],\n      [11, 0],\n      [7, -8],\n      [-2, -10],\n      [8, 0],\n      [-4, -10],\n      [-18, 4],\n      [10, -7],\n      [-18, -9],\n      [-14, -22],\n      [-10, -6],\n      [6, 10],\n      [-12, -1],\n      [-12, 22],\n      [3, 14],\n      [7, 7],\n      [10, 0],\n      [7, -19],\n      [-4, 28],\n      [5, 5],\n      [16, -5],\n      [-3, 10],\n      [7, -3]\n    ],\n    [\n      [1229, 8536],\n      [23, -12],\n      [-1, -13],\n      [-7, -1],\n      [-18, 12],\n      [14, -15],\n      [13, 1],\n      [1, -16],\n      [-7, 0],\n      [-19, 17],\n      [7, -17],\n      [-4, -6],\n      [-8, 6],\n      [-1, 10],\n      [-12, 12],\n      [1, 20],\n      [18, 2]\n    ],\n    [\n      [1252, 8544],\n      [6, -11],\n      [14, -6],\n      [8, -16],\n      [-2, -5],\n      [2, -21],\n      [-19, -19],\n      [-1, 12],\n      [4, 10],\n      [-5, 13],\n      [-7, 43]\n    ],\n    [\n      [761, 8550],\n      [18, -11],\n      [-6, -8],\n      [-18, -4],\n      [-10, 2],\n      [1, 9],\n      [10, 1],\n      [5, 11]\n    ],\n    [\n      [913, 8659],\n      [5, -3],\n      [-25, -29],\n      [20, 32]\n    ],\n    [\n      [385, 8661],\n      [13, -6],\n      [2, -22],\n      [-19, -5],\n      [-10, 2],\n      [-19, 13],\n      [-4, 7],\n      [16, 0],\n      [9, 9],\n      [12, 2]\n    ],\n    [\n      [929, 8665],\n      [13, -4],\n      [-15, -9],\n      [2, 13]\n    ],\n    [\n      [897, 8667],\n      [-2, -19],\n      [-4, 10],\n      [6, 9]\n    ],\n    [\n      [231, 8857],\n      [0, -6],\n      [17, -7],\n      [20, 7],\n      [23, -20],\n      [21, -2],\n      [-2, -9],\n      [-15, 1],\n      [-9, -13],\n      [-3, 10],\n      [-28, 19],\n      [-17, -8],\n      [-13, 10],\n      [6, 18]\n    ],\n    [\n      [1387, 8402],\n      [-3, -8],\n      [4, -28],\n      [-10, -21],\n      [-9, -8],\n      [-7, 2],\n      [-3, 23],\n      [6, 6],\n      [-1, 24],\n      [-15, 16],\n      [-8, -7],\n      [-7, -22],\n      [-9, 13],\n      [7, 4],\n      [5, 24],\n      [-18, 22],\n      [-11, 25],\n      [-19, 8],\n      [12, 9],\n      [-11, 10],\n      [-3, 12],\n      [14, -6],\n      [-15, 12],\n      [-15, 23],\n      [-16, 11],\n      [-4, 24],\n      [-6, 1],\n      [-1, 17],\n      [-6, -11],\n      [7, -17],\n      [1, -24],\n      [-13, 11],\n      [-8, -2],\n      [2, 13],\n      [-8, 12],\n      [-3, -4],\n      [-17, 8],\n      [19, -18],\n      [2, -12],\n      [-9, -4],\n      [-20, 5],\n      [-23, 23],\n      [-9, 16],\n      [-34, 19],\n      [-11, 9],\n      [12, 10],\n      [-5, 11],\n      [-18, -12],\n      [-9, 0],\n      [-21, 9],\n      [3, 11],\n      [-13, -5],\n      [-31, 8],\n      [-30, -6],\n      [-12, 12],\n      [-16, 5],\n      [3, 18],\n      [-11, -14],\n      [-21, 5],\n      [9, 13],\n      [-18, -1],\n      [-16, 19],\n      [-12, 1],\n      [-2, -7],\n      [-15, -3],\n      [-3, 6],\n      [9, 19],\n      [-17, -18],\n      [2, -20],\n      [8, -8],\n      [-6, -3],\n      [-8, -27],\n      [-18, 1],\n      [-5, -5],\n      [-2, 13],\n      [-12, -25],\n      [-13, 3],\n      [-7, -13],\n      [-19, -17],\n      [-16, -2],\n      [-6, 6],\n      [3, 9],\n      [19, 10],\n      [2, 8],\n      [-11, -6],\n      [-10, 7],\n      [4, 16],\n      [8, 10],\n      [5, 19],\n      [-5, 8],\n      [27, 21],\n      [6, -6],\n      [18, 3],\n      [-14, 10],\n      [4, 5],\n      [-19, 4],\n      [-15, -15],\n      [-9, -2],\n      [-20, -27],\n      [-7, -16],\n      [-11, -2],\n      [9, -10],\n      [-18, -24],\n      [-11, 0],\n      [-4, -11],\n      [-9, -5],\n      [-3, -20],\n      [10, 3],\n      [13, -8],\n      [2, -6],\n      [-11, -12],\n      [-5, 0],\n      [-14, -31],\n      [-4, 7],\n      [-2, -11],\n      [-12, 1],\n      [-9, -17],\n      [-9, 2],\n      [-2, -13],\n      [-10, -1],\n      [-14, -15],\n      [7, -5],\n      [-7, -12],\n      [-5, 4],\n      [-12, -16],\n      [-17, -5],\n      [-2, -11],\n      [-13, -1],\n      [-4, -8],\n      [7, -10],\n      [-10, -4],\n      [-1, -7],\n      [-22, -6],\n      [-5, -17],\n      [-6, 16],\n      [-20, -21],\n      [-10, 2],\n      [-12, -10],\n      [-5, 2],\n      [6, 12],\n      [-10, 1],\n      [-6, -22],\n      [-9, -11],\n      [-12, 8],\n      [-4, -14],\n      [-7, 2],\n      [-9, -9],\n      [0, 18],\n      [10, 3],\n      [22, 30],\n      [12, 12],\n      [9, 3],\n      [34, -7],\n      [-10, 9],\n      [5, 17],\n      [16, 15],\n      [24, 17],\n      [9, -4],\n      [-1, 15],\n      [10, 16],\n      [18, 15],\n      [2, 46],\n      [12, 18],\n      [5, 16],\n      [-8, -7],\n      [-25, -13],\n      [-11, 12],\n      [1, 10],\n      [-9, -10],\n      [4, -20],\n      [-11, -2],\n      [-14, 29],\n      [-8, -10],\n      [-12, 17],\n      [-19, -11],\n      [-20, -18],\n      [-11, 4],\n      [11, 7],\n      [-1, 13],\n      [6, 7],\n      [-12, 2],\n      [0, 15],\n      [7, 6],\n      [-20, 46],\n      [-1, -17],\n      [-16, -8],\n      [-23, -4],\n      [-9, 6],\n      [-13, 23],\n      [-19, 12],\n      [20, 19],\n      [18, -3],\n      [7, -12],\n      [9, 7],\n      [-4, 7],\n      [-29, 2],\n      [-20, 20],\n      [-7, -6],\n      [-9, 14],\n      [0, 21],\n      [-6, 7],\n      [15, 2],\n      [-4, 13],\n      [18, 26],\n      [8, -3],\n      [-3, 14],\n      [5, 17],\n      [11, 0],\n      [-8, 7],\n      [7, 5],\n      [17, 0],\n      [2, -11],\n      [17, 1],\n      [20, 24],\n      [25, -1],\n      [18, 17],\n      [-6, 30],\n      [-13, 9],\n      [10, 4],\n      [9, 13],\n      [-10, 12],\n      [-41, -24],\n      [-17, -5],\n      [-12, 9],\n      [-18, 0],\n      [-19, -8],\n      [-33, 8],\n      [-8, 6],\n      [3, 12],\n      [-11, 10],\n      [7, 9],\n      [13, 2],\n      [-38, 8],\n      [-18, 10],\n      [37, 28],\n      [24, 9],\n      [16, 13],\n      [16, 7],\n      [29, 2],\n      [-7, -11],\n      [7, -19],\n      [26, 2],\n      [24, -8],\n      [11, 18],\n      [13, -3],\n      [-13, 10],\n      [-11, -2],\n      [-2, 11],\n      [-15, 10],\n      [-5, 9],\n      [9, 3],\n      [7, -17],\n      [12, -11],\n      [10, 4],\n      [14, -9],\n      [16, 2],\n      [-3, 14],\n      [-23, 0],\n      [-9, -7],\n      [-10, 10],\n      [2, 20],\n      [-23, -2],\n      [-30, 5],\n      [-10, 27],\n      [-34, 25],\n      [-20, 9],\n      [-16, 11],\n      [9, 17],\n      [0, 14],\n      [16, -2],\n      [37, 4],\n      [19, 11],\n      [15, 16],\n      [2, 19],\n      [29, 33],\n      [26, 0],\n      [45, 27],\n      [39, 4],\n      [21, 14],\n      [12, 13],\n      [33, -7],\n      [-12, -12],\n      [11, -6],\n      [16, 16],\n      [13, -7],\n      [2, -12],\n      [19, 5],\n      [38, -1],\n      [9, -4],\n      [-12, -15],\n      [24, 0],\n      [-6, -6],\n      [32, 3],\n      [11, -5],\n      [30, 5],\n      [31, -8],\n      [27, -11],\n      [40, 0],\n      [30, -12],\n      [40, 9],\n      [52, -27],\n      [12, 0]\n    ],\n    [\n      [2912, 6333],\n      [-2, -4]\n    ],\n    [\n      [2914, 6329],\n      [-1, 4]\n    ],\n    [\n      [6651, 7782],\n      [-7, -26],\n      [12, -19],\n      [-3, -12],\n      [11, 5],\n      [3, 8],\n      [-2, 16],\n      [3, 11]\n    ],\n    [\n      [6601, 7610],\n      [-7, 11],\n      [-5, -2],\n      [-4, -22]\n    ],\n    [\n      [6627, 7805],\n      [-10, -35],\n      [2, -18],\n      [4, -10],\n      [9, 17],\n      [-3, 20],\n      [3, 6],\n      [-1, 16]\n    ],\n    [\n      [3301, 5940],\n      [-4, 4],\n      [5, 8],\n      [-1, -12]\n    ],\n    [\n      [3313, 5694],\n      [1, -6],\n      [-5, -8],\n      [-9, -2],\n      [1, 7],\n      [12, 9]\n    ],\n    [\n      [3303, 5691],\n      [4, 12],\n      [2, -5],\n      [-6, -7]\n    ],\n    [\n      [3228, 5816],\n      [-8, -8],\n      [-9, 6],\n      [4, 7],\n      [6, -5],\n      [4, 10],\n      [3, -10]\n    ],\n    [\n      [3018, 5865],\n      [-3, -7],\n      [-14, -7],\n      [0, -13],\n      [10, -38],\n      [-1, -16],\n      [-4, -6],\n      [-10, -30],\n      [5, -18],\n      [6, -7],\n      [-1, -15],\n      [6, -5],\n      [9, 7],\n      [5, 10],\n      [-1, 32],\n      [-11, 30],\n      [-2, 23],\n      [3, 10],\n      [4, 0],\n      [12, 13],\n      [18, 8],\n      [5, 9],\n      [8, -2],\n      [-2, 13],\n      [-11, -5],\n      [-2, 13],\n      [2, 16],\n      [5, 5],\n      [6, -10],\n      [2, -22],\n      [4, -10],\n      [12, 3],\n      [15, -10],\n      [7, -12],\n      [4, -15],\n      [-2, -7],\n      [5, -15],\n      [8, -1],\n      [17, 4],\n      [6, 4],\n      [21, 2],\n      [11, -20],\n      [11, -9],\n      [11, -5],\n      [8, 2],\n      [4, 9],\n      [5, 0],\n      [2, 8],\n      [20, 5],\n      [-5, 5],\n      [-9, 1],\n      [10, 6],\n      [7, -3],\n      [11, 6],\n      [12, 1],\n      [16, -4],\n      [8, 4],\n      [-2, -6],\n      [-10, -6],\n      [-16, 0],\n      [1, -9],\n      [5, -5],\n      [1, -12],\n      [-9, -1],\n      [5, -4],\n      [8, 8],\n      [5, -25],\n      [2, 17],\n      [11, -10],\n      [7, -3],\n      [-2, 7],\n      [13, -19],\n      [4, 1],\n      [7, -12],\n      [-9, -24],\n      [-3, -22],\n      [-12, 0],\n      [10, -11],\n      [3, 6],\n      [14, 6],\n      [6, -4],\n      [3, 6],\n      [9, -4]\n    ],\n    [\n      [7888, 5785],\n      [0, -17],\n      [-4, 12],\n      [4, 5]\n    ],\n    [\n      [7999, 6420],\n      [-7, 1],\n      [-4, -12],\n      [-7, -3],\n      [1, -12],\n      [-6, -6],\n      [-5, 4],\n      [-9, -2],\n      [4, -16],\n      [-8, -8],\n      [2, -17],\n      [-7, -4],\n      [-4, -11],\n      [-7, -4],\n      [-3, -15],\n      [-1, -23],\n      [-5, -13],\n      [7, -30],\n      [7, -15],\n      [11, -17],\n      [-1, -15],\n      [8, -21],\n      [9, -14],\n      [4, -12],\n      [16, -29],\n      [6, -2],\n      [16, -47],\n      [8, -11],\n      [1, -21],\n      [5, -18],\n      [-2, -5],\n      [6, -25],\n      [0, -35],\n      [2, -3],\n      [0, -23],\n      [3, -13],\n      [-6, -10],\n      [0, -42],\n      [-3, -5],\n      [4, -7],\n      [-4, -10],\n      [-2, 4],\n      [0, -16],\n      [-7, -2],\n      [-2, -8],\n      [-4, 0],\n      [-8, -14],\n      [-6, -1],\n      [-2, -13],\n      [-5, 0],\n      [-11, -13],\n      [-13, 0],\n      [-5, 12],\n      [1, -23],\n      [-11, 2],\n      [11, -9],\n      [-4, -11],\n      [-6, 4],\n      [7, -11],\n      [-3, -2],\n      [-12, 24],\n      [0, -5],\n      [10, -18],\n      [2, -11],\n      [-5, -6],\n      [-10, 15],\n      [4, -19],\n      [-1, -6],\n      [-17, -13],\n      [-12, -29],\n      [-11, -2],\n      [5, 9],\n      [-2, 10],\n      [0, 36],\n      [2, 17],\n      [6, 7],\n      [-10, 15],\n      [-5, -5],\n      [-3, 16]\n    ],\n    [\n      [9706, 4050],\n      [-7, 13],\n      [4, 7],\n      [3, -20]\n    ],\n    [\n      [9699, 4104],\n      [2, -14],\n      [-8, 6],\n      [0, 12],\n      [6, -4]\n    ],\n    [\n      [9675, 4172],\n      [7, -8],\n      [-6, -8],\n      [-6, 7],\n      [5, 9]\n    ],\n    [\n      [9671, 4228],\n      [8, -15],\n      [-7, 1],\n      [-1, 14]\n    ],\n    [\n      [9675, 4243],\n      [-6, -2],\n      [-6, 7],\n      [7, 9],\n      [5, -14]\n    ],\n    [\n      [9650, 4255],\n      [10, -14],\n      [1, -7],\n      [-10, -6],\n      [-4, 27],\n      [-5, 1],\n      [1, 12],\n      [4, -1],\n      [3, -12]\n    ],\n    [\n      [9672, 4262],\n      [-3, 21],\n      [1, 9],\n      [3, -20],\n      [-1, -10]\n    ],\n    [\n      [9662, 4292],\n      [-5, 2],\n      [9, 9],\n      [-4, -11]\n    ],\n    [\n      [9671, 4298],\n      [-2, 1],\n      [-1, 24],\n      [2, -2],\n      [1, -23]\n    ],\n    [\n      [9633, 4310],\n      [4, 2],\n      [0, 11],\n      [5, -11],\n      [3, -23],\n      [-11, -7],\n      [-7, 15],\n      [1, 11],\n      [-3, 15],\n      [1, 17],\n      [5, -11],\n      [2, -19]\n    ],\n    [\n      [9653, 4368],\n      [1, -9],\n      [-5, 0],\n      [4, 9]\n    ],\n    [\n      [9654, 4385],\n      [-4, -3],\n      [-1, 10],\n      [5, -7]\n    ],\n    [\n      [5917, 7177],\n      [-8, 1]\n    ],\n    [\n      [233, 4380],\n      [5, -6],\n      [-14, 2],\n      [-4, 7],\n      [7, 5],\n      [6, -8]\n    ],\n    [\n      [213, 4406],\n      [3, -6],\n      [-1, -12],\n      [-9, 0],\n      [-5, 15],\n      [12, 3]\n    ],\n    [\n      [6488, 5914],\n      [7, -6],\n      [7, 6],\n      [10, -9],\n      [-9, -11],\n      [-10, -3],\n      [-6, 2],\n      [-5, 12],\n      [6, 9]\n    ],\n    [\n      [6474, 6141],\n      [-14, -9],\n      [-10, -18],\n      [-2, -12],\n      [2, -20],\n      [-10, -7],\n      [-13, -15],\n      [-23, -11],\n      [-11, -11],\n      [-4, 0],\n      [-25, -18],\n      [-3, -12],\n      [-8, -16],\n      [-6, -3],\n      [-14, 3],\n      [-10, -9],\n      [-6, -13],\n      [-15, -8],\n      [-5, -6],\n      [-14, 0],\n      [-16, -6],\n      [-7, -15],\n      [-15, -17],\n      [-7, 3],\n      [-4, -8],\n      [-14, -5],\n      [-10, 9],\n      [-3, -4],\n      [-7, 35],\n      [2, 25],\n      [-6, 21],\n      [-2, 16],\n      [-3, 43],\n      [-6, 7],\n      [4, 2],\n      [-3, 17],\n      [3, 18],\n      [-1, 29]\n    ],\n    [\n      [5913, 3637],\n      [-1, -16],\n      [-5, -23],\n      [-3, -38],\n      [-5, -21],\n      [-10, -19],\n      [-7, -3],\n      [-13, -27],\n      [-21, -68],\n      [-4, -16],\n      [-15, -32],\n      [-4, -4],\n      [-16, -28],\n      [-9, -21],\n      [-13, -22],\n      [-25, -35],\n      [-27, -26],\n      [-15, 4],\n      [-9, -9],\n      [0, -11],\n      [-17, 5],\n      [-4, -12],\n      [-11, 1],\n      [-8, 6],\n      [-16, 4],\n      [-6, -7],\n      [-23, 6],\n      [-10, -4],\n      [-12, -19],\n      [-7, 3],\n      [-6, -5],\n      [-11, 4],\n      [-1, -6],\n      [-11, 0],\n      [-14, -20],\n      [-9, 3],\n      [-9, 9],\n      [0, 11],\n      [-6, 4],\n      [-8, -2],\n      [0, 17],\n      [-10, -2],\n      [0, -13],\n      [-4, 19],\n      [5, 10],\n      [-2, 12],\n      [-7, 16],\n      [-4, 20],\n      [-4, -1],\n      [1, 18],\n      [7, -2],\n      [4, 8],\n      [1, 20],\n      [-2, 22],\n      [-4, 17],\n      [-9, 20],\n      [-7, 28],\n      [-8, 24],\n      [-6, 42],\n      [-6, 29],\n      [-7, 15],\n      [-3, 15]\n    ],\n    [\n      [5815, 3905],\n      [12, 3],\n      [14, -12],\n      [15, 3],\n      [13, -7]\n    ],\n    [\n      [5844, 4282],\n      [-15, 1],\n      [-13, -5],\n      [-15, -18],\n      [0, -21],\n      [-3, -8]\n    ],\n    [\n      [5798, 4231],\n      [-3, 3],\n      [-13, -9],\n      [-5, -13],\n      [-12, -14],\n      [-13, -38],\n      [-2, -11]\n    ],\n    [\n      [5750, 4149],\n      [-9, -7],\n      [-14, 11],\n      [-7, -7],\n      [-7, 11],\n      [-12, 1]\n    ],\n    [\n      [5792, 4643],\n      [5, 5],\n      [9, 23],\n      [3, 15],\n      [-7, 8]\n    ],\n    [\n      [5849, 4709],\n      [-4, -14],\n      [7, -1],\n      [9, -18],\n      [5, 4],\n      [-1, 8]\n    ],\n    [\n      [5750, 4149],\n      [10, 22],\n      [5, 5],\n      [4, 17],\n      [11, 9],\n      [0, 11],\n      [8, 0],\n      [8, 9],\n      [1, -7],\n      [8, 12],\n      [-7, 4]\n    ]\n  ],\n  \"type\": \"Topology\",\n  \"objects\": {\n    \"units\": {\n      \"geometries\": [\n        {\n          \"arcs\": [[0, 1, 2, 3, 4, 5]],\n          \"type\": \"Polygon\",\n          \"id\": \"AFG\",\n          \"properties\": { \"name\": \"Afghanistan\" }\n        },\n        {\n          \"arcs\": [[[6, 7, 8, 9]], [[10, 11, 12]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"AGO\",\n          \"properties\": { \"name\": \"Angola\" }\n        },\n        {\n          \"arcs\": [\n            [[13, 14]],\n            [[15, 16]],\n            [[17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ALB\",\n          \"properties\": { \"name\": \"Albania\" }\n        },\n        {\n          \"arcs\": [[[31]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ALD\",\n          \"properties\": { \"name\": \"Aland\" }\n        },\n        { \"arcs\": [[32, 33]], \"type\": \"Polygon\", \"id\": \"AND\", \"properties\": { \"name\": \"Andorra\" } },\n        {\n          \"arcs\": [[[34]], [[35, 36, 37, 38, 39], [40]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ARE\",\n          \"properties\": { \"name\": \"United Arab Emirates\" }\n        },\n        {\n          \"arcs\": [[[41, 42]], [[43, 44]], [[45, 46, 47, 48, 49, 50]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ARG\",\n          \"properties\": { \"name\": \"Argentina\" }\n        },\n        {\n          \"arcs\": [[[51]], [[52, 53, 54, 55, 56], [57], [58]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ARM\",\n          \"properties\": { \"name\": \"Armenia\" }\n        },\n        {\n          \"arcs\": [\n            [[59]],\n            [[60]],\n            [[61]],\n            [[62]],\n            [[63]],\n            [[64]],\n            [[65]],\n            [[66]],\n            [[67]],\n            [[68]],\n            [[69]],\n            [[70]],\n            [[71]],\n            [[72]],\n            [[73]],\n            [[74]],\n            [[75]],\n            [[76]],\n            [[77]],\n            [[78]],\n            [[79]],\n            [[80]],\n            [[81]],\n            [[82]],\n            [[83]],\n            [[84]],\n            [[85]],\n            [[86]],\n            [[87]],\n            [[88]],\n            [[89]],\n            [[90]],\n            [[91]],\n            [[92]],\n            [[93]],\n            [[94]],\n            [[95]],\n            [[96]],\n            [[97]],\n            [[98]],\n            [[99]],\n            [[100]],\n            [[101]],\n            [[102]],\n            [[103]],\n            [[104]],\n            [[105]],\n            [[106]],\n            [[107]],\n            [[108]],\n            [[109]],\n            [[110]],\n            [[111]],\n            [[112]],\n            [[113]],\n            [[114]],\n            [[115]],\n            [[116]],\n            [[117]],\n            [[118]],\n            [[119]],\n            [[120]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ATA\",\n          \"properties\": { \"name\": \"Antarctica\" }\n        },\n        {\n          \"arcs\": [[[121]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ATF\",\n          \"properties\": { \"name\": \"Fr. S. Antarctic Lands\" }\n        },\n        {\n          \"arcs\": [\n            [[122]],\n            [[123]],\n            [[124]],\n            [[125]],\n            [[126]],\n            [[127]],\n            [[128]],\n            [[129]],\n            [[130]],\n            [[131]],\n            [[132]],\n            [[133]],\n            [[134]],\n            [[135]],\n            [[136]],\n            [[137]],\n            [[138]],\n            [[139]],\n            [[140]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"AUS\",\n          \"properties\": { \"name\": \"Australia\" }\n        },\n        {\n          \"arcs\": [[141, 142, 143, 144, 145, 146, 147, 148, 149, 150]],\n          \"type\": \"Polygon\",\n          \"id\": \"AUT\",\n          \"properties\": { \"name\": \"Austria\" }\n        },\n        {\n          \"arcs\": [[[151, 152, -55]], [[-59]], [[-58]], [[153, 154, 155, -53, 156], [-52]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"AZE\",\n          \"properties\": { \"name\": \"Azerbaijan\" }\n        },\n        {\n          \"arcs\": [[157, 158, 159, 160]],\n          \"type\": \"Polygon\",\n          \"id\": \"BDI\",\n          \"properties\": { \"name\": \"Burundi\" }\n        },\n        {\n          \"arcs\": [[161, 162, 163, 164, 165, 166, 167]],\n          \"type\": \"Polygon\",\n          \"id\": \"BEL\",\n          \"properties\": { \"name\": \"Belgium\" }\n        },\n        {\n          \"arcs\": [[168, 169, 170, 171, 172]],\n          \"type\": \"Polygon\",\n          \"id\": \"BEN\",\n          \"properties\": { \"name\": \"Benin\" }\n        },\n        {\n          \"arcs\": [[173, -172, 174, 175, 176, 177]],\n          \"type\": \"Polygon\",\n          \"id\": \"BFA\",\n          \"properties\": { \"name\": \"Burkina Faso\" }\n        },\n        {\n          \"arcs\": [[[178]], [[179]], [[180, 181, 182]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BGD\",\n          \"properties\": { \"name\": \"Bangladesh\" }\n        },\n        {\n          \"arcs\": [[183, 184, 185, 186, 187, 188]],\n          \"type\": \"Polygon\",\n          \"id\": \"BGR\",\n          \"properties\": { \"name\": \"Bulgaria\" }\n        },\n        { \"arcs\": [[189]], \"type\": \"Polygon\", \"id\": \"BHR\", \"properties\": { \"name\": \"Bahrain\" } },\n        {\n          \"arcs\": [\n            [[190]],\n            [[191]],\n            [[192]],\n            [[193]],\n            [[194]],\n            [[195]],\n            [[196]],\n            [[197]],\n            [[198]],\n            [[199]],\n            [[200]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BHS\",\n          \"properties\": { \"name\": \"Bahamas\" }\n        },\n        {\n          \"arcs\": [[201, 202, 203, 204, 205]],\n          \"type\": \"Polygon\",\n          \"id\": \"BIH\",\n          \"properties\": { \"name\": \"Bosnia and Herz.\" }\n        },\n        {\n          \"arcs\": [[206, 207, 208, 209, 210]],\n          \"type\": \"Polygon\",\n          \"id\": \"BLR\",\n          \"properties\": { \"name\": \"Belarus\" }\n        },\n        {\n          \"arcs\": [[[211, 212, 213]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BLZ\",\n          \"properties\": { \"name\": \"Belize\" }\n        },\n        {\n          \"arcs\": [[[214, 215]], [[216, -51, 217, 218, 219, 220, 221]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BOL\",\n          \"properties\": { \"name\": \"Bolivia\" }\n        },\n        {\n          \"arcs\": [\n            [[222]],\n            [[223]],\n            [[224]],\n            [[225]],\n            [[226]],\n            [[227]],\n            [[228]],\n            [[229]],\n            [[230]],\n            [[231]],\n            [[232]],\n            [[233]],\n            [[234]],\n            [[235]],\n            [[236]],\n            [[237]],\n            [[238, 239, 240, 241, 242, 243, -47, 244, 245, 246, -222, 247, 248, 249, 250]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BRA\",\n          \"properties\": { \"name\": \"Brazil\" }\n        },\n        { \"arcs\": [[251]], \"type\": \"Polygon\", \"id\": \"BRB\", \"properties\": { \"name\": \"Barbados\" } },\n        {\n          \"arcs\": [[[252, 253]], [[254, 255]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BRN\",\n          \"properties\": { \"name\": \"Brunei\" }\n        },\n        {\n          \"arcs\": [[256, 257]],\n          \"type\": \"Polygon\",\n          \"id\": \"BTN\",\n          \"properties\": { \"name\": \"Bhutan\" }\n        },\n        {\n          \"arcs\": [[258, 259, 260]],\n          \"type\": \"Polygon\",\n          \"id\": \"BWA\",\n          \"properties\": { \"name\": \"Botswana\" }\n        },\n        {\n          \"arcs\": [[261, 262, 263, 264, 265, 266]],\n          \"type\": \"Polygon\",\n          \"id\": \"CAF\",\n          \"properties\": { \"name\": \"Central African Rep.\" }\n        },\n        {\n          \"arcs\": [\n            [[267]],\n            [[268]],\n            [[269]],\n            [[270]],\n            [[271]],\n            [[272]],\n            [[273]],\n            [[274, 275, 276, 277]],\n            [[278]],\n            [[279]],\n            [[280]],\n            [[281]],\n            [[282]],\n            [[283]],\n            [[284]],\n            [[285]],\n            [[286]],\n            [[287]],\n            [[288]],\n            [[289]],\n            [[290]],\n            [[291]],\n            [[292]],\n            [[293]],\n            [[294]],\n            [[295]],\n            [[296]],\n            [[297]],\n            [[298]],\n            [[299]],\n            [[300]],\n            [[301]],\n            [[302]],\n            [[303]],\n            [[304]],\n            [[305]],\n            [[306]],\n            [[307]],\n            [[308]],\n            [[309]],\n            [[310]],\n            [[311]],\n            [[312]],\n            [[313]],\n            [[314]],\n            [[315]],\n            [[316]],\n            [[317]],\n            [[318]],\n            [[319]],\n            [[320]],\n            [[321]],\n            [[322]],\n            [[323]],\n            [[324]],\n            [[325]],\n            [[326]],\n            [[327]],\n            [[328]],\n            [[329]],\n            [[330]],\n            [[331]],\n            [[332]],\n            [[333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, -346, 346, 347]],\n            [[348]],\n            [[349]],\n            [[350]],\n            [[351]],\n            [[352]],\n            [[353]],\n            [[354]],\n            [[355]],\n            [[356]],\n            [[357]],\n            [[358]],\n            [[359]],\n            [[360]],\n            [[361]],\n            [[362]],\n            [[363]],\n            [[364]],\n            [[365]],\n            [[366]],\n            [[367]],\n            [[368]],\n            [[369]],\n            [[370]],\n            [[371]],\n            [[372]],\n            [[373]],\n            [[374]],\n            [[375]],\n            [[376]],\n            [[377]],\n            [[378]],\n            [[379]],\n            [[380]],\n            [[381]],\n            [[382]],\n            [[383]],\n            [[384]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CAN\",\n          \"properties\": { \"name\": \"Canada\" }\n        },\n        {\n          \"arcs\": [[385, 386, 387, -148, 388, -146, 389, 390, 391, 392, 393]],\n          \"type\": \"Polygon\",\n          \"id\": \"CHE\",\n          \"properties\": { \"name\": \"Switzerland\" }\n        },\n        {\n          \"arcs\": [\n            [[394]],\n            [[395]],\n            [[396]],\n            [[397]],\n            [[398]],\n            [[399]],\n            [[400]],\n            [[401]],\n            [[402]],\n            [[-44, 403, -42, 404]],\n            [[405]],\n            [[406]],\n            [[407]],\n            [[408]],\n            [[409]],\n            [[410]],\n            [[411]],\n            [[412]],\n            [[413]],\n            [[414]],\n            [[415]],\n            [[416]],\n            [[417]],\n            [[418]],\n            [[419]],\n            [[420]],\n            [[421]],\n            [[422]],\n            [[423]],\n            [[424]],\n            [[425]],\n            [[426]],\n            [[427]],\n            [[428]],\n            [[429]],\n            [[430]],\n            [[431]],\n            [[432]],\n            [[433]],\n            [[434]],\n            [[435]],\n            [[-50, 436, 437, -218]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CHL\",\n          \"properties\": { \"name\": \"Chile\" }\n        },\n        {\n          \"arcs\": [\n            [[438]],\n            [[439]],\n            [[440]],\n            [[441]],\n            [\n              [\n                442, 443, 444, 445, 446, 447, 448, 449, 450, 451, -258, 452, 453, 454, 455, 456, -1,\n                457, 458, 459, 460, 461, 462, 463, 464\n              ]\n            ]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CHN\",\n          \"properties\": { \"name\": \"China\" }\n        },\n        {\n          \"arcs\": [[[465, 466]], [[-177, 467, 468, 469, 470, 471]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CIV\",\n          \"properties\": { \"name\": \"C\\u00f4te d'Ivoire\" }\n        },\n        {\n          \"arcs\": [[[472, -266, 473, 474, 475, 476, 477, 478, 479]], [[480, 481]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CMR\",\n          \"properties\": { \"name\": \"Cameroon\" }\n        },\n        {\n          \"arcs\": [[[482, 483, 484, 485]], [[486, 487, 488, 489]], [[490, 491, 492, 493]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CNM\",\n          \"properties\": { \"name\": \"Cyprus U.N. Buffer Zone\" }\n        },\n        {\n          \"arcs\": [\n            [[494]],\n            [\n              [\n                495, 496, 497, 498, 499, 500, 501, 502, 503, -160, 504, 505, 506, 507, -10, 508,\n                -11, 509, -264\n              ]\n            ]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"COD\",\n          \"properties\": { \"name\": \"Dem. Rep. Congo\" }\n        },\n        {\n          \"arcs\": [[-510, -13, 510, 511, -474, -265]],\n          \"type\": \"Polygon\",\n          \"id\": \"COG\",\n          \"properties\": { \"name\": \"Congo\" }\n        },\n        {\n          \"arcs\": [[[512, -249, 513, 514, 515, 516, 517]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"COL\",\n          \"properties\": { \"name\": \"Colombia\" }\n        },\n        {\n          \"arcs\": [[[518]], [[519]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"COM\",\n          \"properties\": { \"name\": \"Comoros\" }\n        },\n        {\n          \"arcs\": [[[520]], [[521]], [[522]], [[523]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CPV\",\n          \"properties\": { \"name\": \"Cape Verde\" }\n        },\n        {\n          \"arcs\": [[[524, 525, 526, 527]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CRI\",\n          \"properties\": { \"name\": \"Costa Rica\" }\n        },\n        {\n          \"arcs\": [[[528]], [[529]], [[530]], [[531, 532, 533, 534]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CUB\",\n          \"properties\": { \"name\": \"Cuba\" }\n        },\n        {\n          \"arcs\": [[535]],\n          \"type\": \"Polygon\",\n          \"id\": \"CUW\",\n          \"properties\": { \"name\": \"Cura\\u00e7ao\" }\n        },\n        {\n          \"arcs\": [[[536, -488]], [[-486, 537, -494, 538]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CYN\",\n          \"properties\": { \"name\": \"N. Cyprus\" }\n        },\n        {\n          \"arcs\": [\n            [[539, 540]],\n            [[541]],\n            [[542, 543, -484]],\n            [[544, 545, 546, 547, -490, 548, -492]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CYP\",\n          \"properties\": { \"name\": \"Cyprus\" }\n        },\n        {\n          \"arcs\": [[549, 550, -151, 551]],\n          \"type\": \"Polygon\",\n          \"id\": \"CZE\",\n          \"properties\": { \"name\": \"Czech Rep.\" }\n        },\n        {\n          \"arcs\": [\n            [[-387, 552]],\n            [[553, 554]],\n            [[555]],\n            [[556, 557, -552, -150, 558, -394, 559, 560, -162, 561, 562, 563]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"DEU\",\n          \"properties\": { \"name\": \"Germany\" }\n        },\n        {\n          \"arcs\": [[564, 565, 566, 567, 568, 569]],\n          \"type\": \"Polygon\",\n          \"id\": \"DJI\",\n          \"properties\": { \"name\": \"Djibouti\" }\n        },\n        { \"arcs\": [[570]], \"type\": \"Polygon\", \"id\": \"DMA\", \"properties\": { \"name\": \"Dominica\" } },\n        {\n          \"arcs\": [[[571]], [[572]], [[573]], [[574]], [[575]], [[576]], [[577]], [[-564, 578]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"DNK\",\n          \"properties\": { \"name\": \"Denmark\" }\n        },\n        {\n          \"arcs\": [[[579, 580, 581, 582, 583, 584]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"DOM\",\n          \"properties\": { \"name\": \"Dominican Rep.\" }\n        },\n        {\n          \"arcs\": [[585, 586, 587, 588, 589, 590, 591, 592]],\n          \"type\": \"Polygon\",\n          \"id\": \"DZA\",\n          \"properties\": { \"name\": \"Algeria\" }\n        },\n        {\n          \"arcs\": [[[593]], [[594]], [[595]], [[596]], [[597]], [[598]], [[599, 600, -515]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ECU\",\n          \"properties\": { \"name\": \"Ecuador\" }\n        },\n        {\n          \"arcs\": [[[601, 602, 603, 604, 605, 606]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"EGY\",\n          \"properties\": { \"name\": \"Egypt\" }\n        },\n        {\n          \"arcs\": [[[607]], [[-569, 608, 609, 610]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ERI\",\n          \"properties\": { \"name\": \"Eritrea\" }\n        },\n        {\n          \"arcs\": [[-485, -544, 611, -541, 612, -545, -491, -538], [-542]],\n          \"type\": \"Polygon\",\n          \"id\": \"ESB\",\n          \"properties\": { \"name\": \"Dhekelia\" }\n        },\n        {\n          \"arcs\": [\n            [[613]],\n            [[614]],\n            [[615]],\n            [[616]],\n            [[617]],\n            [[618]],\n            [[619, 620]],\n            [[621, 622]],\n            [[623]],\n            [[624]],\n            [[625]],\n            [[626]],\n            [[627, -33, 628, 629, 630, 631, 632, 633]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ESP\",\n          \"properties\": { \"name\": \"Spain\" }\n        },\n        {\n          \"arcs\": [[[634]], [[635]], [[636, 637, 638, 639, 640, 641, 642, 643, 644]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"EST\",\n          \"properties\": { \"name\": \"Estonia\" }\n        },\n        {\n          \"arcs\": [[-568, 645, -566, 646, 647, 648, 649, 650, -609]],\n          \"type\": \"Polygon\",\n          \"id\": \"ETH\",\n          \"properties\": { \"name\": \"Ethiopia\" }\n        },\n        {\n          \"arcs\": [[[651]], [[652, 653, 654, 655]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FIN\",\n          \"properties\": { \"name\": \"Finland\" }\n        },\n        {\n          \"arcs\": [[[656]], [[657]], [[658]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FJI\",\n          \"properties\": { \"name\": \"Fiji\" }\n        },\n        {\n          \"arcs\": [[[659]], [[660]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FLK\",\n          \"properties\": { \"name\": \"Falkland Is.\" }\n        },\n        {\n          \"arcs\": [\n            [[661]],\n            [[662]],\n            [[-240, 663, 664]],\n            [[665]],\n            [[666]],\n            [[667]],\n            [[668]],\n            [[669, -560, -393, 670, -391, 671, 672, 673, 674, -629, -34, -628, 675, -164], [-627]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FRA\",\n          \"properties\": { \"name\": \"France\" }\n        },\n        {\n          \"arcs\": [[[676]], [[677]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FRO\",\n          \"properties\": { \"name\": \"Faeroe Is.\" }\n        },\n        {\n          \"arcs\": [[[678]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FSM\",\n          \"properties\": { \"name\": \"Micronesia\" }\n        },\n        {\n          \"arcs\": [[[-512, 679, 680, -475]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GAB\",\n          \"properties\": { \"name\": \"Gabon\" }\n        },\n        {\n          \"arcs\": [\n            [[681]],\n            [[682]],\n            [[683, 684]],\n            [[685]],\n            [[686]],\n            [[687]],\n            [[688]],\n            [[689]],\n            [[690]],\n            [[691]],\n            [[692]],\n            [[693]],\n            [[694]],\n            [[695]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GBR\",\n          \"properties\": { \"name\": \"United Kingdom\" }\n        },\n        {\n          \"arcs\": [[-157, -57, 696, 697, 698]],\n          \"type\": \"Polygon\",\n          \"id\": \"GEO\",\n          \"properties\": { \"name\": \"Georgia\" }\n        },\n        {\n          \"arcs\": [[699, 700, -466, 701, -468, -176]],\n          \"type\": \"Polygon\",\n          \"id\": \"GHA\",\n          \"properties\": { \"name\": \"Ghana\" }\n        },\n        {\n          \"arcs\": [[-631, 702]],\n          \"type\": \"Polygon\",\n          \"id\": \"GIB\",\n          \"properties\": { \"name\": \"Gibraltar\" }\n        },\n        {\n          \"arcs\": [[703, -471, 704, 705, 706, 707, 708]],\n          \"type\": \"Polygon\",\n          \"id\": \"GIN\",\n          \"properties\": { \"name\": \"Guinea\" }\n        },\n        {\n          \"arcs\": [[709, 710]],\n          \"type\": \"Polygon\",\n          \"id\": \"GMB\",\n          \"properties\": { \"name\": \"Gambia\" }\n        },\n        {\n          \"arcs\": [[[711]], [[712, 713, -708]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GNB\",\n          \"properties\": { \"name\": \"Guinea-Bissau\" }\n        },\n        {\n          \"arcs\": [[[-681, 714, -476]], [[715]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GNQ\",\n          \"properties\": { \"name\": \"Eq. Guinea\" }\n        },\n        {\n          \"arcs\": [\n            [[716]],\n            [[717]],\n            [[718]],\n            [[719]],\n            [[720]],\n            [[721]],\n            [[722]],\n            [[723]],\n            [[724]],\n            [[725]],\n            [[726]],\n            [[727]],\n            [[728]],\n            [[729]],\n            [[730]],\n            [[731]],\n            [[732, -186, 733, 734, -27, 735, -25, 736]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GRC\",\n          \"properties\": { \"name\": \"Greece\" }\n        },\n        {\n          \"arcs\": [[[737]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GRD\",\n          \"properties\": { \"name\": \"Grenada\" }\n        },\n        {\n          \"arcs\": [\n            [[738]],\n            [[739]],\n            [[740]],\n            [[741]],\n            [[742]],\n            [[743]],\n            [[744]],\n            [[745]],\n            [[746]],\n            [[747]],\n            [[748]],\n            [[749]],\n            [[750]],\n            [[751]],\n            [[752]],\n            [[753]],\n            [[754]],\n            [[755]],\n            [[756]],\n            [[757]],\n            [[758]],\n            [[759]],\n            [[760]],\n            [[761]],\n            [[762]],\n            [[763]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GRL\",\n          \"properties\": { \"name\": \"Greenland\" }\n        },\n        {\n          \"arcs\": [[-213, 764, 765, 766, 767, 768]],\n          \"type\": \"Polygon\",\n          \"id\": \"GTM\",\n          \"properties\": { \"name\": \"Guatemala\" }\n        },\n        { \"arcs\": [[769]], \"type\": \"Polygon\", \"id\": \"GUM\", \"properties\": { \"name\": \"Guam\" } },\n        {\n          \"arcs\": [[[770, -251, 771, 772]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GUY\",\n          \"properties\": { \"name\": \"Guyana\" }\n        },\n        {\n          \"arcs\": [[[773, -447]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HKG\",\n          \"properties\": { \"name\": \"Hong Kong\" }\n        },\n        {\n          \"arcs\": [[774]],\n          \"type\": \"Polygon\",\n          \"id\": \"HMD\",\n          \"properties\": { \"name\": \"Heard I. and McDonald Is.\" }\n        },\n        {\n          \"arcs\": [[[775, 776, 777, -766, 778]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HND\",\n          \"properties\": { \"name\": \"Honduras\" }\n        },\n        {\n          \"arcs\": [\n            [[-204, 779, 780]],\n            [[781]],\n            [[782]],\n            [[783]],\n            [[784]],\n            [[785, 786, -206, 787, 788]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HRV\",\n          \"properties\": { \"name\": \"Croatia\" }\n        },\n        {\n          \"arcs\": [[[-582, 789]], [[790]], [[-584, 791, -580, 792]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HTI\",\n          \"properties\": { \"name\": \"Haiti\" }\n        },\n        {\n          \"arcs\": [[793, 794, 795, -786, 796, -143, 797]],\n          \"type\": \"Polygon\",\n          \"id\": \"HUN\",\n          \"properties\": { \"name\": \"Hungary\" }\n        },\n        {\n          \"arcs\": [\n            [[798]],\n            [[799]],\n            [[800]],\n            [[801, 802, 803, 804]],\n            [[805]],\n            [[806]],\n            [[807]],\n            [[808]],\n            [[809]],\n            [[810]],\n            [[811]],\n            [[812]],\n            [[813]],\n            [[814]],\n            [[815]],\n            [[816]],\n            [[817]],\n            [[818]],\n            [[819]],\n            [[820]],\n            [[821]],\n            [[822]],\n            [[823]],\n            [[824]],\n            [[825]],\n            [[826]],\n            [[827]],\n            [[828]],\n            [[829]],\n            [[830]],\n            [[831]],\n            [[832]],\n            [[833]],\n            [[834]],\n            [[835]],\n            [[836]],\n            [[837]],\n            [[838]],\n            [[839]],\n            [[840]],\n            [[841]],\n            [[842]],\n            [[843]],\n            [[844]],\n            [[845]],\n            [[846]],\n            [[847]],\n            [[848]],\n            [[849]],\n            [[850]],\n            [[851]],\n            [[852]],\n            [[853]],\n            [[854]],\n            [[855]],\n            [[856]],\n            [[857, 858]],\n            [[859]],\n            [[860]],\n            [[861]],\n            [[862]],\n            [[863]],\n            [[864]],\n            [[865]],\n            [[866]],\n            [[867]],\n            [[868]],\n            [[869]],\n            [[870]],\n            [[871]],\n            [[872]],\n            [[873]],\n            [[874]],\n            [[875]],\n            [[876]],\n            [[877]],\n            [[878]],\n            [[879]],\n            [[880]],\n            [[881, 882]],\n            [[883]],\n            [[884, 885]],\n            [[886]],\n            [[887]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IDN\",\n          \"properties\": { \"name\": \"Indonesia\" }\n        },\n        {\n          \"arcs\": [[888]],\n          \"type\": \"Polygon\",\n          \"id\": \"IMN\",\n          \"properties\": { \"name\": \"Isle of Man\" }\n        },\n        {\n          \"arcs\": [\n            [[889]],\n            [[890]],\n            [[891]],\n            [[892]],\n            [[893, -453, -257, -452, 894, -183, 895, 896, 897, -455]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IND\",\n          \"properties\": { \"name\": \"India\" }\n        },\n        {\n          \"arcs\": [[[-684, 898]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IRL\",\n          \"properties\": { \"name\": \"Ireland\" }\n        },\n        {\n          \"arcs\": [[[899]], [[-54, -156, 900, 901, -3, 902, 903, 904, 905, -152]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IRN\",\n          \"properties\": { \"name\": \"Iran\" }\n        },\n        {\n          \"arcs\": [[-905, 906, 907, 908, 909, 910, 911, 912, 913]],\n          \"type\": \"Polygon\",\n          \"id\": \"IRQ\",\n          \"properties\": { \"name\": \"Iraq\" }\n        },\n        {\n          \"arcs\": [[[914]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ISL\",\n          \"properties\": { \"name\": \"Iceland\" }\n        },\n        {\n          \"arcs\": [[915, 916, 917, 918, 919, 920, 921, -603, 922, 923, 924, 925]],\n          \"type\": \"Polygon\",\n          \"id\": \"ISR\",\n          \"properties\": { \"name\": \"Israel\" }\n        },\n        {\n          \"arcs\": [[[926]], [[927]], [[928, 929, -672, -390, -145], [930], [931]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ITA\",\n          \"properties\": { \"name\": \"Italy\" }\n        },\n        { \"arcs\": [[932]], \"type\": \"Polygon\", \"id\": \"JAM\", \"properties\": { \"name\": \"Jamaica\" } },\n        {\n          \"arcs\": [[933, 934, -921, 935, -919, 936, 937, -916, 938, -910]],\n          \"type\": \"Polygon\",\n          \"id\": \"JOR\",\n          \"properties\": { \"name\": \"Jordan\" }\n        },\n        {\n          \"arcs\": [\n            [[939]],\n            [[940]],\n            [[941]],\n            [[942]],\n            [[943]],\n            [[944]],\n            [[945]],\n            [[946]],\n            [[947]],\n            [[948]],\n            [[949]],\n            [[950]],\n            [[951]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"JPN\",\n          \"properties\": { \"name\": \"Japan\" }\n        },\n        { \"arcs\": [[952]], \"type\": \"Polygon\", \"id\": \"KAB\", \"properties\": { \"name\": \"Baikonur\" } },\n        {\n          \"arcs\": [[-898, 953, -456]],\n          \"type\": \"Polygon\",\n          \"id\": \"KAS\",\n          \"properties\": { \"name\": \"Siachen Glacier\" }\n        },\n        {\n          \"arcs\": [[[954, 955]], [[-460, 956, 957, 958, 959, 960, 961, 962], [-953]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KAZ\",\n          \"properties\": { \"name\": \"Kazakhstan\" }\n        },\n        {\n          \"arcs\": [[[-649, 963, 964, 965, 966, 967, 968]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KEN\",\n          \"properties\": { \"name\": \"Kenya\" }\n        },\n        {\n          \"arcs\": [[-459, 969, 970, -957], [971], [972], [973]],\n          \"type\": \"Polygon\",\n          \"id\": \"KGZ\",\n          \"properties\": { \"name\": \"Kyrgyzstan\" }\n        },\n        {\n          \"arcs\": [[[974, 975, 976, 977]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KHM\",\n          \"properties\": { \"name\": \"Cambodia\" }\n        },\n        {\n          \"arcs\": [[[978]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KIR\",\n          \"properties\": { \"name\": \"Kiribati\" }\n        },\n        {\n          \"arcs\": [[[979]], [[980]], [[981]], [[982, 983]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KOR\",\n          \"properties\": { \"name\": \"Korea\" }\n        },\n        {\n          \"arcs\": [[984, -18, 985, 986]],\n          \"type\": \"Polygon\",\n          \"id\": \"XKX\",\n          \"properties\": { \"name\": \"Kosovo\" }\n        },\n        {\n          \"arcs\": [[[987]], [[988, -908, 989]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KWT\",\n          \"properties\": { \"name\": \"Kuwait\" }\n        },\n        {\n          \"arcs\": [[990, -977, 991, 992, -450]],\n          \"type\": \"Polygon\",\n          \"id\": \"LAO\",\n          \"properties\": { \"name\": \"Lao PDR\" }\n        },\n        {\n          \"arcs\": [[-925, 993, 994]],\n          \"type\": \"Polygon\",\n          \"id\": \"LBN\",\n          \"properties\": { \"name\": \"Lebanon\" }\n        },\n        {\n          \"arcs\": [[-470, 995, 996, -705]],\n          \"type\": \"Polygon\",\n          \"id\": \"LBR\",\n          \"properties\": { \"name\": \"Liberia\" }\n        },\n        {\n          \"arcs\": [[-606, 997, 998, 999, -587, 1000, 1001]],\n          \"type\": \"Polygon\",\n          \"id\": \"LBY\",\n          \"properties\": { \"name\": \"Libya\" }\n        },\n        {\n          \"arcs\": [[1002]],\n          \"type\": \"Polygon\",\n          \"id\": \"LCA\",\n          \"properties\": { \"name\": \"Saint Lucia\" }\n        },\n        {\n          \"arcs\": [[-389, -147]],\n          \"type\": \"Polygon\",\n          \"id\": \"LIE\",\n          \"properties\": { \"name\": \"Liechtenstein\" }\n        },\n        {\n          \"arcs\": [[[1003]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"LKA\",\n          \"properties\": { \"name\": \"Sri Lanka\" }\n        },\n        { \"arcs\": [[1004]], \"type\": \"Polygon\", \"id\": \"LSO\", \"properties\": { \"name\": \"Lesotho\" } },\n        {\n          \"arcs\": [[[1005, 1006]], [[-210, 1007, 1008, 1009, 1010]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"LTU\",\n          \"properties\": { \"name\": \"Lithuania\" }\n        },\n        {\n          \"arcs\": [[-561, -670, -163]],\n          \"type\": \"Polygon\",\n          \"id\": \"LUX\",\n          \"properties\": { \"name\": \"Luxembourg\" }\n        },\n        {\n          \"arcs\": [[1011, -211, -1011, 1012, -644]],\n          \"type\": \"Polygon\",\n          \"id\": \"LVA\",\n          \"properties\": { \"name\": \"Latvia\" }\n        },\n        {\n          \"arcs\": [[1013, 1014]],\n          \"type\": \"Polygon\",\n          \"id\": \"MAF\",\n          \"properties\": { \"name\": \"St-Martin\" }\n        },\n        {\n          \"arcs\": [[-622, 1015, -620, 1016, -592, 1017, 1018]],\n          \"type\": \"Polygon\",\n          \"id\": \"MAR\",\n          \"properties\": { \"name\": \"Morocco\" }\n        },\n        {\n          \"arcs\": [[1019, -674]],\n          \"type\": \"Polygon\",\n          \"id\": \"MCO\",\n          \"properties\": { \"name\": \"Monaco\" }\n        },\n        {\n          \"arcs\": [[1020, 1021]],\n          \"type\": \"Polygon\",\n          \"id\": \"MDA\",\n          \"properties\": { \"name\": \"Moldova\" }\n        },\n        {\n          \"arcs\": [[[1022]], [[1023]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MDG\",\n          \"properties\": { \"name\": \"Madagascar\" }\n        },\n        {\n          \"arcs\": [\n            [[1024]],\n            [[1025]],\n            [[1026]],\n            [[1027]],\n            [[1028]],\n            [[1029, 1030, 1031, 1032, 1033, -214, -769, 1034, 1035], [1036]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MEX\",\n          \"properties\": { \"name\": \"Mexico\" }\n        },\n        {\n          \"arcs\": [[[-23, 1037]], [[-187, -733, 1038, -15, 1039, -21, 1040, -19, -985, 1041]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MKD\",\n          \"properties\": { \"name\": \"Macedonia\" }\n        },\n        {\n          \"arcs\": [[1042, -178, -472, -704, 1043, 1044, -589]],\n          \"type\": \"Polygon\",\n          \"id\": \"MLI\",\n          \"properties\": { \"name\": \"Mali\" }\n        },\n        {\n          \"arcs\": [\n            [[1045]],\n            [[1046]],\n            [[1047]],\n            [[1048]],\n            [[1049]],\n            [[1050]],\n            [[-993, 1051, 1052, -181, -895, -451]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MMR\",\n          \"properties\": { \"name\": \"Myanmar\" }\n        },\n        {\n          \"arcs\": [[1053, -986, -31, 1054, -16, 1055, -29, 1056, -780, -203]],\n          \"type\": \"Polygon\",\n          \"id\": \"MNE\",\n          \"properties\": { \"name\": \"Montenegro\" }\n        },\n        {\n          \"arcs\": [[-464, 1057, -462, 1058]],\n          \"type\": \"Polygon\",\n          \"id\": \"MNG\",\n          \"properties\": { \"name\": \"Mongolia\" }\n        },\n        {\n          \"arcs\": [[[1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MOZ\",\n          \"properties\": { \"name\": \"Mozambique\" }\n        },\n        {\n          \"arcs\": [[[1068, 1069, 1070, -590, -1045]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MRT\",\n          \"properties\": { \"name\": \"Mauritania\" }\n        },\n        {\n          \"arcs\": [[[1071]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MUS\",\n          \"properties\": { \"name\": \"Mauritius\" }\n        },\n        {\n          \"arcs\": [\n            [[1072, 1073]],\n            [[1074, 1075]],\n            [[1076, 1077]],\n            [[1078, 1079]],\n            [[1080, -1065, 1081, 1082]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MWI\",\n          \"properties\": { \"name\": \"Malawi\" }\n        },\n        {\n          \"arcs\": [\n            [[1083]],\n            [[-882, 1084]],\n            [[1085]],\n            [[1086]],\n            [[1087, 1088]],\n            [[-886, 1089, -256, 1090, -253, 1091]],\n            [[1092]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MYS\",\n          \"properties\": { \"name\": \"Malaysia\" }\n        },\n        {\n          \"arcs\": [[1093, -261, 1094, 1095, -8]],\n          \"type\": \"Polygon\",\n          \"id\": \"NAM\",\n          \"properties\": { \"name\": \"Namibia\" }\n        },\n        {\n          \"arcs\": [[[1096]], [[1097]], [[1098]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NCL\",\n          \"properties\": { \"name\": \"New Caledonia\" }\n        },\n        {\n          \"arcs\": [[1099, 1100, -173, -174, -1043, -588, -1000]],\n          \"type\": \"Polygon\",\n          \"id\": \"NER\",\n          \"properties\": { \"name\": \"Niger\" }\n        },\n        {\n          \"arcs\": [[[1101, -478, 1102, -169, -1101]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NGA\",\n          \"properties\": { \"name\": \"Nigeria\" }\n        },\n        {\n          \"arcs\": [[[1103, -528, 1104, -776]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NIC\",\n          \"properties\": { \"name\": \"Nicaragua\" }\n        },\n        {\n          \"arcs\": [[[-166, 1105]], [[1106]], [[-562, -168, 1107], [1108]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NLD\",\n          \"properties\": { \"name\": \"Netherlands\" }\n        },\n        {\n          \"arcs\": [\n            [[1109]],\n            [[1110]],\n            [[1111]],\n            [[1112]],\n            [[1113]],\n            [[1114]],\n            [[1115]],\n            [[1116]],\n            [[1117]],\n            [[1118]],\n            [[1119]],\n            [[1120]],\n            [[1121]],\n            [[1122]],\n            [[1123, -656, 1124, 1125]],\n            [[1126]],\n            [[1127]],\n            [[1128]],\n            [[1129]],\n            [[1130]],\n            [[1131]],\n            [[1132]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NOR\",\n          \"properties\": { \"name\": \"Norway\" }\n        },\n        {\n          \"arcs\": [[-894, -454]],\n          \"type\": \"Polygon\",\n          \"id\": \"NPL\",\n          \"properties\": { \"name\": \"Nepal\" }\n        },\n        {\n          \"arcs\": [[[1133]], [[1134]], [[1135]], [[1136]], [[1137]], [[1138]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NZL\",\n          \"properties\": { \"name\": \"New Zealand\" }\n        },\n        {\n          \"arcs\": [[[1139]], [[1140, 1141, -37, 1142]], [[-41], [-35]], [[-40, 1143]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"OMN\",\n          \"properties\": { \"name\": \"Oman\" }\n        },\n        {\n          \"arcs\": [[[-954, -897, 1144, -903, -2, -457]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PAK\",\n          \"properties\": { \"name\": \"Pakistan\" }\n        },\n        {\n          \"arcs\": [[[1145]], [[-517, 1146, -526, 1147]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PAN\",\n          \"properties\": { \"name\": \"Panama\" }\n        },\n        {\n          \"arcs\": [[[-248, -221, 1148, -215, 1149, -219, -438, 1150, -600, -514]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PER\",\n          \"properties\": { \"name\": \"Peru\" }\n        },\n        {\n          \"arcs\": [\n            [[1151]],\n            [[1152]],\n            [[1153]],\n            [[1154]],\n            [[1155]],\n            [[1156]],\n            [[1157]],\n            [[1158]],\n            [[1159]],\n            [[1160]],\n            [[1161]],\n            [[1162]],\n            [[1163]],\n            [[1164]],\n            [[1165]],\n            [[1166]],\n            [[1167]],\n            [[1168]],\n            [[1169]],\n            [[1170]],\n            [[1171]],\n            [[1172]],\n            [[1173]],\n            [[1174]],\n            [[1175]],\n            [[1176]],\n            [[1177]],\n            [[1178]],\n            [[1179]],\n            [[1180]],\n            [[1181]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PHL\",\n          \"properties\": { \"name\": \"Philippines\" }\n        },\n        {\n          \"arcs\": [[[1182]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PLW\",\n          \"properties\": { \"name\": \"Palau\" }\n        },\n        {\n          \"arcs\": [\n            [[1183]],\n            [[1184]],\n            [[1185]],\n            [[1186]],\n            [[1187]],\n            [[1188]],\n            [[1189]],\n            [[1190]],\n            [[1191]],\n            [[1192]],\n            [[1193]],\n            [[1194]],\n            [[-858, 1195]],\n            [[1196]],\n            [[1197]],\n            [[1198]],\n            [[1199]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PNG\",\n          \"properties\": { \"name\": \"Papua New Guinea\" }\n        },\n        {\n          \"arcs\": [[1200, 1201, 1202, -1008, -209, 1203, 1204, -550, -558, 1205, -554, 1206]],\n          \"type\": \"Polygon\",\n          \"id\": \"POL\",\n          \"properties\": { \"name\": \"Poland\" }\n        },\n        {\n          \"arcs\": [[[1207]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PRI\",\n          \"properties\": { \"name\": \"Puerto Rico\" }\n        },\n        {\n          \"arcs\": [[[1208, 1209, -983, 1210, -445]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PRK\",\n          \"properties\": { \"name\": \"Dem. Rep. Korea\" }\n        },\n        {\n          \"arcs\": [[[1211]], [[1212]], [[1213]], [[1214]], [[1215, -633]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PRT\",\n          \"properties\": { \"name\": \"Portugal\" }\n        },\n        {\n          \"arcs\": [[-247, 1216, -245, -46, -217]],\n          \"type\": \"Polygon\",\n          \"id\": \"PRY\",\n          \"properties\": { \"name\": \"Paraguay\" }\n        },\n        {\n          \"arcs\": [[[-602, 1217, -923]], [[-938, 1218, -917]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PSX\",\n          \"properties\": { \"name\": \"Palestine\" }\n        },\n        {\n          \"arcs\": [[[1219]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PYF\",\n          \"properties\": { \"name\": \"Fr. Polynesia\" }\n        },\n        {\n          \"arcs\": [[1220, 1221]],\n          \"type\": \"Polygon\",\n          \"id\": \"QAT\",\n          \"properties\": { \"name\": \"Qatar\" }\n        },\n        {\n          \"arcs\": [[1222, 1223, -189, 1224, -795, 1225, -1021]],\n          \"type\": \"Polygon\",\n          \"id\": \"ROU\",\n          \"properties\": { \"name\": \"Romania\" }\n        },\n        {\n          \"arcs\": [\n            [[1226]],\n            [[1227]],\n            [[1228]],\n            [[1229]],\n            [[1230]],\n            [[1231]],\n            [[1232]],\n            [[1233]],\n            [[1234]],\n            [[1235]],\n            [[1236]],\n            [[-1203, 1237, -1201, 1238, -1006, 1239, -1009]],\n            [[1240]],\n            [[1241]],\n            [[1242, -639]],\n            [[1243]],\n            [[1244]],\n            [[1245]],\n            [[1246]],\n            [[1247]],\n            [[1248]],\n            [[1249]],\n            [[1250]],\n            [[1251]],\n            [[1252]],\n            [[1253]],\n            [[1254]],\n            [[1255]],\n            [[1256]],\n            [[1257]],\n            [[1258]],\n            [[1259]],\n            [[1260]],\n            [[1261]],\n            [[1262]],\n            [[1263]],\n            [[1264]],\n            [[1265]],\n            [[1266]],\n            [[1267]],\n            [[1268]],\n            [[1269]],\n            [[1270]],\n            [\n              [\n                -1209, -444, 1271, -465, -1059, -461, -963, 1272, -154, -699, 1273, 1274, -207,\n                -1012, -643, 1275, -641, 1276, -637, 1277, -653, -1124, 1278\n              ]\n            ],\n            [[1279]],\n            [[1280]],\n            [[1281]],\n            [[1282]],\n            [[1283]],\n            [[1284]],\n            [[1285]],\n            [[1286]],\n            [[1287]],\n            [[1288]],\n            [[1289]],\n            [[1290]],\n            [[1291]],\n            [[1292]],\n            [[1293]],\n            [[1294]],\n            [[1295]],\n            [[1296]],\n            [[1297]],\n            [[1298]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"RUS\",\n          \"properties\": { \"name\": \"Russia\" }\n        },\n        {\n          \"arcs\": [[1299, -161, -504, 1300, -502, 1301]],\n          \"type\": \"Polygon\",\n          \"id\": \"RWA\",\n          \"properties\": { \"name\": \"Rwanda\" }\n        },\n        {\n          \"arcs\": [[-591, -1071, 1302, -1018]],\n          \"type\": \"Polygon\",\n          \"id\": \"ESH\",\n          \"properties\": { \"name\": \"W. Sahara\" }\n        },\n        {\n          \"arcs\": [[[1303]], [[-989, 1304, -1221, 1305, -38, -1142, 1306, 1307, -934, -909]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SAU\",\n          \"properties\": { \"name\": \"Saudi Arabia\" }\n        },\n        {\n          \"arcs\": [[[1308, -610, -651, 1309, -262, 1310, -998, -605]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SDN\",\n          \"properties\": { \"name\": \"Sudan\" }\n        },\n        {\n          \"arcs\": [[-650, -969, 1311, -496, -263, -1310]],\n          \"type\": \"Polygon\",\n          \"id\": \"SSD\",\n          \"properties\": { \"name\": \"S. Sudan\" }\n        },\n        {\n          \"arcs\": [[-1044, -709, -714, 1312, -711, 1313, -1069]],\n          \"type\": \"Polygon\",\n          \"id\": \"SEN\",\n          \"properties\": { \"name\": \"Senegal\" }\n        },\n        { \"arcs\": [[1314]], \"type\": \"Polygon\", \"id\": \"SGP\", \"properties\": { \"name\": \"Singapore\" } },\n        {\n          \"arcs\": [[[1315]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SGS\",\n          \"properties\": { \"name\": \"S. Geo. and S. Sandw. Is.\" }\n        },\n        {\n          \"arcs\": [\n            [[1316]],\n            [[1317]],\n            [[1318]],\n            [[1319]],\n            [[1320]],\n            [[1321]],\n            [[1322]],\n            [[1323]],\n            [[1324]],\n            [[1325]],\n            [[1326]],\n            [[1327]],\n            [[1328]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SLB\",\n          \"properties\": { \"name\": \"Solomon Is.\" }\n        },\n        {\n          \"arcs\": [[[1329]], [[-997, 1330, -706]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SLE\",\n          \"properties\": { \"name\": \"Sierra Leone\" }\n        },\n        {\n          \"arcs\": [[[-778, 1331, -767]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SLV\",\n          \"properties\": { \"name\": \"El Salvador\" }\n        },\n        {\n          \"arcs\": [[-931]],\n          \"type\": \"Polygon\",\n          \"id\": \"SMR\",\n          \"properties\": { \"name\": \"San Marino\" }\n        },\n        {\n          \"arcs\": [[1332, -647, -565, 1333]],\n          \"type\": \"Polygon\",\n          \"id\": \"SOL\",\n          \"properties\": { \"name\": \"Somaliland\" }\n        },\n        {\n          \"arcs\": [[-964, -648, -1333, 1334]],\n          \"type\": \"Polygon\",\n          \"id\": \"SOM\",\n          \"properties\": { \"name\": \"Somalia\" }\n        },\n        {\n          \"arcs\": [[-1225, -188, -1042, -987, -1054, -202, -787, -796]],\n          \"type\": \"Polygon\",\n          \"id\": \"SRB\",\n          \"properties\": { \"name\": \"Serbia\" }\n        },\n        {\n          \"arcs\": [[[1335]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"STP\",\n          \"properties\": { \"name\": \"S\\u00e3o Tom\\u00e9 and Principe\" }\n        },\n        {\n          \"arcs\": [[-664, -239, -771, 1336]],\n          \"type\": \"Polygon\",\n          \"id\": \"SUR\",\n          \"properties\": { \"name\": \"Suriname\" }\n        },\n        {\n          \"arcs\": [[1337, -798, -142, -551, -1205]],\n          \"type\": \"Polygon\",\n          \"id\": \"SVK\",\n          \"properties\": { \"name\": \"Slovakia\" }\n        },\n        {\n          \"arcs\": [[-789, 1338, -929, -144, -797]],\n          \"type\": \"Polygon\",\n          \"id\": \"SVN\",\n          \"properties\": { \"name\": \"Slovenia\" }\n        },\n        {\n          \"arcs\": [[[1339]], [[1340]], [[1341]], [[1342, -1125, -655]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SWE\",\n          \"properties\": { \"name\": \"Sweden\" }\n        },\n        {\n          \"arcs\": [[-1061, 1343]],\n          \"type\": \"Polygon\",\n          \"id\": \"SWZ\",\n          \"properties\": { \"name\": \"Swaziland\" }\n        },\n        {\n          \"arcs\": [[1344, -1014]],\n          \"type\": \"Polygon\",\n          \"id\": \"SXM\",\n          \"properties\": { \"name\": \"Sint Maarten\" }\n        },\n        {\n          \"arcs\": [[-913, 911, -911, -939, -926, -995, 1345, 1346]],\n          \"type\": \"Polygon\",\n          \"id\": \"SYR\",\n          \"properties\": { \"name\": \"Syria\" }\n        },\n        {\n          \"arcs\": [[-1311, -267, -473, 1347, -481, 1348, -479, -1102, -1100, -999]],\n          \"type\": \"Polygon\",\n          \"id\": \"TCD\",\n          \"properties\": { \"name\": \"Chad\" }\n        },\n        {\n          \"arcs\": [[-171, 1349, -700, -175]],\n          \"type\": \"Polygon\",\n          \"id\": \"TGO\",\n          \"properties\": { \"name\": \"Togo\" }\n        },\n        {\n          \"arcs\": [[[1350]], [[1351]], [[-992, -976, 1352, -1089, 1353, -1052]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"THA\",\n          \"properties\": { \"name\": \"Thailand\" }\n        },\n        {\n          \"arcs\": [[[-974]], [[1354]], [[-970, -458, -6, 1355]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TJK\",\n          \"properties\": { \"name\": \"Tajikistan\" }\n        },\n        {\n          \"arcs\": [[[-4, -902, 1356, -961, 1357, 1358, 1359]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TKM\",\n          \"properties\": { \"name\": \"Turkmenistan\" }\n        },\n        {\n          \"arcs\": [[[1360, -803]], [[-805, 1361]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TLS\",\n          \"properties\": { \"name\": \"Timor-Leste\" }\n        },\n        {\n          \"arcs\": [[[1362]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TON\",\n          \"properties\": { \"name\": \"Tonga\" }\n        },\n        {\n          \"arcs\": [[[1363]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TTO\",\n          \"properties\": { \"name\": \"Trinidad and Tobago\" }\n        },\n        {\n          \"arcs\": [[[1364]], [[-1001, -586, 1365]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TUN\",\n          \"properties\": { \"name\": \"Tunisia\" }\n        },\n        {\n          \"arcs\": [[[1366, -734, -185]], [[-697, -56, -153, -906, -914, -1347, 1367]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TUR\",\n          \"properties\": { \"name\": \"Turkey\" }\n        },\n        {\n          \"arcs\": [[[1368]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TWN\",\n          \"properties\": { \"name\": \"Taiwan\" }\n        },\n        {\n          \"arcs\": [\n            [[1369]],\n            [[1370]],\n            [[1371]],\n            [[1372]],\n            [\n              [\n                1373, 1374, 1375, -966, 1376, -1067, 1377, -1074, 1378, -1076, 1379, -1078, 1380,\n                -1080, 1381, -1083, 1382, 1383, -158, -1300, 1384\n              ]\n            ]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TZA\",\n          \"properties\": { \"name\": \"Tanzania\" }\n        },\n        {\n          \"arcs\": [\n            [[-1375, 1385]],\n            [[1386, -1385, -1302, -501, 1387, -499, 1388, -497, -1312, -968]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"UGA\",\n          \"properties\": { \"name\": \"Uganda\" }\n        },\n        {\n          \"arcs\": [[[1389, -1223, -1022, -1226, -794, -1338, -1204, -208, -1275], [1390], [1391]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"UKR\",\n          \"properties\": { \"name\": \"Ukraine\" }\n        },\n        {\n          \"arcs\": [[1392, -242, 1393, -48, -244]],\n          \"type\": \"Polygon\",\n          \"id\": \"URY\",\n          \"properties\": { \"name\": \"Uruguay\" }\n        },\n        {\n          \"arcs\": [\n            [[1394]],\n            [[1395]],\n            [[1396]],\n            [[1397]],\n            [[1398]],\n            [[1399]],\n            [[1400]],\n            [[1401]],\n            [[1402]],\n            [[1403]],\n            [[1404]],\n            [[1405]],\n            [[1406]],\n            [[1407]],\n            [[1408]],\n            [[1409]],\n            [[1410, -344]],\n            [\n              [\n                1411, -340, 1412, -338, 1413, -336, 1414, -334, -278, 1415, -276, 1416, -1033, 1417,\n                -1031, 1418, -1036, 1419, -342\n              ]\n            ],\n            [[1420]],\n            [[1421]],\n            [[1422]],\n            [[1423]],\n            [[1424]],\n            [[1425]],\n            [[1426]],\n            [[1427]],\n            [[1428]],\n            [[1429]],\n            [[1430]],\n            [[1431]],\n            [[1432]],\n            [[1433]],\n            [[1434]],\n            [[1435]],\n            [[1436]],\n            [[1437]],\n            [[1438]],\n            [[1439]],\n            [[1440]],\n            [[1441]],\n            [[1442]],\n            [[1443]],\n            [[1444]],\n            [[1445]],\n            [[1446]],\n            [[1447]],\n            [[1448]],\n            [[1449]],\n            [[1450]],\n            [[1451]],\n            [[1452]],\n            [[1453]],\n            [[-347, 345, 1454]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"USA\",\n          \"properties\": { \"name\": \"United States\" }\n        },\n        {\n          \"arcs\": [[[-534, 1455]], [[1456, -532]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"USG\",\n          \"properties\": { \"name\": \"USNB Guantanamo Bay\" }\n        },\n        {\n          \"arcs\": [\n            [[-973]],\n            [[-972]],\n            [[-955, 1457, -958, -971, -1356, -5, -1360, 1458, -1358, -960, 1459], [-1355]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"UZB\",\n          \"properties\": { \"name\": \"Uzbekistan\" }\n        },\n        { \"arcs\": [[-932]], \"type\": \"Polygon\", \"id\": \"VAT\", \"properties\": { \"name\": \"Vatican\" } },\n        {\n          \"arcs\": [[[1460]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VCT\",\n          \"properties\": { \"name\": \"St. Vin. and Gren.\" }\n        },\n        {\n          \"arcs\": [[[1461]], [[1462]], [[1463]], [[-772, -250, -513, 1464]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VEN\",\n          \"properties\": { \"name\": \"Venezuela\" }\n        },\n        {\n          \"arcs\": [[[1465]], [[1466, -978, -991, -449]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VNM\",\n          \"properties\": { \"name\": \"Vietnam\" }\n        },\n        {\n          \"arcs\": [\n            [[1467]],\n            [[1468]],\n            [[1469]],\n            [[1470]],\n            [[1471]],\n            [[1472]],\n            [[1473]],\n            [[1474]],\n            [[1475]],\n            [[1476]],\n            [[1477]],\n            [[1478]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VUT\",\n          \"properties\": { \"name\": \"Vanuatu\" }\n        },\n        {\n          \"arcs\": [[1479, -547]],\n          \"type\": \"Polygon\",\n          \"id\": \"WSB\",\n          \"properties\": { \"name\": \"Akrotiri\" }\n        },\n        {\n          \"arcs\": [[[1480]], [[1481]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"WSM\",\n          \"properties\": { \"name\": \"Samoa\" }\n        },\n        {\n          \"arcs\": [[[1482]], [[1483, -1307, -1141]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"YEM\",\n          \"properties\": { \"name\": \"Yemen\" }\n        },\n        {\n          \"arcs\": [[[-1062, -1344, -1060, 1484, -1095, -260, 1485], [-1005]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ZAF\",\n          \"properties\": { \"name\": \"South Africa\" }\n        },\n        {\n          \"arcs\": [[-1383, -1082, -1064, 1486, 1487, 1488, -1094, -7, -508, 1489, -506, 1490]],\n          \"type\": \"Polygon\",\n          \"id\": \"ZMB\",\n          \"properties\": { \"name\": \"Zambia\" }\n        },\n        {\n          \"arcs\": [[-1063, -1486, -259, -1489, 1491, -1487]],\n          \"type\": \"Polygon\",\n          \"id\": \"ZWE\",\n          \"properties\": { \"name\": \"Zimbabwe\" }\n        }\n      ],\n      \"type\": \"GeometryCollection\"\n    }\n  },\n  \"transform\": { \"translate\": [-180, -90], \"scale\": [0.036003600360036005, 0.01736514657995801] }\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-mercator/Example.tsx",
    "content": "import React from 'react';\nimport { scaleQuantize } from '@visx/scale';\nimport { Mercator, Graticule } from '@visx/geo';\nimport * as topojson from 'topojson-client';\nimport topology from './world-topo.json';\n\nexport const background = '#f9f7e8';\n\nexport type GeoMercatorProps = {\n  width: number;\n  height: number;\n  events?: boolean;\n};\n\ninterface FeatureShape {\n  type: 'Feature';\n  id: string;\n  geometry: { coordinates: [number, number][][]; type: 'Polygon' };\n  properties: { name: string };\n}\n\n// @ts-expect-error\nconst world = topojson.feature(topology, topology.objects.units) as {\n  type: 'FeatureCollection';\n  features: FeatureShape[];\n};\n\nconst color = scaleQuantize({\n  domain: [\n    Math.min(...world.features.map((f) => f.geometry.coordinates.length)),\n    Math.max(...world.features.map((f) => f.geometry.coordinates.length)),\n  ],\n  range: ['#ffb01d', '#ffa020', '#ff9221', '#ff8424', '#ff7425', '#fc5e2f', '#f94b3a', '#f63a48'],\n});\n\nexport default function ({ width, height, events = false }: GeoMercatorProps) {\n  const centerX = width / 2;\n  const centerY = height / 2;\n  const scale = (width / 630) * 100;\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />\n      <Mercator<FeatureShape>\n        data={world.features}\n        scale={scale}\n        translate={[centerX, centerY + 50]}\n      >\n        {(mercator) => (\n          <g>\n            <Graticule graticule={(g) => mercator.path(g) || ''} stroke=\"rgba(33,33,33,0.05)\" />\n            {mercator.features.map(({ feature, path }, i) => (\n              <path\n                key={`map-feature-${i}`}\n                d={path || ''}\n                fill={color(feature.geometry.coordinates.length)}\n                stroke={background}\n                strokeWidth={0.5}\n                onClick={() => {\n                  if (events) alert(`Clicked: ${feature.properties.name} (${feature.id})`);\n                }}\n              />\n            ))}\n          </g>\n        )}\n      </Mercator>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-mercator/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-mercator/package.json",
    "content": "{\n  \"name\": \"@visx/demo-geo-mercator\",\n  \"description\": \"Standalone visx geo-mercator demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/geo\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"topojson-client\": \"^3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"geojson\",\n    \"geo\",\n    \"mercator\",\n    \"map\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-mercator/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-mercator/world-topo.d.ts",
    "content": "declare module '*.json';\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-geo-mercator/world-topo.json",
    "content": "{\n  \"arcs\": [\n    [\n      [7080, 7327],\n      [-5, 4],\n      [-10, -10],\n      [5, -6]\n    ],\n    [\n      [7070, 7315],\n      [-16, -12],\n      [-9, 5],\n      [-28, -4],\n      [-12, -6],\n      [-1, -5],\n      [-17, -18],\n      [-11, -16],\n      [6, -10],\n      [6, -18],\n      [-2, -15],\n      [3, -8],\n      [-18, -35],\n      [4, -12],\n      [-2, -18],\n      [-7, -5],\n      [-13, 0],\n      [-13, 4],\n      [3, -16],\n      [6, -6],\n      [-1, -9],\n      [4, -9],\n      [-12, -14],\n      [-8, 0],\n      [-6, -18],\n      [2, -7],\n      [-6, -11],\n      [2, -30],\n      [-8, -17],\n      [-6, -1],\n      [-2, 8],\n      [-15, 4],\n      [-3, -8],\n      [-14, -12],\n      [6, -9],\n      [-11, -7],\n      [-13, 6],\n      [-7, -15],\n      [-8, -7],\n      [-3, -19],\n      [2, -9],\n      [-4, -35],\n      [-32, -17],\n      [-16, 2],\n      [-11, -11],\n      [-14, 6],\n      [-30, -5],\n      [-46, 26]\n    ],\n    [\n      [6689, 6902],\n      [27, 56],\n      [1, 10],\n      [-4, 21],\n      [-24, 7],\n      [-1, 9],\n      [1, 35],\n      [-7, 43],\n      [0, 9],\n      [7, 14],\n      [1, 9],\n      [-10, 5],\n      [0, 31],\n      [11, 8],\n      [-5, 13],\n      [7, 6],\n      [5, 26],\n      [-1, 11],\n      [4, 19]\n    ],\n    [\n      [6701, 7234],\n      [8, -10],\n      [13, -1],\n      [6, -7],\n      [1, -9],\n      [5, 8],\n      [5, -4],\n      [13, 13],\n      [0, 24],\n      [9, 0],\n      [4, 6],\n      [20, 11],\n      [9, 15],\n      [0, 16],\n      [5, 14],\n      [-1, 9],\n      [9, 8],\n      [12, 0],\n      [4, 16],\n      [4, 3],\n      [15, -14],\n      [5, 2]\n    ],\n    [\n      [6847, 7334],\n      [14, 2],\n      [7, -12],\n      [6, 6],\n      [8, -6]\n    ],\n    [\n      [6882, 7324],\n      [7, -15],\n      [7, 10],\n      [15, 9],\n      [2, 5],\n      [10, -14],\n      [5, 7],\n      [-2, 13],\n      [4, 8],\n      [21, 2],\n      [-3, 18],\n      [5, 4],\n      [12, 26],\n      [9, -2],\n      [7, -9],\n      [-1, -21],\n      [6, 3],\n      [2, -8],\n      [-3, -14],\n      [-1, -35],\n      [3, -12],\n      [7, -4],\n      [15, 19],\n      [9, 1],\n      [3, 11],\n      [14, 14],\n      [13, -2],\n      [-1, -12],\n      [14, 8],\n      [12, 2],\n      [7, -9]\n    ],\n    [\n      [5665, 4557],\n      [3, -32],\n      [-3, -9],\n      [0, -36],\n      [2, -12],\n      [-5, -22],\n      [4, -12],\n      [-56, 0],\n      [0, -182],\n      [3, -21],\n      [6, -7],\n      [15, -33],\n      [6, -7],\n      [3, -10],\n      [6, -7]\n    ],\n    [\n      [5649, 4167],\n      [-53, -21],\n      [-11, 4],\n      [-8, -4],\n      [-13, 9],\n      [-8, -3],\n      [-17, 2],\n      [-5, 4],\n      [-10, 0],\n      [-7, 9],\n      [-5, 14],\n      [-52, 0],\n      [-66, 0],\n      [-7, -1],\n      [-12, 17],\n      [-4, 9],\n      [-6, 1],\n      [-18, -16],\n      [-15, 4],\n      [-6, -6]\n    ],\n    [\n      [5326, 4189],\n      [0, 28],\n      [2, -1],\n      [-2, 58],\n      [7, 9],\n      [1, 23],\n      [6, 24],\n      [2, 20],\n      [0, 23],\n      [5, 12],\n      [0, 26],\n      [4, 4],\n      [8, 20],\n      [0, 10],\n      [6, 12],\n      [5, 0],\n      [8, 20],\n      [5, 28],\n      [-1, 20],\n      [2, 29],\n      [-2, 15],\n      [-7, 15],\n      [-8, 46],\n      [-7, 29],\n      [6, 16],\n      [6, 7],\n      [-1, 21],\n      [-3, 9],\n      [-10, 48],\n      [-2, 4],\n      [0, 21],\n      [-8, 16],\n      [-8, 30],\n      [16, 4],\n      [10, 11]\n    ],\n    [\n      [5366, 4846],\n      [4, -2],\n      [18, 2],\n      [12, -3],\n      [21, 2],\n      [32, 1],\n      [7, -4],\n      [4, -15],\n      [0, -22],\n      [3, -16],\n      [3, -3],\n      [0, -19],\n      [10, -23],\n      [0, -8],\n      [9, -20],\n      [7, 4],\n      [6, -4],\n      [2, 6],\n      [33, 0],\n      [1, 20],\n      [4, 12],\n      [-2, 8],\n      [2, 18],\n      [21, 0],\n      [9, 5],\n      [-3, -22],\n      [36, 0],\n      [1, -22],\n      [-2, -20],\n      [5, -23],\n      [-4, -53],\n      [1, -14],\n      [6, -17],\n      [3, -2],\n      [4, -23],\n      [0, -22],\n      [-4, -9],\n      [3, -18],\n      [6, 7],\n      [13, -4],\n      [14, 9],\n      [12, -3],\n      [2, 8]\n    ],\n    [\n      [5363, 4916],\n      [-7, -5],\n      [-8, -18],\n      [-1, -40],\n      [-8, -2]\n    ],\n    [\n      [5339, 4851],\n      [-2, 5],\n      [2, 14],\n      [-6, 24]\n    ],\n    [\n      [5333, 4894],\n      [10, 23],\n      [7, 3],\n      [4, 10],\n      [9, -14]\n    ],\n    [\n      [5582, 7537],\n      [-1, 0]\n    ],\n    [\n      [5581, 7537],\n      [1, 0]\n    ],\n    [\n      [5537, 7617],\n      [1, 0]\n    ],\n    [\n      [5538, 7617],\n      [-1, 0]\n    ],\n    [\n      [5557, 7633],\n      [4, -13],\n      [7, -4],\n      [3, -22]\n    ],\n    [\n      [5571, 7594],\n      [-4, -21],\n      [6, -24]\n    ],\n    [\n      [5573, 7549],\n      [2, -10]\n    ],\n    [\n      [5575, 7539],\n      [6, -2]\n    ],\n    [\n      [5581, 7537],\n      [1, -1]\n    ],\n    [\n      [5582, 7536],\n      [0, 0]\n    ],\n    [\n      [5582, 7536],\n      [0, -5]\n    ],\n    [\n      [5582, 7531],\n      [1, -5]\n    ],\n    [\n      [5583, 7526],\n      [0, 0]\n    ],\n    [\n      [5583, 7526],\n      [-2, -13],\n      [-5, -2],\n      [-2, -17],\n      [-11, -8],\n      [3, -12],\n      [-6, -8],\n      [-5, 3]\n    ],\n    [\n      [5555, 7469],\n      [-3, 19],\n      [-11, 9],\n      [-1, 22],\n      [-4, 4],\n      [4, 16],\n      [-1, 29],\n      [5, 23],\n      [-7, 2]\n    ],\n    [\n      [5537, 7593],\n      [1, 14]\n    ],\n    [\n      [5538, 7607],\n      [0, 13]\n    ],\n    [\n      [5538, 7620],\n      [9, 19],\n      [3, -11],\n      [7, 5]\n    ],\n    [\n      [5553, 8659],\n      [10, -5],\n      [-7, -11],\n      [-10, 6],\n      [7, 10]\n    ],\n    [\n      [5047, 7630],\n      [-7, -5],\n      [-1, 11]\n    ],\n    [\n      [5039, 7636],\n      [8, 1],\n      [0, -7]\n    ],\n    [\n      [6563, 6637],\n      [0, 0]\n    ],\n    [\n      [6563, 6659],\n      [2, -2],\n      [1, -36]\n    ],\n    [\n      [6566, 6621],\n      [-8, -14],\n      [-3, 13],\n      [-6, -4],\n      [-1, -38],\n      [7, -9],\n      [-11, -3],\n      [-4, -6],\n      [2, -9],\n      [-10, -44],\n      [0, -17]\n    ],\n    [\n      [6532, 6490],\n      [-2, -5],\n      [-70, 18],\n      [-3, 5],\n      [-25, 63],\n      [0, 9]\n    ],\n    [\n      [6432, 6580],\n      [6, -1],\n      [0, -13],\n      [12, -3],\n      [10, 11],\n      [24, -2],\n      [11, -4],\n      [15, 12],\n      [6, 14],\n      [1, 15],\n      [11, 12],\n      [13, 31],\n      [11, 13],\n      [5, 19]\n    ],\n    [\n      [6557, 6684],\n      [3, -2],\n      [-1, -22],\n      [4, -1]\n    ],\n    [\n      [6562, 6642],\n      [0, 0]\n    ],\n    [\n      [3093, 2021],\n      [0, 6]\n    ],\n    [\n      [3093, 2027],\n      [0, -6]\n    ],\n    [\n      [3093, 2028],\n      [0, 123]\n    ],\n    [\n      [3093, 2151],\n      [10, -17],\n      [-8, -15],\n      [11, -6],\n      [5, -17],\n      [12, -13],\n      [7, -13],\n      [17, -13],\n      [11, -14],\n      [12, -7],\n      [20, 0],\n      [-5, -16],\n      [-18, 1],\n      [-11, -8],\n      [-12, 6],\n      [-51, 9]\n    ],\n    [\n      [3259, 3902],\n      [11, -14],\n      [7, -29],\n      [9, -17],\n      [15, -17],\n      [3, -11],\n      [17, -13],\n      [11, -1],\n      [15, -18],\n      [4, -9],\n      [15, -17],\n      [9, -5],\n      [5, -8],\n      [13, -5],\n      [8, -20],\n      [-6, -14],\n      [-3, -19],\n      [-8, -10],\n      [-1, -25],\n      [-3, -14],\n      [-5, -4],\n      [-5, -15],\n      [4, -5],\n      [13, 1],\n      [19, -8],\n      [5, -5],\n      [7, 4],\n      [5, -5],\n      [6, 3],\n      [4, -8],\n      [3, 12],\n      [5, 5],\n      [10, -9],\n      [5, 8],\n      [-1, 8],\n      [6, 12],\n      [6, 0],\n      [11, 18],\n      [5, 40],\n      [0, 22]\n    ],\n    [\n      [3483, 3710],\n      [5, -4],\n      [6, 7],\n      [9, -9],\n      [1, -17],\n      [5, -14],\n      [-2, -9],\n      [0, -25],\n      [-2, -17],\n      [-13, -19],\n      [-15, -5],\n      [-6, -19],\n      [-8, -4],\n      [-6, -13],\n      [-7, -5],\n      [3, -10],\n      [-6, -4],\n      [-20, -39],\n      [-2, -11],\n      [-12, -25],\n      [-5, -2],\n      [-1, -10],\n      [-8, -11]\n    ],\n    [\n      [3399, 3445],\n      [0, -7],\n      [-7, -12],\n      [2, -23],\n      [-3, -20],\n      [-5, -13],\n      [3, -4],\n      [-2, -14],\n      [-4, -5],\n      [3, -25],\n      [-3, -8]\n    ],\n    [\n      [3383, 3314],\n      [2, -25],\n      [-2, -12],\n      [-6, 0],\n      [-4, -34],\n      [5, -29],\n      [-4, -14],\n      [5, -12],\n      [23, -21],\n      [11, -25],\n      [-7, -19],\n      [0, -13],\n      [7, -17],\n      [12, -6],\n      [1, -29],\n      [-11, -30],\n      [-13, -26],\n      [-2, -16],\n      [-27, -24],\n      [-37, -16],\n      [-27, -8],\n      [-27, 0],\n      [-15, 11],\n      [3, -32],\n      [5, -9],\n      [-2, -21],\n      [-4, 3],\n      [-1, -21],\n      [-4, -5],\n      [6, -17],\n      [-2, -18],\n      [-20, -16],\n      [-21, 0],\n      [-26, 20],\n      [-8, 2],\n      [-4, -10],\n      [5, -32],\n      [-2, -24],\n      [6, -16],\n      [11, -4],\n      [-4, -10],\n      [13, 0],\n      [2, 10],\n      [-6, 0],\n      [14, 11],\n      [5, -13],\n      [1, -17],\n      [-3, -12],\n      [-12, -5],\n      [-3, 16],\n      [-13, 5],\n      [-9, -15],\n      [19, -13],\n      [-20, -17],\n      [-8, -19],\n      [3, -43],\n      [-4, -11],\n      [-9, -7],\n      [0, -20],\n      [-14, 3],\n      [-8, -5],\n      [-1, -8],\n      [-14, -5],\n      [-9, -18],\n      [0, -9],\n      [-6, -9],\n      [-2, -14],\n      [7, -25],\n      [7, -6],\n      [8, -16],\n      [6, -4],\n      [17, 0],\n      [6, -6],\n      [2, -20],\n      [-5, -33],\n      [-6, -2],\n      [-12, -18],\n      [-16, -14],\n      [-3, -10],\n      [-9, -10],\n      [-6, -22],\n      [2, -16],\n      [-5, -18],\n      [-5, -6],\n      [-23, -14],\n      [-5, -12],\n      [-2, -21],\n      [2, -24],\n      [9, -34],\n      [11, -24],\n      [-3, -1]\n    ],\n    [\n      [3098, 2168],\n      [-15, 10],\n      [-26, 10],\n      [-55, 1],\n      [-4, 12],\n      [-11, 13],\n      [6, 19],\n      [-5, 7],\n      [5, 13],\n      [-2, 14],\n      [-13, 1],\n      [-11, -8],\n      [-3, 26],\n      [-7, 9],\n      [2, 22],\n      [-3, 11],\n      [3, 15],\n      [9, 1],\n      [3, 17],\n      [12, 10],\n      [1, 22],\n      [7, 7],\n      [-1, 15],\n      [-5, 7],\n      [6, 30],\n      [8, 13],\n      [2, 22],\n      [8, 9],\n      [-3, 32],\n      [4, 11],\n      [-4, 4],\n      [0, 15],\n      [8, 5],\n      [5, 13],\n      [-8, 17],\n      [-14, 5],\n      [7, 5],\n      [17, 3],\n      [2, 17],\n      [-18, 3],\n      [-1, 18],\n      [5, 7],\n      [-4, 14],\n      [3, 7],\n      [-6, 16],\n      [5, 9],\n      [-11, 7],\n      [0, 45],\n      [3, 8],\n      [8, 1],\n      [-5, 26],\n      [2, 43],\n      [-3, 11],\n      [4, 27],\n      [5, 21],\n      [-2, 18],\n      [8, 13],\n      [0, 25],\n      [15, 13],\n      [-3, 15],\n      [-1, 21],\n      [-5, 20],\n      [3, 35],\n      [-2, 24],\n      [3, 12],\n      [10, 4],\n      [-1, 8],\n      [10, 14],\n      [-2, 40],\n      [-4, 4],\n      [6, 6],\n      [0, 12],\n      [9, 39],\n      [6, 2],\n      [-2, 34],\n      [3, 18],\n      [-9, 9],\n      [3, 18],\n      [-4, 6],\n      [0, 16],\n      [-5, 12],\n      [-2, 14],\n      [3, 9],\n      [-5, 2],\n      [-3, 15],\n      [1, 24],\n      [6, 8],\n      [0, 13],\n      [5, 19],\n      [7, 8],\n      [2, 10],\n      [-4, 4],\n      [2, 16],\n      [-4, 31],\n      [7, 10],\n      [1, 26],\n      [4, 17],\n      [13, 33],\n      [9, 38],\n      [6, -3],\n      [8, 7],\n      [0, 10],\n      [-8, 21],\n      [0, 10],\n      [5, 9],\n      [-2, 26],\n      [-3, 17],\n      [2, 15],\n      [5, 4],\n      [-6, 14],\n      [2, 14],\n      [7, 13],\n      [25, 20],\n      [9, 54],\n      [-5, 17]\n    ],\n    [\n      [3133, 3869],\n      [5, 9],\n      [0, 8],\n      [7, 6],\n      [2, 12],\n      [9, 5],\n      [4, 19],\n      [3, -2],\n      [10, -17],\n      [21, 0],\n      [12, -5],\n      [6, -38],\n      [3, 20],\n      [8, 29],\n      [32, 1],\n      [4, -14]\n    ],\n    [\n      [6265, 7522],\n      [0, 0]\n    ],\n    [\n      [6249, 7560],\n      [2, -10],\n      [15, -14],\n      [-6, -16],\n      [6, -11],\n      [11, -10],\n      [-3, -13],\n      [-7, 2],\n      [15, -25],\n      [9, -1],\n      [-3, -13],\n      [5, -7],\n      [-5, -5],\n      [3, -15]\n    ],\n    [\n      [6291, 7422],\n      [-10, -2]\n    ],\n    [\n      [6281, 7420],\n      [-4, 23],\n      [-7, 7],\n      [1, 10],\n      [-13, -1],\n      [-8, 14],\n      [-7, -4]\n    ],\n    [\n      [6243, 7469],\n      [-8, 16],\n      [-12, 1],\n      [-11, 7],\n      [-3, 20],\n      [5, 12],\n      [-3, 17],\n      [-5, 8]\n    ],\n    [\n      [6206, 7550],\n      [9, 0],\n      [11, 7],\n      [10, -3],\n      [13, 6]\n    ],\n    [\n      [6249, 7546],\n      [0, 0]\n    ],\n    [\n      [6255, 7542],\n      [0, 0]\n    ],\n    [\n      [488, 408],\n      [24, -7],\n      [-48, -4],\n      [-13, 16],\n      [37, -5]\n    ],\n    [\n      [542, 484],\n      [-90, 7],\n      [20, 11],\n      [65, -10],\n      [5, -8]\n    ],\n    [\n      [3331, 592],\n      [8, -3],\n      [-1, -57],\n      [-23, -11],\n      [-52, 4],\n      [-17, 17],\n      [-32, -10],\n      [-67, 20],\n      [3, 10],\n      [19, -10],\n      [115, 3],\n      [8, 27],\n      [39, 10]\n    ],\n    [\n      [4135, 588],\n      [34, -2],\n      [-10, -10],\n      [-44, 8],\n      [-5, 11],\n      [25, -7]\n    ],\n    [\n      [3120, 602],\n      [25, -4],\n      [35, -20],\n      [-20, -7],\n      [-40, 31]\n    ],\n    [\n      [3137, 618],\n      [-11, -15],\n      [-30, 6],\n      [41, 9]\n    ],\n    [\n      [4054, 618],\n      [1, -6],\n      [-76, 3],\n      [30, 13],\n      [45, -10]\n    ],\n    [\n      [547, 618],\n      [21, -9],\n      [14, -23],\n      [-47, -2],\n      [-90, 25],\n      [-10, 7],\n      [5, 17],\n      [24, 15],\n      [25, 0],\n      [58, -30]\n    ],\n    [\n      [3143, 666],\n      [-58, -38],\n      [-39, -36],\n      [-31, 3],\n      [-10, 10],\n      [11, 23],\n      [23, 11],\n      [92, 33],\n      [12, -6]\n    ],\n    [\n      [9654, 680],\n      [-35, -8],\n      [-8, 14],\n      [21, -7],\n      [22, 11],\n      [0, -10]\n    ],\n    [\n      [3740, 650],\n      [1, -7],\n      [44, 2],\n      [21, -39],\n      [-7, -30],\n      [-18, -1],\n      [9, -11],\n      [-158, -26],\n      [-16, -9],\n      [-121, -4],\n      [1, 17],\n      [22, 27],\n      [26, -4],\n      [60, 37],\n      [-13, 14],\n      [14, 40],\n      [31, 33],\n      [52, 14],\n      [37, -3],\n      [38, -11],\n      [19, -13],\n      [-4, -20],\n      [-38, -6]\n    ],\n    [\n      [9641, 732],\n      [63, -13],\n      [-27, -10],\n      [-42, -2],\n      [-19, 12],\n      [25, 13]\n    ],\n    [\n      [839, 754],\n      [14, -14],\n      [-32, 3],\n      [-11, 7],\n      [29, 4]\n    ],\n    [\n      [938, 754],\n      [-21, -7],\n      [-2, 12],\n      [23, -5]\n    ],\n    [\n      [951, 834],\n      [16, -10],\n      [-24, 3],\n      [8, 7]\n    ],\n    [\n      [9561, 885],\n      [-8, -14],\n      [-7, 9],\n      [15, 5]\n    ],\n    [\n      [1342, 903],\n      [19, -12],\n      [-6, -6],\n      [-27, 12],\n      [14, 6]\n    ],\n    [\n      [1458, 897],\n      [-1, -13],\n      [-17, 20],\n      [18, -7]\n    ],\n    [\n      [1760, 918],\n      [-17, -8],\n      [-3, 7],\n      [26, 11],\n      [-6, -10]\n    ],\n    [\n      [1680, 914],\n      [-12, 3],\n      [10, 17],\n      [17, -2],\n      [-1, -10],\n      [-14, -8]\n    ],\n    [\n      [1635, 935],\n      [17, 0],\n      [7, -14],\n      [-23, -10],\n      [0, -10],\n      [-32, -4],\n      [-22, 7],\n      [3, 11],\n      [15, 12],\n      [-27, 3],\n      [7, 10],\n      [55, -5]\n    ],\n    [\n      [4425, 917],\n      [9, -22],\n      [-14, 0],\n      [-4, 16],\n      [-29, 3],\n      [20, 7],\n      [12, 19],\n      [11, 1],\n      [-5, -24]\n    ],\n    [\n      [9717, 944],\n      [-11, 3],\n      [8, 14],\n      [3, -17]\n    ],\n    [\n      [1498, 961],\n      [13, -7],\n      [9, -16],\n      [-11, -7],\n      [29, 6],\n      [17, -9],\n      [7, -11],\n      [-6, -12],\n      [-22, 3],\n      [-48, 22],\n      [0, 8],\n      [-19, 7],\n      [-3, 16],\n      [34, 0]\n    ],\n    [\n      [2955, 972],\n      [-2, -10],\n      [-13, 0],\n      [15, 10]\n    ],\n    [\n      [2514, 979],\n      [-20, -5],\n      [-4, 5],\n      [22, 8],\n      [2, -8]\n    ],\n    [\n      [2918, 987],\n      [18, -3],\n      [-8, -40],\n      [-36, 14],\n      [-7, 10],\n      [11, 7],\n      [18, 0],\n      [-19, 10],\n      [23, 2]\n    ],\n    [\n      [2474, 988],\n      [-3, -19],\n      [-14, -1],\n      [6, 17],\n      [-10, 16],\n      [23, 1],\n      [-2, -14]\n    ],\n    [\n      [2365, 999],\n      [-10, 3],\n      [18, 7],\n      [-8, -10]\n    ],\n    [\n      [2270, 1031],\n      [14, -3],\n      [-2, 14],\n      [10, 0],\n      [2, -17],\n      [10, 19],\n      [19, 1],\n      [5, -10],\n      [-23, -11],\n      [8, -3],\n      [27, 11],\n      [-6, -10],\n      [13, -10],\n      [-15, -1],\n      [1, -9],\n      [-72, 2],\n      [2, 5],\n      [-24, -1],\n      [6, 7],\n      [-29, 6],\n      [-58, 7],\n      [6, 10],\n      [57, 7],\n      [8, -11],\n      [7, 7],\n      [23, -12],\n      [-13, 13],\n      [17, 9],\n      [15, -6],\n      [-8, -14]\n    ],\n    [\n      [4919, 1112],\n      [8, -10],\n      [14, 1],\n      [-17, -19],\n      [-8, 18],\n      [-16, 10],\n      [19, 0]\n    ],\n    [\n      [2947, 1119],\n      [8, -13],\n      [-22, -10],\n      [-48, -11],\n      [-9, 4],\n      [2, 12],\n      [33, 5],\n      [9, 12],\n      [8, -13],\n      [3, 14],\n      [16, 0]\n    ],\n    [\n      [3313, 1111],\n      [-7, 10],\n      [11, 1],\n      [-4, -11]\n    ],\n    [\n      [4835, 1126],\n      [-5, -10],\n      [-10, 9],\n      [15, 1]\n    ],\n    [\n      [5082, 1116],\n      [-11, 6],\n      [19, 4],\n      [-8, -10]\n    ],\n    [\n      [4913, 1121],\n      [-10, 0],\n      [6, 12],\n      [12, 3],\n      [2, -14],\n      [-10, -1]\n    ],\n    [\n      [7004, 1113],\n      [-10, 3],\n      [-5, 16],\n      [16, -11],\n      [-1, -8]\n    ],\n    [\n      [5124, 1122],\n      [-12, 11],\n      [12, 5],\n      [0, -16]\n    ],\n    [\n      [5745, 1129],\n      [-22, 0],\n      [-2, 11],\n      [19, 6],\n      [5, -17]\n    ],\n    [\n      [5040, 1146],\n      [-7, -18],\n      [-5, 21],\n      [12, -3]\n    ],\n    [\n      [2924, 1165],\n      [8, -12],\n      [-12, -13],\n      [-23, 5],\n      [-1, 13],\n      [8, 7],\n      [20, 0]\n    ],\n    [\n      [5449, 1148],\n      [-17, 8],\n      [11, 12],\n      [19, -1],\n      [-11, -8],\n      [-2, -11]\n    ],\n    [\n      [3001, 1170],\n      [-23, 2],\n      [-6, 7],\n      [17, 4],\n      [12, -13]\n    ],\n    [\n      [3283, 1179],\n      [-6, -12],\n      [-16, 30],\n      [11, 2],\n      [11, -20]\n    ],\n    [\n      [3055, 1197],\n      [19, -24],\n      [1, -17],\n      [16, -26],\n      [11, -25],\n      [3, -60],\n      [-6, -23],\n      [-20, -7],\n      [-2, -10],\n      [-40, -7],\n      [-49, 0],\n      [-21, 13],\n      [10, 8],\n      [16, -3],\n      [45, -2],\n      [14, 8],\n      [-7, 6],\n      [-28, -9],\n      [-18, 10],\n      [35, 8],\n      [1, 5],\n      [-31, 0],\n      [-14, 17],\n      [-11, -17],\n      [-31, 2],\n      [10, -8],\n      [-14, -9],\n      [-38, 14],\n      [-1, 15],\n      [15, 8],\n      [16, -8],\n      [-4, 12],\n      [9, 4],\n      [16, -13],\n      [-4, 14],\n      [29, -2],\n      [9, 7],\n      [-23, 7],\n      [10, 6],\n      [30, -6],\n      [19, 11],\n      [20, 0],\n      [13, -11],\n      [-2, 16],\n      [-35, 7],\n      [5, 17],\n      [24, 8],\n      [15, -4],\n      [-18, 14],\n      [-20, -4],\n      [-27, 14],\n      [7, 34],\n      [-10, 5],\n      [0, 20],\n      [45, 10],\n      [9, -7],\n      [2, -18]\n    ],\n    [\n      [7385, 1327],\n      [-15, 4],\n      [8, 9],\n      [7, -13]\n    ],\n    [\n      [3111, 1321],\n      [9, -5],\n      [-16, -13],\n      [-8, -22],\n      [-11, 0],\n      [-7, 9],\n      [22, 44],\n      [15, 12],\n      [5, -5],\n      [-10, -11],\n      [1, -9]\n    ],\n    [\n      [7686, 1378],\n      [4, -8],\n      [-14, -2],\n      [10, 10]\n    ],\n    [\n      [3174, 1408],\n      [-3, -16],\n      [-10, -2],\n      [6, 17],\n      [7, 1]\n    ],\n    [\n      [7805, 1401],\n      [-19, 0],\n      [-1, 7],\n      [12, 10],\n      [15, -7],\n      [-7, -10]\n    ],\n    [\n      [7870, 1413],\n      [-16, 19],\n      [9, -2],\n      [7, -17]\n    ],\n    [\n      [3410, 1465],\n      [-6, 6],\n      [14, 7],\n      [-8, -13]\n    ],\n    [\n      [3242, 1481],\n      [-2, -9],\n      [14, -8],\n      [-14, -12],\n      [-26, 3],\n      [20, 26],\n      [8, 0]\n    ],\n    [\n      [3270, 1492],\n      [2, -17],\n      [-12, -8],\n      [10, 25]\n    ],\n    [\n      [3394, 1508],\n      [-2, -9],\n      [20, -7],\n      [-8, -17],\n      [-7, 6],\n      [-7, -7],\n      [-14, 20],\n      [5, 8],\n      [13, 6]\n    ],\n    [\n      [3446, 1521],\n      [-9, 7],\n      [15, -2],\n      [-6, -5]\n    ],\n    [\n      [0, 324],\n      [46, 3],\n      [68, -14],\n      [19, 8],\n      [194, -14],\n      [21, -11],\n      [128, -2],\n      [122, -11],\n      [81, -3],\n      [-58, 13],\n      [54, 1],\n      [-124, 12],\n      [-104, 7],\n      [24, 11],\n      [-55, 17],\n      [37, 2],\n      [-52, 17],\n      [-71, -3],\n      [-37, 23],\n      [-127, 27],\n      [73, -2],\n      [18, -14],\n      [73, -4],\n      [20, 4],\n      [70, -3],\n      [6, -14],\n      [50, 10],\n      [19, -11],\n      [127, 8],\n      [18, 9],\n      [-44, 5],\n      [81, 5],\n      [16, 14],\n      [70, 14],\n      [-10, 10],\n      [-54, 26],\n      [31, 11],\n      [-19, 10],\n      [-74, 13],\n      [17, 11],\n      [109, 6],\n      [135, 7],\n      [0, 5],\n      [-77, 24],\n      [-11, 11],\n      [13, 10],\n      [43, -4],\n      [46, 10],\n      [-17, 11],\n      [-75, 12],\n      [-55, 17],\n      [-3, 5],\n      [-68, 8],\n      [-43, 21],\n      [14, 11],\n      [48, 6],\n      [-2, 14],\n      [-71, -7],\n      [-47, 23],\n      [14, 18],\n      [-3, 26],\n      [9, 1],\n      [24, -17],\n      [21, 17],\n      [21, -5],\n      [18, 4],\n      [38, -10],\n      [-9, -10],\n      [36, -3],\n      [2, 10],\n      [72, -30],\n      [30, 16],\n      [30, 6],\n      [-36, 7],\n      [7, 14],\n      [32, -17],\n      [21, 7],\n      [13, -13],\n      [27, 0],\n      [-16, 13],\n      [21, 1],\n      [-31, 15],\n      [29, -5],\n      [-22, 20],\n      [-27, 16],\n      [-38, -3],\n      [-33, 3],\n      [2, 9],\n      [28, 4],\n      [9, 7],\n      [69, -21],\n      [6, 8],\n      [-27, 13],\n      [9, 11],\n      [56, 6],\n      [1, 10],\n      [41, 4],\n      [2, 6],\n      [19, -3],\n      [9, -14],\n      [18, 0],\n      [-10, 14],\n      [29, 6],\n      [16, 14],\n      [61, 4],\n      [30, -4],\n      [-16, 9],\n      [4, 14],\n      [30, 0],\n      [11, 11],\n      [22, -4],\n      [18, -16],\n      [30, 9],\n      [58, -4],\n      [20, -5],\n      [64, 13],\n      [93, 0],\n      [8, -7],\n      [45, 3],\n      [41, 0],\n      [59, 10],\n      [-3, 10],\n      [24, 6],\n      [6, -12],\n      [33, -3],\n      [51, 6],\n      [-7, 21],\n      [11, 10],\n      [21, 0],\n      [-9, -7],\n      [19, 2],\n      [-8, -12],\n      [4, -14],\n      [15, 3],\n      [-18, -16],\n      [-6, -21],\n      [9, 6],\n      [46, 8],\n      [15, 0],\n      [-10, 11],\n      [0, 20],\n      [15, 6],\n      [35, -17],\n      [-5, -19],\n      [-34, -18],\n      [4, -7],\n      [45, 4],\n      [84, -10],\n      [53, 13],\n      [28, -3],\n      [14, 4],\n      [49, -4],\n      [-3, -8],\n      [20, -8],\n      [70, 13],\n      [-27, 6],\n      [2, 10],\n      [-34, 3],\n      [17, 7],\n      [3, 14],\n      [-46, 3],\n      [5, 11],\n      [-7, 15],\n      [-33, 5],\n      [-4, 20],\n      [42, -4],\n      [3, -6],\n      [47, 2],\n      [-5, 21],\n      [-41, 3],\n      [-46, 0],\n      [-11, 7],\n      [-4, 20],\n      [11, 7],\n      [26, -4],\n      [-17, -12],\n      [21, -4],\n      [33, 4],\n      [84, -1],\n      [9, -7],\n      [44, -11],\n      [17, 7],\n      [24, -7],\n      [21, 8],\n      [46, 0],\n      [33, -7],\n      [16, 10],\n      [25, 1],\n      [6, 10],\n      [-10, 17],\n      [33, -4],\n      [1, -10],\n      [-15, -14],\n      [9, -9],\n      [30, 6],\n      [8, -11],\n      [38, 11],\n      [5, -13],\n      [28, -10],\n      [20, 2],\n      [43, -19],\n      [29, 9],\n      [-2, 28],\n      [24, -11],\n      [-8, 25],\n      [28, -2],\n      [24, -17],\n      [-2, -16],\n      [55, 8],\n      [5, -7],\n      [-15, -14],\n      [48, 6],\n      [7, 5],\n      [34, -5],\n      [26, 15],\n      [57, 12],\n      [21, -2],\n      [42, 10],\n      [35, 16],\n      [22, 43],\n      [-1, 7],\n      [-20, 21],\n      [-4, 13],\n      [6, 23],\n      [-15, 38],\n      [-15, 16],\n      [4, 21],\n      [-13, 16],\n      [15, 0],\n      [-1, 7],\n      [25, -14],\n      [5, 14],\n      [11, 6],\n      [0, 11],\n      [-18, 7],\n      [14, 5],\n      [-5, 17],\n      [6, 14],\n      [-9, 16],\n      [12, 3],\n      [6, 21],\n      [-10, 5],\n      [-19, -1],\n      [15, 30],\n      [6, 0],\n      [-2, -17],\n      [15, -6],\n      [1, 26],\n      [-4, 14],\n      [8, 4],\n      [14, -7],\n      [5, 34],\n      [14, -2],\n      [-5, 11],\n      [19, -4],\n      [3, 23],\n      [16, 1],\n      [-5, 27],\n      [11, 6],\n      [16, -7],\n      [-4, 11],\n      [20, 14],\n      [11, -3],\n      [9, 12],\n      [10, 1],\n      [-1, 10],\n      [14, 4],\n      [-1, 13],\n      [30, 14],\n      [13, -2],\n      [3, 10],\n      [12, 2],\n      [1, 8],\n      [21, 4],\n      [7, 8],\n      [13, 6],\n      [11, -3],\n      [7, -20],\n      [-10, -3],\n      [-2, 12],\n      [-15, -12],\n      [-10, 0],\n      [-15, -17],\n      [-9, -22],\n      [-9, -6],\n      [-7, 7],\n      [-6, -6],\n      [-19, -5],\n      [-17, -29],\n      [-20, 3],\n      [6, -10],\n      [-18, -10],\n      [9, -14],\n      [-14, -14],\n      [13, -19],\n      [16, 3],\n      [0, 10],\n      [21, -2],\n      [-16, -14],\n      [-16, 0],\n      [-2, -16],\n      [-5, 16],\n      [-19, -3],\n      [1, -28],\n      [-16, 27],\n      [-15, 3],\n      [-10, -29],\n      [11, -10],\n      [-9, -4],\n      [-14, 11],\n      [-12, -15],\n      [6, -16],\n      [-15, -6],\n      [-8, 5],\n      [-3, -33],\n      [10, -6],\n      [-12, -11],\n      [21, 6],\n      [6, -6],\n      [-20, -7],\n      [14, -6],\n      [-10, -7],\n      [36, -17],\n      [-2, 17],\n      [23, 7],\n      [-14, -17],\n      [15, -6],\n      [-5, -8],\n      [14, -25],\n      [14, -7],\n      [-2, -21],\n      [15, -13],\n      [-1, -11],\n      [-10, 4],\n      [5, -18],\n      [22, 1],\n      [-16, -24],\n      [20, 4],\n      [9, -21],\n      [-5, -12],\n      [-12, -1],\n      [-14, -13],\n      [14, -1],\n      [11, 10],\n      [9, -8],\n      [-7, -12],\n      [-38, -3],\n      [36, -14],\n      [13, 10],\n      [0, -26],\n      [-19, -2],\n      [6, -18],\n      [17, 8],\n      [-7, -24],\n      [25, 4],\n      [-11, -19],\n      [-9, 8],\n      [-3, -13],\n      [-15, 12],\n      [-21, 5],\n      [13, -17],\n      [21, -10],\n      [-7, -23],\n      [-21, 5],\n      [21, -13],\n      [-23, -13],\n      [31, 7],\n      [-9, -17],\n      [-36, 6],\n      [17, -17],\n      [-10, -13],\n      [-13, -3],\n      [-2, 17],\n      [-17, 2],\n      [6, -15],\n      [-14, 3],\n      [-10, -10],\n      [18, 2],\n      [7, -9],\n      [-35, -4],\n      [-2, -7],\n      [33, -3],\n      [-85, -34],\n      [-52, -9],\n      [4, -3],\n      [-60, -13],\n      [4, -11],\n      [-17, -7],\n      [-31, -1],\n      [-20, 4],\n      [-46, 0],\n      [-31, 8],\n      [-64, 0],\n      [34, -42],\n      [23, -15],\n      [10, 6],\n      [66, -8],\n      [-25, -26],\n      [-38, -9],\n      [-61, 13],\n      [-95, 13],\n      [-30, -6],\n      [118, -34],\n      [-9, -17],\n      [-71, -7],\n      [-61, 21],\n      [-37, 30],\n      [12, -23],\n      [-13, -4],\n      [17, -20],\n      [42, -17],\n      [17, -23],\n      [18, -7],\n      [2, 20],\n      [108, -4],\n      [17, -13],\n      [-20, -24],\n      [-22, -3],\n      [-62, 0],\n      [55, -10],\n      [39, 6],\n      [24, -26],\n      [-8, -7],\n      [24, -16],\n      [19, 7],\n      [38, -10],\n      [7, 13],\n      [39, 9],\n      [21, -6],\n      [9, -14],\n      [46, -9],\n      [89, -24],\n      [77, -3],\n      [-92, -8],\n      [62, -5],\n      [-2, -4],\n      [-62, -1],\n      [-6, -25],\n      [26, -5],\n      [52, 8],\n      [75, 3],\n      [-64, -17],\n      [33, -33],\n      [-6, -17],\n      [66, -4],\n      [49, 30],\n      [72, 31],\n      [52, 14],\n      [16, -1],\n      [53, 11],\n      [65, 5],\n      [59, -2],\n      [6, -17],\n      [-17, -11],\n      [31, -7],\n      [67, 24],\n      [-2, 10],\n      [36, 18],\n      [9, 16],\n      [79, 27],\n      [42, -13],\n      [34, 10],\n      [18, 17],\n      [53, 0],\n      [40, 12],\n      [42, -3],\n      [-21, 10],\n      [37, 0],\n      [5, 7],\n      [153, 6],\n      [48, 10],\n      [-61, 7],\n      [-165, 11],\n      [31, 17],\n      [-27, 0],\n      [9, 15],\n      [-73, -12],\n      [-96, 23],\n      [-5, 14],\n      [12, 23],\n      [11, 3],\n      [8, 18],\n      [24, 0],\n      [-7, 12],\n      [28, 18],\n      [34, 10],\n      [17, 0],\n      [5, 10],\n      [28, 7],\n      [15, 13],\n      [36, 16],\n      [52, 10],\n      [29, 14],\n      [48, 10],\n      [53, 7],\n      [31, -4],\n      [22, 14],\n      [17, -6],\n      [43, 6],\n      [-18, 11],\n      [29, 26],\n      [-3, 10],\n      [14, 17],\n      [24, 3],\n      [23, -7],\n      [39, 33],\n      [-10, 4],\n      [-27, -10],\n      [-22, 3],\n      [17, 4],\n      [-20, 7],\n      [1, 13],\n      [28, 23],\n      [18, 3],\n      [12, -9],\n      [16, 11],\n      [-15, 16],\n      [29, -7],\n      [14, 11],\n      [42, 13],\n      [3, 19],\n      [10, 20],\n      [-18, 0],\n      [-18, 7],\n      [-1, 18],\n      [16, 2],\n      [1, -9],\n      [21, -10],\n      [7, 17],\n      [16, 9],\n      [-12, 10],\n      [13, 4],\n      [3, -10],\n      [22, -7],\n      [10, -28],\n      [15, 7],\n      [15, -5],\n      [-4, 9],\n      [6, 23],\n      [-11, 13],\n      [13, 5],\n      [25, -7],\n      [16, 14],\n      [13, -8],\n      [-20, -29],\n      [71, -3],\n      [7, -9],\n      [4, 12],\n      [18, 3],\n      [5, -6],\n      [28, -5],\n      [7, 11],\n      [12, -7],\n      [-4, -14],\n      [12, -9],\n      [21, 25],\n      [13, 8],\n      [41, 14],\n      [105, 20],\n      [19, 0],\n      [28, 7],\n      [-5, 17],\n      [12, 2],\n      [-1, -17],\n      [11, -3],\n      [25, 9],\n      [-8, 8],\n      [9, 9],\n      [22, -23],\n      [31, -14],\n      [21, -5],\n      [14, 25],\n      [18, 7],\n      [-16, 10],\n      [16, 1],\n      [8, -13],\n      [22, -4],\n      [22, 3],\n      [27, -4],\n      [3, 9],\n      [17, 3],\n      [-3, -18],\n      [45, -4],\n      [11, 1],\n      [-6, 11],\n      [17, 9],\n      [11, -10],\n      [-10, -23],\n      [10, -10],\n      [23, -1],\n      [26, 4],\n      [3, 13],\n      [16, 24],\n      [24, -18],\n      [-21, -6],\n      [14, -7],\n      [26, -5],\n      [13, 26],\n      [15, -4],\n      [0, -15],\n      [27, -15],\n      [31, -3],\n      [35, 17],\n      [23, 3],\n      [38, 21],\n      [40, 5],\n      [38, 11],\n      [7, 7],\n      [2, 33],\n      [-12, 13],\n      [-1, 13],\n      [20, 12],\n      [28, 0],\n      [4, -8],\n      [-21, -13],\n      [24, -1],\n      [20, -13],\n      [-2, -23],\n      [45, 4],\n      [8, -15],\n      [7, 9],\n      [26, -1],\n      [-5, -7],\n      [19, -19],\n      [2, 12],\n      [13, 7],\n      [-1, 10],\n      [15, 4],\n      [-2, 32],\n      [4, 14],\n      [26, 6],\n      [21, 15],\n      [28, 4],\n      [8, 17],\n      [32, 8],\n      [24, 0],\n      [-6, 5],\n      [34, 13],\n      [14, -6],\n      [-2, 23],\n      [18, 5],\n      [14, -8],\n      [-13, -7],\n      [10, -3],\n      [6, -12],\n      [9, 8],\n      [16, -6],\n      [-5, -17],\n      [13, 20],\n      [-3, 14],\n      [16, 5],\n      [2, 11],\n      [-19, -3],\n      [-6, 13],\n      [27, 6],\n      [-2, -9],\n      [15, 2],\n      [0, -13],\n      [11, 8],\n      [11, -7],\n      [10, 7],\n      [-14, 3],\n      [10, 16],\n      [-16, 1],\n      [-1, 12],\n      [9, 14],\n      [23, 4],\n      [11, 12],\n      [30, 4],\n      [25, 7],\n      [40, -6],\n      [19, -10],\n      [15, -20],\n      [11, 3],\n      [13, -8],\n      [1, -9],\n      [-36, 3],\n      [15, -8],\n      [-11, -23],\n      [1, -12],\n      [7, 13],\n      [33, 10],\n      [23, -11],\n      [12, 1],\n      [5, -20],\n      [12, -4],\n      [4, 11],\n      [24, 0],\n      [18, -7],\n      [45, -7],\n      [24, 9],\n      [30, -9],\n      [45, -7],\n      [48, -4],\n      [9, -3],\n      [35, 8],\n      [-1, -15],\n      [14, -30],\n      [-13, -3],\n      [-7, -17],\n      [13, 0],\n      [-16, -9],\n      [12, -8],\n      [0, -9],\n      [-27, -3],\n      [17, -14],\n      [-13, -6],\n      [9, -5],\n      [-17, -12],\n      [-13, 18],\n      [-18, -29],\n      [13, -14],\n      [34, 8],\n      [1, -21],\n      [-15, -30],\n      [-17, -8],\n      [-5, -19],\n      [-10, -7],\n      [-6, -33],\n      [-12, -36],\n      [-15, -8],\n      [25, -10],\n      [22, 10],\n      [-3, 26],\n      [14, 11],\n      [34, 3],\n      [8, 20],\n      [20, 6],\n      [-6, 7],\n      [17, 12],\n      [14, 3],\n      [-11, 7],\n      [16, 40],\n      [17, 7],\n      [14, 12],\n      [-6, 15],\n      [22, 23],\n      [15, 5],\n      [8, -12],\n      [28, 6],\n      [5, -7],\n      [13, 8],\n      [-3, 16],\n      [35, 18],\n      [22, 5],\n      [7, 21],\n      [16, 4],\n      [-7, 13],\n      [9, 12],\n      [19, 10],\n      [73, 24],\n      [30, 4],\n      [13, -3],\n      [-6, 13],\n      [29, 18],\n      [36, -4],\n      [9, 7],\n      [18, 0],\n      [34, 17],\n      [8, -5],\n      [14, 4],\n      [23, -4],\n      [23, 1],\n      [19, 14],\n      [25, 5],\n      [12, -6],\n      [34, 1],\n      [4, -10],\n      [31, 17],\n      [11, -4],\n      [8, -10],\n      [13, 6],\n      [16, 0],\n      [16, 6],\n      [13, -10],\n      [14, 13],\n      [9, 0],\n      [8, -26],\n      [8, 11],\n      [13, 3],\n      [9, 9],\n      [27, 7],\n      [14, 17],\n      [0, 7],\n      [27, 0],\n      [8, 6],\n      [27, -9],\n      [24, -3],\n      [65, -22],\n      [29, -6],\n      [-3, -17],\n      [12, 13],\n      [16, -19],\n      [18, 0],\n      [29, 17],\n      [7, 0],\n      [-5, 20],\n      [13, 14],\n      [62, 17],\n      [35, -27],\n      [-3, -15],\n      [21, 2],\n      [16, -8],\n      [3, -10],\n      [-17, -16],\n      [-31, -8],\n      [-11, -15],\n      [25, 3],\n      [22, 10],\n      [32, 6],\n      [13, 10],\n      [-3, -10],\n      [19, 3],\n      [5, -6],\n      [32, -1],\n      [41, 14],\n      [0, -3],\n      [-45, -17],\n      [5, -7],\n      [73, 19],\n      [18, 14],\n      [58, 14],\n      [13, -9],\n      [11, 6],\n      [8, 14],\n      [14, 6],\n      [12, -14],\n      [14, 6],\n      [-8, -12],\n      [3, -11],\n      [11, 0],\n      [0, -16],\n      [28, 6],\n      [11, -7],\n      [10, 7],\n      [6, -10],\n      [11, 13],\n      [2, 21],\n      [16, 19],\n      [18, 8],\n      [28, -7],\n      [30, 4],\n      [8, 6],\n      [19, -2],\n      [13, -11],\n      [-5, -11],\n      [19, 10],\n      [11, 0],\n      [9, 12],\n      [4, -14],\n      [13, 7],\n      [8, -8],\n      [30, 1],\n      [20, -11],\n      [35, -3],\n      [12, -6],\n      [28, -3],\n      [10, -5],\n      [20, 3],\n      [14, -13],\n      [27, 10],\n      [12, -6],\n      [-4, -11],\n      [21, 8],\n      [5, -6],\n      [-22, -38],\n      [0, -10],\n      [11, 0],\n      [26, 23],\n      [9, -10],\n      [14, 7],\n      [14, -31],\n      [13, 5],\n      [-8, -14],\n      [8, -7],\n      [23, 3],\n      [4, -6],\n      [39, 4],\n      [35, -1],\n      [10, 4],\n      [-1, -21],\n      [16, -13],\n      [0, 14],\n      [24, 0],\n      [17, -11],\n      [23, 7],\n      [-5, 24],\n      [5, 3],\n      [24, -14],\n      [2, -10],\n      [16, -13],\n      [14, -3],\n      [17, -14],\n      [19, 3],\n      [6, -10],\n      [6, 8],\n      [17, -1],\n      [45, -17],\n      [14, -20],\n      [-16, 0],\n      [28, -13],\n      [19, -34],\n      [-3, -13],\n      [18, 0],\n      [2, 34],\n      [16, 3],\n      [22, -23],\n      [21, 2],\n      [-3, 7],\n      [38, -3],\n      [13, -6],\n      [12, 5],\n      [13, -6],\n      [-9, -6],\n      [27, 2],\n      [18, -20],\n      [10, -3],\n      [48, -30],\n      [2, 21],\n      [19, -31],\n      [-5, -6],\n      [-13, 7],\n      [-13, -34],\n      [12, 6],\n      [-5, -17],\n      [-39, 15],\n      [-11, -1],\n      [16, -13],\n      [29, -8],\n      [-8, -19],\n      [-20, -10],\n      [-14, 16],\n      [-2, -13],\n      [-32, 1],\n      [-12, 5],\n      [1, -16],\n      [9, 6],\n      [23, -6],\n      [-20, -4],\n      [-5, -9],\n      [-34, 0],\n      [9, -14],\n      [-26, -1],\n      [1, 15],\n      [-11, 9],\n      [-4, -20],\n      [17, -14],\n      [-15, 0],\n      [13, -30],\n      [-24, 1],\n      [-20, -6],\n      [-3, 16],\n      [-30, -30],\n      [9, -7],\n      [-5, -13],\n      [-22, 2],\n      [-34, -12],\n      [45, -1],\n      [-4, -7],\n      [21, -16],\n      [-2, -16],\n      [-18, -5],\n      [18, -3],\n      [4, -13],\n      [-13, -11],\n      [14, -5],\n      [-14, -17],\n      [18, 0],\n      [20, -30],\n      [-7, -11],\n      [27, -7],\n      [-11, -20],\n      [14, -7],\n      [20, 8],\n      [12, -14],\n      [36, -4],\n      [-15, -13],\n      [-12, 9],\n      [-47, -2],\n      [-37, -7],\n      [-14, -13],\n      [-34, 22],\n      [20, -29],\n      [-38, 2],\n      [-9, -8],\n      [9, -14],\n      [-23, -14],\n      [27, 3],\n      [-37, -16],\n      [52, -4],\n      [-72, -17],\n      [-6, -13],\n      [61, 6],\n      [7, -8],\n      [-35, -4],\n      [40, -4],\n      [-17, -13],\n      [9, -23],\n      [-22, 5],\n      [25, -20],\n      [40, -9],\n      [38, -31],\n      [-89, -12],\n      [59, -2],\n      [53, 8],\n      [73, -27],\n      [12, -14],\n      [24, 3],\n      [-3, -20],\n      [86, -9],\n      [66, -23],\n      [124, -12],\n      [-9955, -15]\n    ],\n    [\n      [3456, 1546],\n      [12, -3],\n      [-1, -9],\n      [-17, 4],\n      [-19, -9],\n      [3, 13],\n      [22, 4]\n    ],\n    [\n      [3431, 1556],\n      [12, -2],\n      [-6, -9],\n      [-6, 11]\n    ],\n    [\n      [3331, 1581],\n      [7, -5],\n      [-12, -7],\n      [-4, 7],\n      [-20, -3],\n      [-1, 6],\n      [30, 2]\n    ],\n    [\n      [3392, 1616],\n      [7, -6],\n      [-33, -7],\n      [10, 13],\n      [16, 0]\n    ],\n    [\n      [3470, 1665],\n      [-6, -10],\n      [-5, 8],\n      [11, 2]\n    ],\n    [\n      [6916, 2373],\n      [5, -3],\n      [-5, -12],\n      [16, -14],\n      [19, 13],\n      [7, -1],\n      [-1, -15],\n      [-9, 1],\n      [-11, -5],\n      [2, -7],\n      [13, 1],\n      [-1, -9],\n      [-22, 3],\n      [-7, 8],\n      [-5, -13],\n      [-8, 4],\n      [5, 20],\n      [-5, 14],\n      [1, 12],\n      [6, 3]\n    ],\n    [\n      [9093, 2685],\n      [-7, -6],\n      [5, 12],\n      [2, -6]\n    ],\n    [\n      [9020, 2837],\n      [14, -3],\n      [13, -8],\n      [2, -6],\n      [17, -8],\n      [24, 13],\n      [5, -4],\n      [5, 11],\n      [5, -4],\n      [4, 9],\n      [10, -13],\n      [-1, -28],\n      [1, -39],\n      [-7, 1],\n      [-1, -22],\n      [-4, -21],\n      [3, -1],\n      [0, -21],\n      [-10, 9],\n      [6, 10],\n      [-14, 1],\n      [-4, -23],\n      [-2, 6],\n      [-8, -26],\n      [-9, 6],\n      [-14, -1],\n      [-3, 20],\n      [-2, -6],\n      [-4, 15],\n      [-7, 9],\n      [-6, 24],\n      [0, 13],\n      [9, -9],\n      [-13, 31],\n      [-11, 37],\n      [-2, 13],\n      [4, 15]\n    ],\n    [\n      [9121, 2859],\n      [-9, -6],\n      [0, 6],\n      [9, 0]\n    ],\n    [\n      [9109, 2896],\n      [9, -16],\n      [1, -14],\n      [-5, -2],\n      [-11, 22],\n      [6, 10]\n    ],\n    [\n      [9001, 2876],\n      [-5, -4],\n      [-1, 25],\n      [7, 3],\n      [-1, -24]\n    ],\n    [\n      [8822, 3134],\n      [-1, -10],\n      [12, 1],\n      [0, -11],\n      [-11, 1],\n      [-5, -10],\n      [-20, 1],\n      [-4, 17],\n      [21, 11],\n      [8, 0]\n    ],\n    [\n      [9263, 3604],\n      [-1, -18],\n      [-2, 14],\n      [3, 4]\n    ],\n    [\n      [9261, 3608],\n      [-2, 17],\n      [3, 2],\n      [-1, -19]\n    ],\n    [\n      [8136, 3714],\n      [7, -36],\n      [-7, 19],\n      [0, 17]\n    ],\n    [\n      [9257, 3758],\n      [2, -20],\n      [-10, -37],\n      [1, 32],\n      [5, 7],\n      [-2, 14],\n      [4, 4]\n    ],\n    [\n      [9195, 3832],\n      [5, -3],\n      [0, -17],\n      [-7, 17],\n      [2, 3]\n    ],\n    [\n      [9061, 4133],\n      [3, -7],\n      [-3, -7],\n      [-4, 13],\n      [4, 1]\n    ],\n    [\n      [8880, 4236],\n      [-7, -7],\n      [0, -6],\n      [-8, 0],\n      [1, 8],\n      [10, 8],\n      [4, -3]\n    ],\n    [\n      [8805, 4285],\n      [2, -15],\n      [-4, 8],\n      [2, 7]\n    ],\n    [\n      [8797, 4395],\n      [0, -9],\n      [6, 2],\n      [-5, -8],\n      [-1, -14],\n      [6, -6],\n      [-8, 0],\n      [-6, 5],\n      [-1, 14],\n      [9, 16]\n    ],\n    [\n      [8621, 4522],\n      [5, -21],\n      [-7, 4],\n      [-8, -2],\n      [5, 9],\n      [-2, 9],\n      [6, 10],\n      [1, -9]\n    ],\n    [\n      [8624, 4533],\n      [6, -6],\n      [14, 10],\n      [6, -2],\n      [1, -21],\n      [-14, -18],\n      [-13, 16],\n      [-3, 29],\n      [3, -8]\n    ],\n    [\n      [8682, 4547],\n      [1, -13],\n      [-4, 6],\n      [3, 7]\n    ],\n    [\n      [8959, 4566],\n      [-1, -8],\n      [6, -7],\n      [3, -19],\n      [0, -30],\n      [10, -9],\n      [-4, -20],\n      [6, -4],\n      [4, -11],\n      [-2, -17],\n      [5, 2],\n      [-1, -13],\n      [3, -19],\n      [-2, -19],\n      [5, -20],\n      [3, -22],\n      [5, -2],\n      [15, 18],\n      [4, -22],\n      [18, -23],\n      [-3, -12],\n      [2, -6],\n      [2, -37],\n      [3, -8],\n      [-2, -16],\n      [6, -22],\n      [9, -9],\n      [-1, -11],\n      [5, -19],\n      [1, -16],\n      [-3, -34],\n      [9, -15],\n      [-2, -17],\n      [5, -14],\n      [13, -15],\n      [4, 7],\n      [2, -12],\n      [8, 0],\n      [4, -6],\n      [1, -14],\n      [19, -12],\n      [1, -10],\n      [7, 5],\n      [3, -13],\n      [4, 1],\n      [1, -10],\n      [-4, -1],\n      [-1, -10],\n      [15, -24],\n      [-1, -8],\n      [8, -30],\n      [0, -14],\n      [3, -20],\n      [8, -7],\n      [5, -13],\n      [-3, 22],\n      [4, 5],\n      [3, -9],\n      [10, -13],\n      [2, 13],\n      [6, -21],\n      [-2, -15],\n      [3, -36],\n      [4, 0],\n      [4, -13],\n      [5, -4],\n      [6, -13],\n      [6, 3],\n      [4, -6],\n      [6, -27],\n      [8, -7],\n      [4, -25],\n      [10, -6],\n      [0, -27],\n      [6, -16],\n      [-2, -19],\n      [4, -40],\n      [-4, -3],\n      [10, -41],\n      [1, -17],\n      [3, -4],\n      [1, -40],\n      [-7, -21],\n      [-2, -39],\n      [-7, -32],\n      [0, -30],\n      [-3, -28],\n      [-5, -21],\n      [-6, -11],\n      [0, -23],\n      [-13, -15],\n      [-11, -20],\n      [-6, -26],\n      [-5, -3],\n      [0, -26],\n      [-9, -18],\n      [-3, -27],\n      [-4, -14],\n      [2, -9],\n      [-8, -7],\n      [-9, -34],\n      [0, -24],\n      [-7, -34],\n      [4, -21],\n      [-2, -14],\n      [-13, -16],\n      [-33, -2],\n      [-16, -10],\n      [-10, -13],\n      [-13, -24],\n      [-19, -4],\n      [3, -12],\n      [4, 7],\n      [-2, -20],\n      [-6, 16],\n      [-8, -3],\n      [-4, 16],\n      [-3, -3],\n      [-8, 9],\n      [5, 8],\n      [-2, 9],\n      [-6, 0],\n      [-1, -10],\n      [-8, -5],\n      [-6, 8],\n      [8, 1],\n      [3, 17],\n      [-6, 10],\n      [-15, -14],\n      [10, -2],\n      [-2, -8],\n      [-6, 0],\n      [-10, -11],\n      [-14, -22],\n      [-32, 28],\n      [-5, -2],\n      [-8, 7],\n      [-9, -1],\n      [1, -6],\n      [-8, 1],\n      [-4, 13],\n      [-14, 5],\n      [-10, 11],\n      [-3, 13],\n      [-13, 23],\n      [-3, 18],\n      [5, 6],\n      [0, 13],\n      [-9, 34],\n      [-14, 26],\n      [6, 2],\n      [3, 10],\n      [-4, 3],\n      [-21, -20],\n      [-8, 0],\n      [-1, 7],\n      [9, 12],\n      [3, 33],\n      [-8, 16],\n      [-3, 16],\n      [-7, -13],\n      [-1, -20],\n      [-5, -23],\n      [-7, 4],\n      [-15, -11],\n      [3, 23],\n      [11, -3],\n      [3, 21],\n      [-1, 25],\n      [4, 17],\n      [9, 19],\n      [-3, 19],\n      [6, 4],\n      [-8, 34],\n      [0, -26],\n      [-3, 2],\n      [-6, -11],\n      [-5, -27],\n      [-25, -26],\n      [-8, -24],\n      [-4, -3],\n      [-4, -16],\n      [6, 2],\n      [0, -12],\n      [-5, 7],\n      [-6, -5],\n      [-6, 18],\n      [-1, 21],\n      [-3, 17],\n      [-11, 20],\n      [-4, 27],\n      [-12, 0],\n      [-2, 13],\n      [-4, 1],\n      [7, 15],\n      [-5, 12],\n      [-8, -5],\n      [3, 9],\n      [-8, 16],\n      [-14, -5],\n      [-10, 14],\n      [-7, 1],\n      [-9, -6],\n      [-12, 18],\n      [-18, 14],\n      [-9, -7],\n      [-18, 2],\n      [-33, -7],\n      [-27, -23],\n      [-20, -11],\n      [-17, -2],\n      [-14, 5],\n      [-18, -19],\n      [-15, -10],\n      [-2, -6],\n      [-17, -8],\n      [-4, -5],\n      [-5, -28],\n      [-7, -16],\n      [-6, -7],\n      [-4, 3],\n      [-6, -7],\n      [-3, 9],\n      [-19, -3],\n      [-8, -6],\n      [0, 8],\n      [-14, 3],\n      [-20, -2],\n      [-13, -6],\n      [-16, -1],\n      [-9, -16],\n      [-2, -12],\n      [-16, 1],\n      [-3, -11],\n      [-7, -4],\n      [-2, -11],\n      [-20, -8],\n      [-2, -5],\n      [-12, 7],\n      [-18, -1],\n      [-15, 14],\n      [-10, 19],\n      [-10, 9],\n      [-4, -3],\n      [-4, 15],\n      [0, 32],\n      [6, -7],\n      [7, 3],\n      [6, 18],\n      [-1, 36],\n      [3, 8],\n      [0, 43],\n      [-18, 66],\n      [-4, 34],\n      [1, 32],\n      [-5, 22],\n      [-7, 17],\n      [0, 16],\n      [-11, 24],\n      [-2, 38],\n      [-5, 16],\n      [-11, 32],\n      [-7, 13],\n      [5, 14],\n      [6, -26],\n      [7, 6],\n      [0, 9],\n      [-9, 14],\n      [-4, 27],\n      [2, 4],\n      [7, -20],\n      [-1, -17],\n      [5, 14],\n      [2, -22],\n      [7, -2],\n      [0, 30],\n      [-5, 13],\n      [-6, 26],\n      [-4, 4],\n      [-3, 21],\n      [-5, 16],\n      [1, 26],\n      [4, 22],\n      [5, 6],\n      [0, 24],\n      [2, 10],\n      [-5, 22],\n      [3, 7],\n      [7, 33],\n      [4, 4],\n      [-2, -20],\n      [1, -21],\n      [7, 4],\n      [8, 34],\n      [23, 20],\n      [13, 26],\n      [21, 22],\n      [5, -3],\n      [8, 6],\n      [7, -7],\n      [12, 7],\n      [8, 14],\n      [17, 3],\n      [10, 20],\n      [12, -6],\n      [7, 6],\n      [12, 3],\n      [16, 11],\n      [11, 13],\n      [9, 25],\n      [3, 19],\n      [4, 4],\n      [16, 39],\n      [-4, 1],\n      [-2, 36],\n      [3, 14],\n      [8, 17],\n      [6, 3],\n      [0, 10],\n      [7, 12],\n      [-1, -15],\n      [5, -3],\n      [0, -14],\n      [12, -37],\n      [-1, 10],\n      [3, 13],\n      [-2, 11],\n      [7, -10],\n      [-3, 24],\n      [-6, 5],\n      [6, 13],\n      [-5, 8],\n      [5, 2],\n      [7, -7],\n      [-1, 9],\n      [7, -9],\n      [16, -1],\n      [-10, 3],\n      [-1, 9],\n      [6, 4],\n      [1, 18],\n      [-4, -11],\n      [-3, 18],\n      [1, 9],\n      [6, 1],\n      [3, 9],\n      [5, 0],\n      [4, -9],\n      [1, 10],\n      [-6, 3],\n      [4, 17],\n      [11, -10],\n      [0, 9],\n      [-8, 16],\n      [10, 14],\n      [3, -4],\n      [7, 6],\n      [1, -11],\n      [3, 5],\n      [4, 26],\n      [-5, 5],\n      [4, 7],\n      [3, -19],\n      [9, 16],\n      [1, -16],\n      [4, 14],\n      [4, 0],\n      [-3, 11],\n      [6, 4],\n      [4, -14],\n      [9, 1],\n      [11, -28],\n      [10, -16],\n      [-3, -17],\n      [0, -13],\n      [4, -1],\n      [-1, 11],\n      [5, 14],\n      [4, 3],\n      [12, -5],\n      [9, -11],\n      [-1, 11],\n      [7, -5],\n      [3, -14],\n      [4, 1],\n      [-3, 18],\n      [5, -1],\n      [-6, 15],\n      [-7, 11],\n      [4, 20],\n      [7, 4],\n      [1, 18],\n      [4, 9],\n      [11, 12],\n      [-5, 9],\n      [0, 14],\n      [6, 2],\n      [0, 12],\n      [6, 6],\n      [2, 11],\n      [7, -14],\n      [0, 17],\n      [4, -2],\n      [-1, 12],\n      [9, 5],\n      [3, -13],\n      [13, 4],\n      [4, -5],\n      [9, 5],\n      [7, 9],\n      [2, 24],\n      [-7, 12],\n      [-9, -5],\n      [-5, 12],\n      [-5, 0],\n      [7, 11],\n      [10, -1],\n      [9, -21],\n      [6, 10],\n      [7, -21],\n      [14, -7],\n      [4, 6],\n      [4, -11],\n      [3, 4],\n      [4, -12],\n      [6, -1],\n      [8, 7],\n      [11, -18],\n      [13, 11],\n      [6, 2],\n      [-4, -8],\n      [2, -6],\n      [5, 7],\n      [5, -5],\n      [-2, -11],\n      [7, -1],\n      [3, 14],\n      [-5, 3],\n      [10, 9],\n      [4, -17],\n      [3, 7],\n      [4, -11],\n      [-12, -28],\n      [4, -6],\n      [-9, -21],\n      [0, 9],\n      [-5, -6],\n      [0, 8],\n      [-7, -9],\n      [0, -26],\n      [4, 3],\n      [-4, -29],\n      [-3, -3],\n      [-7, -24],\n      [-4, -4],\n      [2, -13],\n      [22, -27],\n      [0, -8],\n      [10, -11],\n      [4, -9],\n      [7, 1],\n      [10, -14],\n      [10, -7],\n      [9, -21],\n      [7, -8],\n      [20, -9],\n      [4, -7],\n      [1, -15],\n      [22, -24],\n      [14, 4],\n      [10, 13],\n      [3, 24],\n      [7, 18],\n      [3, 26],\n      [3, 9],\n      [-2, 9],\n      [3, 25],\n      [5, 20],\n      [-4, 40],\n      [3, 16],\n      [-4, 13],\n      [1, 21],\n      [5, 21],\n      [-2, 18],\n      [6, 14],\n      [-2, 11],\n      [-5, -4],\n      [6, 28],\n      [6, 1],\n      [-2, 8],\n      [6, 41],\n      [0, 14],\n      [5, 2],\n      [6, 11]\n    ],\n    [\n      [5470, 7982],\n      [-2, -9],\n      [5, -23],\n      [3, -3]\n    ],\n    [\n      [5476, 7947],\n      [-3, -17],\n      [-12, 3],\n      [-6, -6],\n      [7, -3],\n      [-5, -12],\n      [-1, -22],\n      [-9, -9]\n    ],\n    [\n      [5447, 7881],\n      [-19, -12],\n      [-16, -2],\n      [-9, -14],\n      [-23, 9]\n    ],\n    [\n      [5380, 7862],\n      [-32, 7],\n      [-12, 17],\n      [2, 7],\n      [-12, -5],\n      [-17, -1],\n      [-4, -11],\n      [-15, 6]\n    ],\n    [\n      [5290, 7882],\n      [-2, 7],\n      [-6, -8],\n      [-16, 12]\n    ],\n    [\n      [5266, 7893],\n      [-2, 12]\n    ],\n    [\n      [5264, 7905],\n      [1, 14]\n    ],\n    [\n      [5265, 7919],\n      [4, 2]\n    ],\n    [\n      [5269, 7921],\n      [7, 0],\n      [8, -16],\n      [6, 15],\n      [12, -1],\n      [2, -7],\n      [9, 1],\n      [9, 10],\n      [32, 4],\n      [6, -11],\n      [3, 9],\n      [-5, 5],\n      [1, 13],\n      [-6, 9],\n      [4, 7],\n      [12, 5],\n      [4, 16],\n      [7, -3],\n      [3, 13]\n    ],\n    [\n      [5383, 7990],\n      [7, -9],\n      [18, 0],\n      [7, 11],\n      [0, 12],\n      [11, -1],\n      [20, -13],\n      [10, 3],\n      [13, -6],\n      [1, -5]\n    ],\n    [\n      [6281, 7420],\n      [-19, 8],\n      [-9, 14],\n      [-9, 24]\n    ],\n    [\n      [6244, 7466],\n      [-1, 3]\n    ],\n    [\n      [6289, 7594],\n      [9, -6],\n      [11, -12],\n      [5, -17],\n      [16, -3],\n      [5, 15],\n      [9, 6],\n      [5, 16]\n    ],\n    [\n      [6349, 7593],\n      [15, -31],\n      [1, -11],\n      [10, -28],\n      [15, -3],\n      [8, -10],\n      [-11, -3],\n      [-13, -11],\n      [0, -11],\n      [-6, -28],\n      [4, -11],\n      [-5, 0],\n      [-1, -17],\n      [-7, 10],\n      [-2, -43]\n    ],\n    [\n      [6357, 7396],\n      [-7, -2],\n      [-6, 12],\n      [-11, 12],\n      [1, 8],\n      [7, 2],\n      [-5, 18],\n      [6, 7],\n      [-10, 16],\n      [-4, -1],\n      [-26, -29],\n      [-11, -17]\n    ],\n    [\n      [6249, 7560],\n      [8, 10],\n      [13, -8],\n      [8, -9],\n      [6, 1],\n      [6, -8],\n      [4, 3],\n      [1, 15],\n      [-10, 9],\n      [-3, 13],\n      [7, 8]\n    ],\n    [\n      [5848, 5045],\n      [-4, -15],\n      [2, -14],\n      [9, -5],\n      [0, -17],\n      [-9, -13],\n      [-9, -34],\n      [-11, -21],\n      [-3, 1]\n    ],\n    [\n      [5823, 4927],\n      [-9, 39],\n      [1, 21],\n      [-4, 4]\n    ],\n    [\n      [5811, 4991],\n      [0, 18],\n      [-4, 5],\n      [-2, 12]\n    ],\n    [\n      [5805, 5026],\n      [4, 7],\n      [5, -4],\n      [0, -9],\n      [11, 1],\n      [5, 7],\n      [1, 21],\n      [6, -6],\n      [7, 7],\n      [4, -5]\n    ],\n    [\n      [5166, 8104],\n      [10, -14],\n      [1, -10],\n      [-8, -11]\n    ],\n    [\n      [5169, 8069],\n      [-7, -3],\n      [-4, -16],\n      [2, -14]\n    ],\n    [\n      [5160, 8036],\n      [-9, -3],\n      [-4, 10],\n      [-13, 7],\n      [-1, 21],\n      [-9, -13],\n      [-10, 3],\n      [2, 15],\n      [-5, 5],\n      [-10, 0],\n      [0, 6],\n      [-11, 5],\n      [-4, 15],\n      [-7, -6],\n      [-7, 8],\n      [-2, 15]\n    ],\n    [\n      [5070, 8124],\n      [16, 14],\n      [7, 3]\n    ],\n    [\n      [5093, 8141],\n      [0, -6],\n      [16, -3],\n      [8, 9]\n    ],\n    [\n      [5117, 8141],\n      [1, 0]\n    ],\n    [\n      [5118, 8141],\n      [3, 3],\n      [16, -1],\n      [7, -8],\n      [9, 0],\n      [9, -11],\n      [-6, -13],\n      [10, -7]\n    ],\n    [\n      [5099, 5856],\n      [-3, -17],\n      [7, -16],\n      [0, -19],\n      [3, -5],\n      [-1, -16],\n      [-5, 0],\n      [1, -14],\n      [-3, -18],\n      [-6, -3],\n      [0, -9],\n      [-5, -12],\n      [-2, -20],\n      [-8, -4],\n      [-2, -15],\n      [0, -41],\n      [-1, -12],\n      [2, -25],\n      [1, -42],\n      [-2, -18]\n    ],\n    [\n      [5075, 5550],\n      [-31, -9]\n    ],\n    [\n      [5044, 5541],\n      [5, 3],\n      [-5, 18],\n      [1, 24],\n      [0, 73],\n      [-1, 5],\n      [0, 43],\n      [-6, 13],\n      [-1, 37],\n      [-16, 23],\n      [0, 19],\n      [4, 17]\n    ],\n    [\n      [5025, 5816],\n      [5, 3],\n      [1, 13],\n      [4, -1],\n      [3, 11],\n      [6, -3],\n      [11, 2],\n      [8, 13],\n      [3, 14]\n    ],\n    [\n      [5066, 5868],\n      [-1, 19],\n      [14, 10],\n      [10, -21],\n      [2, -8],\n      [6, -4],\n      [2, -8]\n    ],\n    [\n      [5006, 6041],\n      [-2, -21],\n      [6, -16],\n      [-1, -9],\n      [7, -24],\n      [5, 0],\n      [7, -13],\n      [7, -7],\n      [-9, -1],\n      [0, -15],\n      [6, -6],\n      [11, -19],\n      [8, -1],\n      [3, 7],\n      [5, -3],\n      [3, -15],\n      [-6, -4],\n      [10, -26]\n    ],\n    [\n      [5025, 5816],\n      [-12, 0],\n      [-18, 8]\n    ],\n    [\n      [4995, 5824],\n      [-8, -3],\n      [-5, -10],\n      [-2, 5],\n      [-59, 0],\n      [-3, -22],\n      [3, -11],\n      [2, -25],\n      [0, -24],\n      [2, -5]\n    ],\n    [\n      [4925, 5729],\n      [-4, -4],\n      [-10, 24],\n      [-6, 5],\n      [-10, 1],\n      [-11, -7],\n      [-4, -11],\n      [-11, 3],\n      [-4, 12],\n      [-3, -1],\n      [-4, 24],\n      [-9, 1],\n      [-3, 7]\n    ],\n    [\n      [4846, 5783],\n      [3, 24],\n      [-2, 14],\n      [6, 9],\n      [1, 19],\n      [-4, 14],\n      [8, 10],\n      [9, 1],\n      [10, 18],\n      [-1, 24],\n      [6, 0],\n      [0, 14],\n      [-3, 11],\n      [10, 13],\n      [15, -13],\n      [5, 7],\n      [0, 25],\n      [6, -5],\n      [5, 21],\n      [11, 16],\n      [12, -6],\n      [1, 16],\n      [8, 3],\n      [11, 13],\n      [8, 5],\n      [8, 15],\n      [8, -4],\n      [8, 2],\n      [11, -8]\n    ],\n    [\n      [7529, 6456],\n      [0, 16],\n      [3, -11],\n      [-3, -5]\n    ],\n    [\n      [7521, 6458],\n      [-5, -7],\n      [2, 29],\n      [-4, 4],\n      [3, 11],\n      [6, -20],\n      [-2, -17]\n    ],\n    [\n      [7571, 6448],\n      [0, -29],\n      [2, -10],\n      [-12, 7],\n      [1, -20]\n    ],\n    [\n      [7562, 6396],\n      [1, -15],\n      [-7, 20],\n      [-1, 27],\n      [-3, 9],\n      [-2, 29],\n      [-11, 31],\n      [-5, -14],\n      [-9, 0],\n      [-8, 26],\n      [1, 14],\n      [-4, 6],\n      [-9, 4],\n      [11, -11],\n      [-4, -10],\n      [2, -12],\n      [-3, -8],\n      [5, -13],\n      [-2, -18],\n      [-6, -9],\n      [-1, -11],\n      [-7, 1],\n      [1, 7],\n      [-5, 6],\n      [-2, -15],\n      [-12, -7],\n      [0, 14],\n      [-4, -18],\n      [-4, 10],\n      [-1, 18]\n    ],\n    [\n      [7473, 6457],\n      [-6, 48],\n      [2, 14],\n      [-7, 2],\n      [3, 13],\n      [-6, 8],\n      [0, 11],\n      [5, 8],\n      [0, 22],\n      [-7, 0],\n      [-11, 12],\n      [-2, 7],\n      [4, 12],\n      [5, 1],\n      [3, 18],\n      [13, -1],\n      [-3, 18],\n      [-8, 1],\n      [-3, 11],\n      [-9, 14],\n      [2, 12],\n      [5, 4],\n      [4, 14],\n      [5, -9],\n      [11, -3],\n      [7, -14],\n      [7, -2],\n      [2, 15],\n      [6, -18],\n      [-2, -4],\n      [1, -32],\n      [15, -8],\n      [23, 2],\n      [7, -3],\n      [18, 3],\n      [11, -14],\n      [-6, -2],\n      [-5, -31],\n      [-5, -2],\n      [0, -9],\n      [-8, 2],\n      [0, -6],\n      [-7, 0],\n      [-7, -21],\n      [2, -14],\n      [9, -30],\n      [7, 5],\n      [0, 15],\n      [5, 8],\n      [-1, 11],\n      [5, 4],\n      [8, -22],\n      [0, -25],\n      [3, -12],\n      [3, -42]\n    ],\n    [\n      [5793, 7702],\n      [0, -17],\n      [-11, -3],\n      [-6, -14],\n      [-2, -26],\n      [-4, 1],\n      [-8, -16],\n      [5, 1],\n      [11, -28]\n    ],\n    [\n      [5778, 7600],\n      [-13, -4],\n      [-6, 9],\n      [-21, -5],\n      [-7, -15]\n    ],\n    [\n      [5731, 7585],\n      [-8, 0],\n      [2, -21],\n      [-25, -7],\n      [-9, 10],\n      [-8, 1],\n      [-2, 6],\n      [-14, 0],\n      [-8, -7],\n      [-13, 0],\n      [-10, -4]\n    ],\n    [\n      [5636, 7563],\n      [3, 22],\n      [-5, 18],\n      [-9, 5],\n      [-5, 11]\n    ],\n    [\n      [5620, 7619],\n      [5, 6],\n      [-3, 23],\n      [9, 5],\n      [7, 17],\n      [-13, 15],\n      [-4, 15],\n      [1, 17],\n      [8, 13]\n    ],\n    [\n      [5630, 7730],\n      [9, -8],\n      [-4, -15],\n      [17, 3],\n      [18, -8],\n      [10, 3],\n      [21, -5],\n      [4, -4],\n      [11, 5],\n      [9, 16],\n      [25, 10],\n      [10, -10],\n      [15, -2],\n      [8, -13],\n      [10, 0]\n    ],\n    [\n      [6402, 6694],\n      [3, 0],\n      [0, -24],\n      [-4, 8],\n      [1, 16]\n    ],\n    [\n      [2971, 6401],\n      [-3, -10],\n      [-15, -3],\n      [-1, 6],\n      [9, 10],\n      [4, -4],\n      [6, 12],\n      [0, -11]\n    ],\n    [\n      [2969, 6475],\n      [8, -3],\n      [-7, -3],\n      [-1, 6]\n    ],\n    [\n      [2948, 6491],\n      [0, -14],\n      [-5, 9],\n      [5, 5]\n    ],\n    [\n      [2889, 6546],\n      [9, -13],\n      [-10, 9],\n      [1, 4]\n    ],\n    [\n      [2908, 6546],\n      [6, -21],\n      [0, -8],\n      [7, -10],\n      [0, -8],\n      [-7, 15],\n      [-1, 14],\n      [-5, 18]\n    ],\n    [\n      [2840, 6572],\n      [6, 0],\n      [0, -20],\n      [-8, 5],\n      [-3, 13],\n      [5, 2]\n    ],\n    [\n      [2908, 6577],\n      [-3, 0],\n      [-4, 16],\n      [7, -16]\n    ],\n    [\n      [2830, 6632],\n      [3, 0],\n      [8, -40],\n      [-8, -11],\n      [-10, 14],\n      [7, 37]\n    ],\n    [\n      [2869, 6655],\n      [0, -4],\n      [16, -20],\n      [-1, -29],\n      [-2, 7],\n      [3, 17],\n      [-6, 14],\n      [-11, 8],\n      [1, 7]\n    ],\n    [\n      [2819, 6722],\n      [15, -4],\n      [-21, -5],\n      [6, 9]\n    ],\n    [\n      [2839, 6733],\n      [5, 0],\n      [16, -25],\n      [0, -11],\n      [-4, -3],\n      [0, -19],\n      [-6, 5],\n      [4, 8],\n      [0, 18],\n      [-8, 23],\n      [-7, 4]\n    ],\n    [\n      [5528, 7765],\n      [9, 0],\n      [-7, -29],\n      [14, -17],\n      [-10, -5],\n      [7, -13],\n      [-1, -8],\n      [-7, -3]\n    ],\n    [\n      [5533, 7690],\n      [-8, -3],\n      [0, -8],\n      [-7, -6],\n      [-1, -13],\n      [-4, 0],\n      [-1, -26]\n    ],\n    [\n      [5512, 7634],\n      [-22, 19]\n    ],\n    [\n      [5490, 7653],\n      [-2, 3]\n    ],\n    [\n      [5488, 7656],\n      [0, 8],\n      [-35, 57],\n      [-8, 32],\n      [-7, 3],\n      [0, 29],\n      [6, 2],\n      [10, -12],\n      [3, 10],\n      [9, -1],\n      [4, 7],\n      [4, -7],\n      [22, -6],\n      [4, 4],\n      [19, -3],\n      [2, -11],\n      [7, -3]\n    ],\n    [\n      [5781, 8416],\n      [4, -6],\n      [9, 3],\n      [3, -8],\n      [9, 4],\n      [11, -6],\n      [1, -13],\n      [12, 9],\n      [16, -3],\n      [11, -11],\n      [-2, -19],\n      [6, -15],\n      [-7, -13],\n      [11, -10],\n      [-3, -7],\n      [7, -14],\n      [15, -15],\n      [-3, -11],\n      [10, 1],\n      [11, -9],\n      [6, -11],\n      [-15, -22],\n      [-22, 5],\n      [-4, -9],\n      [8, -10],\n      [2, -30],\n      [5, -13]\n    ],\n    [\n      [5882, 8183],\n      [-23, -2],\n      [-12, -29],\n      [3, -14],\n      [-7, -1],\n      [-6, 11],\n      [-15, -1],\n      [-9, -6],\n      [-5, 14],\n      [-13, -11],\n      [-11, 13],\n      [-16, -10],\n      [1, 7],\n      [-13, 0],\n      [-1, 7],\n      [-21, 5],\n      [-10, 6],\n      [-28, 2],\n      [-19, -4],\n      [-11, -18],\n      [-11, 3],\n      [0, -5]\n    ],\n    [\n      [5655, 8150],\n      [0, 34],\n      [-12, 10],\n      [6, 13],\n      [15, 11],\n      [0, 18],\n      [-7, 25],\n      [-5, 28]\n    ],\n    [\n      [5652, 8289],\n      [20, 1],\n      [5, -4],\n      [12, 5],\n      [-1, 7],\n      [19, 11],\n      [1, -8],\n      [8, 6],\n      [-7, 3],\n      [9, 37],\n      [8, 1],\n      [3, 10],\n      [9, -1],\n      [6, 10],\n      [-8, 1],\n      [2, 20]\n    ],\n    [\n      [5738, 8388],\n      [11, 10],\n      [17, -2],\n      [8, 17],\n      [7, 3]\n    ],\n    [\n      [2547, 6247],\n      [-3, -6],\n      [9, 0],\n      [-1, -18],\n      [-5, -28],\n      [4, -4],\n      [-4, -10],\n      [2, -16],\n      [-2, -24],\n      [-7, -21],\n      [-5, -2],\n      [-5, -20]\n    ],\n    [\n      [2530, 6098],\n      [-9, 0],\n      [2, 51],\n      [0, 60]\n    ],\n    [\n      [2523, 6209],\n      [4, 10],\n      [4, -6],\n      [9, 26],\n      [0, 6],\n      [7, 2]\n    ],\n    [\n      [3084, 4249],\n      [-4, -1]\n    ],\n    [\n      [3080, 4248],\n      [4, 1]\n    ],\n    [\n      [3384, 4022],\n      [-1, 21],\n      [-24, 29],\n      [-24, 0],\n      [-51, -22],\n      [-4, -23],\n      [-10, -28],\n      [0, -29],\n      [-8, -54],\n      [-3, -14]\n    ],\n    [\n      [3133, 3869],\n      [-10, -5],\n      [-9, 4],\n      [1, 16],\n      [-3, 11],\n      [0, 16],\n      [-4, 7],\n      [-3, 23],\n      [0, 15],\n      [-6, 20],\n      [-4, 2],\n      [2, 18],\n      [-6, 6],\n      [1, 10],\n      [-3, 14],\n      [6, 2],\n      [1, 8],\n      [-5, 11],\n      [7, 16],\n      [-13, 23],\n      [-3, 34],\n      [-3, 18],\n      [2, 6],\n      [-7, 5],\n      [0, 8],\n      [-5, 18]\n    ],\n    [\n      [3069, 4175],\n      [-4, 17],\n      [7, 8],\n      [10, 30]\n    ],\n    [\n      [3082, 4230],\n      [5, -3],\n      [-1, 11],\n      [8, 5],\n      [0, 6],\n      [-7, 0],\n      [-1, 9],\n      [4, 4],\n      [-7, 3],\n      [0, 7],\n      [-10, 17]\n    ],\n    [\n      [3073, 4289],\n      [6, 16],\n      [-7, 15],\n      [6, 28],\n      [5, 6],\n      [3, 20],\n      [-6, 22],\n      [4, 8],\n      [-1, 36],\n      [7, 11],\n      [2, 12],\n      [-16, 55],\n      [-9, 34]\n    ],\n    [\n      [3067, 4552],\n      [23, -3],\n      [-1, -8],\n      [10, 6],\n      [9, 20],\n      [11, 3],\n      [11, 19],\n      [7, 3],\n      [11, 20],\n      [19, 8],\n      [7, 1],\n      [4, -5],\n      [5, 9],\n      [3, -32],\n      [-4, -13],\n      [3, -21],\n      [-2, -18],\n      [2, -19],\n      [3, -2],\n      [1, -14],\n      [4, -2],\n      [1, -12],\n      [5, -1],\n      [4, -10],\n      [6, -4],\n      [1, -11],\n      [13, -4],\n      [4, 4],\n      [10, -7],\n      [4, -8],\n      [5, 4],\n      [9, -20],\n      [4, 1],\n      [8, -10],\n      [7, 0],\n      [0, -6],\n      [8, -17],\n      [22, 4],\n      [18, -27],\n      [-2, -20],\n      [5, -18],\n      [1, -28],\n      [-9, -1],\n      [9, -20],\n      [3, -47],\n      [47, -4],\n      [3, 3],\n      [0, -13],\n      [-4, -8],\n      [2, -34],\n      [11, -15],\n      [6, -1],\n      [0, -8],\n      [6, -27],\n      [0, -10],\n      [-6, -46],\n      [-9, -38],\n      [7, -13],\n      [-8, -10]\n    ],\n    [\n      [3651, 3581],\n      [1, 22],\n      [3, 0],\n      [-4, -22]\n    ],\n    [\n      [3650, 3661],\n      [-4, 8],\n      [6, 7],\n      [-2, -15]\n    ],\n    [\n      [3919, 4412],\n      [0, -16],\n      [-4, 16],\n      [4, 0]\n    ],\n    [\n      [3660, 5124],\n      [-3, 3],\n      [4, 9],\n      [-1, -12]\n    ],\n    [\n      [3588, 5149],\n      [0, -7],\n      [-8, -7],\n      [1, 9],\n      [7, 5]\n    ],\n    [\n      [3577, 5151],\n      [2, -5],\n      [-4, -19],\n      [-3, -11],\n      [-15, -19],\n      [0, 13],\n      [7, 10],\n      [0, 14],\n      [2, 11],\n      [8, 8],\n      [3, -2]\n    ],\n    [\n      [3573, 5156],\n      [5, 19],\n      [0, -10],\n      [-5, -9]\n    ],\n    [\n      [3608, 5175],\n      [11, -6],\n      [9, 5],\n      [27, -7],\n      [-2, -14],\n      [-1, -20],\n      [-4, -14],\n      [-5, -5],\n      [0, -14],\n      [-7, -5],\n      [-3, 7],\n      [0, -11],\n      [-9, 1],\n      [-6, -12],\n      [-14, 3],\n      [-4, -6],\n      [-5, 2],\n      [-7, 28],\n      [1, 13],\n      [6, -5],\n      [1, 8],\n      [-7, -1],\n      [0, 23],\n      [2, 17],\n      [4, 10],\n      [5, 5],\n      [8, -2]\n    ],\n    [\n      [3586, 5165],\n      [-4, 4],\n      [1, 13],\n      [7, 3],\n      [2, -9],\n      [-6, -11]\n    ],\n    [\n      [3625, 5187],\n      [3, -5],\n      [-2, -7],\n      [-11, 2],\n      [10, 10]\n    ],\n    [\n      [3599, 5183],\n      [-5, 0],\n      [-2, 9],\n      [6, -1],\n      [1, -8]\n    ],\n    [\n      [3624, 5200],\n      [-6, -5],\n      [-3, -12],\n      [-14, 0],\n      [-1, 12],\n      [8, 1],\n      [15, 9],\n      [1, -5]\n    ],\n    [\n      [3600, 5213],\n      [1, -14],\n      [-2, -7],\n      [0, 23],\n      [1, -2]\n    ],\n    [\n      [3609, 5216],\n      [-6, -13],\n      [1, 14],\n      [5, -1]\n    ],\n    [\n      [3608, 5236],\n      [0, -10],\n      [-5, 0],\n      [5, 10]\n    ],\n    [\n      [3600, 5305],\n      [1, -11],\n      [-5, 4],\n      [4, 7]\n    ],\n    [\n      [3431, 5295],\n      [13, -7],\n      [2, 14],\n      [-6, 10],\n      [5, 17],\n      [6, -8],\n      [11, 2],\n      [0, 4],\n      [10, 2],\n      [8, -5],\n      [3, -7]\n    ],\n    [\n      [3483, 5317],\n      [3, -7],\n      [8, -3],\n      [7, 3],\n      [6, 9],\n      [5, -7],\n      [6, 5],\n      [9, -9],\n      [9, 11],\n      [8, 31],\n      [1, 14],\n      [4, 7],\n      [15, 44]\n    ],\n    [\n      [3564, 5415],\n      [5, 24],\n      [8, -16],\n      [1, -21],\n      [3, 4],\n      [-1, -29],\n      [3, -31],\n      [7, -22],\n      [1, -18],\n      [6, -18],\n      [13, -4],\n      [4, -8],\n      [0, -19],\n      [-7, -4],\n      [7, -3],\n      [-11, -17],\n      [-5, -12],\n      [-4, -17],\n      [-5, -11],\n      [-5, -1],\n      [-9, -17],\n      [-4, -19],\n      [-8, -19],\n      [0, -14],\n      [-7, -8],\n      [-1, -13],\n      [-6, 4],\n      [-14, -13],\n      [13, 2],\n      [0, -10],\n      [9, 7],\n      [7, 10],\n      [11, 11],\n      [13, 17],\n      [-5, -12],\n      [5, -5],\n      [0, -14],\n      [4, -9],\n      [0, -11],\n      [7, -14],\n      [4, 9],\n      [6, 4],\n      [5, -7],\n      [12, 10],\n      [1, -7],\n      [-5, -41],\n      [2, -2],\n      [8, 40],\n      [7, 18],\n      [2, -8],\n      [8, 21],\n      [3, -12],\n      [1, 19],\n      [4, -2],\n      [4, 16],\n      [1, 15],\n      [5, 0],\n      [5, 12],\n      [2, -11],\n      [4, 10],\n      [11, -7],\n      [19, -9],\n      [0, -10],\n      [7, -6],\n      [8, 5],\n      [1, -7],\n      [10, -9],\n      [1, -8],\n      [6, 9],\n      [-2, -11],\n      [1, -13],\n      [3, 11],\n      [5, 4],\n      [10, -14],\n      [-3, -5],\n      [6, -1],\n      [3, -8],\n      [-5, -16],\n      [5, 5],\n      [3, -14],\n      [-4, 0],\n      [-5, -36],\n      [2, -9],\n      [6, 14],\n      [1, 23],\n      [8, 8],\n      [1, -9],\n      [-7, -12],\n      [7, -2],\n      [2, 14],\n      [9, 4],\n      [6, -4],\n      [-1, 12],\n      [4, 0],\n      [18, -13],\n      [6, -11],\n      [15, -5],\n      [3, 6],\n      [5, -9],\n      [29, 4],\n      [3, 2],\n      [14, -3],\n      [25, -31],\n      [3, -1],\n      [8, -15],\n      [5, -2],\n      [11, -27],\n      [14, -26],\n      [9, -6],\n      [4, -12],\n      [6, -1],\n      [6, -8],\n      [16, -1],\n      [5, 3],\n      [13, -6],\n      [4, -13],\n      [9, -57],\n      [1, -24],\n      [5, -21],\n      [-1, -53],\n      [-7, -40],\n      [-7, -25],\n      [-10, -27],\n      [-3, 5],\n      [-2, -16],\n      [-12, -24],\n      [-3, -13],\n      [-10, -10],\n      [-5, -9],\n      [-11, -37],\n      [-15, -52],\n      [-13, -34],\n      [-5, 0],\n      [0, 14],\n      [-4, 9],\n      [-4, -16],\n      [0, -17],\n      [-4, -7],\n      [0, -27],\n      [-2, -5],\n      [2, -28],\n      [-3, -20],\n      [2, -9],\n      [0, -24],\n      [2, -28],\n      [2, -6],\n      [-4, -25],\n      [-6, -53],\n      [1, -31],\n      [-2, -9],\n      [-7, -8],\n      [-7, -30],\n      [2, -51],\n      [-3, -13],\n      [-6, -6],\n      [-9, -44],\n      [-13, -31],\n      [-8, -25],\n      [4, -27],\n      [-5, -10],\n      [-12, -7],\n      [-13, -20],\n      [0, -21],\n      [-17, 1],\n      [-11, -3],\n      [0, 18],\n      [-7, -5],\n      [2, -13],\n      [-22, -7],\n      [10, 7],\n      [-9, 3],\n      [-8, -7],\n      [-2, 7],\n      [-9, -7],\n      [1, -17],\n      [-10, -3],\n      [-2, -6],\n      [-10, -7],\n      [-1, -11],\n      [-12, 4],\n      [-8, -7],\n      [-1, -7],\n      [-11, -6],\n      [-11, -13],\n      [-5, -12],\n      [-10, -9],\n      [-10, -15],\n      [-1, -15],\n      [-8, -7],\n      [-6, 4],\n      [1, -17],\n      [-4, -17],\n      [-1, -19],\n      [-5, -6],\n      [4, -6],\n      [-3, -16],\n      [3, -6],\n      [2, -32],\n      [-2, -52],\n      [-4, -17],\n      [-17, -23],\n      [-5, -12],\n      [-14, -39],\n      [-8, -37],\n      [-10, -34],\n      [-12, -25],\n      [-22, -27],\n      [-3, -9],\n      [0, 17],\n      [5, -4],\n      [11, 20],\n      [5, 3],\n      [4, 11],\n      [-1, 12],\n      [5, 1],\n      [0, 10],\n      [9, 9],\n      [-1, 22],\n      [4, -6],\n      [1, 12],\n      [-12, -4],\n      [-9, 8],\n      [3, -7],\n      [-6, -21],\n      [-1, -24],\n      [-6, -10],\n      [-9, -4],\n      [-3, -21],\n      [-4, -3],\n      [-1, -14],\n      [5, -10],\n      [-5, -7],\n      [-6, -30],\n      [-7, -26],\n      [-18, -28]\n    ],\n    [\n      [3517, 3240],\n      [-4, 10]\n    ],\n    [\n      [3513, 3250],\n      [2, 1],\n      [1, 23],\n      [5, 4],\n      [2, 13],\n      [5, 6],\n      [5, -10],\n      [6, 18],\n      [-4, 16],\n      [-12, -19]\n    ],\n    [\n      [3523, 3302],\n      [-11, 11],\n      [-5, 23],\n      [-15, 14],\n      [-9, 21],\n      [-8, 3],\n      [-4, 8],\n      [-7, 3],\n      [-2, 10],\n      [-8, 11],\n      [-6, -13],\n      [-4, 0],\n      [0, 16],\n      [-23, 40],\n      [-7, 0],\n      [-2, -8],\n      [-11, -2],\n      [-2, 6]\n    ],\n    [\n      [3483, 3710],\n      [0, 8]\n    ],\n    [\n      [3483, 3718],\n      [5, 3],\n      [0, 26],\n      [4, 16],\n      [0, 34]\n    ],\n    [\n      [3492, 3797],\n      [-9, 15],\n      [-10, -10],\n      [-13, 1],\n      [-3, 21],\n      [1, 11],\n      [-4, 23],\n      [1, 21],\n      [-7, 19],\n      [-9, 1],\n      [-6, 12],\n      [-12, -10],\n      [-31, 8],\n      [0, 36],\n      [3, 16],\n      [-9, 61]\n    ],\n    [\n      [3067, 4552],\n      [-11, 2],\n      [-7, -8],\n      [-12, 3],\n      [0, 41],\n      [1, 29],\n      [2, 20],\n      [-10, -14],\n      [-2, -7],\n      [-9, -11],\n      [-25, 0],\n      [-3, 27],\n      [-14, 7],\n      [-11, 0],\n      [7, 16],\n      [0, 8],\n      [-6, 17],\n      [-4, 2],\n      [-1, 11],\n      [-5, 6],\n      [-2, 15],\n      [-5, 9],\n      [2, 9],\n      [-8, 14],\n      [1, 11],\n      [7, 2],\n      [-3, 13],\n      [2, 13],\n      [11, 17],\n      [5, 3],\n      [1, 12],\n      [-3, 14],\n      [8, 24],\n      [1, 30],\n      [14, 14],\n      [14, 21],\n      [17, 5],\n      [10, 6],\n      [5, 11],\n      [9, 1],\n      [3, -6],\n      [10, -5],\n      [0, 5]\n    ],\n    [\n      [3056, 4939],\n      [6, 58],\n      [0, 9],\n      [5, 46],\n      [0, 10],\n      [5, 54],\n      [-4, 13],\n      [-2, 24],\n      [-13, 21],\n      [1, 42],\n      [12, 4],\n      [3, 5],\n      [10, -6],\n      [-2, 21],\n      [-4, 4],\n      [-14, 0],\n      [0, 37],\n      [8, 4],\n      [5, -3],\n      [34, 0],\n      [-1, 16],\n      [7, -15],\n      [5, 4],\n      [9, 19],\n      [4, -5],\n      [7, -29],\n      [-1, -21],\n      [6, 2]\n    ],\n    [\n      [3142, 5253],\n      [11, -21],\n      [10, -7],\n      [10, 14],\n      [6, -1],\n      [-1, -17],\n      [11, 17],\n      [1, 10],\n      [11, 6],\n      [10, 16],\n      [0, -8],\n      [9, 16],\n      [0, 14],\n      [19, 16],\n      [1, 14],\n      [-20, 4],\n      [2, 15],\n      [-6, 20],\n      [0, 30],\n      [-13, 22],\n      [-4, 12],\n      [2, 5],\n      [4, -10],\n      [12, 0],\n      [4, -14],\n      [10, 4],\n      [4, -5],\n      [4, 7],\n      [4, -5],\n      [7, -18],\n      [7, 5],\n      [-1, 20],\n      [6, 1],\n      [4, 9],\n      [7, -6],\n      [18, 12],\n      [0, 6],\n      [16, 10],\n      [10, 22],\n      [-2, 13],\n      [-3, 1]\n    ],\n    [\n      [3312, 5482],\n      [11, 0],\n      [3, 4],\n      [8, -12],\n      [-3, -33],\n      [6, 0],\n      [5, -8],\n      [-2, -8],\n      [4, -14],\n      [0, -10],\n      [-7, -12],\n      [1, -13],\n      [-4, -17],\n      [-1, -22],\n      [2, -17],\n      [5, -5],\n      [0, -26],\n      [6, -8],\n      [8, -19],\n      [8, -4],\n      [4, -7],\n      [8, 5],\n      [0, 10],\n      [5, 9],\n      [9, -5],\n      [6, 11],\n      [7, 0],\n      [3, 11],\n      [9, 7],\n      [9, -8],\n      [9, 4]\n    ],\n    [\n      [3347, 5935],\n      [-4, 3],\n      [0, 13],\n      [6, -10],\n      [-2, -6]\n    ],\n    [\n      [8198, 5465],\n      [5, -34],\n      [-7, 5],\n      [-2, 24]\n    ],\n    [\n      [8194, 5460],\n      [4, 5]\n    ],\n    [\n      [8166, 5448],\n      [6, -1],\n      [7, 5],\n      [7, 12],\n      [9, 10],\n      [-2, -10]\n    ],\n    [\n      [8193, 5464],\n      [-7, -9],\n      [2, -17],\n      [0, -14],\n      [-7, -10],\n      [-7, 23],\n      [-8, 11]\n    ],\n    [\n      [7545, 6781],\n      [-2, -8],\n      [5, -11],\n      [6, 3],\n      [3, -10],\n      [-3, -11],\n      [3, -13],\n      [-5, -4],\n      [-33, -3],\n      [-10, 8],\n      [-6, -9],\n      [-11, -3],\n      [-12, 9],\n      [-6, -2],\n      [-7, 7],\n      [-3, 12],\n      [4, 10]\n    ],\n    [\n      [7468, 6756],\n      [3, 13],\n      [13, 29],\n      [11, 14],\n      [12, 3],\n      [0, -5],\n      [9, -1],\n      [-4, -10],\n      [18, -5],\n      [5, 6],\n      [10, -8],\n      [0, -11]\n    ],\n    [\n      [5701, 4158],\n      [-1, -8],\n      [8, -27],\n      [7, -13],\n      [6, -21],\n      [4, -29],\n      [8, -13],\n      [14, -17],\n      [7, -3],\n      [3, -9],\n      [0, -15],\n      [12, -1],\n      [-1, -34],\n      [6, -12],\n      [3, -15],\n      [18, -5],\n      [12, -10],\n      [1, -14],\n      [7, -7]\n    ],\n    [\n      [5815, 3905],\n      [-9, -3],\n      [-3, -13],\n      [-8, -7],\n      [-12, -4],\n      [-12, -27],\n      [-5, -6],\n      [-2, -10],\n      [-11, -7],\n      [-4, -13],\n      [-5, -31],\n      [-8, -10],\n      [-3, -10],\n      [-15, -6],\n      [0, -10],\n      [-8, -41],\n      [-5, -7],\n      [-10, 1],\n      [-4, -5],\n      [-17, 5],\n      [-10, 6],\n      [-13, 20],\n      [-7, 1],\n      [-7, -5],\n      [-6, -23],\n      [0, -14],\n      [-6, -13],\n      [-8, -7],\n      [-6, -18],\n      [-7, -2],\n      [-2, -10],\n      [-15, 0],\n      [-15, 4],\n      [0, 21],\n      [5, 11],\n      [0, 19],\n      [-4, 13],\n      [-1, 14],\n      [-10, 29],\n      [-8, 10]\n    ],\n    [\n      [5554, 3757],\n      [0, 159],\n      [28, 0],\n      [0, 212],\n      [23, 4],\n      [21, 9],\n      [21, 5],\n      [9, -27],\n      [15, 26],\n      [7, 4],\n      [4, -6],\n      [7, 13],\n      [12, 2]\n    ],\n    [\n      [5634, 5812],\n      [4, -14],\n      [8, -14],\n      [10, -31],\n      [1, -16],\n      [-1, -21],\n      [-5, -6],\n      [3, -9],\n      [-2, -17],\n      [19, -1]\n    ],\n    [\n      [5671, 5683],\n      [2, -7],\n      [-4, -11],\n      [3, -6],\n      [16, -5],\n      [8, -17],\n      [5, -3],\n      [1, -11],\n      [-4, -4],\n      [6, -14],\n      [18, -19],\n      [2, -10],\n      [8, -10],\n      [-2, -16],\n      [8, -21],\n      [6, -2],\n      [13, -23],\n      [-1, -15],\n      [6, -14]\n    ],\n    [\n      [5762, 5475],\n      [-12, 7],\n      [-4, -8],\n      [-10, -1],\n      [-12, 12],\n      [-6, -3],\n      [-11, 9],\n      [-4, -5],\n      [0, -13],\n      [-18, -7],\n      [-5, 11],\n      [-6, -10],\n      [-27, -19],\n      [-12, 12],\n      [-9, -34],\n      [-3, -5],\n      [-23, 9],\n      [-2, -3],\n      [-20, 12],\n      [-7, -2],\n      [-6, 20],\n      [-13, 14],\n      [-3, 7],\n      [-10, 1],\n      [-17, -34],\n      [-1, -7],\n      [-6, -3],\n      [2, -12],\n      [-1, -27],\n      [1, -13]\n    ],\n    [\n      [5517, 5383],\n      [-4, 9],\n      [-11, -4],\n      [-16, 7],\n      [-8, -6],\n      [-15, -2],\n      [-4, -7],\n      [-3, -27],\n      [1, -7],\n      [-8, -34]\n    ],\n    [\n      [5449, 5312],\n      [-2, 8],\n      [0, 26],\n      [-4, 13],\n      [-5, 3],\n      [-15, 32],\n      [-6, 21],\n      [4, 1],\n      [-3, 14],\n      [-10, 19],\n      [-1, 31],\n      [-4, 6],\n      [2, 8],\n      [1, 27],\n      [-7, 10],\n      [10, 13],\n      [5, 24],\n      [3, 4],\n      [6, 30],\n      [6, 14]\n    ],\n    [\n      [5429, 5616],\n      [9, -4],\n      [7, 8],\n      [10, 5],\n      [4, 11],\n      [2, -12],\n      [5, -7],\n      [23, 26],\n      [7, -2],\n      [5, 4],\n      [15, 1],\n      [15, 36],\n      [-6, 7],\n      [0, 8],\n      [5, 5],\n      [17, 0],\n      [10, 7],\n      [9, -1],\n      [4, 12],\n      [8, 5],\n      [5, 19],\n      [13, 24],\n      [5, 4],\n      [3, 10],\n      [-1, 14],\n      [8, 5],\n      [0, 5],\n      [14, 9],\n      [9, -3]\n    ],\n    [\n      [2957, 7804],\n      [-12, -5],\n      [13, 16],\n      [-1, -11]\n    ],\n    [\n      [2699, 7829],\n      [2, -7],\n      [13, 9],\n      [3, -9],\n      [5, 9],\n      [9, -4],\n      [2, -11],\n      [-7, -12],\n      [-23, 15],\n      [-15, 6],\n      [11, 4]\n    ],\n    [\n      [2665, 7849],\n      [6, -2],\n      [-2, -11],\n      [-4, 13]\n    ],\n    [\n      [3319, 7889],\n      [6, -10],\n      [-2, -13],\n      [-7, -22],\n      [5, 3],\n      [-19, -34],\n      [10, 5],\n      [9, 11],\n      [-10, 0],\n      [12, 21],\n      [4, -8],\n      [11, 0],\n      [-7, -23],\n      [-16, -12],\n      [-6, 3],\n      [-13, -5],\n      [-5, 21],\n      [1, 13],\n      [6, 7],\n      [10, 30],\n      [7, 14],\n      [4, -1]\n    ],\n    [\n      [3221, 7879],\n      [6, -21],\n      [3, 6],\n      [12, -8],\n      [33, 3],\n      [3, -3],\n      [-17, -10],\n      [4, -13],\n      [-11, -3],\n      [-2, 12],\n      [-19, 2],\n      [-4, 11],\n      [-11, 0],\n      [2, 14],\n      [-9, -1],\n      [4, 16],\n      [7, 9],\n      [-1, -14]\n    ],\n    [\n      [3503, 7956],\n      [10, 3],\n      [-1, -7],\n      [-9, 4]\n    ],\n    [\n      [2562, 7993],\n      [-9, -6],\n      [0, 8],\n      [9, -2]\n    ],\n    [\n      [2924, 7774],\n      [20, 14],\n      [8, 11],\n      [6, 0],\n      [2, 17],\n      [7, 17],\n      [14, 11],\n      [5, 9],\n      [17, 17],\n      [5, -2],\n      [32, 22],\n      [14, 22],\n      [0, 4],\n      [14, 20],\n      [0, 5],\n      [16, 23],\n      [21, 20],\n      [44, 28],\n      [28, 8],\n      [18, -3],\n      [10, -5],\n      [11, -14],\n      [1, -8],\n      [-11, 8],\n      [11, -15],\n      [-4, -13],\n      [-11, -4],\n      [-1, -6],\n      [-18, -13],\n      [-16, 11],\n      [-3, -5],\n      [-11, 0],\n      [18, -11],\n      [9, -15],\n      [8, 9],\n      [12, 0],\n      [3, -6],\n      [-7, -14],\n      [-1, -10],\n      [-11, -13],\n      [16, 0],\n      [-3, -15],\n      [11, -32],\n      [20, -8],\n      [-8, -6],\n      [7, -7],\n      [10, 0],\n      [4, -9],\n      [5, 5],\n      [24, -6],\n      [10, 10],\n      [5, -15],\n      [7, 3],\n      [7, -12],\n      [-7, -5],\n      [14, -3],\n      [-1, -4],\n      [-18, -7],\n      [0, -3],\n      [-32, -21],\n      [-9, 4],\n      [-4, -9],\n      [-8, 1],\n      [1, -9],\n      [-11, 0],\n      [1, 10],\n      [-9, -5],\n      [-4, -8],\n      [2, -10],\n      [-6, -5],\n      [-8, -19],\n      [-9, -10],\n      [-6, 1],\n      [-9, -11],\n      [-5, 14],\n      [-9, 5],\n      [-1, 14],\n      [7, 29],\n      [21, 24],\n      [22, 18],\n      [1, -13],\n      [7, 8],\n      [20, 9],\n      [-34, 2],\n      [-5, -6],\n      [-4, 6],\n      [13, 15],\n      [-3, 9],\n      [-5, -12],\n      [-16, -9],\n      [-17, -16],\n      [-4, 4],\n      [-10, -10],\n      [-12, -1],\n      [-8, 6]\n    ],\n    [\n      [3134, 7784],\n      [-9, 6],\n      [1, 19]\n    ],\n    [\n      [3126, 7809],\n      [-10, 9]\n    ],\n    [\n      [3116, 7818],\n      [1, 1],\n      [-1, 74],\n      [-14, 17],\n      [-16, -11],\n      [-9, 17],\n      [-19, -37],\n      [-4, -23],\n      [-7, -12],\n      [1, -17],\n      [-12, -20],\n      [1, -11],\n      [-18, -5],\n      [-6, -16],\n      [-89, -1]\n    ],\n    [\n      [1546, 8044],\n      [6, -11],\n      [-14, 13],\n      [8, -2]\n    ],\n    [\n      [1479, 8054],\n      [4, -13],\n      [-7, 0],\n      [-4, 9],\n      [7, 4]\n    ],\n    [\n      [3218, 8058],\n      [33, -11],\n      [15, -14],\n      [11, -6],\n      [10, -14],\n      [-16, -6],\n      [-24, 11],\n      [-14, 9],\n      [-2, 9],\n      [-22, 16],\n      [9, 6]\n    ],\n    [\n      [1494, 8104],\n      [-11, -4],\n      [6, 9],\n      [5, -5]\n    ],\n    [\n      [1448, 8112],\n      [20, -17],\n      [22, -5],\n      [26, -13],\n      [5, -19],\n      [9, -12],\n      [4, -16],\n      [22, -13],\n      [10, -22],\n      [8, -25],\n      [-6, -6],\n      [-11, 3],\n      [-22, 14],\n      [-14, 12],\n      [9, 11],\n      [-18, -4],\n      [-9, 9],\n      [4, 11],\n      [-8, 0],\n      [-1, 10],\n      [-14, -3],\n      [0, 11],\n      [7, 3],\n      [-8, 5],\n      [-1, 10],\n      [-15, -2],\n      [-33, 43],\n      [-2, 7],\n      [16, 8]\n    ],\n    [\n      [3447, 8155],\n      [6, -8],\n      [7, 7],\n      [-5, -17],\n      [-12, 4],\n      [2, -12],\n      [7, -5],\n      [-28, -60],\n      [-3, -27],\n      [6, 13],\n      [13, 21],\n      [12, -13],\n      [7, 0],\n      [-17, -14],\n      [11, -17],\n      [15, 9],\n      [-2, -16],\n      [12, 1],\n      [8, 14],\n      [9, -8],\n      [5, 3],\n      [15, -10],\n      [-4, -13],\n      [-17, -15],\n      [10, 3],\n      [-3, -15],\n      [12, -7],\n      [3, 10],\n      [4, -6],\n      [7, 9],\n      [-5, -19],\n      [-11, -9],\n      [-7, 0],\n      [6, -14],\n      [-6, -9],\n      [8, -15],\n      [2, 13],\n      [6, 14],\n      [12, 6],\n      [-9, -18],\n      [-1, -22],\n      [8, 8],\n      [3, 14],\n      [5, -19],\n      [-5, -10],\n      [-2, -19],\n      [-5, -17],\n      [-6, 3],\n      [-10, -3],\n      [4, 26],\n      [-2, 5],\n      [-14, -23],\n      [-4, 1],\n      [8, 31],\n      [1, 14],\n      [-5, 15],\n      [-18, -29],\n      [-10, -9],\n      [0, -8],\n      [-8, -11],\n      [-9, -1],\n      [-9, 5],\n      [3, 7],\n      [11, 3],\n      [15, 28],\n      [-11, 3],\n      [-6, -12],\n      [-10, 12],\n      [-28, -4],\n      [-25, 3],\n      [-6, 4],\n      [-18, -6],\n      [-15, -2],\n      [-4, 17],\n      [27, 37],\n      [-9, 3],\n      [-14, -6],\n      [8, 9],\n      [6, -3],\n      [9, 33],\n      [10, -9],\n      [-2, 9],\n      [8, 4],\n      [-11, 4],\n      [25, 78],\n      [8, 11],\n      [8, 28],\n      [24, 18]\n    ],\n    [\n      [1448, 8147],\n      [-7, 0],\n      [2, 14],\n      [5, -14]\n    ],\n    [\n      [1445, 8181],\n      [-2, -17],\n      [-4, 14],\n      [6, 3]\n    ],\n    [\n      [2798, 8181],\n      [-3, -7],\n      [-8, 3],\n      [11, 4]\n    ],\n    [\n      [1462, 8192],\n      [-15, -17],\n      [2, 14],\n      [17, 12],\n      [-4, -9]\n    ],\n    [\n      [1430, 8212],\n      [1, -9],\n      [-8, 2],\n      [7, 7]\n    ],\n    [\n      [2738, 8248],\n      [8, -1],\n      [10, -15],\n      [3, -12],\n      [-10, 1],\n      [-29, 15],\n      [6, 10],\n      [12, 2]\n    ],\n    [\n      [1339, 8249],\n      [4, -12],\n      [-6, -9],\n      [6, -21],\n      [17, -18],\n      [-5, -5],\n      [-20, 26],\n      [-16, 32],\n      [20, 7]\n    ],\n    [\n      [1427, 8244],\n      [3, -10],\n      [-2, -21],\n      [-14, 7],\n      [-3, 12],\n      [2, 20],\n      [14, -8]\n    ],\n    [\n      [1419, 8255],\n      [-7, 1],\n      [4, 10],\n      [3, -11]\n    ],\n    [\n      [1382, 8268],\n      [9, -8],\n      [5, -15],\n      [-7, 0],\n      [-15, 26],\n      [8, -3]\n    ],\n    [\n      [1386, 8270],\n      [-9, 4],\n      [2, 6],\n      [7, -10]\n    ],\n    [\n      [1395, 8273],\n      [11, -17],\n      [-5, -9],\n      [-21, 36],\n      [3, 5],\n      [12, -15]\n    ],\n    [\n      [1380, 8293],\n      [-2, -10],\n      [-7, 7],\n      [9, 3]\n    ],\n    [\n      [1305, 8302],\n      [20, -3],\n      [5, -14],\n      [-15, -10],\n      [13, -2],\n      [2, 21],\n      [12, 6],\n      [-8, -28],\n      [0, -22],\n      [-13, -7],\n      [-9, 10],\n      [7, 6],\n      [-11, 3],\n      [-7, 25],\n      [4, 15]\n    ],\n    [\n      [2815, 8428],\n      [-1, -10],\n      [-7, -3],\n      [4, 17],\n      [4, -4]\n    ],\n    [\n      [2787, 8429],\n      [-11, -11],\n      [1, 8],\n      [10, 3]\n    ],\n    [\n      [2801, 8446],\n      [-3, -6],\n      [9, -8],\n      [-12, -27],\n      [-8, -3],\n      [2, 12],\n      [-9, -16],\n      [-3, 4],\n      [14, 23],\n      [3, -5],\n      [3, 26],\n      [4, 0]\n    ],\n    [\n      [3293, 8462],\n      [1, -19],\n      [-7, 7],\n      [6, 12]\n    ],\n    [\n      [3204, 8666],\n      [5, -10],\n      [-11, 7],\n      [6, 3]\n    ],\n    [\n      [3109, 8672],\n      [7, -7],\n      [-4, -10],\n      [-10, -6],\n      [-3, 7],\n      [5, 16],\n      [5, 0]\n    ],\n    [\n      [3200, 8731],\n      [-2, -16],\n      [-16, 19],\n      [18, -3]\n    ],\n    [\n      [2793, 8775],\n      [5, -7],\n      [-8, -30],\n      [-8, -9],\n      [-10, 11],\n      [-2, 14],\n      [12, 23],\n      [11, -2]\n    ],\n    [\n      [3203, 8784],\n      [8, 0],\n      [-6, -10],\n      [-9, 3],\n      [7, 7]\n    ],\n    [\n      [3033, 8802],\n      [15, -11],\n      [0, -7],\n      [-13, 1],\n      [-7, 15],\n      [5, 2]\n    ],\n    [\n      [2719, 8809],\n      [7, -3],\n      [-2, -12],\n      [-27, -27],\n      [-23, -5],\n      [-6, 18],\n      [18, 27],\n      [8, -5],\n      [9, 6],\n      [16, 1]\n    ],\n    [\n      [2822, 8839],\n      [21, -4],\n      [4, -9],\n      [-13, -10],\n      [-16, 17],\n      [4, 6]\n    ],\n    [\n      [3216, 8833],\n      [-8, 14],\n      [5, 2],\n      [3, -16]\n    ],\n    [\n      [2857, 8849],\n      [12, -6],\n      [0, -11],\n      [-20, 14],\n      [8, 3]\n    ],\n    [\n      [3204, 8862],\n      [4, -12],\n      [-12, 8],\n      [8, 4]\n    ],\n    [\n      [3186, 8910],\n      [2, -6],\n      [-13, -6],\n      [11, 12]\n    ],\n    [\n      [2625, 8972],\n      [12, -9],\n      [-7, -5],\n      [11, -20],\n      [9, 16],\n      [14, -17],\n      [20, -4],\n      [4, -10],\n      [19, -12],\n      [5, 2],\n      [16, -14],\n      [5, -23],\n      [19, -8],\n      [-1, 8],\n      [22, -21],\n      [-8, -2],\n      [-19, -16],\n      [-26, 14],\n      [-12, -1],\n      [-1, 17],\n      [-15, -1],\n      [2, 13],\n      [-19, -10],\n      [2, -14],\n      [-19, -8],\n      [-9, -19],\n      [-25, -10],\n      [-5, 33],\n      [-27, -2],\n      [-14, -5],\n      [8, 20],\n      [20, 13],\n      [-6, 24],\n      [6, 15],\n      [0, 28],\n      [5, 23],\n      [13, 12],\n      [1, -7]\n    ],\n    [\n      [2638, 8984],\n      [9, -10],\n      [0, -16],\n      [-12, 13],\n      [3, 13]\n    ],\n    [\n      [2657, 8990],\n      [18, -11],\n      [-3, -6],\n      [15, -10],\n      [-15, 2],\n      [-15, 25]\n    ],\n    [\n      [2936, 9103],\n      [24, -5],\n      [1, -12],\n      [-28, 0],\n      [-10, 16],\n      [13, 1]\n    ],\n    [\n      [2601, 9095],\n      [-7, -12],\n      [-8, 5],\n      [-3, 16],\n      [9, 13],\n      [7, -6],\n      [2, -16]\n    ],\n    [\n      [2900, 9117],\n      [16, -9],\n      [-4, -11],\n      [3, -24],\n      [-9, -11],\n      [-14, -6],\n      [-31, -1],\n      [-7, 12],\n      [0, 22],\n      [15, 25],\n      [31, 3]\n    ],\n    [\n      [2096, 9122],\n      [-15, 8],\n      [14, 1],\n      [1, -9]\n    ],\n    [\n      [2919, 9131],\n      [3, -14],\n      [-16, 10],\n      [2, 12],\n      [11, -8]\n    ],\n    [\n      [2173, 9144],\n      [-3, -12],\n      [-12, 5],\n      [15, 7]\n    ],\n    [\n      [2218, 9152],\n      [-13, -10],\n      [2, 17],\n      [11, -7]\n    ],\n    [\n      [2820, 9179],\n      [-10, -28],\n      [-16, -3],\n      [26, 31]\n    ],\n    [\n      [2860, 9180],\n      [10, -6],\n      [-13, -11],\n      [-6, 16],\n      [9, 1]\n    ],\n    [\n      [2315, 9189],\n      [14, 0],\n      [-4, -11],\n      [-10, 11]\n    ],\n    [\n      [2342, 9191],\n      [8, -12],\n      [-14, -3],\n      [6, 15]\n    ],\n    [\n      [3114, 9197],\n      [-2, -10],\n      [-10, 3],\n      [12, 7]\n    ],\n    [\n      [2834, 9196],\n      [-16, -12],\n      [-9, 1],\n      [20, 15],\n      [5, -4]\n    ],\n    [\n      [2787, 9204],\n      [9, -8],\n      [-21, -3],\n      [4, -8],\n      [-24, 10],\n      [16, 8],\n      [16, 1]\n    ],\n    [\n      [2294, 9191],\n      [5, 5],\n      [10, -12],\n      [22, -14],\n      [6, -20],\n      [18, -3],\n      [-17, -6],\n      [-13, -15],\n      [-33, 4],\n      [-9, 7],\n      [-25, 7],\n      [-3, 8],\n      [-11, -6],\n      [-11, 11],\n      [33, 17],\n      [-4, 16],\n      [12, -9],\n      [-6, 16],\n      [10, 11],\n      [18, -11],\n      [-2, -6]\n    ],\n    [\n      [3004, 9275],\n      [14, -3],\n      [-20, -12],\n      [-5, 8],\n      [11, 7]\n    ],\n    [\n      [2924, 7774],\n      [-11, -4],\n      [-19, -25]\n    ],\n    [\n      [2894, 7745],\n      [-6, -7],\n      [-19, -10],\n      [-11, -18],\n      [-17, 9],\n      [-5, -3],\n      [-30, -8],\n      [-17, -15],\n      [-5, -17],\n      [13, -6],\n      [7, 4]\n    ],\n    [\n      [2804, 7674],\n      [-1, -9]\n    ],\n    [\n      [2803, 7665],\n      [5, -11],\n      [-36, -7],\n      [-9, -13],\n      [-11, 6],\n      [-12, -1],\n      [-32, -36],\n      [-12, -2],\n      [-5, 4],\n      [0, 12],\n      [5, 4],\n      [13, -1],\n      [1, 10],\n      [-6, 4]\n    ],\n    [\n      [2704, 7634],\n      [5, 9],\n      [1, 17]\n    ],\n    [\n      [2710, 7660],\n      [8, 4],\n      [12, 20],\n      [-1, 38],\n      [4, 14],\n      [9, 16],\n      [0, 12],\n      [-12, 25],\n      [11, 0],\n      [1, -14],\n      [14, -17],\n      [18, -14],\n      [0, 17],\n      [4, 6],\n      [6, -5],\n      [-9, 17],\n      [2, 14],\n      [-10, 3],\n      [-10, 32],\n      [-12, 0],\n      [-10, 8],\n      [-39, 6],\n      [-3, 0],\n      [-30, 10]\n    ],\n    [\n      [2663, 7852],\n      [0, 10],\n      [-10, -4]\n    ],\n    [\n      [2653, 7858],\n      [-3, 4],\n      [4, 24],\n      [-8, 1],\n      [3, 23],\n      [-11, 14],\n      [5, 20],\n      [-25, 0],\n      [-8, 9],\n      [-12, 39],\n      [-22, -2],\n      [-24, 14],\n      [-2, -22],\n      [-7, -2],\n      [3, 15],\n      [-6, -2],\n      [-5, -26],\n      [-5, -3],\n      [3, 16],\n      [-10, -5],\n      [-5, -22],\n      [-7, -6]\n    ],\n    [\n      [2511, 7947],\n      [-9, -1],\n      [-4, 7],\n      [-20, 0],\n      [-2, 7],\n      [-16, -11],\n      [-8, 4],\n      [-10, 14],\n      [-8, -7],\n      [-3, 12],\n      [-14, 11],\n      [-22, -6],\n      [-3, 7],\n      [-17, 3],\n      [-6, 5],\n      [-4, 31],\n      [-9, 3],\n      [0, -22],\n      [-79, 0],\n      [-80, 0],\n      [-55, 0],\n      [-79, 0],\n      [-79, 0],\n      [-49, 0],\n      [-49, 0],\n      [-80, 0],\n      [-61, 0],\n      [-74, 0],\n      [-81, 0]\n    ],\n    [\n      [1590, 8004],\n      [-8, 0]\n    ],\n    [\n      [1582, 8004],\n      [-1, 0]\n    ],\n    [\n      [1581, 8004],\n      [-7, 20],\n      [2, 14],\n      [-8, -11],\n      [-12, 8],\n      [-1, 15],\n      [-14, 0],\n      [-6, 8],\n      [3, 18],\n      [-3, 5],\n      [-9, 0],\n      [-20, 12],\n      [-13, -2],\n      [6, 17],\n      [-14, 1],\n      [-10, 6],\n      [-4, -6],\n      [-14, 11],\n      [-8, 12],\n      [9, 23],\n      [13, 3],\n      [-9, 3],\n      [-10, -15],\n      [-4, 12],\n      [0, 14],\n      [19, 25],\n      [0, 13],\n      [-12, -16],\n      [-7, -5],\n      [-8, 17],\n      [-4, -12],\n      [4, 26],\n      [-10, 9],\n      [-10, 34],\n      [10, -5],\n      [-8, 12],\n      [5, 21],\n      [-17, -20],\n      [-3, -14],\n      [-21, 32],\n      [-4, 26],\n      [-6, -3],\n      [1, 17],\n      [7, 4],\n      [10, 33],\n      [-5, 0],\n      [-4, 28],\n      [2, 8]\n    ],\n    [\n      [1387, 8402],\n      [0, 0]\n    ],\n    [\n      [1387, 8402],\n      [-1, 12],\n      [-9, 1],\n      [-9, 13],\n      [-10, 3],\n      [-14, 11],\n      [-7, 0],\n      [0, 11],\n      [-7, 4],\n      [2, 10],\n      [-29, 56],\n      [-20, 40],\n      [-12, 8],\n      [-4, 12],\n      [-21, 22],\n      [3, 8],\n      [-13, 13],\n      [-25, -11],\n      [-2, -20],\n      [-27, -20],\n      [-5, 17],\n      [-43, 50],\n      [3, 16],\n      [-17, -1],\n      [-9, -8],\n      [-12, 6],\n      [-16, 1],\n      [0, 538]\n    ],\n    [\n      [1083, 9194],\n      [29, -2],\n      [23, -6],\n      [15, -16],\n      [50, -21],\n      [26, 2],\n      [-3, 18],\n      [20, 5],\n      [-1, 8],\n      [29, 8],\n      [12, -5],\n      [-9, -9],\n      [24, 4],\n      [10, 14],\n      [16, 0],\n      [45, 28],\n      [22, -4],\n      [5, 11],\n      [9, -11],\n      [-45, -25],\n      [-27, -6],\n      [-3, -10],\n      [-18, -6],\n      [-4, -15],\n      [-9, 3],\n      [-4, -11],\n      [24, -3],\n      [-11, 15],\n      [29, 13],\n      [15, 12],\n      [12, -9],\n      [14, 21],\n      [35, 9],\n      [0, -10],\n      [23, 16],\n      [-2, 9],\n      [22, 7],\n      [-13, 3],\n      [0, 17],\n      [23, -16],\n      [14, -32],\n      [15, -16],\n      [20, -9],\n      [9, 4],\n      [-8, 12],\n      [10, 9],\n      [8, 18],\n      [10, -1],\n      [-2, -19],\n      [12, 0],\n      [-13, -19],\n      [24, -2],\n      [14, 8],\n      [6, 20],\n      [36, -3],\n      [23, -10],\n      [23, -16],\n      [31, -5],\n      [23, -13],\n      [57, -13],\n      [-9, 8],\n      [11, 4],\n      [38, -17],\n      [18, -18],\n      [-3, -9],\n      [-26, 2],\n      [-8, -18],\n      [-9, -3],\n      [47, -13],\n      [40, -1],\n      [3, 4],\n      [36, 1],\n      [22, 14],\n      [13, -16],\n      [18, 0],\n      [7, -21],\n      [6, 15],\n      [20, -23],\n      [-7, -21],\n      [25, -29],\n      [-12, 23],\n      [1, 18],\n      [16, -14],\n      [-4, 15],\n      [-9, 8],\n      [0, 15],\n      [-12, 12],\n      [7, 19],\n      [35, 18],\n      [21, 5],\n      [1, 13],\n      [-24, -7],\n      [2, -8],\n      [-22, -7],\n      [-16, 5],\n      [7, -11],\n      [-22, -3],\n      [-2, 12],\n      [-10, -3],\n      [14, 20],\n      [27, 5],\n      [31, 14],\n      [12, -3],\n      [9, -11],\n      [4, -20],\n      [19, -6],\n      [4, -12],\n      [20, -1],\n      [9, 8],\n      [5, -11],\n      [27, -14],\n      [21, -3],\n      [23, 10],\n      [26, -1],\n      [15, -7],\n      [25, 5],\n      [22, -12],\n      [12, 11],\n      [-16, 12],\n      [-10, -9],\n      [-10, 10],\n      [3, 9],\n      [-11, 11],\n      [27, 1],\n      [-8, 9],\n      [21, -3],\n      [5, -12],\n      [18, 3],\n      [-11, -15],\n      [26, 12],\n      [-16, -41],\n      [11, -19],\n      [10, 8],\n      [11, -20],\n      [4, 16],\n      [-15, 26],\n      [7, 19],\n      [17, -3],\n      [18, 14],\n      [18, 33],\n      [-10, 8],\n      [-5, -13],\n      [-15, 0],\n      [11, 34],\n      [18, -2],\n      [2, 13],\n      [-22, -5],\n      [-9, 14],\n      [-7, -7],\n      [-25, 10],\n      [-21, 22],\n      [1, 14],\n      [9, 15],\n      [-12, 9],\n      [5, 30],\n      [14, 6],\n      [8, -7],\n      [5, 12],\n      [-13, 4],\n      [18, 9],\n      [2, 13],\n      [18, 3],\n      [4, -19],\n      [7, 7],\n      [32, -24],\n      [4, -30],\n      [37, -41],\n      [-25, 2],\n      [-4, -6],\n      [18, -3],\n      [-25, -18],\n      [20, -9],\n      [18, 7],\n      [10, -9],\n      [19, -1],\n      [-23, -12],\n      [14, -11],\n      [6, -20],\n      [-2, -17],\n      [9, -12],\n      [11, 12],\n      [4, 31],\n      [11, 15],\n      [9, 1],\n      [28, -27],\n      [5, -32],\n      [-16, 2],\n      [1, -19],\n      [8, -19],\n      [17, -15],\n      [-1, -14],\n      [15, 7],\n      [-3, 7],\n      [14, -1],\n      [1, 20],\n      [17, 23],\n      [7, 37],\n      [25, 0],\n      [-10, 13],\n      [11, 7],\n      [-20, 11],\n      [-2, 10],\n      [6, 23],\n      [7, -4],\n      [20, 5],\n      [16, -9],\n      [30, -1],\n      [15, -23],\n      [22, -5],\n      [-6, -12],\n      [-12, -5],\n      [20, -5],\n      [1, -10],\n      [-20, -13],\n      [-17, 6],\n      [-2, -7],\n      [18, -11],\n      [-5, -13],\n      [26, -30],\n      [-7, -27],\n      [-13, -1],\n      [-17, -24],\n      [-12, -1],\n      [-10, -11],\n      [-25, 21],\n      [16, -30],\n      [-4, -2],\n      [-19, 14],\n      [4, -14],\n      [-25, 7],\n      [-5, 17],\n      [-19, -5],\n      [-18, 2],\n      [7, -12],\n      [19, -9],\n      [-16, -15],\n      [-3, -13],\n      [-23, -20],\n      [-16, 0],\n      [-17, 15],\n      [-31, 20],\n      [-10, -3],\n      [-30, 2],\n      [32, -7],\n      [14, -11],\n      [11, -16],\n      [56, -5],\n      [2, -11],\n      [-16, -20],\n      [-14, -27],\n      [-18, -15],\n      [-24, 1],\n      [-12, 10],\n      [4, -14],\n      [-10, -17],\n      [-21, -3],\n      [-19, 10],\n      [-14, 0],\n      [-37, 16],\n      [-8, -2],\n      [11, -10],\n      [4, 5],\n      [31, -11],\n      [-10, -11],\n      [18, 11],\n      [6, -8],\n      [25, -12],\n      [2, -18],\n      [-22, -16],\n      [-19, 5],\n      [-10, -3],\n      [15, -16],\n      [-19, 5],\n      [-2, -20],\n      [-8, -12],\n      [-18, -12],\n      [11, -4],\n      [-17, -12],\n      [-19, -60],\n      [-8, -31],\n      [3, -40],\n      [-3, -17],\n      [13, -17],\n      [3, 4],\n      [29, -1],\n      [2, -15],\n      [10, -37],\n      [9, -24],\n      [-3, -25],\n      [12, 2],\n      [30, 12],\n      [15, -3],\n      [15, -12],\n      [30, -8],\n      [12, -15],\n      [13, -10],\n      [7, -15],\n      [10, -12],\n      [11, -1],\n      [32, -17],\n      [21, -20],\n      [12, -3],\n      [19, 5],\n      [15, -6],\n      [12, 1],\n      [18, -9],\n      [3, -14],\n      [-6, -25],\n      [0, -12],\n      [8, -17],\n      [-2, -23],\n      [3, -13],\n      [-5, -19],\n      [20, -28],\n      [6, -21],\n      [10, -5],\n      [15, -30],\n      [1, -10],\n      [19, -11],\n      [1, 16],\n      [10, 15],\n      [11, -20],\n      [6, 11],\n      [-9, 15],\n      [13, 19],\n      [2, 22],\n      [-6, 4],\n      [1, 19],\n      [-5, 0],\n      [-5, 42],\n      [-2, 32],\n      [-7, 2],\n      [-6, 25],\n      [-5, 1],\n      [39, 22],\n      [16, 14],\n      [19, 23],\n      [12, 21],\n      [4, 16],\n      [0, 44],\n      [-8, 34],\n      [-9, 20],\n      [-24, 23],\n      [-13, 16],\n      [-2, 16],\n      [22, 21],\n      [-1, 20],\n      [14, 6],\n      [-1, 13],\n      [-7, 2],\n      [-7, 35],\n      [6, 6],\n      [-16, 2],\n      [10, 15],\n      [2, 20],\n      [6, 5],\n      [-13, 13],\n      [-4, 34],\n      [18, 16],\n      [21, -4],\n      [32, -14],\n      [34, -1],\n      [14, 12],\n      [18, -9],\n      [17, -14],\n      [-1, -8],\n      [30, -19],\n      [-9, -10],\n      [14, -16],\n      [23, -5],\n      [11, 2],\n      [2, -11],\n      [12, -1],\n      [2, 12],\n      [5, -18],\n      [-12, -15],\n      [6, -26],\n      [2, -26],\n      [-6, -6],\n      [3, -9],\n      [11, -2],\n      [-8, -8],\n      [2, -18],\n      [-19, -7],\n      [10, -3],\n      [15, 12],\n      [13, 1],\n      [11, -6],\n      [5, -24],\n      [7, 10],\n      [9, -20],\n      [28, 15],\n      [6, 21],\n      [10, -9],\n      [5, 18],\n      [7, 3],\n      [-2, 12],\n      [8, 8],\n      [-3, 22],\n      [8, 2],\n      [7, 25],\n      [14, 2],\n      [0, -12],\n      [9, -6],\n      [-1, -17],\n      [6, 0],\n      [5, -15],\n      [12, -13],\n      [-11, -9],\n      [13, 3],\n      [1, -13],\n      [7, 1],\n      [4, -11],\n      [-9, -11],\n      [16, 0],\n      [-2, -19],\n      [15, -12],\n      [7, -20],\n      [-14, -11],\n      [10, 2],\n      [6, -6],\n      [-6, -7],\n      [18, -7],\n      [-8, -18],\n      [-7, 0],\n      [5, -13],\n      [-9, -4],\n      [11, -10],\n      [-12, -2],\n      [5, -5],\n      [14, 1],\n      [-3, -13],\n      [10, -2],\n      [1, -7],\n      [22, -5],\n      [-4, -5],\n      [3, -16],\n      [-4, -16],\n      [20, 12],\n      [-2, -10],\n      [10, -5],\n      [10, 9],\n      [6, -22],\n      [30, -6],\n      [14, -10],\n      [-9, -11],\n      [-15, -1],\n      [-1, -6],\n      [-33, -12],\n      [21, 5],\n      [3, -3],\n      [-30, -15],\n      [-13, -3],\n      [2, -15],\n      [-11, -14],\n      [38, 24],\n      [6, 15],\n      [19, 9],\n      [-5, 7],\n      [24, -1],\n      [11, -22],\n      [-12, -11],\n      [6, -9],\n      [9, 15],\n      [30, -19],\n      [4, -15],\n      [-6, -7],\n      [5, -9],\n      [-7, -12],\n      [8, -9],\n      [4, -17],\n      [-8, -15],\n      [-20, -17],\n      [-10, -13],\n      [-8, 5],\n      [-25, -14],\n      [-8, 3],\n      [-7, -12],\n      [-8, -5],\n      [1, -12],\n      [-13, -8],\n      [0, -8],\n      [-11, -6],\n      [-3, -10],\n      [-38, -3],\n      [-10, -5],\n      [-6, 7],\n      [-51, 4],\n      [-26, -2],\n      [-37, 0],\n      [-5, -5],\n      [-8, 5],\n      [-19, -25],\n      [-3, -23],\n      [-4, -6],\n      [-19, -3],\n      [-4, -11],\n      [-24, -18],\n      [-10, -28],\n      [-7, -9],\n      [-19, 14],\n      [-5, -2],\n      [22, -14],\n      [-5, -20],\n      [-10, -17],\n      [-6, -3],\n      [-6, -17],\n      [-17, -23],\n      [-15, -1],\n      [-21, -24],\n      [-10, -4],\n      [-7, -18],\n      [-12, -11],\n      [-7, -11],\n      [-6, -2],\n      [5, -8],\n      [-15, -12],\n      [-6, -8]\n    ],\n    [\n      [1827, 9404],\n      [6, -29],\n      [-17, -11],\n      [32, 3],\n      [-4, 6],\n      [17, 15],\n      [49, -17],\n      [-3, -15],\n      [17, 6],\n      [18, -8],\n      [8, 4],\n      [-26, 29],\n      [23, -2],\n      [24, -23],\n      [11, -1],\n      [-1, -11],\n      [13, -38],\n      [6, -4],\n      [21, 15],\n      [-15, 14],\n      [-9, 45],\n      [0, 25],\n      [29, -10],\n      [8, 7],\n      [26, -17],\n      [18, -30],\n      [4, -24],\n      [19, -29],\n      [-7, -28],\n      [16, -17],\n      [25, -16],\n      [8, 1],\n      [35, -23],\n      [16, 4],\n      [4, -24],\n      [-13, -6],\n      [-4, 13],\n      [-5, -14],\n      [-19, 11],\n      [-14, -26],\n      [22, 5],\n      [-2, -17],\n      [9, -10],\n      [-19, -8],\n      [-24, -5],\n      [-49, 6],\n      [4, 12],\n      [-40, 5],\n      [-4, 18],\n      [-10, -16],\n      [-17, -13],\n      [-28, -6],\n      [-12, -9],\n      [-56, -11],\n      [-59, -3],\n      [-16, 19],\n      [2, 22],\n      [-18, 5],\n      [-26, -3],\n      [-22, 4],\n      [-18, 9],\n      [0, 6],\n      [-18, 12],\n      [-4, 14],\n      [39, 12],\n      [41, 5],\n      [53, -7],\n      [9, 7],\n      [22, -3],\n      [-18, 14],\n      [-19, 2],\n      [-18, 8],\n      [-58, -6],\n      [-19, 4],\n      [-40, -1],\n      [-19, 23],\n      [17, 8],\n      [41, 11],\n      [13, 11],\n      [-48, -10],\n      [-21, 6],\n      [13, 5],\n      [-36, 7],\n      [0, 11],\n      [16, 17],\n      [13, 3],\n      [-13, 15],\n      [34, 25],\n      [50, 16],\n      [27, 11],\n      [10, -5]\n    ],\n    [\n      [2094, 9405],\n      [-16, -22],\n      [-8, 1],\n      [-18, 19],\n      [-26, 12],\n      [13, 13],\n      [42, 1],\n      [16, -10],\n      [-3, -14]\n    ],\n    [\n      [2768, 9430],\n      [25, -7],\n      [37, 2],\n      [19, -6],\n      [32, -26],\n      [-1, -17],\n      [-52, 5],\n      [-28, -9],\n      [-22, 6],\n      [-4, 22],\n      [-21, 5],\n      [1, 25],\n      [14, 0]\n    ],\n    [\n      [2595, 9436],\n      [41, -3],\n      [4, -8],\n      [-30, -21],\n      [-18, -26],\n      [10, -20],\n      [-3, -28],\n      [9, -14],\n      [19, -16],\n      [14, -5],\n      [-16, -13],\n      [-13, 0],\n      [-8, -10],\n      [21, 10],\n      [18, -2],\n      [8, 17],\n      [-4, 14],\n      [-16, -1],\n      [-8, 13],\n      [2, 21],\n      [16, 1],\n      [-18, 12],\n      [-3, 25],\n      [14, 2],\n      [-6, 11],\n      [26, -5],\n      [-19, 15],\n      [63, 24],\n      [37, -1],\n      [11, -27],\n      [14, -5],\n      [0, -14],\n      [10, -10],\n      [-26, -24],\n      [18, 11],\n      [-11, -18],\n      [5, -13],\n      [12, 5],\n      [16, 25],\n      [23, -13],\n      [11, 14],\n      [26, 14],\n      [67, -15],\n      [7, -14],\n      [-14, -14],\n      [33, 4],\n      [0, -15],\n      [-32, -17],\n      [31, 12],\n      [19, -1],\n      [-10, -9],\n      [-4, -17],\n      [12, 19],\n      [3, -12],\n      [15, -7],\n      [13, 23],\n      [32, -12],\n      [8, -11],\n      [-10, -12],\n      [-11, 3],\n      [-13, -14],\n      [4, -6],\n      [25, 7],\n      [4, 9],\n      [15, 2],\n      [3, -9],\n      [-13, -17],\n      [30, 15],\n      [-3, -16],\n      [15, 10],\n      [31, -11],\n      [-10, -16],\n      [-31, -9],\n      [32, 3],\n      [-1, -16],\n      [12, 9],\n      [6, 14],\n      [24, -23],\n      [2, -12],\n      [-26, 3],\n      [-15, -11],\n      [19, -8],\n      [19, 1],\n      [16, -11],\n      [-2, -8],\n      [-26, 2],\n      [-15, 8],\n      [-22, 3],\n      [22, -8],\n      [13, -10],\n      [-8, -4],\n      [5, -11],\n      [-43, 2],\n      [33, -6],\n      [-9, -8],\n      [29, -2],\n      [23, -6],\n      [-10, -6],\n      [8, -11],\n      [37, -12],\n      [12, 7],\n      [-2, -12],\n      [18, -4],\n      [13, -28],\n      [-21, -10],\n      [47, 10],\n      [-7, -18],\n      [22, -5],\n      [5, 9],\n      [18, -10],\n      [10, -16],\n      [-20, -10],\n      [14, -3],\n      [-30, -8],\n      [14, -7],\n      [-7, -17],\n      [-15, -3],\n      [7, -7],\n      [-17, -1],\n      [-7, 16],\n      [3, -21],\n      [-9, -4],\n      [9, -9],\n      [-5, -24],\n      [-17, 9],\n      [-9, 14],\n      [-1, -9],\n      [-18, 16],\n      [-1, 14],\n      [-9, 5],\n      [19, 17],\n      [-31, -5],\n      [-2, 9],\n      [-22, 20],\n      [2, 8],\n      [-13, -6],\n      [-6, -11],\n      [-16, 12],\n      [7, -15],\n      [16, -12],\n      [-1, -7],\n      [-20, -1],\n      [-9, 18],\n      [-2, -18],\n      [12, -16],\n      [14, 3],\n      [-2, -10],\n      [10, -2],\n      [10, -39],\n      [1, 14],\n      [31, -16],\n      [-3, -16],\n      [17, 0],\n      [-10, -10],\n      [11, -14],\n      [11, -5],\n      [-9, -11],\n      [12, -6],\n      [0, -25],\n      [-7, 5],\n      [-4, 18],\n      [-2, -14],\n      [10, -29],\n      [-17, 5],\n      [8, -19],\n      [-7, -5],\n      [-1, 13],\n      [-12, 11],\n      [-12, -3],\n      [-13, 13],\n      [-5, -5],\n      [-20, 21],\n      [-6, 12],\n      [-1, -16],\n      [-27, 24],\n      [-8, -3],\n      [23, -33],\n      [17, -6],\n      [17, -21],\n      [5, 0],\n      [16, -26],\n      [7, -2],\n      [-9, -20],\n      [-30, 16],\n      [-35, 7],\n      [-12, 7],\n      [-25, 24],\n      [-9, -2],\n      [-38, 22],\n      [-5, 14],\n      [15, 10],\n      [-16, 12],\n      [-2, -7],\n      [-15, 9],\n      [-13, 14],\n      [-15, 33],\n      [-20, -9],\n      [4, 15],\n      [-14, -6],\n      [-5, -14],\n      [-30, 14],\n      [-5, -12],\n      [-24, -12],\n      [-14, 2],\n      [-18, 11],\n      [-4, 27],\n      [5, 9],\n      [18, 8],\n      [-3, 15],\n      [21, -2],\n      [25, -11],\n      [9, -9],\n      [-6, -7],\n      [10, -12],\n      [-2, 16],\n      [-16, 17],\n      [23, -3],\n      [1, 7],\n      [15, -3],\n      [11, 12],\n      [19, -5],\n      [-7, 19],\n      [-8, 4],\n      [-13, 18],\n      [41, 32],\n      [5, 19],\n      [15, 6],\n      [-4, 22],\n      [-12, 18],\n      [-4, 23],\n      [-23, 5],\n      [3, 18],\n      [-19, -6],\n      [-13, 16],\n      [2, 15],\n      [-9, -11],\n      [-10, 2],\n      [-32, -14],\n      [0, 20],\n      [28, 3],\n      [1, 9],\n      [-30, 19],\n      [-15, 5],\n      [10, 9],\n      [-23, 0],\n      [0, 21],\n      [-20, 2],\n      [-10, 12],\n      [-21, 2],\n      [21, -15],\n      [3, -13],\n      [-29, -7],\n      [-6, 8],\n      [-39, 3],\n      [15, -14],\n      [-9, -2],\n      [-14, 13],\n      [-15, -11],\n      [-25, 12],\n      [-15, -3],\n      [-31, 3],\n      [-5, 4],\n      [-39, 2],\n      [-21, 21],\n      [1, -11],\n      [-47, 11],\n      [-21, 25],\n      [9, 7],\n      [22, -4],\n      [27, 0],\n      [-15, 18],\n      [-6, -3],\n      [-47, 6],\n      [-5, 7],\n      [5, 17],\n      [-9, 11],\n      [5, 24],\n      [25, 52],\n      [36, 27],\n      [33, 8]\n    ],\n    [\n      [2227, 9438],\n      [17, -9],\n      [57, 6],\n      [4, -12],\n      [-12, -6],\n      [8, -7],\n      [-19, -7],\n      [-19, -16],\n      [35, -3],\n      [9, -16],\n      [12, 3],\n      [5, -18],\n      [-9, -6],\n      [3, -27],\n      [-25, -13],\n      [-26, 2],\n      [9, -8],\n      [-13, -13],\n      [-19, 3],\n      [-13, 25],\n      [-27, 24],\n      [-21, 3],\n      [-34, 24],\n      [-4, 9],\n      [14, 16],\n      [11, -4],\n      [16, -18],\n      [24, 2],\n      [10, 8],\n      [-4, 14],\n      [-11, 1],\n      [-28, 20],\n      [11, 7],\n      [16, -9],\n      [3, 8],\n      [-13, 12],\n      [33, 5]\n    ],\n    [\n      [2287, 9448],\n      [-13, -11],\n      [-23, -4],\n      [-12, 7],\n      [34, 10],\n      [14, -2]\n    ],\n    [\n      [2423, 9449],\n      [18, -8],\n      [8, 5],\n      [45, -7],\n      [-28, -33],\n      [-12, -21],\n      [-14, -14],\n      [-33, 4],\n      [-13, -4],\n      [10, -16],\n      [-18, -22],\n      [-29, -6],\n      [-2, 33],\n      [-11, 9],\n      [-2, 60],\n      [11, 2],\n      [1, 14],\n      [44, 9],\n      [25, -5]\n    ],\n    [\n      [1623, 9476],\n      [28, -12],\n      [41, -10],\n      [46, 4],\n      [58, -41],\n      [-3, -6],\n      [-28, -9],\n      [-76, -37],\n      [-3, -15],\n      [-14, -8],\n      [-13, 1],\n      [-3, -32],\n      [-7, -11],\n      [-22, -7],\n      [-9, 5],\n      [-11, -12],\n      [-27, -10],\n      [-26, 36],\n      [-34, 14],\n      [-14, 0],\n      [0, 10],\n      [14, 22],\n      [9, 4],\n      [-4, 18],\n      [17, 2],\n      [-12, 9],\n      [14, 21],\n      [16, 15],\n      [-10, 9],\n      [-14, 28],\n      [87, 12]\n    ],\n    [\n      [2118, 9518],\n      [-3, -12],\n      [-30, 4],\n      [15, 17],\n      [18, -9]\n    ],\n    [\n      [2378, 9537],\n      [25, -20],\n      [2, -24],\n      [-5, -11],\n      [-41, 1],\n      [-43, 18],\n      [23, 30],\n      [25, 8],\n      [14, -2]\n    ],\n    [\n      [2325, 9539],\n      [-16, -17],\n      [-5, 9],\n      [21, 8]\n    ],\n    [\n      [2164, 9558],\n      [-14, -12],\n      [-20, -1],\n      [7, 9],\n      [27, 4]\n    ],\n    [\n      [2380, 9546],\n      [-17, 10],\n      [11, 3],\n      [6, -13]\n    ],\n    [\n      [2157, 9563],\n      [-38, -10],\n      [11, 8],\n      [27, 2]\n    ],\n    [\n      [1732, 9567],\n      [5, -3],\n      [-22, -28],\n      [-10, -5],\n      [-22, 5],\n      [20, 18],\n      [29, 13]\n    ],\n    [\n      [2805, 9567],\n      [0, -15],\n      [-16, -3],\n      [16, 18]\n    ],\n    [\n      [2149, 9575],\n      [-6, -11],\n      [-43, 0],\n      [2, 8],\n      [47, 3]\n    ],\n    [\n      [2113, 9595],\n      [25, -12],\n      [-38, -5],\n      [-7, 16],\n      [20, 1]\n    ],\n    [\n      [2266, 9598],\n      [21, -11],\n      [7, -58],\n      [-18, 1],\n      [14, -20],\n      [-11, -7],\n      [-47, -3],\n      [-20, 3],\n      [-11, 19],\n      [33, 20],\n      [-52, -5],\n      [-33, -7],\n      [2, 14],\n      [20, 10],\n      [-6, 28],\n      [18, 3],\n      [35, -31],\n      [7, 21],\n      [-30, 12],\n      [15, 9],\n      [23, 0],\n      [13, -10],\n      [20, 12]\n    ],\n    [\n      [2213, 9601],\n      [-38, -8],\n      [20, 9],\n      [18, -1]\n    ],\n    [\n      [2508, 9589],\n      [-10, -2],\n      [-15, 15],\n      [17, 6],\n      [8, -19]\n    ],\n    [\n      [1981, 9607],\n      [-3, -11],\n      [20, -20],\n      [-11, -11],\n      [22, -7],\n      [-10, -10],\n      [27, 5],\n      [12, 10],\n      [31, -10],\n      [1, -18],\n      [-15, -30],\n      [-28, -8],\n      [-21, 7],\n      [-19, -7],\n      [-5, 8],\n      [-25, -11],\n      [-22, -4],\n      [-24, -12],\n      [-34, -10],\n      [-29, 0],\n      [-27, 17],\n      [52, 17],\n      [27, 0],\n      [19, 13],\n      [-36, -6],\n      [-3, 5],\n      [-44, -9],\n      [-5, 24],\n      [-10, -23],\n      [-35, -6],\n      [-55, 16],\n      [12, 13],\n      [30, 0],\n      [31, 14],\n      [-30, -8],\n      [-32, 0],\n      [10, 12],\n      [57, 5],\n      [-39, 0],\n      [-12, 12],\n      [23, 10],\n      [10, 12],\n      [36, 1],\n      [7, -17],\n      [28, 5],\n      [33, -21],\n      [14, -22],\n      [62, -1],\n      [6, 7],\n      [-32, 17],\n      [18, 11],\n      [-30, 11],\n      [18, 11],\n      [15, 19],\n      [15, 0]\n    ],\n    [\n      [1840, 9610],\n      [3, -10],\n      [-34, 3],\n      [31, 7]\n    ],\n    [\n      [2354, 9618],\n      [44, -6],\n      [16, -16],\n      [46, 3],\n      [26, -13],\n      [-26, 0],\n      [59, -9],\n      [-2, -7],\n      [-52, -1],\n      [30, -6],\n      [28, -18],\n      [2, -16],\n      [14, 11],\n      [11, -8],\n      [26, 6],\n      [13, -9],\n      [59, 10],\n      [21, 10],\n      [23, -5],\n      [16, 6],\n      [39, -3],\n      [40, -18],\n      [6, -11],\n      [-25, -15],\n      [16, 1],\n      [10, -9],\n      [-23, -7],\n      [-1, -11],\n      [-29, 0],\n      [-12, -6],\n      [-33, 5],\n      [-7, 16],\n      [-11, -16],\n      [-84, -5],\n      [-53, 2],\n      [2, 20],\n      [-21, -15],\n      [-21, -3],\n      [-30, 10],\n      [-10, -4],\n      [-19, 9],\n      [1, 10],\n      [-13, 14],\n      [11, 38],\n      [-14, 8],\n      [-14, 21],\n      [-17, -6],\n      [-37, -3],\n      [6, 7],\n      [-27, 3],\n      [-11, 14],\n      [-18, 4],\n      [15, 6],\n      [-15, 7],\n      [13, 6],\n      [32, -1]\n    ],\n    [\n      [1774, 9644],\n      [20, -9],\n      [-25, -7],\n      [-2, -15],\n      [13, -14],\n      [-30, -8],\n      [-9, -17],\n      [-20, 9],\n      [5, 24],\n      [-19, -6],\n      [-1, -22],\n      [-34, -26],\n      [-19, -3],\n      [-7, 19],\n      [-15, -12],\n      [-46, 8],\n      [9, 15],\n      [31, 5],\n      [9, 14],\n      [22, 7],\n      [15, 17],\n      [27, 15],\n      [26, 1],\n      [18, -6],\n      [32, 11]\n    ],\n    [\n      [2491, 9653],\n      [17, -10],\n      [-11, -14],\n      [-30, 11],\n      [0, 13],\n      [24, 0]\n    ],\n    [\n      [2083, 9641],\n      [18, -11],\n      [-11, -7],\n      [-23, 12],\n      [-14, 25],\n      [13, 0],\n      [17, -19]\n    ],\n    [\n      [2350, 9662],\n      [51, 0],\n      [13, -7],\n      [-11, -10],\n      [-70, 0],\n      [-6, 13],\n      [23, 4]\n    ],\n    [\n      [2196, 9660],\n      [-42, -1],\n      [0, 9],\n      [21, 1],\n      [21, -9]\n    ],\n    [\n      [1824, 9675],\n      [20, -11],\n      [-15, -6],\n      [-27, 14],\n      [22, 3]\n    ],\n    [\n      [1955, 9679],\n      [-35, -12],\n      [21, -5],\n      [-3, -16],\n      [-52, -10],\n      [-31, 11],\n      [3, 23],\n      [51, 10],\n      [46, -1]\n    ],\n    [\n      [1933, 9718],\n      [31, -15],\n      [-4, -11],\n      [-50, 5],\n      [-52, -7],\n      [-5, 8],\n      [40, 8],\n      [40, 12]\n    ],\n    [\n      [2308, 9715],\n      [18, -10],\n      [40, -9],\n      [-15, -7],\n      [9, -16],\n      [-51, -11],\n      [-22, 18],\n      [22, 2],\n      [-33, 10],\n      [-10, 12],\n      [7, 18],\n      [35, -7]\n    ],\n    [\n      [2120, 9752],\n      [22, -6],\n      [10, -21],\n      [25, 12],\n      [58, -29],\n      [-8, -16],\n      [22, -13],\n      [0, -11],\n      [-25, -6],\n      [-19, 5],\n      [-12, 19],\n      [-45, 10],\n      [-50, -6],\n      [-10, 18],\n      [38, -3],\n      [1, 15],\n      [-18, 11],\n      [-27, -9],\n      [10, 11],\n      [-26, 2],\n      [4, 16],\n      [50, 1]\n    ],\n    [\n      [2237, 9796],\n      [21, -8],\n      [-5, -17],\n      [-36, 22],\n      [20, 3]\n    ],\n    [\n      [2423, 9866],\n      [56, -44],\n      [40, -1],\n      [1, -15],\n      [22, 9],\n      [22, -2],\n      [19, -26],\n      [-9, -26],\n      [20, 9],\n      [23, -2],\n      [24, -19],\n      [-46, -14],\n      [-69, -50],\n      [-26, 25],\n      [15, -26],\n      [-24, 10],\n      [0, -11],\n      [-49, 4],\n      [-22, 17],\n      [34, 3],\n      [-45, 2],\n      [-28, 21],\n      [25, 12],\n      [79, 3],\n      [-58, 1],\n      [0, 12],\n      [-36, -11],\n      [-3, 7],\n      [-33, -6],\n      [-14, 15],\n      [27, 4],\n      [-31, 3],\n      [-21, 14],\n      [-4, 14],\n      [53, -6],\n      [21, 9],\n      [-36, -4],\n      [-32, 9],\n      [14, 17],\n      [41, 2],\n      [7, 8],\n      [-33, 3],\n      [17, 15],\n      [39, 0],\n      [7, 9],\n      [-28, 8],\n      [41, -2]\n    ],\n    [\n      [3064, 9969],\n      [92, -13],\n      [-63, -13],\n      [33, 0],\n      [64, 14],\n      [63, -22],\n      [36, -2],\n      [8, -17],\n      [-85, -27],\n      [-75, -6],\n      [11, -7],\n      [-78, -18],\n      [137, 21],\n      [-4, -9],\n      [-119, -45],\n      [-9, -11],\n      [-28, -4],\n      [-23, -32],\n      [-31, -8],\n      [-32, 7],\n      [7, -13],\n      [-52, -10],\n      [-85, -2],\n      [20, -4],\n      [80, -3],\n      [-1, -11],\n      [-35, 3],\n      [-9, 7],\n      [-57, -2],\n      [56, -5],\n      [-45, -3],\n      [55, -3],\n      [-14, -6],\n      [38, -1],\n      [8, -15],\n      [-22, -5],\n      [-30, 2],\n      [38, -10],\n      [-14, -14],\n      [-35, -13],\n      [-43, 0],\n      [19, -17],\n      [-14, -13],\n      [-47, -6],\n      [-38, 9],\n      [-17, 14],\n      [5, -14],\n      [18, -8],\n      [57, -7],\n      [-10, -14],\n      [19, -6],\n      [18, 11],\n      [7, -22],\n      [-21, -10],\n      [-5, 7],\n      [-22, -15],\n      [-42, -11],\n      [8, 17],\n      [-36, 5],\n      [-6, -7],\n      [-40, 2],\n      [-13, 10],\n      [-6, -17],\n      [-23, -1],\n      [-61, 10],\n      [-4, -7],\n      [-37, 4],\n      [-15, 10],\n      [-1, 17],\n      [33, 15],\n      [23, -1],\n      [15, 8],\n      [-21, 5],\n      [-15, 25],\n      [29, 7],\n      [27, -6],\n      [22, -23],\n      [54, -3],\n      [27, 35],\n      [-39, -27],\n      [-38, 10],\n      [15, 39],\n      [-21, -13],\n      [-21, 5],\n      [-35, -4],\n      [1, 19],\n      [24, 20],\n      [44, 7],\n      [35, -5],\n      [56, 1],\n      [-53, 4],\n      [-30, 6],\n      [11, 9],\n      [-23, 27],\n      [-37, 6],\n      [0, 32],\n      [75, -4],\n      [67, -35],\n      [-7, 16],\n      [-44, 23],\n      [80, 9],\n      [54, 8],\n      [-44, 0],\n      [94, 17],\n      [-62, -3],\n      [-2, 9],\n      [57, 26],\n      [-37, -9],\n      [-40, -28],\n      [-44, -11],\n      [-53, -5],\n      [27, 11],\n      [-48, 2],\n      [1, -13],\n      [-55, -1],\n      [-26, 5],\n      [26, 19],\n      [85, 11],\n      [-93, -8],\n      [-33, -21],\n      [-58, 14],\n      [99, 12],\n      [30, 12],\n      [-43, -8],\n      [-98, -8],\n      [-15, 8],\n      [12, 11],\n      [45, 14],\n      [-57, -12],\n      [12, 13],\n      [-22, 4],\n      [-21, -8],\n      [-14, 7],\n      [27, 11],\n      [83, 15],\n      [87, -6],\n      [-56, 12],\n      [43, 5],\n      [-12, 10],\n      [30, 1],\n      [59, -23],\n      [-11, 12],\n      [82, -19],\n      [-75, 24],\n      [18, 17],\n      [41, -8],\n      [-28, 15],\n      [47, -2],\n      [16, 12],\n      [41, -3],\n      [44, -11],\n      [-31, 15],\n      [35, 4],\n      [54, -3],\n      [10, -8],\n      [24, 12],\n      [91, 2]\n    ],\n    [\n      [5255, 7927],\n      [0, 0]\n    ],\n    [\n      [5255, 7927],\n      [0, 0]\n    ],\n    [\n      [5255, 7927],\n      [10, -8]\n    ],\n    [\n      [5264, 7905],\n      [2, -12]\n    ],\n    [\n      [5290, 7882],\n      [-2, -13],\n      [-10, -7],\n      [4, -15],\n      [-6, 6],\n      [-12, -4],\n      [-2, 10],\n      [-5, 0],\n      [-1, -14],\n      [-5, -6],\n      [-1, -18],\n      [-7, 10],\n      [2, 5],\n      [-11, 9],\n      [0, 13],\n      [-10, -11],\n      [1, -8],\n      [-9, -12],\n      [-8, 4],\n      [-13, -4]\n    ],\n    [\n      [5195, 7827],\n      [-7, 15],\n      [0, 14]\n    ],\n    [\n      [5188, 7856],\n      [-5, 6],\n      [-8, -4],\n      [-3, -9]\n    ],\n    [\n      [5172, 7849],\n      [-4, 7],\n      [2, 10],\n      [8, 9],\n      [0, 11],\n      [7, 4],\n      [12, 28],\n      [8, -5],\n      [5, 10]\n    ],\n    [\n      [5210, 7923],\n      [14, -1],\n      [9, 5],\n      [4, 9],\n      [9, -9],\n      [9, 0]\n    ],\n    [\n      [3101, 2016],\n      [-9, -10],\n      [13, -7],\n      [6, -18],\n      [-2, -7],\n      [-8, 14],\n      [-15, -2],\n      [2, 19],\n      [-18, -5],\n      [-1, -4],\n      [-14, 10],\n      [3, 5],\n      [39, 9],\n      [4, -4]\n    ],\n    [\n      [3116, 2021],\n      [14, -1],\n      [7, -9],\n      [-5, -12],\n      [-7, 7],\n      [-9, -6],\n      [-8, 1],\n      [-2, 15],\n      [10, 5]\n    ],\n    [\n      [3041, 2018],\n      [7, -9],\n      [-19, 2],\n      [-1, 8],\n      [13, -1]\n    ],\n    [\n      [3069, 2021],\n      [8, -5],\n      [-19, -3],\n      [-1, 8],\n      [12, 0]\n    ],\n    [\n      [3013, 2074],\n      [7, -1],\n      [8, -15],\n      [-5, -7],\n      [-8, 10],\n      [-4, -3],\n      [-2, 16],\n      [4, 0]\n    ],\n    [\n      [3003, 2080],\n      [6, -2],\n      [-5, -24],\n      [-11, 16],\n      [0, 7],\n      [10, 3]\n    ],\n    [\n      [3044, 2081],\n      [2, -8],\n      [-9, 4],\n      [3, -17],\n      [-9, 10],\n      [-1, 10],\n      [8, 1],\n      [-2, 10],\n      [6, 7],\n      [2, -17]\n    ],\n    [\n      [2972, 2103],\n      [2, 3],\n      [22, -21],\n      [-6, -2],\n      [-14, -18],\n      [4, 15],\n      [-9, 1],\n      [-7, -7],\n      [1, 12],\n      [-8, 1],\n      [3, 17],\n      [12, -1]\n    ],\n    [\n      [2925, 2147],\n      [15, -16],\n      [8, 0],\n      [21, -22],\n      [-10, 3],\n      [-11, 14],\n      [-13, -1],\n      [-10, 22]\n    ],\n    [\n      [3093, 2028],\n      [0, -1]\n    ],\n    [\n      [3093, 2021],\n      [-12, -3],\n      [-17, 9],\n      [-13, -4],\n      [-23, 10],\n      [-10, 10],\n      [-17, -8],\n      [-1, 12],\n      [8, -7],\n      [10, 12],\n      [7, -9],\n      [6, 12],\n      [-2, 12],\n      [20, -15],\n      [7, 5],\n      [13, -4],\n      [10, -11],\n      [3, 8],\n      [-28, 18],\n      [-4, 19],\n      [24, 15],\n      [-1, 8],\n      [-25, -6],\n      [-6, 8],\n      [1, 17],\n      [9, 1],\n      [0, 8],\n      [12, 7],\n      [2, 13],\n      [6, 4],\n      [5, -11],\n      [16, 0]\n    ],\n    [\n      [2952, 2165],\n      [-2, -17],\n      [-9, 0],\n      [-2, 7],\n      [13, 10]\n    ],\n    [\n      [2921, 2176],\n      [8, -2],\n      [-6, -7],\n      [-2, 9]\n    ],\n    [\n      [2938, 2182],\n      [8, -11],\n      [-5, -6],\n      [-3, 17]\n    ],\n    [\n      [2920, 2209],\n      [3, -4],\n      [-3, -19],\n      [-5, 7],\n      [5, 16]\n    ],\n    [\n      [2943, 2211],\n      [3, -10],\n      [-9, 5],\n      [6, 5]\n    ],\n    [\n      [2925, 2234],\n      [1, -8],\n      [-9, 1],\n      [8, 7]\n    ],\n    [\n      [2931, 2257],\n      [2, -13],\n      [-14, -1],\n      [-1, 9],\n      [9, -2],\n      [4, 7]\n    ],\n    [\n      [2924, 2263],\n      [1, -11],\n      [-8, 7],\n      [7, 4]\n    ],\n    [\n      [2906, 2275],\n      [8, 0],\n      [-10, -15],\n      [2, 15]\n    ],\n    [\n      [2931, 2276],\n      [3, 1],\n      [5, -22],\n      [-5, 0],\n      [-6, 13],\n      [3, 8]\n    ],\n    [\n      [2908, 2302],\n      [14, -5],\n      [0, -6],\n      [-18, -9],\n      [1, 12],\n      [7, -5],\n      [-4, 13]\n    ],\n    [\n      [2903, 2329],\n      [8, -14],\n      [-12, 3],\n      [4, 11]\n    ],\n    [\n      [2914, 2359],\n      [5, -2],\n      [0, -12],\n      [-9, 10],\n      [4, 4]\n    ],\n    [\n      [2906, 2359],\n      [2, -6],\n      [-9, -5],\n      [7, 11]\n    ],\n    [\n      [2925, 2377],\n      [5, 0],\n      [2, -27],\n      [-3, -27],\n      [3, -13],\n      [-9, -10],\n      [-4, 6],\n      [1, 25],\n      [-4, -21],\n      [-7, 11],\n      [-2, 25],\n      [13, -3],\n      [2, 12],\n      [-7, 18],\n      [10, 4]\n    ],\n    [\n      [2906, 2392],\n      [1, -9],\n      [-7, -5],\n      [-2, 13],\n      [8, 1]\n    ],\n    [\n      [2924, 2406],\n      [4, -8],\n      [2, -18],\n      [-14, 4],\n      [-1, 6],\n      [9, 16]\n    ],\n    [\n      [2913, 2413],\n      [9, -4],\n      [-1, -11],\n      [-7, -2],\n      [-5, 19],\n      [4, -2]\n    ],\n    [\n      [2907, 2415],\n      [7, -32],\n      [-6, 0],\n      [0, 16],\n      [-5, -5],\n      [-3, 20],\n      [7, 1]\n    ],\n    [\n      [2921, 2430],\n      [3, -17],\n      [-11, 6],\n      [-1, 6],\n      [9, 5]\n    ],\n    [\n      [2945, 2427],\n      [4, -6],\n      [-19, 2],\n      [7, 7],\n      [8, -3]\n    ],\n    [\n      [2914, 2436],\n      [-3, -8],\n      [-5, 6],\n      [8, 2]\n    ],\n    [\n      [2924, 2545],\n      [-1, -11],\n      [-10, 7],\n      [11, 4]\n    ],\n    [\n      [2936, 2556],\n      [-5, -9],\n      [0, 15],\n      [5, -6]\n    ],\n    [\n      [2955, 2556],\n      [-6, -2],\n      [3, 11],\n      [3, -9]\n    ],\n    [\n      [2948, 2591],\n      [3, -16],\n      [-7, 2],\n      [-6, 12],\n      [10, 2]\n    ],\n    [\n      [2946, 2594],\n      [-9, -4],\n      [3, 9],\n      [6, -5]\n    ],\n    [\n      [2946, 2613],\n      [2, -4],\n      [-11, -6],\n      [-4, 10],\n      [13, 0]\n    ],\n    [\n      [2974, 2623],\n      [6, -4],\n      [-12, -23],\n      [-4, -1],\n      [-5, 16],\n      [7, 2],\n      [-1, 11],\n      [9, -1]\n    ],\n    [\n      [2948, 2662],\n      [3, -7],\n      [-11, 0],\n      [8, 7]\n    ],\n    [\n      [2945, 2775],\n      [11, 1],\n      [5, -30],\n      [-8, -2],\n      [-4, -15],\n      [9, -10],\n      [-6, -5],\n      [6, -13],\n      [-7, -2],\n      [2, -14],\n      [-17, 3],\n      [-3, 4],\n      [7, 21],\n      [-1, 36],\n      [4, 8],\n      [2, 18]\n    ],\n    [\n      [3098, 2168],\n      [-21, 9],\n      [-7, -4],\n      [-3, -12],\n      [-8, -1],\n      [-27, -20],\n      [-3, -19],\n      [-1, -36],\n      [-7, -5],\n      [-24, 11],\n      [-10, 15],\n      [5, 11],\n      [15, 1],\n      [10, 5],\n      [6, 18],\n      [-5, 1],\n      [-22, -19],\n      [-5, 6],\n      [-7, -20],\n      [1, -10],\n      [-20, 22],\n      [9, 0],\n      [-1, 20],\n      [14, 1],\n      [13, 9],\n      [14, 0],\n      [-2, 5],\n      [-21, 3],\n      [-19, -19],\n      [1, -11],\n      [-6, -4],\n      [-8, 6],\n      [6, 5],\n      [-9, 6],\n      [9, 1],\n      [2, 11],\n      [-11, -5],\n      [0, 29],\n      [6, -2],\n      [15, 16],\n      [9, -1],\n      [0, 13],\n      [-7, -6],\n      [-15, 13],\n      [10, -15],\n      [-6, -4],\n      [-4, -13],\n      [-8, 7],\n      [0, 17],\n      [-9, 7],\n      [-1, 13],\n      [6, 2],\n      [1, 13],\n      [-6, -6],\n      [-7, 4],\n      [-1, 17],\n      [11, -2],\n      [-1, 9],\n      [-6, -4],\n      [-5, 21],\n      [-13, 14],\n      [9, 8],\n      [1, 26],\n      [3, 6],\n      [-5, 9],\n      [0, 44],\n      [10, 11],\n      [-11, 13],\n      [-3, 13],\n      [21, -4],\n      [6, -13],\n      [5, 5],\n      [-10, 27],\n      [-1, -6],\n      [-21, 1],\n      [-2, 12],\n      [9, -2],\n      [-7, 11],\n      [6, 12],\n      [5, 0],\n      [6, 11],\n      [-6, 2],\n      [-3, 12],\n      [-11, 0],\n      [-1, -5],\n      [-11, 14],\n      [4, 11],\n      [-13, -16],\n      [2, -11],\n      [-6, -3],\n      [-4, 19],\n      [13, 13],\n      [3, 10],\n      [12, 11],\n      [0, 11],\n      [14, 3],\n      [6, -14],\n      [-1, -8],\n      [7, -4],\n      [-7, -18],\n      [4, -3],\n      [5, 16],\n      [4, 49],\n      [8, 10],\n      [-3, 20],\n      [4, -1],\n      [14, 13],\n      [1, 15],\n      [-14, 13],\n      [4, 39],\n      [-1, 17],\n      [9, 12],\n      [-3, 14],\n      [0, 18],\n      [5, 2],\n      [-3, 15],\n      [5, 3],\n      [4, -15],\n      [0, 27],\n      [-8, -3],\n      [-4, 6],\n      [8, 12],\n      [-10, 13],\n      [-3, -13],\n      [-12, -6],\n      [-7, 4],\n      [2, 7],\n      [-5, 11],\n      [-2, 27],\n      [5, 20],\n      [1, 37],\n      [9, 7],\n      [4, 19],\n      [1, 19],\n      [-9, 38],\n      [2, 30],\n      [-6, 26],\n      [1, 22],\n      [9, -3],\n      [5, 16],\n      [0, 18],\n      [4, -4],\n      [5, 42],\n      [6, 9],\n      [-1, 15],\n      [6, 18],\n      [5, 6],\n      [1, 15],\n      [4, 12],\n      [1, 31],\n      [6, 21],\n      [4, 4],\n      [1, 12],\n      [-4, 23],\n      [6, 5],\n      [4, 37],\n      [-4, 9],\n      [1, 25],\n      [-5, 52],\n      [0, 24],\n      [2, 12],\n      [7, 5],\n      [2, 44],\n      [-5, 10],\n      [-1, 19],\n      [6, 11],\n      [4, 20],\n      [0, 18],\n      [3, 22],\n      [4, 2],\n      [-1, 30],\n      [4, 5],\n      [2, 15],\n      [2, 41],\n      [-2, 11],\n      [2, 19],\n      [6, 8],\n      [-1, 24],\n      [-2, 5],\n      [1, 62],\n      [3, 17],\n      [-6, 0],\n      [1, 25],\n      [6, 1],\n      [4, 33],\n      [0, 23],\n      [2, 25],\n      [2, 3],\n      [0, 24],\n      [-3, 10],\n      [0, 37],\n      [2, 6],\n      [-1, 31],\n      [-5, 51],\n      [0, 21],\n      [-2, 8]\n    ],\n    [\n      [3044, 4127],\n      [12, 4],\n      [4, 9],\n      [0, 26],\n      [9, 9]\n    ],\n    [\n      [8073, 6343],\n      [8, -9],\n      [1, -20],\n      [-9, -13],\n      [-7, -43],\n      [-4, 0],\n      [-5, -15],\n      [-9, -1],\n      [-2, -11],\n      [-14, 6],\n      [-14, 12],\n      [-1, 42],\n      [10, 19],\n      [8, 9],\n      [-1, 10],\n      [7, -3],\n      [5, 9],\n      [8, -6],\n      [10, 10],\n      [8, -9],\n      [1, 13]\n    ],\n    [\n      [8066, 6398],\n      [4, -5],\n      [-8, -2],\n      [4, 7]\n    ],\n    [\n      [8393, 6916],\n      [2, -7],\n      [-8, 4],\n      [6, 3]\n    ],\n    [\n      [8386, 6994],\n      [-10, 4],\n      [-11, 15],\n      [6, 2],\n      [9, -11],\n      [8, -5],\n      [-2, -5]\n    ],\n    [\n      [8689, 7778],\n      [-2, 10],\n      [-10, 6],\n      [-11, -7]\n    ],\n    [\n      [8666, 7787],\n      [-4, 7],\n      [-12, -22],\n      [-11, -4],\n      [0, -9],\n      [6, -40],\n      [-2, -28],\n      [3, -6],\n      [-5, -31],\n      [-19, -10],\n      [3, -13]\n    ],\n    [\n      [8625, 7631],\n      [-8, 13],\n      [0, 9],\n      [-9, 7],\n      [-4, -13],\n      [-1, -19],\n      [-14, -5],\n      [-1, -10],\n      [-7, -10],\n      [-26, -3],\n      [8, -20],\n      [-3, -13],\n      [-30, 7],\n      [-2, 12],\n      [-9, 1],\n      [-12, -34],\n      [-9, -16],\n      [-6, 0],\n      [-8, -10],\n      [-16, -14],\n      [-14, -21]\n    ],\n    [\n      [8454, 7492],\n      [-5, -13],\n      [-6, -5],\n      [-9, 3],\n      [-11, -3],\n      [-28, -28],\n      [-3, -9],\n      [-8, -11],\n      [-3, 5],\n      [-7, -13],\n      [-10, -4],\n      [0, 12],\n      [15, 8],\n      [-10, 29],\n      [6, 0],\n      [-2, 11],\n      [12, 12],\n      [11, 27],\n      [-3, 13],\n      [-22, 14],\n      [-12, -7],\n      [0, -7],\n      [-10, -13],\n      [-4, -16],\n      [-14, -7],\n      [-17, -19],\n      [-1, -19],\n      [-10, -15],\n      [-10, 0],\n      [-7, -8],\n      [-11, 11],\n      [-6, -6],\n      [-5, -28],\n      [5, -14],\n      [10, -13],\n      [14, -4],\n      [7, 5],\n      [12, -25],\n      [-7, -1],\n      [-2, -21],\n      [10, -12],\n      [13, 1],\n      [2, 11],\n      [10, 10],\n      [3, 9],\n      [12, 10],\n      [11, -8],\n      [0, -6],\n      [9, -7],\n      [34, -4],\n      [-7, -15],\n      [3, -13],\n      [-9, -5],\n      [-5, 9],\n      [-28, -23],\n      [-6, 3],\n      [4, -11],\n      [-7, -1],\n      [0, -17],\n      [-11, -5],\n      [2, 8],\n      [-8, 2],\n      [2, -13],\n      [-7, -22],\n      [-8, -4],\n      [-7, -26],\n      [-5, -3],\n      [1, -16],\n      [12, -14],\n      [17, -12],\n      [6, -38],\n      [11, -36],\n      [-1, -21],\n      [15, -16],\n      [0, -13],\n      [11, -10],\n      [4, -16],\n      [-8, 1],\n      [-9, 9],\n      [-10, -3],\n      [-4, 11],\n      [-11, 2],\n      [-5, -7],\n      [-7, 4],\n      [-3, 16],\n      [-6, 2],\n      [3, -11],\n      [11, -13],\n      [16, 4],\n      [2, -9],\n      [7, -5],\n      [8, -15],\n      [9, -9],\n      [6, -12],\n      [2, -13],\n      [-9, -2],\n      [-12, -10],\n      [-8, -11],\n      [-5, -15],\n      [6, -2],\n      [6, 9],\n      [6, -1],\n      [8, -19],\n      [13, -6],\n      [-13, -19],\n      [7, 5],\n      [0, -22],\n      [-4, -6],\n      [-5, 3],\n      [1, -27],\n      [-5, -3],\n      [5, -23],\n      [-5, 2],\n      [-4, -10],\n      [-3, 12],\n      [-9, -28],\n      [-8, -17],\n      [-3, -23],\n      [-6, -4],\n      [-1, -11],\n      [-9, -7],\n      [-1, -8],\n      [-5, 9],\n      [-4, -6],\n      [5, -6],\n      [2, -11],\n      [-5, 4],\n      [2, -10],\n      [-5, -15],\n      [5, -3],\n      [-3, -18],\n      [-4, 0],\n      [6, -17],\n      [-11, 10],\n      [-4, -8],\n      [5, -14],\n      [-9, 1],\n      [-3, -9],\n      [3, -10],\n      [-10, 0],\n      [4, -9],\n      [-3, -8],\n      [-6, 3],\n      [-5, -5],\n      [-2, 8],\n      [-5, -13],\n      [3, -11],\n      [-5, -4],\n      [-1, -10],\n      [-6, -1],\n      [-7, -13],\n      [-4, 1],\n      [-5, -14],\n      [-6, 5],\n      [0, -9],\n      [-10, -21],\n      [-1, -10],\n      [-6, 1],\n      [-13, -12],\n      [-7, 6],\n      [0, -11],\n      [-14, 8],\n      [-5, -13],\n      [-6, 11],\n      [-5, -7],\n      [4, -8],\n      [-4, -3],\n      [-2, 9],\n      [-5, -3]\n    ],\n    [\n      [8172, 6482],\n      [-4, -2]\n    ],\n    [\n      [8168, 6480],\n      [-7, -3],\n      [-2, 17],\n      [-3, -1],\n      [-2, 15],\n      [-6, -8],\n      [6, -17],\n      [0, -15],\n      [-2, -9],\n      [-10, 20],\n      [7, -19],\n      [-10, -14],\n      [-5, 1],\n      [-13, -12],\n      [-10, 3],\n      [-11, -15],\n      [-25, -8],\n      [-3, -10],\n      [-6, -1],\n      [-7, -13],\n      [5, -7],\n      [-1, -13],\n      [7, -9],\n      [-4, -10],\n      [-13, -2],\n      [-1, 10],\n      [-7, 25],\n      [3, 28],\n      [5, 0],\n      [0, 8],\n      [-8, 1],\n      [-2, 14],\n      [-1, -16],\n      [-12, 1],\n      [0, 6],\n      [-9, 2],\n      [-9, 13],\n      [2, -16],\n      [-6, 7],\n      [0, -8],\n      [-9, -5]\n    ],\n    [\n      [7999, 6420],\n      [-7, 10],\n      [-9, -4],\n      [-12, 14],\n      [1, 6],\n      [-10, 2],\n      [0, 14],\n      [-4, 7],\n      [0, 14],\n      [5, 0],\n      [0, 16],\n      [-14, 0],\n      [-18, 12],\n      [-7, 14],\n      [-14, -13],\n      [1, -9],\n      [-14, -14],\n      [-3, 8],\n      [-6, -8],\n      [0, -9],\n      [-11, 16],\n      [-4, -12],\n      [-5, 11],\n      [-7, -21],\n      [-5, 10],\n      [-13, 9],\n      [-4, -20],\n      [-3, 0]\n    ],\n    [\n      [7836, 6473],\n      [-13, 3],\n      [-4, -12],\n      [1, -10],\n      [5, -15],\n      [0, -39],\n      [-5, 6],\n      [-9, -2],\n      [-2, 20]\n    ],\n    [\n      [7809, 6424],\n      [-2, 12],\n      [-7, -6],\n      [-3, -8],\n      [-8, -4],\n      [-2, 5],\n      [-5, -6],\n      [-2, 13],\n      [-4, 3],\n      [-1, 19],\n      [-14, 5],\n      [-6, -1],\n      [0, 16],\n      [4, 5],\n      [-1, 14],\n      [6, 11],\n      [-5, 13],\n      [-8, -2],\n      [-7, 5],\n      [2, 6],\n      [-6, 40],\n      [6, 9],\n      [-9, -3],\n      [-13, 1],\n      [-14, -14],\n      [-2, 5],\n      [5, 10],\n      [-1, 18],\n      [-4, 0],\n      [0, 17],\n      [7, 8],\n      [-2, 12],\n      [4, 11],\n      [2, -3],\n      [6, 10],\n      [0, 13],\n      [6, -3],\n      [3, 13],\n      [7, 6],\n      [-4, 6],\n      [5, 33],\n      [0, 29],\n      [-2, 31],\n      [-7, 4],\n      [-1, -9],\n      [-7, 20],\n      [0, 16],\n      [-8, 13],\n      [-9, 9],\n      [-5, -18]\n    ],\n    [\n      [7703, 6808],\n      [-7, 9],\n      [-4, -3],\n      [-7, 15],\n      [-7, 1],\n      [5, 6],\n      [-4, 17],\n      [-9, 21],\n      [-12, -9],\n      [-6, 0],\n      [-6, -9],\n      [-9, 4],\n      [-9, 11],\n      [-8, -6],\n      [-3, -16],\n      [-9, -6],\n      [-6, -8],\n      [-7, -1],\n      [-9, -16],\n      [-12, -14],\n      [0, -11],\n      [-9, -9],\n      [-12, -5],\n      [-8, 2]\n    ],\n    [\n      [7468, 6756],\n      [-4, 12],\n      [3, 18],\n      [-1, 10],\n      [-6, 5],\n      [-13, -14]\n    ],\n    [\n      [7447, 6787],\n      [-8, 2],\n      [-4, -5],\n      [-15, 1],\n      [-3, 7],\n      [-14, 9],\n      [-4, -11],\n      [-9, 10],\n      [-3, -11],\n      [-2, 13],\n      [-6, 7],\n      [-16, 3],\n      [2, 17],\n      [-4, 3],\n      [-7, -6],\n      [-9, 11],\n      [-7, 12],\n      [-2, 16],\n      [-5, 5],\n      [-13, -7],\n      [-9, 26],\n      [-9, 2],\n      [-9, 15],\n      [-10, 8],\n      [-1, 15],\n      [-14, 5],\n      [-11, -23],\n      [-7, 11]\n    ],\n    [\n      [7248, 6922],\n      [-11, 15],\n      [-10, 6],\n      [1, 9],\n      [-14, 15],\n      [-4, -3],\n      [-9, 13],\n      [-5, 16],\n      [-9, -8],\n      [-2, 12],\n      [4, 5],\n      [-4, 7],\n      [2, 15],\n      [-9, 14],\n      [-2, 20],\n      [9, 4],\n      [6, -16],\n      [10, 8],\n      [7, 13],\n      [-5, 14],\n      [0, 12],\n      [-7, 3],\n      [-8, 16],\n      [-3, 33],\n      [8, 8],\n      [0, 7],\n      [-10, 12],\n      [-9, 5],\n      [-8, 41],\n      [1, 9],\n      [-7, 0]\n    ],\n    [\n      [7160, 7227],\n      [-18, 1],\n      [-11, 8]\n    ],\n    [\n      [7131, 7236],\n      [-5, 6],\n      [0, 8],\n      [-13, -4],\n      [-4, 10],\n      [1, 27],\n      [-7, 15],\n      [-9, 1],\n      [0, 7],\n      [-8, 7],\n      [-7, -2],\n      [-9, 4]\n    ],\n    [\n      [7080, 7327],\n      [7, 10],\n      [-8, 13],\n      [3, 7],\n      [-5, 17],\n      [-1, 26],\n      [-12, 9],\n      [-6, 0],\n      [-2, -9],\n      [-6, 3],\n      [-4, 16],\n      [4, 9],\n      [-6, 12],\n      [1, 14]\n    ],\n    [\n      [7045, 7454],\n      [8, 8],\n      [-3, 9],\n      [4, 18],\n      [11, 3],\n      [10, 14],\n      [3, 10],\n      [11, -4],\n      [8, 11],\n      [4, -20],\n      [18, 4],\n      [9, 13],\n      [0, 10],\n      [5, 15],\n      [18, -2],\n      [11, 5],\n      [5, -2],\n      [8, 19],\n      [26, 23],\n      [27, 15],\n      [-1, 8]\n    ],\n    [\n      [7227, 7611],\n      [1, 3],\n      [-3, 23],\n      [3, 11],\n      [9, 6],\n      [-7, 5],\n      [13, 6],\n      [-4, 13],\n      [2, 7],\n      [-11, 37],\n      [0, 32],\n      [5, 5],\n      [-18, 8],\n      [7, 9],\n      [21, 5],\n      [23, 13],\n      [3, -9],\n      [13, 3],\n      [7, -7],\n      [4, 17],\n      [-11, 7],\n      [7, 21],\n      [9, 47],\n      [5, 14],\n      [0, 14],\n      [24, -13],\n      [21, 1],\n      [4, -10],\n      [13, 13],\n      [7, 0],\n      [5, 9],\n      [-4, 41],\n      [4, 25],\n      [25, 10],\n      [4, 10],\n      [0, 17],\n      [4, 6],\n      [12, -1]\n    ],\n    [\n      [7424, 8009],\n      [15, 5]\n    ],\n    [\n      [7439, 8014],\n      [-4, -17],\n      [9, -8],\n      [-2, -9],\n      [16, -10],\n      [2, -12],\n      [14, -12],\n      [11, 1],\n      [7, -11],\n      [9, 3],\n      [11, -21],\n      [0, -11],\n      [15, -34],\n      [1, -11],\n      [-5, -14],\n      [3, -17],\n      [-7, -13],\n      [-2, -16],\n      [6, -17],\n      [6, 2],\n      [16, -9],\n      [23, -4],\n      [11, 2],\n      [23, -8],\n      [6, -13],\n      [7, 0],\n      [14, -19],\n      [9, -5],\n      [11, 2],\n      [-2, -16],\n      [6, -3],\n      [9, -41],\n      [12, -19],\n      [2, -11],\n      [23, 4],\n      [63, -13],\n      [14, 6],\n      [49, -12],\n      [7, -15],\n      [29, -11],\n      [18, -15],\n      [23, 7],\n      [0, -12],\n      [13, -5],\n      [6, 10],\n      [44, 30],\n      [36, 10],\n      [20, -3],\n      [20, 4],\n      [25, 19],\n      [15, 29],\n      [18, 12],\n      [10, 13],\n      [-9, 18],\n      [-7, 23],\n      [11, 33],\n      [5, 4],\n      [13, -1],\n      [5, -10],\n      [14, -6],\n      [13, -3],\n      [16, 16],\n      [14, 24],\n      [6, -3],\n      [23, 5],\n      [15, 18],\n      [-1, 7],\n      [11, 24],\n      [6, 3],\n      [15, -1],\n      [1, 13],\n      [9, -4],\n      [16, 12],\n      [12, -3],\n      [3, 5],\n      [14, -8],\n      [11, -1],\n      [5, 6],\n      [-4, 23],\n      [-18, 25],\n      [0, 6],\n      [-10, 7],\n      [-6, 11],\n      [-10, 5],\n      [-12, -3]\n    ],\n    [\n      [8270, 7946],\n      [-7, -13]\n    ],\n    [\n      [8263, 7933],\n      [-5, -6],\n      [-13, 13],\n      [-17, -1],\n      [-11, -9],\n      [-7, 10],\n      [-2, 13],\n      [8, 8],\n      [-1, 12],\n      [25, 79]\n    ],\n    [\n      [8240, 8052],\n      [16, -12],\n      [14, -6],\n      [12, 9],\n      [13, 17],\n      [12, 1],\n      [7, 6],\n      [1, 14],\n      [-4, 6],\n      [8, 27],\n      [7, 10],\n      [1, 11],\n      [8, 23],\n      [16, 14],\n      [3, 17],\n      [-4, 7],\n      [3, 13],\n      [-8, 5],\n      [-12, -1],\n      [22, 37],\n      [12, 1],\n      [26, 11],\n      [19, 0],\n      [11, 6],\n      [28, -11],\n      [4, -9],\n      [20, -1],\n      [17, -13],\n      [23, -49],\n      [-3, -10],\n      [6, -23],\n      [6, -9],\n      [1, -20],\n      [10, -19],\n      [1, -23],\n      [7, -6],\n      [-2, -23],\n      [5, -9],\n      [11, -7],\n      [20, 2],\n      [7, -14],\n      [13, -3],\n      [9, -7],\n      [11, -17],\n      [12, 0],\n      [-4, -13],\n      [6, -8],\n      [2, -13],\n      [-4, -13],\n      [7, -20],\n      [15, 2],\n      [13, -5],\n      [17, 3],\n      [3, 9],\n      [12, 14],\n      [12, -1],\n      [6, 9],\n      [18, 8],\n      [9, -7],\n      [-4, -13],\n      [6, -17],\n      [-8, -19],\n      [-9, -6],\n      [-4, -38],\n      [-5, -13],\n      [2, -9],\n      [-11, -22],\n      [-1, -15],\n      [-8, -8],\n      [-2, -21],\n      [-8, -3]\n    ],\n    [\n      [4913, 5477],\n      [0, -1]\n    ],\n    [\n      [4913, 5476],\n      [0, 1]\n    ],\n    [\n      [4925, 5729],\n      [-2, -26],\n      [3, -1],\n      [4, -47],\n      [-8, -15],\n      [-6, -39],\n      [-7, -28],\n      [2, -31],\n      [2, -4],\n      [4, -31],\n      [5, -1],\n      [2, -13],\n      [-3, -14]\n    ],\n    [\n      [4921, 5479],\n      [-10, 3],\n      [-3, -4],\n      [-15, 4],\n      [-5, 4],\n      [-18, 3],\n      [-3, -9],\n      [16, 7],\n      [6, -3],\n      [-22, -5],\n      [-22, -3],\n      [-38, -25],\n      [-5, -8],\n      [-12, -10]\n    ],\n    [\n      [4790, 5433],\n      [-1, 2],\n      [0, 41],\n      [5, 10],\n      [-1, 33],\n      [-10, 7],\n      [-1, 13],\n      [-6, 7],\n      [-10, 3],\n      [-6, 8],\n      [8, 15],\n      [1, 23],\n      [-5, 23]\n    ],\n    [\n      [4764, 5618],\n      [7, -1],\n      [3, 10],\n      [3, 27],\n      [-7, 4],\n      [2, 14],\n      [7, 0],\n      [5, -7],\n      [2, 15],\n      [-8, 9],\n      [1, 12],\n      [5, 5],\n      [-5, 6],\n      [2, 13],\n      [-5, -2],\n      [-3, 7],\n      [1, 32],\n      [4, 6]\n    ],\n    [\n      [4778, 5768],\n      [4, 2],\n      [5, 14],\n      [5, 1],\n      [3, -12],\n      [9, -6],\n      [2, 12],\n      [7, -1],\n      [1, 18],\n      [8, -5],\n      [-1, 8],\n      [5, 2],\n      [2, -15],\n      [-2, -13],\n      [6, -3],\n      [3, 9],\n      [11, 4]\n    ],\n    [\n      [5402, 5930],\n      [2, -13],\n      [7, -8],\n      [3, -17],\n      [-1, -10],\n      [5, -3],\n      [2, -34],\n      [-2, -3],\n      [-1, -26],\n      [3, -28],\n      [9, -22],\n      [6, -8],\n      [-7, -3],\n      [-9, 3],\n      [-10, -4],\n      [-15, 3],\n      [-7, -19],\n      [11, -27],\n      [17, -29],\n      [3, -1],\n      [8, -30],\n      [2, -17],\n      [4, -2],\n      [-3, -16]\n    ],\n    [\n      [5449, 5312],\n      [-3, -5],\n      [2, -25],\n      [-18, 15],\n      [-7, 3],\n      [-10, -2],\n      [-8, 12],\n      [-9, -3],\n      [-27, 0]\n    ],\n    [\n      [5369, 5307],\n      [-6, 5],\n      [-48, 3],\n      [-1, -7]\n    ],\n    [\n      [5314, 5308],\n      [-38, 0],\n      [-4, 10]\n    ],\n    [\n      [5272, 5318],\n      [0, 12],\n      [4, 27],\n      [-1, 12],\n      [-8, 18],\n      [-2, 13],\n      [6, 11],\n      [-2, 8],\n      [-10, -11],\n      [-10, 10],\n      [-2, 29],\n      [-11, -4],\n      [2, 17]\n    ],\n    [\n      [5238, 5460],\n      [6, 19],\n      [1, 41],\n      [4, 2],\n      [10, 24],\n      [10, 13],\n      [2, 14],\n      [10, 13],\n      [3, -8],\n      [7, 1],\n      [1, 9],\n      [8, -5],\n      [7, -14],\n      [1, -16],\n      [7, 1],\n      [6, 15],\n      [-1, 8],\n      [10, 15],\n      [-2, 17],\n      [5, 9],\n      [0, 9],\n      [5, 14],\n      [1, 25],\n      [16, 23],\n      [2, 34],\n      [9, 9],\n      [2, 17],\n      [-1, 14],\n      [6, 5],\n      [3, 30],\n      [12, 34],\n      [6, -1],\n      [11, 14],\n      [1, 37],\n      [-3, 10],\n      [-10, 4],\n      [-3, 40]\n    ],\n    [\n      [5390, 5936],\n      [7, 0]\n    ],\n    [\n      [5397, 5936],\n      [-1, -11],\n      [6, 5]\n    ],\n    [\n      [5398, 5936],\n      [1, 0]\n    ],\n    [\n      [5399, 5936],\n      [-1, 0]\n    ],\n    [\n      [5944, 7202],\n      [0, 0]\n    ],\n    [\n      [5944, 7202],\n      [-3, 0]\n    ],\n    [\n      [5941, 7202],\n      [0, 0]\n    ],\n    [\n      [5941, 7202],\n      [3, 0]\n    ],\n    [\n      [5905, 7208],\n      [0, 1]\n    ],\n    [\n      [5905, 7209],\n      [1, 0]\n    ],\n    [\n      [5906, 7209],\n      [1, 0]\n    ],\n    [\n      [5907, 7209],\n      [-2, -1]\n    ],\n    [\n      [5935, 7200],\n      [1, -2]\n    ],\n    [\n      [5936, 7198],\n      [-7, -1],\n      [-1, 11],\n      [-17, -6],\n      [-3, 7]\n    ],\n    [\n      [5908, 7209],\n      [0, 0]\n    ],\n    [\n      [5908, 7209],\n      [3, -5],\n      [17, 6],\n      [1, -10],\n      [6, 0]\n    ],\n    [\n      [5807, 5072],\n      [0, -19],\n      [-2, 6],\n      [2, 13]\n    ],\n    [\n      [5762, 5475],\n      [2, -10],\n      [7, -8],\n      [0, -10],\n      [16, -18],\n      [12, 12],\n      [6, 1],\n      [5, -9],\n      [7, 12],\n      [0, 6],\n      [10, -5],\n      [0, -12],\n      [4, -3],\n      [7, -21],\n      [10, -6],\n      [0, -14],\n      [6, 4],\n      [2, -10]\n    ],\n    [\n      [5856, 5384],\n      [2, -7],\n      [-5, -19],\n      [3, -15],\n      [-4, -19],\n      [8, -3],\n      [8, -13]\n    ],\n    [\n      [5868, 5308],\n      [-10, -15],\n      [-12, -24],\n      [0, -15]\n    ],\n    [\n      [5846, 5254],\n      [-7, -6],\n      [-2, -13],\n      [-6, -5],\n      [0, -21],\n      [-3, -7],\n      [-4, -25]\n    ],\n    [\n      [5824, 5177],\n      [-7, -9],\n      [-3, -12],\n      [1, -13],\n      [8, 12]\n    ],\n    [\n      [5823, 5155],\n      [-1, -6],\n      [-1, -46]\n    ],\n    [\n      [5821, 5103],\n      [-7, -8],\n      [-3, -9]\n    ],\n    [\n      [5811, 5086],\n      [-3, 1],\n      [-7, -28],\n      [3, -9],\n      [-3, -10]\n    ],\n    [\n      [5801, 5040],\n      [4, -14]\n    ],\n    [\n      [5811, 4991],\n      [-2, -3],\n      [-1, -49],\n      [4, 11],\n      [-1, -27],\n      [-3, -5],\n      [0, -30],\n      [7, -28],\n      [-1, -13],\n      [-4, -5],\n      [10, -49],\n      [6, -14],\n      [6, -6],\n      [6, -13],\n      [2, -29],\n      [7, -10],\n      [2, -12]\n    ],\n    [\n      [5849, 4709],\n      [-28, -8],\n      [-19, -7]\n    ],\n    [\n      [5802, 4694],\n      [-16, -35],\n      [0, -23],\n      [4, -2],\n      [2, 9]\n    ],\n    [\n      [5792, 4643],\n      [4, -21],\n      [-1, -21],\n      [1, -34],\n      [-5, -16],\n      [0, -10],\n      [-4, -17],\n      [4, -25],\n      [9, -11],\n      [6, -17],\n      [14, -4],\n      [-2, 11],\n      [9, 5],\n      [0, -75],\n      [-5, 1],\n      [-1, 12],\n      [-10, -10],\n      [-7, 1],\n      [-2, 14],\n      [-6, 17],\n      [-4, -2],\n      [-1, 13],\n      [-5, 13],\n      [-16, 7],\n      [-6, 6],\n      [-3, 16],\n      [-5, 7],\n      [-1, 12],\n      [-5, 0],\n      [-1, -16],\n      [-7, -8],\n      [-10, 6],\n      [-11, 0],\n      [-4, 7],\n      [-14, 8],\n      [0, 26],\n      [-17, -7],\n      [-8, -8],\n      [-4, 5],\n      [3, 14],\n      [-8, 6],\n      [-4, 9]\n    ],\n    [\n      [5366, 4846],\n      [-9, 2],\n      [-4, -10],\n      [-7, -3],\n      [-7, 16]\n    ],\n    [\n      [5363, 4916],\n      [8, -9],\n      [0, -6],\n      [8, 11],\n      [1, 14],\n      [7, -2],\n      [12, 12],\n      [2, -8],\n      [-3, -7],\n      [1, -20],\n      [9, 0],\n      [4, 6],\n      [10, 27],\n      [8, 8],\n      [1, 8],\n      [9, 4],\n      [10, 35],\n      [-1, 29],\n      [1, 13],\n      [-1, 26],\n      [12, 25],\n      [0, 7],\n      [11, 30],\n      [8, 5],\n      [12, 27],\n      [0, 21],\n      [3, 25],\n      [3, 7],\n      [-2, 14],\n      [1, 28],\n      [5, 27],\n      [-1, 34],\n      [16, 57],\n      [0, 19]\n    ],\n    [\n      [5333, 4894],\n      [-5, 13],\n      [0, 10],\n      [-15, 33],\n      [-5, 6]\n    ],\n    [\n      [5308, 4956],\n      [2, 12],\n      [8, 13],\n      [5, -10],\n      [5, -2],\n      [4, 22],\n      [-8, 9],\n      [3, 10],\n      [-7, 12],\n      [2, 7],\n      [-1, 20],\n      [4, -5],\n      [6, 5],\n      [4, -5],\n      [11, 5],\n      [-1, 24],\n      [5, 5],\n      [5, -5],\n      [5, -26],\n      [11, -4],\n      [9, 13],\n      [1, 6],\n      [9, -22],\n      [5, 9],\n      [0, 20],\n      [5, 5],\n      [1, 41],\n      [-2, 10],\n      [3, 23],\n      [-9, 9],\n      [-3, 11],\n      [-5, 0],\n      [0, 27],\n      [5, 19],\n      [5, 0],\n      [6, 16],\n      [-5, 18],\n      [0, 11],\n      [-14, 6],\n      [-7, -9],\n      [-7, -3],\n      [-4, 22],\n      [2, 23],\n      [3, 9]\n    ],\n    [\n      [3018, 5865],\n      [-19, -13],\n      [-7, -27],\n      [-6, -1],\n      [-7, -26],\n      [-5, -13],\n      [-2, -37],\n      [-11, -37],\n      [11, 7],\n      [1, -11],\n      [4, 2],\n      [4, -28],\n      [8, -16],\n      [1, -19],\n      [-4, -7],\n      [1, -28],\n      [7, -3],\n      [3, -18],\n      [7, -5],\n      [5, 4],\n      [18, -4],\n      [9, 7],\n      [10, -10],\n      [7, -1],\n      [18, -46],\n      [5, -2],\n      [7, 8],\n      [11, -5],\n      [29, 8],\n      [4, -18],\n      [-6, -10],\n      [0, -17],\n      [-5, -6],\n      [0, -66],\n      [5, -28],\n      [4, -2],\n      [5, -17],\n      [-15, -35],\n      [7, -6],\n      [11, -18],\n      [0, -12],\n      [4, -17],\n      [5, -39]\n    ],\n    [\n      [3056, 4939],\n      [-8, 22],\n      [-6, -2],\n      [-7, 6],\n      [18, 59],\n      [0, 7],\n      [-26, 25],\n      [-10, -10],\n      [-2, 7],\n      [-8, 7],\n      [-6, -11],\n      [-10, -7],\n      [-8, 6],\n      [-9, -5],\n      [-7, 8],\n      [2, 12],\n      [-2, 17],\n      [-10, 6],\n      [1, 12],\n      [-4, 13],\n      [-7, 3],\n      [-5, 10],\n      [-5, 2],\n      [-4, 26],\n      [-6, 11],\n      [-5, 2],\n      [-8, 14],\n      [-5, -2]\n    ],\n    [\n      [2909, 5177],\n      [-11, 11],\n      [-3, -1],\n      [-7, 15],\n      [-8, 7],\n      [-3, -12],\n      [-9, -1],\n      [-19, 10],\n      [-1, 14],\n      [-7, 11],\n      [-11, 5],\n      [-13, 16],\n      [-7, 13]\n    ],\n    [\n      [2810, 5265],\n      [-5, 10],\n      [5, 13],\n      [7, -2],\n      [-3, 14],\n      [0, 13],\n      [7, 19],\n      [10, -5],\n      [0, 9],\n      [9, -4],\n      [1, 22],\n      [12, 29],\n      [0, 6],\n      [7, 20],\n      [-6, -5],\n      [-4, 5],\n      [-1, 15],\n      [3, 16],\n      [-2, 57],\n      [-5, 2],\n      [9, 12],\n      [0, 7],\n      [-7, 20],\n      [3, 5],\n      [1, 19],\n      [-5, 6],\n      [-3, 17],\n      [-7, 14]\n    ],\n    [\n      [2836, 5599],\n      [2, 14],\n      [13, 12],\n      [1, 13],\n      [4, 2],\n      [-6, 28],\n      [-3, 3],\n      [3, 11]\n    ],\n    [\n      [2850, 5682],\n      [12, -31],\n      [1, -12],\n      [5, 0],\n      [-1, 29],\n      [-4, 10],\n      [7, 5],\n      [10, 15],\n      [6, 23],\n      [12, 4],\n      [2, 15],\n      [-3, 1],\n      [3, 13],\n      [-1, 20],\n      [3, 2],\n      [0, 16],\n      [8, 14],\n      [11, 14],\n      [9, -5],\n      [-3, -8],\n      [7, -4],\n      [4, 18],\n      [1, 14],\n      [10, -3],\n      [15, 1],\n      [6, 12],\n      [10, 13],\n      [13, 10],\n      [3, 11],\n      [-1, 9],\n      [6, 1],\n      [12, 10],\n      [8, -6],\n      [3, -18],\n      [-6, -10]\n    ],\n    [\n      [6235, 4487],\n      [1, -17],\n      [-4, 8],\n      [3, 9]\n    ],\n    [\n      [6207, 4496],\n      [-7, 9],\n      [1, 21],\n      [4, 1],\n      [-1, -12],\n      [3, -19]\n    ],\n    [\n      [4324, 6037],\n      [-5, 9],\n      [5, 2],\n      [0, -11]\n    ],\n    [\n      [4340, 6065],\n      [8, -16],\n      [-5, -7],\n      [-4, 7],\n      [1, 16]\n    ],\n    [\n      [4365, 6116],\n      [5, -8],\n      [-8, -3],\n      [3, 11]\n    ],\n    [\n      [4303, 6173],\n      [3, -6],\n      [-7, -10],\n      [-3, 11],\n      [7, 5]\n    ],\n    [\n      [2676, 5812],\n      [7, -32],\n      [16, -36],\n      [7, -10]\n    ],\n    [\n      [2706, 5734],\n      [-3, -5],\n      [-5, 7],\n      [-2, -8],\n      [0, -23],\n      [6, -10],\n      [-5, -4],\n      [2, -19],\n      [-6, -11],\n      [4, -16]\n    ],\n    [\n      [2697, 5645],\n      [-2, 11],\n      [-5, 9],\n      [0, 15],\n      [-9, 5],\n      [5, -10],\n      [0, -10],\n      [-12, 12],\n      [3, 27],\n      [-8, 14],\n      [-10, 11],\n      [-11, 8],\n      [1, 10],\n      [-12, 21],\n      [-4, -7],\n      [9, -12],\n      [-6, -16],\n      [-6, 15],\n      [-10, 5],\n      [-5, 19],\n      [1, 16],\n      [3, 2],\n      [1, 15],\n      [-8, 5],\n      [7, 2],\n      [0, 9]\n    ],\n    [\n      [2619, 5821],\n      [2, 7],\n      [21, -15],\n      [5, 7],\n      [13, -10],\n      [0, -5],\n      [8, -5],\n      [8, 5],\n      [0, 7]\n    ],\n    [\n      [2698, 6446],\n      [5, -3],\n      [4, -17],\n      [-10, -9],\n      [-8, 8],\n      [7, 1],\n      [-4, 15],\n      [6, 5]\n    ],\n    [\n      [2836, 6454],\n      [6, -1],\n      [-1, -7],\n      [-5, 8]\n    ],\n    [\n      [2823, 6481],\n      [-2, -7],\n      [-7, 5],\n      [9, 2]\n    ],\n    [\n      [2914, 6329],\n      [-1, 4]\n    ],\n    [\n      [2913, 6333],\n      [-1, 0]\n    ],\n    [\n      [2912, 6333],\n      [-2, -4]\n    ],\n    [\n      [2910, 6329],\n      [-10, -1],\n      [-15, 6],\n      [-21, -3],\n      [-2, -3],\n      [-21, -3],\n      [6, 17],\n      [9, 10],\n      [3, 9],\n      [-8, 15],\n      [-19, -1],\n      [-13, 20],\n      [-1, 18],\n      [-6, 16],\n      [-14, -5],\n      [-10, 8],\n      [-8, 0],\n      [-10, 11],\n      [-5, 10],\n      [-13, -1],\n      [-13, 8],\n      [-13, 4],\n      [-7, 11],\n      [12, 1],\n      [1, 7],\n      [-7, 6],\n      [-25, 1],\n      [-10, -21],\n      [-7, -9],\n      [-15, 0],\n      [-2, -15],\n      [-3, 2],\n      [-11, -11],\n      [1, 10],\n      [-11, -3],\n      [10, 9],\n      [5, 0],\n      [-2, 15],\n      [3, 11],\n      [12, 15],\n      [14, 8],\n      [3, 6],\n      [19, 3],\n      [9, 8],\n      [27, -2],\n      [3, -6],\n      [15, 2],\n      [6, -8],\n      [10, 1],\n      [11, -12],\n      [9, -20],\n      [15, -1],\n      [13, -13],\n      [5, -1],\n      [7, -16],\n      [12, -5],\n      [-3, 9],\n      [12, -16],\n      [5, -11],\n      [23, -17],\n      [0, -5],\n      [12, 2],\n      [3, -6],\n      [-5, -10],\n      [2, -9],\n      [20, 1],\n      [7, -5],\n      [9, -19],\n      [5, 2],\n      [2, -9],\n      [-3, -6],\n      [-13, 0],\n      [-10, -9]\n    ],\n    [\n      [3089, 5876],\n      [-11, 16],\n      [3, 2],\n      [8, -18]\n    ],\n    [\n      [5905, 7209],\n      [1, 0]\n    ],\n    [\n      [5941, 7202],\n      [-6, -2]\n    ],\n    [\n      [5908, 7209],\n      [6, 1],\n      [0, 11],\n      [14, -4],\n      [17, 8],\n      [15, 13],\n      [0, -3],\n      [-19, -22],\n      [3, -11]\n    ],\n    [\n      [5938, 7197],\n      [0, 0]\n    ],\n    [\n      [5938, 7197],\n      [0, 0]\n    ],\n    [\n      [5937, 7198],\n      [0, 0]\n    ],\n    [\n      [5944, 7202],\n      [-3, -6]\n    ],\n    [\n      [5941, 7196],\n      [0, 6]\n    ],\n    [\n      [5936, 7198],\n      [0, -1]\n    ],\n    [\n      [5936, 7197],\n      [-3, -9],\n      [-16, -11]\n    ],\n    [\n      [5917, 7177],\n      [-8, 1]\n    ],\n    [\n      [5909, 7178],\n      [-7, 3],\n      [-5, 11],\n      [1, 9],\n      [7, 7]\n    ],\n    [\n      [5907, 7209],\n      [1, 0]\n    ],\n    [\n      [5411, 8112],\n      [4, 8],\n      [9, -9],\n      [14, -7],\n      [6, -6],\n      [12, -3],\n      [-7, -8],\n      [13, -20],\n      [10, 7],\n      [-4, 12],\n      [9, -2],\n      [19, -24],\n      [4, 4],\n      [7, -7],\n      [8, 0],\n      [8, -23]\n    ],\n    [\n      [5523, 8034],\n      [-8, -1],\n      [-12, -15],\n      [-1, -11],\n      [-15, -14],\n      [-9, 4],\n      [-8, -15]\n    ],\n    [\n      [5383, 7990],\n      [-10, 11],\n      [-13, 20],\n      [-10, 9],\n      [-7, 17],\n      [3, 13],\n      [-5, 11],\n      [6, 13],\n      [26, 11],\n      [3, 8],\n      [9, 1],\n      [13, 9],\n      [-2, 8],\n      [15, -9]\n    ],\n    [\n      [5255, 7927],\n      [0, 0]\n    ],\n    [\n      [5394, 8289],\n      [0, -4]\n    ],\n    [\n      [5394, 8285],\n      [0, 4]\n    ],\n    [\n      [5371, 8330],\n      [6, -3],\n      [4, -14],\n      [-11, -5],\n      [-6, 4],\n      [1, 12],\n      [6, 6]\n    ],\n    [\n      [5262, 8339],\n      [4, 3],\n      [12, -11],\n      [5, -15],\n      [13, -5],\n      [11, 2],\n      [1, -9],\n      [-10, -8],\n      [12, -2],\n      [8, -7],\n      [5, 14],\n      [11, 2],\n      [14, 11],\n      [13, 4],\n      [3, -10],\n      [10, -8],\n      [6, 2],\n      [3, -17],\n      [13, -10]\n    ],\n    [\n      [5396, 8275],\n      [3, -23],\n      [-5, -27],\n      [12, -14],\n      [-3, -9],\n      [7, -21],\n      [-4, -20],\n      [2, -11],\n      [7, -4],\n      [2, -14],\n      [-6, -20]\n    ],\n    [\n      [5269, 7921],\n      [-15, 12],\n      [1, -6]\n    ],\n    [\n      [5210, 7923],\n      [-2, 4],\n      [8, 55],\n      [9, 11],\n      [2, 10],\n      [-16, 4],\n      [-4, 7],\n      [-18, -1],\n      [-13, 17]\n    ],\n    [\n      [5176, 8030],\n      [4, 20],\n      [-6, 3],\n      [-5, 16]\n    ],\n    [\n      [5166, 8104],\n      [-3, 14],\n      [9, 22],\n      [0, 9],\n      [-8, 12],\n      [5, 10],\n      [8, -4],\n      [10, 5],\n      [8, 28],\n      [-10, 5],\n      [2, 9],\n      [8, 1],\n      [4, 18],\n      [0, 16]\n    ],\n    [\n      [5199, 8249],\n      [-3, 19],\n      [6, 6],\n      [21, 2],\n      [6, -18],\n      [0, 12],\n      [8, -4],\n      [2, 20],\n      [9, 1],\n      [-8, 29],\n      [10, 6],\n      [-9, 13],\n      [-1, 9]\n    ],\n    [\n      [5240, 8344],\n      [22, -5]\n    ],\n    [\n      [6201, 5844],\n      [-9, -28]\n    ],\n    [\n      [6192, 5816],\n      [-6, 4],\n      [-22, -7],\n      [-4, 8]\n    ],\n    [\n      [6160, 5821],\n      [0, 12]\n    ],\n    [\n      [6160, 5833],\n      [0, 24],\n      [10, 22],\n      [7, 22]\n    ],\n    [\n      [6177, 5901],\n      [8, -6],\n      [3, 9],\n      [9, 11]\n    ],\n    [\n      [6197, 5915],\n      [6, -14],\n      [2, -25],\n      [-10, -14],\n      [-7, -3],\n      [-3, -11],\n      [13, 3],\n      [3, -7]\n    ],\n    [\n      [3294, 6081],\n      [4, -5],\n      [0, -15],\n      [-3, -3],\n      [-3, 16],\n      [2, 7]\n    ],\n    [\n      [5312, 8347],\n      [17, -10],\n      [-1, -7],\n      [-10, -1],\n      [-8, 6],\n      [2, 12]\n    ],\n    [\n      [5348, 8350],\n      [-12, -5],\n      [4, 7],\n      [8, -2]\n    ],\n    [\n      [5272, 8355],\n      [7, -12],\n      [-8, 2],\n      [1, 10]\n    ],\n    [\n      [5413, 8363],\n      [6, -13],\n      [-9, 3],\n      [3, 10]\n    ],\n    [\n      [5287, 8385],\n      [7, 0],\n      [6, -15],\n      [-2, -16],\n      [-19, 1],\n      [-11, 24],\n      [19, 6]\n    ],\n    [\n      [5342, 8415],\n      [7, -3],\n      [0, -22],\n      [-11, -12],\n      [8, -11],\n      [-13, -8],\n      [5, -3],\n      [-8, -10],\n      [8, -5],\n      [-9, -11],\n      [-4, 32],\n      [-13, 0],\n      [-2, 28],\n      [13, 12],\n      [5, -13],\n      [14, 26]\n    ],\n    [\n      [5247, 8463],\n      [-2, -13],\n      [-9, 0],\n      [11, 13]\n    ],\n    [\n      [5240, 8344],\n      [-2, 32],\n      [-14, 7],\n      [3, 14],\n      [6, 5],\n      [-4, 11],\n      [-4, -6],\n      [0, 34],\n      [16, 1],\n      [7, 12],\n      [9, -10],\n      [-3, 15],\n      [18, 12],\n      [-32, -9],\n      [-5, -13],\n      [-7, 3],\n      [11, 20],\n      [17, 1],\n      [9, 6],\n      [10, 19],\n      [20, 10],\n      [-6, -10],\n      [3, -20],\n      [-7, -15],\n      [2, -23],\n      [12, -1],\n      [5, -6],\n      [-6, -16],\n      [-11, 2],\n      [-4, -20],\n      [-20, -21],\n      [6, -16],\n      [-7, -5],\n      [8, -8],\n      [-8, -10]\n    ],\n    [\n      [3006, 6222],\n      [2, 16],\n      [-6, 10]\n    ],\n    [\n      [3002, 6248],\n      [0, 0]\n    ],\n    [\n      [3002, 6248],\n      [-1, 2]\n    ],\n    [\n      [3001, 6250],\n      [-1, 4]\n    ],\n    [\n      [3000, 6254],\n      [8, 11],\n      [-2, 9],\n      [4, 12],\n      [-4, 32]\n    ],\n    [\n      [3006, 6318],\n      [3, 11],\n      [14, -4],\n      [4, 6],\n      [11, -10],\n      [5, 1],\n      [4, -8],\n      [11, 0],\n      [4, -20],\n      [6, 2],\n      [11, -3],\n      [-2, -5],\n      [-11, 2],\n      [0, -8],\n      [24, -7],\n      [12, -20],\n      [-9, -23],\n      [-8, 11],\n      [-17, 0],\n      [-9, 4],\n      [-8, -14],\n      [-9, -2],\n      [-3, 12],\n      [-9, -8],\n      [-5, 2],\n      [1, -9],\n      [-10, -31],\n      [-6, 8],\n      [-4, 17]\n    ],\n    [\n      [5238, 7310],\n      [2, -6],\n      [-7, -4],\n      [1, -6],\n      [-8, -8],\n      [6, -5],\n      [-4, -35],\n      [3, -10],\n      [-1, -19],\n      [4, -5],\n      [-4, -8],\n      [-3, -30],\n      [-11, -11],\n      [-1, -9],\n      [-7, -8],\n      [-1, -14],\n      [7, -25],\n      [0, -11],\n      [10, -7],\n      [6, -15],\n      [2, -20],\n      [19, -24],\n      [7, -62],\n      [6, -44]\n    ],\n    [\n      [5264, 6924],\n      [-7, -7],\n      [11, -29],\n      [5, -37],\n      [-2, -44],\n      [4, -19],\n      [-5, -34],\n      [2, -21],\n      [3, -4],\n      [-2, -20],\n      [-10, -9],\n      [-3, -10],\n      [18, -52],\n      [0, -25],\n      [5, -5],\n      [1, -10],\n      [6, -6],\n      [7, 5],\n      [21, -13],\n      [3, -4],\n      [11, -43]\n    ],\n    [\n      [5332, 6537],\n      [-28, -35],\n      [-99, -122],\n      [-24, -40],\n      [-17, -32],\n      [-8, -8],\n      [-39, -15]\n    ],\n    [\n      [5117, 6285],\n      [-26, -9],\n      [-5, 7],\n      [4, 15],\n      [-2, 11],\n      [1, 14],\n      [-8, 8],\n      [-12, 4],\n      [-9, 16],\n      [-2, -4],\n      [-9, 5],\n      [-4, 14],\n      [-14, 12],\n      [1, 19],\n      [-14, 18],\n      [-28, 40],\n      [-8, 9],\n      [-36, 49],\n      [-21, 30],\n      [-8, 9],\n      [-51, 70]\n    ],\n    [\n      [4866, 6622],\n      [-64, 78],\n      [-16, 21],\n      [-28, 33]\n    ],\n    [\n      [4758, 6754],\n      [0, 22]\n    ],\n    [\n      [4758, 6776],\n      [0, 59],\n      [12, 18],\n      [18, 22],\n      [7, 0],\n      [8, 8],\n      [10, 0],\n      [27, 5],\n      [6, -5],\n      [7, 21],\n      [11, 17],\n      [11, 11],\n      [6, 11],\n      [17, 8],\n      [3, 14],\n      [-8, 21],\n      [4, 4],\n      [1, 15],\n      [23, 9],\n      [-3, 14],\n      [12, 5],\n      [35, -3],\n      [0, 17],\n      [6, 7],\n      [-11, 14],\n      [-4, 11],\n      [2, 8],\n      [-5, 10],\n      [2, 18],\n      [-4, 8],\n      [2, 24],\n      [-4, 15],\n      [3, 6],\n      [-4, 7],\n      [2, 9],\n      [-12, 19]\n    ],\n    [\n      [4938, 7203],\n      [8, 0],\n      [18, 16],\n      [2, 12],\n      [11, 12],\n      [8, 0],\n      [1, 7],\n      [6, -5],\n      [8, 2],\n      [5, 15],\n      [24, 22],\n      [25, 4],\n      [10, 4],\n      [8, -2],\n      [11, 13],\n      [3, -4],\n      [12, 2],\n      [9, 8],\n      [21, -1],\n      [13, -7],\n      [8, -8],\n      [10, 11],\n      [14, 5],\n      [6, 10],\n      [12, -12],\n      [8, 2],\n      [0, 9],\n      [9, -1],\n      [7, -10],\n      [13, 4],\n      [10, -1]\n    ],\n    [\n      [2774, 5010],\n      [-4, -1],\n      [0, 11],\n      [5, 9],\n      [5, -3],\n      [-6, -16]\n    ],\n    [\n      [2519, 5143],\n      [-4, -14],\n      [-5, 0],\n      [9, 14]\n    ],\n    [\n      [2493, 5154],\n      [0, -14],\n      [-8, 2],\n      [1, 11],\n      [7, 1]\n    ],\n    [\n      [2459, 5168],\n      [2, -12],\n      [-7, 2],\n      [-1, 8],\n      [6, 2]\n    ],\n    [\n      [2478, 5174],\n      [6, -6],\n      [-5, -6],\n      [-4, 5],\n      [3, 7]\n    ],\n    [\n      [2463, 5192],\n      [4, -22],\n      [6, -11],\n      [-1, -9],\n      [6, -10],\n      [-4, -13],\n      [-13, -3],\n      [-3, 10],\n      [12, 14],\n      [-9, 21],\n      [-3, 18],\n      [5, 5]\n    ],\n    [\n      [2909, 5177],\n      [-10, 0],\n      [6, -20],\n      [4, -4],\n      [-1, -13],\n      [2, -13],\n      [-5, 0],\n      [-4, -27],\n      [-15, -40],\n      [-16, -25],\n      [-33, -24],\n      [-9, -21],\n      [1, -7],\n      [-6, 5],\n      [-1, -22],\n      [-8, -31],\n      [-1, -17],\n      [-4, -3],\n      [-1, -12],\n      [-4, -7],\n      [-8, 2],\n      [-5, 16],\n      [0, 9],\n      [-8, 2],\n      [-9, 11],\n      [-8, -11],\n      [-2, 5],\n      [4, 10],\n      [-5, 9],\n      [10, 10],\n      [-2, 22],\n      [-3, 6]\n    ],\n    [\n      [2768, 4987],\n      [11, 12],\n      [6, 40],\n      [-3, 5],\n      [-4, -11],\n      [-1, 15],\n      [-7, -22],\n      [-11, 18],\n      [-7, 5],\n      [5, 13],\n      [-1, 22],\n      [-2, 5],\n      [2, 15],\n      [-4, 19],\n      [10, 7],\n      [3, 21],\n      [-1, 11],\n      [12, 24],\n      [1, 31],\n      [-2, 13],\n      [12, 11],\n      [19, 9],\n      [4, 15]\n    ],\n    [\n      [5949, 6986],\n      [2, -6]\n    ],\n    [\n      [5951, 6980],\n      [17, -99]\n    ],\n    [\n      [5968, 6881],\n      [-4, -12],\n      [-3, -33],\n      [-5, -16],\n      [0, -26],\n      [-5, -14],\n      [-13, 15],\n      [-6, 17],\n      [-10, 16],\n      [-1, 26],\n      [-8, 12],\n      [-5, 14],\n      [-2, 23],\n      [-4, -1],\n      [-4, -16],\n      [6, -10],\n      [3, -16],\n      [0, -14],\n      [4, -6],\n      [14, -42],\n      [5, -5],\n      [5, -36],\n      [4, -4],\n      [5, -25],\n      [0, -11],\n      [11, -43],\n      [15, -51],\n      [8, -35],\n      [15, -29],\n      [-8, 3],\n      [2, -41],\n      [3, -16],\n      [6, -13],\n      [10, -6],\n      [2, -8],\n      [16, -29]\n    ],\n    [\n      [6024, 6449],\n      [-78, 0],\n      [-73, 0],\n      [0, 14],\n      [-6, -14],\n      [-57, 0],\n      [-71, 0],\n      [-46, 0]\n    ],\n    [\n      [5693, 6449],\n      [0, 421],\n      [-3, 10],\n      [-1, 24],\n      [-4, 13],\n      [6, 20],\n      [3, 17],\n      [-4, 22],\n      [0, 14],\n      [8, 16]\n    ],\n    [\n      [5698, 7006],\n      [1, -7],\n      [7, -2],\n      [12, 7],\n      [14, -6],\n      [27, -8],\n      [1, -7],\n      [8, -5],\n      [5, 4],\n      [4, -9],\n      [21, -6],\n      [8, -9],\n      [13, 7],\n      [16, 22],\n      [4, -4],\n      [4, 14],\n      [3, -3],\n      [11, 6],\n      [-9, -10],\n      [9, 2],\n      [7, 11],\n      [13, -9],\n      [8, 5],\n      [-3, -15],\n      [7, -4],\n      [1, -7],\n      [6, 2],\n      [0, 9],\n      [6, -10],\n      [7, -4],\n      [31, 7],\n      [9, 9]\n    ],\n    [\n      [6111, 6097],\n      [3, -11],\n      [8, -6],\n      [-12, 2],\n      [-2, 8],\n      [3, 7]\n    ],\n    [\n      [6177, 5901],\n      [-6, 15],\n      [-8, 12],\n      [-5, 18],\n      [-14, 19],\n      [-7, 23],\n      [-5, 10],\n      [-10, 7],\n      [-5, 9],\n      [-9, -1],\n      [-10, 9],\n      [-10, -6],\n      [-5, 10],\n      [-3, -8],\n      [-13, -5],\n      [-6, 16],\n      [-3, -1],\n      [-6, 12],\n      [-9, -45],\n      [-6, 19],\n      [-5, 1],\n      [-2, -8],\n      [-10, 1],\n      [-6, -4]\n    ],\n    [\n      [6014, 6004],\n      [-3, 51],\n      [6, 17],\n      [1, 18],\n      [3, 5],\n      [5, 24],\n      [-2, 23],\n      [3, 6],\n      [-1, 17],\n      [12, -2],\n      [3, 17],\n      [21, 13],\n      [5, 18],\n      [5, 9]\n    ],\n    [\n      [6072, 6220],\n      [9, -35],\n      [0, -9],\n      [6, -31],\n      [1, -24],\n      [3, -23],\n      [4, -4],\n      [0, -17],\n      [5, -2],\n      [2, -22],\n      [4, -1],\n      [-2, 18],\n      [3, 4],\n      [6, -7],\n      [0, -17],\n      [6, -8],\n      [3, 5],\n      [6, -3],\n      [3, -12],\n      [12, -6],\n      [12, -31],\n      [2, -9],\n      [9, -6],\n      [3, -12],\n      [3, 1],\n      [4, -13],\n      [1, -13],\n      [4, 2],\n      [6, -13],\n      [0, -8],\n      [10, -9]\n    ],\n    [\n      [5941, 7196],\n      [-3, 1]\n    ],\n    [\n      [5938, 7197],\n      [-2, 0]\n    ],\n    [\n      [4503, 6784],\n      [-3, -9],\n      [-5, 3],\n      [8, 6]\n    ],\n    [\n      [4571, 6803],\n      [1, -17],\n      [-5, -6],\n      [-6, 6],\n      [2, 19],\n      [8, -2]\n    ],\n    [\n      [4552, 6828],\n      [-7, -11],\n      [-2, -14],\n      [-7, -8],\n      [-6, 21],\n      [12, 4],\n      [4, 8],\n      [6, 0]\n    ],\n    [\n      [4604, 6803],\n      [7, 35],\n      [5, -4],\n      [-4, -26],\n      [-8, -5]\n    ],\n    [\n      [4503, 6844],\n      [4, -7],\n      [-3, -16],\n      [-4, 14],\n      [3, 9]\n    ],\n    [\n      [4626, 6861],\n      [0, -6],\n      [-9, -10],\n      [-1, 11],\n      [10, 5]\n    ],\n    [\n      [4919, 7214],\n      [-1, 3]\n    ],\n    [\n      [4918, 7217],\n      [1, -3]\n    ],\n    [\n      [4851, 7247],\n      [-1, 5]\n    ],\n    [\n      [4850, 7252],\n      [1, -5]\n    ],\n    [\n      [5043, 7435],\n      [2, -6],\n      [-6, -9],\n      [-6, 2],\n      [10, 13]\n    ],\n    [\n      [5088, 7483],\n      [0, -11],\n      [8, 0],\n      [-7, -23],\n      [-4, -6],\n      [-8, 7],\n      [-3, 10],\n      [-9, 0],\n      [9, 14],\n      [14, 9]\n    ],\n    [\n      [5114, 7490],\n      [6, -11],\n      [-3, -3],\n      [-12, 12],\n      [9, 2]\n    ],\n    [\n      [5055, 7627],\n      [0, 0]\n    ],\n    [\n      [4950, 7681],\n      [11, -8],\n      [1, -9],\n      [16, -8],\n      [6, -11],\n      [6, 3],\n      [8, -7],\n      [20, 0],\n      [0, 9],\n      [18, -7],\n      [3, -7]\n    ],\n    [\n      [5047, 7630],\n      [8, -9],\n      [8, 4],\n      [6, -5],\n      [12, 8],\n      [7, -3]\n    ],\n    [\n      [5088, 7625],\n      [4, -5],\n      [-6, -6],\n      [3, -18],\n      [-4, -6],\n      [-23, -20],\n      [-3, -10],\n      [-17, -6],\n      [-15, -8],\n      [-8, -13],\n      [5, -6],\n      [-8, -7],\n      [-7, -18],\n      [-8, -14],\n      [-11, -32],\n      [3, -21],\n      [6, -15],\n      [7, -7],\n      [-21, -22],\n      [-9, -36],\n      [4, -6],\n      [-19, -4],\n      [-12, -20],\n      [-2, -15],\n      [-7, -12],\n      [-5, 6],\n      [-7, -1],\n      [-3, -8],\n      [-6, 4],\n      [-42, -1],\n      [-7, -13],\n      [-15, -5],\n      [-4, -16]\n    ],\n    [\n      [4851, 7264],\n      [0, 0]\n    ],\n    [\n      [4851, 7264],\n      [-6, -7],\n      [-14, 11],\n      [-9, 24],\n      [-2, 18],\n      [-12, 13],\n      [-14, 2]\n    ],\n    [\n      [4794, 7325],\n      [-3, 18],\n      [7, 27],\n      [6, 2],\n      [3, 10],\n      [-5, 0],\n      [-6, 14],\n      [1, 17],\n      [6, 6],\n      [3, 12],\n      [-5, 3],\n      [-5, 22],\n      [-6, 12],\n      [14, 0],\n      [4, 14],\n      [-4, 17],\n      [7, 8],\n      [-1, 30],\n      [-3, 6],\n      [8, 16],\n      [6, 4],\n      [6, 14],\n      [-10, 6],\n      [0, 16],\n      [-16, 2],\n      [-2, -7],\n      [-11, -3],\n      [-3, 3],\n      [-13, -3],\n      [3, 13],\n      [-4, 6],\n      [-15, -10]\n    ],\n    [\n      [4756, 7600],\n      [-4, 7],\n      [8, 12],\n      [-7, 6],\n      [1, 13],\n      [-6, -4],\n      [1, 10],\n      [-7, 18],\n      [12, 17],\n      [5, -3],\n      [11, 5],\n      [-2, 4],\n      [13, 17],\n      [6, 2],\n      [13, -13],\n      [36, 2],\n      [14, -2],\n      [17, -9],\n      [16, 0],\n      [17, 6],\n      [3, -6],\n      [11, -2],\n      [10, 4],\n      [16, -8],\n      [10, 5]\n    ],\n    [\n      [5628, 8557],\n      [8, 2],\n      [12, -10],\n      [-17, -13],\n      [-15, -4],\n      [-10, 7],\n      [0, 13],\n      [22, 5]\n    ],\n    [\n      [5631, 8581],\n      [8, -10],\n      [-15, -8],\n      [-3, 11],\n      [-9, 4],\n      [19, 3]\n    ],\n    [\n      [5778, 8608],\n      [4, -7]\n    ],\n    [\n      [5782, 8601],\n      [-5, -1]\n    ],\n    [\n      [5777, 8600],\n      [3, -1]\n    ],\n    [\n      [5780, 8599],\n      [-7, -9]\n    ],\n    [\n      [5773, 8590],\n      [-4, -10]\n    ],\n    [\n      [5769, 8580],\n      [-12, 1],\n      [-9, -8],\n      [13, -28],\n      [6, -22]\n    ],\n    [\n      [5767, 8523],\n      [5, -8],\n      [-7, -3],\n      [-6, -16]\n    ],\n    [\n      [5759, 8496],\n      [-14, 5],\n      [-8, -6],\n      [-15, 19],\n      [-26, 13],\n      [-21, -12]\n    ],\n    [\n      [5675, 8515],\n      [7, 26],\n      [-10, -3],\n      [-13, 5],\n      [-6, 13],\n      [-3, 20],\n      [6, 3],\n      [-5, 14],\n      [18, 5],\n      [6, 10],\n      [30, 1],\n      [8, 10],\n      [35, -13],\n      [27, -2],\n      [3, 4]\n    ],\n    [\n      [6160, 5833],\n      [0, -12]\n    ],\n    [\n      [6192, 5816],\n      [-8, -22],\n      [5, -23],\n      [5, -13],\n      [6, -8],\n      [1, -13],\n      [4, -12],\n      [5, -4],\n      [12, -21],\n      [51, -34],\n      [31, -23],\n      [28, 0]\n    ],\n    [\n      [6332, 5643],\n      [-21, -43],\n      [-31, -61],\n      [-14, -31],\n      [-14, -34],\n      [-5, -9],\n      [-27, 3],\n      [-20, -14],\n      [-8, -12],\n      [-1, -8],\n      [-9, -7],\n      [-12, -2],\n      [-7, -13]\n    ],\n    [\n      [6163, 5412],\n      [-19, -3],\n      [-3, 2],\n      [-9, 19],\n      [-26, -24],\n      [-8, -27],\n      [-25, 12],\n      [-15, 0],\n      [-7, 11],\n      [-28, 36],\n      [-23, 1],\n      [-3, 10]\n    ],\n    [\n      [5997, 5449],\n      [-4, 8],\n      [0, 27],\n      [-2, 9],\n      [-11, -2],\n      [-1, 9],\n      [-5, 7],\n      [-3, 12],\n      [0, 13],\n      [-4, 11],\n      [-3, 24],\n      [-6, 5],\n      [0, 8],\n      [-6, 4],\n      [-7, 24],\n      [-9, 16],\n      [-19, 8],\n      [-1, 9],\n      [5, 9],\n      [0, 17],\n      [12, 3],\n      [2, -5],\n      [7, 3],\n      [5, 9],\n      [-1, 50]\n    ],\n    [\n      [5946, 5727],\n      [4, 33],\n      [3, 9],\n      [-1, 22],\n      [7, 18],\n      [6, -7],\n      [5, 5],\n      [0, 25],\n      [4, 16],\n      [-1, 14],\n      [6, 8],\n      [2, 12],\n      [11, 31],\n      [11, 1],\n      [0, 19],\n      [3, 19],\n      [6, 24],\n      [2, 28]\n    ],\n    [\n      [5634, 8649],\n      [-3, -11],\n      [-9, 9],\n      [12, 2]\n    ],\n    [\n      [5804, 9158],\n      [-14, -7],\n      [8, -9],\n      [-8, -12],\n      [7, -21],\n      [18, -7],\n      [18, -21],\n      [-2, -10],\n      [-23, -30],\n      [-1, -9],\n      [13, -20],\n      [11, -25],\n      [5, -23],\n      [-10, -1],\n      [2, -32],\n      [-7, -6],\n      [6, -11],\n      [9, -1],\n      [-2, -23],\n      [14, -8],\n      [1, -11],\n      [-17, -18],\n      [14, -16],\n      [21, -15],\n      [9, -17],\n      [-9, -24],\n      [-25, -28],\n      [-15, -23],\n      [-18, -22],\n      [-10, -7],\n      [-27, -31]\n    ],\n    [\n      [5772, 8670],\n      [-31, -8],\n      [-19, -2],\n      [-8, -8],\n      [-15, 0],\n      [-6, -6],\n      [-38, -11],\n      [-10, -6],\n      [-10, 17],\n      [3, 10],\n      [-12, -6],\n      [2, 10],\n      [-10, 0],\n      [-12, 14],\n      [-5, -7],\n      [-8, 8],\n      [-2, 23],\n      [5, 3],\n      [3, 23],\n      [-5, 25],\n      [-5, 3],\n      [3, 22],\n      [-6, 2],\n      [3, 27],\n      [13, 9],\n      [-5, 12],\n      [11, -3],\n      [13, 8],\n      [-5, 9],\n      [17, 9],\n      [3, 10],\n      [13, 6],\n      [10, 18],\n      [17, 18],\n      [5, 16],\n      [25, 8],\n      [-4, 14],\n      [2, 17],\n      [-33, 19]\n    ],\n    [\n      [5671, 8973],\n      [-15, 37],\n      [10, 20],\n      [-12, 20],\n      [5, 16],\n      [-7, 26],\n      [5, 3],\n      [-23, 26],\n      [-21, 5],\n      [-41, 32]\n    ],\n    [\n      [5572, 9158],\n      [12, 1],\n      [7, 14],\n      [10, -2],\n      [21, -31],\n      [22, -6],\n      [20, 12],\n      [27, -15],\n      [7, 13],\n      [18, 12],\n      [-1, 17],\n      [6, 22],\n      [15, 15],\n      [16, -2],\n      [22, 10],\n      [17, -16],\n      [18, -7],\n      [6, -12],\n      [-14, -14],\n      [3, -11]\n    ],\n    [\n      [9954, 4093],\n      [-5, -13],\n      [-7, 0],\n      [12, 13]\n    ],\n    [\n      [9951, 4184],\n      [0, -5],\n      [9, -12],\n      [2, -26],\n      [-10, -2],\n      [-3, -6],\n      [-10, -2],\n      [-15, 11],\n      [-1, 12],\n      [5, 7],\n      [-2, 6],\n      [7, 12],\n      [18, 5]\n    ],\n    [\n      [0, 4252],\n      [9987, -23],\n      [-2, -11],\n      [4, 2],\n      [7, 14],\n      [0, -17],\n      [-16, -2],\n      [-1, 7],\n      [-11, -10],\n      [-4, -9],\n      [-7, 15],\n      [12, 16],\n      [13, 4],\n      [2, 8],\n      [-9984, 6]\n    ],\n    [\n      [3351, 2225],\n      [4, -3],\n      [-17, -28],\n      [-11, -4],\n      [-4, -11],\n      [-8, -4],\n      [-11, 12],\n      [16, 3],\n      [-4, 17],\n      [12, 1],\n      [-13, 15],\n      [11, -5],\n      [9, 6],\n      [15, -3],\n      [1, 4]\n    ],\n    [\n      [3368, 2227],\n      [7, 2],\n      [4, -8],\n      [12, 3],\n      [4, -18],\n      [-17, -11],\n      [-16, 0],\n      [8, -4],\n      [-12, -6],\n      [1, -10],\n      [-11, 5],\n      [3, -11],\n      [-9, 12],\n      [6, 17],\n      [13, 11],\n      [-3, 14],\n      [10, 4]\n    ],\n    [\n      [6541, 3981],\n      [5, -2],\n      [5, -13],\n      [-1, -13],\n      [-7, -1],\n      [-6, 6],\n      [-4, 14],\n      [8, 9]\n    ],\n    [\n      [6252, 4454],\n      [4, -5],\n      [-1, -13],\n      [-3, -1],\n      [0, 19]\n    ],\n    [\n      [3483, 5317],\n      [7, 10],\n      [4, 16],\n      [2, 29],\n      [4, 19],\n      [-10, 24],\n      [-3, 26],\n      [-1, 25],\n      [4, 16],\n      [5, 9]\n    ],\n    [\n      [3495, 5491],\n      [3, 5],\n      [3, 18],\n      [12, -10],\n      [11, -4],\n      [6, -6],\n      [10, -19],\n      [22, -31],\n      [3, -18],\n      [-1, -11]\n    ],\n    [\n      [3306, 6034],\n      [4, -11],\n      [-1, -7],\n      [-9, 13],\n      [1, 11],\n      [5, -6]\n    ],\n    [\n      [3288, 6120],\n      [2, -14],\n      [-4, -5],\n      [-3, 22],\n      [5, -3]\n    ],\n    [\n      [3295, 6124],\n      [5, -5],\n      [-9, -3],\n      [1, 18],\n      [3, -10]\n    ],\n    [\n      [5262, 7641],\n      [2, -7],\n      [1, -27],\n      [-4, -7],\n      [-2, -24],\n      [-7, -9],\n      [-8, 9],\n      [3, 8],\n      [-7, 3],\n      [2, 19],\n      [-5, 15],\n      [3, 10],\n      [13, 13],\n      [6, -1],\n      [3, 16],\n      [0, -18]\n    ],\n    [\n      [5160, 8036],\n      [5, -6],\n      [11, 0]\n    ],\n    [\n      [5172, 7849],\n      [16, 7]\n    ],\n    [\n      [5195, 7827],\n      [-7, -5],\n      [5, -18],\n      [5, -6],\n      [-2, -11],\n      [-13, -6],\n      [3, -11],\n      [8, -5],\n      [1, -9],\n      [-6, -11],\n      [4, -14],\n      [10, -7],\n      [9, 3],\n      [-4, -22]\n    ],\n    [\n      [5208, 7705],\n      [-2, -3]\n    ],\n    [\n      [5206, 7702],\n      [-2, -1]\n    ],\n    [\n      [5204, 7701],\n      [-11, -10],\n      [-9, -23],\n      [-14, -6],\n      [-22, 9],\n      [0, 7],\n      [-15, 1],\n      [-7, 6],\n      [-11, 0],\n      [-5, 6],\n      [-13, -17],\n      [-10, -6],\n      [-3, -9],\n      [0, -26],\n      [4, -8]\n    ],\n    [\n      [4950, 7681],\n      [9, 13],\n      [6, 48],\n      [-1, 11],\n      [4, 49],\n      [11, -11],\n      [0, 8],\n      [-14, 16],\n      [3, 6],\n      [1, 26],\n      [-20, 14],\n      [-9, 18],\n      [4, 14],\n      [-5, 12],\n      [-8, 1],\n      [-3, 15],\n      [-6, -3],\n      [-11, 11],\n      [-18, 6],\n      [-4, 6],\n      [-11, -5],\n      [0, 7],\n      [-9, 7],\n      [12, 5],\n      [-14, 12],\n      [1, 13],\n      [10, 6],\n      [22, 0],\n      [2, 9],\n      [12, 2],\n      [10, -20],\n      [12, 9],\n      [16, -4],\n      [4, 8],\n      [-1, 28],\n      [-6, 8],\n      [0, 18],\n      [16, 0],\n      [-1, -11],\n      [5, -6],\n      [30, -4],\n      [8, 7],\n      [-5, 3],\n      [2, 11],\n      [10, 9],\n      [18, 7],\n      [11, 15],\n      [0, 37],\n      [10, 8],\n      [17, 4]\n    ],\n    [\n      [4800, 8771],\n      [13, -21],\n      [-14, 13],\n      [1, 8]\n    ],\n    [\n      [4808, 8772],\n      [9, -11],\n      [-11, 3],\n      [2, 8]\n    ],\n    [\n      [9394, 5584],\n      [3, -9],\n      [-4, -1],\n      [1, 10]\n    ],\n    [\n      [5308, 4956],\n      [-3, 13],\n      [-10, 15],\n      [0, 9],\n      [-17, 28],\n      [-8, 19],\n      [7, -8],\n      [5, 3],\n      [-8, 8],\n      [-7, 1],\n      [-2, 13],\n      [-9, 21],\n      [1, 10],\n      [8, 2],\n      [-2, 7],\n      [-4, -5],\n      [-9, 16],\n      [-1, 11],\n      [-6, 18],\n      [5, 6],\n      [2, -7],\n      [2, 12],\n      [6, 13],\n      [1, 14],\n      [-1, 27],\n      [2, -7],\n      [11, -2],\n      [-8, 7],\n      [-5, 19],\n      [9, -6],\n      [-2, 24],\n      [3, 7],\n      [4, -4]\n    ],\n    [\n      [5272, 5240],\n      [6, 1],\n      [36, -1],\n      [0, 68]\n    ],\n    [\n      [4964, 8107],\n      [6, -6],\n      [-7, -6],\n      [-6, 6],\n      [7, 6]\n    ],\n    [\n      [4883, 8252],\n      [-4, -10],\n      [-6, 16],\n      [10, -6]\n    ],\n    [\n      [4825, 8298],\n      [-11, -2],\n      [-8, 20],\n      [-10, -17],\n      [-14, 5],\n      [-9, 13],\n      [11, 10],\n      [-5, 6],\n      [11, 2],\n      [8, 19]\n    ],\n    [\n      [4798, 8354],\n      [20, 10],\n      [13, -2],\n      [0, -8],\n      [18, -35],\n      [-7, -6],\n      [-11, -19],\n      [-6, 4]\n    ],\n    [\n      [4857, 8375],\n      [-7, 14],\n      [7, -1],\n      [0, -13]\n    ],\n    [\n      [4830, 8398],\n      [2, -9],\n      [-7, -6],\n      [-6, 6],\n      [1, 10],\n      [10, -1]\n    ],\n    [\n      [4839, 8409],\n      [-5, -13],\n      [-4, 6],\n      [9, 7]\n    ],\n    [\n      [4832, 8443],\n      [11, -10],\n      [-2, -5],\n      [-18, -4],\n      [7, 10],\n      [-7, 5],\n      [9, 4]\n    ],\n    [\n      [4795, 8489],\n      [3, -18],\n      [-4, 1],\n      [1, 17]\n    ],\n    [\n      [4800, 8503],\n      [1, -8],\n      [-10, 7],\n      [9, 1]\n    ],\n    [\n      [4824, 8506],\n      [5, -20],\n      [14, -6],\n      [-9, -6],\n      [-10, 1],\n      [-13, 15],\n      [11, 5],\n      [2, 11]\n    ],\n    [\n      [4827, 8543],\n      [-5, -20],\n      [-16, -15],\n      [3, 11],\n      [-7, 3],\n      [2, 15],\n      [23, 15],\n      [0, -9]\n    ],\n    [\n      [4907, 8560],\n      [9, 0],\n      [-6, -20],\n      [-22, -20],\n      [6, -7],\n      [-8, -14],\n      [22, 8],\n      [20, -3],\n      [16, 2],\n      [7, -13],\n      [-6, -9],\n      [-6, -24],\n      [-9, -18],\n      [-10, -8],\n      [8, -10],\n      [-21, -15],\n      [9, -4],\n      [11, 6],\n      [13, -8],\n      [14, -19],\n      [4, -29],\n      [8, -27],\n      [19, -9],\n      [4, -13],\n      [8, -7],\n      [-4, -5],\n      [11, -24],\n      [-7, 1],\n      [12, -23],\n      [-7, -19],\n      [8, -7],\n      [5, 11],\n      [20, -2],\n      [11, -10],\n      [3, -16],\n      [-5, -24],\n      [-4, 0],\n      [-14, -26],\n      [-11, -12],\n      [12, -3],\n      [13, 1],\n      [-3, -14],\n      [-11, -13],\n      [-5, 1],\n      [-14, -11],\n      [-12, 6],\n      [-18, -6],\n      [-3, 7],\n      [-18, -7],\n      [-14, -1],\n      [2, -8],\n      [-27, 9],\n      [-13, -6],\n      [-2, -17],\n      [-8, -7],\n      [-11, 10],\n      [-16, -3],\n      [-12, -21],\n      [-8, 10],\n      [19, 25],\n      [7, 14],\n      [1, 12],\n      [6, -1],\n      [2, 11],\n      [12, 3],\n      [11, -4],\n      [11, 2],\n      [8, 20],\n      [-23, -9],\n      [-8, 12],\n      [-13, -3],\n      [0, 6],\n      [-10, 3],\n      [-8, -7],\n      [-10, 18],\n      [13, 6],\n      [20, 18],\n      [2, 9],\n      [-2, 24],\n      [-17, -4],\n      [11, 12],\n      [5, 11],\n      [27, 10],\n      [8, 19],\n      [-4, 11],\n      [5, 2],\n      [-1, 14],\n      [-9, -6],\n      [-11, 23],\n      [9, 26],\n      [-19, -10],\n      [-11, 5],\n      [1, -10],\n      [-13, 10],\n      [-5, -5],\n      [-1, 21],\n      [11, 19],\n      [-15, 29],\n      [-8, -15],\n      [-4, -23],\n      [-5, -1],\n      [3, 22],\n      [-1, 18],\n      [5, 24],\n      [8, 18],\n      [-12, -13],\n      [-5, 11],\n      [0, 17],\n      [5, 10],\n      [-6, 19],\n      [7, 25],\n      [12, 0],\n      [-5, 20],\n      [11, 21],\n      [20, -6],\n      [26, 7]\n    ],\n    [\n      [4912, 8589],\n      [-2, -13],\n      [-4, 10],\n      [6, 3]\n    ],\n    [\n      [4964, 8673],\n      [4, -27],\n      [-15, 5],\n      [9, 7],\n      [2, 15]\n    ],\n    [\n      [6206, 7550],\n      [-23, 27],\n      [-5, -9],\n      [-8, 5],\n      [-9, -5],\n      [-8, 5]\n    ],\n    [\n      [6153, 7573],\n      [7, 17],\n      [-8, 51],\n      [-10, 6],\n      [-3, 11],\n      [-21, 13],\n      [-8, 10]\n    ],\n    [\n      [6110, 7681],\n      [2, 9],\n      [16, 0],\n      [27, -19],\n      [21, 2],\n      [7, -6],\n      [6, 1],\n      [10, -14],\n      [17, -9],\n      [-2, -8],\n      [6, -4],\n      [16, 12],\n      [7, -8],\n      [4, 8],\n      [11, -14],\n      [11, 0],\n      [-2, -18],\n      [8, -10],\n      [14, -9]\n    ],\n    [\n      [4995, 5824],\n      [5, -3],\n      [-3, -26],\n      [10, -13],\n      [3, -27],\n      [-4, -30],\n      [8, 0],\n      [-2, -24],\n      [2, -8],\n      [-4, -8],\n      [9, -19],\n      [-3, -11],\n      [0, -28],\n      [-3, -15],\n      [4, -3],\n      [-1, -23],\n      [-3, -2],\n      [6, -28],\n      [8, -9],\n      [5, -13]\n    ],\n    [\n      [5032, 5534],\n      [-7, -19],\n      [-15, 1],\n      [-21, -17],\n      [-12, -16],\n      [-6, 0],\n      [-6, -7],\n      [-11, -5],\n      [-10, -15],\n      [-7, 8],\n      [-24, 12]\n    ],\n    [\n      [4913, 5477],\n      [8, 2]\n    ],\n    [\n      [4851, 7264],\n      [0, 0]\n    ],\n    [\n      [4683, 5897],\n      [-3, -14],\n      [6, -9],\n      [6, 11],\n      [4, 0],\n      [8, -17],\n      [4, 13],\n      [5, 5],\n      [16, -11],\n      [2, 7],\n      [14, 19],\n      [5, -5],\n      [2, -20],\n      [3, -1],\n      [-1, -21],\n      [13, -17],\n      [-9, -23],\n      [5, 5],\n      [6, -3],\n      [0, -28],\n      [9, -12],\n      [0, -8]\n    ],\n    [\n      [4764, 5618],\n      [-6, 8],\n      [-1, -12],\n      [-11, -17],\n      [-5, 13],\n      [-4, 0],\n      [3, 19],\n      [-5, 25],\n      [0, 11],\n      [-8, 10],\n      [-7, -7],\n      [-6, 3]\n    ],\n    [\n      [4714, 5671],\n      [-3, 1],\n      [-5, -11],\n      [-3, 4],\n      [5, 15],\n      [-3, 10],\n      [0, 15],\n      [-4, 1],\n      [2, 13],\n      [-15, 39],\n      [-19, 0],\n      [-17, -7],\n      [-5, -26],\n      [-12, -21],\n      [-5, -1]\n    ],\n    [\n      [4630, 5703],\n      [4, 8],\n      [-12, 23],\n      [0, 12],\n      [-4, -2],\n      [-6, 13],\n      [-20, 29],\n      [4, 20],\n      [-5, -10],\n      [-3, 21],\n      [-4, -14],\n      [-2, 11]\n    ],\n    [\n      [4582, 5814],\n      [8, 30],\n      [12, 8],\n      [16, 4],\n      [0, 19],\n      [-6, 11],\n      [7, 3],\n      [-1, 24]\n    ],\n    [\n      [4618, 5913],\n      [19, -3],\n      [-1, -8],\n      [17, -6],\n      [3, -5],\n      [7, 6],\n      [20, 0]\n    ],\n    [\n      [4534, 5935],\n      [-2, 17],\n      [4, 7],\n      [8, -14],\n      [5, 5],\n      [-8, 2],\n      [-1, 13]\n    ],\n    [\n      [4540, 5965],\n      [29, 0],\n      [4, 12],\n      [7, 2],\n      [8, -5],\n      [2, -7],\n      [6, 1],\n      [4, -10],\n      [12, 7],\n      [3, -14],\n      [-15, -6],\n      [-5, 7],\n      [-11, 6],\n      [-6, 7],\n      [-1, -9],\n      [-5, -4],\n      [-12, -1],\n      [0, -11],\n      [-24, 1],\n      [-2, -6]\n    ],\n    [\n      [4553, 5826],\n      [1, -7],\n      [-6, 3],\n      [5, 4]\n    ],\n    [\n      [4582, 5814],\n      [-1, 9],\n      [-5, -7],\n      [-7, 20],\n      [5, 15],\n      [8, -2],\n      [-9, 7],\n      [-2, -8],\n      [-3, 8],\n      [2, 11],\n      [8, -1],\n      [-5, 6],\n      [-6, -7],\n      [-11, -6],\n      [3, 14],\n      [-7, -6],\n      [-6, 6],\n      [1, 13],\n      [-5, -2],\n      [-7, 9]\n    ],\n    [\n      [4535, 5893],\n      [14, 7],\n      [15, -1],\n      [13, 14],\n      [41, 0]\n    ],\n    [\n      [5272, 5240],\n      [-3, 6],\n      [-10, 3],\n      [3, 15],\n      [10, 28],\n      [0, 26]\n    ],\n    [\n      [5243, 5399],\n      [5, -8],\n      [-8, -24],\n      [-6, 4],\n      [0, 10],\n      [4, 1],\n      [1, 11],\n      [4, 6]\n    ],\n    [\n      [5663, 7229],\n      [13, -11],\n      [9, 5],\n      [22, -8],\n      [8, 3],\n      [-1, -12],\n      [9, 6],\n      [7, -7],\n      [-2, -5],\n      [-25, -2],\n      [-16, -4],\n      [0, 9],\n      [-10, 6],\n      [-24, 5],\n      [1, 17],\n      [4, 5],\n      [5, -7]\n    ],\n    [\n      [5756, 7245],\n      [-1, -17],\n      [-3, -5],\n      [4, 22]\n    ],\n    [\n      [5640, 7268],\n      [-4, -2],\n      [0, 12],\n      [4, -10]\n    ],\n    [\n      [5784, 7281],\n      [-5, -19],\n      [-8, -12],\n      [-2, 13],\n      [5, 13],\n      [10, 5]\n    ],\n    [\n      [5710, 7319],\n      [-4, -10],\n      [-2, 10],\n      [6, 0]\n    ],\n    [\n      [5731, 7350],\n      [-10, -7],\n      [2, 7],\n      [8, 0]\n    ],\n    [\n      [5748, 7357],\n      [-5, -6],\n      [-5, 6],\n      [10, 0]\n    ],\n    [\n      [5576, 7363],\n      [5, -7],\n      [-4, -5],\n      [-5, 10],\n      [4, 2]\n    ],\n    [\n      [5690, 7366],\n      [3, -13],\n      [-8, 16],\n      [5, -3]\n    ],\n    [\n      [5571, 7398],\n      [6, -23],\n      [-8, 2],\n      [-3, 14],\n      [5, 7]\n    ],\n    [\n      [5723, 7405],\n      [3, -16],\n      [-4, -9],\n      [-5, 25],\n      [6, 0]\n    ],\n    [\n      [5651, 7423],\n      [11, -14],\n      [8, 0],\n      [5, -29],\n      [7, 0],\n      [0, -10],\n      [-7, 1],\n      [-8, 23],\n      [-11, 0],\n      [-1, 9],\n      [-12, 17],\n      [-9, -1],\n      [13, 12],\n      [4, -8]\n    ],\n    [\n      [5733, 7446],\n      [6, -17],\n      [-13, 0],\n      [4, 10],\n      [-10, -4],\n      [-2, 8],\n      [13, 8],\n      [2, -5]\n    ],\n    [\n      [5553, 7474],\n      [-2, -18],\n      [-5, 18],\n      [7, 0]\n    ],\n    [\n      [5706, 7488],\n      [-2, -14],\n      [-9, 3],\n      [0, 9],\n      [11, 2]\n    ],\n    [\n      [5688, 7522],\n      [-8, 1],\n      [4, 10],\n      [4, -11]\n    ],\n    [\n      [5586, 7536],\n      [18, 3],\n      [4, 11],\n      [23, 3],\n      [5, 10]\n    ],\n    [\n      [5731, 7585],\n      [7, -8],\n      [1, -14],\n      [-8, -6],\n      [0, -15],\n      [-8, -13]\n    ],\n    [\n      [5723, 7529],\n      [-3, 5],\n      [-11, 2],\n      [-11, 8],\n      [-12, -10],\n      [-8, 6],\n      [-9, -12],\n      [-11, 1],\n      [4, -19],\n      [-4, -10],\n      [8, -6],\n      [-1, -11],\n      [-9, 17],\n      [-8, 0],\n      [0, -6],\n      [10, -14],\n      [-9, 6],\n      [-2, 14],\n      [-12, 9],\n      [0, 14],\n      [-6, -6],\n      [-3, -28],\n      [8, -15],\n      [2, -11],\n      [5, -6],\n      [7, -17],\n      [-11, 9],\n      [-4, -7],\n      [6, -16],\n      [-9, -6],\n      [17, -11],\n      [0, -9],\n      [8, -2],\n      [13, -15],\n      [-2, -5],\n      [2, -25],\n      [-3, -1],\n      [-12, 22],\n      [-15, -11],\n      [5, -3],\n      [0, -11],\n      [10, -10],\n      [-11, -8],\n      [-11, 16],\n      [0, -8],\n      [7, -21],\n      [3, -20],\n      [0, -17],\n      [-11, 22],\n      [-5, -6],\n      [-4, -14],\n      [0, 13],\n      [-6, 19],\n      [-6, -1],\n      [0, -14],\n      [-7, 3],\n      [-3, 13],\n      [3, 14],\n      [-3, 15],\n      [-13, 17],\n      [7, 16],\n      [7, 2],\n      [6, 9],\n      [19, -10],\n      [10, -12],\n      [9, 10],\n      [-5, 6],\n      [-17, 14],\n      [-1, -6],\n      [-12, 4],\n      [-12, -7],\n      [-4, 8],\n      [-8, -4],\n      [-5, 24],\n      [-4, -1],\n      [-1, 16],\n      [-13, 20],\n      [-2, 14],\n      [-5, 4]\n    ],\n    [\n      [5583, 7526],\n      [0, 0]\n    ],\n    [\n      [5582, 7531],\n      [4, 5]\n    ],\n    [\n      [3288, 5876],\n      [-5, -2],\n      [5, 13],\n      [0, -11]\n    ],\n    [\n      [3786, 8632],\n      [-12, -4],\n      [4, 9],\n      [8, -5]\n    ],\n    [\n      [3787, 8645],\n      [3, -11],\n      [-11, 4],\n      [-4, 10],\n      [12, -3]\n    ],\n    [\n      [3846, 8835],\n      [12, -11],\n      [-9, 0],\n      [-12, 15],\n      [9, -4]\n    ],\n    [\n      [3579, 8886],\n      [3, 14],\n      [6, -4],\n      [-9, -10]\n    ],\n    [\n      [3876, 8910],\n      [-1, -14],\n      [-10, 26],\n      [11, -12]\n    ],\n    [\n      [3961, 8973],\n      [2, -9],\n      [-18, -2],\n      [0, 10],\n      [16, 1]\n    ],\n    [\n      [3583, 9209],\n      [9, -5],\n      [-9, -16],\n      [-11, 9],\n      [11, 12]\n    ],\n    [\n      [3535, 9210],\n      [20, -7],\n      [5, -10],\n      [-9, -9],\n      [-40, -14],\n      [-19, 9],\n      [8, 9],\n      [-21, 2],\n      [3, 11],\n      [-6, 23],\n      [14, 9],\n      [30, -7],\n      [15, -16]\n    ],\n    [\n      [4292, 9258],\n      [5, -6],\n      [-22, -8],\n      [-56, -5],\n      [5, 12],\n      [24, 14],\n      [11, 0],\n      [27, 11],\n      [6, -18]\n    ],\n    [\n      [3513, 9274],\n      [-13, 6],\n      [9, 10],\n      [4, -16]\n    ],\n    [\n      [3537, 9281],\n      [-14, 10],\n      [21, 1],\n      [-7, -11]\n    ],\n    [\n      [3472, 9375],\n      [-13, -11],\n      [-4, 9],\n      [17, 2]\n    ],\n    [\n      [4335, 9380],\n      [22, -3],\n      [33, -25],\n      [-20, 4],\n      [17, -11],\n      [-5, -9],\n      [-50, 20],\n      [-10, 8],\n      [0, 15],\n      [13, 1]\n    ],\n    [\n      [4354, 9391],\n      [36, -8],\n      [-3, -13],\n      [-17, -1],\n      [-14, 11],\n      [-38, 1],\n      [0, 5],\n      [36, 5]\n    ],\n    [\n      [4333, 9407],\n      [21, -8],\n      [-47, 6],\n      [55, -12],\n      [-48, -4],\n      [-29, 9],\n      [13, 12],\n      [35, -3]\n    ],\n    [\n      [4418, 9469],\n      [11, -1],\n      [11, -14],\n      [-32, -5],\n      [-18, 7],\n      [3, 8],\n      [25, 5]\n    ],\n    [\n      [4439, 9496],\n      [13, -2],\n      [-12, -10],\n      [-14, 7],\n      [13, 5]\n    ],\n    [\n      [4505, 9520],\n      [-7, -8],\n      [21, -2],\n      [-15, -6],\n      [-30, -2],\n      [2, 17],\n      [29, 1]\n    ],\n    [\n      [4481, 9596],\n      [3, -41],\n      [-16, 34],\n      [13, 7]\n    ],\n    [\n      [2994, 9643],\n      [23, -5],\n      [-21, -3],\n      [-2, 8]\n    ],\n    [\n      [4445, 9674],\n      [18, -11],\n      [-32, 9],\n      [14, 2]\n    ],\n    [\n      [4519, 9788],\n      [-33, -16],\n      [-26, 9],\n      [49, 14],\n      [10, -7]\n    ],\n    [\n      [3575, 9904],\n      [-53, 7],\n      [4, 13],\n      [49, -20]\n    ],\n    [\n      [3722, 9942],\n      [44, -15],\n      [-28, -11],\n      [-44, 11],\n      [-20, 15],\n      [48, 0]\n    ],\n    [\n      [3880, 9983],\n      [38, -14],\n      [-47, 9],\n      [9, 5]\n    ],\n    [\n      [4105, 9998],\n      [43, -1],\n      [139, -17],\n      [-12, -6],\n      [-116, -3],\n      [-142, -14],\n      [100, 5],\n      [47, 8],\n      [96, -4],\n      [39, 6],\n      [2, -18],\n      [34, 4],\n      [72, -17],\n      [-31, -17],\n      [-54, -4],\n      [-152, -7],\n      [-81, -17],\n      [1, -9],\n      [30, 8],\n      [107, 13],\n      [89, -4],\n      [-3, -12],\n      [-44, -9],\n      [-2, -11],\n      [85, 20],\n      [2, 14],\n      [51, 4],\n      [11, -19],\n      [-7, -14],\n      [-56, -36],\n      [-16, -18],\n      [53, 26],\n      [58, 30],\n      [75, -8],\n      [37, 24],\n      [53, -1],\n      [57, -12],\n      [13, -8],\n      [-64, -27],\n      [-24, 0],\n      [7, -12],\n      [-31, -8],\n      [-46, 1],\n      [36, -15],\n      [-18, -11],\n      [-40, -3],\n      [-44, 6],\n      [-25, -22],\n      [11, -12],\n      [20, 3],\n      [-9, -21],\n      [17, -12],\n      [-27, -8],\n      [0, -11],\n      [-28, -2],\n      [-11, -42],\n      [-18, -22],\n      [18, 0],\n      [10, 17],\n      [51, -16],\n      [-6, -10],\n      [-19, 10],\n      [-22, -2],\n      [38, -26],\n      [10, 6],\n      [21, -5],\n      [2, -18],\n      [-10, -12],\n      [-35, 13],\n      [-27, -3],\n      [-24, -13],\n      [-13, 12],\n      [-14, -8],\n      [10, -12],\n      [18, 1],\n      [0, -16],\n      [19, 4],\n      [30, -4],\n      [6, -11],\n      [-15, -4],\n      [21, -14],\n      [3, -29],\n      [-17, -4],\n      [-4, 9],\n      [-16, -2],\n      [-26, 17],\n      [8, -12],\n      [24, -14],\n      [-8, -27],\n      [30, -5],\n      [7, 6],\n      [13, -11],\n      [-18, -15],\n      [-16, 2],\n      [-7, 11],\n      [-36, -2],\n      [-11, -18],\n      [9, -27],\n      [-2, 21],\n      [9, 3],\n      [36, -10],\n      [-7, -26],\n      [-28, 3],\n      [-18, -14],\n      [-36, 11],\n      [-14, 9],\n      [-1, 13],\n      [-10, -16],\n      [-25, -4],\n      [-17, -16],\n      [24, -7],\n      [-16, -14],\n      [22, -6],\n      [6, -12],\n      [-19, -7],\n      [21, 1],\n      [23, -15],\n      [33, -16],\n      [-17, -14],\n      [20, 9],\n      [14, -3],\n      [-17, -11],\n      [2, -17],\n      [9, 14],\n      [10, -1],\n      [0, -35],\n      [8, -18],\n      [-13, -10],\n      [-11, 3],\n      [-7, 22],\n      [-2, -22],\n      [-19, 0],\n      [-16, 10],\n      [-9, 27],\n      [-24, 13],\n      [-15, 14],\n      [-20, 5],\n      [-16, -3],\n      [-26, 23],\n      [-16, -2],\n      [31, -13],\n      [-8, -6],\n      [26, -8],\n      [25, 1],\n      [11, -12],\n      [-16, -13],\n      [-24, -7],\n      [-44, 2],\n      [14, -7],\n      [-11, -17],\n      [2, -11],\n      [40, 7],\n      [13, -6],\n      [-17, -3],\n      [-27, -14],\n      [-16, -3],\n      [34, -3],\n      [11, 16],\n      [15, -4],\n      [29, 13],\n      [23, -11],\n      [25, -7],\n      [33, 0],\n      [0, -8],\n      [-14, 0],\n      [-4, -12],\n      [-19, -2],\n      [1, -10],\n      [-13, -8],\n      [-17, -1],\n      [2, -9],\n      [-26, -21],\n      [-31, -10],\n      [-13, -9],\n      [-23, 1],\n      [1, -6],\n      [-24, -7],\n      [-9, 4],\n      [-5, -11],\n      [-18, 10],\n      [-1, -16],\n      [-30, -3],\n      [-30, 17],\n      [6, -17],\n      [-4, -12],\n      [-11, 1],\n      [-16, -12],\n      [-12, -33],\n      [-13, -5],\n      [-1, -15],\n      [-27, -26],\n      [-15, -2],\n      [-14, -18],\n      [-13, 3],\n      [-20, -12],\n      [-17, 14],\n      [15, 16],\n      [-12, 0],\n      [-7, -21],\n      [-14, -1],\n      [8, -16],\n      [-17, 1],\n      [-7, -6],\n      [-8, 9],\n      [-14, -12],\n      [2, -15],\n      [-14, -14],\n      [-10, 8],\n      [-13, -3],\n      [1, -12],\n      [14, -11],\n      [-1, -13],\n      [-13, -9],\n      [-12, 1],\n      [3, -8],\n      [18, -1],\n      [7, -27],\n      [-13, 0],\n      [6, -7],\n      [-18, -12],\n      [-13, 6],\n      [12, -15],\n      [-4, -15],\n      [-21, -8],\n      [-6, -11],\n      [9, -15],\n      [-21, 9],\n      [12, -11],\n      [9, -1],\n      [-8, -21],\n      [11, 5],\n      [-6, -22],\n      [-8, -6],\n      [7, -7],\n      [-17, -13],\n      [9, -6],\n      [-3, -17],\n      [-20, 3],\n      [20, -7],\n      [-12, -15],\n      [-11, 5],\n      [14, -18],\n      [0, -9],\n      [-29, 6],\n      [-13, -12],\n      [-12, 10],\n      [3, 19],\n      [-9, 0],\n      [6, 10],\n      [-15, -11],\n      [-11, 20],\n      [6, 8],\n      [-3, 10],\n      [-10, -9],\n      [-22, -8],\n      [3, 7],\n      [-19, -8],\n      [-17, 0],\n      [14, 12],\n      [-20, 6],\n      [-4, 9],\n      [7, 5],\n      [-20, 5],\n      [-1, 9],\n      [-10, 13],\n      [8, 10],\n      [-10, 16],\n      [-15, 2],\n      [-8, 9],\n      [5, 28],\n      [-12, 7],\n      [15, 8],\n      [-28, -3],\n      [-2, 19],\n      [-11, 10],\n      [3, 23],\n      [-6, 8],\n      [14, -1],\n      [13, 13],\n      [6, 16],\n      [9, -13],\n      [-4, 16],\n      [-11, 4],\n      [-15, -12],\n      [2, 10],\n      [-19, -33],\n      [-9, 0],\n      [1, 29],\n      [22, 16],\n      [-10, 2],\n      [-8, -13],\n      [-23, 50],\n      [-12, 0],\n      [-4, 23],\n      [19, 15],\n      [18, 9],\n      [21, 21],\n      [-21, -13],\n      [-3, -7],\n      [-33, -23],\n      [-9, 1],\n      [1, 22],\n      [11, 11],\n      [16, -1],\n      [5, 10],\n      [-34, 3],\n      [-6, 14],\n      [49, 13],\n      [17, -3],\n      [12, 6],\n      [-28, -2],\n      [-28, -7],\n      [-21, -2],\n      [2, 10],\n      [25, 18],\n      [15, 2],\n      [12, -7],\n      [24, 4],\n      [-49, 5],\n      [-24, -17],\n      [0, 18],\n      [22, 10],\n      [-5, 12],\n      [15, -1],\n      [16, -8],\n      [21, 2],\n      [-6, 8],\n      [7, 12],\n      [-13, 0],\n      [9, -8],\n      [-31, -6],\n      [-3, 7],\n      [-15, -1],\n      [13, 14],\n      [18, 4],\n      [23, -2],\n      [-5, 11],\n      [7, 22],\n      [16, -8],\n      [0, 19],\n      [-17, -7],\n      [10, 18],\n      [-2, 11],\n      [15, 4],\n      [-8, 11],\n      [-24, 0],\n      [-25, 5],\n      [-25, 17],\n      [-22, 4],\n      [-15, 18],\n      [11, 6],\n      [48, -8],\n      [25, -15],\n      [24, -6],\n      [5, 11],\n      [-14, -6],\n      [1, 16],\n      [-24, 21],\n      [17, -6],\n      [-5, 9],\n      [-22, -1],\n      [16, 9],\n      [-4, 6],\n      [-19, -12],\n      [5, 13],\n      [24, 4],\n      [-8, 4],\n      [-21, -8],\n      [-7, 9],\n      [25, 4],\n      [-41, 6],\n      [-4, 7],\n      [-14, -11],\n      [0, -11],\n      [-14, -5],\n      [-24, 1],\n      [-17, 17],\n      [17, 13],\n      [-8, 8],\n      [19, 13],\n      [-21, 11],\n      [17, 5],\n      [10, 12],\n      [-3, 15],\n      [-18, 4],\n      [4, 18],\n      [-30, 38],\n      [7, 13],\n      [-16, 5],\n      [7, 11],\n      [-21, 13],\n      [4, 8],\n      [-31, 10],\n      [-14, 17],\n      [13, 3],\n      [-7, 17],\n      [-16, -2],\n      [-4, 10],\n      [-26, 9],\n      [-17, -2],\n      [-4, 9],\n      [-42, 5],\n      [-31, 8],\n      [-6, -11],\n      [-27, 5],\n      [1, -9],\n      [-35, -1],\n      [7, 10],\n      [-15, 1],\n      [-6, -12],\n      [-18, 11],\n      [-7, -6],\n      [23, -12],\n      [-58, 9],\n      [-30, 15],\n      [36, 17],\n      [-57, 7],\n      [-26, 11],\n      [12, 12],\n      [50, 5],\n      [21, 6],\n      [50, -3],\n      [14, 9],\n      [-19, 13],\n      [-24, -11],\n      [-45, -4],\n      [-29, 6],\n      [21, 8],\n      [-33, -1],\n      [13, 9],\n      [-30, -4],\n      [-44, 23],\n      [8, 21],\n      [91, 16],\n      [8, 10],\n      [43, 9],\n      [42, -2],\n      [31, 23],\n      [-5, 30],\n      [-56, 2],\n      [-12, 15],\n      [39, 20],\n      [28, 7],\n      [8, 12],\n      [46, 13],\n      [44, -9],\n      [16, 6],\n      [6, 19],\n      [-19, 15],\n      [104, 24],\n      [90, 11],\n      [24, -14],\n      [-6, -33],\n      [24, 17],\n      [-1, 11],\n      [85, -18],\n      [-31, 13],\n      [44, 0],\n      [-31, 12],\n      [-15, 20],\n      [65, -8],\n      [77, -19],\n      [22, -14],\n      [25, 1],\n      [-8, 28],\n      [38, -1],\n      [-68, 26],\n      [132, 2],\n      [-157, 7],\n      [28, 14],\n      [74, 4],\n      [6, 5],\n      [54, -17],\n      [95, 1],\n      [-42, 3],\n      [53, 5],\n      [-49, 3],\n      [0, 13],\n      [180, 11]\n    ],\n    [\n      [2530, 6098],\n      [8, -8],\n      [4, 5],\n      [7, -7]\n    ],\n    [\n      [2549, 6088],\n      [-17, -28],\n      [-9, -9],\n      [-2, -15],\n      [2, -14],\n      [-6, -9]\n    ],\n    [\n      [2517, 6013],\n      [-6, -1],\n      [2, -10],\n      [-5, -3],\n      [-10, -17],\n      [-1, -9]\n    ],\n    [\n      [2497, 5973],\n      [-15, 12],\n      [-19, 1],\n      [-9, 9],\n      [-17, 25]\n    ],\n    [\n      [2437, 6020],\n      [3, 7],\n      [-1, 33],\n      [1, 10],\n      [11, 38],\n      [36, 0],\n      [2, 20],\n      [-7, 4],\n      [-4, 17],\n      [-8, 7],\n      [-1, 7],\n      [-9, 13],\n      [12, 0],\n      [1, 33],\n      [50, 0]\n    ],\n    [\n      [9022, 5957],\n      [-2, -11],\n      [-3, 10],\n      [5, 12],\n      [4, -3],\n      [-4, -8]\n    ],\n    [\n      [3409, 5499],\n      [-2, -9],\n      [4, -10],\n      [-2, -8],\n      [-13, -2],\n      [-5, -8],\n      [2, -9],\n      [-6, -39],\n      [4, -7],\n      [2, -13],\n      [5, -8],\n      [0, -8],\n      [10, 0],\n      [2, -28],\n      [6, -15],\n      [0, -8],\n      [9, -27],\n      [6, -5]\n    ],\n    [\n      [3312, 5482],\n      [-18, 43],\n      [8, 14],\n      [-2, 28],\n      [9, 7],\n      [5, -2],\n      [11, 21],\n      [-7, 0],\n      [-5, 21],\n      [5, 19],\n      [5, 3],\n      [15, 22],\n      [-6, 18]\n    ],\n    [\n      [3332, 5676],\n      [4, -9],\n      [7, -3],\n      [15, -20],\n      [17, -36],\n      [1, -15],\n      [-4, -18],\n      [1, -10],\n      [3, 13],\n      [4, 2],\n      [10, -8],\n      [9, -18],\n      [2, -9],\n      [6, -1],\n      [5, -11],\n      [0, -27],\n      [-3, -7]\n    ],\n    [\n      [8172, 6482],\n      [5, -7],\n      [-5, -9],\n      [-9, 5],\n      [5, 9]\n    ],\n    [\n      [7037, 2130],\n      [10, -6],\n      [-7, -4],\n      [-3, 10]\n    ],\n    [\n      [2691, 6046],\n      [-12, -1],\n      [-4, -8],\n      [-12, -4],\n      [-8, -7],\n      [-8, 2],\n      [-3, 9],\n      [-6, -6],\n      [-4, -11],\n      [0, -12],\n      [-5, -3],\n      [-5, -13],\n      [-6, -5],\n      [0, -7],\n      [-8, 9],\n      [-8, -14],\n      [-13, -2],\n      [2, -26],\n      [-6, -2],\n      [0, -10],\n      [-11, -5]\n    ],\n    [\n      [2574, 5930],\n      [-4, 22],\n      [-10, 3]\n    ],\n    [\n      [2560, 5955],\n      [3, 17],\n      [-2, 12],\n      [-6, -1],\n      [-3, 6],\n      [-10, -8],\n      [0, 7],\n      [-7, 3],\n      [-8, 17],\n      [-10, 5]\n    ],\n    [\n      [2549, 6088],\n      [8, 9],\n      [7, 2],\n      [7, -7],\n      [2, 4],\n      [12, -6],\n      [4, 3],\n      [12, -1],\n      [13, 11],\n      [15, -6],\n      [11, 6],\n      [18, -9],\n      [13, -22],\n      [-8, 6],\n      [10, -19],\n      [8, 0],\n      [-7, 9],\n      [9, -6],\n      [4, -13],\n      [4, -3]\n    ],\n    [\n      [5512, 7634],\n      [1, -9]\n    ],\n    [\n      [5513, 7625],\n      [-8, 12],\n      [-27, 21],\n      [12, -5]\n    ],\n    [\n      [5466, 7679],\n      [-8, -5],\n      [-2, 8],\n      [10, -3]\n    ],\n    [\n      [5412, 7751],\n      [11, -14],\n      [-10, 8],\n      [-1, 6]\n    ],\n    [\n      [5401, 7772],\n      [0, -20],\n      [-5, 27],\n      [5, -7]\n    ],\n    [\n      [5404, 7789],\n      [3, -10],\n      [-5, -3],\n      [2, 13]\n    ],\n    [\n      [5458, 7861],\n      [5, -3],\n      [18, -29],\n      [6, 0],\n      [9, -10],\n      [17, 0],\n      [11, 9]\n    ],\n    [\n      [5524, 7828],\n      [3, -33],\n      [12, -10],\n      [-10, -3],\n      [-1, -17]\n    ],\n    [\n      [5488, 7656],\n      [-12, 12],\n      [-6, 13],\n      [-14, 10],\n      [-11, -4],\n      [-2, 10],\n      [-14, 14],\n      [-9, 17],\n      [8, 5],\n      [-15, 23],\n      [-1, 23],\n      [-9, 12],\n      [-7, 2],\n      [-3, -20],\n      [-8, -11],\n      [-8, 20],\n      [0, 20]\n    ],\n    [\n      [5377, 7802],\n      [9, -3],\n      [13, 3],\n      [6, 6],\n      [20, -9],\n      [-2, 17],\n      [12, 6],\n      [-2, 20],\n      [9, 5],\n      [8, 12],\n      [8, 2]\n    ],\n    [\n      [3002, 6248],\n      [-1, 2]\n    ],\n    [\n      [2977, 6260],\n      [-12, 8],\n      [1, 7],\n      [11, -10],\n      [0, -5]\n    ],\n    [\n      [3000, 6254],\n      [2, -6]\n    ],\n    [\n      [3006, 6222],\n      [-8, 11],\n      [-24, -5],\n      [-11, 6],\n      [-8, 0],\n      [-6, -5],\n      [1, -8],\n      [-12, 16],\n      [-7, 4],\n      [2, 15],\n      [6, 2],\n      [16, -10],\n      [24, -4],\n      [4, 8],\n      [7, -2],\n      [0, 7],\n      [-13, 23],\n      [1, 19],\n      [3, 2],\n      [-9, 11],\n      [-11, 1],\n      [-2, 6],\n      [8, 10],\n      [11, 2],\n      [13, -11],\n      [15, -2]\n    ],\n    [\n      [5614, 7970],\n      [21, -26]\n    ],\n    [\n      [5635, 7944],\n      [-8, -11],\n      [-4, 2],\n      [-13, -17],\n      [-4, -19],\n      [-5, -6],\n      [-4, -21],\n      [-6, -5],\n      [-1, -12],\n      [-6, -10],\n      [-7, 2],\n      [-5, -8],\n      [-10, -1]\n    ],\n    [\n      [5562, 7838],\n      [-16, 4],\n      [-11, -11],\n      [-11, -3]\n    ],\n    [\n      [5458, 7861],\n      [-7, 21],\n      [-4, -1]\n    ],\n    [\n      [5476, 7947],\n      [6, -1],\n      [10, -13],\n      [15, 0],\n      [14, 3],\n      [-1, 10],\n      [7, 4],\n      [14, 3],\n      [4, 7],\n      [8, -7],\n      [12, 11],\n      [3, 13],\n      [9, 3],\n      [9, -5],\n      [11, 3],\n      [5, -11],\n      [12, 3]\n    ],\n    [\n      [8426, 4574],\n      [2, -3],\n      [-6, -11],\n      [-11, -6],\n      [0, 8],\n      [6, 3],\n      [10, 17],\n      [-1, -8]\n    ],\n    [\n      [8386, 4582],\n      [-1, -10],\n      [-6, 2],\n      [7, 8]\n    ],\n    [\n      [8333, 4644],\n      [9, -18],\n      [4, 2],\n      [10, -24],\n      [-10, -15],\n      [-9, 5],\n      [-5, 14],\n      [-10, 12],\n      [-15, 3],\n      [-4, 11],\n      [10, 10],\n      [20, 0]\n    ],\n    [\n      [8473, 4637],\n      [-2, -11],\n      [-16, -29],\n      [-8, 0],\n      [-2, -6],\n      [-12, -5],\n      [-3, 9],\n      [7, 6],\n      [-5, 10],\n      [2, 16],\n      [10, 18]\n    ],\n    [\n      [8444, 4645],\n      [2, -5],\n      [7, 4],\n      [3, 10]\n    ],\n    [\n      [8456, 4654],\n      [13, 13]\n    ],\n    [\n      [8469, 4667],\n      [7, -5],\n      [0, -8],\n      [-6, -2],\n      [3, -15]\n    ],\n    [\n      [8318, 4695],\n      [-3, -16],\n      [1, 18],\n      [2, -2]\n    ],\n    [\n      [8424, 4708],\n      [1, -8],\n      [-8, -2],\n      [4, 11],\n      [3, -1]\n    ],\n    [\n      [8242, 4700],\n      [-7, -24],\n      [3, -4],\n      [-11, -3],\n      [-10, 6],\n      [6, 6],\n      [-1, 15],\n      [7, 13],\n      [8, -1],\n      [5, -8]\n    ],\n    [\n      [8442, 4708],\n      [-5, -4],\n      [-10, -16],\n      [-5, 4],\n      [7, 9],\n      [-2, 6],\n      [12, 4],\n      [3, -3]\n    ],\n    [\n      [8450, 4700],\n      [-5, -10],\n      [-4, 6],\n      [11, 16],\n      [-2, -12]\n    ],\n    [\n      [8858, 4702],\n      [-10, -1],\n      [7, 12],\n      [3, -11]\n    ],\n    [\n      [8265, 4700],\n      [-2, 12],\n      [5, 2],\n      [-3, -14]\n    ],\n    [\n      [8459, 4715],\n      [2, -3],\n      [13, 1],\n      [1, -11],\n      [-22, -6],\n      [3, 18],\n      [3, 1]\n    ],\n    [\n      [8550, 4716],\n      [8, -3],\n      [-2, -6],\n      [-6, 9]\n    ],\n    [\n      [8276, 4716],\n      [4, 0],\n      [5, -15],\n      [6, 7],\n      [6, -6],\n      [8, 2],\n      [1, -19],\n      [-18, -12],\n      [0, 10],\n      [-7, -11],\n      [-12, -2],\n      [-9, -9],\n      [-7, -2],\n      [-11, 5],\n      [2, 11],\n      [-1, 13],\n      [12, 14],\n      [6, -8],\n      [4, 5],\n      [6, -18],\n      [14, 4],\n      [-6, 11],\n      [-4, 1],\n      [-6, 16],\n      [7, 3]\n    ],\n    [\n      [8415, 4713],\n      [2, -8],\n      [-7, -8],\n      [2, -8],\n      [-13, -10],\n      [-8, 1],\n      [-9, -9],\n      [-11, 5],\n      [-1, -7],\n      [-12, 0],\n      [-2, 6],\n      [-7, 2],\n      [-9, -3],\n      [-13, 4],\n      [0, 11],\n      [13, 18],\n      [19, -4],\n      [15, -16],\n      [15, 11],\n      [6, -12],\n      [6, 1],\n      [0, 7],\n      [12, 12],\n      [-4, 4],\n      [3, 8],\n      [3, -5]\n    ],\n    [\n      [8208, 4712],\n      [5, -15],\n      [-14, -15],\n      [-7, 13],\n      [-11, 8],\n      [-3, 14],\n      [12, -6],\n      [8, 8],\n      [10, -7]\n    ],\n    [\n      [8604, 4733],\n      [0, -14],\n      [-5, 14],\n      [5, 0]\n    ],\n    [\n      [8519, 4741],\n      [-6, -15],\n      [-15, 2],\n      [-5, -7],\n      [5, 21],\n      [11, -2],\n      [8, 7],\n      [2, -6]\n    ],\n    [\n      [8857, 4720],\n      [-12, -20],\n      [-23, 0],\n      [5, 24],\n      [6, 21],\n      [6, 8],\n      [11, 6],\n      [5, -1],\n      [7, -11],\n      [-5, -27]\n    ],\n    [\n      [8656, 4770],\n      [0, -26],\n      [-8, -16],\n      [-7, -6],\n      [3, 28],\n      [10, 23],\n      [2, -3]\n    ],\n    [\n      [8664, 4774],\n      [1, -9],\n      [-7, 7],\n      [6, 2]\n    ],\n    [\n      [8166, 4787],\n      [3, -6],\n      [-12, -8],\n      [-3, -6],\n      [-12, -1],\n      [-12, 5],\n      [4, 15],\n      [32, 1]\n    ],\n    [\n      [8204, 4789],\n      [6, -5],\n      [-10, -1],\n      [4, 6]\n    ],\n    [\n      [8738, 4813],\n      [-1, -5],\n      [-6, 7],\n      [3, 6],\n      [4, -8]\n    ],\n    [\n      [8733, 4812],\n      [3, -8],\n      [-6, -16],\n      [-7, 2],\n      [2, 30],\n      [-1, 7],\n      [9, -15]\n    ],\n    [\n      [7948, 4837],\n      [3, 4],\n      [13, -9],\n      [8, 1],\n      [0, 9],\n      [9, -3],\n      [2, -10],\n      [7, -5],\n      [6, 2],\n      [5, -8],\n      [8, 5],\n      [5, -14],\n      [2, -16],\n      [11, -1],\n      [10, -5],\n      [4, 4],\n      [11, -7],\n      [7, 4],\n      [5, -7],\n      [7, 8],\n      [2, 19],\n      [4, 5],\n      [7, -1],\n      [3, -15],\n      [12, 3],\n      [12, -14],\n      [16, 1],\n      [0, -13],\n      [6, -8],\n      [-2, -17],\n      [16, -15],\n      [12, 4],\n      [7, 6],\n      [13, -11],\n      [-3, -41],\n      [7, -10],\n      [-18, 4],\n      [-20, 20],\n      [-6, -1],\n      [-10, -8],\n      [-9, 6],\n      [-16, 4],\n      [-2, -6],\n      [-9, 6],\n      [-11, 0],\n      [-13, 8],\n      [-14, 14],\n      [-18, 10],\n      [-23, 1],\n      [-2, -7],\n      [-18, 4],\n      [-11, 14],\n      [-25, 5],\n      [-4, 10],\n      [4, 15],\n      [-7, -1],\n      [-7, 10],\n      [-20, -2],\n      [3, 10],\n      [2, -8],\n      [4, 17],\n      [5, 1],\n      [1, 18],\n      [5, 17],\n      [4, -6]\n    ],\n    [\n      [8346, 4810],\n      [-1, 39],\n      [3, -8],\n      [-2, -31]\n    ],\n    [\n      [8685, 4859],\n      [3, -16],\n      [-4, 0],\n      [1, 16]\n    ],\n    [\n      [8737, 4870],\n      [5, -12],\n      [1, -27],\n      [-5, -14],\n      [-8, 8],\n      [-1, 9],\n      [2, 19],\n      [6, 17]\n    ],\n    [\n      [7843, 4868],\n      [-9, 8],\n      [9, -3],\n      [0, -5]\n    ],\n    [\n      [8386, 4889],\n      [2, 1],\n      [2, -20],\n      [-3, -2],\n      [-4, 10],\n      [3, 11]\n    ],\n    [\n      [8410, 4898],\n      [-4, -6],\n      [0, -18],\n      [-10, -1],\n      [3, 23],\n      [-2, 8],\n      [11, 13],\n      [2, -19]\n    ],\n    [\n      [8422, 4913],\n      [0, -9],\n      [-5, 6],\n      [-2, -24],\n      [7, -6],\n      [-2, -7],\n      [-8, -5],\n      [0, -10],\n      [-6, -1],\n      [-2, 9],\n      [5, 17],\n      [3, 22],\n      [0, 15],\n      [4, 10],\n      [6, -17]\n    ],\n    [\n      [8418, 4952],\n      [5, -5],\n      [-3, -8],\n      [-5, 6],\n      [3, 7]\n    ],\n    [\n      [8564, 4977],\n      [-2, -8],\n      [-9, -3],\n      [3, 10],\n      [8, 1]\n    ],\n    [\n      [8225, 4951],\n      [-3, 23],\n      [3, 18],\n      [4, 5],\n      [1, -36],\n      [-5, -10]\n    ],\n    [\n      [8523, 5004],\n      [7, -6],\n      [-2, -7],\n      [6, -2],\n      [0, -14],\n      [-15, -15],\n      [-15, 15],\n      [-5, 14],\n      [1, 12],\n      [11, 5],\n      [12, -2]\n    ],\n    [\n      [8598, 5023],\n      [14, -13],\n      [8, 1],\n      [7, -8],\n      [1, -15],\n      [7, -11],\n      [-1, -17],\n      [-24, 23],\n      [-3, 8],\n      [-9, 2],\n      [-2, -10],\n      [-15, 7],\n      [-2, 8],\n      [-6, -10],\n      [-7, -2],\n      [-6, 20],\n      [-4, -17],\n      [-6, 11],\n      [8, 6],\n      [1, 12],\n      [21, 0],\n      [5, -5],\n      [13, 10]\n    ],\n    [\n      [7789, 5006],\n      [0, -13],\n      [-7, 21],\n      [0, 8],\n      [6, -7],\n      [1, -9]\n    ],\n    [\n      [7994, 5036],\n      [13, -12],\n      [-2, -21],\n      [-6, -7],\n      [-3, 11],\n      [-8, -10],\n      [0, 26],\n      [2, 12],\n      [4, 1]\n    ],\n    [\n      [7782, 5024],\n      [-5, -4],\n      [0, 20],\n      [5, -16]\n    ],\n    [\n      [7769, 5060],\n      [4, -12],\n      [-4, 1],\n      [-5, 11],\n      [5, 0]\n    ],\n    [\n      [8501, 5041],\n      [-3, 3],\n      [-3, 21],\n      [4, 3],\n      [2, -27]\n    ],\n    [\n      [8483, 5079],\n      [15, 1],\n      [11, -2],\n      [-2, -3],\n      [-24, -4],\n      [0, 8]\n    ],\n    [\n      [8620, 5085],\n      [2, -15],\n      [-6, -6],\n      [-14, 10],\n      [10, 9],\n      [8, 2]\n    ],\n    [\n      [8458, 5089],\n      [22, -6],\n      [0, -9],\n      [-8, -3],\n      [-7, 2],\n      [-10, -6],\n      [-1, 20],\n      [4, 2]\n    ],\n    [\n      [8762, 5091],\n      [20, -3],\n      [6, -5],\n      [14, -4],\n      [-11, -5],\n      [-15, 5],\n      [-14, 12]\n    ],\n    [\n      [7940, 5097],\n      [5, -5],\n      [4, -17],\n      [0, -18],\n      [4, -16],\n      [14, -6],\n      [-5, -8],\n      [-2, -12],\n      [4, -10],\n      [-22, 15],\n      [0, 21],\n      [-3, 4],\n      [-1, 14],\n      [-18, 4],\n      [0, 8],\n      [7, 9],\n      [-3, 5],\n      [9, 9],\n      [2, -13],\n      [3, 1],\n      [-2, 12],\n      [4, 3]\n    ],\n    [\n      [8550, 5100],\n      [9, -9],\n      [-6, -5],\n      [-11, -3],\n      [-5, 6],\n      [1, 9],\n      [6, 8],\n      [6, -6]\n    ],\n    [\n      [8421, 5116],\n      [1, -14],\n      [3, 9],\n      [6, -1],\n      [0, -10],\n      [-4, -5],\n      [-3, 6],\n      [-1, -12],\n      [-3, 18],\n      [-6, -15],\n      [-4, 10],\n      [3, 13],\n      [8, 1]\n    ],\n    [\n      [8044, 5127],\n      [4, -10],\n      [-9, -8],\n      [0, 18],\n      [5, 0]\n    ],\n    [\n      [7746, 5129],\n      [7, -31],\n      [4, -7],\n      [-2, -11],\n      [-9, 6],\n      [-9, 29],\n      [3, 13],\n      [6, 1]\n    ],\n    [\n      [8636, 5129],\n      [4, -8],\n      [-2, -16],\n      [-7, 6],\n      [-3, 15],\n      [8, 3]\n    ],\n    [\n      [8634, 5139],\n      [-7, -9],\n      [-4, 6],\n      [11, 3]\n    ],\n    [\n      [8761, 5145],\n      [12, -2],\n      [9, -20],\n      [6, -4],\n      [-7, -7],\n      [-7, 2],\n      [-4, 22],\n      [-3, -4],\n      [-6, 13]\n    ],\n    [\n      [8536, 5138],\n      [-5, 0],\n      [3, 9],\n      [2, -9]\n    ],\n    [\n      [8915, 5033],\n      [0, -218],\n      [-3, -12],\n      [3, -17],\n      [0, -128]\n    ],\n    [\n      [8915, 4658],\n      [-10, 18],\n      [-4, 12],\n      [-15, 28],\n      [-17, -5],\n      [-3, 6],\n      [-7, -8],\n      [-1, 19],\n      [5, 19],\n      [-4, 4],\n      [-7, 18],\n      [13, -3],\n      [-12, 8],\n      [-4, 13],\n      [10, 2],\n      [-8, 7],\n      [1, 5],\n      [-7, 13],\n      [-3, 32],\n      [-8, 7],\n      [0, 12],\n      [-4, 8],\n      [-15, 20],\n      [-21, 12],\n      [-18, 18],\n      [-14, 4],\n      [-7, -1],\n      [-16, 20],\n      [1, 11],\n      [-4, -6],\n      [-5, 9],\n      [-1, -9],\n      [-5, 7],\n      [1, 8],\n      [-6, -4],\n      [-4, 14],\n      [-3, -5],\n      [0, 28],\n      [6, 6],\n      [-1, 9],\n      [-6, -11],\n      [0, -14],\n      [-7, -21],\n      [1, -8],\n      [-5, -11],\n      [-7, -3],\n      [-6, 11],\n      [-2, 14],\n      [6, 8],\n      [-9, 15],\n      [-3, 12],\n      [-6, 8],\n      [-6, -2],\n      [-2, 12],\n      [5, 5],\n      [10, -2],\n      [4, -6],\n      [9, 18],\n      [7, 5],\n      [7, -10],\n      [8, 7],\n      [4, 12],\n      [-1, 9],\n      [-7, -8],\n      [-11, 2],\n      [-16, -6],\n      [-4, 7],\n      [-6, -5],\n      [-8, 11],\n      [-4, 22],\n      [-5, 11],\n      [-9, 2],\n      [-5, -3],\n      [-7, 4],\n      [3, 13],\n      [5, 6],\n      [0, 18],\n      [7, 5],\n      [8, 0],\n      [10, 17],\n      [8, 5],\n      [8, -1],\n      [12, -10],\n      [6, -11],\n      [17, 0],\n      [5, -8],\n      [-4, -5],\n      [7, -22],\n      [-1, -12],\n      [-4, -7],\n      [2, -39],\n      [5, -10],\n      [3, -17],\n      [1, 17],\n      [5, -3],\n      [1, -23],\n      [5, -17],\n      [6, -6],\n      [11, 0],\n      [2, 7],\n      [10, 16],\n      [1, 11],\n      [9, 14],\n      [3, 18],\n      [9, -2],\n      [14, 10],\n      [-3, 16],\n      [19, 18],\n      [4, 0],\n      [11, -13],\n      [9, -4],\n      [5, -10],\n      [7, -3],\n      [20, -21],\n      [10, 3],\n      [16, -10],\n      [-2, -6],\n      [8, 0]\n    ],\n    [\n      [7903, 5160],\n      [0, -12],\n      [-8, 7],\n      [6, 9],\n      [2, -4]\n    ],\n    [\n      [8544, 5159],\n      [1, -17],\n      [6, 0],\n      [-1, -9],\n      [-5, 6],\n      [-5, -3],\n      [0, 10],\n      [-5, 11],\n      [6, 9],\n      [3, -7]\n    ],\n    [\n      [8533, 5168],\n      [1, -14],\n      [-4, -1],\n      [0, 14],\n      [3, 1]\n    ],\n    [\n      [7735, 5153],\n      [-4, 0],\n      [3, 16],\n      [1, -16]\n    ],\n    [\n      [7881, 5163],\n      [-8, -1],\n      [3, 8],\n      [5, -7]\n    ],\n    [\n      [8633, 5183],\n      [14, -10],\n      [-2, -13],\n      [-6, 2],\n      [-11, 13],\n      [8, -16],\n      [-6, -1],\n      [-1, 8],\n      [-9, 2],\n      [-2, 9],\n      [15, 6]\n    ],\n    [\n      [7737, 5167],\n      [-5, 8],\n      [0, 8],\n      [5, -16]\n    ],\n    [\n      [7904, 5183],\n      [11, -16],\n      [-7, 4],\n      [-8, -1],\n      [4, 13]\n    ],\n    [\n      [7850, 5240],\n      [4, 0],\n      [7, -11],\n      [-14, -1],\n      [-1, 20],\n      [4, -8]\n    ],\n    [\n      [7861, 5243],\n      [2, -12],\n      [-8, 11],\n      [-5, -1],\n      [5, 9],\n      [6, -7]\n    ],\n    [\n      [7892, 5248],\n      [-1, -8],\n      [-5, 3],\n      [6, 5]\n    ],\n    [\n      [7904, 5252],\n      [2, -10],\n      [-2, -11],\n      [-3, 13],\n      [-6, -3],\n      [2, 9],\n      [7, 2]\n    ],\n    [\n      [7845, 5238],\n      [-6, 7],\n      [-1, 17],\n      [3, 2],\n      [5, -9],\n      [-1, -17]\n    ],\n    [\n      [7704, 5270],\n      [3, -2],\n      [6, -18],\n      [6, -7],\n      [-2, -28],\n      [-4, 1],\n      [-3, 14],\n      [-5, 7],\n      [-8, 26],\n      [7, 7]\n    ],\n    [\n      [7839, 5273],\n      [7, -4],\n      [0, -13],\n      [-10, 11],\n      [-2, 10],\n      [5, -4]\n    ],\n    [\n      [8473, 5279],\n      [5, -11],\n      [-3, -3],\n      [-6, -26],\n      [-5, -5],\n      [-7, -25],\n      [-24, -11],\n      [-11, 3],\n      [-4, 10],\n      [-24, 0],\n      [-12, -4],\n      [-6, 6],\n      [-13, -7],\n      [-11, 7],\n      [-10, -4],\n      [-7, -19],\n      [-3, -19],\n      [3, -26],\n      [4, -13],\n      [5, -1],\n      [5, -12],\n      [2, -17],\n      [13, 1],\n      [2, 12],\n      [8, 18],\n      [5, -3],\n      [13, 0],\n      [1, 9],\n      [15, -2],\n      [7, 4],\n      [-7, 4],\n      [10, 6],\n      [9, -5],\n      [0, -20],\n      [-3, -4],\n      [-4, 11],\n      [-9, -3],\n      [-8, -23],\n      [-9, -17],\n      [-12, -6],\n      [-3, -12],\n      [-10, 8],\n      [0, -8],\n      [8, -15],\n      [5, -3],\n      [11, -32],\n      [7, -26],\n      [-5, -8],\n      [-1, -14],\n      [13, -17],\n      [-1, -9],\n      [7, -3],\n      [0, -15],\n      [-4, -6],\n      [-4, 6],\n      [-14, -7],\n      [-2, -7],\n      [2, -12],\n      [-12, 1],\n      [-5, 9],\n      [1, 25],\n      [3, 8],\n      [-8, 7],\n      [-13, 25],\n      [0, 9],\n      [5, 10],\n      [1, 26],\n      [-8, 8],\n      [-17, -20],\n      [6, -16],\n      [0, -25],\n      [-2, -12],\n      [1, -36],\n      [2, -7],\n      [-4, -14],\n      [-1, -14],\n      [5, -24],\n      [-15, -2],\n      [-4, -8],\n      [-11, 16],\n      [0, 14],\n      [3, 7],\n      [0, 18],\n      [4, 19],\n      [0, 23],\n      [-5, 19],\n      [2, 12],\n      [-6, 3],\n      [-10, -8],\n      [-3, 14],\n      [2, 27],\n      [-4, 0],\n      [1, 13],\n      [3, -1],\n      [7, 11],\n      [-1, 15],\n      [3, 13],\n      [4, 2],\n      [-2, 14],\n      [0, 26],\n      [5, 11],\n      [1, 11],\n      [7, 11],\n      [1, 50],\n      [3, 16],\n      [4, 4],\n      [-1, 10],\n      [9, 8],\n      [7, -3],\n      [6, 14],\n      [0, 15],\n      [3, 3],\n      [10, -7],\n      [5, 3],\n      [0, -9],\n      [5, -4],\n      [8, 2],\n      [8, -5],\n      [7, 1],\n      [10, -12],\n      [4, 8],\n      [19, -6],\n      [8, 1],\n      [10, 8],\n      [9, 23],\n      [10, 19],\n      [2, -4]\n    ],\n    [\n      [7825, 5301],\n      [0, -16],\n      [-7, -2],\n      [-2, 18],\n      [9, 0]\n    ],\n    [\n      [8556, 5309],\n      [-6, -20],\n      [5, -6],\n      [0, -25],\n      [-11, -20],\n      [3, -8],\n      [6, 3],\n      [0, 8],\n      [7, 8],\n      [-3, 5],\n      [3, 9],\n      [11, 11],\n      [4, -1],\n      [-1, -29],\n      [-11, -9],\n      [0, -14],\n      [11, -6],\n      [0, -13],\n      [-20, 8],\n      [-3, -10],\n      [1, -20],\n      [5, -25],\n      [10, -24],\n      [-11, 11],\n      [-5, 20],\n      [-5, 6],\n      [1, 34],\n      [-4, 4],\n      [-2, 38],\n      [-3, 10],\n      [4, 12],\n      [0, 12],\n      [4, 16],\n      [10, 15]\n    ],\n    [\n      [8571, 5333],\n      [3, -7],\n      [-3, -21],\n      [-8, -7],\n      [-3, 16],\n      [5, 13],\n      [6, 6]\n    ],\n    [\n      [7663, 5350],\n      [2, -7],\n      [14, -20],\n      [-5, 0],\n      [-14, 13],\n      [-4, 9],\n      [7, 5]\n    ],\n    [\n      [8268, 5370],\n      [-4, 6],\n      [4, 4],\n      [0, -10]\n    ],\n    [\n      [8489, 5385],\n      [-4, -3],\n      [0, 16],\n      [4, -13]\n    ],\n    [\n      [8269, 5423],\n      [5, -1]\n    ],\n    [\n      [8274, 5422],\n      [-2, -7],\n      [-3, 8]\n    ],\n    [\n      [8008, 5418],\n      [2, -16],\n      [-2, -7],\n      [-8, 11],\n      [-1, 9],\n      [7, 11],\n      [2, -8]\n    ],\n    [\n      [8265, 5422],\n      [-5, 1],\n      [11, -21],\n      [-1, -10],\n      [-15, -1],\n      [7, -13],\n      [-5, -10],\n      [11, -13],\n      [-4, -4],\n      [16, -37],\n      [-8, -15],\n      [1, -8],\n      [7, -13],\n      [9, -10],\n      [10, -16],\n      [6, -14],\n      [-7, -9],\n      [-16, 4],\n      [-8, 12],\n      [4, -17],\n      [-6, 2],\n      [-6, -18],\n      [-4, -26],\n      [2, -2],\n      [-3, -17],\n      [1, -14],\n      [4, 4],\n      [-3, -14],\n      [4, -4],\n      [-9, -8],\n      [-1, 5],\n      [-7, -22],\n      [-14, -16],\n      [1, -8],\n      [-9, -10],\n      [6, 1],\n      [-2, -24],\n      [6, 0],\n      [-2, -19],\n      [-4, -2],\n      [0, -18],\n      [-5, -7],\n      [-6, -36],\n      [-38, -32],\n      [0, 28],\n      [-14, 23],\n      [-6, -9],\n      [-9, 3],\n      [0, 12],\n      [-6, -6],\n      [-9, 20],\n      [-3, -10],\n      [3, -3],\n      [-14, -16],\n      [-9, 6],\n      [-7, -11],\n      [-4, -1],\n      [1, 27],\n      [-4, 17],\n      [0, -10],\n      [-4, -4],\n      [-7, 5],\n      [-9, -9],\n      [-7, 6],\n      [-2, -5],\n      [-3, 12],\n      [-7, -8],\n      [-6, 62],\n      [-5, 8],\n      [3, 3],\n      [2, 20],\n      [-4, 16],\n      [-7, 11],\n      [-7, 4],\n      [-2, -4],\n      [-7, 21],\n      [0, 34],\n      [5, -2],\n      [-5, 14],\n      [-5, 4],\n      [0, 20],\n      [3, 50],\n      [7, 9],\n      [1, 14],\n      [9, 9]\n    ],\n    [\n      [8045, 5303],\n      [-3, -16],\n      [3, -12],\n      [17, -35],\n      [7, -8],\n      [8, 3],\n      [2, 6],\n      [10, 4],\n      [7, -6],\n      [9, 2],\n      [8, 7],\n      [2, 18],\n      [8, 7],\n      [15, 0],\n      [-2, -8],\n      [9, -3],\n      [11, -8],\n      [7, 12],\n      [16, -1],\n      [5, 12],\n      [1, 13],\n      [3, 2],\n      [-1, 20],\n      [12, 14],\n      [-4, 12],\n      [1, 10],\n      [5, 10],\n      [6, -1],\n      [4, 65],\n      [5, 11],\n      [6, -4],\n      [3, 5],\n      [7, -4],\n      [10, 4],\n      [13, 0],\n      [10, -12]\n    ],\n    [\n      [8523, 5442],\n      [2, -13],\n      [-3, -14],\n      [-4, -2],\n      [2, 32],\n      [3, -3]\n    ],\n    [\n      [7652, 5506],\n      [11, -6],\n      [4, -11],\n      [10, -6],\n      [12, 4],\n      [10, -8],\n      [9, 6],\n      [11, -21],\n      [3, -16],\n      [6, -9],\n      [0, -16],\n      [13, -17],\n      [3, -9],\n      [6, -5],\n      [20, -26],\n      [7, -15],\n      [-1, -13],\n      [3, -5],\n      [3, 6],\n      [6, -23],\n      [14, -21],\n      [-2, 19],\n      [6, 1],\n      [8, -16],\n      [1, -14],\n      [10, -6],\n      [12, -18],\n      [1, -19],\n      [7, -15],\n      [13, -3],\n      [5, -14],\n      [-13, -13],\n      [8, 1],\n      [12, 15],\n      [11, -13],\n      [2, -18],\n      [-7, 0],\n      [-6, -21],\n      [7, -4],\n      [-5, -5],\n      [1, -12],\n      [4, -12],\n      [9, -1],\n      [7, -6],\n      [6, 2],\n      [2, -16],\n      [1, -28],\n      [4, -14],\n      [7, -5],\n      [-1, -9],\n      [8, -5],\n      [13, -1],\n      [0, -13],\n      [5, -6],\n      [0, -10],\n      [6, -4],\n      [2, -14],\n      [-6, -14],\n      [-1, -15],\n      [3, -5],\n      [-4, -25],\n      [2, -13],\n      [0, -26],\n      [-2, -53],\n      [-7, 2],\n      [-7, 19],\n      [-3, -6],\n      [0, -12],\n      [-8, 6],\n      [-9, 11],\n      [-1, -4],\n      [5, -19],\n      [-4, -3],\n      [-3, 11],\n      [-10, 17],\n      [-5, 19],\n      [-7, 10],\n      [-11, 12],\n      [-28, 46],\n      [-1, 17],\n      [-17, 23],\n      [-8, 29],\n      [-9, 16],\n      [-5, 17],\n      [2, 7],\n      [-9, 34],\n      [0, 8],\n      [-5, 3],\n      [1, 11],\n      [-9, 30],\n      [-9, 14],\n      [0, 13],\n      [-4, 9],\n      [-9, 10],\n      [-5, 1],\n      [-1, 21],\n      [-9, 45],\n      [0, 20],\n      [-3, 0],\n      [-7, 14],\n      [-5, 2],\n      [-9, 14],\n      [-7, 6],\n      [-2, 27],\n      [-5, 5],\n      [-4, 14],\n      [-3, 5],\n      [-8, 23],\n      [-11, 6],\n      [-8, 21],\n      [-6, 5],\n      [-13, 28],\n      [-5, 27],\n      [-3, 6],\n      [0, 17],\n      [8, 2]\n    ],\n    [\n      [4872, 8298],\n      [-4, 5],\n      [8, 13],\n      [4, -7],\n      [-8, -11]\n    ],\n    [\n      [7606, 5598],\n      [2, -16],\n      [-2, -11],\n      [-5, 16],\n      [0, 9],\n      [5, 2]\n    ],\n    [\n      [7571, 5804],\n      [0, -12],\n      [-5, 0],\n      [-1, 12],\n      [6, 0]\n    ],\n    [\n      [7583, 5964],\n      [1, -29],\n      [-3, 1],\n      [1, -36],\n      [-3, -2],\n      [1, -13],\n      [-5, -6],\n      [2, -9],\n      [-2, -25],\n      [-5, 13],\n      [5, 34],\n      [0, 29],\n      [2, 1],\n      [0, 26],\n      [6, 16]\n    ],\n    [\n      [7448, 6428],\n      [-4, 1],\n      [4, 13],\n      [0, -14]\n    ],\n    [\n      [7248, 6922],\n      [-16, -24],\n      [0, -12],\n      [-5, -9],\n      [1, -17],\n      [-7, -14],\n      [9, -14],\n      [9, -1],\n      [7, -10],\n      [9, -6],\n      [2, -11],\n      [15, -17],\n      [6, 3],\n      [11, -14],\n      [7, 2],\n      [1, -11],\n      [12, -4],\n      [18, 0],\n      [8, 4],\n      [6, -8],\n      [8, -2],\n      [1, -18],\n      [8, -3],\n      [10, -14],\n      [9, 7],\n      [7, -16],\n      [4, 5],\n      [9, -3],\n      [11, -11],\n      [7, 7],\n      [9, -11],\n      [13, 6],\n      [7, -5],\n      [4, 17],\n      [0, 13],\n      [-6, 11],\n      [2, 24],\n      [3, 21]\n    ],\n    [\n      [7703, 6808],\n      [0, -19],\n      [-13, -15],\n      [0, -11],\n      [7, -21],\n      [-7, 6],\n      [-4, 10],\n      [-21, -9],\n      [-2, -10],\n      [-14, -19],\n      [-9, -5],\n      [-2, -21],\n      [4, -12],\n      [-4, -6],\n      [0, -10],\n      [-10, -18],\n      [-2, -16],\n      [3, -3],\n      [-2, -22],\n      [-3, -2],\n      [-6, -22],\n      [-5, -27],\n      [-11, 9],\n      [-11, -2],\n      [4, -18],\n      [-2, -30],\n      [-9, -21],\n      [2, -34],\n      [-3, 1],\n      [-1, -12],\n      [-8, 9],\n      [-3, -10]\n    ],\n    [\n      [7473, 6457],\n      [-4, -11],\n      [5, -18],\n      [-6, 2],\n      [-4, -6],\n      [-2, 22],\n      [-5, -3],\n      [-1, -16],\n      [-7, 0],\n      [-1, 26],\n      [-8, -18],\n      [-21, -14],\n      [-8, -19],\n      [6, -28],\n      [-7, -10],\n      [-4, -16],\n      [-4, -3],\n      [-6, -16],\n      [-19, -10],\n      [-5, 9],\n      [-5, -13],\n      [5, 1],\n      [-15, -26],\n      [-9, -26],\n      [-13, -29],\n      [-9, -8],\n      [-6, -10],\n      [-9, -22],\n      [-21, -21],\n      [-6, -16],\n      [3, -5],\n      [-1, -14],\n      [-6, -9],\n      [-11, -8],\n      [-10, 4],\n      [-4, -3],\n      [-1, -20],\n      [-10, -15],\n      [-1, 10],\n      [-6, -1],\n      [-9, -10],\n      [-3, -17],\n      [-2, -18],\n      [3, -24],\n      [-1, -30],\n      [3, -29],\n      [-5, -4],\n      [7, -9],\n      [0, -14],\n      [-3, -37],\n      [-8, -24],\n      [-4, -26],\n      [2, -16],\n      [0, -46],\n      [1, -17],\n      [-15, 0],\n      [-2, -15],\n      [-8, -21],\n      [-2, -13],\n      [5, -9],\n      [-20, -12],\n      [-5, -12],\n      [-2, -22],\n      [-2, -8],\n      [-16, -16],\n      [-7, 6],\n      [-11, 22],\n      [-7, 19],\n      [-6, 25],\n      [-3, 32],\n      [4, -10],\n      [0, 11],\n      [-6, 7],\n      [-2, 18],\n      [-6, 30],\n      [-1, 14],\n      [-9, 36],\n      [-9, 17],\n      [-6, 25],\n      [-6, 34],\n      [-2, 33],\n      [-8, 39],\n      [-1, 14],\n      [-7, 14],\n      [-2, 12],\n      [-4, 5],\n      [0, 15],\n      [-3, 4],\n      [-4, 24],\n      [-4, 8],\n      [-5, 29],\n      [-1, 37],\n      [-5, 30],\n      [-6, 45],\n      [1, 7],\n      [-3, 22],\n      [-1, 23],\n      [-3, 24],\n      [2, 33],\n      [4, 12],\n      [-2, 36],\n      [-3, -4],\n      [-3, 11],\n      [2, 16],\n      [12, 11],\n      [-16, -3],\n      [2, 14],\n      [-2, 14],\n      [9, 5],\n      [-13, 4],\n      [-2, -15],\n      [-8, -7],\n      [8, -18],\n      [-6, -25],\n      [-17, -17],\n      [-14, -11],\n      [-5, 0],\n      [-10, 9],\n      [-11, 17],\n      [-15, 33],\n      [-15, 29],\n      [0, 10],\n      [7, 1],\n      [0, -9],\n      [14, 12],\n      [3, -3],\n      [9, 7],\n      [7, 23],\n      [-10, -1],\n      [-9, -10],\n      [-13, 5],\n      [-11, 10],\n      [-9, 15],\n      [-4, 19],\n      [-6, 14]\n    ],\n    [\n      [6893, 6556],\n      [5, 7],\n      [10, 0],\n      [0, 19],\n      [13, -3],\n      [11, 2],\n      [5, -7],\n      [6, 0],\n      [3, 8],\n      [13, 7],\n      [0, -8],\n      [6, -3],\n      [9, 10],\n      [-4, 12],\n      [3, 3],\n      [-5, 27],\n      [-6, 14],\n      [0, 17],\n      [-10, 1],\n      [-6, 14],\n      [2, 35],\n      [-9, 2],\n      [-10, 11],\n      [1, 17],\n      [10, 20],\n      [6, 22],\n      [7, 12],\n      [6, 1],\n      [4, -16],\n      [4, -2],\n      [9, 7],\n      [20, 8],\n      [0, 9],\n      [8, 16],\n      [5, 21],\n      [16, 16],\n      [9, 29],\n      [3, 22],\n      [12, 8],\n      [4, 7],\n      [-2, 10],\n      [6, 11],\n      [6, 19],\n      [10, 12],\n      [-4, 2],\n      [3, 17],\n      [-2, 24],\n      [7, 10],\n      [14, 8],\n      [1, 10],\n      [-8, 8],\n      [-11, 2],\n      [0, 14],\n      [-9, 2],\n      [0, 13],\n      [-9, 10],\n      [4, 22],\n      [-5, 5],\n      [1, 10],\n      [7, 10],\n      [-9, 1],\n      [1, 16],\n      [-5, 3],\n      [4, 19],\n      [13, 6],\n      [7, -5],\n      [16, -2],\n      [11, -9],\n      [11, 11],\n      [17, 3],\n      [3, 10],\n      [5, 1],\n      [4, 11]\n    ],\n    [\n      [7140, 7205],\n      [20, 22]\n    ],\n    [\n      [4825, 8298],\n      [2, -37],\n      [6, -29],\n      [-6, -16],\n      [-4, -28],\n      [-10, 1],\n      [-8, -4],\n      [-12, 0],\n      [-5, -10],\n      [-7, 0],\n      [-4, -8],\n      [-7, -1],\n      [-12, -14],\n      [-20, 0],\n      [-11, -8],\n      [10, 14],\n      [-20, -4],\n      [12, 13],\n      [-11, -6],\n      [-7, 10],\n      [13, 14],\n      [-15, -2],\n      [5, 10],\n      [13, -2],\n      [-1, 11],\n      [8, 12],\n      [-10, -5],\n      [12, 12],\n      [5, 21],\n      [10, 8],\n      [-16, -2],\n      [-14, 9],\n      [-3, 9],\n      [6, 13],\n      [0, 24],\n      [-5, 4],\n      [22, 4],\n      [23, -3],\n      [-5, 4],\n      [12, 9],\n      [3, 8],\n      [-15, -1],\n      [-2, 7],\n      [10, 6],\n      [2, 18],\n      [15, 2],\n      [6, -6],\n      [4, 17],\n      [13, -9],\n      [-9, -9]\n    ],\n    [\n      [6560, 6732],\n      [-4, -9],\n      [-5, 0],\n      [-16, -12],\n      [0, 7],\n      [13, 7],\n      [13, 13],\n      [-1, -6]\n    ],\n    [\n      [6357, 7396],\n      [3, -38],\n      [4, -9],\n      [9, -7],\n      [13, -2],\n      [9, -5],\n      [2, -13],\n      [21, -24],\n      [23, -9],\n      [43, 18],\n      [16, -4],\n      [-3, 30]\n    ],\n    [\n      [6497, 7333],\n      [8, -1],\n      [16, 11],\n      [1, 13],\n      [9, 13],\n      [9, 7],\n      [24, 0],\n      [3, 10],\n      [17, -4],\n      [5, 4],\n      [3, -17],\n      [23, -10],\n      [8, -9],\n      [10, 3],\n      [11, -10],\n      [10, -21],\n      [13, -7],\n      [8, -22],\n      [23, 0],\n      [2, -31],\n      [-3, -8],\n      [4, -5],\n      [0, -15]\n    ],\n    [\n      [6689, 6902],\n      [14, -27],\n      [0, -8],\n      [6, -21],\n      [10, -20],\n      [14, -8],\n      [5, -10],\n      [5, -1],\n      [-1, -12],\n      [2, -18],\n      [-1, -26],\n      [11, 2],\n      [4, -8],\n      [-4, -17],\n      [0, -11],\n      [-12, 0],\n      [-12, -7],\n      [-2, -10],\n      [-11, -7],\n      [-7, -59]\n    ],\n    [\n      [6710, 6634],\n      [-5, -8],\n      [-10, 9],\n      [-12, 4],\n      [-1, 9],\n      [-5, -6],\n      [-24, 3],\n      [-2, 4],\n      [-12, -4],\n      [-6, 10],\n      [-7, 2],\n      [-14, -2],\n      [-4, 8],\n      [-17, 5],\n      [-4, 19],\n      [-4, 42],\n      [-6, 17],\n      [-11, 3],\n      [-8, -2],\n      [-5, -8],\n      [-9, -4],\n      [-3, -11],\n      [-6, 2],\n      [-13, -17],\n      [-11, 5],\n      [-3, 7],\n      [-17, 0],\n      [-8, 16],\n      [-10, 6],\n      [-13, 16],\n      [-4, 16],\n      [-12, 11],\n      [-9, -1],\n      [-8, 6],\n      [-9, 35],\n      [0, 12],\n      [-8, 13],\n      [2, 10],\n      [-6, 0],\n      [1, 16],\n      [-15, 30],\n      [0, 10],\n      [-5, 6],\n      [-11, -12],\n      [-2, 9],\n      [-7, -1],\n      [-9, 13],\n      [8, -1],\n      [0, 9],\n      [-9, -8],\n      [1, -20],\n      [-11, -4]\n    ],\n    [\n      [6347, 6908],\n      [-3, 15],\n      [-11, 14],\n      [0, 31],\n      [-9, 0],\n      [0, 23],\n      [4, 21],\n      [-9, 22],\n      [-5, 19],\n      [-6, -1],\n      [-14, 21],\n      [-16, 15],\n      [4, 5],\n      [-4, 15],\n      [-11, 15],\n      [-5, 22],\n      [3, 14],\n      [-4, 8],\n      [2, 8],\n      [6, -3],\n      [-2, 9],\n      [7, 21],\n      [7, 2],\n      [1, 7],\n      [-6, 16],\n      [1, 10],\n      [6, 2],\n      [-4, 9],\n      [-6, -3],\n      [-14, 14],\n      [-3, 21],\n      [-5, 0],\n      [-1, 18],\n      [-6, 5],\n      [2, 12],\n      [-3, 7]\n    ],\n    [\n      [6243, 7322],\n      [0, 10],\n      [-6, 6],\n      [1, 17],\n      [-10, 17],\n      [6, 20],\n      [-4, 0],\n      [-3, 45],\n      [-5, 13],\n      [11, 4],\n      [4, 19],\n      [7, -7]\n    ],\n    [\n      [6347, 6908],\n      [-13, 5],\n      [-3, -3]\n    ],\n    [\n      [6331, 6910],\n      [-7, 6],\n      [-9, 0],\n      [-6, -5],\n      [-8, -33],\n      [-9, -20]\n    ],\n    [\n      [6292, 6858],\n      [-5, -2],\n      [-46, 8],\n      [-62, 91],\n      [-11, 18],\n      [-47, 49],\n      [-34, 10]\n    ],\n    [\n      [6087, 7032],\n      [4, 8],\n      [-7, 3],\n      [0, 11],\n      [-8, 51]\n    ],\n    [\n      [6076, 7105],\n      [4, 3],\n      [43, 44],\n      [14, 11],\n      [7, 22],\n      [1, 40],\n      [3, 8],\n      [-2, 23]\n    ],\n    [\n      [6146, 7256],\n      [0, 0]\n    ],\n    [\n      [6146, 7256],\n      [0, 20],\n      [3, 10],\n      [13, 5],\n      [15, 26],\n      [-1, 3]\n    ],\n    [\n      [6176, 7320],\n      [6, 2],\n      [6, 13],\n      [9, 0],\n      [10, -7],\n      [12, -2],\n      [8, 4],\n      [1, -18],\n      [11, 12],\n      [4, -2]\n    ],\n    [\n      [4554, 9014],\n      [7, -14],\n      [12, -7],\n      [12, 13],\n      [-4, -20],\n      [10, 2],\n      [-2, -20],\n      [12, 4],\n      [0, -8],\n      [21, -10],\n      [-4, -10],\n      [6, -8],\n      [-13, -25],\n      [-13, -4],\n      [-2, -15],\n      [-24, -8],\n      [-39, -26],\n      [-31, -6],\n      [-1, -11],\n      [-23, -7],\n      [-27, 8],\n      [-12, 0],\n      [-28, 20],\n      [-42, -4],\n      [4, 9],\n      [14, 4],\n      [10, 10],\n      [2, 11],\n      [-13, -6],\n      [-9, 29],\n      [-32, 1],\n      [-11, -4],\n      [-3, 8],\n      [23, 2],\n      [15, 8],\n      [25, -2],\n      [-21, 7],\n      [22, 16],\n      [-39, 7],\n      [-20, -9],\n      [-18, 6],\n      [7, 8],\n      [12, -7],\n      [-8, 15],\n      [17, -5],\n      [-9, 12],\n      [10, 17],\n      [20, -8],\n      [-5, 7],\n      [9, 16],\n      [11, -11],\n      [25, -14],\n      [-2, -19],\n      [9, -29],\n      [0, 13],\n      [9, 15],\n      [9, -10],\n      [5, 13],\n      [-5, 20],\n      [9, 3],\n      [13, -22],\n      [6, -1],\n      [-1, 19],\n      [22, 6],\n      [16, -26],\n      [-6, 27],\n      [10, -1],\n      [10, -11],\n      [12, 14],\n      [6, -6],\n      [13, 3],\n      [-3, 19],\n      [15, 2]\n    ],\n    [\n      [5993, 7068],\n      [-6, -5],\n      [0, -15]\n    ],\n    [\n      [5987, 7048],\n      [-10, 8],\n      [-6, -14],\n      [0, -19],\n      [6, -9],\n      [-7, -11],\n      [-2, -14],\n      [10, 1],\n      [5, 6]\n    ],\n    [\n      [5983, 6996],\n      [0, -9]\n    ],\n    [\n      [5983, 6987],\n      [0, -6]\n    ],\n    [\n      [5983, 6981],\n      [1, -8]\n    ],\n    [\n      [5984, 6973],\n      [-8, -34],\n      [0, -21],\n      [-6, -33]\n    ],\n    [\n      [5970, 6885],\n      [-2, -4]\n    ],\n    [\n      [5951, 6980],\n      [8, 18],\n      [-2, 4]\n    ],\n    [\n      [5957, 7002],\n      [7, 21],\n      [6, 44],\n      [5, 21]\n    ],\n    [\n      [5975, 7088],\n      [10, 0],\n      [1, 9],\n      [8, 10]\n    ],\n    [\n      [5994, 7107],\n      [-1, -9],\n      [3, -19],\n      [-3, -11]\n    ],\n    [\n      [5434, 7386],\n      [-12, -29],\n      [-3, -25],\n      [6, -18],\n      [-6, -11],\n      [1, -8],\n      [-10, 1],\n      [-8, 6],\n      [-3, 10],\n      [-7, 8],\n      [-7, -1],\n      [-25, 27],\n      [-10, 1],\n      [-4, 6],\n      [0, 19],\n      [7, 6],\n      [6, -6],\n      [4, 10],\n      [7, 1],\n      [10, -13],\n      [9, 4],\n      [9, -2],\n      [17, 10],\n      [4, -4],\n      [12, 11],\n      [3, -3]\n    ],\n    [\n      [5256, 7557],\n      [8, -6],\n      [8, -34],\n      [-5, -14],\n      [3, -13],\n      [-2, -30],\n      [-6, -24],\n      [-10, 6],\n      [-5, -19],\n      [-8, 0],\n      [-7, 17],\n      [5, 39],\n      [-4, 1],\n      [2, 23],\n      [-5, 17],\n      [-4, 0],\n      [2, 16],\n      [8, -2],\n      [9, 6],\n      [11, 17]\n    ],\n    [\n      [5380, 7862],\n      [-9, -16],\n      [7, -7],\n      [-4, -8],\n      [3, -12],\n      [8, -10],\n      [-5, -1]\n    ],\n    [\n      [5380, 7808],\n      [1, 7],\n      [-18, 1],\n      [-3, -5],\n      [-16, -12],\n      [-4, 2],\n      [-1, -16],\n      [9, -13],\n      [-6, -7],\n      [-2, -13],\n      [2, -18],\n      [8, -16],\n      [9, -7],\n      [19, -21],\n      [12, -54],\n      [18, -28],\n      [12, -11],\n      [25, 0],\n      [4, -9],\n      [-8, -15],\n      [19, -17],\n      [13, -7],\n      [14, -18],\n      [13, -8],\n      [0, -6],\n      [12, -15],\n      [2, -10],\n      [-4, -18],\n      [-9, 6],\n      [-5, 23],\n      [-11, 0],\n      [-14, 11],\n      [-11, -25],\n      [-2, -21],\n      [9, -5],\n      [9, -11],\n      [-1, -29],\n      [-11, -1],\n      [-5, -8],\n      [1, -18],\n      [-8, -10],\n      [-8, -20],\n      [-10, 4],\n      [0, 15],\n      [5, 3],\n      [3, 12],\n      [-3, 8],\n      [9, 5],\n      [2, 12],\n      [-4, 8],\n      [-2, 21],\n      [-4, 6],\n      [-2, 20],\n      [-7, 11],\n      [-5, -5],\n      [-12, 13],\n      [2, 8],\n      [-6, 18],\n      [-8, 1],\n      [-5, 8],\n      [-7, 3],\n      [-10, 22],\n      [-10, 1],\n      [-8, -3],\n      [-5, 11],\n      [-7, 2],\n      [-12, 24],\n      [-10, 10],\n      [-8, 18],\n      [-10, 5],\n      [-3, 12],\n      [-9, 9],\n      [1, 6],\n      [-8, 2],\n      [1, 18],\n      [-7, 17],\n      [0, 14],\n      [-5, 13],\n      [-7, 1],\n      [-16, 17],\n      [-15, 5],\n      [-14, -19],\n      [-3, -11],\n      [-17, -6]\n    ],\n    [\n      [5344, 7711],\n      [0, 0]\n    ],\n    [\n      [5345, 7596],\n      [0, 0]\n    ],\n    [\n      [2849, 6246],\n      [15, -3],\n      [3, -8],\n      [12, -7],\n      [4, -14],\n      [-9, -3],\n      [-10, 6],\n      [-1, -7],\n      [-6, 3],\n      [-1, -11],\n      [-7, 10],\n      [-8, -1],\n      [-7, 10],\n      [-3, 10],\n      [-8, 2],\n      [5, 12],\n      [10, 5],\n      [11, -4]\n    ],\n    [\n      [6087, 7032],\n      [-4, -6],\n      [-57, -30],\n      [15, -28],\n      [13, -29],\n      [-9, -10],\n      [-4, -18],\n      [-21, -8],\n      [-7, -22],\n      [-12, -17],\n      [-31, 9]\n    ],\n    [\n      [5970, 6873],\n      [0, 12]\n    ],\n    [\n      [5984, 6973],\n      [-1, 8]\n    ],\n    [\n      [5983, 6987],\n      [4, 0],\n      [0, 25]\n    ],\n    [\n      [5987, 7012],\n      [0, 36]\n    ],\n    [\n      [5993, 7068],\n      [7, -5],\n      [10, -16],\n      [12, -3],\n      [54, 61]\n    ],\n    [\n      [8563, 6721],\n      [-5, -10],\n      [-7, -5],\n      [-4, -21],\n      [0, 20],\n      [7, 8],\n      [-3, 7],\n      [7, -1],\n      [4, 12],\n      [1, -10]\n    ],\n    [\n      [8603, 6820],\n      [-13, -15],\n      [0, 9],\n      [11, 11],\n      [2, -5]\n    ],\n    [\n      [8624, 6937],\n      [5, -5],\n      [-7, -8],\n      [2, 13]\n    ],\n    [\n      [8639, 6942],\n      [-5, -5],\n      [6, 22],\n      [-1, -17]\n    ],\n    [\n      [8616, 7056],\n      [0, -12],\n      [-6, -7],\n      [1, 18],\n      [5, 1]\n    ],\n    [\n      [8578, 7069],\n      [-1, -10],\n      [-6, 2],\n      [7, 8]\n    ],\n    [\n      [8638, 7135],\n      [3, -16],\n      [7, -3],\n      [9, 6],\n      [1, -15],\n      [-5, -9],\n      [10, 1],\n      [0, -17],\n      [5, -2],\n      [-11, -22],\n      [-6, -38],\n      [0, -16],\n      [-3, -14],\n      [-7, 5],\n      [1, -11],\n      [-12, -13],\n      [2, 20],\n      [-5, 12],\n      [-2, -4],\n      [0, -22],\n      [-9, 5],\n      [4, 18],\n      [-5, 12],\n      [1, 21],\n      [2, -2],\n      [8, 19],\n      [-2, 11],\n      [3, 12],\n      [-5, 15],\n      [-8, 2],\n      [7, -19],\n      [-6, -11],\n      [1, 11],\n      [-10, -10],\n      [-6, 18],\n      [1, 10],\n      [4, -14],\n      [5, -1],\n      [-1, 10],\n      [-11, 11],\n      [1, 10],\n      [6, -2],\n      [18, 22],\n      [2, 9],\n      [6, 4],\n      [7, -3]\n    ],\n    [\n      [8726, 7162],\n      [8, -9],\n      [5, 1],\n      [-1, -13],\n      [4, -10],\n      [-10, -11],\n      [-5, -23],\n      [-8, 15],\n      [-5, 2],\n      [-13, -11],\n      [0, -7],\n      [-7, -11],\n      [-1, -16],\n      [-10, 0],\n      [3, 9],\n      [-6, 1],\n      [-6, 31],\n      [11, 14],\n      [2, 17],\n      [6, 6],\n      [5, -10],\n      [10, 2],\n      [3, 14],\n      [8, 9],\n      [7, 0]\n    ],\n    [\n      [8747, 7160],\n      [-3, -8],\n      [-3, 8],\n      [8, 15],\n      [-2, -15]\n    ],\n    [\n      [8595, 7181],\n      [-2, -23],\n      [-3, 4],\n      [1, 16],\n      [4, 3]\n    ],\n    [\n      [8845, 7375],\n      [1, -10],\n      [-6, -6],\n      [-1, 17],\n      [8, 13],\n      [-2, -14]\n    ],\n    [\n      [8923, 7564],\n      [5, 3],\n      [-1, -34],\n      [2, -14],\n      [8, -11],\n      [5, -22],\n      [4, -26],\n      [-5, -14],\n      [0, -12],\n      [-7, -6],\n      [-5, -25],\n      [1, -17],\n      [-6, 9],\n      [-7, -6],\n      [-3, -24],\n      [3, -14],\n      [-2, -39],\n      [-5, -8],\n      [-5, -19],\n      [-1, -20],\n      [8, -27],\n      [-11, -7],\n      [-2, -21],\n      [-16, -17],\n      [2, 30],\n      [5, 11],\n      [-8, 0],\n      [-4, -12],\n      [1, -16],\n      [-7, 11],\n      [-8, -5],\n      [0, -21],\n      [-9, -16],\n      [-1, 25],\n      [-6, 4],\n      [-6, -11],\n      [-4, -18],\n      [-17, 5],\n      [-15, -6],\n      [7, 9],\n      [-13, 1],\n      [0, 16],\n      [-5, -3],\n      [-3, -22],\n      [9, -9],\n      [1, -10],\n      [-7, 3],\n      [-10, -9],\n      [0, -10],\n      [-6, -8],\n      [-3, -15],\n      [-5, -7],\n      [-10, 5],\n      [-1, 8],\n      [-9, 11],\n      [3, 8],\n      [-3, 14],\n      [10, 17],\n      [-2, 9],\n      [-11, -4],\n      [-6, 7],\n      [-7, 0],\n      [-20, -18],\n      [-10, 1],\n      [-3, -9],\n      [-6, 2],\n      [-15, -9],\n      [-1, 9],\n      [-8, -6],\n      [-2, -24],\n      [-11, 13],\n      [-16, -7],\n      [-4, 7],\n      [-3, -8],\n      [-1, 25],\n      [3, 5],\n      [12, -1],\n      [3, 10],\n      [7, 5],\n      [17, 28],\n      [7, 7],\n      [-1, 9],\n      [17, 8],\n      [5, -8],\n      [24, 6],\n      [7, 7],\n      [11, -2],\n      [8, 7],\n      [-1, -12],\n      [13, -4],\n      [12, 10],\n      [-3, 18],\n      [5, 16],\n      [7, 8],\n      [10, 28],\n      [-1, 26],\n      [11, 10],\n      [6, 1],\n      [-3, -13],\n      [-9, -5],\n      [4, -6],\n      [-2, -13],\n      [10, -6],\n      [3, 10],\n      [21, 13],\n      [10, 12],\n      [10, 29],\n      [14, 15],\n      [1, 16],\n      [9, 23],\n      [3, 24],\n      [4, 10],\n      [1, 17],\n      [-4, 11],\n      [-5, -3],\n      [7, 19],\n      [1, 11],\n      [-5, 13],\n      [5, 10],\n      [7, 3],\n      [1, 26],\n      [9, -5],\n      [3, -20],\n      [3, 9],\n      [8, -6],\n      [3, 19],\n      [-13, -5],\n      [3, 23],\n      [10, -10]\n    ],\n    [\n      [8944, 7799],\n      [15, -24],\n      [4, -13],\n      [19, -27],\n      [11, -7],\n      [0, -6],\n      [12, 0],\n      [3, -7],\n      [13, -4],\n      [15, 25],\n      [1, -8],\n      [-7, -17],\n      [-1, -9],\n      [8, -28],\n      [8, 6],\n      [-4, -12],\n      [-6, 0],\n      [-8, -10],\n      [-27, -4],\n      [-11, -14],\n      [-8, -20],\n      [-3, -23],\n      [-8, 11],\n      [-14, 9],\n      [-8, 11],\n      [-12, 9],\n      [-8, -3],\n      [-12, -15],\n      [-9, 15],\n      [-5, 0],\n      [-6, -18],\n      [12, -8],\n      [13, -20],\n      [-13, -1],\n      [-8, -7],\n      [-6, -13],\n      [-7, 10],\n      [5, 14],\n      [-3, 17],\n      [-7, 6],\n      [3, 26],\n      [12, 7],\n      [5, 11],\n      [-5, 13],\n      [6, 8],\n      [8, -9],\n      [10, -3],\n      [7, 10],\n      [-3, 22],\n      [9, 14],\n      [0, 22],\n      [3, 6],\n      [1, 20],\n      [-6, 23],\n      [3, 12],\n      [9, 3]\n    ],\n    [\n      [6762, 7807],\n      [-15, 8],\n      [-3, 11],\n      [1, 13],\n      [12, 14],\n      [11, -3],\n      [7, -11],\n      [1, -13],\n      [-4, -11],\n      [-10, -8]\n    ],\n    [\n      [7140, 7205],\n      [-9, 31]\n    ],\n    [\n      [6651, 7782],\n      [-20, 19]\n    ],\n    [\n      [6631, 7801],\n      [12, 18],\n      [8, -37]\n    ],\n    [\n      [7227, 7611],\n      [-6, 13],\n      [-15, 4],\n      [-12, 17],\n      [-14, 6],\n      [-14, 0],\n      [-19, 2],\n      [-14, 5],\n      [-13, -5],\n      [-16, 1],\n      [-3, -6],\n      [-13, 2],\n      [-12, 8],\n      [-12, 13],\n      [-21, -10],\n      [-5, -27],\n      [3, -9],\n      [-22, 14],\n      [-27, 9],\n      [-10, -1],\n      [-10, -13],\n      [-5, -15],\n      [3, -3]\n    ],\n    [\n      [6970, 7616],\n      [-6, -3],\n      [-4, -11],\n      [-4, 5],\n      [-9, -16],\n      [-20, -15],\n      [0, -5],\n      [-10, -5],\n      [0, -10],\n      [-13, -17],\n      [1, -19],\n      [-4, 0],\n      [-13, 13],\n      [4, 14],\n      [-5, 7],\n      [-33, -3],\n      [-5, 20],\n      [-2, 30],\n      [-14, 0],\n      [2, 57],\n      [-8, -7],\n      [-8, 26],\n      [-7, 5],\n      [-10, 19],\n      [-12, -10],\n      [-37, 4],\n      [-32, -8],\n      [-23, 38],\n      [-2, 12],\n      [-28, 28]\n    ],\n    [\n      [6668, 7765],\n      [0, 34],\n      [-2, 9],\n      [-7, -1],\n      [3, 20],\n      [17, -5],\n      [8, 16],\n      [12, 7],\n      [2, 14],\n      [-11, 2],\n      [-3, 9],\n      [-13, 3],\n      [-8, -7],\n      [4, -13],\n      [17, 0],\n      [2, -11],\n      [-4, -6],\n      [-24, 2],\n      [-2, 12],\n      [-7, 0],\n      [7, -14],\n      [-3, -17],\n      [-8, -6],\n      [-4, 5],\n      [4, 13],\n      [-15, -3],\n      [-6, -23]\n    ],\n    [\n      [6627, 7805],\n      [-73, -31],\n      [0, -212]\n    ],\n    [\n      [6554, 7562],\n      [-14, -3],\n      [-15, 32],\n      [0, 6],\n      [-20, 23],\n      [-20, -3],\n      [-14, -9],\n      [-15, -21]\n    ],\n    [\n      [6456, 7587],\n      [-1, 20],\n      [6, 15],\n      [3, 22],\n      [-15, 9],\n      [-8, -3],\n      [-6, 18],\n      [-12, 0],\n      [1, 23],\n      [-4, 4],\n      [-8, 33],\n      [-17, 9],\n      [1, 17],\n      [16, -1],\n      [4, -6],\n      [16, -2],\n      [-17, 20],\n      [12, 28],\n      [9, 5],\n      [22, 0],\n      [11, -6],\n      [10, 2],\n      [-15, 10],\n      [0, 6],\n      [9, 18],\n      [4, 40],\n      [-8, 19],\n      [-13, 2],\n      [-10, -10],\n      [-16, 14],\n      [-9, 3],\n      [-12, -11],\n      [-9, -2],\n      [-18, -21],\n      [-13, 2],\n      [-2, -14]\n    ],\n    [\n      [6367, 7850],\n      [-9, 9],\n      [-10, 5],\n      [0, 12],\n      [6, -6],\n      [7, 6],\n      [-9, 19],\n      [-4, 15],\n      [-14, 23],\n      [-11, 0],\n      [-7, 5],\n      [-1, -9],\n      [-7, 7],\n      [0, 26],\n      [-18, 8],\n      [8, 30],\n      [8, 10],\n      [-7, 14],\n      [3, 28],\n      [12, 12],\n      [-1, 14],\n      [9, 9],\n      [22, -37],\n      [13, 11],\n      [-5, 20],\n      [0, 13],\n      [20, 17],\n      [0, 15],\n      [11, 0],\n      [15, 12],\n      [6, 17],\n      [5, 6],\n      [14, -3],\n      [1, -11],\n      [11, -1],\n      [6, 12],\n      [11, 6],\n      [5, -16],\n      [23, 0],\n      [9, -7],\n      [1, -9],\n      [7, -1],\n      [6, -13],\n      [10, -7],\n      [-3, -16],\n      [8, 2],\n      [1, 24],\n      [10, -13],\n      [16, -15],\n      [13, 11],\n      [11, 20],\n      [18, 0],\n      [5, -11],\n      [11, 1],\n      [1, 13],\n      [22, -4],\n      [0, -11],\n      [10, -11],\n      [16, -3],\n      [1, -9],\n      [7, 4],\n      [5, 18],\n      [9, -10],\n      [15, -1],\n      [17, 10],\n      [2, 19],\n      [4, 6],\n      [-7, 11],\n      [-10, 1],\n      [-3, 8],\n      [-16, 3],\n      [3, 8],\n      [-12, 4],\n      [11, 15],\n      [7, 1],\n      [10, 11],\n      [-10, 23],\n      [22, 16],\n      [17, -3],\n      [1, 7],\n      [-13, 9],\n      [-14, 3],\n      [2, 12],\n      [-6, 8],\n      [5, 11],\n      [-6, 3],\n      [12, 10],\n      [4, -6],\n      [43, 7],\n      [25, 14],\n      [25, 5],\n      [9, -4],\n      [-1, 10],\n      [7, 7],\n      [15, -1],\n      [15, 6],\n      [33, 8],\n      [13, 6],\n      [2, 13],\n      [10, 0],\n      [2, 9],\n      [8, -4],\n      [-1, 9],\n      [8, -6],\n      [13, 0],\n      [14, -11],\n      [8, 9],\n      [14, -12],\n      [1, -18],\n      [6, -3],\n      [-1, -23],\n      [-6, 0],\n      [6, -13],\n      [3, 6],\n      [11, -4],\n      [10, 5],\n      [3, 9],\n      [9, -14],\n      [-3, -13],\n      [9, 3],\n      [-4, 10],\n      [11, -1],\n      [3, -8],\n      [11, -2],\n      [8, 7],\n      [-3, -12],\n      [-6, 1],\n      [-6, -17],\n      [6, -8],\n      [13, 12],\n      [14, -10],\n      [1, 12],\n      [9, 9],\n      [7, -2],\n      [12, 11],\n      [-2, 4],\n      [31, 15],\n      [12, 8],\n      [-7, -19],\n      [-8, 1],\n      [3, -9],\n      [34, -36],\n      [7, -11],\n      [42, -97],\n      [12, -38],\n      [15, 7],\n      [-1, 14],\n      [6, 6],\n      [15, -7],\n      [-3, -15],\n      [9, 2],\n      [2, -13],\n      [11, 3],\n      [6, -4],\n      [17, 5],\n      [18, 12],\n      [13, -7],\n      [11, -20],\n      [0, -15],\n      [23, -14],\n      [-2, -7],\n      [9, -19],\n      [19, -1],\n      [6, -7],\n      [12, 20],\n      [0, -10],\n      [12, -22],\n      [7, -9]\n    ],\n    [\n      [6163, 5412],\n      [-17, -50],\n      [-9, -17],\n      [0, -175],\n      [1, -39],\n      [15, -39],\n      [0, -7]\n    ],\n    [\n      [6153, 5085],\n      [-6, -15],\n      [-9, -4],\n      [-4, -20],\n      [-5, -9],\n      [-5, 0],\n      [-9, -13],\n      [2, -12],\n      [-3, -18],\n      [-6, -12],\n      [-3, -25],\n      [-4, -11],\n      [-7, -30],\n      [-6, -3]\n    ],\n    [\n      [6088, 4913],\n      [-21, 33],\n      [-19, 27],\n      [-5, 13],\n      [4, 6],\n      [-1, 14],\n      [-100, 116]\n    ],\n    [\n      [5946, 5122],\n      [3, 12],\n      [-4, 7],\n      [0, 10],\n      [4, 7],\n      [9, -1],\n      [-2, 6],\n      [11, 4],\n      [-4, 11],\n      [-10, -6],\n      [2, -6],\n      [-9, 7],\n      [-3, 12],\n      [1, 12]\n    ],\n    [\n      [5944, 5197],\n      [4, 21],\n      [7, 12],\n      [2, 15],\n      [9, 9],\n      [2, 18],\n      [3, 6],\n      [0, 26],\n      [-3, 18],\n      [2, 3],\n      [-14, 40],\n      [-2, 17],\n      [2, 13],\n      [-8, 5],\n      [-3, 24],\n      [-2, 2]\n    ],\n    [\n      [5943, 5426],\n      [11, 23],\n      [15, 14],\n      [14, 9],\n      [4, -7],\n      [2, -16],\n      [8, 0]\n    ],\n    [\n      [7045, 7454],\n      [-13, -5],\n      [-15, 2],\n      [-9, -5],\n      [-2, -6],\n      [-5, 10],\n      [-7, -7],\n      [-2, 12],\n      [-8, 8],\n      [-12, -11],\n      [-8, -1],\n      [-4, 11],\n      [-36, -5],\n      [-2, 14],\n      [7, 20],\n      [14, 6],\n      [18, -12],\n      [1, 7],\n      [8, 8]\n    ],\n    [\n      [6970, 7500],\n      [12, 3],\n      [11, -7],\n      [9, 15],\n      [8, -3],\n      [0, 14],\n      [7, -6],\n      [4, 9],\n      [10, 8],\n      [-13, 3],\n      [-5, 9],\n      [-9, -1],\n      [0, 10],\n      [-8, 0],\n      [-6, 22],\n      [-1, -10],\n      [-6, -2],\n      [0, -13],\n      [-6, -1],\n      [-12, 7],\n      [-4, 14],\n      [-4, -4],\n      [-9, 10],\n      [8, 7],\n      [22, 29],\n      [-8, 3]\n    ],\n    [\n      [6976, 7489],\n      [-6, 4],\n      [2, -14],\n      [4, 10]\n    ],\n    [\n      [6993, 7480],\n      [0, 0]\n    ],\n    [\n      [6961, 7477],\n      [0, 0]\n    ],\n    [\n      [7901, 5783],\n      [-6, 7],\n      [-11, 2],\n      [-7, -4],\n      [-3, 5],\n      [5, 13],\n      [0, 15],\n      [-4, 5],\n      [-3, -16],\n      [-9, 2],\n      [-2, 38],\n      [-3, 3]\n    ],\n    [\n      [7858, 5853],\n      [0, 7],\n      [-6, 22],\n      [0, 22],\n      [-6, 7],\n      [0, 21],\n      [-3, 7],\n      [-2, 25],\n      [6, 0],\n      [10, 26],\n      [1, 11],\n      [9, 8],\n      [12, 5],\n      [9, -5],\n      [5, 3],\n      [11, -2],\n      [5, 4],\n      [6, -3],\n      [2, -10],\n      [4, 8]\n    ],\n    [\n      [7921, 6009],\n      [3, -14],\n      [13, -1],\n      [3, -9],\n      [6, -1],\n      [2, 7],\n      [-6, 19],\n      [7, 7],\n      [6, -2],\n      [3, 6],\n      [8, -14],\n      [4, 0],\n      [8, 11],\n      [5, 2],\n      [2, 10]\n    ],\n    [\n      [7985, 6030],\n      [0, -14],\n      [-3, -2],\n      [-2, -19],\n      [3, -10],\n      [0, -10],\n      [5, -22],\n      [-5, -20],\n      [4, -24],\n      [-2, -15],\n      [-2, -6],\n      [-4, 5],\n      [-8, -14],\n      [-8, -7],\n      [-8, -1],\n      [0, -17],\n      [-11, 7],\n      [-4, -13],\n      [-1, -15],\n      [9, -13],\n      [1, -17],\n      [-9, 3],\n      [-3, 10],\n      [-10, -2],\n      [-3, -7],\n      [-7, 6],\n      [1, -11],\n      [-6, -13],\n      [-9, 0],\n      [-2, -6]\n    ],\n    [\n      [627, 5299],\n      [5, -18],\n      [-8, 8],\n      [3, 10]\n    ],\n    [\n      [8522, 7115],\n      [1, -14],\n      [-17, -6],\n      [-2, 8],\n      [5, 8],\n      [13, 4]\n    ],\n    [\n      [8508, 7172],\n      [1, -8],\n      [-7, 2],\n      [6, 6]\n    ],\n    [\n      [8575, 7196],\n      [-1, -14],\n      [-5, 11],\n      [6, 3]\n    ],\n    [\n      [8518, 7361],\n      [8, 22],\n      [5, 6],\n      [27, 0],\n      [7, 17]\n    ],\n    [\n      [8565, 7406],\n      [7, -27],\n      [14, -31],\n      [6, -25],\n      [4, -25],\n      [-2, -7],\n      [-1, -33],\n      [4, -6],\n      [-2, -25],\n      [-9, -23],\n      [-18, 0],\n      [-1, -15],\n      [-3, 6],\n      [-17, 1],\n      [-2, -20],\n      [-4, 14],\n      [0, -13],\n      [-5, -9],\n      [-3, 13],\n      [-6, -5],\n      [-3, -11],\n      [-4, 3],\n      [-4, -10],\n      [-2, 15],\n      [-7, 2],\n      [0, 9],\n      [6, -7],\n      [2, 11],\n      [-4, 1],\n      [-2, 18],\n      [2, 17],\n      [6, 9],\n      [-4, 4],\n      [8, 7],\n      [-7, 10],\n      [5, 1],\n      [-5, 11],\n      [-1, 31],\n      [-3, 8],\n      [3, 12],\n      [7, -1],\n      [-6, 42],\n      [4, 3]\n    ],\n    [\n      [5598, 7616],\n      [-9, -9],\n      [-3, 6],\n      [-10, -8],\n      [0, -11],\n      [-5, 0]\n    ],\n    [\n      [5557, 7633],\n      [8, 15]\n    ],\n    [\n      [5565, 7648],\n      [9, 17],\n      [-2, 6],\n      [14, -7],\n      [8, -19],\n      [10, -5],\n      [-6, -24]\n    ],\n    [\n      [6338, 6909],\n      [5, -15],\n      [-4, -7],\n      [-5, 12],\n      [4, 10]\n    ],\n    [\n      [6345, 6826],\n      [-22, 0],\n      [-6, 27],\n      [-25, 5]\n    ],\n    [\n      [6331, 6910],\n      [7, -26],\n      [-6, 2],\n      [-7, -12],\n      [10, -1],\n      [2, -19],\n      [8, -28]\n    ],\n    [\n      [7836, 6473],\n      [2, -9],\n      [8, -12],\n      [6, -22],\n      [2, 9],\n      [5, -5],\n      [0, -9],\n      [-2, -23],\n      [7, -19],\n      [15, -11],\n      [2, 8],\n      [9, 10],\n      [5, -4],\n      [9, -13],\n      [-1, -9],\n      [-6, -3],\n      [9, -6],\n      [0, -8],\n      [7, -2],\n      [0, -11],\n      [-2, -10],\n      [-9, -12],\n      [-8, 6],\n      [-4, -15],\n      [-6, -7],\n      [18, -21],\n      [4, -8],\n      [9, -5],\n      [5, -6],\n      [-2, -12],\n      [6, -14],\n      [5, 0],\n      [7, -30],\n      [13, -24],\n      [9, -17],\n      [0, -18],\n      [4, -11],\n      [5, 5],\n      [4, -14],\n      [8, -12],\n      [4, -1],\n      [-1, -8],\n      [-6, -5],\n      [2, -12],\n      [7, -8],\n      [5, -12],\n      [-5, -33]\n    ],\n    [\n      [7921, 6009],\n      [9, 11],\n      [0, 20],\n      [1, 5],\n      [-3, 11],\n      [3, 6],\n      [2, 24],\n      [-5, 5],\n      [0, 13],\n      [-11, 7],\n      [0, 8],\n      [-8, 15],\n      [0, 29],\n      [2, 20],\n      [-3, 9],\n      [-7, 7],\n      [-6, 14],\n      [-7, 24],\n      [-18, 8],\n      [-2, -10],\n      [-9, -15],\n      [-9, -6],\n      [-16, 16],\n      [-4, -9],\n      [-19, -26],\n      [-4, -7],\n      [-5, 6],\n      [3, 19],\n      [4, 9],\n      [0, 17],\n      [-3, 3],\n      [5, 14],\n      [0, 15],\n      [3, 7],\n      [-3, 6],\n      [-1, 19],\n      [2, 7],\n      [-12, 2],\n      [-2, -7],\n      [-7, 0],\n      [-3, 9],\n      [3, 29],\n      [-5, 15],\n      [-6, -5]\n    ],\n    [\n      [7780, 6353],\n      [0, 15],\n      [7, 14],\n      [4, -1],\n      [0, 13],\n      [6, 16],\n      [3, 0],\n      [9, 14]\n    ],\n    [\n      [5975, 7088],\n      [14, 52],\n      [1, 19],\n      [9, 12],\n      [0, 7]\n    ],\n    [\n      [5999, 7178],\n      [13, -3],\n      [4, -23],\n      [-9, -14],\n      [2, -8],\n      [-6, 2],\n      [-6, -12],\n      [3, -5],\n      [-6, -8]\n    ],\n    [\n      [4790, 5433],\n      [-19, 13],\n      [-21, 22],\n      [-9, 12],\n      [-21, 40],\n      [-9, 19],\n      [-12, 7],\n      [-1, 10],\n      [-14, 13],\n      [-3, 12]\n    ],\n    [\n      [4681, 5581],\n      [3, 14],\n      [6, 12],\n      [15, 23],\n      [0, 16],\n      [8, 8],\n      [1, 17]\n    ],\n    [\n      [5693, 6449],\n      [0, -115],\n      [-27, 0],\n      [0, -28]\n    ],\n    [\n      [5666, 6306],\n      [-66, 66],\n      [-3, 4],\n      [-45, 45],\n      [-34, 36],\n      [-45, 45],\n      [-30, 31],\n      [-27, -26]\n    ],\n    [\n      [5416, 6507],\n      [-22, -22],\n      [-20, 33],\n      [-42, 19]\n    ],\n    [\n      [5264, 6924],\n      [10, 7],\n      [11, 30],\n      [-5, 31],\n      [6, 17],\n      [5, 1],\n      [10, 22],\n      [19, 18],\n      [-2, 10],\n      [1, 34]\n    ],\n    [\n      [5319, 7094],\n      [10, -6],\n      [12, -14],\n      [15, -2],\n      [14, 6],\n      [6, -6],\n      [17, -5],\n      [8, -12],\n      [20, -6],\n      [5, -13],\n      [0, -14],\n      [7, -25],\n      [4, -7],\n      [17, -9],\n      [10, 0],\n      [18, -8],\n      [23, -18],\n      [3, -7],\n      [18, -22],\n      [8, 0],\n      [14, 14],\n      [10, 24],\n      [1, 18],\n      [-6, 24],\n      [0, 16],\n      [3, 12],\n      [15, 24],\n      [14, 13],\n      [10, 1],\n      [5, 7],\n      [21, -3],\n      [21, -14],\n      [-1, -18],\n      [6, -6],\n      [19, -7],\n      [2, -5],\n      [25, -2],\n      [5, -18]\n    ],\n    [\n      [3307, 5973],\n      [-4, 11],\n      [5, 10],\n      [-1, -21]\n    ],\n    [\n      [7235, 5735],\n      [7, -13],\n      [17, -49],\n      [5, -36],\n      [5, -8],\n      [4, -24],\n      [0, -20],\n      [-2, -22],\n      [-12, -22],\n      [-22, -17],\n      [-9, 5],\n      [-4, 7],\n      [-7, 43],\n      [-1, 50],\n      [1, 40],\n      [2, 10],\n      [0, 17],\n      [6, 17],\n      [-2, 7],\n      [4, 10],\n      [6, 1],\n      [-14, 10],\n      [2, 7],\n      [7, -3],\n      [7, -10]\n    ],\n    [\n      [5798, 3530],\n      [6, -12],\n      [10, -10],\n      [3, -14],\n      [-4, -17],\n      [-5, -7],\n      [1, -10],\n      [-8, -9],\n      [-13, -4],\n      [-5, -7],\n      [-4, -22],\n      [-8, 2],\n      [-16, 35],\n      [-5, 22],\n      [8, 6],\n      [12, 35],\n      [8, 2],\n      [4, 10],\n      [13, 8],\n      [3, -8]\n    ],\n    [\n      [5582, 8366],\n      [-1, 0]\n    ],\n    [\n      [5581, 8366],\n      [1, 0]\n    ],\n    [\n      [5652, 8289],\n      [0, 9],\n      [-14, 16],\n      [-6, -1]\n    ],\n    [\n      [5632, 8313],\n      [-3, 6],\n      [5, 24],\n      [-8, 11],\n      [-15, 1],\n      [-21, 9]\n    ],\n    [\n      [5590, 8364],\n      [-6, 32],\n      [0, 16]\n    ],\n    [\n      [5584, 8412],\n      [8, 9],\n      [22, 11],\n      [15, -4],\n      [8, 3],\n      [29, -5],\n      [4, -4],\n      [22, 8],\n      [5, -12],\n      [15, -2],\n      [26, -28]\n    ],\n    [\n      [5759, 8496],\n      [14, -14],\n      [-6, -26],\n      [14, -17],\n      [0, -23]\n    ],\n    [\n      [5584, 8412],\n      [-2, 19],\n      [2, 24],\n      [10, 12],\n      [0, 15],\n      [8, 15],\n      [22, 11],\n      [18, -21],\n      [4, -17],\n      [12, -7],\n      [19, 15],\n      [-2, 37]\n    ],\n    [\n      [3249, 6221],\n      [-2, 2]\n    ],\n    [\n      [3247, 6223],\n      [2, -2]\n    ],\n    [\n      [4851, 7247],\n      [2, -14],\n      [14, -21],\n      [11, -5],\n      [19, 8],\n      [6, -5],\n      [15, 7]\n    ],\n    [\n      [4919, 7214],\n      [2, -9],\n      [17, -2]\n    ],\n    [\n      [4758, 6776],\n      [-3, 0],\n      [1, -30],\n      [-18, -3],\n      [-7, -11],\n      [-16, -2],\n      [-9, 7],\n      [-10, 1],\n      [-13, -7],\n      [2, -15],\n      [-4, -6],\n      [-8, -25],\n      [-8, -3],\n      [-4, -23],\n      [-3, -30],\n      [-3, -13],\n      [-6, -12],\n      [-12, -16],\n      [-6, -22],\n      [-16, -16],\n      [-4, -13],\n      [-6, -53],\n      [0, -16],\n      [-12, -26],\n      [1, -7],\n      [-4, -14],\n      [-11, -4],\n      [-22, 4],\n      [-18, -1],\n      [-12, -4]\n    ],\n    [\n      [4527, 6416],\n      [1, 21],\n      [4, 20],\n      [10, 13],\n      [4, 26],\n      [5, 11],\n      [-2, 5],\n      [13, 42],\n      [-4, 0],\n      [8, 12],\n      [11, 26],\n      [5, 4],\n      [5, 17],\n      [0, 22],\n      [10, 45],\n      [0, 9],\n      [9, 16],\n      [7, 4],\n      [10, 14],\n      [10, 53],\n      [7, 16],\n      [24, 8],\n      [16, 14],\n      [11, 23],\n      [15, 15],\n      [21, 49],\n      [5, 19],\n      [1, 14],\n      [-7, 13],\n      [0, 26],\n      [2, 26],\n      [3, 11],\n      [9, 18],\n      [3, 24],\n      [-1, 7],\n      [11, 17],\n      [10, 23],\n      [26, 19],\n      [21, 25],\n      [15, 48],\n      [2, 15],\n      [9, 39],\n      [14, 7]\n    ],\n    [\n      [5206, 7702],\n      [-2, -1]\n    ],\n    [\n      [5783, 7801],\n      [-3, 21],\n      [1, 26],\n      [3, 22],\n      [-4, 18],\n      [-6, 5],\n      [-17, 36],\n      [-10, 30],\n      [-8, 3]\n    ],\n    [\n      [5739, 7962],\n      [20, 10],\n      [14, -2],\n      [6, -9],\n      [21, -8],\n      [10, -13],\n      [-1, -25],\n      [7, -10],\n      [5, 2],\n      [0, -20],\n      [10, -9],\n      [-1, -16],\n      [6, -9],\n      [-15, 0],\n      [-3, 6],\n      [-7, -6],\n      [-1, 9],\n      [-7, -4],\n      [1, -26],\n      [-13, -19],\n      [0, -11],\n      [-8, -1]\n    ],\n    [\n      [6384, 4200],\n      [0, 8],\n      [5, 14],\n      [-5, -22]\n    ],\n    [\n      [6370, 4487],\n      [-2, -11],\n      [7, -4],\n      [1, -18],\n      [7, -8],\n      [4, -13],\n      [-1, -9],\n      [5, -25],\n      [3, -37],\n      [0, -29],\n      [8, -27],\n      [-4, -34],\n      [-3, -9],\n      [-6, 7],\n      [-3, 25],\n      [-8, -7],\n      [3, -23],\n      [-2, -5],\n      [5, -11],\n      [-1, -25],\n      [-5, -13],\n      [-6, -24],\n      [2, -29],\n      [-4, -39],\n      [-3, -11],\n      [-10, -59],\n      [-2, -19],\n      [-7, -32],\n      [-3, -29],\n      [-10, -57],\n      [-4, -16],\n      [-2, -24],\n      [-7, -48],\n      [-1, -16],\n      [-4, -13],\n      [-8, -47],\n      [-14, -15],\n      [-11, -2],\n      [-13, -11],\n      [-6, -9],\n      [-12, -2],\n      [-11, 17],\n      [-10, 2],\n      [-10, 15],\n      [-2, 20],\n      [-7, 14],\n      [-1, 45],\n      [3, 10],\n      [-4, 6],\n      [-1, 16],\n      [-6, 12],\n      [-4, 36],\n      [3, 27],\n      [4, 6],\n      [0, 17],\n      [7, 4],\n      [11, 46],\n      [4, 7],\n      [6, 29],\n      [-3, 4],\n      [2, 24],\n      [-6, 18],\n      [1, 16],\n      [-6, 22],\n      [-1, 35],\n      [-3, 15],\n      [15, 49],\n      [0, 30],\n      [12, -1],\n      [11, 16],\n      [10, -2],\n      [0, 7],\n      [8, 4],\n      [4, -6],\n      [1, 9],\n      [6, 5],\n      [18, 25],\n      [3, -7],\n      [-3, -10],\n      [7, 2],\n      [-4, 18],\n      [4, 5],\n      [2, 12],\n      [6, 8],\n      [-3, -22],\n      [11, 28],\n      [-3, 11],\n      [3, 11],\n      [4, -2],\n      [3, 11],\n      [-4, 9],\n      [0, 19],\n      [7, -1],\n      [1, -10],\n      [4, -1],\n      [0, 14],\n      [5, 1],\n      [-1, 9],\n      [6, -4],\n      [3, 5],\n      [1, 16],\n      [3, 8],\n      [-2, 22],\n      [3, 13],\n      [5, 4],\n      [3, 18],\n      [2, -8]\n    ],\n    [\n      [2590, 6367],\n      [-7, -17],\n      [2, 17],\n      [5, 0]\n    ],\n    [\n      [1889, 6595],\n      [7, -4],\n      [1, -9],\n      [-8, 13]\n    ],\n    [\n      [1800, 6801],\n      [-5, -1],\n      [5, 12],\n      [0, -11]\n    ],\n    [\n      [1880, 6866],\n      [3, -12],\n      [-3, -16],\n      [-7, 7],\n      [2, 17],\n      [5, 4]\n    ],\n    [\n      [1847, 6884],\n      [4, -14],\n      [5, -1],\n      [2, -17],\n      [-11, 17],\n      [-3, 9],\n      [3, 6]\n    ],\n    [\n      [2186, 6889],\n      [0, -8],\n      [7, -2]\n    ],\n    [\n      [2193, 6879],\n      [11, -20],\n      [1, -12],\n      [9, -31],\n      [6, -12],\n      [9, -27],\n      [7, -6],\n      [-1, -15],\n      [2, -15]\n    ],\n    [\n      [2237, 6741],\n      [3, -16],\n      [3, 2],\n      [2, -14]\n    ],\n    [\n      [2245, 6713],\n      [2, -9],\n      [20, -12],\n      [4, -8],\n      [16, -2],\n      [9, -10],\n      [5, 6]\n    ],\n    [\n      [2301, 6678],\n      [0, -14],\n      [-8, -31],\n      [-6, -38],\n      [-2, -30],\n      [-1, -43],\n      [1, -16],\n      [-4, -22],\n      [3, -29],\n      [5, -34],\n      [15, -57],\n      [9, -17],\n      [9, -27],\n      [3, -25],\n      [5, -5],\n      [1, -9],\n      [7, -19],\n      [7, -4],\n      [11, 2],\n      [5, -9],\n      [6, -2],\n      [8, -21],\n      [10, 3],\n      [16, 11],\n      [17, 3],\n      [15, 13],\n      [10, 2],\n      [6, -12],\n      [10, -3],\n      [6, 17],\n      [-5, 8],\n      [14, 16],\n      [5, 11],\n      [1, 21],\n      [7, 14],\n      [-1, 6],\n      [1, 39],\n      [3, 15],\n      [16, 17],\n      [19, 4],\n      [17, 12],\n      [14, 2],\n      [20, -9],\n      [6, 9],\n      [6, -10],\n      [2, -17],\n      [-3, -16],\n      [-9, -18],\n      [-7, -19],\n      [-1, -19],\n      [-8, -16],\n      [9, -8],\n      [-6, -40],\n      [-3, -10],\n      [-2, -23],\n      [-3, 14],\n      [-4, 3],\n      [2, 18],\n      [-5, -4],\n      [-3, -15]\n    ],\n    [\n      [2437, 6020],\n      [-20, 42],\n      [-19, 33],\n      [-11, 16],\n      [-10, 10],\n      [-1, -6],\n      [-8, 1],\n      [-4, 13],\n      [-5, -9],\n      [9, -4],\n      [-11, -1],\n      [-8, -12],\n      [-15, -9],\n      [-7, -8],\n      [-8, -2],\n      [-15, 10],\n      [-4, 6],\n      [-17, 3],\n      [-8, 13],\n      [-13, 6],\n      [-6, 14],\n      [-5, 0],\n      [-15, 8],\n      [-5, 0],\n      [-5, 9],\n      [-31, 22],\n      [-6, 11],\n      [-13, 14],\n      [-4, 13],\n      [-7, 6],\n      [-5, -4],\n      [-32, 20],\n      [-8, 21],\n      [-9, 14],\n      [-12, 13],\n      [-15, 12],\n      [-3, 14],\n      [-5, 6],\n      [-8, 22],\n      [0, 10],\n      [-4, 8],\n      [3, 8],\n      [10, 6],\n      [-7, 15],\n      [7, 12],\n      [1, 22],\n      [-6, 8],\n      [-7, 23],\n      [-2, 32],\n      [-9, 17],\n      [-15, 34],\n      [-12, 32],\n      [-21, 28],\n      [7, -7],\n      [0, 9],\n      [-5, -1],\n      [-9, 13],\n      [-6, 18],\n      [7, 0],\n      [-22, 24],\n      [0, 5],\n      [-9, -3],\n      [6, 9],\n      [-7, -1],\n      [-8, 9],\n      [0, 14],\n      [4, 9],\n      [0, 19],\n      [-4, 9],\n      [-10, 3],\n      [-5, 23],\n      [-9, 2],\n      [-7, 13],\n      [-2, 26],\n      [2, 3],\n      [-14, 4],\n      [-8, 12],\n      [-5, 13],\n      [-5, 5],\n      [-13, 29],\n      [-2, 20],\n      [-5, 2],\n      [1, 9],\n      [-11, 23],\n      [0, 16],\n      [-10, 36],\n      [3, 20],\n      [-16, 10],\n      [-1, 10],\n      [-7, 6],\n      [-9, -6],\n      [-10, 15],\n      [-8, 2],\n      [0, -41],\n      [4, -8],\n      [3, -27],\n      [-1, -19],\n      [7, -21],\n      [4, -1],\n      [17, -27],\n      [3, -23],\n      [7, -3],\n      [11, -32],\n      [3, -25],\n      [4, -12],\n      [8, -6],\n      [4, -20],\n      [6, -7],\n      [-1, -6],\n      [8, -25],\n      [-3, 20],\n      [8, -10],\n      [0, -9],\n      [5, -13],\n      [1, -29],\n      [9, -25],\n      [10, -36],\n      [-2, -15],\n      [3, -15],\n      [8, -8],\n      [0, 13],\n      [14, -16],\n      [4, -23],\n      [7, -10],\n      [0, -14],\n      [-11, -19],\n      [-7, 0],\n      [-6, 36],\n      [-8, 9],\n      [-12, 22],\n      [-14, 16],\n      [-5, 14],\n      [-4, -3],\n      [-4, 14],\n      [-3, -1],\n      [-2, 25],\n      [3, 3],\n      [0, 27],\n      [-9, 30],\n      [-3, 0],\n      [-17, 21],\n      [-1, 21],\n      [-4, -13],\n      [-10, -1],\n      [-5, 13],\n      [-8, 9],\n      [-10, 6],\n      [0, 9],\n      [-16, 20],\n      [-1, 8],\n      [15, -5],\n      [7, 6],\n      [5, -13],\n      [-1, 17],\n      [2, 28],\n      [-9, 26],\n      [-4, 3],\n      [-12, 26],\n      [-6, 2],\n      [-14, 19],\n      [-4, 12],\n      [0, 19],\n      [-5, 4],\n      [-1, 26],\n      [-7, 9],\n      [0, 11],\n      [-10, 22],\n      [1, 15],\n      [-8, 14],\n      [-6, 28]\n    ],\n    [\n      [1746, 7056],\n      [66, 10],\n      [-1, -12],\n      [46, -30],\n      [58, -37],\n      [79, 0],\n      [0, 26],\n      [46, 0],\n      [11, -20],\n      [8, -8],\n      [14, -26],\n      [6, -4],\n      [7, -12],\n      [6, -21],\n      [-1, -10],\n      [5, -21],\n      [14, -20],\n      [25, -19],\n      [8, 14],\n      [4, 30],\n      [8, 2],\n      [3, 6],\n      [5, -5],\n      [20, -2],\n      [3, -8]\n    ],\n    [\n      [2290, 6649],\n      [-4, -5],\n      [0, -32],\n      [-2, -53],\n      [6, 67],\n      [4, 13],\n      [-4, 10]\n    ],\n    [\n      [5582, 7536],\n      [0, 0]\n    ],\n    [\n      [5586, 7536],\n      [-4, 1]\n    ],\n    [\n      [5581, 7537],\n      [0, 0]\n    ],\n    [\n      [5575, 7539],\n      [-2, 10]\n    ],\n    [\n      [5598, 7616],\n      [20, 7],\n      [2, -4]\n    ],\n    [\n      [5117, 6285],\n      [0, -124],\n      [-1, -33],\n      [-4, -7],\n      [-4, -29],\n      [-11, -17],\n      [0, -8],\n      [-14, 4],\n      [0, -5],\n      [-47, -3],\n      [-9, -17],\n      [-9, -3],\n      [-13, 3],\n      [1, -5]\n    ],\n    [\n      [4683, 5897],\n      [-1, 36],\n      [-6, 21],\n      [-5, -5],\n      [-8, 23],\n      [4, 5],\n      [-2, 28],\n      [-5, 6],\n      [1, 18],\n      [-2, 5]\n    ],\n    [\n      [4659, 6034],\n      [5, -2],\n      [7, 8],\n      [0, 24],\n      [3, 11],\n      [6, 7],\n      [14, -22],\n      [3, -2],\n      [4, 13],\n      [12, 1],\n      [14, -4],\n      [13, 7],\n      [65, 0],\n      [41, 0],\n      [5, 45],\n      [-8, 15],\n      [-1, 33],\n      [-2, 21],\n      [-1, 36],\n      [-2, 22],\n      [-6, 109],\n      [0, 17],\n      [-3, 39],\n      [-6, 104],\n      [0, 14],\n      [-3, 39],\n      [0, 16],\n      [-3, 37],\n      [50, 0]\n    ],\n    [\n      [7737, 5862],\n      [0, -11],\n      [-4, -2],\n      [-1, 13],\n      [5, 0]\n    ],\n    [\n      [7733, 5907],\n      [-2, -14],\n      [-1, 20],\n      [3, -6]\n    ],\n    [\n      [7622, 6095],\n      [-2, 9],\n      [7, 13],\n      [2, -6],\n      [-7, -16]\n    ],\n    [\n      [7710, 6117],\n      [-4, 12],\n      [2, 5],\n      [2, -17]\n    ],\n    [\n      [7602, 6269],\n      [-2, -10],\n      [-5, 9],\n      [7, 1]\n    ],\n    [\n      [7604, 6305],\n      [6, -6],\n      [-6, -6],\n      [-3, 10],\n      [3, 2]\n    ],\n    [\n      [7780, 6353],\n      [-9, 6],\n      [0, -6],\n      [-10, 2],\n      [3, -11],\n      [-6, -6],\n      [-8, 1],\n      [-1, -17],\n      [-21, -7],\n      [-6, 8],\n      [0, -9],\n      [-5, -4],\n      [-2, -10],\n      [1, -18],\n      [-4, -10],\n      [3, -19],\n      [-10, -8],\n      [5, -6],\n      [5, -22],\n      [-2, -10],\n      [11, -23],\n      [4, -17],\n      [7, -8],\n      [-1, -11],\n      [6, -28],\n      [6, 5],\n      [-2, -15],\n      [-7, -3],\n      [0, -40],\n      [-9, -4],\n      [-2, -12],\n      [2, -16],\n      [6, -13],\n      [3, -15],\n      [11, -14],\n      [4, -11],\n      [3, -67],\n      [6, -9],\n      [1, -25],\n      [2, 1],\n      [3, -19],\n      [-6, -12],\n      [-1, -12],\n      [-5, -17],\n      [-6, -8],\n      [0, -8],\n      [-5, -4],\n      [-2, -23]\n    ],\n    [\n      [7742, 5779],\n      [-7, -20],\n      [0, 24],\n      [-1, 18],\n      [7, 10],\n      [1, 45],\n      [-5, 2],\n      [4, 20],\n      [-6, 11],\n      [5, 21],\n      [-3, 32],\n      [-9, 31],\n      [-4, -1],\n      [0, 27],\n      [-3, 9],\n      [-5, 30],\n      [0, 32],\n      [-2, 26],\n      [-4, 14],\n      [2, 25],\n      [-8, -2],\n      [-5, 13],\n      [0, 18],\n      [-3, 12],\n      [-6, 8],\n      [0, -23],\n      [-2, -16],\n      [-5, -11],\n      [-11, 3],\n      [2, -12],\n      [-16, -8],\n      [-2, -16],\n      [-7, -13],\n      [-9, 8],\n      [-6, -4],\n      [0, 12],\n      [-5, -9],\n      [-3, 5],\n      [3, 21],\n      [-12, -19],\n      [-1, 11],\n      [4, 22],\n      [2, 38],\n      [4, 9],\n      [0, 22],\n      [-2, 3],\n      [-2, 30],\n      [-6, 24],\n      [-5, 8],\n      [0, 20],\n      [-2, -4],\n      [-1, -16],\n      [-7, 9],\n      [-6, 22],\n      [9, -10],\n      [6, 14],\n      [-11, 14],\n      [3, 13],\n      [-4, -3],\n      [-6, 11],\n      [-10, -1],\n      [2, 16],\n      [-4, -12],\n      [-5, 6],\n      [5, 4],\n      [-5, 9],\n      [0, -11],\n      [-7, 22],\n      [-3, 3],\n      [-3, 21]\n    ],\n    [\n      [5533, 7690],\n      [8, -17],\n      [11, -8],\n      [13, -12],\n      [0, -5]\n    ],\n    [\n      [5538, 7620],\n      [0, -3]\n    ],\n    [\n      [5537, 7617],\n      [-6, 0],\n      [7, -10]\n    ],\n    [\n      [5537, 7593],\n      [-14, 24],\n      [-10, 8]\n    ],\n    [\n      [8263, 7933],\n      [2, -6],\n      [9, 9],\n      [-4, 10]\n    ],\n    [\n      [7439, 8014],\n      [9, 6],\n      [1, 10],\n      [19, 0],\n      [8, 3],\n      [15, 13],\n      [-2, 11],\n      [25, 18],\n      [5, 0],\n      [8, 12],\n      [11, 0],\n      [12, 16],\n      [9, -2],\n      [7, 10],\n      [7, -10],\n      [9, 6],\n      [2, -10],\n      [33, -2],\n      [3, -22],\n      [8, -10],\n      [8, 1],\n      [15, -8],\n      [9, 7],\n      [21, -9],\n      [11, 2],\n      [9, -10],\n      [7, 11],\n      [15, 6],\n      [5, 15],\n      [2, 14],\n      [-8, 6],\n      [-6, 22],\n      [7, 27],\n      [5, 0],\n      [3, 14],\n      [8, 4],\n      [7, 20],\n      [11, -11],\n      [11, -3],\n      [9, -10],\n      [14, 0],\n      [23, -15],\n      [7, 1],\n      [17, -9],\n      [2, -43],\n      [17, -15],\n      [11, -7],\n      [20, -3],\n      [13, 10],\n      [19, 4],\n      [4, 6],\n      [21, -6],\n      [4, -6],\n      [13, 3],\n      [14, -20],\n      [22, -3],\n      [-1, -15],\n      [17, -20],\n      [16, 1],\n      [31, -10],\n      [3, 4],\n      [9, -6],\n      [20, 14],\n      [18, 1],\n      [11, 8],\n      [10, -2],\n      [8, 5],\n      [3, 12],\n      [27, 27],\n      [17, -1],\n      [17, -20],\n      [9, -1],\n      [12, 8],\n      [12, -5],\n      [3, -6]\n    ],\n    [\n      [5913, 3637],\n      [-22, 0]\n    ],\n    [\n      [5891, 3637],\n      [1, 15],\n      [-3, 17],\n      [1, 16],\n      [-3, 3]\n    ],\n    [\n      [5887, 3688],\n      [1, 16],\n      [0, 71],\n      [-4, 30],\n      [-3, 5],\n      [-6, 24],\n      [1, 14],\n      [-7, 44]\n    ],\n    [\n      [5869, 3892],\n      [31, 64],\n      [-2, 10],\n      [4, 10],\n      [-1, 17],\n      [6, 7],\n      [9, 29],\n      [1, 14],\n      [-6, 6],\n      [1, 36],\n      [-5, 2],\n      [0, 11],\n      [6, 3],\n      [-1, 14],\n      [4, 4],\n      [-2, 36],\n      [3, 14],\n      [-1, 17],\n      [-5, 22],\n      [4, 14],\n      [-7, -1],\n      [-1, 6],\n      [-13, 9],\n      [-9, 1],\n      [-5, 12],\n      [-5, 1],\n      [-7, 10],\n      [-9, -2],\n      [-2, 4],\n      [-13, -1],\n      [0, 21]\n    ],\n    [\n      [5844, 4282],\n      [-1, 18],\n      [-4, 20],\n      [19, 14],\n      [14, 6],\n      [19, 16],\n      [4, 1],\n      [27, 19]\n    ],\n    [\n      [5922, 4376],\n      [6, -21],\n      [7, -13],\n      [1, 6],\n      [17, 6],\n      [5, -11],\n      [2, -41],\n      [-5, -11],\n      [0, -9],\n      [-5, -10],\n      [5, -13],\n      [1, -14],\n      [9, -15],\n      [5, -13],\n      [5, -4],\n      [0, -17],\n      [5, 0],\n      [-2, 38],\n      [4, 19],\n      [9, 2],\n      [3, 5],\n      [1, 35],\n      [-1, 16],\n      [3, 15],\n      [-2, 14],\n      [-21, 54],\n      [-6, 11]\n    ],\n    [\n      [5968, 4405],\n      [-2, 10],\n      [-1, 28],\n      [2, 8],\n      [-4, 14],\n      [0, 16],\n      [6, 10],\n      [2, 25]\n    ],\n    [\n      [5971, 4516],\n      [19, 0],\n      [5, 10],\n      [9, -10],\n      [1, -7],\n      [15, 1],\n      [7, 6],\n      [12, -8],\n      [11, 10],\n      [1, 13],\n      [7, 4],\n      [11, -8],\n      [11, 13],\n      [11, 0],\n      [5, 9],\n      [9, 4],\n      [18, 27]\n    ],\n    [\n      [6123, 4580],\n      [6, -13],\n      [-7, -32],\n      [0, -23],\n      [3, -18],\n      [0, -28],\n      [3, -20],\n      [-6, -8],\n      [5, -1],\n      [-2, -39],\n      [4, -23],\n      [-4, -8],\n      [6, -2],\n      [-3, -8],\n      [6, -5],\n      [0, -22],\n      [-5, -7],\n      [1, -8],\n      [-3, -24],\n      [-13, -26],\n      [-3, -14],\n      [-7, -7],\n      [3, -7],\n      [-21, -26],\n      [-1, -7],\n      [-11, -2],\n      [-16, -16],\n      [-6, -3],\n      [-20, -22],\n      [-11, -32],\n      [-8, -15],\n      [-2, -13],\n      [-5, 5],\n      [1, -12],\n      [-4, 6],\n      [-13, -18],\n      [-6, -17],\n      [-16, -26],\n      [-3, 4],\n      [0, -25],\n      [-3, -12],\n      [6, -15],\n      [3, 0],\n      [4, -39],\n      [4, -16],\n      [2, -20],\n      [-1, -24],\n      [5, 16],\n      [2, -16],\n      [-2, -10],\n      [3, -20],\n      [-7, -50],\n      [6, -4],\n      [-3, -17],\n      [-9, -26],\n      [-13, -11],\n      [-26, -17],\n      [-11, -10],\n      [-12, -16],\n      [-5, -18],\n      [-4, -6],\n      [3, -12],\n      [7, -5],\n      [-1, -33]\n    ],\n    [\n      [4659, 6034],\n      [-6, 12],\n      [-12, 16],\n      [-1, 13],\n      [-8, 8],\n      [-2, 17],\n      [-5, 13],\n      [-10, -2],\n      [-6, 16],\n      [-8, 14],\n      [-16, 0],\n      [-20, -9],\n      [-19, 1],\n      [-1, -15],\n      [-3, -3],\n      [-2, -22]\n    ],\n    [\n      [4540, 6093],\n      [0, 30],\n      [2, 18],\n      [8, 33],\n      [4, 26],\n      [0, 28],\n      [-3, 40],\n      [-5, 20],\n      [-6, 11],\n      [9, 24],\n      [0, 28],\n      [-9, 26],\n      [0, -9],\n      [-5, 11],\n      [-4, 19],\n      [-4, -3],\n      [-1, -16]\n    ],\n    [\n      [4526, 6379],\n      [-1, 6],\n      [3, 26],\n      [55, 0],\n      [55, 0],\n      [0, 15],\n      [-4, 71],\n      [3, 10],\n      [12, 16],\n      [17, 11],\n      [0, 146],\n      [56, 0],\n      [36, 0],\n      [0, 74]\n    ],\n    [\n      [6603, 4026],\n      [2, -11],\n      [-3, -12],\n      [-9, -1],\n      [0, 15],\n      [4, 13],\n      [6, -4]\n    ],\n    [\n      [5969, 4525],\n      [0, 2]\n    ],\n    [\n      [5969, 4527],\n      [0, -2]\n    ],\n    [\n      [5964, 4534],\n      [0, 2]\n    ],\n    [\n      [5964, 4536],\n      [0, -2]\n    ],\n    [\n      [5952, 4624],\n      [-3, 6]\n    ],\n    [\n      [5949, 4630],\n      [3, -6]\n    ],\n    [\n      [5946, 4634],\n      [0, 1]\n    ],\n    [\n      [5946, 4635],\n      [0, -1]\n    ],\n    [\n      [5941, 4623],\n      [2, -16],\n      [8, -22],\n      [-1, -51],\n      [3, -25],\n      [-8, -21],\n      [0, -15],\n      [4, -4],\n      [0, -16],\n      [4, -12],\n      [-1, -26],\n      [2, -9],\n      [7, -10],\n      [-2, -24],\n      [7, -10],\n      [2, 11],\n      [8, -16],\n      [4, 0],\n      [-6, 34],\n      [-6, 2],\n      [0, 12]\n    ],\n    [\n      [5922, 4376],\n      [-7, -1],\n      [-2, 12],\n      [-6, 14],\n      [6, 8],\n      [4, 49],\n      [9, 3],\n      [5, 11],\n      [-4, 0],\n      [-4, 11],\n      [2, 15],\n      [-3, 27],\n      [5, 15],\n      [-4, 17],\n      [7, 6],\n      [5, 11],\n      [-4, 20],\n      [-6, 8],\n      [1, 15],\n      [-4, 12],\n      [-7, 1],\n      [-1, 11]\n    ],\n    [\n      [5914, 4641],\n      [10, -5],\n      [4, -7],\n      [9, 1],\n      [4, -7]\n    ],\n    [\n      [8093, 5320],\n      [-2, 3],\n      [0, 20],\n      [2, -2],\n      [0, -21]\n    ],\n    [\n      [8269, 5423],\n      [5, -1]\n    ],\n    [\n      [7786, 5497],\n      [-1, -11],\n      [-3, 11],\n      [4, 0]\n    ],\n    [\n      [7773, 5553],\n      [-3, -8],\n      [-3, 8],\n      [6, 0]\n    ],\n    [\n      [7834, 5543],\n      [9, -7],\n      [3, -14],\n      [18, -29],\n      [9, -33],\n      [1, -32],\n      [-4, -8],\n      [0, -23],\n      [4, -12],\n      [-2, -6],\n      [1, -32],\n      [10, -15],\n      [3, -23],\n      [8, -23],\n      [1, -24],\n      [-16, 4],\n      [-4, -10],\n      [-5, 15],\n      [-15, 19],\n      [-7, 11],\n      [-10, 9],\n      [-11, 21],\n      [-14, 15],\n      [2, 9],\n      [-2, 17],\n      [-6, 17],\n      [-11, 19],\n      [2, 9],\n      [-4, 6],\n      [1, 21],\n      [-2, 19],\n      [-6, 11],\n      [2, 6],\n      [-2, 23],\n      [0, 26],\n      [-7, 25]\n    ],\n    [\n      [7780, 5554],\n      [2, 15],\n      [4, -9],\n      [12, -7],\n      [2, -11],\n      [7, 1],\n      [0, -19],\n      [-3, -9],\n      [3, -8],\n      [5, 9],\n      [9, 7],\n      [6, -10],\n      [7, 30]\n    ],\n    [\n      [8045, 5303],\n      [0, -10],\n      [8, -13],\n      [9, 1],\n      [16, -8],\n      [6, -6],\n      [0, 16],\n      [5, 22],\n      [0, 18],\n      [4, 0],\n      [2, 16],\n      [5, 8],\n      [11, 2],\n      [20, 10],\n      [9, 9],\n      [12, 33],\n      [7, 12],\n      [6, 19],\n      [1, 16]\n    ],\n    [\n      [8193, 5464],\n      [1, -4]\n    ],\n    [\n      [8198, 5465],\n      [6, 1],\n      [6, 15],\n      [-6, 9],\n      [6, 11],\n      [6, 0],\n      [3, 14],\n      [4, 4],\n      [1, 17],\n      [6, 6],\n      [1, 8],\n      [8, 18],\n      [3, 19],\n      [3, -3],\n      [-2, -22],\n      [6, 8],\n      [3, 15],\n      [4, -2],\n      [1, -18],\n      [7, -3],\n      [6, -10],\n      [-4, -13],\n      [5, -16],\n      [6, 9],\n      [3, -14],\n      [8, -1],\n      [9, -15],\n      [15, -10],\n      [0, -11],\n      [-15, -13],\n      [-7, -1],\n      [-2, 6],\n      [-7, -8],\n      [5, -14],\n      [9, -13],\n      [-18, -12],\n      [-11, 10],\n      [-1, -14]\n    ],\n    [\n      [8256, 5598],\n      [-5, -6],\n      [0, 10],\n      [6, 4],\n      [-1, -8]\n    ],\n    [\n      [5649, 4167],\n      [22, 9],\n      [17, -1],\n      [7, -5],\n      [6, -12]\n    ],\n    [\n      [5554, 3757],\n      [1, -13],\n      [0, -196],\n      [-12, -8],\n      [-2, -9],\n      [-7, -5],\n      [-3, -11],\n      [-11, 7],\n      [-16, -4],\n      [-16, 13],\n      [-5, -1],\n      [-2, 28],\n      [-4, 0],\n      [-3, 11],\n      [-5, -2],\n      [-4, -12],\n      [0, -11],\n      [-8, -7]\n    ],\n    [\n      [5457, 3537],\n      [-5, 4],\n      [-15, 27],\n      [-12, 41],\n      [-2, 21],\n      [-5, 18],\n      [2, 11],\n      [-5, 7],\n      [0, 21],\n      [-3, 11],\n      [-1, 23],\n      [1, 20],\n      [-11, 53],\n      [1, 33],\n      [-2, 25],\n      [3, 10],\n      [-1, 27],\n      [-14, 39],\n      [-4, 18],\n      [-13, 37],\n      [-5, 37],\n      [-3, 3],\n      [-4, 20],\n      [-7, 22],\n      [-3, 18],\n      [-8, 23],\n      [-8, 14],\n      [-5, 21],\n      [-3, 36],\n      [1, 12]\n    ],\n    [\n      [9665, 3952],\n      [5, -3],\n      [-1, -13],\n      [-7, 3],\n      [-2, 12],\n      [5, 1]\n    ],\n    [\n      [9646, 3990],\n      [4, -27],\n      [-9, 7],\n      [-1, 8],\n      [6, 12]\n    ],\n    [\n      [9555, 4026],\n      [7, -13],\n      [6, 0],\n      [16, -24],\n      [5, -3],\n      [11, -30],\n      [7, -3],\n      [15, -20],\n      [4, -10],\n      [11, -14],\n      [2, -10],\n      [-3, -5],\n      [-12, 8],\n      [-2, -4],\n      [-6, 8],\n      [-2, 13],\n      [-4, -1],\n      [-7, 14],\n      [-13, 7],\n      [-4, 13],\n      [-12, 16],\n      [-1, 8],\n      [-6, 6],\n      [-12, 44]\n    ],\n    [\n      [5416, 6507],\n      [4, -53],\n      [1, -34],\n      [12, -31],\n      [-1, -12],\n      [11, -21],\n      [-7, -29],\n      [0, -21],\n      [-6, -142],\n      [-1, -9],\n      [-22, -46],\n      [-12, -29],\n      [-13, -39],\n      [0, -11],\n      [-9, -19],\n      [4, -39]\n    ],\n    [\n      [5377, 5972],\n      [-6, 1],\n      [-4, -10],\n      [-5, 0],\n      [-14, -18],\n      [-2, -10],\n      [-10, 2],\n      [-7, 9],\n      [-12, 6],\n      [-22, 1],\n      [-13, -6],\n      [-7, -7],\n      [-8, -20],\n      [-18, 2],\n      [-10, 7],\n      [-15, 20],\n      [-9, 1],\n      [-10, -12],\n      [-6, 0],\n      [-3, -7],\n      [-7, 4],\n      [-4, 15],\n      [-12, 21],\n      [-3, -3],\n      [-16, 14],\n      [-8, -8],\n      [-12, 2],\n      [-11, -6],\n      [-9, -11],\n      [-1, -28],\n      [-4, -14],\n      [-8, -13],\n      [-1, -25],\n      [1, -21],\n      [-2, -2]\n    ],\n    [\n      [5377, 5972],\n      [13, -36]\n    ],\n    [\n      [5238, 5460],\n      [-5, -4],\n      [-6, 14],\n      [5, -21],\n      [-2, -4],\n      [-17, -3],\n      [-14, 10],\n      [0, -10],\n      [-4, -4],\n      [0, 13],\n      [-4, 2],\n      [3, -18],\n      [-25, -6],\n      [-7, 6],\n      [-8, 17],\n      [-3, 12],\n      [-3, 27],\n      [-4, 8],\n      [-3, 17],\n      [-6, 13],\n      [-13, 20],\n      [-15, 4],\n      [-12, -1],\n      [4, 6],\n      [-5, 2],\n      [0, -9],\n      [-19, -1]\n    ],\n    [\n      [2691, 6046],\n      [-6, -4],\n      [4, -35],\n      [-7, -20],\n      [-4, -40],\n      [2, -21],\n      [-1, -19],\n      [2, -10],\n      [-4, -2],\n      [1, 15],\n      [-5, -4],\n      [4, -12],\n      [-5, -31],\n      [3, 2],\n      [1, -14],\n      [-6, -11],\n      [1, -16],\n      [5, -12]\n    ],\n    [\n      [2619, 5821],\n      [-6, 13],\n      [-12, 18],\n      [-7, 15],\n      [-4, 17],\n      [-26, 41],\n      [4, 10],\n      [6, -5]\n    ],\n    [\n      [5093, 8141],\n      [24, 0]\n    ],\n    [\n      [5162, 8210],\n      [-10, -17],\n      [-10, 7],\n      [15, 13],\n      [5, -3]\n    ],\n    [\n      [5118, 8141],\n      [-21, 6],\n      [1, 7],\n      [9, 1],\n      [7, -11],\n      [-3, 33],\n      [8, 7],\n      [6, 13],\n      [6, 36],\n      [10, -1],\n      [14, 21],\n      [11, 5],\n      [24, 3],\n      [9, -12]\n    ],\n    [\n      [5140, 8230],\n      [7, -10],\n      [-8, -8],\n      [0, -15],\n      [12, -5],\n      [12, 14],\n      [-12, 20],\n      [-2, 13],\n      [-9, -9]\n    ],\n    [\n      [5157, 8665],\n      [-10, 4],\n      [10, 9],\n      [0, -13]\n    ],\n    [\n      [5249, 8849],\n      [3, -8],\n      [-16, -5],\n      [-3, 7],\n      [16, 6]\n    ],\n    [\n      [5244, 8857],\n      [-2, -7],\n      [-13, 0],\n      [15, 7]\n    ],\n    [\n      [5344, 8955],\n      [3, -6],\n      [-12, -11],\n      [9, 17]\n    ],\n    [\n      [5387, 9114],\n      [3, -5],\n      [-17, -6],\n      [5, 13],\n      [9, -2]\n    ],\n    [\n      [5420, 9124],\n      [-11, -11],\n      [-15, -6],\n      [9, 15],\n      [17, 2]\n    ],\n    [\n      [5441, 9154],\n      [2, -15],\n      [8, 12],\n      [8, -5],\n      [-1, -15],\n      [-21, -8],\n      [-4, -7],\n      [-17, -3],\n      [6, 18],\n      [6, 0],\n      [6, 23],\n      [7, 0]\n    ],\n    [\n      [5421, 9152],\n      [6, -15],\n      [-9, -5],\n      [-18, 7],\n      [21, 13]\n    ],\n    [\n      [5439, 9158],\n      [-11, -3],\n      [20, 19],\n      [-9, -16]\n    ],\n    [\n      [5492, 9188],\n      [10, -7],\n      [-3, -14],\n      [-32, -8],\n      [9, 12],\n      [-6, 8],\n      [22, 9]\n    ],\n    [\n      [5523, 9207],\n      [6, -7],\n      [-8, -11],\n      [-17, -2],\n      [5, 15],\n      [14, 5]\n    ],\n    [\n      [5533, 9218],\n      [12, -6],\n      [-15, -10],\n      [-9, 7],\n      [12, 9]\n    ],\n    [\n      [5652, 9249],\n      [5, -8],\n      [-16, -11],\n      [-6, 7],\n      [17, 12]\n    ],\n    [\n      [5649, 9262],\n      [-11, -16],\n      [-24, -4],\n      [7, 13],\n      [17, -3],\n      [11, 10]\n    ],\n    [\n      [5856, 9203],\n      [2, -15],\n      [-17, 4],\n      [-10, -15],\n      [-16, -3],\n      [-11, -16]\n    ],\n    [\n      [5572, 9158],\n      [-14, 0],\n      [7, -8],\n      [-11, -20],\n      [0, -11],\n      [-42, 13],\n      [-8, -3],\n      [1, -19],\n      [-8, -13],\n      [-16, 8],\n      [-15, -11],\n      [-5, -16],\n      [-14, -13],\n      [9, -12],\n      [-1, -10],\n      [-27, -31],\n      [2, -13],\n      [-12, -7],\n      [-15, -1],\n      [3, -17],\n      [-3, -30],\n      [-5, -12],\n      [-20, -30],\n      [14, -8],\n      [1, -15],\n      [-5, -10],\n      [-21, 5],\n      [-15, -8],\n      [-14, -21],\n      [-5, -18],\n      [6, -16],\n      [-4, -24],\n      [7, -20],\n      [-5, -30],\n      [20, -20],\n      [-4, -18],\n      [-13, -4],\n      [10, -29],\n      [-3, -21],\n      [-10, -13],\n      [-7, 0],\n      [-6, -16],\n      [4, -21],\n      [-6, -21],\n      [-5, 6]\n    ],\n    [\n      [5317, 8580],\n      [-2, 7],\n      [-16, 4],\n      [-5, 22],\n      [-5, -3],\n      [1, -15],\n      [-5, -12],\n      [-15, -2],\n      [-28, -36],\n      [-16, -16],\n      [-15, -5],\n      [-30, 5],\n      [4, 7],\n      [-19, 9],\n      [-10, 9],\n      [-4, 11],\n      [2, 18],\n      [14, -10],\n      [-5, 13],\n      [9, 14],\n      [-12, 11],\n      [2, -11],\n      [-10, -4],\n      [-8, 9],\n      [8, 18],\n      [11, 0],\n      [-5, 7],\n      [7, 5],\n      [5, 15],\n      [10, 13],\n      [-13, -9],\n      [-6, -16],\n      [-6, 16],\n      [-6, -8],\n      [-6, 8],\n      [3, 14],\n      [12, -3],\n      [-1, 14],\n      [-10, -9],\n      [-10, 14],\n      [3, 16],\n      [10, 0],\n      [-13, 10],\n      [0, 10],\n      [11, 7],\n      [-11, 5],\n      [11, 16],\n      [33, -6],\n      [-31, 8],\n      [-7, -3],\n      [7, 17],\n      [13, 1],\n      [25, 16],\n      [-12, -3],\n      [12, 13],\n      [22, -8],\n      [-1, 10],\n      [-16, 2],\n      [-2, 12],\n      [10, 5],\n      [7, -6],\n      [16, 2],\n      [4, 11],\n      [12, -2],\n      [-5, 11],\n      [34, 19],\n      [7, -14],\n      [24, 5],\n      [-2, 8],\n      [19, 14],\n      [2, 9],\n      [-18, -7],\n      [2, -9],\n      [-26, -14],\n      [-12, 16],\n      [15, 11],\n      [-3, 9],\n      [14, 10],\n      [12, 17],\n      [13, -11],\n      [0, 17],\n      [11, 5],\n      [4, 17],\n      [19, 3],\n      [-10, 6],\n      [10, 12],\n      [-8, 12],\n      [27, 33],\n      [-8, 8],\n      [9, 16],\n      [12, 10],\n      [-7, 6],\n      [20, 4],\n      [10, 13],\n      [22, -3],\n      [0, 5],\n      [-28, 1],\n      [28, 31],\n      [-15, -9],\n      [4, 15],\n      [30, 7],\n      [-22, 1],\n      [23, 8],\n      [5, -17],\n      [6, 8],\n      [-11, 14],\n      [17, 8],\n      [32, -1],\n      [-9, 8],\n      [-29, -5],\n      [2, 11],\n      [24, 6],\n      [6, 22],\n      [10, 6],\n      [4, 14],\n      [19, 5],\n      [11, 13],\n      [26, 10],\n      [8, -11],\n      [15, 2],\n      [11, 14],\n      [19, -17],\n      [-5, 14],\n      [-18, 15],\n      [28, 3],\n      [20, -6],\n      [5, -14],\n      [11, 25],\n      [29, 23],\n      [0, 11],\n      [37, -7],\n      [-19, -17],\n      [-9, -26],\n      [8, -1],\n      [6, 15],\n      [33, 35],\n      [-3, -34],\n      [17, 22],\n      [11, 6],\n      [-8, 10],\n      [28, 3],\n      [8, -5],\n      [-19, -29],\n      [14, 2],\n      [11, 20],\n      [9, 1],\n      [21, -14],\n      [8, 4],\n      [27, -25],\n      [-16, -2],\n      [-10, -10],\n      [-39, 6],\n      [-3, -4],\n      [29, -8],\n      [-2, -12],\n      [34, 3]\n    ],\n    [\n      [5713, 9281],\n      [11, -11],\n      [-15, -3],\n      [-6, 9],\n      [10, 5]\n    ],\n    [\n      [4778, 9282],\n      [-1, -9],\n      [-15, -2],\n      [16, 11]\n    ],\n    [\n      [5647, 9686],\n      [-7, -11],\n      [38, -10],\n      [-33, -33],\n      [-23, 0],\n      [10, 17],\n      [-53, -6],\n      [22, 27],\n      [-22, 9],\n      [23, 8],\n      [45, -1]\n    ],\n    [\n      [5596, 9708],\n      [21, -5],\n      [1, -13],\n      [-43, -4],\n      [-15, 17],\n      [36, 5]\n    ],\n    [\n      [5313, 9706],\n      [24, -18],\n      [-29, 12],\n      [-16, 19],\n      [13, 4],\n      [8, -17]\n    ],\n    [\n      [5467, 9783],\n      [4, 5],\n      [53, -31],\n      [2, -16],\n      [23, 1],\n      [8, -9],\n      [40, -9],\n      [-5, -12],\n      [-44, -1],\n      [-22, -10],\n      [3, -21],\n      [-18, -4],\n      [-5, -31],\n      [-14, 1],\n      [-11, -30],\n      [-12, -11],\n      [3, -11],\n      [-20, 6],\n      [-35, 25],\n      [-18, 3],\n      [-9, 22],\n      [50, -2],\n      [-31, 7],\n      [59, 9],\n      [-36, 4],\n      [-50, -9],\n      [-5, 19],\n      [40, 3],\n      [17, 12],\n      [27, 1],\n      [-3, 22],\n      [-14, -14],\n      [-16, -1],\n      [-1, 23],\n      [-28, -21],\n      [10, -6],\n      [-25, -10],\n      [-23, -1],\n      [-17, 20],\n      [-20, 10],\n      [21, 16],\n      [-19, 4],\n      [10, 14],\n      [-23, -12],\n      [-16, 26],\n      [31, 17],\n      [9, -10],\n      [47, 12],\n      [-3, -10],\n      [-33, -9],\n      [37, -1],\n      [19, 16],\n      [20, -12],\n      [5, -15],\n      [28, -25],\n      [-14, 23],\n      [-7, 33],\n      [24, 9],\n      [7, -9]\n    ],\n    [\n      [5642, 9812],\n      [113, -16],\n      [-1, -15],\n      [-37, -13],\n      [-5, -13],\n      [-38, -5],\n      [-6, -7],\n      [-32, 2],\n      [-1, 11],\n      [-57, -2],\n      [-32, 10],\n      [22, 8],\n      [39, 1],\n      [0, 7],\n      [-66, -7],\n      [-28, 4],\n      [-12, 23],\n      [33, -5],\n      [33, 19],\n      [53, -25],\n      [3, 26],\n      [19, -3]\n    ],\n    [\n      [9617, 2273],\n      [0, -19],\n      [-6, 6],\n      [6, 13]\n    ],\n    [\n      [9665, 2494],\n      [6, -10],\n      [0, -14],\n      [-12, -2],\n      [-5, -8],\n      [1, 13],\n      [5, 6],\n      [-1, 14],\n      [6, 1]\n    ],\n    [\n      [96, 2665],\n      [10, -1],\n      [-9, -6],\n      [6, -11],\n      [-9, -5],\n      [3, 13],\n      [-9, 8],\n      [8, 2]\n    ],\n    [\n      [9802, 2850],\n      [-4, 0],\n      [-2, -14],\n      [9, -2],\n      [1, -21],\n      [4, -9],\n      [10, 14],\n      [6, 3],\n      [3, -10],\n      [3, 13],\n      [9, -2],\n      [-4, -7],\n      [3, -10],\n      [-6, -8],\n      [6, -18],\n      [-8, -17],\n      [-3, -13],\n      [-9, -13],\n      [-6, -23],\n      [-15, -16],\n      [-1, -24],\n      [9, -5],\n      [1, -9],\n      [-7, -4],\n      [-10, 10],\n      [-7, -9],\n      [-25, -22],\n      [-4, -20],\n      [0, -17],\n      [-7, -15],\n      [-5, -25],\n      [0, -16],\n      [-8, -3],\n      [-17, -24],\n      [-4, -11],\n      [-13, -7],\n      [-11, 0],\n      [-1, 6],\n      [-13, -4],\n      [-5, 16],\n      [-11, -2],\n      [-2, 10],\n      [-8, 3],\n      [-3, -7],\n      [-16, 3],\n      [1, 13],\n      [-9, 0],\n      [0, 10],\n      [9, 6],\n      [-2, 8],\n      [4, 17],\n      [8, -7],\n      [-4, 16],\n      [36, 56],\n      [2, 7],\n      [10, 1],\n      [19, 21],\n      [8, 4],\n      [16, 27],\n      [14, 12],\n      [13, 29],\n      [6, 37],\n      [9, 4],\n      [8, 16],\n      [1, 31],\n      [15, 21],\n      [7, 0]\n    ],\n    [\n      [9872, 3102],\n      [4, -10],\n      [-7, 5],\n      [3, 5]\n    ],\n    [\n      [9807, 3201],\n      [-1, -14],\n      [3, -11],\n      [8, -8],\n      [8, 2],\n      [10, -9],\n      [2, -9],\n      [5, 4],\n      [1, -13],\n      [5, -10],\n      [-2, -23],\n      [9, -16],\n      [-3, -21],\n      [7, -17],\n      [8, 0],\n      [4, -17],\n      [5, 3],\n      [-4, 18],\n      [3, 20],\n      [3, -14],\n      [7, -9],\n      [1, -35],\n      [2, -7],\n      [14, -7],\n      [19, -13],\n      [10, 4],\n      [5, 14],\n      [8, 7],\n      [8, 0],\n      [7, -10],\n      [-6, -15],\n      [-1, -32],\n      [-10, -9],\n      [-2, -34],\n      [-1, 12],\n      [-12, 1],\n      [-10, -8],\n      [-4, -10],\n      [1, -13],\n      [4, -3],\n      [-5, -25],\n      [-8, -21],\n      [-6, -9],\n      [-9, -30],\n      [-8, -14],\n      [-13, -14],\n      [-3, 11],\n      [-9, -1],\n      [-8, 12],\n      [4, 4],\n      [10, 24],\n      [4, 27],\n      [-5, 17],\n      [-15, 10],\n      [-6, 12],\n      [-9, 4],\n      [-6, 8],\n      [1, 14],\n      [22, 19],\n      [3, 41],\n      [4, 20],\n      [-3, 30],\n      [4, 10],\n      [-3, 8],\n      [-8, -6],\n      [-2, 16],\n      [-6, 19],\n      [7, -12],\n      [-2, 22],\n      [-11, 8],\n      [1, -9],\n      [-26, 61],\n      [2, 16],\n      [-12, 29],\n      [10, 1]\n    ],\n    [\n      [6629, 6344],\n      [-1, 12],\n      [8, 19],\n      [-7, -31]\n    ],\n    [\n      [6474, 6141],\n      [-8, 37],\n      [-2, 0],\n      [-11, 55],\n      [-10, 44]\n    ],\n    [\n      [6443, 6277],\n      [13, 8],\n      [52, 37],\n      [19, 12],\n      [9, 56],\n      [9, 61],\n      [-13, 39]\n    ],\n    [\n      [6566, 6621],\n      [6, -28],\n      [6, -15],\n      [10, -17],\n      [31, -18],\n      [8, 2],\n      [6, -11],\n      [13, -39],\n      [7, -13],\n      [8, -2],\n      [0, -17],\n      [-9, -27],\n      [-4, -19],\n      [-12, -17],\n      [-11, -42],\n      [-8, 1],\n      [1, 11],\n      [-5, -3],\n      [-3, -13],\n      [-4, -4],\n      [-1, -20],\n      [-3, -10],\n      [2, -31],\n      [2, -11],\n      [-3, -4],\n      [-15, -2],\n      [-8, -6],\n      [-7, -12],\n      [-3, -28],\n      [-5, -10],\n      [-5, 1],\n      [-21, -7],\n      [-6, -19],\n      [2, -9],\n      [-7, -20],\n      [-8, -3],\n      [-4, 5],\n      [-16, -3],\n      [-12, -14],\n      [-7, 0],\n      [-7, -6]\n    ],\n    [\n      [6557, 6684],\n      [2, 8],\n      [9, -6],\n      [-5, -27]\n    ],\n    [\n      [6893, 6556],\n      [-1, -9],\n      [-8, 10],\n      [-6, -3],\n      [-8, 15],\n      [-5, 42],\n      [-13, 5],\n      [1, 20],\n      [-5, 7],\n      [-3, 13],\n      [-7, 1],\n      [2, -7],\n      [-16, -8],\n      [-13, 2],\n      [-1, -4],\n      [-23, -1],\n      [-19, 6],\n      [-4, -11],\n      [-28, 4],\n      [-5, -6],\n      [-17, -8],\n      [1, 8],\n      [-5, 2]\n    ],\n    [\n      [2729, 5623],\n      [3, -19],\n      [-7, 12],\n      [4, 7]\n    ],\n    [\n      [2836, 5599],\n      [-8, 16],\n      [-7, 31],\n      [5, 4],\n      [0, 10],\n      [5, 8],\n      [-5, 3],\n      [-4, -7],\n      [-3, 16],\n      [-10, 15],\n      [-6, 5],\n      [-10, 2],\n      [-9, -12],\n      [0, -13],\n      [-8, -11],\n      [-12, -10],\n      [0, -8],\n      [10, -19],\n      [4, -14],\n      [-10, -6],\n      [-2, -9],\n      [-13, -2],\n      [0, 7],\n      [-8, 30],\n      [-1, -14],\n      [-10, 8],\n      [-3, 19],\n      [-9, 8],\n      [-6, -1],\n      [0, 8],\n      [-8, -4],\n      [-9, 2],\n      [-2, -16]\n    ],\n    [\n      [2706, 5734],\n      [6, -10],\n      [3, -23],\n      [13, -4],\n      [-4, 11],\n      [5, -3],\n      [6, -15],\n      [10, -1],\n      [9, 5],\n      [7, 12],\n      [14, 8],\n      [14, 22],\n      [10, -4],\n      [7, 2],\n      [-2, -7],\n      [16, -2],\n      [17, -19],\n      [3, -9],\n      [10, -15]\n    ],\n    [\n      [3073, 4289],\n      [-8, 13],\n      [-7, 0],\n      [2, -20],\n      [-3, 4],\n      [-3, -15],\n      [17, -10],\n      [-2, -8],\n      [7, -8],\n      [4, 3]\n    ],\n    [\n      [3084, 4249],\n      [-2, -19]\n    ],\n    [\n      [3044, 4127],\n      [-14, 19],\n      [0, 3],\n      [-13, 15],\n      [0, 13],\n      [-3, 10],\n      [-18, 16],\n      [-6, 15],\n      [-10, 5],\n      [-17, 20],\n      [-17, 13],\n      [-3, 8],\n      [-32, 34],\n      [-1, 9],\n      [-9, 19],\n      [-10, 12],\n      [-6, 25],\n      [-4, 2],\n      [0, 15],\n      [3, 23],\n      [-10, 34],\n      [0, 7],\n      [-8, 20],\n      [1, 6],\n      [-7, 9],\n      [-3, 11],\n      [-2, 23],\n      [-4, 10],\n      [-8, 9],\n      [1, 11],\n      [-4, 20],\n      [-12, 36],\n      [-1, 20],\n      [-4, 9],\n      [-2, 18],\n      [-5, 8],\n      [-4, 33],\n      [-6, 23],\n      [-14, 29],\n      [-6, 35],\n      [-7, 12],\n      [-6, 16],\n      [-16, 16],\n      [-11, 17],\n      [0, 11],\n      [8, 6],\n      [-2, 16],\n      [-7, 11],\n      [3, 15],\n      [-8, 19],\n      [2, 25],\n      [12, 23],\n      [0, 5],\n      [14, 21]\n    ],\n    [\n      [8339, 5486],\n      [-9, -12],\n      [-3, 4],\n      [12, 8]\n    ],\n    [\n      [8361, 5534],\n      [5, -6],\n      [-8, -6],\n      [3, 12]\n    ],\n    [\n      [8390, 5552],\n      [-3, 0],\n      [-4, 14],\n      [7, 5],\n      [7, -7],\n      [-7, -12]\n    ],\n    [\n      [8493, 5581],\n      [-3, 9],\n      [3, 5],\n      [0, -14]\n    ],\n    [\n      [8251, 5645],\n      [-2, -13],\n      [-1, 14],\n      [3, -1]\n    ],\n    [\n      [8489, 5736],\n      [9, -8],\n      [3, -13],\n      [4, 4],\n      [-1, -13],\n      [4, -7],\n      [0, -10],\n      [-6, -9],\n      [8, -6],\n      [-1, -20],\n      [3, 3],\n      [-2, -23],\n      [5, -6],\n      [1, -27],\n      [-4, -16],\n      [-6, -12],\n      [-1, -28],\n      [-4, 20],\n      [1, 8],\n      [-6, 19],\n      [-1, 14],\n      [-5, -4],\n      [0, -9],\n      [-5, -8],\n      [-3, -22],\n      [6, -6],\n      [3, -20],\n      [-1, -12],\n      [-7, -21],\n      [-7, 13],\n      [3, 8],\n      [-3, 9],\n      [-3, -14],\n      [-10, 5],\n      [-13, 14],\n      [-5, 15],\n      [0, 20],\n      [-2, 0],\n      [1, 19],\n      [6, 8],\n      [0, 9],\n      [-5, 11],\n      [-15, 13],\n      [-3, -12],\n      [1, -15],\n      [-4, 9],\n      [-4, -1],\n      [0, 12],\n      [-4, -14],\n      [-6, 0],\n      [1, 16],\n      [-9, -3],\n      [-7, -26],\n      [-2, -17],\n      [-3, -3],\n      [-5, 9],\n      [7, 30],\n      [-1, 11],\n      [7, 16],\n      [16, 6],\n      [3, 21],\n      [8, 1],\n      [2, 11],\n      [3, -6],\n      [6, 1],\n      [4, -13],\n      [0, -15],\n      [11, 6],\n      [2, 17],\n      [3, 4],\n      [6, -8],\n      [3, 5],\n      [0, 23],\n      [4, 1],\n      [5, -9],\n      [5, 10],\n      [7, 1],\n      [0, 17],\n      [-4, 21],\n      [2, 8],\n      [5, -12]\n    ],\n    [\n      [8503, 5750],\n      [-4, -2],\n      [2, 14],\n      [2, -12]\n    ],\n    [\n      [8453, 5767],\n      [7, -6],\n      [-1, -12],\n      [-7, -13],\n      [-12, 2],\n      [-2, 9],\n      [7, 10],\n      [3, 10],\n      [5, 0]\n    ],\n    [\n      [8479, 5754],\n      [-4, 9],\n      [3, 3],\n      [1, -12]\n    ],\n    [\n      [8490, 5782],\n      [1, -31],\n      [-5, 11],\n      [0, 15],\n      [4, 5]\n    ],\n    [\n      [8332, 5791],\n      [-6, -5],\n      [2, 10],\n      [4, -5]\n    ],\n    [\n      [8408, 5792],\n      [-5, -9],\n      [0, 11],\n      [4, 7],\n      [1, -9]\n    ],\n    [\n      [8423, 5815],\n      [8, -4],\n      [1, -7],\n      [-7, -25],\n      [-1, -15],\n      [-4, -13],\n      [0, -19],\n      [5, -11],\n      [-2, -12],\n      [-7, -5],\n      [-3, 15],\n      [-9, 8],\n      [-5, 15],\n      [2, 15],\n      [11, 6],\n      [-1, 23],\n      [4, 23],\n      [8, 6]\n    ],\n    [\n      [8444, 5821],\n      [1, -35],\n      [-2, -9],\n      [-9, -14],\n      [0, -7],\n      [-6, -27],\n      [-3, -4],\n      [2, 34],\n      [9, 27],\n      [5, 33],\n      [3, 2]\n    ],\n    [\n      [8319, 5836],\n      [0, -30],\n      [6, -17],\n      [-10, -11],\n      [-4, -14],\n      [-13, -9],\n      [1, -12],\n      [-9, -26],\n      [-10, -10],\n      [-1, -9],\n      [-8, -14],\n      [-6, -2],\n      [-1, -9],\n      [-9, 0],\n      [19, 43],\n      [4, 0],\n      [9, 23],\n      [7, 11],\n      [6, 20],\n      [12, 17],\n      [4, 32],\n      [0, 14],\n      [3, 3]\n    ],\n    [\n      [8456, 5842],\n      [7, -8],\n      [4, 7],\n      [6, -10],\n      [-1, -30],\n      [5, -8],\n      [2, -19],\n      [-8, -4],\n      [2, -10],\n      [-8, 7],\n      [-1, 14],\n      [2, 19],\n      [-2, 11],\n      [-5, 5],\n      [-4, -4],\n      [1, 30]\n    ],\n    [\n      [8456, 5856],\n      [5, -12],\n      [-5, 0],\n      [0, 12]\n    ],\n    [\n      [8396, 5860],\n      [10, -14],\n      [4, 6],\n      [3, -11],\n      [7, 8],\n      [-1, -24],\n      [-9, -10],\n      [-1, -11],\n      [-6, -6],\n      [-9, -2],\n      [-6, -13],\n      [-2, 20],\n      [4, 17],\n      [0, 39],\n      [-6, 1],\n      [3, 10],\n      [9, -10]\n    ],\n    [\n      [8332, 5870],\n      [2, -13],\n      [-3, -2],\n      [-2, 15],\n      [3, 0]\n    ],\n    [\n      [8331, 5890],\n      [11, -11],\n      [0, -5],\n      [-10, 1],\n      [-1, 15]\n    ],\n    [\n      [8405, 5890],\n      [-5, 12],\n      [6, 0],\n      [-1, -12]\n    ],\n    [\n      [8469, 5906],\n      [10, -3],\n      [2, -13],\n      [5, -4],\n      [-2, -6],\n      [1, -33],\n      [6, -24],\n      [-14, 0],\n      [-2, 10],\n      [-4, 0],\n      [-4, 10],\n      [6, 17],\n      [-5, 0],\n      [-6, 16],\n      [-8, 11],\n      [-3, 20],\n      [7, -3],\n      [11, 2]\n    ],\n    [\n      [8426, 5905],\n      [6, -6],\n      [5, -13],\n      [4, -1],\n      [4, -15],\n      [0, -12],\n      [-17, 28],\n      [-8, -17],\n      [3, 13],\n      [-1, 26],\n      [4, -3]\n    ],\n    [\n      [8392, 5910],\n      [-3, -30],\n      [-3, 11],\n      [2, 17],\n      [4, 2]\n    ],\n    [\n      [8434, 5912],\n      [3, -18],\n      [-5, 16],\n      [2, 2]\n    ],\n    [\n      [8421, 5926],\n      [-7, 8],\n      [2, 6],\n      [5, -14]\n    ],\n    [\n      [8360, 5962],\n      [15, -22],\n      [-1, -23],\n      [-3, -26],\n      [-4, -5],\n      [-9, 17],\n      [-4, 15],\n      [0, 14],\n      [-7, 12],\n      [-4, 18],\n      [10, -4],\n      [7, 4]\n    ],\n    [\n      [8385, 5963],\n      [7, -9],\n      [-4, -11],\n      [-5, 8],\n      [2, 12]\n    ],\n    [\n      [8450, 5993],\n      [5, -11],\n      [0, -12],\n      [-7, -8],\n      [-4, 7],\n      [3, 5],\n      [0, 20],\n      [3, -1]\n    ],\n    [\n      [8387, 6049],\n      [2, -18],\n      [-3, -5],\n      [-3, 23],\n      [4, 0]\n    ],\n    [\n      [8358, 6252],\n      [7, 4],\n      [10, -14],\n      [13, -6],\n      [4, 13],\n      [3, 0],\n      [2, -15],\n      [-4, -8],\n      [-1, -29],\n      [3, -15],\n      [4, 0],\n      [2, -28],\n      [-8, -32],\n      [1, -4],\n      [-18, -18],\n      [2, -10],\n      [-7, -28],\n      [9, -32],\n      [-3, -1],\n      [4, -30],\n      [5, -10],\n      [10, -2],\n      [-3, 13],\n      [8, 9],\n      [8, -1],\n      [9, -20],\n      [-1, -12],\n      [5, -3],\n      [3, 17],\n      [17, -13],\n      [1, -4],\n      [-12, -1],\n      [0, -8],\n      [5, -8],\n      [4, -16],\n      [6, -8],\n      [2, -12],\n      [-2, -14],\n      [-6, 5],\n      [-1, 13],\n      [-7, 1],\n      [-8, 7],\n      [0, 14],\n      [-3, 11],\n      [-7, 6],\n      [-5, 16],\n      [-9, 7],\n      [2, -18],\n      [5, -15],\n      [-3, -12],\n      [-7, 25],\n      [-17, 19],\n      [-8, -8],\n      [1, -6],\n      [-11, -4],\n      [-4, 16],\n      [-6, 2],\n      [-2, -7],\n      [-1, 24],\n      [11, 17],\n      [-4, 14],\n      [-9, -4],\n      [2, -13],\n      [-4, -3],\n      [-4, 23],\n      [-7, 4],\n      [-1, 23],\n      [-4, 8],\n      [1, 26],\n      [-4, 3],\n      [0, 23],\n      [9, -15],\n      [9, 5],\n      [-3, 17],\n      [0, 21],\n      [4, 10],\n      [-1, 11],\n      [0, 43],\n      [5, 23],\n      [-1, 10],\n      [10, 4]\n    ],\n    [\n      [8740, 5620],\n      [-2, -13],\n      [-3, 3],\n      [5, 10]\n    ],\n    [\n      [9256, 4529],\n      [13, -10],\n      [0, -5],\n      [-10, 3],\n      [-3, 12]\n    ],\n    [\n      [9195, 4611],\n      [7, -2],\n      [-2, -10],\n      [-8, 2],\n      [-5, 23],\n      [8, -13]\n    ],\n    [\n      [9184, 4640],\n      [3, 2],\n      [5, -15],\n      [-14, 1],\n      [0, 16],\n      [6, -4]\n    ],\n    [\n      [9176, 4644],\n      [-1, -9],\n      [-5, 5],\n      [-1, 9],\n      [6, 1],\n      [1, -6]\n    ],\n    [\n      [9234, 4667],\n      [10, -3],\n      [5, -11],\n      [-10, 2],\n      [-5, 12]\n    ],\n    [\n      [8989, 4680],\n      [-11, 16],\n      [11, -11],\n      [0, -5]\n    ],\n    [\n      [8981, 4701],\n      [6, 0],\n      [1, -7],\n      [-7, 7]\n    ],\n    [\n      [9105, 4867],\n      [7, -7],\n      [-1, -11],\n      [-7, 10],\n      [1, 8]\n    ],\n    [\n      [9299, 4867],\n      [8, -4],\n      [3, -17],\n      [6, -8],\n      [1, -9],\n      [5, -4],\n      [8, -16],\n      [2, -14],\n      [-7, -8],\n      [-5, 1],\n      [-10, 17],\n      [1, 14],\n      [-14, 25],\n      [0, 19],\n      [2, 4]\n    ],\n    [\n      [9089, 4870],\n      [-4, 0],\n      [-2, 11],\n      [3, 3],\n      [3, -14]\n    ],\n    [\n      [9296, 4889],\n      [-2, -21],\n      [-1, 25],\n      [3, -4]\n    ],\n    [\n      [9228, 4941],\n      [-2, -6],\n      [7, -2],\n      [0, -17],\n      [-5, -20],\n      [-8, -1],\n      [5, -25],\n      [-8, -9],\n      [-11, 3],\n      [2, -8],\n      [-14, -21],\n      [-15, -13],\n      [-24, -2],\n      [-3, 10],\n      [-6, 4],\n      [-6, -5],\n      [-2, 7],\n      [-10, 12],\n      [-9, 7],\n      [4, 14],\n      [11, -5],\n      [3, 4],\n      [7, -8],\n      [20, 6],\n      [2, 24],\n      [4, -27],\n      [8, 6],\n      [8, -5],\n      [8, 6],\n      [0, 10],\n      [10, 20],\n      [7, -3],\n      [2, 5],\n      [-2, 23],\n      [-3, 16],\n      [7, 0],\n      [5, -8],\n      [2, 8],\n      [6, 0]\n    ],\n    [\n      [8915, 5033],\n      [7, -1],\n      [25, -25],\n      [25, -17],\n      [13, -4],\n      [9, -11],\n      [5, -11],\n      [15, -2],\n      [0, -8],\n      [9, -6],\n      [5, -15],\n      [8, -3],\n      [13, -25],\n      [-1, -38],\n      [14, -4],\n      [18, -16],\n      [5, -7],\n      [12, -3],\n      [9, -22],\n      [0, -18],\n      [-25, -3],\n      [0, -12],\n      [5, -13],\n      [1, -15],\n      [7, -6],\n      [8, -21],\n      [12, -8],\n      [3, -30],\n      [7, -9],\n      [2, -19],\n      [21, 3],\n      [-4, -19],\n      [1, -9],\n      [7, -6],\n      [15, -2],\n      [1, -5],\n      [-9, -5],\n      [8, -16],\n      [10, -7],\n      [12, -3],\n      [-4, -5],\n      [-9, -1],\n      [10, -10],\n      [-7, -9],\n      [-13, 6],\n      [2, 7],\n      [-9, 8],\n      [-7, -1],\n      [-8, 6],\n      [-12, 0],\n      [1, 5],\n      [-11, -3],\n      [-2, 5],\n      [-17, 1],\n      [-11, 33],\n      [-5, 2],\n      [-7, 22],\n      [-8, 6],\n      [-4, 23],\n      [-10, 30],\n      [-13, 9],\n      [-5, -1],\n      [-7, 8],\n      [-9, 2],\n      [-6, 12],\n      [-6, -1],\n      [2, -13],\n      [-7, 10],\n      [1, -8],\n      [-13, 8],\n      [4, -19],\n      [-11, -4],\n      [1, -12],\n      [-18, -5],\n      [-6, 1],\n      [11, -10],\n      [7, -15],\n      [1, -11],\n      [-22, -23],\n      [-11, 10],\n      [-20, -3],\n      [-6, 4],\n      [-3, -5],\n      [-6, 7]\n    ],\n    [\n      [9195, 5027],\n      [10, -11],\n      [11, -17],\n      [7, -3],\n      [14, -33],\n      [11, -10],\n      [5, -22],\n      [-2, -14],\n      [-5, -10],\n      [-6, 14],\n      [1, 21],\n      [-5, 19],\n      [-10, 21],\n      [-6, 2],\n      [-9, 16],\n      [-5, 4],\n      [-9, 15],\n      [-10, 7],\n      [8, 1]\n    ],\n    [\n      [9172, 5046],\n      [6, -5],\n      [0, -12],\n      [-8, 0],\n      [-3, 9],\n      [5, 8]\n    ],\n    [\n      [9079, 5070],\n      [12, -5],\n      [-3, -8],\n      [-17, 0],\n      [0, 11],\n      [8, 2]\n    ],\n    [\n      [9154, 5105],\n      [6, -13],\n      [-6, 5],\n      [0, 8]\n    ],\n    [\n      [5544, 8319],\n      [0, -1]\n    ],\n    [\n      [5544, 8318],\n      [4, -1]\n    ],\n    [\n      [5548, 8317],\n      [63, -4],\n      [21, 0]\n    ],\n    [\n      [5655, 8150],\n      [1, -13],\n      [14, -27],\n      [-5, 0],\n      [4, -18],\n      [-10, -8],\n      [-18, -24],\n      [-13, -25],\n      [4, -28],\n      [-6, 2]\n    ],\n    [\n      [5626, 8009],\n      [-15, 8],\n      [-11, 12],\n      [-16, -2],\n      [-4, -6],\n      [-6, 6],\n      [-10, 0],\n      [-14, -12],\n      [-1, 12],\n      [-10, 11],\n      [-7, -11],\n      [-9, 7]\n    ],\n    [\n      [5396, 8275],\n      [8, -3],\n      [0, 13],\n      [-10, 0]\n    ],\n    [\n      [5394, 8289],\n      [54, 20],\n      [12, 16],\n      [10, 2],\n      [11, 9],\n      [27, 5],\n      [7, -23],\n      [12, -6],\n      [17, 7]\n    ],\n    [\n      [3138, 6248],\n      [29, -2],\n      [9, -6],\n      [2, -7],\n      [-7, -13],\n      [-9, -5],\n      [-17, 3],\n      [-12, -1],\n      [1, 15],\n      [-3, 7],\n      [3, 10],\n      [4, -1]\n    ],\n    [\n      [8625, 7631],\n      [5, -14]\n    ],\n    [\n      [8630, 7617],\n      [-7, 4],\n      [-11, -15],\n      [-11, -27],\n      [4, -15],\n      [-3, -11],\n      [1, -19],\n      [-11, -5],\n      [-7, -16],\n      [-13, -11],\n      [-8, -14],\n      [-9, 1],\n      [-4, -9],\n      [-10, -8],\n      [2, -9],\n      [-6, -13],\n      [2, -13],\n      [9, -2],\n      [17, -29]\n    ],\n    [\n      [8518, 7361],\n      [-8, 4],\n      [-8, -9],\n      [-8, 15],\n      [-7, 1],\n      [2, -14],\n      [-10, 9],\n      [-7, -2],\n      [3, 9],\n      [-13, 4],\n      [9, 5],\n      [-3, 9],\n      [10, 20],\n      [-3, 4],\n      [4, 21],\n      [5, 14],\n      [-4, 8],\n      [-16, 7],\n      [-11, 14],\n      [1, 12]\n    ],\n    [\n      [4525, 7072],\n      [11, -2],\n      [-3, -7],\n      [-10, 3],\n      [2, 6]\n    ],\n    [\n      [4286, 7362],\n      [15, 1],\n      [0, -6],\n      [-10, -3],\n      [-5, 8]\n    ],\n    [\n      [4220, 7396],\n      [-11, -2],\n      [-2, 9],\n      [13, -7]\n    ],\n    [\n      [4248, 7409],\n      [-8, 0],\n      [0, 8],\n      [6, 0],\n      [2, -8]\n    ],\n    [\n      [4794, 7325],\n      [-12, -12],\n      [-21, 8],\n      [-10, -7],\n      [4, 24],\n      [1, 44],\n      [-4, 18],\n      [-8, -2],\n      [-1, 11],\n      [8, 6],\n      [-2, 7],\n      [-4, -11],\n      [-9, 1],\n      [4, 38],\n      [6, 7],\n      [7, 36],\n      [-1, 3],\n      [7, 47],\n      [-6, 50],\n      [3, 7]\n    ],\n    [\n      [3492, 3797],\n      [-1, -17],\n      [-4, -23],\n      [-1, -22],\n      [-3, -17]\n    ],\n    [\n      [5949, 6986],\n      [8, 16]\n    ],\n    [\n      [5987, 7012],\n      [-4, -16]\n    ],\n    [\n      [853, 4163],\n      [-9, -2],\n      [-1, 11],\n      [5, 3],\n      [5, -12]\n    ],\n    [\n      [6422, 6601],\n      [-8, -2],\n      [-3, 9]\n    ],\n    [\n      [6411, 6608],\n      [1, 10],\n      [-3, 15],\n      [1, 20],\n      [3, 6],\n      [4, 24],\n      [6, 6],\n      [4, -12],\n      [5, -2],\n      [1, -9],\n      [-4, -14],\n      [4, -14],\n      [0, -15],\n      [-4, -17],\n      [-7, -5]\n    ],\n    [\n      [5783, 7801],\n      [3, -8],\n      [11, -6],\n      [14, 12],\n      [10, -3],\n      [2, -9]\n    ],\n    [\n      [5823, 7787],\n      [-1, -22],\n      [-14, -4],\n      [-3, 13],\n      [-4, -3],\n      [-6, -35],\n      [1, -21],\n      [-3, -13]\n    ],\n    [\n      [5630, 7730],\n      [-6, 15],\n      [8, 5],\n      [-10, 9],\n      [-6, -14],\n      [-5, 9],\n      [-10, 2],\n      [-9, 9],\n      [5, 16],\n      [-15, 12],\n      [-6, 9],\n      [1, 16],\n      [-13, 13],\n      [-2, 7]\n    ],\n    [\n      [5635, 7944],\n      [10, 8],\n      [7, -5],\n      [20, -6],\n      [10, 3],\n      [9, -14],\n      [10, 11],\n      [26, 6],\n      [3, 12],\n      [9, 3]\n    ],\n    [\n      [9064, 7741],\n      [7, 1],\n      [-12, -10],\n      [-16, -24],\n      [15, 37],\n      [6, -4]\n    ],\n    [\n      [9133, 7793],\n      [-15, -6],\n      [-10, -15],\n      [-5, 0],\n      [-7, -11],\n      [-18, -19],\n      [10, 17],\n      [-3, 3],\n      [25, 28],\n      [9, 0],\n      [12, 15],\n      [2, -12]\n    ],\n    [\n      [9182, 7845],\n      [-21, -27],\n      [-10, -9],\n      [15, 27],\n      [16, 9]\n    ],\n    [\n      [9227, 7898],\n      [-1, -8],\n      [-10, -14],\n      [11, 22]\n    ],\n    [\n      [9301, 8041],\n      [-1, -17],\n      [-6, 3],\n      [7, 14]\n    ],\n    [\n      [9336, 8091],\n      [-7, -15],\n      [-9, -4],\n      [-5, -11],\n      [-5, 16],\n      [15, 9],\n      [4, 15],\n      [7, 3],\n      [0, -13]\n    ],\n    [\n      [9344, 8100],\n      [-7, 6],\n      [7, 7],\n      [0, -13]\n    ],\n    [\n      [8967, 8309],\n      [5, -11],\n      [-3, -7],\n      [8, -35],\n      [4, -38],\n      [-6, -46],\n      [5, -11],\n      [-2, -12],\n      [6, 0],\n      [9, -69],\n      [10, -33],\n      [0, -7],\n      [8, -36],\n      [-9, 14],\n      [-23, 9],\n      [3, -6],\n      [-10, -7],\n      [-2, -16],\n      [-12, -57],\n      [6, -26],\n      [8, -11],\n      [0, -11],\n      [5, -21],\n      [9, 4],\n      [1, -28],\n      [-3, -6],\n      [-2, 22],\n      [-17, 3],\n      [-2, 6],\n      [-7, -5],\n      [-6, -32],\n      [-5, -9],\n      [-3, 6],\n      [-4, 29],\n      [7, 30],\n      [-3, 31],\n      [7, 21],\n      [-3, 26],\n      [-5, 12],\n      [7, 55],\n      [0, 46],\n      [-3, 10],\n      [1, 17],\n      [5, 19],\n      [-5, 18],\n      [-11, 14],\n      [-1, 38],\n      [4, 5],\n      [3, 26],\n      [-4, 26],\n      [13, 9],\n      [1, -9],\n      [10, 9],\n      [-4, 8],\n      [9, 2],\n      [-2, 12],\n      [-10, 21],\n      [5, -2],\n      [5, 11],\n      [3, -8]\n    ],\n    [\n      [9669, 8321],\n      [-19, 19],\n      [4, 0],\n      [15, -19]\n    ],\n    [\n      [8810, 8355],\n      [-14, -11],\n      [8, 11],\n      [6, 0]\n    ],\n    [\n      [8827, 8358],\n      [9, -8],\n      [-12, -22],\n      [-6, 15],\n      [-6, 1],\n      [8, 17],\n      [7, -3]\n    ],\n    [\n      [5548, 8317],\n      [18, 15],\n      [-10, 2],\n      [-12, -16]\n    ],\n    [\n      [5544, 8319],\n      [10, 17],\n      [0, 12],\n      [12, -1],\n      [15, 19]\n    ],\n    [\n      [5582, 8366],\n      [-12, -19],\n      [12, -3],\n      [7, 5],\n      [1, 15]\n    ],\n    [\n      [9609, 8371],\n      [18, -27],\n      [1, -11],\n      [-13, 14],\n      [-4, 13],\n      [-7, 6],\n      [5, 5]\n    ],\n    [\n      [9571, 8591],\n      [3, -16],\n      [-8, -2],\n      [-23, -18],\n      [9, 26],\n      [19, 10]\n    ],\n    [\n      [5777, 8600],\n      [3, -1]\n    ],\n    [\n      [6924, 9029],\n      [21, -5],\n      [-5, -13],\n      [-16, 18]\n    ],\n    [\n      [6396, 9167],\n      [-24, -22],\n      [-23, -4],\n      [-10, 9],\n      [1, 19],\n      [15, 16],\n      [13, 1],\n      [28, -19]\n    ],\n    [\n      [9482, 9188],\n      [-3, -8],\n      [6, -25],\n      [-10, 6],\n      [-2, 19],\n      [9, 8]\n    ],\n    [\n      [9705, 9201],\n      [-6, -12],\n      [-29, 7],\n      [-11, 8],\n      [14, 11],\n      [32, -8],\n      [0, -6]\n    ],\n    [\n      [6648, 9234],\n      [5, -8],\n      [26, -17],\n      [0, -11],\n      [-25, -1],\n      [-5, 11],\n      [-10, -2],\n      [-13, 12],\n      [-1, 15],\n      [13, 8],\n      [10, -7]\n    ],\n    [\n      [6464, 9295],\n      [14, -14],\n      [-6, -11],\n      [-7, 12],\n      [-15, 9],\n      [14, 4]\n    ],\n    [\n      [0, 9271],\n      [9990, -7],\n      [-25, -4],\n      [-4, 14],\n      [8, 11],\n      [30, 17],\n      [-9999, -31]\n    ],\n    [\n      [8829, 9305],\n      [-3, -9],\n      [-20, 5],\n      [23, 4]\n    ],\n    [\n      [0, 9302],\n      [26, 4],\n      [18, -3],\n      [27, -17],\n      [-12, -12],\n      [-42, -8],\n      [-17, 5],\n      [0, 31]\n    ],\n    [\n      [7160, 9347],\n      [-27, 1],\n      [22, 18],\n      [21, -9],\n      [-16, -10]\n    ],\n    [\n      [8580, 9366],\n      [-7, -7],\n      [-15, 7],\n      [22, 0]\n    ],\n    [\n      [8592, 9374],\n      [-28, 2],\n      [18, 7],\n      [10, -9]\n    ],\n    [\n      [7209, 9382],\n      [0, -11],\n      [-19, 1],\n      [-8, 7],\n      [16, 13],\n      [11, -10]\n    ],\n    [\n      [7078, 9392],\n      [-5, -14],\n      [-16, 10],\n      [21, 4]\n    ],\n    [\n      [6536, 9406],\n      [31, -6],\n      [-8, -26],\n      [-15, -9],\n      [-7, -32],\n      [5, -18],\n      [16, -29],\n      [23, -20],\n      [19, -10],\n      [-49, -5],\n      [-16, 3],\n      [-2, -8],\n      [-14, 12],\n      [-18, -1],\n      [-11, 7],\n      [-11, 34],\n      [-11, -4],\n      [-10, 10],\n      [-19, -6],\n      [-8, 6],\n      [-3, 22],\n      [11, 12],\n      [15, -5],\n      [9, 22],\n      [11, 9],\n      [-20, 7],\n      [7, 8],\n      [21, 1],\n      [-7, 12],\n      [17, 12],\n      [13, -2],\n      [20, 9],\n      [11, -5]\n    ],\n    [\n      [6970, 9416],\n      [1, -13],\n      [11, -6],\n      [-42, -7],\n      [3, 20],\n      [27, 6]\n    ],\n    [\n      [8951, 9436],\n      [32, -18],\n      [0, -21],\n      [-33, 3],\n      [-40, 10],\n      [-27, -4],\n      [2, 8],\n      [17, 1],\n      [17, 22],\n      [32, -1]\n    ],\n    [\n      [8903, 9439],\n      [-10, 16],\n      [20, 5],\n      [2, -17],\n      [-12, -4]\n    ],\n    [\n      [8148, 9464],\n      [-16, -15],\n      [-37, 13],\n      [18, 14],\n      [34, -4],\n      [1, -8]\n    ],\n    [\n      [7281, 9528],\n      [-4, -16],\n      [-14, 11],\n      [18, 5]\n    ],\n    [\n      [9075, 9530],\n      [47, -4],\n      [5, -12],\n      [15, 3],\n      [49, -6],\n      [-8, -15],\n      [-25, -8],\n      [-43, 2],\n      [-58, 24],\n      [7, 20],\n      [11, -4]\n    ],\n    [\n      [8773, 9524],\n      [-11, -1],\n      [6, 29],\n      [14, -16],\n      [-9, -12]\n    ],\n    [\n      [8863, 9565],\n      [40, -20],\n      [10, 14],\n      [19, 1],\n      [-8, 10],\n      [35, -19],\n      [29, 1],\n      [50, -20],\n      [-19, -5],\n      [5, -8],\n      [-16, -15],\n      [-40, 6],\n      [-11, 13],\n      [15, 13],\n      [-3, 8],\n      [-25, -4],\n      [5, -18],\n      [12, -15],\n      [30, -9],\n      [-38, -6],\n      [-14, 10],\n      [-49, -10],\n      [-6, 8],\n      [-17, -18],\n      [-33, 8],\n      [-25, 20],\n      [-2, 34],\n      [18, 1],\n      [-9, 9],\n      [42, 18],\n      [5, -7]\n    ],\n    [\n      [7674, 9577],\n      [3, -9],\n      [-30, 3],\n      [27, 6]\n    ],\n    [\n      [8125, 9595],\n      [2, -10],\n      [-18, 11],\n      [16, -1]\n    ],\n    [\n      [9145, 9596],\n      [-23, 0],\n      [29, 8],\n      [-6, -8]\n    ],\n    [\n      [6893, 9615],\n      [24, -15],\n      [-21, -24],\n      [-51, -17],\n      [-116, -32],\n      [-47, -18],\n      [0, -15],\n      [-22, -8],\n      [-2, -8],\n      [-17, 8],\n      [1, -16],\n      [-26, 8],\n      [15, -17],\n      [-16, -8],\n      [-16, -31],\n      [-24, -20],\n      [-36, 4],\n      [-11, 6],\n      [-20, -6],\n      [-4, 9],\n      [24, 12],\n      [-30, -4],\n      [-2, 8],\n      [26, 12],\n      [-3, 6],\n      [26, 13],\n      [-3, 20],\n      [24, 4],\n      [-14, 7],\n      [18, 4],\n      [-18, 4],\n      [-3, 9],\n      [21, -4],\n      [14, 19],\n      [19, -4],\n      [-5, 11],\n      [38, 20],\n      [23, 3],\n      [14, 11],\n      [23, -2],\n      [0, 12],\n      [52, -5],\n      [61, 15],\n      [49, 28],\n      [35, 1]\n    ],\n    [\n      [7679, 9622],\n      [-33, -4],\n      [35, 11],\n      [-2, -7]\n    ],\n    [\n      [8666, 7787],\n      [3, -13],\n      [-2, -13],\n      [9, -14],\n      [7, 9],\n      [6, 22]\n    ],\n    [\n      [6367, 7850],\n      [-12, -15],\n      [-2, -14],\n      [-4, 9],\n      [-10, -14],\n      [-17, 0],\n      [-7, -31],\n      [-8, -23],\n      [-10, -8],\n      [0, -13],\n      [14, -11],\n      [8, -28],\n      [-2, -14],\n      [6, 19],\n      [-5, -26],\n      [0, -21],\n      [7, -10],\n      [4, -16],\n      [12, -26],\n      [2, -11],\n      [6, -4]\n    ],\n    [\n      [6110, 7681],\n      [-15, 21],\n      [-1, 6],\n      [-18, 24],\n      [-15, 7],\n      [-11, 15],\n      [-9, 1],\n      [-8, 19],\n      [-17, 11],\n      [8, 3],\n      [-1, 11],\n      [8, -6],\n      [11, 2],\n      [5, -4],\n      [0, 16],\n      [-4, 2],\n      [8, 10],\n      [2, 14],\n      [4, -6],\n      [2, 11],\n      [11, 0],\n      [-13, 17],\n      [-5, 0],\n      [-4, 15],\n      [6, -3],\n      [13, 14],\n      [24, 9],\n      [0, 13],\n      [-30, -8]\n    ],\n    [\n      [6061, 7895],\n      [-1, 12],\n      [5, 17],\n      [11, 5],\n      [3, 10],\n      [25, -3],\n      [0, 13],\n      [6, 12],\n      [-8, 29],\n      [10, 5],\n      [-8, 3],\n      [11, 26],\n      [-1, 14],\n      [-10, -2],\n      [-5, 10],\n      [-7, 0],\n      [-5, 9],\n      [-6, -5],\n      [-8, 10],\n      [-18, -4],\n      [-8, 11],\n      [-8, 20],\n      [-16, -6],\n      [-6, -7],\n      [-10, 4],\n      [-5, 8],\n      [-13, -5],\n      [-6, 10],\n      [2, 10],\n      [-4, 19],\n      [-7, 12],\n      [-11, -3],\n      [-13, 12],\n      [-3, 17],\n      [8, 9],\n      [-8, 8],\n      [-1, 10],\n      [-11, 13],\n      [-13, 1],\n      [-9, -8],\n      [-15, 5],\n      [-1, -11],\n      [-12, -7],\n      [-3, 5]\n    ],\n    [\n      [5767, 8523],\n      [9, -9],\n      [6, 9],\n      [-6, 10],\n      [-10, -2],\n      [7, 19],\n      [-4, 30]\n    ],\n    [\n      [5773, 8590],\n      [9, 11]\n    ],\n    [\n      [5778, 8608],\n      [-1, 16],\n      [11, -5],\n      [3, 11],\n      [10, -4],\n      [7, 12],\n      [29, -8],\n      [2, 8],\n      [-9, 9],\n      [-25, 2],\n      [-10, 28],\n      [-16, -9],\n      [-7, 2]\n    ],\n    [\n      [5856, 9203],\n      [15, -9],\n      [19, 18],\n      [16, -11],\n      [14, -3],\n      [-7, -8],\n      [-20, 4],\n      [6, -7],\n      [19, -3],\n      [-6, -7],\n      [19, 4],\n      [5, -5],\n      [35, -7],\n      [23, -1],\n      [52, -28],\n      [21, -21],\n      [14, -2],\n      [16, -14],\n      [13, -3],\n      [30, -21],\n      [1, -23],\n      [7, -2],\n      [-5, -24],\n      [-21, -24],\n      [-30, -15],\n      [-22, -4],\n      [-28, 5],\n      [-22, 9],\n      [-27, 3],\n      [-27, 15],\n      [-36, 7],\n      [-24, 23],\n      [-11, 0],\n      [8, -15],\n      [18, -11],\n      [3, -9],\n      [13, -6],\n      [-4, -7],\n      [14, -3],\n      [21, -20],\n      [-4, -21],\n      [-6, -7],\n      [13, -46],\n      [-6, -4],\n      [16, -15],\n      [15, 2],\n      [12, -18],\n      [31, -13],\n      [16, 9],\n      [1, 21],\n      [-25, 5],\n      [-16, 19],\n      [-3, 12],\n      [10, 2],\n      [7, 12],\n      [18, -9],\n      [10, -13],\n      [0, -9],\n      [10, 10],\n      [31, -15],\n      [9, 7],\n      [18, -7],\n      [-4, 22],\n      [-19, 30],\n      [4, 9],\n      [18, 12],\n      [6, 9],\n      [18, 5],\n      [22, 27],\n      [11, -8],\n      [20, 3],\n      [22, -21],\n      [1, 11],\n      [11, 23],\n      [0, 16],\n      [-20, 19],\n      [10, 28],\n      [3, 31],\n      [-25, 18],\n      [18, -4],\n      [37, 0],\n      [18, -6],\n      [16, -18],\n      [5, -18],\n      [-38, -5],\n      [-12, -22],\n      [17, -9],\n      [8, -17],\n      [20, -5],\n      [34, 13],\n      [5, 22],\n      [-3, 11],\n      [26, 7],\n      [1, 6],\n      [24, 9],\n      [31, 22],\n      [8, -1],\n      [31, 13],\n      [-1, -12],\n      [16, 4],\n      [-12, 10],\n      [32, 18],\n      [15, -3],\n      [-7, -14],\n      [6, -13],\n      [-21, -8],\n      [29, -3],\n      [7, 6],\n      [11, -7],\n      [1, 12],\n      [29, 14],\n      [38, -5],\n      [18, 17],\n      [25, 8],\n      [15, -13],\n      [-10, -8],\n      [1, -13],\n      [16, -4],\n      [8, 10],\n      [-6, 7],\n      [20, 5],\n      [13, 11],\n      [0, 10],\n      [-22, 28],\n      [15, 6],\n      [2, 10],\n      [74, -10],\n      [20, -7],\n      [19, -15],\n      [62, -29],\n      [33, -25],\n      [2, -9],\n      [17, 25],\n      [7, 19],\n      [-21, 2],\n      [-10, 16],\n      [-1, 12],\n      [-35, 14],\n      [3, 16],\n      [12, 3],\n      [-6, 9],\n      [6, 15],\n      [-1, 20],\n      [-16, -3],\n      [-2, 17],\n      [8, 14],\n      [28, 12],\n      [15, 17],\n      [14, 51],\n      [12, 16],\n      [5, -5],\n      [52, 1],\n      [39, -11],\n      [1, -25],\n      [-16, -26],\n      [1, -7],\n      [-15, -11],\n      [8, -13],\n      [16, -10],\n      [5, -15],\n      [-2, -25],\n      [-10, -9],\n      [8, -25],\n      [-5, -11],\n      [3, -21],\n      [-3, -16],\n      [5, -8],\n      [26, -20],\n      [-15, -16],\n      [3, -22],\n      [-18, -13],\n      [-9, -27],\n      [-20, -14],\n      [2, -15],\n      [-15, -1],\n      [-10, -7],\n      [-22, 21],\n      [-22, -6],\n      [8, -15],\n      [27, -10],\n      [22, 2],\n      [24, -8],\n      [10, 6],\n      [2, 16],\n      [13, 2],\n      [26, 20],\n      [1, 17],\n      [24, 24],\n      [-1, 25],\n      [-11, 15],\n      [3, 17],\n      [29, 12],\n      [31, 4],\n      [1, -11],\n      [19, -15],\n      [-5, -15],\n      [5, -20],\n      [-7, -7],\n      [18, -13],\n      [18, -1],\n      [-25, 13],\n      [0, 18],\n      [20, 10],\n      [-11, 14],\n      [-5, 24],\n      [-19, 5],\n      [-24, 13],\n      [-17, 1],\n      [-20, -10],\n      [-27, 5],\n      [3, 18],\n      [-10, 15],\n      [6, 25],\n      [17, 20],\n      [-21, 41],\n      [-15, 12],\n      [14, 22],\n      [39, 16],\n      [5, 17],\n      [-4, 28],\n      [15, -7],\n      [6, -30],\n      [-13, -17],\n      [7, -17],\n      [-5, -18],\n      [11, -4],\n      [57, -7],\n      [6, -11],\n      [12, 0],\n      [-4, 17],\n      [-17, 2],\n      [-39, 16],\n      [-8, 20],\n      [27, 8],\n      [17, -13],\n      [15, 3],\n      [-5, 14],\n      [-15, -2],\n      [15, 14],\n      [16, 5],\n      [28, -3],\n      [51, -35],\n      [23, -3],\n      [18, 5],\n      [14, -7],\n      [-14, -16],\n      [-16, -6],\n      [-2, -17],\n      [7, -12],\n      [-10, -12],\n      [11, 2],\n      [0, 11],\n      [10, 11],\n      [9, -6],\n      [-4, -27],\n      [-10, -9],\n      [14, -10],\n      [-7, 14],\n      [18, 0],\n      [6, 8],\n      [-17, 44],\n      [13, 23],\n      [-6, 11],\n      [-32, 15],\n      [-3, 11],\n      [-26, 4],\n      [-14, 11],\n      [4, 23],\n      [-11, 9],\n      [2, 28],\n      [39, 5],\n      [43, -1],\n      [59, 10],\n      [40, 3],\n      [-23, -18],\n      [25, 2],\n      [10, 13],\n      [-19, 21],\n      [-22, 4],\n      [14, 18],\n      [-21, 4],\n      [13, 10],\n      [16, -7],\n      [68, 47],\n      [67, 8],\n      [66, 16],\n      [-28, 9],\n      [19, 3],\n      [22, -5],\n      [25, 7],\n      [21, -3],\n      [-16, -13],\n      [58, 10],\n      [32, 12],\n      [29, -10],\n      [-29, 24],\n      [18, -3],\n      [40, 4],\n      [1, 26],\n      [63, 39],\n      [43, 3],\n      [33, -17],\n      [-21, -13],\n      [-24, -3],\n      [82, -7],\n      [6, -6],\n      [-27, -21],\n      [36, -1],\n      [4, 12],\n      [38, 1],\n      [19, -4],\n      [27, 5],\n      [47, -24],\n      [3, -16],\n      [19, 4],\n      [3, -28],\n      [-21, 5],\n      [1, -12],\n      [22, -1],\n      [-2, -14],\n      [-20, -17],\n      [-20, -6],\n      [-12, -13],\n      [-47, -16],\n      [-2, -9],\n      [-32, -15],\n      [-20, -19],\n      [-27, -1],\n      [-12, -18],\n      [-17, -2],\n      [-6, -15],\n      [-15, -12],\n      [23, 6],\n      [7, 17],\n      [37, -2],\n      [15, 8],\n      [51, 12],\n      [23, 10],\n      [-7, 6],\n      [-25, -5],\n      [-6, 8],\n      [13, 10],\n      [25, -6],\n      [7, 7],\n      [8, -13],\n      [19, -6],\n      [22, 5],\n      [-2, 12],\n      [16, -20],\n      [-8, -12],\n      [44, 9],\n      [19, 7],\n      [100, -13],\n      [-18, -4],\n      [1, -11],\n      [38, -12],\n      [36, -5],\n      [25, 2],\n      [21, -8],\n      [-7, 11],\n      [19, -6],\n      [11, 17],\n      [-8, 10],\n      [3, 16],\n      [17, -2],\n      [10, 10],\n      [23, -14],\n      [29, 0],\n      [12, -16],\n      [7, 15],\n      [30, -4],\n      [7, -12],\n      [34, -14],\n      [-34, -12],\n      [30, -6],\n      [-39, -3],\n      [20, -10],\n      [18, -1],\n      [6, -12],\n      [-15, -11],\n      [-19, 8],\n      [27, -37],\n      [13, -27],\n      [40, -21],\n      [13, 12],\n      [18, 43],\n      [10, 14],\n      [13, -19],\n      [23, -12],\n      [22, 0],\n      [4, 6],\n      [31, 8],\n      [22, -6],\n      [19, -11],\n      [11, -13],\n      [7, 27],\n      [16, 4],\n      [12, -13],\n      [17, 2],\n      [-3, 27],\n      [15, 17],\n      [-29, 0],\n      [12, 16],\n      [37, 2],\n      [4, 10],\n      [-12, 9],\n      [23, -1],\n      [23, -9],\n      [38, 0],\n      [50, -8],\n      [39, -12],\n      [-37, 1],\n      [-16, 4],\n      [-13, -15],\n      [27, 6],\n      [42, 2],\n      [-26, -26],\n      [10, 16],\n      [-12, 4],\n      [-3, -17],\n      [-23, -12],\n      [29, 4],\n      [30, 31],\n      [36, 0],\n      [34, -9],\n      [13, -13],\n      [-12, -9],\n      [-7, 7],\n      [-9, -11],\n      [25, -2],\n      [-2, -11],\n      [20, 2],\n      [0, -13],\n      [24, 3],\n      [18, -20],\n      [-13, 0],\n      [26, -9],\n      [28, 3],\n      [65, 12],\n      [45, -1],\n      [26, -6],\n      [33, -17],\n      [11, -25],\n      [-11, -19],\n      [3, -8],\n      [31, -8],\n      [3, -28],\n      [11, -11],\n      [-10, -25],\n      [14, 22],\n      [-2, 26],\n      [19, 17],\n      [51, 7],\n      [23, -12],\n      [23, 2],\n      [11, -5],\n      [24, -1],\n      [21, 16],\n      [16, -13],\n      [2, -19],\n      [29, -8],\n      [7, -18],\n      [22, 4],\n      [17, 12],\n      [-13, 32],\n      [-11, -1],\n      [11, 11],\n      [-1, 19],\n      [41, -7],\n      [22, -1],\n      [17, -10],\n      [1, 9],\n      [37, -6],\n      [20, 2],\n      [28, -7],\n      [71, -27],\n      [17, -16],\n      [-9958, -15],\n      [3, -12],\n      [28, -11],\n      [2, -9],\n      [12, 1],\n      [20, -19],\n      [16, -2],\n      [-10, -7],\n      [12, -5],\n      [0, 10],\n      [12, -7],\n      [8, -20],\n      [10, -2],\n      [-3, -18],\n      [5, -13],\n      [-7, -6],\n      [14, -8],\n      [-1, -14],\n      [17, 13],\n      [-11, 3],\n      [9, 6],\n      [-2, 17],\n      [-9, 6],\n      [27, 1],\n      [20, -12],\n      [-5, 9],\n      [32, -6],\n      [10, -17],\n      [13, -7],\n      [10, -17],\n      [5, 4],\n      [17, -14],\n      [-9, 0],\n      [-14, -11],\n      [-5, -15],\n      [-21, 13],\n      [11, -20],\n      [-32, 3],\n      [4, -27],\n      [-19, -12],\n      [-8, -11],\n      [16, -5],\n      [6, -9],\n      [-13, -1],\n      [-12, -9],\n      [-23, 10],\n      [-2, 8],\n      [-16, 10],\n      [-33, 12],\n      [-4, 29],\n      [-29, 10],\n      [-12, -10],\n      [-30, 4],\n      [-11, 27],\n      [9, 7],\n      [2, 15],\n      [-7, -11],\n      [-28, -4],\n      [0, -16],\n      [13, -11],\n      [-7, -23],\n      [9982, -11],\n      [-10, -13],\n      [-34, -9],\n      [-21, 8],\n      [-1, 8],\n      [-16, 9],\n      [12, -16],\n      [-24, 2],\n      [-11, 7],\n      [20, -23],\n      [20, 12],\n      [-3, -16],\n      [17, -17],\n      [8, 8],\n      [12, -25],\n      [2, -16],\n      [-5, -13],\n      [18, -9],\n      [2, -20],\n      [7, -16],\n      [-12, -7],\n      [0, -10],\n      [-28, 12],\n      [-22, 3],\n      [-10, 16],\n      [2, -16],\n      [-21, -16],\n      [-25, -11],\n      [-25, -18],\n      [-12, 2],\n      [-7, -10],\n      [-8, 4],\n      [-1, -10],\n      [-10, -10],\n      [-11, 2],\n      [5, -8],\n      [-22, -13],\n      [-3, -12],\n      [-17, -4],\n      [-1, -9],\n      [-15, -7],\n      [-10, -16],\n      [-6, -18],\n      [-8, 8],\n      [-7, 21],\n      [-13, 9],\n      [-32, 0],\n      [-35, -20],\n      [-16, -23],\n      [-4, 0],\n      [8, 39],\n      [-33, -24],\n      [-5, -14],\n      [-7, -2],\n      [-2, 11],\n      [-30, 3],\n      [2, -9],\n      [-9, -4],\n      [-5, -19],\n      [4, -12],\n      [-12, -10],\n      [4, -10],\n      [-18, -16],\n      [-10, -26],\n      [1, -19],\n      [13, -7],\n      [1, 11],\n      [18, -8],\n      [3, -6],\n      [-15, -21],\n      [1, -36],\n      [11, 1],\n      [4, -32],\n      [-9, -10],\n      [-12, 13],\n      [8, 11],\n      [-6, 4],\n      [-8, -7],\n      [6, -6],\n      [-16, -12],\n      [-7, -25],\n      [-1, -16],\n      [11, -34],\n      [-11, -14],\n      [-13, -1],\n      [-6, 6],\n      [-15, -9],\n      [-13, -15],\n      [-6, -22],\n      [4, -13],\n      [-3, -6],\n      [5, -22],\n      [-13, 10],\n      [-9, -5],\n      [-21, -25],\n      [1, -26],\n      [-7, -19],\n      [-10, -20],\n      [-11, -7],\n      [-2, -8],\n      [-17, -22],\n      [-9, 17],\n      [-1, 40],\n      [-4, 33],\n      [-7, 23],\n      [-4, 46],\n      [-9, 60],\n      [-2, 29],\n      [4, 46],\n      [6, 29],\n      [6, 15],\n      [17, 15],\n      [7, 17],\n      [-5, 22],\n      [16, 0],\n      [7, 14],\n      [15, 0],\n      [20, 19],\n      [24, 33],\n      [3, 13],\n      [13, 12],\n      [5, 12],\n      [8, 2],\n      [18, 25],\n      [14, 14],\n      [-1, 8],\n      [30, 21],\n      [21, 9],\n      [-8, 4],\n      [15, 18],\n      [-7, 9],\n      [8, 12],\n      [2, 33],\n      [14, 12],\n      [17, -5],\n      [-18, 17],\n      [-15, -1],\n      [-22, -8],\n      [3, -11],\n      [-8, -6],\n      [3, -9],\n      [-6, -15],\n      [10, -9],\n      [-10, -7],\n      [-5, 11],\n      [-10, -2],\n      [-12, -18],\n      [-32, -32],\n      [-19, -14],\n      [8, 27],\n      [-17, -7],\n      [5, 11],\n      [-3, 9],\n      [14, 29],\n      [-3, 10],\n      [-12, -14],\n      [-10, -2],\n      [-3, 12],\n      [-13, 2],\n      [-26, -10],\n      [-15, 3],\n      [-22, -15],\n      [-1, -18],\n      [-20, -20],\n      [0, -9],\n      [-27, -20],\n      [-13, -28],\n      [-7, -1],\n      [-2, -23],\n      [14, 5],\n      [16, -14],\n      [-1, -7],\n      [-11, -3],\n      [-8, 5],\n      [-13, -10],\n      [-19, 11],\n      [0, -8],\n      [-10, -2],\n      [-2, -8],\n      [-16, 8],\n      [-9, -11],\n      [-17, -2],\n      [-9, 15],\n      [10, 4],\n      [18, -1],\n      [6, 4],\n      [-15, 8],\n      [-10, 14],\n      [-13, -8],\n      [-12, 2],\n      [-2, 7],\n      [-23, 8],\n      [-16, -8],\n      [5, -5],\n      [-14, -5],\n      [6, -12],\n      [-14, 2],\n      [-2, 7],\n      [-12, 0],\n      [-10, -9],\n      [-31, 13],\n      [-3, -16],\n      [-8, -3],\n      [-6, 9],\n      [4, 6],\n      [-27, -1],\n      [-32, 2],\n      [-19, -3],\n      [-25, -13],\n      [-19, -30],\n      [-17, -11],\n      [-8, -13],\n      [-5, -20],\n      [-15, -9],\n      [-4, -11],\n      [-11, -12],\n      [-14, -9],\n      [-22, -32],\n      [-12, -26],\n      [-26, -27],\n      [-8, -4],\n      [-15, -23],\n      [-19, -15],\n      [0, -12],\n      [14, -9],\n      [30, 5],\n      [0, -28],\n      [-4, -21],\n      [12, 0],\n      [5, 14],\n      [-6, 6],\n      [10, 10],\n      [8, -2],\n      [-8, -11],\n      [9, -11],\n      [-12, -22],\n      [16, 4],\n      [11, 9],\n      [7, 14],\n      [1, -9],\n      [-10, -15],\n      [7, -3],\n      [8, 26],\n      [-1, 20],\n      [16, -8],\n      [9, 5],\n      [17, -12],\n      [0, -11],\n      [27, -32],\n      [6, -10],\n      [-13, -12],\n      [8, -5],\n      [1, -15],\n      [-4, -13],\n      [11, -12],\n      [-6, -3],\n      [3, -9],\n      [-9, -16],\n      [-6, -3],\n      [0, -12],\n      [-6, -8],\n      [0, -18],\n      [-4, -4],\n      [-3, -20],\n      [1, -32],\n      [3, -23],\n      [-6, -17],\n      [1, -17],\n      [-6, -17],\n      [0, -14],\n      [-26, -38],\n      [-7, -28],\n      [-13, -18],\n      [-5, -27],\n      [-18, -41],\n      [-15, -25],\n      [-10, -11],\n      [-8, -20],\n      [-6, -6],\n      [-5, -15],\n      [-7, -5],\n      [-11, -25],\n      [-3, -14],\n      [-5, 0],\n      [-1, -12],\n      [-18, -20],\n      [-9, -6],\n      [-7, -11],\n      [-8, 0],\n      [-12, -10],\n      [-6, 7],\n      [-4, -4],\n      [-12, 10],\n      [-3, -4],\n      [-1, 23],\n      [-9, -11],\n      [1, 15],\n      [-16, -21],\n      [-1, -11],\n      [-14, -11],\n      [-4, -17]\n    ],\n    [\n      [7858, 9748],\n      [0, -12],\n      [30, 4],\n      [14, -16],\n      [16, -1],\n      [8, -19],\n      [-16, -10],\n      [-31, -5],\n      [-68, -3],\n      [-33, -14],\n      [-21, 5],\n      [21, 17],\n      [6, 19],\n      [36, 39],\n      [19, -6],\n      [2, 11],\n      [17, -9]\n    ],\n    [\n      [7118, 9769],\n      [37, -6],\n      [-27, -3],\n      [-10, 9]\n    ],\n    [\n      [7523, 9794],\n      [79, -8],\n      [-18, -13],\n      [-55, 8],\n      [-6, 13]\n    ],\n    [\n      [6659, 9787],\n      [-27, 3],\n      [21, 7],\n      [6, -10]\n    ],\n    [\n      [7715, 9797],\n      [-5, -21],\n      [25, 17],\n      [20, 0],\n      [24, -16],\n      [-9, -24],\n      [-19, -5],\n      [25, -18],\n      [-39, -10],\n      [-38, 4],\n      [-11, 8],\n      [-50, 2],\n      [-18, 12],\n      [-1, 14],\n      [-33, 3],\n      [29, 14],\n      [23, 19],\n      [77, 1]\n    ],\n    [\n      [6585, 9810],\n      [-4, -16],\n      [-28, 0],\n      [1, 14],\n      [31, 2]\n    ],\n    [\n      [6481, 9813],\n      [15, -7],\n      [-35, -6],\n      [20, 13]\n    ],\n    [\n      [6646, 9809],\n      [-52, -12],\n      [-13, 20],\n      [42, 0],\n      [23, -8]\n    ],\n    [\n      [6329, 9836],\n      [-38, -20],\n      [-39, 11],\n      [77, 9]\n    ],\n    [\n      [6729, 9835],\n      [-5, -10],\n      [-29, -12],\n      [-38, 1],\n      [-13, 13],\n      [14, 11],\n      [65, 2],\n      [6, -5]\n    ],\n    [\n      [6537, 9839],\n      [-13, -8],\n      [-22, 8],\n      [35, 0]\n    ],\n    [\n      [6388, 9840],\n      [7, -8],\n      [30, 3],\n      [-9, -14],\n      [-60, -9],\n      [4, -14],\n      [-38, -4],\n      [16, 15],\n      [-22, 8],\n      [63, 10],\n      [-18, 7],\n      [27, 6]\n    ],\n    [\n      [7225, 9845],\n      [-28, -9],\n      [2, 9],\n      [26, 0]\n    ],\n    [\n      [6560, 9854],\n      [57, -11],\n      [-29, -1],\n      [-28, 12]\n    ],\n    [\n      [6542, 9848],\n      [13, 2],\n      [47, -13],\n      [-19, -7],\n      [-41, 18]\n    ],\n    [\n      [6797, 9859],\n      [20, -16],\n      [-28, -11],\n      [-36, -3],\n      [-17, 9],\n      [46, 10],\n      [15, 11]\n    ],\n    [\n      [7536, 9852],\n      [-37, 1],\n      [2, 7],\n      [38, -2],\n      [-3, -6]\n    ],\n    [\n      [7665, 9859],\n      [54, -29],\n      [-20, -3],\n      [0, -24],\n      [-75, -6],\n      [-22, -7],\n      [-63, 20],\n      [36, 9],\n      [15, 17],\n      [-22, -3],\n      [16, 14],\n      [81, 12]\n    ],\n    [\n      [6577, 9869],\n      [28, -6],\n      [-38, -6],\n      [10, 12]\n    ],\n    [\n      [6605, 9878],\n      [14, -9],\n      [-44, 4],\n      [30, 5]\n    ],\n    [\n      [5846, 5121],\n      [2, -14],\n      [5, -5],\n      [3, -11],\n      [1, -26],\n      [-1, -18],\n      [-8, -2]\n    ],\n    [\n      [5801, 5040],\n      [6, 7],\n      [8, 22],\n      [-4, 17]\n    ],\n    [\n      [5821, 5103],\n      [7, 4],\n      [4, -9],\n      [5, 7],\n      [5, 16],\n      [4, 0]\n    ],\n    [\n      [4526, 6379],\n      [-1, 15],\n      [2, 22]\n    ],\n    [\n      [6163, 6147],\n      [4, 4],\n      [4, -6],\n      [-8, 2]\n    ],\n    [\n      [6345, 6826],\n      [6, -29],\n      [6, -11],\n      [0, -14],\n      [11, -4],\n      [-4, -5],\n      [5, -5],\n      [11, -23],\n      [8, -6],\n      [0, -16],\n      [6, -10],\n      [-2, -18],\n      [-4, 4],\n      [7, -31],\n      [8, -17],\n      [0, -12],\n      [8, -21]\n    ],\n    [\n      [6422, 6601],\n      [7, -4],\n      [-5, -9],\n      [8, -8]\n    ],\n    [\n      [6443, 6277],\n      [-4, -2],\n      [-58, -16],\n      [-17, -4],\n      [-27, -27],\n      [-16, -40],\n      [-3, -19],\n      [-9, -11],\n      [-5, 1],\n      [-7, 19],\n      [-11, -3],\n      [-25, 5],\n      [-5, 6],\n      [-16, 1],\n      [-15, -5],\n      [-11, 0],\n      [-7, 10],\n      [-9, -11],\n      [-1, -24],\n      [2, -15],\n      [-11, -16]\n    ],\n    [\n      [6188, 6126],\n      [-2, 21],\n      [-5, 8],\n      [0, 8],\n      [-6, 9],\n      [0, 15],\n      [-15, 23],\n      [-9, 25],\n      [0, 8],\n      [-7, 16],\n      [-2, 14],\n      [-11, 49],\n      [-18, 29],\n      [-9, 3],\n      [-6, 13],\n      [-13, 43],\n      [3, 7],\n      [-7, 28],\n      [4, 20],\n      [0, 19],\n      [-8, 23],\n      [0, 8],\n      [-14, 46],\n      [-18, 21],\n      [-2, -3],\n      [-12, 35],\n      [3, 0],\n      [0, 20],\n      [-4, 7],\n      [-4, 18],\n      [-8, 11],\n      [1, 11],\n      [-5, 5],\n      [-8, 30],\n      [-4, 7],\n      [-8, 26],\n      [-7, 15],\n      [-6, 24],\n      [-8, 14],\n      [-6, -3],\n      [-6, 7],\n      [5, 20],\n      [4, 47]\n    ],\n    [\n      [6024, 6449],\n      [0, -20],\n      [6, -21],\n      [2, -34],\n      [2, -65],\n      [5, -40],\n      [4, -8],\n      [10, -8],\n      [5, -9],\n      [1, -10],\n      [10, -6],\n      [3, -8]\n    ],\n    [\n      [5946, 5727],\n      [-6, 5],\n      [3, 17],\n      [-2, 21],\n      [-20, 35],\n      [-3, 45],\n      [2, 5],\n      [2, 31],\n      [-13, 0],\n      [0, -12],\n      [-18, 0],\n      [7, -17],\n      [0, -27],\n      [2, -11],\n      [-14, -24],\n      [-1, -9],\n      [-18, -39],\n      [-13, -4],\n      [-14, 23],\n      [-7, 8],\n      [-11, -12],\n      [-4, -17],\n      [-13, -9],\n      [-5, -10],\n      [1, -6],\n      [-23, 0],\n      [-4, 15],\n      [-22, 1],\n      [-14, -7],\n      [-11, 27],\n      [-8, 12],\n      [-2, 15],\n      [-21, -7],\n      [-3, -21],\n      [-5, -6],\n      [0, -19],\n      [-3, -6],\n      [-3, -29],\n      [-11, -12]\n    ],\n    [\n      [5634, 5812],\n      [3, 13],\n      [-1, 15],\n      [-4, -1],\n      [-7, 16],\n      [3, 23],\n      [-5, -2],\n      [0, 34],\n      [-7, 7],\n      [-6, -7],\n      [-5, 9],\n      [6, 21],\n      [7, 14],\n      [-5, 25],\n      [4, 9],\n      [9, 9],\n      [-4, 7],\n      [-1, 18],\n      [8, 6],\n      [0, 10],\n      [7, 15],\n      [2, 15],\n      [-2, 11],\n      [7, 9],\n      [12, 2],\n      [11, -2],\n      [0, 218]\n    ],\n    [\n      [5943, 5426],\n      [-14, -28],\n      [-9, 2],\n      [-3, 6],\n      [-5, -5],\n      [-13, -3],\n      [-6, -13],\n      [-7, 5],\n      [-4, 12],\n      [-7, -8],\n      [-11, 7],\n      [-8, -17]\n    ],\n    [\n      [4535, 5893],\n      [-1, 42]\n    ],\n    [\n      [4540, 5965],\n      [-5, 11],\n      [-1, 13],\n      [-14, 41],\n      [-8, 3],\n      [11, 9],\n      [8, 18],\n      [9, 33]\n    ],\n    [\n      [7884, 5266],\n      [4, -3],\n      [-4, -7],\n      [-7, 2],\n      [7, 8]\n    ],\n    [\n      [3953, 2073],\n      [22, -4],\n      [11, -7],\n      [17, -21],\n      [3, -11],\n      [-10, -7],\n      [-10, 20],\n      [-12, 11],\n      [-22, 11],\n      [1, 8]\n    ],\n    [\n      [9445, 4521],\n      [15, -17],\n      [-6, 0],\n      [-3, 9],\n      [-8, 4],\n      [2, 4]\n    ],\n    [\n      [9612, 4569],\n      [-6, -12],\n      [-3, 7],\n      [9, 5]\n    ],\n    [\n      [9481, 4595],\n      [13, -14],\n      [8, 0],\n      [5, -13],\n      [0, -8],\n      [-12, 4],\n      [-9, 10],\n      [-1, 11],\n      [-6, 3],\n      [2, 7]\n    ],\n    [\n      [9483, 4641],\n      [4, -12],\n      [0, -10],\n      [-5, 7],\n      [1, 15]\n    ],\n    [\n      [9442, 4640],\n      [13, 0],\n      [11, -20],\n      [-4, -9],\n      [-10, 7],\n      [-13, 1],\n      [-6, 13],\n      [0, 16],\n      [3, 2],\n      [6, -10]\n    ],\n    [\n      [9388, 4691],\n      [3, -9],\n      [-6, 0],\n      [3, 9]\n    ],\n    [\n      [9371, 4689],\n      [-5, 3],\n      [5, 6],\n      [0, -9]\n    ],\n    [\n      [9466, 4701],\n      [6, -16],\n      [-2, -11],\n      [5, -5],\n      [7, -34],\n      [-14, 21],\n      [-3, 10],\n      [-5, 37],\n      [6, -2]\n    ],\n    [\n      [9378, 4711],\n      [4, -3],\n      [3, -19],\n      [-7, 4],\n      [-2, 13],\n      [-9, -2],\n      [-1, 6],\n      [6, 13],\n      [5, -1],\n      [1, -11]\n    ],\n    [\n      [9365, 4716],\n      [-5, 1],\n      [-1, 9],\n      [4, 5],\n      [2, -15]\n    ],\n    [\n      [9349, 4747],\n      [6, -9],\n      [-4, -9],\n      [-5, 14],\n      [3, 4]\n    ],\n    [\n      [9405, 4746],\n      [4, 0],\n      [9, -16],\n      [12, -12],\n      [9, -15],\n      [1, -13],\n      [-7, 12],\n      [-11, 9],\n      [-18, 25],\n      [-3, 13],\n      [4, -3]\n    ],\n    [\n      [9349, 4800],\n      [13, -15],\n      [3, -16],\n      [10, -7],\n      [-2, -7],\n      [-15, 13],\n      [-7, 18],\n      [-6, 9],\n      [4, 5]\n    ],\n    [\n      [4650, 5621],\n      [2, -12],\n      [-12, 10],\n      [10, 2]\n    ],\n    [\n      [4681, 5581],\n      [-6, 9],\n      [-23, 18],\n      [1, 15],\n      [-7, 4],\n      [-6, 10],\n      [2, 3],\n      [-3, 18],\n      [-5, -4],\n      [-3, 18],\n      [7, 1],\n      [-6, 7],\n      [0, 11],\n      [4, 7],\n      [-6, 5]\n    ],\n    [\n      [2560, 5955],\n      [-2, -14],\n      [-12, 0],\n      [-13, 5],\n      [-14, 14],\n      [-14, 2],\n      [-8, 11]\n    ],\n    [\n      [6359, 5831],\n      [0, -104],\n      [-27, -84]\n    ],\n    [\n      [6201, 5844],\n      [18, -44],\n      [13, -18],\n      [15, 0],\n      [11, 15],\n      [4, 0],\n      [10, 12],\n      [11, -4],\n      [6, -7],\n      [6, 4],\n      [21, 25],\n      [8, -5],\n      [14, 3],\n      [9, 10],\n      [12, -4]\n    ],\n    [\n      [6359, 5831],\n      [14, 5],\n      [4, 7],\n      [7, 0],\n      [12, 7],\n      [13, 23],\n      [15, -9],\n      [-5, -19],\n      [-1, -18],\n      [2, -35],\n      [8, -8],\n      [-14, -6],\n      [-3, -53],\n      [-4, -8],\n      [-1, -12],\n      [-6, -10],\n      [-3, -22],\n      [-6, -20],\n      [-8, -13],\n      [0, -11],\n      [-6, -25],\n      [-10, -29],\n      [-4, -29],\n      [-12, -48],\n      [-13, -33],\n      [-7, -26],\n      [-12, -30],\n      [-14, -28],\n      [-10, -24],\n      [-9, -15],\n      [-8, -19],\n      [-21, -26],\n      [-8, -7],\n      [-18, -27],\n      [-8, -17],\n      [-10, -15],\n      [-22, -48],\n      [-11, -21],\n      [-18, -49],\n      [-9, -28]\n    ],\n    [\n      [5183, 5187],\n      [-3, -2],\n      [-1, 13],\n      [5, 8],\n      [3, -11],\n      [-4, -8]\n    ],\n    [\n      [3409, 5499],\n      [3, 3],\n      [1, 20],\n      [5, 7],\n      [8, -2],\n      [20, -10],\n      [2, 10],\n      [33, 0],\n      [18, -8],\n      [-1, -20],\n      [-3, -8]\n    ],\n    [\n      [5626, 8009],\n      [-12, -39]\n    ],\n    [\n      [5377, 7802],\n      [3, 6]\n    ],\n    [\n      [5474, 8485],\n      [-7, -30],\n      [-12, -34],\n      [0, 19],\n      [19, 45]\n    ],\n    [\n      [5521, 8514],\n      [8, 1],\n      [-8, -14],\n      [-2, -22],\n      [-10, -8],\n      [-5, 7],\n      [-1, 19],\n      [10, 16],\n      [8, 1]\n    ],\n    [\n      [5327, 8537],\n      [-2, -9],\n      [-9, 3],\n      [11, 6]\n    ],\n    [\n      [5671, 8973],\n      [-41, -2],\n      [-9, 5],\n      [1, -19],\n      [-16, 0],\n      [3, -8],\n      [-13, 0],\n      [4, -13],\n      [-10, -13],\n      [-4, -15],\n      [12, -15],\n      [-17, -17],\n      [-4, -15],\n      [-13, -13],\n      [-8, 1],\n      [-11, -13],\n      [-32, -24],\n      [0, -9],\n      [-17, -3],\n      [5, -11],\n      [-5, -7],\n      [-15, -2],\n      [5, -14],\n      [-5, -29],\n      [-7, -9],\n      [5, -32],\n      [0, -18],\n      [10, -10],\n      [10, 4],\n      [14, -25],\n      [9, -2],\n      [6, -19],\n      [-20, -23],\n      [-6, 3],\n      [8, -16],\n      [-17, -16],\n      [-18, -13],\n      [-13, -2],\n      [8, -8],\n      [-6, -3],\n      [3, -15],\n      [-10, -16],\n      [6, -8],\n      [0, -17],\n      [-6, -10],\n      [-3, -37],\n      [-3, 0],\n      [-6, -23],\n      [-5, -8],\n      [-6, 5],\n      [-27, -3],\n      [-11, -14],\n      [-2, -11],\n      [5, -10],\n      [-6, -9],\n      [-11, 3],\n      [-10, -5],\n      [-14, 2],\n      [4, 15],\n      [-14, 31],\n      [8, 6],\n      [-6, 8],\n      [8, 2],\n      [-15, 26],\n      [-18, 47],\n      [4, 27],\n      [-4, 8],\n      [-9, -4],\n      [-4, 9],\n      [-1, 39],\n      [6, -6]\n    ],\n    [\n      [5891, 3637],\n      [-3, 2],\n      [-1, -29],\n      [-12, 0],\n      [-11, 7],\n      [-9, 22],\n      [0, 24],\n      [7, 17],\n      [1, 10],\n      [8, 11],\n      [14, -15],\n      [2, 2]\n    ],\n    [\n      [3249, 6221],\n      [-2, 2]\n    ],\n    [\n      [5999, 7178],\n      [-3, 27],\n      [1, 18],\n      [-4, 4],\n      [1, 20],\n      [3, 4]\n    ],\n    [\n      [5997, 7251],\n      [7, -5],\n      [5, 9],\n      [0, 11],\n      [9, 3],\n      [-4, 14],\n      [4, 21],\n      [8, -5],\n      [2, -7],\n      [12, 0],\n      [5, 6],\n      [18, 10],\n      [10, -11],\n      [16, -3],\n      [21, 8],\n      [20, 17],\n      [22, -1],\n      [16, 7],\n      [4, 7],\n      [4, -12]\n    ],\n    [\n      [5402, 5930],\n      [5, 0],\n      [0, 13],\n      [-4, 3],\n      [-6, -5],\n      [2, -5]\n    ],\n    [\n      [5398, 5936],\n      [-1, 0]\n    ],\n    [\n      [5044, 5541],\n      [-12, -7]\n    ],\n    [\n      [7728, 5654],\n      [6, -7],\n      [0, -10],\n      [-6, -6],\n      [0, 23]\n    ],\n    [\n      [7840, 5883],\n      [5, -11],\n      [-4, 1],\n      [-1, 10]\n    ],\n    [\n      [7858, 5853],\n      [-4, 22],\n      [-5, 11],\n      [-1, -7],\n      [-12, 18],\n      [0, 8],\n      [-5, 0],\n      [-8, 10],\n      [-7, -5],\n      [-16, 5],\n      [3, 15],\n      [-3, 7],\n      [4, 21],\n      [-11, 5],\n      [-15, -8],\n      [-2, -9],\n      [4, -13],\n      [-4, -16],\n      [0, -27],\n      [2, -5],\n      [-7, -15],\n      [0, -11],\n      [-4, -13],\n      [-5, -20],\n      [0, -15],\n      [-9, -32],\n      [2, -7],\n      [-2, -27],\n      [5, -21],\n      [-3, -10],\n      [16, 5],\n      [4, -12],\n      [1, -29],\n      [9, -16],\n      [0, -12],\n      [4, -37],\n      [4, -16],\n      [-4, 4],\n      [-3, 29],\n      [-6, -2],\n      [2, -13],\n      [6, -18],\n      [6, 0],\n      [9, -18],\n      [12, 1],\n      [6, -4],\n      [6, -21],\n      [7, -12]\n    ],\n    [\n      [7780, 5554],\n      [-4, 13],\n      [-8, 12],\n      [2, 14],\n      [-6, 2],\n      [-5, 10],\n      [-2, 18],\n      [-7, 5],\n      [1, 7],\n      [-5, 11],\n      [-4, 1],\n      [-3, 18],\n      [-5, -2],\n      [-2, -12],\n      [-4, 5],\n      [-2, 18],\n      [2, 14],\n      [4, 19],\n      [0, 16],\n      [3, 16],\n      [7, 40]\n    ],\n    [\n      [6962, 7540],\n      [0, 0]\n    ],\n    [\n      [6882, 7324],\n      [1, 20],\n      [12, 24],\n      [3, 15],\n      [-7, 12],\n      [-2, 14],\n      [4, 10],\n      [-2, 9],\n      [-12, 1],\n      [0, 7],\n      [-9, 4],\n      [2, 16],\n      [8, 9],\n      [18, -6],\n      [7, 6],\n      [0, 11],\n      [8, 4],\n      [1, 14],\n      [-10, 2],\n      [13, 4],\n      [7, -3],\n      [1, 9],\n      [-4, 11],\n      [5, 14],\n      [8, -8],\n      [18, 14],\n      [5, 7],\n      [8, -18],\n      [-11, -19],\n      [7, -10],\n      [9, 3]\n    ],\n    [\n      [6497, 7333],\n      [-3, 23],\n      [2, 30],\n      [-1, 22],\n      [4, 15],\n      [-12, 17],\n      [0, 9],\n      [-11, 0],\n      [1, 8],\n      [14, 2],\n      [-9, 14],\n      [6, 10],\n      [-5, 3],\n      [-14, -3],\n      [-5, 6],\n      [0, 25],\n      [4, 9],\n      [2, 19],\n      [4, -11],\n      [13, -1],\n      [5, -8],\n      [16, 6],\n      [1, 12],\n      [8, -6],\n      [3, 14],\n      [-19, 23],\n      [-4, 34],\n      [-6, 5],\n      [-16, -3],\n      [-5, -6],\n      [-5, -17],\n      [4, 0],\n      [-3, -19],\n      [-7, 9],\n      [-3, 13]\n    ],\n    [\n      [6554, 7562],\n      [29, -5],\n      [4, 7],\n      [-4, 7],\n      [-2, 23],\n      [4, 3]\n    ],\n    [\n      [6585, 7597],\n      [4, -18],\n      [11, -2],\n      [7, 14],\n      [-6, 6],\n      [0, 13]\n    ],\n    [\n      [6601, 7610],\n      [5, 1],\n      [4, 19],\n      [7, -2],\n      [-3, 10],\n      [11, 1],\n      [2, 6],\n      [8, -12],\n      [7, -2],\n      [7, -14],\n      [13, 2],\n      [5, -8],\n      [-1, -12],\n      [6, -8],\n      [-5, -4],\n      [4, -10],\n      [-3, -10],\n      [11, -11],\n      [18, 1],\n      [6, -3],\n      [7, 6],\n      [9, -10],\n      [8, -36],\n      [4, -2],\n      [5, -29],\n      [27, -31],\n      [4, -10],\n      [13, -16],\n      [5, 2],\n      [10, -14],\n      [27, -29],\n      [7, 1],\n      [19, -14],\n      [3, -4],\n      [-4, -9],\n      [0, -25]\n    ],\n    [\n      [8444, 4645],\n      [12, 9]\n    ],\n    [\n      [8469, 4667],\n      [5, 9],\n      [1, 10],\n      [20, 8],\n      [10, -1],\n      [6, 5],\n      [3, -4],\n      [11, 10],\n      [11, -6],\n      [-13, -19],\n      [-8, -3],\n      [-4, -9],\n      [-7, -2],\n      [-6, -8],\n      [-10, -3],\n      [-15, -17]\n    ],\n    [\n      [130, 3966],\n      [6, 0],\n      [-1, -7],\n      [-5, 7]\n    ],\n    [\n      [3308, 5807],\n      [-4, -9],\n      [1, -31],\n      [-4, -4],\n      [-14, -1],\n      [-5, 4],\n      [10, 7],\n      [0, 20],\n      [-5, 5],\n      [8, 7],\n      [13, 2]\n    ],\n    [\n      [5303, 7135],\n      [4, -6],\n      [-9, -6],\n      [0, 11],\n      [5, 1]\n    ],\n    [\n      [5238, 7310],\n      [7, 2],\n      [10, 15],\n      [13, 6],\n      [17, -9],\n      [-4, -1],\n      [6, -17],\n      [-5, -4],\n      [10, -3],\n      [14, 20],\n      [3, -14],\n      [-10, -23],\n      [-6, -4],\n      [-3, -16],\n      [6, -18],\n      [11, -10],\n      [-1, -16],\n      [3, -7],\n      [-3, -11],\n      [-12, -28],\n      [-14, -14],\n      [-2, -16],\n      [4, -12],\n      [9, -10],\n      [6, 4],\n      [0, -13],\n      [11, 4],\n      [2, -20],\n      [9, -1]\n    ],\n    [\n      [5778, 7600],\n      [-2, -9],\n      [6, -15],\n      [20, -17],\n      [6, -2],\n      [-3, -13],\n      [-14, -1],\n      [-9, 6],\n      [-6, -7],\n      [-12, 1],\n      [-9, -20],\n      [-14, -10],\n      [-15, -24],\n      [2, 17],\n      [13, 10],\n      [3, 7],\n      [-20, -3],\n      [-1, 9]\n    ],\n    [\n      [5997, 7251],\n      [2, 5],\n      [-6, 17],\n      [12, 18],\n      [0, 11],\n      [-6, 7],\n      [-10, -18],\n      [-8, -3],\n      [-18, 15],\n      [-11, -13],\n      [-17, -26],\n      [-7, 1],\n      [-17, -8],\n      [-13, 9],\n      [-7, 18],\n      [-21, 18],\n      [-18, 5],\n      [-3, -3],\n      [0, -18],\n      [-5, -18],\n      [-4, 6],\n      [-13, -10],\n      [-12, 5],\n      [-7, 9],\n      [0, 16],\n      [-7, -1],\n      [-7, 9],\n      [-10, 3],\n      [-3, -6],\n      [-11, 1],\n      [-2, -6],\n      [-9, 3],\n      [8, 5],\n      [12, 0],\n      [-1, 7],\n      [8, 7],\n      [-15, -3],\n      [-12, 2],\n      [-1, 8],\n      [7, -2],\n      [-10, 13],\n      [0, 14],\n      [-5, 5],\n      [7, 4],\n      [-1, 13],\n      [-17, 7],\n      [-11, 9],\n      [7, 6],\n      [-4, 14],\n      [4, 3],\n      [5, -20],\n      [14, 8],\n      [-7, 0],\n      [-5, 16],\n      [6, 2],\n      [3, 10],\n      [-6, -2],\n      [0, 14],\n      [-6, 9],\n      [9, 16],\n      [-24, -6],\n      [2, 29],\n      [16, 25],\n      [16, 3],\n      [2, -7],\n      [11, -1],\n      [-1, 11],\n      [8, -2],\n      [-2, -7],\n      [11, 3],\n      [19, -3],\n      [1, 7],\n      [-8, 3],\n      [5, 6],\n      [27, 5],\n      [-15, 3],\n      [-11, 13],\n      [6, 13],\n      [19, -6],\n      [11, 5],\n      [15, -8],\n      [9, 1],\n      [7, 11],\n      [29, 28],\n      [14, 6],\n      [10, 9],\n      [28, -6],\n      [10, 0],\n      [10, 9],\n      [1, -10],\n      [6, -11],\n      [9, -5],\n      [10, 6],\n      [4, -16],\n      [8, -13],\n      [5, 8],\n      [12, -5],\n      [0, -6],\n      [13, -8],\n      [8, 0],\n      [15, -7],\n      [32, 11],\n      [4, -6],\n      [14, -5],\n      [12, 7],\n      [24, 20],\n      [3, 7]\n    ],\n    [\n      [8378, 6635],\n      [10, -12],\n      [-5, -8],\n      [1, -22],\n      [-6, -18],\n      [-4, -43],\n      [-3, -19],\n      [-6, -20],\n      [-4, -5],\n      [-4, -17],\n      [-1, -27],\n      [-5, 7],\n      [-1, 16],\n      [-11, 20],\n      [-2, 22],\n      [-3, 0],\n      [2, 15],\n      [0, 20],\n      [17, 58],\n      [3, 3],\n      [4, 18],\n      [12, 7],\n      [2, 9],\n      [4, -4]\n    ],\n    [\n      [6108, 4736],\n      [-7, -14],\n      [1, 11],\n      [6, 3]\n    ],\n    [\n      [6093, 4842],\n      [6, -26],\n      [-4, -4],\n      [-7, 16],\n      [0, 15],\n      [5, -1]\n    ],\n    [\n      [6102, 4899],\n      [5, -11],\n      [-3, -19],\n      [-2, 30]\n    ],\n    [\n      [5914, 5071],\n      [5, -1],\n      [2, -12],\n      [-9, 7],\n      [2, 6]\n    ],\n    [\n      [5882, 5125],\n      [1, 0]\n    ],\n    [\n      [5883, 5125],\n      [1, 0]\n    ],\n    [\n      [5884, 5125],\n      [-1, -28],\n      [-2, 0],\n      [-1, -30],\n      [-2, -20],\n      [4, 2],\n      [0, -28],\n      [2, 8],\n      [4, -3],\n      [0, 13],\n      [5, -3],\n      [-3, 10],\n      [7, 6],\n      [2, -10],\n      [12, -2],\n      [8, 5],\n      [3, -7],\n      [17, 17],\n      [-2, 8],\n      [-4, -6],\n      [-10, 4],\n      [5, 8],\n      [-3, 9],\n      [5, -1],\n      [5, 9],\n      [-1, 12],\n      [6, 0],\n      [-2, 7],\n      [8, 17]\n    ],\n    [\n      [6088, 4913],\n      [1, -10],\n      [-4, -16],\n      [-3, -25],\n      [-5, -21],\n      [2, -26],\n      [5, -5],\n      [12, -22],\n      [2, -15],\n      [-4, -5],\n      [-4, -23],\n      [1, -10],\n      [4, -2],\n      [0, -13],\n      [-4, -14],\n      [2, -25],\n      [4, -7],\n      [0, -16],\n      [4, -4],\n      [0, -15],\n      [4, -21],\n      [-2, -8],\n      [15, -16],\n      [5, -14]\n    ],\n    [\n      [5971, 4516],\n      [-2, 9]\n    ],\n    [\n      [5969, 4527],\n      [-5, 7]\n    ],\n    [\n      [5964, 4536],\n      [-4, 14],\n      [2, 20],\n      [-2, 4],\n      [-1, 30],\n      [-7, 20]\n    ],\n    [\n      [5949, 4630],\n      [-3, 4]\n    ],\n    [\n      [5946, 4635],\n      [-4, -2],\n      [-1, -10]\n    ],\n    [\n      [5914, 4641],\n      [-12, 10],\n      [-3, 6],\n      [-13, 6],\n      [-6, 6],\n      [-4, 13],\n      [-11, 6]\n    ],\n    [\n      [5865, 4688],\n      [0, 10],\n      [-4, 5],\n      [-1, 11],\n      [-11, 36],\n      [1, 11],\n      [-3, 8],\n      [2, 12],\n      [-5, 9],\n      [-7, 21],\n      [-6, -1],\n      [-6, 12],\n      [0, 13],\n      [6, 7],\n      [-5, 32],\n      [1, 21],\n      [-6, 5],\n      [2, 27]\n    ],\n    [\n      [5846, 5121],\n      [10, 4],\n      [26, 0]\n    ],\n    [\n      [5883, 5125],\n      [1, 0]\n    ],\n    [\n      [5944, 5197],\n      [-8, -3],\n      [1, 8],\n      [-8, -8],\n      [-3, 15],\n      [-5, -3],\n      [-2, -12],\n      [-6, -7],\n      [0, 7],\n      [-6, -6],\n      [0, 10],\n      [-8, -17],\n      [-9, 0],\n      [-4, -9],\n      [3, -7],\n      [-9, -26],\n      [2, -14]\n    ],\n    [\n      [5823, 5155],\n      [5, 6],\n      [2, 14],\n      [-6, 2]\n    ],\n    [\n      [5846, 5254],\n      [4, -12],\n      [9, 28],\n      [10, 11],\n      [3, 11],\n      [-1, 25],\n      [-3, -9]\n    ],\n    [\n      [6061, 7895],\n      [-18, 0],\n      [-6, -11],\n      [-4, 2],\n      [-12, -13],\n      [-4, 3],\n      [-22, -8],\n      [-14, -18],\n      [-4, 3],\n      [-11, -12],\n      [4, -22],\n      [15, -28],\n      [18, 10],\n      [13, -3],\n      [-5, -9],\n      [1, -11],\n      [-17, -4],\n      [-9, 7],\n      [-4, -10],\n      [-23, -12],\n      [-12, -18],\n      [-10, -2],\n      [-11, 11],\n      [5, 5],\n      [1, 24],\n      [-8, 3],\n      [-11, 13],\n      [-9, -2],\n      [-1, 8],\n      [24, 21],\n      [8, 2],\n      [-1, 14],\n      [-6, -3],\n      [-5, 10],\n      [-3, -6],\n      [-18, -3],\n      [-17, 14],\n      [4, 8],\n      [-7, 6],\n      [17, -5],\n      [4, 9],\n      [-11, -4],\n      [-6, 5],\n      [-25, -2],\n      [-24, -46],\n      [-5, 1],\n      [-10, -23],\n      [4, 2],\n      [-3, -14]\n    ],\n    [\n      [5836, 7853],\n      [9, -17],\n      [2, 3],\n      [-11, 14]\n    ],\n    [\n      [5948, 7848],\n      [0, -9],\n      [-11, 7],\n      [3, -13],\n      [4, 5],\n      [21, -17],\n      [6, -8],\n      [4, -20],\n      [9, -4],\n      [-12, 23],\n      [-7, 26],\n      [-10, -6],\n      [-7, 16]\n    ],\n    [\n      [3523, 3302],\n      [-5, -5],\n      [0, -12],\n      [-8, -5],\n      [3, -30]\n    ],\n    [\n      [3517, 3240],\n      [-4, -18],\n      [-7, -13],\n      [0, -7],\n      [-13, -16],\n      [-20, -17],\n      [-12, 10],\n      [-14, 0],\n      [-7, -8],\n      [-20, 15],\n      [-8, 13],\n      [-18, -1],\n      [-16, 29],\n      [-2, 10],\n      [3, 27],\n      [-1, 10],\n      [9, 9],\n      [-4, 31]\n    ],\n    [\n      [677, 6342],\n      [13, -11],\n      [2, -12],\n      [8, -13],\n      [-6, -10],\n      [-16, -13],\n      [-3, -11],\n      [-7, 9],\n      [1, 15],\n      [-4, 25],\n      [5, 12],\n      [-1, 17],\n      [8, -8]\n    ],\n    [\n      [649, 6394],\n      [3, -7],\n      [7, 2],\n      [8, -8],\n      [0, -7],\n      [-9, -6],\n      [-4, 2],\n      [0, 10],\n      [-7, 7],\n      [2, 7]\n    ],\n    [\n      [631, 6405],\n      [16, -4],\n      [-2, -5],\n      [-15, 2],\n      [1, 7]\n    ],\n    [\n      [613, 6427],\n      [6, -8],\n      [1, -12],\n      [-13, 2],\n      [-3, 14],\n      [7, 10],\n      [2, -6]\n    ],\n    [\n      [571, 6463],\n      [4, -3],\n      [-1, -14],\n      [-8, -3],\n      [-6, 11],\n      [11, 9]\n    ],\n    [\n      [2301, 6687],\n      [-6, 35],\n      [0, 12],\n      [6, -47]\n    ],\n    [\n      [2761, 6828],\n      [-2, -18],\n      [-2, 17],\n      [4, 1]\n    ],\n    [\n      [2366, 6873],\n      [3, -1],\n      [-11, -13],\n      [8, 14]\n    ],\n    [\n      [1707, 7111],\n      [7, -9],\n      [-6, 0],\n      [-1, 9]\n    ],\n    [\n      [1671, 7144],\n      [8, -4],\n      [-8, -2],\n      [0, 6]\n    ],\n    [\n      [2993, 7551],\n      [-6, -11],\n      [8, 7],\n      [8, -1],\n      [-20, -15],\n      [-36, -12],\n      [-4, 1],\n      [4, 11],\n      [7, 6],\n      [29, 6],\n      [10, 8]\n    ],\n    [\n      [2582, 7791],\n      [0, -10],\n      [-7, -17],\n      [-3, 8],\n      [10, 19]\n    ],\n    [\n      [2679, 7836],\n      [1, -8],\n      [-10, 3],\n      [9, 5]\n    ],\n    [\n      [2563, 7913],\n      [-19, -17],\n      [-6, 0],\n      [5, 14],\n      [8, 6],\n      [12, -3]\n    ],\n    [\n      [2541, 7956],\n      [-2, -6],\n      [-15, -14],\n      [0, 8],\n      [17, 12]\n    ],\n    [\n      [1595, 7969],\n      [-3, -9],\n      [8, -13],\n      [-1, -5],\n      [-9, 17],\n      [5, 10]\n    ],\n    [\n      [1582, 8004],\n      [-1, 0]\n    ],\n    [\n      [2511, 7947],\n      [-14, -11],\n      [-19, -11],\n      [-20, -29],\n      [-17, -21],\n      [9, -3],\n      [22, 14],\n      [6, 0],\n      [-5, -19],\n      [14, -2],\n      [11, 5],\n      [7, 9],\n      [14, 4],\n      [10, 7],\n      [7, 13],\n      [7, -14],\n      [-1, -10],\n      [10, 6],\n      [9, -1],\n      [12, -22],\n      [11, 0],\n      [9, -4],\n      [14, 14],\n      [18, -2],\n      [13, 6],\n      [0, -17],\n      [15, -1]\n    ],\n    [\n      [2663, 7852],\n      [-3, -10],\n      [9, -12],\n      [-16, 1],\n      [-5, 4],\n      [-2, -11],\n      [-7, 9],\n      [-15, 5],\n      [-3, -7],\n      [-25, -7],\n      [-13, 0],\n      [-15, -39],\n      [-3, -12],\n      [-10, -17],\n      [2, -8],\n      [10, 17],\n      [7, -3],\n      [-11, -49],\n      [1, -13],\n      [-6, -26],\n      [0, -14],\n      [4, -15],\n      [-2, -28],\n      [9, -33],\n      [8, -4],\n      [16, 14],\n      [7, 22],\n      [5, 26],\n      [0, 15],\n      [-9, 37],\n      [3, 10],\n      [-3, 17],\n      [8, 20],\n      [0, 14],\n      [5, 15],\n      [7, 2],\n      [7, 15],\n      [-3, -22],\n      [4, -4],\n      [4, 14],\n      [0, 16],\n      [11, 5],\n      [-3, 15],\n      [9, 10],\n      [13, -8],\n      [6, -11],\n      [16, -7],\n      [6, -13],\n      [-4, -11],\n      [4, -6],\n      [-1, -28],\n      [-6, -5],\n      [-1, -13],\n      [-7, -2],\n      [-3, -18],\n      [6, -5],\n      [7, 6],\n      [6, 16],\n      [9, 5],\n      [7, -10],\n      [4, -37],\n      [3, -14]\n    ],\n    [\n      [2704, 7634],\n      [-5, 5],\n      [-3, -17],\n      [-6, -8],\n      [-3, -17],\n      [-6, -12],\n      [15, -11],\n      [7, 0],\n      [5, -7],\n      [9, 4],\n      [14, 3],\n      [9, 12],\n      [24, 15],\n      [26, 21],\n      [14, 21],\n      [5, 2],\n      [-1, 17],\n      [-5, 3]\n    ],\n    [\n      [2804, 7674],\n      [10, 6],\n      [16, 2],\n      [13, -8],\n      [18, 0],\n      [8, 5],\n      [15, 19],\n      [-3, 9],\n      [4, 4],\n      [-7, 11],\n      [15, 16],\n      [1, 7]\n    ],\n    [\n      [3116, 7818],\n      [10, -9]\n    ],\n    [\n      [3134, 7784],\n      [3, -9],\n      [-3, -20],\n      [-20, -16],\n      [-6, 5],\n      [-13, -5],\n      [1, -9],\n      [-12, 11],\n      [-3, -22],\n      [-14, -14],\n      [-10, 3],\n      [-8, -8],\n      [1, -9],\n      [-11, -15],\n      [-6, -22],\n      [1, -15],\n      [5, 1],\n      [-13, -19],\n      [9, -7],\n      [5, -23],\n      [17, -8],\n      [-14, -3],\n      [-6, -6],\n      [0, 11],\n      [-15, -14],\n      [0, 12],\n      [-5, 5],\n      [-1, -17],\n      [-12, -9],\n      [-29, -2],\n      [-6, -9],\n      [-8, -1],\n      [-23, -27],\n      [-1, -10],\n      [8, -1],\n      [-2, -29],\n      [-3, -14],\n      [-7, -9],\n      [-1, -11],\n      [-12, -24],\n      [-1, 15],\n      [-7, 2],\n      [-10, 13],\n      [3, -23],\n      [9, -21],\n      [1, -16],\n      [-10, -31],\n      [-7, -13],\n      [-8, -30],\n      [-2, 11],\n      [4, 20],\n      [6, 17],\n      [-6, -2],\n      [1, 9],\n      [-13, 21],\n      [-1, 17],\n      [4, 11],\n      [-2, 15],\n      [11, 15],\n      [-5, 0],\n      [-11, -10],\n      [2, -16],\n      [-4, -6],\n      [0, -23],\n      [4, -6],\n      [1, -20],\n      [-9, 11],\n      [-8, -2],\n      [9, -4],\n      [11, -13],\n      [-2, -17],\n      [-6, 3],\n      [8, -12],\n      [-7, -12],\n      [6, -8],\n      [-4, -8],\n      [12, -4],\n      [5, -35],\n      [7, -23],\n      [-5, 9],\n      [-6, 38],\n      [-2, -15],\n      [6, -17],\n      [-9, 5],\n      [0, -7],\n      [-15, -4],\n      [-2, -6],\n      [15, 3],\n      [13, -8],\n      [-1, -17],\n      [-3, 2],\n      [-5, -13],\n      [-13, 1],\n      [-2, 9],\n      [-4, -8],\n      [7, -6],\n      [-2, -11],\n      [-11, -8],\n      [17, -2],\n      [-7, -11],\n      [-15, -4],\n      [-15, -18],\n      [-9, -27],\n      [-11, 1],\n      [-13, -12],\n      [-5, -10],\n      [-4, -21],\n      [-22, -32],\n      [-14, -8],\n      [1, -8],\n      [-12, -15],\n      [1, -5],\n      [-11, -14],\n      [-3, -12],\n      [2, -18],\n      [-4, -5],\n      [-3, -19],\n      [8, -63],\n      [9, -38],\n      [9, -26],\n      [-5, 0],\n      [0, -10],\n      [18, -75],\n      [3, -31],\n      [-2, -12],\n      [-1, -28],\n      [-4, -11],\n      [-4, -29],\n      [-12, -1],\n      [-7, -4],\n      [0, 14],\n      [-6, 25],\n      [-6, 7],\n      [-6, 0],\n      [-3, 31],\n      [-6, 5],\n      [0, 20],\n      [-7, -2],\n      [-6, 21],\n      [-3, 18],\n      [7, 15],\n      [-1, 8],\n      [-7, 6],\n      [0, -19],\n      [-5, 8],\n      [2, 21],\n      [4, 14],\n      [0, 26],\n      [-4, 16],\n      [-7, 0],\n      [-10, 20],\n      [-6, 20],\n      [-11, 14],\n      [-10, -4],\n      [-10, -15],\n      [-16, -5],\n      [0, 7],\n      [-11, 20],\n      [-22, 14],\n      [-15, -1],\n      [-2, 9],\n      [-4, -11],\n      [-14, -5],\n      [-4, 7],\n      [-1, 16],\n      [-3, 2],\n      [-2, -22],\n      [-5, 5],\n      [-5, -5],\n      [-10, 6],\n      [-14, -7],\n      [-7, -9],\n      [-11, 7],\n      [-4, 7],\n      [-8, -12],\n      [2, -7],\n      [10, -1],\n      [3, 4],\n      [6, -14],\n      [5, 12],\n      [3, -3],\n      [-8, -29],\n      [4, -8],\n      [11, -5],\n      [3, -9],\n      [-4, -9],\n      [-3, 10],\n      [-15, 9],\n      [2, 4],\n      [-12, 11],\n      [4, -9],\n      [-2, -16],\n      [-10, 12],\n      [-8, -14],\n      [-15, 9],\n      [0, 13],\n      [-7, 3],\n      [-3, 12],\n      [-6, 5],\n      [-9, -8],\n      [4, -6],\n      [-13, -2],\n      [-21, 13],\n      [-16, -5],\n      [2, 17],\n      [-8, -18],\n      [-17, -13],\n      [-1, 19],\n      [-8, -5],\n      [-1, -9],\n      [4, -12],\n      [-8, -12],\n      [1, -4],\n      [-14, -18],\n      [-16, -9],\n      [-12, 8],\n      [1, -9],\n      [6, -8],\n      [-7, -6],\n      [-5, 6],\n      [1, -12],\n      [-12, -8],\n      [1, -14],\n      [-7, -33],\n      [-3, -26],\n      [7, -32],\n      [1, -16],\n      [3, -1]\n    ],\n    [\n      [2245, 6713],\n      [1, 7],\n      [-9, 21]\n    ],\n    [\n      [2193, 6879],\n      [-7, 10]\n    ],\n    [\n      [1746, 7056],\n      [-4, 10],\n      [-2, 27],\n      [-8, 16],\n      [-15, 18],\n      [-6, 2],\n      [-3, 12],\n      [-9, 0],\n      [-10, 6],\n      [-10, 18],\n      [-21, 3],\n      [-9, 5],\n      [0, 33],\n      [-7, 5],\n      [0, 12],\n      [-12, 15],\n      [-5, 18],\n      [-9, 13],\n      [-4, 23],\n      [5, 9],\n      [-3, 11],\n      [-6, -1],\n      [-8, 13],\n      [-3, 21],\n      [3, 5],\n      [9, -11],\n      [-10, 29],\n      [8, 6],\n      [-7, 6],\n      [-2, -19],\n      [-16, 13],\n      [5, 3],\n      [-7, 20],\n      [-7, 6],\n      [-10, 20],\n      [1, 10],\n      [-4, 16],\n      [2, 10],\n      [-2, 15],\n      [-7, 17],\n      [-8, 9],\n      [0, 19],\n      [8, 15],\n      [-2, 17],\n      [3, 16],\n      [-2, 16],\n      [-5, 5],\n      [3, 12],\n      [-5, 8],\n      [-1, 32],\n      [-5, 10],\n      [9, 41],\n      [4, 25],\n      [2, 52],\n      [2, 11],\n      [1, 62],\n      [13, 7],\n      [-14, -2],\n      [1, 29],\n      [-4, -2],\n      [6, 13],\n      [-7, 6],\n      [-10, 44],\n      [-7, 20],\n      [6, 11],\n      [15, -11],\n      [24, 0],\n      [7, -6],\n      [4, -14],\n      [-9, -15],\n      [12, 8],\n      [2, -20],\n      [-7, -10],\n      [2, -4],\n      [10, 14],\n      [-1, 29],\n      [5, 8],\n      [-5, 18],\n      [-9, 6],\n      [8, 12],\n      [-10, 16],\n      [1, 6]\n    ],\n    [\n      [60, 8169],\n      [1, -9],\n      [-11, 9],\n      [10, 0]\n    ],\n    [\n      [80, 8161],\n      [-11, 0],\n      [12, 11],\n      [-1, -11]\n    ],\n    [\n      [96, 8175],\n      [2, -14],\n      [-10, 0],\n      [1, 14],\n      [7, 0]\n    ],\n    [\n      [177, 8186],\n      [18, -5],\n      [-12, -3],\n      [-15, 5],\n      [9, 3]\n    ],\n    [\n      [162, 8200],\n      [5, -4],\n      [-4, -12],\n      [-7, -4],\n      [-27, -2],\n      [22, 6],\n      [9, 7],\n      [-7, 4],\n      [9, 5]\n    ],\n    [\n      [9827, 8206],\n      [-2, -8],\n      [-9, 2],\n      [11, 6]\n    ],\n    [\n      [9802, 8235],\n      [12, -10],\n      [-11, -5],\n      [-1, 15]\n    ],\n    [\n      [332, 8268],\n      [5, -12],\n      [-32, -29],\n      [11, 24],\n      [7, 1],\n      [-1, 9],\n      [10, 7]\n    ],\n    [\n      [367, 8291],\n      [6, -8],\n      [9, 8],\n      [-9, -15],\n      [8, 1],\n      [-14, -16],\n      [-4, 1],\n      [-20, -13],\n      [-6, 4],\n      [19, 9],\n      [1, 25],\n      [10, 4]\n    ],\n    [\n      [391, 8303],\n      [7, -5],\n      [-10, -3],\n      [3, 8]\n    ],\n    [\n      [451, 8354],\n      [5, -1],\n      [6, -16],\n      [-8, -9],\n      [-16, 0],\n      [-4, -9],\n      [-14, -3],\n      [-3, 11],\n      [7, 3],\n      [10, 16],\n      [3, -2],\n      [14, 10]\n    ],\n    [\n      [1304, 8361],\n      [8, -30],\n      [-14, 25],\n      [6, 5]\n    ],\n    [\n      [558, 8363],\n      [-9, -20],\n      [4, 19],\n      [5, 1]\n    ],\n    [\n      [1355, 8404],\n      [7, -16],\n      [-1, -16],\n      [-6, -11],\n      [-13, 9],\n      [-5, 8],\n      [5, 20],\n      [13, 6]\n    ],\n    [\n      [1295, 8417],\n      [2, -9],\n      [-14, -4],\n      [5, 11],\n      [7, 2]\n    ],\n    [\n      [1319, 8419],\n      [9, -1],\n      [0, -12],\n      [-13, 5],\n      [4, 8]\n    ],\n    [\n      [1289, 8428],\n      [10, -1],\n      [4, -16],\n      [13, -7],\n      [9, -30],\n      [9, -9],\n      [-1, -33],\n      [-16, 17],\n      [2, 8],\n      [-21, 10],\n      [8, 20],\n      [-11, -1],\n      [6, 13],\n      [-3, 17],\n      [-9, 2],\n      [0, 10]\n    ],\n    [\n      [1315, 8433],\n      [-5, -12],\n      [-6, 8],\n      [11, 4]\n    ],\n    [\n      [1328, 8428],\n      [4, -13],\n      [-9, 9],\n      [0, 12],\n      [5, -8]\n    ],\n    [\n      [1308, 8454],\n      [9, -14],\n      [-10, -3],\n      [1, 17]\n    ],\n    [\n      [1278, 8457],\n      [7, -4],\n      [1, -11],\n      [-6, -6],\n      [-6, -28],\n      [-3, 4],\n      [0, 20],\n      [-4, 26],\n      [11, -1]\n    ],\n    [\n      [1283, 8470],\n      [24, -10],\n      [-2, -17],\n      [-9, 13],\n      [7, -18],\n      [-16, -4],\n      [0, 23],\n      [-10, 9],\n      [6, 4]\n    ],\n    [\n      [745, 8475],\n      [8, 0],\n      [-14, -10],\n      [6, 10]\n    ],\n    [\n      [1234, 8479],\n      [-1, -12],\n      [-6, -2],\n      [-1, 19],\n      [8, -5]\n    ],\n    [\n      [1237, 8491],\n      [8, 2],\n      [9, -14],\n      [7, -29],\n      [-1, -30],\n      [-5, 0],\n      [-13, 33],\n      [-1, 15],\n      [-10, 18],\n      [6, 5]\n    ],\n    [\n      [749, 8519],\n      [11, 0],\n      [7, -8],\n      [-2, -10],\n      [8, 0],\n      [-4, -10],\n      [-18, 4],\n      [10, -7],\n      [-18, -9],\n      [-14, -22],\n      [-10, -6],\n      [6, 10],\n      [-12, -1],\n      [-12, 22],\n      [3, 14],\n      [7, 7],\n      [10, 0],\n      [7, -19],\n      [-4, 28],\n      [5, 5],\n      [16, -5],\n      [-3, 10],\n      [7, -3]\n    ],\n    [\n      [1229, 8536],\n      [23, -12],\n      [-1, -13],\n      [-7, -1],\n      [-18, 12],\n      [14, -15],\n      [13, 1],\n      [1, -16],\n      [-7, 0],\n      [-19, 17],\n      [7, -17],\n      [-4, -6],\n      [-8, 6],\n      [-1, 10],\n      [-12, 12],\n      [1, 20],\n      [18, 2]\n    ],\n    [\n      [1252, 8544],\n      [6, -11],\n      [14, -6],\n      [8, -16],\n      [-2, -5],\n      [2, -21],\n      [-19, -19],\n      [-1, 12],\n      [4, 10],\n      [-5, 13],\n      [-7, 43]\n    ],\n    [\n      [761, 8550],\n      [18, -11],\n      [-6, -8],\n      [-18, -4],\n      [-10, 2],\n      [1, 9],\n      [10, 1],\n      [5, 11]\n    ],\n    [\n      [913, 8659],\n      [5, -3],\n      [-25, -29],\n      [20, 32]\n    ],\n    [\n      [385, 8661],\n      [13, -6],\n      [2, -22],\n      [-19, -5],\n      [-10, 2],\n      [-19, 13],\n      [-4, 7],\n      [16, 0],\n      [9, 9],\n      [12, 2]\n    ],\n    [\n      [929, 8665],\n      [13, -4],\n      [-15, -9],\n      [2, 13]\n    ],\n    [\n      [897, 8667],\n      [-2, -19],\n      [-4, 10],\n      [6, 9]\n    ],\n    [\n      [231, 8857],\n      [0, -6],\n      [17, -7],\n      [20, 7],\n      [23, -20],\n      [21, -2],\n      [-2, -9],\n      [-15, 1],\n      [-9, -13],\n      [-3, 10],\n      [-28, 19],\n      [-17, -8],\n      [-13, 10],\n      [6, 18]\n    ],\n    [\n      [1387, 8402],\n      [-3, -8],\n      [4, -28],\n      [-10, -21],\n      [-9, -8],\n      [-7, 2],\n      [-3, 23],\n      [6, 6],\n      [-1, 24],\n      [-15, 16],\n      [-8, -7],\n      [-7, -22],\n      [-9, 13],\n      [7, 4],\n      [5, 24],\n      [-18, 22],\n      [-11, 25],\n      [-19, 8],\n      [12, 9],\n      [-11, 10],\n      [-3, 12],\n      [14, -6],\n      [-15, 12],\n      [-15, 23],\n      [-16, 11],\n      [-4, 24],\n      [-6, 1],\n      [-1, 17],\n      [-6, -11],\n      [7, -17],\n      [1, -24],\n      [-13, 11],\n      [-8, -2],\n      [2, 13],\n      [-8, 12],\n      [-3, -4],\n      [-17, 8],\n      [19, -18],\n      [2, -12],\n      [-9, -4],\n      [-20, 5],\n      [-23, 23],\n      [-9, 16],\n      [-34, 19],\n      [-11, 9],\n      [12, 10],\n      [-5, 11],\n      [-18, -12],\n      [-9, 0],\n      [-21, 9],\n      [3, 11],\n      [-13, -5],\n      [-31, 8],\n      [-30, -6],\n      [-12, 12],\n      [-16, 5],\n      [3, 18],\n      [-11, -14],\n      [-21, 5],\n      [9, 13],\n      [-18, -1],\n      [-16, 19],\n      [-12, 1],\n      [-2, -7],\n      [-15, -3],\n      [-3, 6],\n      [9, 19],\n      [-17, -18],\n      [2, -20],\n      [8, -8],\n      [-6, -3],\n      [-8, -27],\n      [-18, 1],\n      [-5, -5],\n      [-2, 13],\n      [-12, -25],\n      [-13, 3],\n      [-7, -13],\n      [-19, -17],\n      [-16, -2],\n      [-6, 6],\n      [3, 9],\n      [19, 10],\n      [2, 8],\n      [-11, -6],\n      [-10, 7],\n      [4, 16],\n      [8, 10],\n      [5, 19],\n      [-5, 8],\n      [27, 21],\n      [6, -6],\n      [18, 3],\n      [-14, 10],\n      [4, 5],\n      [-19, 4],\n      [-15, -15],\n      [-9, -2],\n      [-20, -27],\n      [-7, -16],\n      [-11, -2],\n      [9, -10],\n      [-18, -24],\n      [-11, 0],\n      [-4, -11],\n      [-9, -5],\n      [-3, -20],\n      [10, 3],\n      [13, -8],\n      [2, -6],\n      [-11, -12],\n      [-5, 0],\n      [-14, -31],\n      [-4, 7],\n      [-2, -11],\n      [-12, 1],\n      [-9, -17],\n      [-9, 2],\n      [-2, -13],\n      [-10, -1],\n      [-14, -15],\n      [7, -5],\n      [-7, -12],\n      [-5, 4],\n      [-12, -16],\n      [-17, -5],\n      [-2, -11],\n      [-13, -1],\n      [-4, -8],\n      [7, -10],\n      [-10, -4],\n      [-1, -7],\n      [-22, -6],\n      [-5, -17],\n      [-6, 16],\n      [-20, -21],\n      [-10, 2],\n      [-12, -10],\n      [-5, 2],\n      [6, 12],\n      [-10, 1],\n      [-6, -22],\n      [-9, -11],\n      [-12, 8],\n      [-4, -14],\n      [-7, 2],\n      [-9, -9],\n      [0, 18],\n      [10, 3],\n      [22, 30],\n      [12, 12],\n      [9, 3],\n      [34, -7],\n      [-10, 9],\n      [5, 17],\n      [16, 15],\n      [24, 17],\n      [9, -4],\n      [-1, 15],\n      [10, 16],\n      [18, 15],\n      [2, 46],\n      [12, 18],\n      [5, 16],\n      [-8, -7],\n      [-25, -13],\n      [-11, 12],\n      [1, 10],\n      [-9, -10],\n      [4, -20],\n      [-11, -2],\n      [-14, 29],\n      [-8, -10],\n      [-12, 17],\n      [-19, -11],\n      [-20, -18],\n      [-11, 4],\n      [11, 7],\n      [-1, 13],\n      [6, 7],\n      [-12, 2],\n      [0, 15],\n      [7, 6],\n      [-20, 46],\n      [-1, -17],\n      [-16, -8],\n      [-23, -4],\n      [-9, 6],\n      [-13, 23],\n      [-19, 12],\n      [20, 19],\n      [18, -3],\n      [7, -12],\n      [9, 7],\n      [-4, 7],\n      [-29, 2],\n      [-20, 20],\n      [-7, -6],\n      [-9, 14],\n      [0, 21],\n      [-6, 7],\n      [15, 2],\n      [-4, 13],\n      [18, 26],\n      [8, -3],\n      [-3, 14],\n      [5, 17],\n      [11, 0],\n      [-8, 7],\n      [7, 5],\n      [17, 0],\n      [2, -11],\n      [17, 1],\n      [20, 24],\n      [25, -1],\n      [18, 17],\n      [-6, 30],\n      [-13, 9],\n      [10, 4],\n      [9, 13],\n      [-10, 12],\n      [-41, -24],\n      [-17, -5],\n      [-12, 9],\n      [-18, 0],\n      [-19, -8],\n      [-33, 8],\n      [-8, 6],\n      [3, 12],\n      [-11, 10],\n      [7, 9],\n      [13, 2],\n      [-38, 8],\n      [-18, 10],\n      [37, 28],\n      [24, 9],\n      [16, 13],\n      [16, 7],\n      [29, 2],\n      [-7, -11],\n      [7, -19],\n      [26, 2],\n      [24, -8],\n      [11, 18],\n      [13, -3],\n      [-13, 10],\n      [-11, -2],\n      [-2, 11],\n      [-15, 10],\n      [-5, 9],\n      [9, 3],\n      [7, -17],\n      [12, -11],\n      [10, 4],\n      [14, -9],\n      [16, 2],\n      [-3, 14],\n      [-23, 0],\n      [-9, -7],\n      [-10, 10],\n      [2, 20],\n      [-23, -2],\n      [-30, 5],\n      [-10, 27],\n      [-34, 25],\n      [-20, 9],\n      [-16, 11],\n      [9, 17],\n      [0, 14],\n      [16, -2],\n      [37, 4],\n      [19, 11],\n      [15, 16],\n      [2, 19],\n      [29, 33],\n      [26, 0],\n      [45, 27],\n      [39, 4],\n      [21, 14],\n      [12, 13],\n      [33, -7],\n      [-12, -12],\n      [11, -6],\n      [16, 16],\n      [13, -7],\n      [2, -12],\n      [19, 5],\n      [38, -1],\n      [9, -4],\n      [-12, -15],\n      [24, 0],\n      [-6, -6],\n      [32, 3],\n      [11, -5],\n      [30, 5],\n      [31, -8],\n      [27, -11],\n      [40, 0],\n      [30, -12],\n      [40, 9],\n      [52, -27],\n      [12, 0]\n    ],\n    [\n      [2912, 6333],\n      [-2, -4]\n    ],\n    [\n      [2914, 6329],\n      [-1, 4]\n    ],\n    [\n      [6651, 7782],\n      [-7, -26],\n      [12, -19],\n      [-3, -12],\n      [11, 5],\n      [3, 8],\n      [-2, 16],\n      [3, 11]\n    ],\n    [\n      [6601, 7610],\n      [-7, 11],\n      [-5, -2],\n      [-4, -22]\n    ],\n    [\n      [6627, 7805],\n      [-10, -35],\n      [2, -18],\n      [4, -10],\n      [9, 17],\n      [-3, 20],\n      [3, 6],\n      [-1, 16]\n    ],\n    [\n      [3301, 5940],\n      [-4, 4],\n      [5, 8],\n      [-1, -12]\n    ],\n    [\n      [3313, 5694],\n      [1, -6],\n      [-5, -8],\n      [-9, -2],\n      [1, 7],\n      [12, 9]\n    ],\n    [\n      [3303, 5691],\n      [4, 12],\n      [2, -5],\n      [-6, -7]\n    ],\n    [\n      [3228, 5816],\n      [-8, -8],\n      [-9, 6],\n      [4, 7],\n      [6, -5],\n      [4, 10],\n      [3, -10]\n    ],\n    [\n      [3018, 5865],\n      [-3, -7],\n      [-14, -7],\n      [0, -13],\n      [10, -38],\n      [-1, -16],\n      [-4, -6],\n      [-10, -30],\n      [5, -18],\n      [6, -7],\n      [-1, -15],\n      [6, -5],\n      [9, 7],\n      [5, 10],\n      [-1, 32],\n      [-11, 30],\n      [-2, 23],\n      [3, 10],\n      [4, 0],\n      [12, 13],\n      [18, 8],\n      [5, 9],\n      [8, -2],\n      [-2, 13],\n      [-11, -5],\n      [-2, 13],\n      [2, 16],\n      [5, 5],\n      [6, -10],\n      [2, -22],\n      [4, -10],\n      [12, 3],\n      [15, -10],\n      [7, -12],\n      [4, -15],\n      [-2, -7],\n      [5, -15],\n      [8, -1],\n      [17, 4],\n      [6, 4],\n      [21, 2],\n      [11, -20],\n      [11, -9],\n      [11, -5],\n      [8, 2],\n      [4, 9],\n      [5, 0],\n      [2, 8],\n      [20, 5],\n      [-5, 5],\n      [-9, 1],\n      [10, 6],\n      [7, -3],\n      [11, 6],\n      [12, 1],\n      [16, -4],\n      [8, 4],\n      [-2, -6],\n      [-10, -6],\n      [-16, 0],\n      [1, -9],\n      [5, -5],\n      [1, -12],\n      [-9, -1],\n      [5, -4],\n      [8, 8],\n      [5, -25],\n      [2, 17],\n      [11, -10],\n      [7, -3],\n      [-2, 7],\n      [13, -19],\n      [4, 1],\n      [7, -12],\n      [-9, -24],\n      [-3, -22],\n      [-12, 0],\n      [10, -11],\n      [3, 6],\n      [14, 6],\n      [6, -4],\n      [3, 6],\n      [9, -4]\n    ],\n    [\n      [7888, 5785],\n      [0, -17],\n      [-4, 12],\n      [4, 5]\n    ],\n    [\n      [7999, 6420],\n      [-7, 1],\n      [-4, -12],\n      [-7, -3],\n      [1, -12],\n      [-6, -6],\n      [-5, 4],\n      [-9, -2],\n      [4, -16],\n      [-8, -8],\n      [2, -17],\n      [-7, -4],\n      [-4, -11],\n      [-7, -4],\n      [-3, -15],\n      [-1, -23],\n      [-5, -13],\n      [7, -30],\n      [7, -15],\n      [11, -17],\n      [-1, -15],\n      [8, -21],\n      [9, -14],\n      [4, -12],\n      [16, -29],\n      [6, -2],\n      [16, -47],\n      [8, -11],\n      [1, -21],\n      [5, -18],\n      [-2, -5],\n      [6, -25],\n      [0, -35],\n      [2, -3],\n      [0, -23],\n      [3, -13],\n      [-6, -10],\n      [0, -42],\n      [-3, -5],\n      [4, -7],\n      [-4, -10],\n      [-2, 4],\n      [0, -16],\n      [-7, -2],\n      [-2, -8],\n      [-4, 0],\n      [-8, -14],\n      [-6, -1],\n      [-2, -13],\n      [-5, 0],\n      [-11, -13],\n      [-13, 0],\n      [-5, 12],\n      [1, -23],\n      [-11, 2],\n      [11, -9],\n      [-4, -11],\n      [-6, 4],\n      [7, -11],\n      [-3, -2],\n      [-12, 24],\n      [0, -5],\n      [10, -18],\n      [2, -11],\n      [-5, -6],\n      [-10, 15],\n      [4, -19],\n      [-1, -6],\n      [-17, -13],\n      [-12, -29],\n      [-11, -2],\n      [5, 9],\n      [-2, 10],\n      [0, 36],\n      [2, 17],\n      [6, 7],\n      [-10, 15],\n      [-5, -5],\n      [-3, 16]\n    ],\n    [\n      [9706, 4050],\n      [-7, 13],\n      [4, 7],\n      [3, -20]\n    ],\n    [\n      [9699, 4104],\n      [2, -14],\n      [-8, 6],\n      [0, 12],\n      [6, -4]\n    ],\n    [\n      [9675, 4172],\n      [7, -8],\n      [-6, -8],\n      [-6, 7],\n      [5, 9]\n    ],\n    [\n      [9671, 4228],\n      [8, -15],\n      [-7, 1],\n      [-1, 14]\n    ],\n    [\n      [9675, 4243],\n      [-6, -2],\n      [-6, 7],\n      [7, 9],\n      [5, -14]\n    ],\n    [\n      [9650, 4255],\n      [10, -14],\n      [1, -7],\n      [-10, -6],\n      [-4, 27],\n      [-5, 1],\n      [1, 12],\n      [4, -1],\n      [3, -12]\n    ],\n    [\n      [9672, 4262],\n      [-3, 21],\n      [1, 9],\n      [3, -20],\n      [-1, -10]\n    ],\n    [\n      [9662, 4292],\n      [-5, 2],\n      [9, 9],\n      [-4, -11]\n    ],\n    [\n      [9671, 4298],\n      [-2, 1],\n      [-1, 24],\n      [2, -2],\n      [1, -23]\n    ],\n    [\n      [9633, 4310],\n      [4, 2],\n      [0, 11],\n      [5, -11],\n      [3, -23],\n      [-11, -7],\n      [-7, 15],\n      [1, 11],\n      [-3, 15],\n      [1, 17],\n      [5, -11],\n      [2, -19]\n    ],\n    [\n      [9653, 4368],\n      [1, -9],\n      [-5, 0],\n      [4, 9]\n    ],\n    [\n      [9654, 4385],\n      [-4, -3],\n      [-1, 10],\n      [5, -7]\n    ],\n    [\n      [5917, 7177],\n      [-8, 1]\n    ],\n    [\n      [233, 4380],\n      [5, -6],\n      [-14, 2],\n      [-4, 7],\n      [7, 5],\n      [6, -8]\n    ],\n    [\n      [213, 4406],\n      [3, -6],\n      [-1, -12],\n      [-9, 0],\n      [-5, 15],\n      [12, 3]\n    ],\n    [\n      [6488, 5914],\n      [7, -6],\n      [7, 6],\n      [10, -9],\n      [-9, -11],\n      [-10, -3],\n      [-6, 2],\n      [-5, 12],\n      [6, 9]\n    ],\n    [\n      [6474, 6141],\n      [-14, -9],\n      [-10, -18],\n      [-2, -12],\n      [2, -20],\n      [-10, -7],\n      [-13, -15],\n      [-23, -11],\n      [-11, -11],\n      [-4, 0],\n      [-25, -18],\n      [-3, -12],\n      [-8, -16],\n      [-6, -3],\n      [-14, 3],\n      [-10, -9],\n      [-6, -13],\n      [-15, -8],\n      [-5, -6],\n      [-14, 0],\n      [-16, -6],\n      [-7, -15],\n      [-15, -17],\n      [-7, 3],\n      [-4, -8],\n      [-14, -5],\n      [-10, 9],\n      [-3, -4],\n      [-7, 35],\n      [2, 25],\n      [-6, 21],\n      [-2, 16],\n      [-3, 43],\n      [-6, 7],\n      [4, 2],\n      [-3, 17],\n      [3, 18],\n      [-1, 29]\n    ],\n    [\n      [5913, 3637],\n      [-1, -16],\n      [-5, -23],\n      [-3, -38],\n      [-5, -21],\n      [-10, -19],\n      [-7, -3],\n      [-13, -27],\n      [-21, -68],\n      [-4, -16],\n      [-15, -32],\n      [-4, -4],\n      [-16, -28],\n      [-9, -21],\n      [-13, -22],\n      [-25, -35],\n      [-27, -26],\n      [-15, 4],\n      [-9, -9],\n      [0, -11],\n      [-17, 5],\n      [-4, -12],\n      [-11, 1],\n      [-8, 6],\n      [-16, 4],\n      [-6, -7],\n      [-23, 6],\n      [-10, -4],\n      [-12, -19],\n      [-7, 3],\n      [-6, -5],\n      [-11, 4],\n      [-1, -6],\n      [-11, 0],\n      [-14, -20],\n      [-9, 3],\n      [-9, 9],\n      [0, 11],\n      [-6, 4],\n      [-8, -2],\n      [0, 17],\n      [-10, -2],\n      [0, -13],\n      [-4, 19],\n      [5, 10],\n      [-2, 12],\n      [-7, 16],\n      [-4, 20],\n      [-4, -1],\n      [1, 18],\n      [7, -2],\n      [4, 8],\n      [1, 20],\n      [-2, 22],\n      [-4, 17],\n      [-9, 20],\n      [-7, 28],\n      [-8, 24],\n      [-6, 42],\n      [-6, 29],\n      [-7, 15],\n      [-3, 15]\n    ],\n    [\n      [5815, 3905],\n      [12, 3],\n      [14, -12],\n      [15, 3],\n      [13, -7]\n    ],\n    [\n      [5844, 4282],\n      [-15, 1],\n      [-13, -5],\n      [-15, -18],\n      [0, -21],\n      [-3, -8]\n    ],\n    [\n      [5798, 4231],\n      [-3, 3],\n      [-13, -9],\n      [-5, -13],\n      [-12, -14],\n      [-13, -38],\n      [-2, -11]\n    ],\n    [\n      [5750, 4149],\n      [-9, -7],\n      [-14, 11],\n      [-7, -7],\n      [-7, 11],\n      [-12, 1]\n    ],\n    [\n      [5792, 4643],\n      [5, 5],\n      [9, 23],\n      [3, 15],\n      [-7, 8]\n    ],\n    [\n      [5849, 4709],\n      [-4, -14],\n      [7, -1],\n      [9, -18],\n      [5, 4],\n      [-1, 8]\n    ],\n    [\n      [5750, 4149],\n      [10, 22],\n      [5, 5],\n      [4, 17],\n      [11, 9],\n      [0, 11],\n      [8, 0],\n      [8, 9],\n      [1, -7],\n      [8, 12],\n      [-7, 4]\n    ]\n  ],\n  \"type\": \"Topology\",\n  \"objects\": {\n    \"units\": {\n      \"geometries\": [\n        {\n          \"arcs\": [[0, 1, 2, 3, 4, 5]],\n          \"type\": \"Polygon\",\n          \"id\": \"AFG\",\n          \"properties\": { \"name\": \"Afghanistan\" }\n        },\n        {\n          \"arcs\": [[[6, 7, 8, 9]], [[10, 11, 12]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"AGO\",\n          \"properties\": { \"name\": \"Angola\" }\n        },\n        {\n          \"arcs\": [\n            [[13, 14]],\n            [[15, 16]],\n            [[17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ALB\",\n          \"properties\": { \"name\": \"Albania\" }\n        },\n        {\n          \"arcs\": [[[31]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ALD\",\n          \"properties\": { \"name\": \"Aland\" }\n        },\n        { \"arcs\": [[32, 33]], \"type\": \"Polygon\", \"id\": \"AND\", \"properties\": { \"name\": \"Andorra\" } },\n        {\n          \"arcs\": [[[34]], [[35, 36, 37, 38, 39], [40]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ARE\",\n          \"properties\": { \"name\": \"United Arab Emirates\" }\n        },\n        {\n          \"arcs\": [[[41, 42]], [[43, 44]], [[45, 46, 47, 48, 49, 50]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ARG\",\n          \"properties\": { \"name\": \"Argentina\" }\n        },\n        {\n          \"arcs\": [[[51]], [[52, 53, 54, 55, 56], [57], [58]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ARM\",\n          \"properties\": { \"name\": \"Armenia\" }\n        },\n        {\n          \"arcs\": [\n            [[59]],\n            [[60]],\n            [[61]],\n            [[62]],\n            [[63]],\n            [[64]],\n            [[65]],\n            [[66]],\n            [[67]],\n            [[68]],\n            [[69]],\n            [[70]],\n            [[71]],\n            [[72]],\n            [[73]],\n            [[74]],\n            [[75]],\n            [[76]],\n            [[77]],\n            [[78]],\n            [[79]],\n            [[80]],\n            [[81]],\n            [[82]],\n            [[83]],\n            [[84]],\n            [[85]],\n            [[86]],\n            [[87]],\n            [[88]],\n            [[89]],\n            [[90]],\n            [[91]],\n            [[92]],\n            [[93]],\n            [[94]],\n            [[95]],\n            [[96]],\n            [[97]],\n            [[98]],\n            [[99]],\n            [[100]],\n            [[101]],\n            [[102]],\n            [[103]],\n            [[104]],\n            [[105]],\n            [[106]],\n            [[107]],\n            [[108]],\n            [[109]],\n            [[110]],\n            [[111]],\n            [[112]],\n            [[113]],\n            [[114]],\n            [[115]],\n            [[116]],\n            [[117]],\n            [[118]],\n            [[119]],\n            [[120]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ATA\",\n          \"properties\": { \"name\": \"Antarctica\" }\n        },\n        {\n          \"arcs\": [[[121]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ATF\",\n          \"properties\": { \"name\": \"Fr. S. Antarctic Lands\" }\n        },\n        {\n          \"arcs\": [\n            [[122]],\n            [[123]],\n            [[124]],\n            [[125]],\n            [[126]],\n            [[127]],\n            [[128]],\n            [[129]],\n            [[130]],\n            [[131]],\n            [[132]],\n            [[133]],\n            [[134]],\n            [[135]],\n            [[136]],\n            [[137]],\n            [[138]],\n            [[139]],\n            [[140]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"AUS\",\n          \"properties\": { \"name\": \"Australia\" }\n        },\n        {\n          \"arcs\": [[141, 142, 143, 144, 145, 146, 147, 148, 149, 150]],\n          \"type\": \"Polygon\",\n          \"id\": \"AUT\",\n          \"properties\": { \"name\": \"Austria\" }\n        },\n        {\n          \"arcs\": [[[151, 152, -55]], [[-59]], [[-58]], [[153, 154, 155, -53, 156], [-52]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"AZE\",\n          \"properties\": { \"name\": \"Azerbaijan\" }\n        },\n        {\n          \"arcs\": [[157, 158, 159, 160]],\n          \"type\": \"Polygon\",\n          \"id\": \"BDI\",\n          \"properties\": { \"name\": \"Burundi\" }\n        },\n        {\n          \"arcs\": [[161, 162, 163, 164, 165, 166, 167]],\n          \"type\": \"Polygon\",\n          \"id\": \"BEL\",\n          \"properties\": { \"name\": \"Belgium\" }\n        },\n        {\n          \"arcs\": [[168, 169, 170, 171, 172]],\n          \"type\": \"Polygon\",\n          \"id\": \"BEN\",\n          \"properties\": { \"name\": \"Benin\" }\n        },\n        {\n          \"arcs\": [[173, -172, 174, 175, 176, 177]],\n          \"type\": \"Polygon\",\n          \"id\": \"BFA\",\n          \"properties\": { \"name\": \"Burkina Faso\" }\n        },\n        {\n          \"arcs\": [[[178]], [[179]], [[180, 181, 182]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BGD\",\n          \"properties\": { \"name\": \"Bangladesh\" }\n        },\n        {\n          \"arcs\": [[183, 184, 185, 186, 187, 188]],\n          \"type\": \"Polygon\",\n          \"id\": \"BGR\",\n          \"properties\": { \"name\": \"Bulgaria\" }\n        },\n        { \"arcs\": [[189]], \"type\": \"Polygon\", \"id\": \"BHR\", \"properties\": { \"name\": \"Bahrain\" } },\n        {\n          \"arcs\": [\n            [[190]],\n            [[191]],\n            [[192]],\n            [[193]],\n            [[194]],\n            [[195]],\n            [[196]],\n            [[197]],\n            [[198]],\n            [[199]],\n            [[200]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BHS\",\n          \"properties\": { \"name\": \"Bahamas\" }\n        },\n        {\n          \"arcs\": [[201, 202, 203, 204, 205]],\n          \"type\": \"Polygon\",\n          \"id\": \"BIH\",\n          \"properties\": { \"name\": \"Bosnia and Herz.\" }\n        },\n        {\n          \"arcs\": [[206, 207, 208, 209, 210]],\n          \"type\": \"Polygon\",\n          \"id\": \"BLR\",\n          \"properties\": { \"name\": \"Belarus\" }\n        },\n        {\n          \"arcs\": [[[211, 212, 213]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BLZ\",\n          \"properties\": { \"name\": \"Belize\" }\n        },\n        {\n          \"arcs\": [[[214, 215]], [[216, -51, 217, 218, 219, 220, 221]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BOL\",\n          \"properties\": { \"name\": \"Bolivia\" }\n        },\n        {\n          \"arcs\": [\n            [[222]],\n            [[223]],\n            [[224]],\n            [[225]],\n            [[226]],\n            [[227]],\n            [[228]],\n            [[229]],\n            [[230]],\n            [[231]],\n            [[232]],\n            [[233]],\n            [[234]],\n            [[235]],\n            [[236]],\n            [[237]],\n            [[238, 239, 240, 241, 242, 243, -47, 244, 245, 246, -222, 247, 248, 249, 250]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BRA\",\n          \"properties\": { \"name\": \"Brazil\" }\n        },\n        { \"arcs\": [[251]], \"type\": \"Polygon\", \"id\": \"BRB\", \"properties\": { \"name\": \"Barbados\" } },\n        {\n          \"arcs\": [[[252, 253]], [[254, 255]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"BRN\",\n          \"properties\": { \"name\": \"Brunei\" }\n        },\n        {\n          \"arcs\": [[256, 257]],\n          \"type\": \"Polygon\",\n          \"id\": \"BTN\",\n          \"properties\": { \"name\": \"Bhutan\" }\n        },\n        {\n          \"arcs\": [[258, 259, 260]],\n          \"type\": \"Polygon\",\n          \"id\": \"BWA\",\n          \"properties\": { \"name\": \"Botswana\" }\n        },\n        {\n          \"arcs\": [[261, 262, 263, 264, 265, 266]],\n          \"type\": \"Polygon\",\n          \"id\": \"CAF\",\n          \"properties\": { \"name\": \"Central African Rep.\" }\n        },\n        {\n          \"arcs\": [\n            [[267]],\n            [[268]],\n            [[269]],\n            [[270]],\n            [[271]],\n            [[272]],\n            [[273]],\n            [[274, 275, 276, 277]],\n            [[278]],\n            [[279]],\n            [[280]],\n            [[281]],\n            [[282]],\n            [[283]],\n            [[284]],\n            [[285]],\n            [[286]],\n            [[287]],\n            [[288]],\n            [[289]],\n            [[290]],\n            [[291]],\n            [[292]],\n            [[293]],\n            [[294]],\n            [[295]],\n            [[296]],\n            [[297]],\n            [[298]],\n            [[299]],\n            [[300]],\n            [[301]],\n            [[302]],\n            [[303]],\n            [[304]],\n            [[305]],\n            [[306]],\n            [[307]],\n            [[308]],\n            [[309]],\n            [[310]],\n            [[311]],\n            [[312]],\n            [[313]],\n            [[314]],\n            [[315]],\n            [[316]],\n            [[317]],\n            [[318]],\n            [[319]],\n            [[320]],\n            [[321]],\n            [[322]],\n            [[323]],\n            [[324]],\n            [[325]],\n            [[326]],\n            [[327]],\n            [[328]],\n            [[329]],\n            [[330]],\n            [[331]],\n            [[332]],\n            [[333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, -346, 346, 347]],\n            [[348]],\n            [[349]],\n            [[350]],\n            [[351]],\n            [[352]],\n            [[353]],\n            [[354]],\n            [[355]],\n            [[356]],\n            [[357]],\n            [[358]],\n            [[359]],\n            [[360]],\n            [[361]],\n            [[362]],\n            [[363]],\n            [[364]],\n            [[365]],\n            [[366]],\n            [[367]],\n            [[368]],\n            [[369]],\n            [[370]],\n            [[371]],\n            [[372]],\n            [[373]],\n            [[374]],\n            [[375]],\n            [[376]],\n            [[377]],\n            [[378]],\n            [[379]],\n            [[380]],\n            [[381]],\n            [[382]],\n            [[383]],\n            [[384]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CAN\",\n          \"properties\": { \"name\": \"Canada\" }\n        },\n        {\n          \"arcs\": [[385, 386, 387, -148, 388, -146, 389, 390, 391, 392, 393]],\n          \"type\": \"Polygon\",\n          \"id\": \"CHE\",\n          \"properties\": { \"name\": \"Switzerland\" }\n        },\n        {\n          \"arcs\": [\n            [[394]],\n            [[395]],\n            [[396]],\n            [[397]],\n            [[398]],\n            [[399]],\n            [[400]],\n            [[401]],\n            [[402]],\n            [[-44, 403, -42, 404]],\n            [[405]],\n            [[406]],\n            [[407]],\n            [[408]],\n            [[409]],\n            [[410]],\n            [[411]],\n            [[412]],\n            [[413]],\n            [[414]],\n            [[415]],\n            [[416]],\n            [[417]],\n            [[418]],\n            [[419]],\n            [[420]],\n            [[421]],\n            [[422]],\n            [[423]],\n            [[424]],\n            [[425]],\n            [[426]],\n            [[427]],\n            [[428]],\n            [[429]],\n            [[430]],\n            [[431]],\n            [[432]],\n            [[433]],\n            [[434]],\n            [[435]],\n            [[-50, 436, 437, -218]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CHL\",\n          \"properties\": { \"name\": \"Chile\" }\n        },\n        {\n          \"arcs\": [\n            [[438]],\n            [[439]],\n            [[440]],\n            [[441]],\n            [\n              [\n                442, 443, 444, 445, 446, 447, 448, 449, 450, 451, -258, 452, 453, 454, 455, 456, -1,\n                457, 458, 459, 460, 461, 462, 463, 464\n              ]\n            ]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CHN\",\n          \"properties\": { \"name\": \"China\" }\n        },\n        {\n          \"arcs\": [[[465, 466]], [[-177, 467, 468, 469, 470, 471]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CIV\",\n          \"properties\": { \"name\": \"C\\u00f4te d'Ivoire\" }\n        },\n        {\n          \"arcs\": [[[472, -266, 473, 474, 475, 476, 477, 478, 479]], [[480, 481]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CMR\",\n          \"properties\": { \"name\": \"Cameroon\" }\n        },\n        {\n          \"arcs\": [[[482, 483, 484, 485]], [[486, 487, 488, 489]], [[490, 491, 492, 493]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CNM\",\n          \"properties\": { \"name\": \"Cyprus U.N. Buffer Zone\" }\n        },\n        {\n          \"arcs\": [\n            [[494]],\n            [\n              [\n                495, 496, 497, 498, 499, 500, 501, 502, 503, -160, 504, 505, 506, 507, -10, 508,\n                -11, 509, -264\n              ]\n            ]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"COD\",\n          \"properties\": { \"name\": \"Dem. Rep. Congo\" }\n        },\n        {\n          \"arcs\": [[-510, -13, 510, 511, -474, -265]],\n          \"type\": \"Polygon\",\n          \"id\": \"COG\",\n          \"properties\": { \"name\": \"Congo\" }\n        },\n        {\n          \"arcs\": [[[512, -249, 513, 514, 515, 516, 517]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"COL\",\n          \"properties\": { \"name\": \"Colombia\" }\n        },\n        {\n          \"arcs\": [[[518]], [[519]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"COM\",\n          \"properties\": { \"name\": \"Comoros\" }\n        },\n        {\n          \"arcs\": [[[520]], [[521]], [[522]], [[523]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CPV\",\n          \"properties\": { \"name\": \"Cape Verde\" }\n        },\n        {\n          \"arcs\": [[[524, 525, 526, 527]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CRI\",\n          \"properties\": { \"name\": \"Costa Rica\" }\n        },\n        {\n          \"arcs\": [[[528]], [[529]], [[530]], [[531, 532, 533, 534]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CUB\",\n          \"properties\": { \"name\": \"Cuba\" }\n        },\n        {\n          \"arcs\": [[535]],\n          \"type\": \"Polygon\",\n          \"id\": \"CUW\",\n          \"properties\": { \"name\": \"Cura\\u00e7ao\" }\n        },\n        {\n          \"arcs\": [[[536, -488]], [[-486, 537, -494, 538]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CYN\",\n          \"properties\": { \"name\": \"N. Cyprus\" }\n        },\n        {\n          \"arcs\": [\n            [[539, 540]],\n            [[541]],\n            [[542, 543, -484]],\n            [[544, 545, 546, 547, -490, 548, -492]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"CYP\",\n          \"properties\": { \"name\": \"Cyprus\" }\n        },\n        {\n          \"arcs\": [[549, 550, -151, 551]],\n          \"type\": \"Polygon\",\n          \"id\": \"CZE\",\n          \"properties\": { \"name\": \"Czech Rep.\" }\n        },\n        {\n          \"arcs\": [\n            [[-387, 552]],\n            [[553, 554]],\n            [[555]],\n            [[556, 557, -552, -150, 558, -394, 559, 560, -162, 561, 562, 563]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"DEU\",\n          \"properties\": { \"name\": \"Germany\" }\n        },\n        {\n          \"arcs\": [[564, 565, 566, 567, 568, 569]],\n          \"type\": \"Polygon\",\n          \"id\": \"DJI\",\n          \"properties\": { \"name\": \"Djibouti\" }\n        },\n        { \"arcs\": [[570]], \"type\": \"Polygon\", \"id\": \"DMA\", \"properties\": { \"name\": \"Dominica\" } },\n        {\n          \"arcs\": [[[571]], [[572]], [[573]], [[574]], [[575]], [[576]], [[577]], [[-564, 578]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"DNK\",\n          \"properties\": { \"name\": \"Denmark\" }\n        },\n        {\n          \"arcs\": [[[579, 580, 581, 582, 583, 584]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"DOM\",\n          \"properties\": { \"name\": \"Dominican Rep.\" }\n        },\n        {\n          \"arcs\": [[585, 586, 587, 588, 589, 590, 591, 592]],\n          \"type\": \"Polygon\",\n          \"id\": \"DZA\",\n          \"properties\": { \"name\": \"Algeria\" }\n        },\n        {\n          \"arcs\": [[[593]], [[594]], [[595]], [[596]], [[597]], [[598]], [[599, 600, -515]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ECU\",\n          \"properties\": { \"name\": \"Ecuador\" }\n        },\n        {\n          \"arcs\": [[[601, 602, 603, 604, 605, 606]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"EGY\",\n          \"properties\": { \"name\": \"Egypt\" }\n        },\n        {\n          \"arcs\": [[[607]], [[-569, 608, 609, 610]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ERI\",\n          \"properties\": { \"name\": \"Eritrea\" }\n        },\n        {\n          \"arcs\": [[-485, -544, 611, -541, 612, -545, -491, -538], [-542]],\n          \"type\": \"Polygon\",\n          \"id\": \"ESB\",\n          \"properties\": { \"name\": \"Dhekelia\" }\n        },\n        {\n          \"arcs\": [\n            [[613]],\n            [[614]],\n            [[615]],\n            [[616]],\n            [[617]],\n            [[618]],\n            [[619, 620]],\n            [[621, 622]],\n            [[623]],\n            [[624]],\n            [[625]],\n            [[626]],\n            [[627, -33, 628, 629, 630, 631, 632, 633]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ESP\",\n          \"properties\": { \"name\": \"Spain\" }\n        },\n        {\n          \"arcs\": [[[634]], [[635]], [[636, 637, 638, 639, 640, 641, 642, 643, 644]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"EST\",\n          \"properties\": { \"name\": \"Estonia\" }\n        },\n        {\n          \"arcs\": [[-568, 645, -566, 646, 647, 648, 649, 650, -609]],\n          \"type\": \"Polygon\",\n          \"id\": \"ETH\",\n          \"properties\": { \"name\": \"Ethiopia\" }\n        },\n        {\n          \"arcs\": [[[651]], [[652, 653, 654, 655]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FIN\",\n          \"properties\": { \"name\": \"Finland\" }\n        },\n        {\n          \"arcs\": [[[656]], [[657]], [[658]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FJI\",\n          \"properties\": { \"name\": \"Fiji\" }\n        },\n        {\n          \"arcs\": [[[659]], [[660]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FLK\",\n          \"properties\": { \"name\": \"Falkland Is.\" }\n        },\n        {\n          \"arcs\": [\n            [[661]],\n            [[662]],\n            [[-240, 663, 664]],\n            [[665]],\n            [[666]],\n            [[667]],\n            [[668]],\n            [[669, -560, -393, 670, -391, 671, 672, 673, 674, -629, -34, -628, 675, -164], [-627]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FRA\",\n          \"properties\": { \"name\": \"France\" }\n        },\n        {\n          \"arcs\": [[[676]], [[677]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FRO\",\n          \"properties\": { \"name\": \"Faeroe Is.\" }\n        },\n        {\n          \"arcs\": [[[678]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"FSM\",\n          \"properties\": { \"name\": \"Micronesia\" }\n        },\n        {\n          \"arcs\": [[[-512, 679, 680, -475]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GAB\",\n          \"properties\": { \"name\": \"Gabon\" }\n        },\n        {\n          \"arcs\": [\n            [[681]],\n            [[682]],\n            [[683, 684]],\n            [[685]],\n            [[686]],\n            [[687]],\n            [[688]],\n            [[689]],\n            [[690]],\n            [[691]],\n            [[692]],\n            [[693]],\n            [[694]],\n            [[695]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GBR\",\n          \"properties\": { \"name\": \"United Kingdom\" }\n        },\n        {\n          \"arcs\": [[-157, -57, 696, 697, 698]],\n          \"type\": \"Polygon\",\n          \"id\": \"GEO\",\n          \"properties\": { \"name\": \"Georgia\" }\n        },\n        {\n          \"arcs\": [[699, 700, -466, 701, -468, -176]],\n          \"type\": \"Polygon\",\n          \"id\": \"GHA\",\n          \"properties\": { \"name\": \"Ghana\" }\n        },\n        {\n          \"arcs\": [[-631, 702]],\n          \"type\": \"Polygon\",\n          \"id\": \"GIB\",\n          \"properties\": { \"name\": \"Gibraltar\" }\n        },\n        {\n          \"arcs\": [[703, -471, 704, 705, 706, 707, 708]],\n          \"type\": \"Polygon\",\n          \"id\": \"GIN\",\n          \"properties\": { \"name\": \"Guinea\" }\n        },\n        {\n          \"arcs\": [[709, 710]],\n          \"type\": \"Polygon\",\n          \"id\": \"GMB\",\n          \"properties\": { \"name\": \"Gambia\" }\n        },\n        {\n          \"arcs\": [[[711]], [[712, 713, -708]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GNB\",\n          \"properties\": { \"name\": \"Guinea-Bissau\" }\n        },\n        {\n          \"arcs\": [[[-681, 714, -476]], [[715]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GNQ\",\n          \"properties\": { \"name\": \"Eq. Guinea\" }\n        },\n        {\n          \"arcs\": [\n            [[716]],\n            [[717]],\n            [[718]],\n            [[719]],\n            [[720]],\n            [[721]],\n            [[722]],\n            [[723]],\n            [[724]],\n            [[725]],\n            [[726]],\n            [[727]],\n            [[728]],\n            [[729]],\n            [[730]],\n            [[731]],\n            [[732, -186, 733, 734, -27, 735, -25, 736]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GRC\",\n          \"properties\": { \"name\": \"Greece\" }\n        },\n        {\n          \"arcs\": [[[737]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GRD\",\n          \"properties\": { \"name\": \"Grenada\" }\n        },\n        {\n          \"arcs\": [\n            [[738]],\n            [[739]],\n            [[740]],\n            [[741]],\n            [[742]],\n            [[743]],\n            [[744]],\n            [[745]],\n            [[746]],\n            [[747]],\n            [[748]],\n            [[749]],\n            [[750]],\n            [[751]],\n            [[752]],\n            [[753]],\n            [[754]],\n            [[755]],\n            [[756]],\n            [[757]],\n            [[758]],\n            [[759]],\n            [[760]],\n            [[761]],\n            [[762]],\n            [[763]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GRL\",\n          \"properties\": { \"name\": \"Greenland\" }\n        },\n        {\n          \"arcs\": [[-213, 764, 765, 766, 767, 768]],\n          \"type\": \"Polygon\",\n          \"id\": \"GTM\",\n          \"properties\": { \"name\": \"Guatemala\" }\n        },\n        { \"arcs\": [[769]], \"type\": \"Polygon\", \"id\": \"GUM\", \"properties\": { \"name\": \"Guam\" } },\n        {\n          \"arcs\": [[[770, -251, 771, 772]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"GUY\",\n          \"properties\": { \"name\": \"Guyana\" }\n        },\n        {\n          \"arcs\": [[[773, -447]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HKG\",\n          \"properties\": { \"name\": \"Hong Kong\" }\n        },\n        {\n          \"arcs\": [[774]],\n          \"type\": \"Polygon\",\n          \"id\": \"HMD\",\n          \"properties\": { \"name\": \"Heard I. and McDonald Is.\" }\n        },\n        {\n          \"arcs\": [[[775, 776, 777, -766, 778]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HND\",\n          \"properties\": { \"name\": \"Honduras\" }\n        },\n        {\n          \"arcs\": [\n            [[-204, 779, 780]],\n            [[781]],\n            [[782]],\n            [[783]],\n            [[784]],\n            [[785, 786, -206, 787, 788]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HRV\",\n          \"properties\": { \"name\": \"Croatia\" }\n        },\n        {\n          \"arcs\": [[[-582, 789]], [[790]], [[-584, 791, -580, 792]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"HTI\",\n          \"properties\": { \"name\": \"Haiti\" }\n        },\n        {\n          \"arcs\": [[793, 794, 795, -786, 796, -143, 797]],\n          \"type\": \"Polygon\",\n          \"id\": \"HUN\",\n          \"properties\": { \"name\": \"Hungary\" }\n        },\n        {\n          \"arcs\": [\n            [[798]],\n            [[799]],\n            [[800]],\n            [[801, 802, 803, 804]],\n            [[805]],\n            [[806]],\n            [[807]],\n            [[808]],\n            [[809]],\n            [[810]],\n            [[811]],\n            [[812]],\n            [[813]],\n            [[814]],\n            [[815]],\n            [[816]],\n            [[817]],\n            [[818]],\n            [[819]],\n            [[820]],\n            [[821]],\n            [[822]],\n            [[823]],\n            [[824]],\n            [[825]],\n            [[826]],\n            [[827]],\n            [[828]],\n            [[829]],\n            [[830]],\n            [[831]],\n            [[832]],\n            [[833]],\n            [[834]],\n            [[835]],\n            [[836]],\n            [[837]],\n            [[838]],\n            [[839]],\n            [[840]],\n            [[841]],\n            [[842]],\n            [[843]],\n            [[844]],\n            [[845]],\n            [[846]],\n            [[847]],\n            [[848]],\n            [[849]],\n            [[850]],\n            [[851]],\n            [[852]],\n            [[853]],\n            [[854]],\n            [[855]],\n            [[856]],\n            [[857, 858]],\n            [[859]],\n            [[860]],\n            [[861]],\n            [[862]],\n            [[863]],\n            [[864]],\n            [[865]],\n            [[866]],\n            [[867]],\n            [[868]],\n            [[869]],\n            [[870]],\n            [[871]],\n            [[872]],\n            [[873]],\n            [[874]],\n            [[875]],\n            [[876]],\n            [[877]],\n            [[878]],\n            [[879]],\n            [[880]],\n            [[881, 882]],\n            [[883]],\n            [[884, 885]],\n            [[886]],\n            [[887]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IDN\",\n          \"properties\": { \"name\": \"Indonesia\" }\n        },\n        {\n          \"arcs\": [[888]],\n          \"type\": \"Polygon\",\n          \"id\": \"IMN\",\n          \"properties\": { \"name\": \"Isle of Man\" }\n        },\n        {\n          \"arcs\": [\n            [[889]],\n            [[890]],\n            [[891]],\n            [[892]],\n            [[893, -453, -257, -452, 894, -183, 895, 896, 897, -455]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IND\",\n          \"properties\": { \"name\": \"India\" }\n        },\n        {\n          \"arcs\": [[[-684, 898]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IRL\",\n          \"properties\": { \"name\": \"Ireland\" }\n        },\n        {\n          \"arcs\": [[[899]], [[-54, -156, 900, 901, -3, 902, 903, 904, 905, -152]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"IRN\",\n          \"properties\": { \"name\": \"Iran\" }\n        },\n        {\n          \"arcs\": [[-905, 906, 907, 908, 909, 910, 911, 912, 913]],\n          \"type\": \"Polygon\",\n          \"id\": \"IRQ\",\n          \"properties\": { \"name\": \"Iraq\" }\n        },\n        {\n          \"arcs\": [[[914]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ISL\",\n          \"properties\": { \"name\": \"Iceland\" }\n        },\n        {\n          \"arcs\": [[915, 916, 917, 918, 919, 920, 921, -603, 922, 923, 924, 925]],\n          \"type\": \"Polygon\",\n          \"id\": \"ISR\",\n          \"properties\": { \"name\": \"Israel\" }\n        },\n        {\n          \"arcs\": [[[926]], [[927]], [[928, 929, -672, -390, -145], [930], [931]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ITA\",\n          \"properties\": { \"name\": \"Italy\" }\n        },\n        { \"arcs\": [[932]], \"type\": \"Polygon\", \"id\": \"JAM\", \"properties\": { \"name\": \"Jamaica\" } },\n        {\n          \"arcs\": [[933, 934, -921, 935, -919, 936, 937, -916, 938, -910]],\n          \"type\": \"Polygon\",\n          \"id\": \"JOR\",\n          \"properties\": { \"name\": \"Jordan\" }\n        },\n        {\n          \"arcs\": [\n            [[939]],\n            [[940]],\n            [[941]],\n            [[942]],\n            [[943]],\n            [[944]],\n            [[945]],\n            [[946]],\n            [[947]],\n            [[948]],\n            [[949]],\n            [[950]],\n            [[951]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"JPN\",\n          \"properties\": { \"name\": \"Japan\" }\n        },\n        { \"arcs\": [[952]], \"type\": \"Polygon\", \"id\": \"KAB\", \"properties\": { \"name\": \"Baikonur\" } },\n        {\n          \"arcs\": [[-898, 953, -456]],\n          \"type\": \"Polygon\",\n          \"id\": \"KAS\",\n          \"properties\": { \"name\": \"Siachen Glacier\" }\n        },\n        {\n          \"arcs\": [[[954, 955]], [[-460, 956, 957, 958, 959, 960, 961, 962], [-953]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KAZ\",\n          \"properties\": { \"name\": \"Kazakhstan\" }\n        },\n        {\n          \"arcs\": [[[-649, 963, 964, 965, 966, 967, 968]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KEN\",\n          \"properties\": { \"name\": \"Kenya\" }\n        },\n        {\n          \"arcs\": [[-459, 969, 970, -957], [971], [972], [973]],\n          \"type\": \"Polygon\",\n          \"id\": \"KGZ\",\n          \"properties\": { \"name\": \"Kyrgyzstan\" }\n        },\n        {\n          \"arcs\": [[[974, 975, 976, 977]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KHM\",\n          \"properties\": { \"name\": \"Cambodia\" }\n        },\n        {\n          \"arcs\": [[[978]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KIR\",\n          \"properties\": { \"name\": \"Kiribati\" }\n        },\n        {\n          \"arcs\": [[[979]], [[980]], [[981]], [[982, 983]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KOR\",\n          \"properties\": { \"name\": \"Korea\" }\n        },\n        {\n          \"arcs\": [[984, -18, 985, 986]],\n          \"type\": \"Polygon\",\n          \"id\": \"XKX\",\n          \"properties\": { \"name\": \"Kosovo\" }\n        },\n        {\n          \"arcs\": [[[987]], [[988, -908, 989]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"KWT\",\n          \"properties\": { \"name\": \"Kuwait\" }\n        },\n        {\n          \"arcs\": [[990, -977, 991, 992, -450]],\n          \"type\": \"Polygon\",\n          \"id\": \"LAO\",\n          \"properties\": { \"name\": \"Lao PDR\" }\n        },\n        {\n          \"arcs\": [[-925, 993, 994]],\n          \"type\": \"Polygon\",\n          \"id\": \"LBN\",\n          \"properties\": { \"name\": \"Lebanon\" }\n        },\n        {\n          \"arcs\": [[-470, 995, 996, -705]],\n          \"type\": \"Polygon\",\n          \"id\": \"LBR\",\n          \"properties\": { \"name\": \"Liberia\" }\n        },\n        {\n          \"arcs\": [[-606, 997, 998, 999, -587, 1000, 1001]],\n          \"type\": \"Polygon\",\n          \"id\": \"LBY\",\n          \"properties\": { \"name\": \"Libya\" }\n        },\n        {\n          \"arcs\": [[1002]],\n          \"type\": \"Polygon\",\n          \"id\": \"LCA\",\n          \"properties\": { \"name\": \"Saint Lucia\" }\n        },\n        {\n          \"arcs\": [[-389, -147]],\n          \"type\": \"Polygon\",\n          \"id\": \"LIE\",\n          \"properties\": { \"name\": \"Liechtenstein\" }\n        },\n        {\n          \"arcs\": [[[1003]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"LKA\",\n          \"properties\": { \"name\": \"Sri Lanka\" }\n        },\n        { \"arcs\": [[1004]], \"type\": \"Polygon\", \"id\": \"LSO\", \"properties\": { \"name\": \"Lesotho\" } },\n        {\n          \"arcs\": [[[1005, 1006]], [[-210, 1007, 1008, 1009, 1010]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"LTU\",\n          \"properties\": { \"name\": \"Lithuania\" }\n        },\n        {\n          \"arcs\": [[-561, -670, -163]],\n          \"type\": \"Polygon\",\n          \"id\": \"LUX\",\n          \"properties\": { \"name\": \"Luxembourg\" }\n        },\n        {\n          \"arcs\": [[1011, -211, -1011, 1012, -644]],\n          \"type\": \"Polygon\",\n          \"id\": \"LVA\",\n          \"properties\": { \"name\": \"Latvia\" }\n        },\n        {\n          \"arcs\": [[1013, 1014]],\n          \"type\": \"Polygon\",\n          \"id\": \"MAF\",\n          \"properties\": { \"name\": \"St-Martin\" }\n        },\n        {\n          \"arcs\": [[-622, 1015, -620, 1016, -592, 1017, 1018]],\n          \"type\": \"Polygon\",\n          \"id\": \"MAR\",\n          \"properties\": { \"name\": \"Morocco\" }\n        },\n        {\n          \"arcs\": [[1019, -674]],\n          \"type\": \"Polygon\",\n          \"id\": \"MCO\",\n          \"properties\": { \"name\": \"Monaco\" }\n        },\n        {\n          \"arcs\": [[1020, 1021]],\n          \"type\": \"Polygon\",\n          \"id\": \"MDA\",\n          \"properties\": { \"name\": \"Moldova\" }\n        },\n        {\n          \"arcs\": [[[1022]], [[1023]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MDG\",\n          \"properties\": { \"name\": \"Madagascar\" }\n        },\n        {\n          \"arcs\": [\n            [[1024]],\n            [[1025]],\n            [[1026]],\n            [[1027]],\n            [[1028]],\n            [[1029, 1030, 1031, 1032, 1033, -214, -769, 1034, 1035], [1036]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MEX\",\n          \"properties\": { \"name\": \"Mexico\" }\n        },\n        {\n          \"arcs\": [[[-23, 1037]], [[-187, -733, 1038, -15, 1039, -21, 1040, -19, -985, 1041]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MKD\",\n          \"properties\": { \"name\": \"Macedonia\" }\n        },\n        {\n          \"arcs\": [[1042, -178, -472, -704, 1043, 1044, -589]],\n          \"type\": \"Polygon\",\n          \"id\": \"MLI\",\n          \"properties\": { \"name\": \"Mali\" }\n        },\n        {\n          \"arcs\": [\n            [[1045]],\n            [[1046]],\n            [[1047]],\n            [[1048]],\n            [[1049]],\n            [[1050]],\n            [[-993, 1051, 1052, -181, -895, -451]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MMR\",\n          \"properties\": { \"name\": \"Myanmar\" }\n        },\n        {\n          \"arcs\": [[1053, -986, -31, 1054, -16, 1055, -29, 1056, -780, -203]],\n          \"type\": \"Polygon\",\n          \"id\": \"MNE\",\n          \"properties\": { \"name\": \"Montenegro\" }\n        },\n        {\n          \"arcs\": [[-464, 1057, -462, 1058]],\n          \"type\": \"Polygon\",\n          \"id\": \"MNG\",\n          \"properties\": { \"name\": \"Mongolia\" }\n        },\n        {\n          \"arcs\": [[[1059, 1060, 1061, 1062, 1063, 1064, 1065, 1066, 1067]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MOZ\",\n          \"properties\": { \"name\": \"Mozambique\" }\n        },\n        {\n          \"arcs\": [[[1068, 1069, 1070, -590, -1045]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MRT\",\n          \"properties\": { \"name\": \"Mauritania\" }\n        },\n        {\n          \"arcs\": [[[1071]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MUS\",\n          \"properties\": { \"name\": \"Mauritius\" }\n        },\n        {\n          \"arcs\": [\n            [[1072, 1073]],\n            [[1074, 1075]],\n            [[1076, 1077]],\n            [[1078, 1079]],\n            [[1080, -1065, 1081, 1082]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MWI\",\n          \"properties\": { \"name\": \"Malawi\" }\n        },\n        {\n          \"arcs\": [\n            [[1083]],\n            [[-882, 1084]],\n            [[1085]],\n            [[1086]],\n            [[1087, 1088]],\n            [[-886, 1089, -256, 1090, -253, 1091]],\n            [[1092]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"MYS\",\n          \"properties\": { \"name\": \"Malaysia\" }\n        },\n        {\n          \"arcs\": [[1093, -261, 1094, 1095, -8]],\n          \"type\": \"Polygon\",\n          \"id\": \"NAM\",\n          \"properties\": { \"name\": \"Namibia\" }\n        },\n        {\n          \"arcs\": [[[1096]], [[1097]], [[1098]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NCL\",\n          \"properties\": { \"name\": \"New Caledonia\" }\n        },\n        {\n          \"arcs\": [[1099, 1100, -173, -174, -1043, -588, -1000]],\n          \"type\": \"Polygon\",\n          \"id\": \"NER\",\n          \"properties\": { \"name\": \"Niger\" }\n        },\n        {\n          \"arcs\": [[[1101, -478, 1102, -169, -1101]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NGA\",\n          \"properties\": { \"name\": \"Nigeria\" }\n        },\n        {\n          \"arcs\": [[[1103, -528, 1104, -776]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NIC\",\n          \"properties\": { \"name\": \"Nicaragua\" }\n        },\n        {\n          \"arcs\": [[[-166, 1105]], [[1106]], [[-562, -168, 1107], [1108]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NLD\",\n          \"properties\": { \"name\": \"Netherlands\" }\n        },\n        {\n          \"arcs\": [\n            [[1109]],\n            [[1110]],\n            [[1111]],\n            [[1112]],\n            [[1113]],\n            [[1114]],\n            [[1115]],\n            [[1116]],\n            [[1117]],\n            [[1118]],\n            [[1119]],\n            [[1120]],\n            [[1121]],\n            [[1122]],\n            [[1123, -656, 1124, 1125]],\n            [[1126]],\n            [[1127]],\n            [[1128]],\n            [[1129]],\n            [[1130]],\n            [[1131]],\n            [[1132]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NOR\",\n          \"properties\": { \"name\": \"Norway\" }\n        },\n        {\n          \"arcs\": [[-894, -454]],\n          \"type\": \"Polygon\",\n          \"id\": \"NPL\",\n          \"properties\": { \"name\": \"Nepal\" }\n        },\n        {\n          \"arcs\": [[[1133]], [[1134]], [[1135]], [[1136]], [[1137]], [[1138]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"NZL\",\n          \"properties\": { \"name\": \"New Zealand\" }\n        },\n        {\n          \"arcs\": [[[1139]], [[1140, 1141, -37, 1142]], [[-41], [-35]], [[-40, 1143]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"OMN\",\n          \"properties\": { \"name\": \"Oman\" }\n        },\n        {\n          \"arcs\": [[[-954, -897, 1144, -903, -2, -457]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PAK\",\n          \"properties\": { \"name\": \"Pakistan\" }\n        },\n        {\n          \"arcs\": [[[1145]], [[-517, 1146, -526, 1147]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PAN\",\n          \"properties\": { \"name\": \"Panama\" }\n        },\n        {\n          \"arcs\": [[[-248, -221, 1148, -215, 1149, -219, -438, 1150, -600, -514]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PER\",\n          \"properties\": { \"name\": \"Peru\" }\n        },\n        {\n          \"arcs\": [\n            [[1151]],\n            [[1152]],\n            [[1153]],\n            [[1154]],\n            [[1155]],\n            [[1156]],\n            [[1157]],\n            [[1158]],\n            [[1159]],\n            [[1160]],\n            [[1161]],\n            [[1162]],\n            [[1163]],\n            [[1164]],\n            [[1165]],\n            [[1166]],\n            [[1167]],\n            [[1168]],\n            [[1169]],\n            [[1170]],\n            [[1171]],\n            [[1172]],\n            [[1173]],\n            [[1174]],\n            [[1175]],\n            [[1176]],\n            [[1177]],\n            [[1178]],\n            [[1179]],\n            [[1180]],\n            [[1181]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PHL\",\n          \"properties\": { \"name\": \"Philippines\" }\n        },\n        {\n          \"arcs\": [[[1182]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PLW\",\n          \"properties\": { \"name\": \"Palau\" }\n        },\n        {\n          \"arcs\": [\n            [[1183]],\n            [[1184]],\n            [[1185]],\n            [[1186]],\n            [[1187]],\n            [[1188]],\n            [[1189]],\n            [[1190]],\n            [[1191]],\n            [[1192]],\n            [[1193]],\n            [[1194]],\n            [[-858, 1195]],\n            [[1196]],\n            [[1197]],\n            [[1198]],\n            [[1199]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PNG\",\n          \"properties\": { \"name\": \"Papua New Guinea\" }\n        },\n        {\n          \"arcs\": [[1200, 1201, 1202, -1008, -209, 1203, 1204, -550, -558, 1205, -554, 1206]],\n          \"type\": \"Polygon\",\n          \"id\": \"POL\",\n          \"properties\": { \"name\": \"Poland\" }\n        },\n        {\n          \"arcs\": [[[1207]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PRI\",\n          \"properties\": { \"name\": \"Puerto Rico\" }\n        },\n        {\n          \"arcs\": [[[1208, 1209, -983, 1210, -445]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PRK\",\n          \"properties\": { \"name\": \"Dem. Rep. Korea\" }\n        },\n        {\n          \"arcs\": [[[1211]], [[1212]], [[1213]], [[1214]], [[1215, -633]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PRT\",\n          \"properties\": { \"name\": \"Portugal\" }\n        },\n        {\n          \"arcs\": [[-247, 1216, -245, -46, -217]],\n          \"type\": \"Polygon\",\n          \"id\": \"PRY\",\n          \"properties\": { \"name\": \"Paraguay\" }\n        },\n        {\n          \"arcs\": [[[-602, 1217, -923]], [[-938, 1218, -917]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PSX\",\n          \"properties\": { \"name\": \"Palestine\" }\n        },\n        {\n          \"arcs\": [[[1219]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"PYF\",\n          \"properties\": { \"name\": \"Fr. Polynesia\" }\n        },\n        {\n          \"arcs\": [[1220, 1221]],\n          \"type\": \"Polygon\",\n          \"id\": \"QAT\",\n          \"properties\": { \"name\": \"Qatar\" }\n        },\n        {\n          \"arcs\": [[1222, 1223, -189, 1224, -795, 1225, -1021]],\n          \"type\": \"Polygon\",\n          \"id\": \"ROU\",\n          \"properties\": { \"name\": \"Romania\" }\n        },\n        {\n          \"arcs\": [\n            [[1226]],\n            [[1227]],\n            [[1228]],\n            [[1229]],\n            [[1230]],\n            [[1231]],\n            [[1232]],\n            [[1233]],\n            [[1234]],\n            [[1235]],\n            [[1236]],\n            [[-1203, 1237, -1201, 1238, -1006, 1239, -1009]],\n            [[1240]],\n            [[1241]],\n            [[1242, -639]],\n            [[1243]],\n            [[1244]],\n            [[1245]],\n            [[1246]],\n            [[1247]],\n            [[1248]],\n            [[1249]],\n            [[1250]],\n            [[1251]],\n            [[1252]],\n            [[1253]],\n            [[1254]],\n            [[1255]],\n            [[1256]],\n            [[1257]],\n            [[1258]],\n            [[1259]],\n            [[1260]],\n            [[1261]],\n            [[1262]],\n            [[1263]],\n            [[1264]],\n            [[1265]],\n            [[1266]],\n            [[1267]],\n            [[1268]],\n            [[1269]],\n            [[1270]],\n            [\n              [\n                -1209, -444, 1271, -465, -1059, -461, -963, 1272, -154, -699, 1273, 1274, -207,\n                -1012, -643, 1275, -641, 1276, -637, 1277, -653, -1124, 1278\n              ]\n            ],\n            [[1279]],\n            [[1280]],\n            [[1281]],\n            [[1282]],\n            [[1283]],\n            [[1284]],\n            [[1285]],\n            [[1286]],\n            [[1287]],\n            [[1288]],\n            [[1289]],\n            [[1290]],\n            [[1291]],\n            [[1292]],\n            [[1293]],\n            [[1294]],\n            [[1295]],\n            [[1296]],\n            [[1297]],\n            [[1298]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"RUS\",\n          \"properties\": { \"name\": \"Russia\" }\n        },\n        {\n          \"arcs\": [[1299, -161, -504, 1300, -502, 1301]],\n          \"type\": \"Polygon\",\n          \"id\": \"RWA\",\n          \"properties\": { \"name\": \"Rwanda\" }\n        },\n        {\n          \"arcs\": [[-591, -1071, 1302, -1018]],\n          \"type\": \"Polygon\",\n          \"id\": \"ESH\",\n          \"properties\": { \"name\": \"W. Sahara\" }\n        },\n        {\n          \"arcs\": [[[1303]], [[-989, 1304, -1221, 1305, -38, -1142, 1306, 1307, -934, -909]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SAU\",\n          \"properties\": { \"name\": \"Saudi Arabia\" }\n        },\n        {\n          \"arcs\": [[[1308, -610, -651, 1309, -262, 1310, -998, -605]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SDN\",\n          \"properties\": { \"name\": \"Sudan\" }\n        },\n        {\n          \"arcs\": [[-650, -969, 1311, -496, -263, -1310]],\n          \"type\": \"Polygon\",\n          \"id\": \"SSD\",\n          \"properties\": { \"name\": \"S. Sudan\" }\n        },\n        {\n          \"arcs\": [[-1044, -709, -714, 1312, -711, 1313, -1069]],\n          \"type\": \"Polygon\",\n          \"id\": \"SEN\",\n          \"properties\": { \"name\": \"Senegal\" }\n        },\n        { \"arcs\": [[1314]], \"type\": \"Polygon\", \"id\": \"SGP\", \"properties\": { \"name\": \"Singapore\" } },\n        {\n          \"arcs\": [[[1315]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SGS\",\n          \"properties\": { \"name\": \"S. Geo. and S. Sandw. Is.\" }\n        },\n        {\n          \"arcs\": [\n            [[1316]],\n            [[1317]],\n            [[1318]],\n            [[1319]],\n            [[1320]],\n            [[1321]],\n            [[1322]],\n            [[1323]],\n            [[1324]],\n            [[1325]],\n            [[1326]],\n            [[1327]],\n            [[1328]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SLB\",\n          \"properties\": { \"name\": \"Solomon Is.\" }\n        },\n        {\n          \"arcs\": [[[1329]], [[-997, 1330, -706]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SLE\",\n          \"properties\": { \"name\": \"Sierra Leone\" }\n        },\n        {\n          \"arcs\": [[[-778, 1331, -767]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SLV\",\n          \"properties\": { \"name\": \"El Salvador\" }\n        },\n        {\n          \"arcs\": [[-931]],\n          \"type\": \"Polygon\",\n          \"id\": \"SMR\",\n          \"properties\": { \"name\": \"San Marino\" }\n        },\n        {\n          \"arcs\": [[1332, -647, -565, 1333]],\n          \"type\": \"Polygon\",\n          \"id\": \"SOL\",\n          \"properties\": { \"name\": \"Somaliland\" }\n        },\n        {\n          \"arcs\": [[-964, -648, -1333, 1334]],\n          \"type\": \"Polygon\",\n          \"id\": \"SOM\",\n          \"properties\": { \"name\": \"Somalia\" }\n        },\n        {\n          \"arcs\": [[-1225, -188, -1042, -987, -1054, -202, -787, -796]],\n          \"type\": \"Polygon\",\n          \"id\": \"SRB\",\n          \"properties\": { \"name\": \"Serbia\" }\n        },\n        {\n          \"arcs\": [[[1335]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"STP\",\n          \"properties\": { \"name\": \"S\\u00e3o Tom\\u00e9 and Principe\" }\n        },\n        {\n          \"arcs\": [[-664, -239, -771, 1336]],\n          \"type\": \"Polygon\",\n          \"id\": \"SUR\",\n          \"properties\": { \"name\": \"Suriname\" }\n        },\n        {\n          \"arcs\": [[1337, -798, -142, -551, -1205]],\n          \"type\": \"Polygon\",\n          \"id\": \"SVK\",\n          \"properties\": { \"name\": \"Slovakia\" }\n        },\n        {\n          \"arcs\": [[-789, 1338, -929, -144, -797]],\n          \"type\": \"Polygon\",\n          \"id\": \"SVN\",\n          \"properties\": { \"name\": \"Slovenia\" }\n        },\n        {\n          \"arcs\": [[[1339]], [[1340]], [[1341]], [[1342, -1125, -655]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"SWE\",\n          \"properties\": { \"name\": \"Sweden\" }\n        },\n        {\n          \"arcs\": [[-1061, 1343]],\n          \"type\": \"Polygon\",\n          \"id\": \"SWZ\",\n          \"properties\": { \"name\": \"Swaziland\" }\n        },\n        {\n          \"arcs\": [[1344, -1014]],\n          \"type\": \"Polygon\",\n          \"id\": \"SXM\",\n          \"properties\": { \"name\": \"Sint Maarten\" }\n        },\n        {\n          \"arcs\": [[-913, 911, -911, -939, -926, -995, 1345, 1346]],\n          \"type\": \"Polygon\",\n          \"id\": \"SYR\",\n          \"properties\": { \"name\": \"Syria\" }\n        },\n        {\n          \"arcs\": [[-1311, -267, -473, 1347, -481, 1348, -479, -1102, -1100, -999]],\n          \"type\": \"Polygon\",\n          \"id\": \"TCD\",\n          \"properties\": { \"name\": \"Chad\" }\n        },\n        {\n          \"arcs\": [[-171, 1349, -700, -175]],\n          \"type\": \"Polygon\",\n          \"id\": \"TGO\",\n          \"properties\": { \"name\": \"Togo\" }\n        },\n        {\n          \"arcs\": [[[1350]], [[1351]], [[-992, -976, 1352, -1089, 1353, -1052]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"THA\",\n          \"properties\": { \"name\": \"Thailand\" }\n        },\n        {\n          \"arcs\": [[[-974]], [[1354]], [[-970, -458, -6, 1355]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TJK\",\n          \"properties\": { \"name\": \"Tajikistan\" }\n        },\n        {\n          \"arcs\": [[[-4, -902, 1356, -961, 1357, 1358, 1359]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TKM\",\n          \"properties\": { \"name\": \"Turkmenistan\" }\n        },\n        {\n          \"arcs\": [[[1360, -803]], [[-805, 1361]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TLS\",\n          \"properties\": { \"name\": \"Timor-Leste\" }\n        },\n        {\n          \"arcs\": [[[1362]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TON\",\n          \"properties\": { \"name\": \"Tonga\" }\n        },\n        {\n          \"arcs\": [[[1363]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TTO\",\n          \"properties\": { \"name\": \"Trinidad and Tobago\" }\n        },\n        {\n          \"arcs\": [[[1364]], [[-1001, -586, 1365]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TUN\",\n          \"properties\": { \"name\": \"Tunisia\" }\n        },\n        {\n          \"arcs\": [[[1366, -734, -185]], [[-697, -56, -153, -906, -914, -1347, 1367]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TUR\",\n          \"properties\": { \"name\": \"Turkey\" }\n        },\n        {\n          \"arcs\": [[[1368]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TWN\",\n          \"properties\": { \"name\": \"Taiwan\" }\n        },\n        {\n          \"arcs\": [\n            [[1369]],\n            [[1370]],\n            [[1371]],\n            [[1372]],\n            [\n              [\n                1373, 1374, 1375, -966, 1376, -1067, 1377, -1074, 1378, -1076, 1379, -1078, 1380,\n                -1080, 1381, -1083, 1382, 1383, -158, -1300, 1384\n              ]\n            ]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"TZA\",\n          \"properties\": { \"name\": \"Tanzania\" }\n        },\n        {\n          \"arcs\": [\n            [[-1375, 1385]],\n            [[1386, -1385, -1302, -501, 1387, -499, 1388, -497, -1312, -968]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"UGA\",\n          \"properties\": { \"name\": \"Uganda\" }\n        },\n        {\n          \"arcs\": [[[1389, -1223, -1022, -1226, -794, -1338, -1204, -208, -1275], [1390], [1391]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"UKR\",\n          \"properties\": { \"name\": \"Ukraine\" }\n        },\n        {\n          \"arcs\": [[1392, -242, 1393, -48, -244]],\n          \"type\": \"Polygon\",\n          \"id\": \"URY\",\n          \"properties\": { \"name\": \"Uruguay\" }\n        },\n        {\n          \"arcs\": [\n            [[1394]],\n            [[1395]],\n            [[1396]],\n            [[1397]],\n            [[1398]],\n            [[1399]],\n            [[1400]],\n            [[1401]],\n            [[1402]],\n            [[1403]],\n            [[1404]],\n            [[1405]],\n            [[1406]],\n            [[1407]],\n            [[1408]],\n            [[1409]],\n            [[1410, -344]],\n            [\n              [\n                1411, -340, 1412, -338, 1413, -336, 1414, -334, -278, 1415, -276, 1416, -1033, 1417,\n                -1031, 1418, -1036, 1419, -342\n              ]\n            ],\n            [[1420]],\n            [[1421]],\n            [[1422]],\n            [[1423]],\n            [[1424]],\n            [[1425]],\n            [[1426]],\n            [[1427]],\n            [[1428]],\n            [[1429]],\n            [[1430]],\n            [[1431]],\n            [[1432]],\n            [[1433]],\n            [[1434]],\n            [[1435]],\n            [[1436]],\n            [[1437]],\n            [[1438]],\n            [[1439]],\n            [[1440]],\n            [[1441]],\n            [[1442]],\n            [[1443]],\n            [[1444]],\n            [[1445]],\n            [[1446]],\n            [[1447]],\n            [[1448]],\n            [[1449]],\n            [[1450]],\n            [[1451]],\n            [[1452]],\n            [[1453]],\n            [[-347, 345, 1454]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"USA\",\n          \"properties\": { \"name\": \"United States\" }\n        },\n        {\n          \"arcs\": [[[-534, 1455]], [[1456, -532]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"USG\",\n          \"properties\": { \"name\": \"USNB Guantanamo Bay\" }\n        },\n        {\n          \"arcs\": [\n            [[-973]],\n            [[-972]],\n            [[-955, 1457, -958, -971, -1356, -5, -1360, 1458, -1358, -960, 1459], [-1355]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"UZB\",\n          \"properties\": { \"name\": \"Uzbekistan\" }\n        },\n        { \"arcs\": [[-932]], \"type\": \"Polygon\", \"id\": \"VAT\", \"properties\": { \"name\": \"Vatican\" } },\n        {\n          \"arcs\": [[[1460]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VCT\",\n          \"properties\": { \"name\": \"St. Vin. and Gren.\" }\n        },\n        {\n          \"arcs\": [[[1461]], [[1462]], [[1463]], [[-772, -250, -513, 1464]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VEN\",\n          \"properties\": { \"name\": \"Venezuela\" }\n        },\n        {\n          \"arcs\": [[[1465]], [[1466, -978, -991, -449]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VNM\",\n          \"properties\": { \"name\": \"Vietnam\" }\n        },\n        {\n          \"arcs\": [\n            [[1467]],\n            [[1468]],\n            [[1469]],\n            [[1470]],\n            [[1471]],\n            [[1472]],\n            [[1473]],\n            [[1474]],\n            [[1475]],\n            [[1476]],\n            [[1477]],\n            [[1478]]\n          ],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"VUT\",\n          \"properties\": { \"name\": \"Vanuatu\" }\n        },\n        {\n          \"arcs\": [[1479, -547]],\n          \"type\": \"Polygon\",\n          \"id\": \"WSB\",\n          \"properties\": { \"name\": \"Akrotiri\" }\n        },\n        {\n          \"arcs\": [[[1480]], [[1481]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"WSM\",\n          \"properties\": { \"name\": \"Samoa\" }\n        },\n        {\n          \"arcs\": [[[1482]], [[1483, -1307, -1141]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"YEM\",\n          \"properties\": { \"name\": \"Yemen\" }\n        },\n        {\n          \"arcs\": [[[-1062, -1344, -1060, 1484, -1095, -260, 1485], [-1005]]],\n          \"type\": \"MultiPolygon\",\n          \"id\": \"ZAF\",\n          \"properties\": { \"name\": \"South Africa\" }\n        },\n        {\n          \"arcs\": [[-1383, -1082, -1064, 1486, 1487, 1488, -1094, -7, -508, 1489, -506, 1490]],\n          \"type\": \"Polygon\",\n          \"id\": \"ZMB\",\n          \"properties\": { \"name\": \"Zambia\" }\n        },\n        {\n          \"arcs\": [[-1063, -1486, -259, -1489, 1491, -1487]],\n          \"type\": \"Polygon\",\n          \"id\": \"ZWE\",\n          \"properties\": { \"name\": \"Zimbabwe\" }\n        }\n      ],\n      \"type\": \"GeometryCollection\"\n    }\n  },\n  \"transform\": { \"translate\": [-180, -90], \"scale\": [0.036003600360036005, 0.01736514657995801] }\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-glyph/Example.tsx",
    "content": "/* eslint-disable jsx-a11y/accessible-emoji */\nimport React from 'react';\nimport { Group } from '@visx/group';\nimport {\n  Glyph as CustomGlyph,\n  GlyphCircle,\n  GlyphCross,\n  GlyphDiamond,\n  GlyphSquare,\n  GlyphStar,\n  GlyphTriangle,\n  GlyphWye,\n} from '@visx/glyph';\nimport { LinePath } from '@visx/shape';\nimport type { DateValue } from '@visx/mock-data';\nimport { genDateValue } from '@visx/mock-data';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport { curveMonotoneX, curveBasis } from '@visx/curve';\n\nconst defaultMargin = { top: 10, right: 10, bottom: 10, left: 10 };\n\n// colors\nexport const primaryColor = '#8921e0';\nexport const secondaryColor = '#00f2ff';\nconst contrastColor = '#ffffff';\n\n// Glyphs to render\nconst Glyphs = [\n  GlyphCircle,\n  GlyphCross,\n  GlyphDiamond,\n  GlyphStar,\n  GlyphTriangle,\n  GlyphSquare,\n  GlyphWye,\n  ({ left, top }: { left: number; top: number }) => (\n    <CustomGlyph left={left} top={top}>\n      <circle r={12} fill={secondaryColor} />\n      <text fontSize={16} textAnchor=\"middle\" dy=\"0.5em\">\n        {'💜'}\n      </text>\n    </CustomGlyph>\n  ),\n];\n\nconst data: DateValue[] = genDateValue(Glyphs.length * 2, 0.91);\n\n// accessors\nconst date = (d: DateValue) => d.date.valueOf();\nconst value = (d: DateValue) => d.value;\n\n// scales\nconst xScale = scaleTime<number>({\n  domain: [Math.min(...data.map(date)), Math.max(...data.map(date))],\n});\nconst yScale = scaleLinear<number>({\n  domain: [0, Math.max(...data.map(value))],\n});\n\n// positions\nconst getX = (d: DateValue) => xScale(date(d)) ?? 0;\nconst getY = (d: DateValue) => yScale(value(d)) ?? 0;\n\nexport type GlyphProps = {\n  width: number;\n  height: number;\n  margin?: typeof defaultMargin;\n};\n\nexport default function Example({ width, height, margin = defaultMargin }: GlyphProps) {\n  if (width < 10) return null;\n\n  // bounds\n  const innerWidth = width - margin.left - margin.right;\n  const innerHeight = height - margin.top - margin.bottom;\n\n  // update scale range to match bounds\n  xScale.range([0, innerWidth]);\n  yScale.range([innerHeight, 0]);\n\n  return (\n    <svg width={width} height={height}>\n      <rect x={0} y={0} width={width} height={height} fill={secondaryColor} rx={14} />\n      <Group left={margin.left} top={margin.top}>\n        <LinePath\n          data={data}\n          x={getX}\n          y={getY}\n          stroke={primaryColor}\n          strokeWidth={2}\n          strokeDasharray=\"2,2\"\n          curve={curveBasis}\n        />\n        <LinePath\n          data={data}\n          x={getX}\n          y={getY}\n          stroke={primaryColor}\n          strokeWidth={2}\n          curve={curveMonotoneX}\n        />\n        {data.map((d, i) => {\n          const CurrGlyph = Glyphs[i % Glyphs.length];\n          const left = getX(d);\n          const top = getY(d);\n          return (\n            <g key={`line-glyph-${i}`}>\n              <CurrGlyph\n                left={left}\n                top={top}\n                size={110}\n                stroke={secondaryColor}\n                strokeWidth={10}\n              />\n              <CurrGlyph\n                left={left}\n                top={top}\n                size={110}\n                fill={i % 2 === 0 ? primaryColor : contrastColor}\n                stroke={i % 2 === 0 ? contrastColor : primaryColor}\n                strokeWidth={2}\n              />\n            </g>\n          );\n        })}\n      </Group>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-glyph/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-glyph/package.json",
    "content": "{\n  \"name\": \"@visx/demo-glyph\",\n  \"description\": \"Standalone visx glyph demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/glyph\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"svg\",\n    \"glyph\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-glyph/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-gradient/Example.tsx",
    "content": "import React from 'react';\nimport { Bar } from '@visx/shape';\nimport {\n  GradientDarkgreenGreen,\n  GradientLightgreenGreen,\n  GradientOrangeRed,\n  GradientPinkBlue,\n  GradientPinkRed,\n  GradientPurpleOrange,\n  GradientPurpleRed,\n  GradientTealBlue,\n  RadialGradient,\n  LinearGradient,\n} from '@visx/gradient';\n\nconst defaultMargin = {\n  top: 0,\n  left: 0,\n  right: 0,\n  bottom: 0,\n};\n\nconst Gradients: React.FC<{ id: string }>[] = [\n  GradientPinkRed,\n  ({ id }) => <RadialGradient id={id} from=\"#55bdd5\" to=\"#4f3681\" r=\"80%\" />,\n  GradientOrangeRed,\n  GradientPinkBlue,\n  ({ id }) => <LinearGradient id={id} from=\"#351CAB\" to=\"#621A61\" rotate=\"-45\" />,\n  GradientLightgreenGreen,\n  GradientPurpleOrange,\n  GradientTealBlue,\n  GradientPurpleRed,\n  GradientDarkgreenGreen,\n];\n\nexport type GradientProps = {\n  width: number;\n  height: number;\n  margin?: typeof defaultMargin;\n};\n\nexport default function Example({ width, height, margin = defaultMargin }: GradientProps) {\n  const numColumns = width > 600 ? 5 : 2;\n  const numRows = Gradients.length / numColumns;\n  const columnWidth = Math.max(width / numColumns, 0);\n  const rowHeight = Math.max((height - margin.bottom) / numRows, 0);\n\n  return (\n    <svg width={width} height={height}>\n      {Gradients.map((Gradient, index) => {\n        const columnIndex = index % numColumns;\n        const rowIndex = Math.floor(index / numColumns);\n        const id = `visx-gradient-demo-${index}-${rowIndex}${columnIndex}`;\n\n        return (\n          <React.Fragment key={id}>\n            {/** Like SVG <defs />, Gradients are rendered with an id */}\n            <Gradient id={id} />\n\n            {/** And are then referenced for a style attribute. */}\n            <Bar\n              fill={`url(#${id})`}\n              x={columnIndex * columnWidth}\n              y={rowIndex * rowHeight}\n              width={columnWidth}\n              height={rowHeight}\n              stroke=\"#ffffff\"\n              strokeWidth={8}\n              rx={14}\n            />\n          </React.Fragment>\n        );\n      })}\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-gradient/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-gradient/package.json",
    "content": "{\n  \"name\": \"@visx/demo-gradient\",\n  \"description\": \"Standalone visx gradient demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"svg\",\n    \"gradient\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-gradient/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-heatmap/Example.tsx",
    "content": "import React from 'react';\nimport { Group } from '@visx/group';\nimport type { Bin, Bins } from '@visx/mock-data';\nimport { genBins, getSeededRandom } from '@visx/mock-data';\nimport { scaleLinear } from '@visx/scale';\nimport { HeatmapCircle, HeatmapRect } from '@visx/heatmap';\n\nconst hot1 = '#77312f';\nconst hot2 = '#f33d15';\nconst cool1 = '#122549';\nconst cool2 = '#b4fbde';\nexport const background = '#28272c';\n\nconst seededRandom = getSeededRandom(0.41);\n\nconst binData = genBins(\n  /* length = */ 16,\n  /* height = */ 16,\n  /** binFunc */ (idx) => 150 * idx,\n  /** countFunc */ (i, number) => 25 * (number - i) * seededRandom(),\n);\n\nfunction max<Datum>(data: Datum[], value: (d: Datum) => number): number {\n  return Math.max(...data.map(value));\n}\n\nfunction min<Datum>(data: Datum[], value: (d: Datum) => number): number {\n  return Math.min(...data.map(value));\n}\n\n// accessors\nconst bins = (d: Bins) => d.bins;\nconst count = (d: Bin) => d.count;\n\nconst colorMax = max(binData, (d) => max(bins(d), count));\nconst bucketSizeMax = max(binData, (d) => bins(d).length);\n\n// scales\nconst xScale = scaleLinear<number>({\n  domain: [0, binData.length],\n});\nconst yScale = scaleLinear<number>({\n  domain: [0, bucketSizeMax],\n});\nconst circleColorScale = scaleLinear<string>({\n  range: [hot1, hot2],\n  domain: [0, colorMax],\n});\nconst rectColorScale = scaleLinear<string>({\n  range: [cool1, cool2],\n  domain: [0, colorMax],\n});\nconst opacityScale = scaleLinear<number>({\n  range: [0.1, 1],\n  domain: [0, colorMax],\n});\n\nexport type HeatmapProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  separation?: number;\n  events?: boolean;\n};\n\nconst defaultMargin = { top: 10, left: 20, right: 20, bottom: 110 };\n\nfunction Example({\n  width,\n  height,\n  events = false,\n  margin = defaultMargin,\n  separation = 20,\n}: HeatmapProps) {\n  // bounds\n  const size =\n    width > margin.left + margin.right ? width - margin.left - margin.right - separation : width;\n  const xMax = size / 2;\n  const yMax = height - margin.bottom - margin.top;\n\n  const binWidth = xMax / binData.length;\n  const binHeight = yMax / bucketSizeMax;\n  const radius = min([binWidth, binHeight], (d) => d) / 2;\n\n  xScale.range([0, xMax]);\n  yScale.range([yMax, 0]);\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <rect x={0} y={0} width={width} height={height} rx={14} fill={background} />\n      <Group top={margin.top} left={margin.left}>\n        <HeatmapCircle\n          data={binData}\n          xScale={(d) => xScale(d) ?? 0}\n          yScale={(d) => yScale(d) ?? 0}\n          colorScale={circleColorScale}\n          opacityScale={opacityScale}\n          radius={radius}\n          gap={2}\n        >\n          {(heatmap) =>\n            heatmap.map((heatmapBins) =>\n              heatmapBins.map((bin) => (\n                <circle\n                  key={`heatmap-circle-${bin.row}-${bin.column}`}\n                  className=\"visx-heatmap-circle\"\n                  cx={bin.cx}\n                  cy={bin.cy}\n                  r={bin.r}\n                  fill={bin.color}\n                  fillOpacity={bin.opacity}\n                  onClick={() => {\n                    if (!events) return;\n                    const { row, column } = bin;\n                    alert(JSON.stringify({ row, column, bin: bin.bin }));\n                  }}\n                />\n              )),\n            )\n          }\n        </HeatmapCircle>\n      </Group>\n      <Group top={margin.top} left={xMax + margin.left + separation}>\n        <HeatmapRect\n          data={binData}\n          xScale={(d) => xScale(d) ?? 0}\n          yScale={(d) => yScale(d) ?? 0}\n          colorScale={rectColorScale}\n          opacityScale={opacityScale}\n          binWidth={binWidth}\n          binHeight={binWidth}\n          gap={2}\n        >\n          {(heatmap) =>\n            heatmap.map((heatmapBins) =>\n              heatmapBins.map((bin) => (\n                <rect\n                  key={`heatmap-rect-${bin.row}-${bin.column}`}\n                  className=\"visx-heatmap-rect\"\n                  width={bin.width}\n                  height={bin.height}\n                  x={bin.x}\n                  y={bin.y}\n                  fill={bin.color}\n                  fillOpacity={bin.opacity}\n                  onClick={() => {\n                    if (!events) return;\n                    const { row, column } = bin;\n                    alert(JSON.stringify({ row, column, bin: bin.bin }));\n                  }}\n                />\n              )),\n            )\n          }\n        </HeatmapRect>\n      </Group>\n    </svg>\n  );\n}\n\nexport default Example;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-heatmap/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-heatmap/package.json",
    "content": "{\n  \"name\": \"@visx/demo-heatmap\",\n  \"description\": \"Standalone visx heatmap demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/group\": \"latest\",\n    \"@visx/heatmap\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"heatmap\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-heatmap/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-legend/Example.tsx",
    "content": "import React from 'react';\nimport { format } from '@visx/vendor/d3-format';\nimport { scaleLinear, scaleOrdinal, scaleThreshold, scaleQuantile } from '@visx/scale';\nimport { GlyphStar, GlyphWye, GlyphTriangle, GlyphDiamond } from '@visx/glyph';\nimport {\n  Legend,\n  LegendLinear,\n  LegendQuantile,\n  LegendOrdinal,\n  LegendSize,\n  LegendThreshold,\n  LegendItem,\n  LegendLabel,\n} from '@visx/legend';\n\nconst oneDecimalFormat = format('.1f');\n\nconst sizeScale = scaleLinear<number>({\n  domain: [0, 10],\n  range: [5, 13],\n});\n\nconst sizeColorScale = scaleLinear({\n  domain: [0, 10],\n  range: ['#75fcfc', '#3236b8'],\n});\n\nconst quantileScale = scaleQuantile({\n  domain: [0, 0.15],\n  range: ['#eb4d70', '#f19938', '#6ce18b', '#78f6ef', '#9096f8'],\n});\n\nconst linearScale = scaleLinear({\n  domain: [0, 10],\n  range: ['#ed4fbb', '#e9a039'],\n});\n\nconst thresholdScale = scaleThreshold({\n  domain: [0.01, 0.02, 0.04, 0.06, 0.08],\n  range: ['#f2f0f7', '#dadaeb', '#bcbddc', '#9e9ac8', '#756bb1', '#54278f'],\n});\n\nconst ordinalColorScale = scaleOrdinal({\n  domain: ['a', 'b', 'c', 'd'],\n  range: ['#66d981', '#71f5ef', '#4899f1', '#7d81f6'],\n});\n\nconst ordinalColor2Scale = scaleOrdinal({\n  domain: ['a', 'b', 'c', 'd'],\n  range: ['#fae856', '#f29b38', '#e64357', '#8386f7'],\n});\n\nconst shapeScale = scaleOrdinal<string, React.FC | React.ReactNode>({\n  domain: ['a', 'b', 'c', 'd', 'e'],\n  range: [\n    <GlyphStar key=\"a\" size={50} top={50 / 6} left={50 / 6} fill=\"#dd59b8\" />,\n    <GlyphWye key=\"b\" size={50} top={50 / 6} left={50 / 6} fill=\"#de6a9a\" />,\n    <GlyphTriangle key=\"c\" size={50} top={50 / 6} left={50 / 6} fill=\"#de7d7b\" />,\n    <GlyphDiamond key=\"d\" size={50} top={50 / 6} left={50 / 6} fill=\"#df905f\" />,\n    () => (\n      <text key=\"e\" fontSize=\"12\" dy=\"1em\" dx=\".33em\" fill=\"#e0a346\">\n        $\n      </text>\n    ),\n  ],\n});\n\nfunction LegendDemo({ title, children }: { title: string; children: React.ReactNode }) {\n  return (\n    <div className=\"legend\">\n      <div className=\"title\">{title}</div>\n      {children}\n      <style jsx>{`\n        .legend {\n          line-height: 0.9em;\n          color: #efefef;\n          font-size: 10px;\n          font-family: arial;\n          padding: 10px 10px;\n          float: left;\n          border: 1px solid rgba(255, 255, 255, 0.3);\n          border-radius: 8px;\n          margin: 5px 5px;\n        }\n        .title {\n          font-size: 12px;\n          margin-bottom: 10px;\n          font-weight: 100;\n        }\n      `}</style>\n    </div>\n  );\n}\n\nconst legendGlyphSize = 15;\n\nexport default function Example({ events = false }: { events?: boolean }) {\n  return (\n    <div className=\"legends\">\n      <LegendDemo title=\"Size\">\n        <LegendSize scale={sizeScale}>\n          {(labels) =>\n            labels.map((label) => {\n              const size = sizeScale(label.datum) ?? 0;\n              const color = sizeColorScale(label.datum);\n              return (\n                <LegendItem\n                  key={`legend-${label.text}-${label.index}`}\n                  onClick={() => {\n                    if (events) alert(`clicked: ${JSON.stringify(label)}`);\n                  }}\n                >\n                  <svg width={size} height={size} style={{ margin: '5px 0' }}>\n                    <circle fill={color} r={size / 2} cx={size / 2} cy={size / 2} />\n                  </svg>\n                  <LegendLabel align=\"left\" margin=\"0 4px\">\n                    {label.text}\n                  </LegendLabel>\n                </LegendItem>\n              );\n            })\n          }\n        </LegendSize>\n      </LegendDemo>\n      <LegendDemo title=\"Quantile\">\n        <LegendQuantile scale={quantileScale}>\n          {(labels) =>\n            labels.map((label, i) => (\n              <LegendItem\n                key={`legend-${i}`}\n                onClick={() => {\n                  if (events) alert(`clicked: ${JSON.stringify(label)}`);\n                }}\n              >\n                <svg width={legendGlyphSize} height={legendGlyphSize} style={{ margin: '2px 0' }}>\n                  <circle\n                    fill={label.value}\n                    r={legendGlyphSize / 2}\n                    cx={legendGlyphSize / 2}\n                    cy={legendGlyphSize / 2}\n                  />\n                </svg>\n                <LegendLabel align=\"left\" margin=\"0 4px\">\n                  {label.text}\n                </LegendLabel>\n              </LegendItem>\n            ))\n          }\n        </LegendQuantile>\n      </LegendDemo>\n      <LegendDemo title=\"Linear\">\n        <LegendLinear\n          scale={linearScale}\n          labelFormat={(d, i) => (i % 2 === 0 ? oneDecimalFormat(d) : '')}\n        >\n          {(labels) =>\n            labels.map((label, i) => (\n              <LegendItem\n                key={`legend-quantile-${i}`}\n                onClick={() => {\n                  if (events) alert(`clicked: ${JSON.stringify(label)}`);\n                }}\n              >\n                <svg width={legendGlyphSize} height={legendGlyphSize} style={{ margin: '2px 0' }}>\n                  <circle\n                    fill={label.value}\n                    r={legendGlyphSize / 2}\n                    cx={legendGlyphSize / 2}\n                    cy={legendGlyphSize / 2}\n                  />\n                </svg>\n                <LegendLabel align=\"left\" margin=\"0 4px\">\n                  {label.text}\n                </LegendLabel>\n              </LegendItem>\n            ))\n          }\n        </LegendLinear>\n      </LegendDemo>\n      <LegendDemo title=\"Threshold\">\n        <LegendThreshold scale={thresholdScale}>\n          {(labels) =>\n            labels.reverse().map((label, i) => (\n              <LegendItem\n                key={`legend-quantile-${i}`}\n                margin=\"1px 0\"\n                onClick={() => {\n                  if (events) alert(`clicked: ${JSON.stringify(label)}`);\n                }}\n              >\n                <svg width={legendGlyphSize} height={legendGlyphSize}>\n                  <rect fill={label.value} width={legendGlyphSize} height={legendGlyphSize} />\n                </svg>\n                <LegendLabel align=\"left\" margin=\"2px 0 0 10px\">\n                  {label.text}\n                </LegendLabel>\n              </LegendItem>\n            ))\n          }\n        </LegendThreshold>\n      </LegendDemo>\n      <LegendDemo title=\"Ordinal\">\n        <LegendOrdinal scale={ordinalColorScale} labelFormat={(label) => `${label.toUpperCase()}`}>\n          {(labels) => (\n            <div style={{ display: 'flex', flexDirection: 'row' }}>\n              {labels.map((label, i) => (\n                <LegendItem\n                  key={`legend-quantile-${i}`}\n                  margin=\"0 5px\"\n                  onClick={() => {\n                    if (events) alert(`clicked: ${JSON.stringify(label)}`);\n                  }}\n                >\n                  <svg width={legendGlyphSize} height={legendGlyphSize}>\n                    <rect fill={label.value} width={legendGlyphSize} height={legendGlyphSize} />\n                  </svg>\n                  <LegendLabel align=\"left\" margin=\"0 0 0 4px\">\n                    {label.text}\n                  </LegendLabel>\n                </LegendItem>\n              ))}\n            </div>\n          )}\n        </LegendOrdinal>\n      </LegendDemo>\n      <LegendDemo title=\"Custom Legend\">\n        <Legend scale={shapeScale}>\n          {(labels) => (\n            <div style={{ display: 'flex', flexDirection: 'row' }}>\n              {labels.map((label, i) => {\n                const color = ordinalColor2Scale(label.datum);\n                const shape = shapeScale(label.datum);\n                const isValidElement = React.isValidElement(shape);\n                return (\n                  <LegendItem\n                    key={`legend-quantile-${i}`}\n                    margin=\"0 4px 0 0\"\n                    flexDirection=\"column\"\n                    onClick={() => {\n                      const { datum, index } = label;\n                      if (events) alert(`clicked: ${JSON.stringify({ datum, color, index })}`);\n                    }}\n                  >\n                    <svg\n                      width={legendGlyphSize}\n                      height={legendGlyphSize}\n                      style={{ margin: '0 0 8px 0' }}\n                    >\n                      {isValidElement\n                        ? React.cloneElement(shape as React.ReactElement)\n                        : React.createElement(shape as React.ComponentType<{ fill: string }>, {\n                            fill: color,\n                          })}\n                    </svg>\n                    <LegendLabel align=\"left\" margin={0}>\n                      {label.text}\n                    </LegendLabel>\n                  </LegendItem>\n                );\n              })}\n            </div>\n          )}\n        </Legend>\n      </LegendDemo>\n\n      <style jsx>{`\n        .legends {\n          font-family: arial;\n          font-weight: 900;\n          background-color: black;\n          border-radius: 14px;\n          padding: 24px 24px 24px 32px;\n          overflow-y: auto;\n          flex-grow: 1;\n        }\n        .chart h2 {\n          margin-left: 10px;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-legend/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(<Example />);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-legend/package.json",
    "content": "{\n  \"name\": \"@visx/demo-legend\",\n  \"description\": \"Standalone visx legends demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/glyph\": \"latest\",\n    \"@visx/legend\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"legend\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-legend/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-linktypes/Example.tsx",
    "content": "import React, { useState } from 'react';\nimport { Group } from '@visx/group';\nimport { hierarchy, Tree } from '@visx/hierarchy';\nimport { LinearGradient } from '@visx/gradient';\nimport { pointRadial } from 'd3-shape';\nimport useForceUpdate from './useForceUpdate';\nimport LinkControls from './LinkControls';\nimport getLinkComponent from './getLinkComponent';\n\ninterface TreeNode {\n  name: string;\n  isExpanded?: boolean;\n  children?: TreeNode[];\n}\n\nconst data: TreeNode = {\n  name: 'T',\n  children: [\n    {\n      name: 'A',\n      children: [\n        { name: 'A1' },\n        { name: 'A2' },\n        { name: 'A3' },\n        {\n          name: 'C',\n          children: [\n            {\n              name: 'C1',\n            },\n            {\n              name: 'D',\n              children: [\n                {\n                  name: 'D1',\n                },\n                {\n                  name: 'D2',\n                },\n                {\n                  name: 'D3',\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    },\n    { name: 'Z' },\n    {\n      name: 'B',\n      children: [{ name: 'B1' }, { name: 'B2' }, { name: 'B3' }],\n    },\n  ],\n};\n\nconst defaultMargin = { top: 30, left: 30, right: 30, bottom: 70 };\n\nexport type LinkTypesProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function Example({\n  width: totalWidth,\n  height: totalHeight,\n  margin = defaultMargin,\n}: LinkTypesProps) {\n  const [layout, setLayout] = useState<string>('cartesian');\n  const [orientation, setOrientation] = useState<string>('horizontal');\n  const [linkType, setLinkType] = useState<string>('diagonal');\n  const [stepPercent, setStepPercent] = useState<number>(0.5);\n  const forceUpdate = useForceUpdate();\n\n  const innerWidth = totalWidth - margin.left - margin.right;\n  const innerHeight = totalHeight - margin.top - margin.bottom;\n\n  let origin: { x: number; y: number };\n  let sizeWidth: number;\n  let sizeHeight: number;\n\n  if (layout === 'polar') {\n    origin = {\n      x: innerWidth / 2,\n      y: innerHeight / 2,\n    };\n    sizeWidth = 2 * Math.PI;\n    sizeHeight = Math.min(innerWidth, innerHeight) / 2;\n  } else {\n    origin = { x: 0, y: 0 };\n    if (orientation === 'vertical') {\n      sizeWidth = innerWidth;\n      sizeHeight = innerHeight;\n    } else {\n      sizeWidth = innerHeight;\n      sizeHeight = innerWidth;\n    }\n  }\n\n  const LinkComponent = getLinkComponent({ layout, linkType, orientation });\n\n  return totalWidth < 10 ? null : (\n    <div>\n      <LinkControls\n        layout={layout}\n        orientation={orientation}\n        linkType={linkType}\n        stepPercent={stepPercent}\n        setLayout={setLayout}\n        setOrientation={setOrientation}\n        setLinkType={setLinkType}\n        setStepPercent={setStepPercent}\n      />\n      <svg width={totalWidth} height={totalHeight}>\n        <LinearGradient id=\"links-gradient\" from=\"#fd9b93\" to=\"#fe6e9e\" />\n        <rect width={totalWidth} height={totalHeight} rx={14} fill=\"#272b4d\" />\n        <Group top={margin.top} left={margin.left}>\n          <Tree\n            root={hierarchy(data, (d) => (d.isExpanded ? null : d.children))}\n            size={[sizeWidth, sizeHeight]}\n            separation={(a, b) => (a.parent === b.parent ? 1 : 0.5) / a.depth}\n          >\n            {(tree) => (\n              <Group top={origin.y} left={origin.x}>\n                {tree.links().map((link, i) => (\n                  <LinkComponent\n                    key={i}\n                    data={link}\n                    percent={stepPercent}\n                    stroke=\"rgb(254,110,158,0.6)\"\n                    strokeWidth=\"1\"\n                    fill=\"none\"\n                  />\n                ))}\n\n                {tree.descendants().map((node, key) => {\n                  const width = 40;\n                  const height = 20;\n\n                  let top: number;\n                  let left: number;\n                  if (layout === 'polar') {\n                    const [radialX, radialY] = pointRadial(node.x, node.y);\n                    top = radialY;\n                    left = radialX;\n                  } else if (orientation === 'vertical') {\n                    top = node.y;\n                    left = node.x;\n                  } else {\n                    top = node.x;\n                    left = node.y;\n                  }\n\n                  return (\n                    <Group top={top} left={left} key={key}>\n                      {node.depth === 0 && (\n                        <circle\n                          r={12}\n                          fill=\"url('#links-gradient')\"\n                          onClick={() => {\n                            node.data.isExpanded = !node.data.isExpanded;\n                            console.log(node);\n                            forceUpdate();\n                          }}\n                        />\n                      )}\n                      {node.depth !== 0 && (\n                        <rect\n                          height={height}\n                          width={width}\n                          y={-height / 2}\n                          x={-width / 2}\n                          fill=\"#272b4d\"\n                          stroke={node.data.children ? '#03c0dc' : '#26deb0'}\n                          strokeWidth={1}\n                          strokeDasharray={node.data.children ? '0' : '2,2'}\n                          strokeOpacity={node.data.children ? 1 : 0.6}\n                          rx={node.data.children ? 0 : 10}\n                          onClick={() => {\n                            node.data.isExpanded = !node.data.isExpanded;\n                            console.log(node);\n                            forceUpdate();\n                          }}\n                        />\n                      )}\n                      <text\n                        dy=\".33em\"\n                        fontSize={9}\n                        fontFamily=\"Arial\"\n                        textAnchor=\"middle\"\n                        style={{ pointerEvents: 'none' }}\n                        fill={node.depth === 0 ? '#71248e' : node.children ? 'white' : '#26deb0'}\n                      >\n                        {node.data.name}\n                      </text>\n                    </Group>\n                  );\n                })}\n              </Group>\n            )}\n          </Tree>\n        </Group>\n      </svg>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-linktypes/LinkControls.tsx",
    "content": "import React from 'react';\n\nconst controlStyles = { fontSize: 10 };\n\ntype Props = {\n  layout: string;\n  orientation: string;\n  linkType: string;\n  stepPercent: number;\n  setLayout: (layout: string) => void;\n  setOrientation: (orientation: string) => void;\n  setLinkType: (linkType: string) => void;\n  setStepPercent: (percent: number) => void;\n};\n\nexport default function LinkControls({\n  layout,\n  orientation,\n  linkType,\n  stepPercent,\n  setLayout,\n  setOrientation,\n  setLinkType,\n  setStepPercent,\n}: Props) {\n  return (\n    <div style={controlStyles}>\n      <label>layout:</label>&nbsp;\n      <select\n        onClick={(e) => e.stopPropagation()}\n        onChange={(e) => setLayout(e.target.value)}\n        value={layout}\n      >\n        <option value=\"cartesian\">cartesian</option>\n        <option value=\"polar\">polar</option>\n      </select>\n      &nbsp;&nbsp;\n      <label>orientation:</label>&nbsp;\n      <select\n        onClick={(e) => e.stopPropagation()}\n        onChange={(e) => setOrientation(e.target.value)}\n        value={orientation}\n        disabled={layout === 'polar'}\n      >\n        <option value=\"vertical\">vertical</option>\n        <option value=\"horizontal\">horizontal</option>\n      </select>\n      &nbsp;&nbsp;\n      <label>link:</label>&nbsp;\n      <select\n        onClick={(e) => e.stopPropagation()}\n        onChange={(e) => setLinkType(e.target.value)}\n        value={linkType}\n      >\n        <option value=\"diagonal\">diagonal</option>\n        <option value=\"step\">step</option>\n        <option value=\"curve\">curve</option>\n        <option value=\"line\">line</option>\n      </select>\n      {linkType === 'step' && layout !== 'polar' && (\n        <>\n          &nbsp;&nbsp;\n          <label>step:</label>&nbsp;\n          <input\n            onClick={(e) => e.stopPropagation()}\n            type=\"range\"\n            min={0}\n            max={1}\n            step={0.1}\n            onChange={(e) => setStepPercent(Number(e.target.value))}\n            value={stepPercent}\n            disabled={linkType !== 'step' || layout === 'polar'}\n          />\n        </>\n      )}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-linktypes/getLinkComponent.ts",
    "content": "import type { ComponentType } from 'react';\nimport {\n  LinkHorizontal,\n  LinkVertical,\n  LinkRadial,\n  LinkHorizontalStep,\n  LinkVerticalStep,\n  LinkRadialStep,\n  LinkHorizontalCurve,\n  LinkVerticalCurve,\n  LinkRadialCurve,\n  LinkHorizontalLine,\n  LinkVerticalLine,\n  LinkRadialLine,\n} from '@visx/shape';\n\nexport default function getLinkComponent({\n  layout,\n  linkType,\n  orientation,\n}: {\n  layout: string;\n  linkType: string;\n  orientation: string;\n}): ComponentType<any> {\n  let LinkComponent: ComponentType<any>;\n\n  if (layout === 'polar') {\n    if (linkType === 'step') {\n      LinkComponent = LinkRadialStep;\n    } else if (linkType === 'curve') {\n      LinkComponent = LinkRadialCurve;\n    } else if (linkType === 'line') {\n      LinkComponent = LinkRadialLine;\n    } else {\n      LinkComponent = LinkRadial;\n    }\n  } else if (orientation === 'vertical') {\n    if (linkType === 'step') {\n      LinkComponent = LinkVerticalStep;\n    } else if (linkType === 'curve') {\n      LinkComponent = LinkVerticalCurve;\n    } else if (linkType === 'line') {\n      LinkComponent = LinkVerticalLine;\n    } else {\n      LinkComponent = LinkVertical;\n    }\n  } else if (linkType === 'step') {\n    LinkComponent = LinkHorizontalStep;\n  } else if (linkType === 'curve') {\n    LinkComponent = LinkHorizontalCurve;\n  } else if (linkType === 'line') {\n    LinkComponent = LinkHorizontalLine;\n  } else {\n    LinkComponent = LinkHorizontal;\n  }\n  return LinkComponent;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-linktypes/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-linktypes/package.json",
    "content": "{\n  \"name\": \"@visx/demo-linktypes\",\n  \"description\": \"Standalone visx link types demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/hierarchy\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"d3-shape\": \"3.2.0\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"link\",\n    \"shape\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-linktypes/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-linktypes/useForceUpdate.ts",
    "content": "import { useState } from 'react';\n\nexport default function useForceUpdate() {\n  const [, setValue] = useState<number>(0);\n  return () => setValue((value) => value + 1); // update state to force render\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-network/Example.tsx",
    "content": "/* eslint-disable react/no-unstable-nested-components */\nimport React from 'react';\nimport { DefaultNode, Graph } from '@visx/network';\n\nexport type NetworkProps = {\n  width: number;\n  height: number;\n};\n\ninterface CustomNode {\n  x: number;\n  y: number;\n  color?: string;\n}\n\ninterface CustomLink {\n  source: CustomNode;\n  target: CustomNode;\n  dashed?: boolean;\n}\n\nconst nodes: CustomNode[] = [\n  { x: 50, y: 20 },\n  { x: 200, y: 250 },\n  { x: 300, y: 40, color: '#26deb0' },\n];\n\nconst links: CustomLink[] = [\n  { source: nodes[0], target: nodes[1] },\n  { source: nodes[1], target: nodes[2] },\n  { source: nodes[2], target: nodes[0], dashed: true },\n];\n\nconst graph = {\n  nodes,\n  links,\n};\n\nexport const background = '#272b4d';\n\nexport default function Example({ width, height }: NetworkProps) {\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <rect width={width} height={height} rx={14} fill={background} />\n      <Graph<CustomLink, CustomNode>\n        graph={graph}\n        top={20}\n        left={100}\n        nodeComponent={({ node: { color } }) =>\n          color ? <DefaultNode fill={color} /> : <DefaultNode />\n        }\n        linkComponent={({ link: { source, target, dashed } }) => (\n          <line\n            x1={source.x}\n            y1={source.y}\n            x2={target.x}\n            y2={target.y}\n            strokeWidth={2}\n            stroke=\"#999\"\n            strokeOpacity={0.6}\n            strokeDasharray={dashed ? '8,4' : undefined}\n          />\n        )}\n      />\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-network/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-network/package.json",
    "content": "{\n  \"name\": \"@visx/demo-network\",\n  \"description\": \"Standalone visx network demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/network\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"network\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-network/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pack/Example.tsx",
    "content": "import React from 'react';\nimport { Group } from '@visx/group';\nimport { Pack, hierarchy } from '@visx/hierarchy';\nimport { scaleQuantize } from '@visx/scale';\nimport type { Exoplanets as Datum } from '@visx/mock-data';\nimport { exoplanets as rawData } from '@visx/mock-data';\n\nfunction extent<D>(allData: D[], value: (d: D) => number): [number, number] {\n  return [Math.min(...allData.map(value)), Math.max(...allData.map(value))];\n}\n\nconst filteredPlanets = rawData.filter((d) => d.distance !== 0 && d.distance != null);\nconst pack = { children: filteredPlanets, name: 'root', radius: 0, distance: 0 };\n\nconst colorScale = scaleQuantize({\n  domain: extent(rawData, (d) => d.radius),\n  range: ['#ffe108', '#ffc10e', '#fd6d6f', '#855af2', '#11d2f9', '#49f4e7'],\n});\n\nconst root = hierarchy<Datum>(pack)\n  .sum((d) => d.radius * d.radius)\n  .sort(\n    (a, b) =>\n      // sort by hierarchy, then distance\n      (a?.data ? 1 : -1) - (b?.data ? 1 : -1) ||\n      (a.children ? 1 : -1) - (b.children ? 1 : -1) ||\n      (a.data.distance == null ? -1 : 1) - (b.data.distance == null ? -1 : 1) ||\n      a.data.distance! - b.data.distance!,\n  );\n\nconst defaultMargin = { top: 10, left: 30, right: 40, bottom: 80 };\n\nexport type PackProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function Example({ width, height, margin = defaultMargin }: PackProps) {\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <rect width={width} height={height} rx={14} fill=\"#ffffff\" />\n\n      <Pack<Datum> root={root} size={[width * 2, height * 2]}>\n        {(packData) => {\n          const circles = packData.descendants().slice(2); // skip outer hierarchies\n          return (\n            <Group top={-height - margin.bottom} left={-width / 2}>\n              {circles.map((circle, i) => (\n                <circle\n                  key={`circle-${i}`}\n                  r={circle.r}\n                  cx={circle.x}\n                  cy={circle.y}\n                  fill={colorScale(circle.data.radius)}\n                />\n              ))}\n            </Group>\n          );\n        }}\n      </Pack>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pack/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pack/package.json",
    "content": "{\n  \"name\": \"@visx/demo-pack\",\n  \"description\": \"Standalone visx hierarchy pack demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/group\": \"latest\",\n    \"@visx/hierarchy\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"hierarchy\",\n    \"pack\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pack/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pattern/Example.tsx",
    "content": "import React from 'react';\nimport { Bar } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport {\n  Pattern as CustomPattern,\n  PatternLines,\n  PatternCircles,\n  PatternWaves,\n} from '@visx/pattern';\n\nconst defaultMargin = {\n  top: 0,\n  left: 0,\n  right: 0,\n  bottom: 80,\n};\n\nexport type PatternProps = {\n  width: number;\n  height: number;\n  margin?: typeof defaultMargin;\n};\n\nconst Patterns: React.FC<{ id: string; prefersReducedMotion?: boolean }>[] = [\n  ({ id }) => <PatternLines id={id} height={6} width={6} stroke=\"black\" strokeWidth={1} />,\n  ({ id, prefersReducedMotion }) => (\n    <CustomPattern id={id} width={10} height={10}>\n      {!prefersReducedMotion && (\n        <animateTransform\n          attributeType=\"xml\"\n          attributeName=\"patternTransform\"\n          type=\"translate\"\n          from=\"0 0\"\n          to=\"0 30\"\n          dur=\"10s\"\n          repeatCount=\"indefinite\"\n        />\n      )}\n\n      {/* transform-origin is a recent svg attribute */}\n      {/* eslint-disable-next-line react/no-unknown-property */}\n      <circle cx={5} cy={5} r=\"3\" stroke=\"none\" fill=\"black\" transform-origin=\"center\" />\n    </CustomPattern>\n  ),\n  ({ id }) => (\n    <PatternLines\n      id={id}\n      height={6}\n      width={6}\n      stroke=\"black\"\n      strokeWidth={1}\n      orientation={['horizontal']}\n    />\n  ),\n  ({ id }) => (\n    <PatternLines\n      id={id}\n      height={6}\n      width={6}\n      stroke=\"black\"\n      strokeWidth={1}\n      orientation={['diagonal']}\n    />\n  ),\n  ({ id }) => (\n    <PatternLines\n      id={id}\n      height={6}\n      width={6}\n      stroke=\"black\"\n      strokeWidth={1}\n      orientation={['diagonalRightToLeft']}\n    />\n  ),\n  ({ id }) => (\n    <PatternLines\n      id={id}\n      height={6}\n      width={6}\n      stroke=\"black\"\n      strokeWidth={1}\n      orientation={['vertical', 'horizontal']}\n    />\n  ),\n  ({ id }) => <PatternCircles id={id} height={10} width={10} fill=\"black\" complement />,\n  ({ id, prefersReducedMotion }) => {\n    const width = 10;\n    const height = 10;\n\n    return (\n      <CustomPattern id={id} width={width} height={height}>\n        {!prefersReducedMotion && (\n          <animateTransform\n            attributeType=\"xml\"\n            attributeName=\"patternTransform\"\n            type=\"translate\"\n            from=\"0 0\"\n            to=\"50 0\"\n            dur=\"10s\"\n            repeatCount=\"indefinite\"\n          />\n        )}\n        <path\n          d={`M 0 ${height / 2} c ${height / 8} ${-height / 4} , ${(height * 3) / 8} ${\n            -height / 4\n          } , ${height / 2} 0\n               c ${height / 8} ${height / 4} , ${(height * 3) / 8} ${height / 4} , ${\n            height / 2\n          } 0 M ${-height / 2} ${height / 2}\n               c ${height / 8} ${height / 4} , ${(height * 3) / 8} ${height / 4} , ${\n            height / 2\n          } 0 M ${height} ${height / 2}\n               c ${height / 8} ${-height / 4} , ${(height * 3) / 8} ${-height / 4} , ${\n            height / 2\n          } 0`}\n          fill=\"none\"\n          stroke=\"black\"\n          strokeWidth={1}\n        />\n      </CustomPattern>\n    );\n  },\n  ({ id }) => (\n    <PatternWaves id={id} height={6} width={6} fill=\"transparent\" stroke=\"black\" strokeWidth={1} />\n  ),\n];\n\nexport default function Example({ width, height, margin = defaultMargin }: PatternProps) {\n  // use non-animated components if prefers-reduced-motion is set\n  const prefersReducedMotionQuery =\n    typeof window === 'undefined' ? false : window.matchMedia('(prefers-reduced-motion: reduce)');\n  const prefersReducedMotion = !prefersReducedMotionQuery || !!prefersReducedMotionQuery.matches;\n\n  const numColumns = 3;\n  const numRows = Patterns.length / numColumns;\n  const columnWidth = Math.max((width - margin.left - margin.right) / numColumns, 0);\n  const rowHeight = Math.max((height - margin.bottom - margin.top) / numRows, 0);\n\n  return width >= 10 ? (\n    <svg width={width} height={height}>\n      <rect x={0} y={0} width={width} height={height} fill=\"#f5f2e3\" rx={14} />\n      <Group top={margin.top} left={margin.left}>\n        {Patterns.map((Pattern, index) => {\n          const columnIndex = index % numColumns;\n          const rowIndex = Math.floor(index / numColumns);\n          const id = `visx-pattern-demo-${index}-${rowIndex}-${columnIndex}`;\n\n          return (\n            <React.Fragment key={id}>\n              {/** Like SVG <defs />, Patterns are rendered with an id */}\n              <Pattern id={id} prefersReducedMotion={prefersReducedMotion} />\n\n              {/** And are then referenced for a style attribute. */}\n              <Bar\n                fill={`url(#${id})`}\n                x={columnIndex * columnWidth}\n                y={rowIndex * rowHeight}\n                width={columnWidth}\n                height={rowHeight}\n                rx={14}\n              />\n            </React.Fragment>\n          );\n        })}\n      </Group>\n    </svg>\n  ) : null;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pattern/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pattern/package.json",
    "content": "{\n  \"name\": \"@visx/demo-pattern\",\n  \"description\": \"Standalone visx pattern demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/group\": \"latest\",\n    \"@visx/pattern\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-pattern/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-polygons/Example.tsx",
    "content": "import React from 'react';\nimport { Polygon } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { scaleBand } from '@visx/scale';\nimport { GradientPinkRed } from '@visx/gradient';\n\nexport const background = '#7f82e3';\nconst polygonSize = 25;\nconst defaultMargin = { top: 10, right: 10, bottom: 10, left: 10 };\n\nconst polygons = [\n  {\n    sides: 3,\n    fill: 'rgb(174, 238, 248)',\n    rotate: 90,\n  },\n  {\n    sides: 4,\n    fill: 'rgb(229, 253, 61)',\n    rotate: 45,\n  },\n  {\n    sides: 6,\n    fill: 'rgb(229, 130, 255)',\n    rotate: 0,\n  },\n  {\n    sides: 8,\n    fill: 'url(#polygon-pink)',\n    rotate: 0,\n  },\n];\n\nconst yScale = scaleBand<number>({\n  domain: polygons.map((p, i) => i),\n  padding: 0.8,\n});\n\nexport type PolygonProps = {\n  width: number;\n  height: number;\n  margin?: typeof defaultMargin;\n};\n\nexport default function ({ width, height, margin = defaultMargin }: PolygonProps) {\n  yScale.rangeRound([0, height - margin.top - margin.bottom]);\n  const centerX = (width - margin.left - margin.right) / 2;\n  return (\n    <svg width={width} height={height}>\n      <rect width={width} height={height} fill={background} rx={14} />\n      <GradientPinkRed id=\"polygon-pink\" />\n      {polygons.map((polygon, i) => (\n        <Group\n          key={`polygon-${i}`}\n          top={(yScale(i) || 0) + polygonSize / 2}\n          left={margin.left + centerX}\n        >\n          <Polygon\n            sides={polygon.sides}\n            size={polygonSize}\n            fill={polygon.fill}\n            rotate={polygon.rotate}\n          />\n        </Group>\n      ))}\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-polygons/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-polygons/package.json",
    "content": "{\n  \"name\": \"@visx/demo-polygons\",\n  \"description\": \"Standalone visx polygons demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"polygon\",\n    \"shape\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-polygons/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radar/Example.tsx",
    "content": "import React from 'react';\nimport { Group } from '@visx/group';\nimport type { LetterFrequency } from '@visx/mock-data';\nimport { letterFrequency } from '@visx/mock-data';\nimport { scaleLinear } from '@visx/scale';\nimport { Point } from '@visx/point';\nimport { Line, LineRadial } from '@visx/shape';\n\nconst orange = '#ff9933';\nexport const pumpkin = '#f5810c';\nconst silver = '#d9d9d9';\nexport const background = '#FAF7E9';\n\nconst degrees = 360;\nconst data = letterFrequency.slice(2, 12);\n\nconst y = (d: LetterFrequency) => d.frequency;\n\nconst genAngles = (length: number) =>\n  [...new Array(length + 1)].map((_, i) => ({\n    angle: i * (degrees / length) + (length % 2 === 0 ? 0 : degrees / length / 2),\n  }));\n\nconst genPoints = (length: number, radius: number) => {\n  const step = (Math.PI * 2) / length;\n  return [...new Array(length)].map((_, i) => ({\n    x: radius * Math.sin(i * step),\n    y: radius * Math.cos(i * step),\n  }));\n};\n\nfunction genPolygonPoints<Datum>(\n  dataArray: Datum[],\n  scale: (n: number) => number,\n  getValue: (d: Datum) => number,\n) {\n  const step = (Math.PI * 2) / dataArray.length;\n  const points: { x: number; y: number }[] = new Array(dataArray.length).fill({ x: 0, y: 0 });\n  const pointString: string = new Array(dataArray.length + 1).fill('').reduce((res, _, i) => {\n    if (i > dataArray.length) return res;\n    const xVal = scale(getValue(dataArray[i - 1])) * Math.sin(i * step);\n    const yVal = scale(getValue(dataArray[i - 1])) * Math.cos(i * step);\n    points[i - 1] = { x: xVal, y: yVal };\n    res += `${xVal},${yVal} `;\n    return res;\n  });\n\n  return { points, pointString };\n}\n\nconst defaultMargin = { top: 40, left: 80, right: 80, bottom: 80 };\n\nexport type RadarProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  levels?: number;\n};\n\nexport default function Example({ width, height, levels = 5, margin = defaultMargin }: RadarProps) {\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n  const radius = Math.min(xMax, yMax) / 2;\n\n  const radialScale = scaleLinear<number>({\n    range: [0, Math.PI * 2],\n    domain: [degrees, 0],\n  });\n\n  const yScale = scaleLinear<number>({\n    range: [0, radius],\n    domain: [0, Math.max(...data.map(y))],\n  });\n\n  const webs = genAngles(data.length);\n  const points = genPoints(data.length, radius);\n  const polygonPoints = genPolygonPoints(data, (d) => yScale(d) ?? 0, y);\n  const zeroPoint = new Point({ x: 0, y: 0 });\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <rect fill={background} width={width} height={height} rx={14} />\n      <Group top={height / 2 - margin.top} left={width / 2}>\n        {[...new Array(levels)].map((_, i) => (\n          <LineRadial\n            key={`web-${i}`}\n            data={webs}\n            angle={(d) => radialScale(d.angle) ?? 0}\n            radius={((i + 1) * radius) / levels}\n            fill=\"none\"\n            stroke={silver}\n            strokeWidth={2}\n            strokeOpacity={0.8}\n            strokeLinecap=\"round\"\n          />\n        ))}\n        {[...new Array(data.length)].map((_, i) => (\n          <Line key={`radar-line-${i}`} from={zeroPoint} to={points[i]} stroke={silver} />\n        ))}\n        <polygon\n          points={polygonPoints.pointString}\n          fill={orange}\n          fillOpacity={0.3}\n          stroke={orange}\n          strokeWidth={1}\n        />\n        {polygonPoints.points.map((point, i) => (\n          <circle key={`radar-point-${i}`} cx={point.x} cy={point.y} r={4} fill={pumpkin} />\n        ))}\n      </Group>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radar/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radar/package.json",
    "content": "{\n  \"name\": \"@visx/demo-radar\",\n  \"description\": \"Standalone visx radar chart demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/point\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"radar\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radar/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radial-bars/Example.tsx",
    "content": "import React, { useMemo, useState } from 'react';\nimport { Arc } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { GradientLightgreenGreen } from '@visx/gradient';\nimport { scaleBand, scaleRadial } from '@visx/scale';\nimport { Text } from '@visx/text';\nimport type { LetterFrequency } from '@visx/mock-data';\nimport { letterFrequency } from '@visx/mock-data';\n\nconst data = letterFrequency;\n\nconst getLetter = (d: LetterFrequency) => d.letter;\nconst getLetterFrequency = (d: LetterFrequency) => Number(d.frequency) * 100;\n\nconst frequencySort = (a: LetterFrequency, b: LetterFrequency) => b.frequency - a.frequency;\nconst alphabeticalSort = (a: LetterFrequency, b: LetterFrequency) =>\n  a.letter.localeCompare(b.letter);\n\nconst toRadians = (x: number) => (x * Math.PI) / 180;\nconst toDegrees = (x: number) => (x * 180) / Math.PI;\n\nconst barColor = '#93F9B9';\nconst margin = { top: 20, bottom: 20, left: 20, right: 20 };\n\nexport type RadialBarsProps = {\n  width: number;\n  height: number;\n  showControls?: boolean;\n};\n\nexport default function Example({ width, height, showControls = true }: RadialBarsProps) {\n  const [rotation, setRotation] = useState(0);\n  const [sortAlphabetically, setSortAlphabetically] = useState(true);\n\n  // bounds\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n  const radiusMax = Math.min(xMax, yMax) / 2;\n\n  const innerRadius = radiusMax / 3;\n\n  const xDomain = useMemo(\n    () => data.sort(sortAlphabetically ? alphabeticalSort : frequencySort).map(getLetter),\n    [sortAlphabetically],\n  );\n\n  const xScale = useMemo(\n    () =>\n      scaleBand<string>({\n        range: [0 + rotation, 2 * Math.PI + rotation],\n        domain: xDomain,\n        padding: 0.2,\n      }),\n    [rotation, xDomain],\n  );\n\n  const yScale = useMemo(\n    () =>\n      scaleRadial<number>({\n        range: [innerRadius, radiusMax],\n        domain: [0, Math.max(...data.map(getLetterFrequency))],\n      }),\n    [innerRadius, radiusMax],\n  );\n\n  return width < 10 ? null : (\n    <>\n      <svg width={width} height={height}>\n        <GradientLightgreenGreen id=\"radial-bars-green\" />\n        <rect width={width} height={height} fill=\"url(#radial-bars-green)\" rx={14} />\n        <Group top={yMax / 2 + margin.top} left={xMax / 2 + margin.left}>\n          {data.map((d) => {\n            const letter = getLetter(d);\n            const startAngle = xScale(letter);\n            const midAngle = startAngle + xScale.bandwidth() / 2;\n            const endAngle = startAngle + xScale.bandwidth();\n\n            const outerRadius = yScale(getLetterFrequency(d)) ?? 0;\n\n            // convert polar coordinates to cartesian for drawing labels\n            const textRadius = outerRadius + 4;\n            const textX = textRadius * Math.cos(midAngle - Math.PI / 2);\n            const textY = textRadius * Math.sin(midAngle - Math.PI / 2);\n\n            return (\n              <>\n                <Arc\n                  key={`bar-${letter}`}\n                  cornerRadius={4}\n                  startAngle={startAngle}\n                  endAngle={endAngle}\n                  outerRadius={outerRadius}\n                  innerRadius={innerRadius}\n                  fill={barColor}\n                />\n                <Text\n                  x={textX}\n                  y={textY}\n                  dominantBaseline=\"end\"\n                  textAnchor=\"middle\"\n                  fontSize={16}\n                  fontWeight=\"bold\"\n                  fill={barColor}\n                  angle={toDegrees(midAngle)}\n                >\n                  {letter}\n                </Text>\n              </>\n            );\n          })}\n        </Group>\n      </svg>\n      {showControls && (\n        <div className=\"controls\">\n          <label>\n            <strong>Rotate</strong>&nbsp;\n            <input\n              type=\"range\"\n              min=\"0\"\n              max=\"360\"\n              value={toDegrees(rotation)}\n              onChange={(e) => setRotation(toRadians(Number(e.target.value)))}\n            />\n            &nbsp;{toDegrees(rotation).toFixed(0)}°\n          </label>\n          <br />\n          <div>\n            <strong>Sort bars</strong>&nbsp;&nbsp;&nbsp;\n            <label>\n              <input\n                type=\"radio\"\n                checked={sortAlphabetically}\n                onChange={(e) => setSortAlphabetically(true)}\n              />\n              Alphabetically&nbsp;&nbsp;&nbsp;\n            </label>\n            <label>\n              <input\n                type=\"radio\"\n                checked={!sortAlphabetically}\n                onChange={(e) => setSortAlphabetically(false)}\n              />\n              By frequency\n            </label>\n          </div>\n          <br />\n        </div>\n      )}\n      <style jsx>{`\n        .controls {\n          font-size: 14px;\n          line-height: 1.5em;\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radial-bars/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radial-bars/package.json",
    "content": "{\n  \"name\": \"@visx/demo-radial-bars\",\n  \"description\": \"Standalone visx radial bars demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/text\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"bar\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-radial-bars/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-responsive/Example.tsx",
    "content": "import React, { useState } from 'react';\nimport { ParentSize } from '@visx/responsive';\n\nimport Lines from './Lines';\n\nexport type ResponsiveProps = {\n  width: number;\n  height: number;\n};\n\nfunction Nav() {\n  return (\n    <ul>\n      <li>\n        <span role=\"img\" aria-label=\"robot\">\n          🤖\n        </span>\n      </li>\n      <li>Home</li>\n      <li>Profile</li>\n      <li>Favorites</li>\n      <li>Settings</li>\n    </ul>\n  );\n}\n\nexport default function Example({ width, height }: ResponsiveProps) {\n  const [showSidebar, setShowSidebar] = useState<boolean>(true);\n\n  return width < 20 || height < 20 ? null : (\n    <div className=\"app\" style={{ width, height }}>\n      {showSidebar && (\n        <div className=\"app-nav\">\n          <Nav />\n        </div>\n      )}\n      <div className=\"app-content\">\n        <div>\n          <button\n            onClick={(event) => {\n              // on gallery page, don't go to example\n              event.preventDefault();\n              event.stopPropagation();\n              setShowSidebar(!showSidebar);\n            }}\n          >\n            toggle nav\n          </button>\n        </div>\n        <div className=\"app-graph\">\n          <ParentSize className=\"graph-container\" debounceTime={10}>\n            {({ width: visWidth, height: visHeight }) => (\n              <Lines width={visWidth} height={visHeight} />\n            )}\n          </ParentSize>\n        </div>\n      </div>\n\n      <style jsx>{`\n        .app {\n          display: flex;\n        }\n\n        .app-nav {\n          border: 1px solid lightgray;\n          border-right: none;\n          display: flex;\n          flex: 0.5;\n          padding: 1rem;\n        }\n\n        .app-content {\n          display: flex;\n          flex: 1;\n          flex-direction: column;\n          overflow: hidden;\n          padding: 1rem;\n          border: 1px solid lightgray;\n        }\n\n        .app-graph {\n          display: flex;\n          flex: 1;\n          overflow: hidden;\n          background: #222;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-responsive/Lines.tsx",
    "content": "import React from 'react';\nimport { Group } from '@visx/group';\nimport { LinePath } from '@visx/shape';\nimport type { DateValue } from '@visx/mock-data';\nimport { genDateValue as generateDateValue } from '@visx/mock-data';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport { extent, max } from '@visx/vendor/d3-array';\n\nconst lineCount = 12;\nconst series = new Array(lineCount).fill(null).map((_, i) => generateDateValue(25, i / 47));\nconst allData = series.reduce((rec, d) => rec.concat(d), []);\n\n// data accessors\nconst getX = (d: DateValue) => d.date;\nconst getY = (d: DateValue) => d.value;\n\n// scales\nconst xScale = scaleTime<number>({\n  domain: extent(allData, getX) as [Date, Date],\n});\nconst yScale = scaleLinear<number>({\n  domain: [0, max(allData, getY) as number],\n});\n\ntype Props = {\n  width: number;\n  height: number;\n};\n\nfunction Lines({ width, height }: Props) {\n  // bounds\n  const lineHeight = height / lineCount;\n\n  // update scales\n  xScale.range([0, width]);\n  yScale.range([lineHeight, 0]);\n\n  return (\n    <svg width={width} height={height}>\n      {width > 8 &&\n        series.map((lineData, i) => (\n          <Group key={`lines-${i}`} top={i * lineHeight}>\n            <LinePath<DateValue>\n              data={lineData}\n              x={(d) => xScale(getX(d)) ?? 0}\n              y={(d) => yScale(getY(d)) ?? 0}\n              stroke=\"#ffffff\"\n              strokeWidth={1.5}\n              shapeRendering=\"geometricPrecision\"\n            />\n          </Group>\n        ))}\n    </svg>\n  );\n}\n\nexport default Lines;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-responsive/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-responsive/package.json",
    "content": "{\n  \"name\": \"@visx/demo-responsive\",\n  \"description\": \"Standalone @visx/responsive demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-responsive/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-sankey/Example.tsx",
    "content": "import React, { useState } from 'react';\nimport type { SankeyNode } from '@visx/sankey';\nimport { Sankey, sankeyCenter, sankeyRight, sankeyLeft, sankeyJustify } from '@visx/sankey';\nimport { Group } from '@visx/group';\nimport { BarRounded, LinkHorizontal } from '@visx/shape';\nimport { useTooltip, TooltipWithBounds } from '@visx/tooltip';\nimport { localPoint } from '@visx/event';\n\nimport energy from './energy.json';\n\nexport const background = '#84dccf';\nexport const color = '#392f5a';\n\ntype NodeDatum = { name: string };\ntype LinkDatum = {};\n\nconst nodeAlignments = {\n  sankeyCenter,\n  sankeyJustify,\n  sankeyLeft,\n  sankeyRight,\n} as const;\n\nconst defaultMargin = { top: 10, left: 10, right: 10, bottom: 10 };\n\nexport type SankeyDemoProps = {\n  width: number;\n  height: number;\n  showControls?: boolean;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function SankeyDemo({\n  width,\n  height,\n  showControls = true,\n  margin = defaultMargin,\n}: SankeyDemoProps) {\n  const { tooltipData, tooltipLeft, tooltipTop, tooltipOpen, showTooltip, hideTooltip } =\n    useTooltip();\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n\n  const [nodeAlignment, setTileMethod] = useState<keyof typeof nodeAlignments>('sankeyCenter');\n  const [nodePadding, setNodePadding] = useState(10);\n  const [nodeWidth, setNodeWidth] = useState(10);\n\n  if (width < 10) return null;\n\n  return (\n    <div>\n      <style>{`\n        .visx-sankey-link:hover {\n          stroke-opacity: 0.7; \n        }\n        .visx-sankey-node:hover {\n          filter: brightness(1.3);\n        }\n        .visx-sankey-demo-container {\n          background: ${background};\n          padding: ${margin.top}px ${margin.right}px ${margin.bottom}px ${margin.left}px;\n          border-radius: 5px;\n          position: relative;\n        }\n        .visx-sankey-demo-controls {\n          font-size: 12px;\n        }\n      `}</style>\n      {showControls && (\n        <div className=\"visx-sankey-demo-controls\">\n          <label>\n            node alignment{' '}\n            <select\n              onClick={(e) => e.stopPropagation()}\n              onChange={(e) => setTileMethod(e.target.value as keyof typeof nodeAlignments)}\n              value={nodeAlignment}\n            >\n              {Object.keys(nodeAlignments).map((alignment) => (\n                <option key={alignment} value={alignment}>\n                  {alignment}\n                </option>\n              ))}\n            </select>\n          </label>{' '}\n          <label>\n            node padding{' '}\n            <input\n              type=\"number\"\n              value={nodePadding}\n              onChange={(e) => setNodePadding(Number(e.target.value))}\n            />\n          </label>{' '}\n          <label>\n            node width{' '}\n            <input\n              type=\"number\"\n              value={nodeWidth}\n              onChange={(e) => setNodeWidth(Number(e.target.value))}\n            />\n          </label>\n        </div>\n      )}\n      <div className=\"visx-sankey-demo-container\">\n        <svg width={xMax} height={yMax}>\n          <Sankey<NodeDatum, LinkDatum>\n            root={energy}\n            nodeWidth={nodeWidth}\n            size={[xMax, yMax]}\n            nodePadding={nodePadding}\n            nodeAlign={nodeAlignments[nodeAlignment]}\n          >\n            {({ graph, createPath }) => (\n              <>\n                <Group>\n                  {graph.links.map((link, i) => (\n                    <LinkHorizontal\n                      key={i}\n                      className=\"visx-sankey-link\"\n                      data={link}\n                      path={createPath}\n                      fill=\"transparent\"\n                      stroke={color}\n                      strokeWidth={link.width}\n                      strokeOpacity={0.5}\n                      onPointerMove={(event) => {\n                        const coords = localPoint(\n                          (event.target as SVGElement).ownerSVGElement,\n                          event,\n                        );\n                        showTooltip({\n                          tooltipData: `${\n                            (link.source as SankeyNode<NodeDatum, LinkDatum>).name\n                          } > ${(link.target as SankeyNode<NodeDatum, LinkDatum>).name} = ${\n                            link.value\n                          }`,\n                          tooltipTop: (coords?.y ?? 0) + 10,\n                          tooltipLeft: (coords?.x ?? 0) + 10,\n                        });\n                      }}\n                      onMouseOut={hideTooltip}\n                    />\n                  ))}\n                </Group>\n                <Group>\n                  {graph.nodes.map(({ y0, y1, x0, x1, name }, i) => (\n                    <BarRounded\n                      key={i}\n                      className=\"visx-sankey-node\"\n                      width={x1 - x0}\n                      height={y1 - y0}\n                      x={x0}\n                      y={y0}\n                      radius={3}\n                      all\n                      fill={color}\n                      onPointerMove={(event) => {\n                        const coords = localPoint(\n                          (event.target as SVGElement).ownerSVGElement,\n                          event,\n                        );\n                        showTooltip({\n                          tooltipData: name,\n                          tooltipTop: (coords?.y ?? 0) + 10,\n                          tooltipLeft: (coords?.x ?? 0) + 10,\n                        });\n                      }}\n                      onMouseOut={hideTooltip}\n                    />\n                  ))}\n                </Group>\n              </>\n            )}\n          </Sankey>\n        </svg>\n        {tooltipOpen && (\n          <TooltipWithBounds key={Math.random()} top={tooltipTop} left={tooltipLeft}>\n            {tooltipData}\n          </TooltipWithBounds>\n        )}\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-sankey/energy.json",
    "content": "{\"nodes\":[{\"name\":\"Agricultural 'waste'\"},{\"name\":\"Bio-conversion\"},{\"name\":\"Liquid\"},{\"name\":\"Losses\"},{\"name\":\"Solid\"},{\"name\":\"Gas\"},{\"name\":\"Biofuel imports\"},{\"name\":\"Biomass imports\"},{\"name\":\"Coal imports\"},{\"name\":\"Coal\"},{\"name\":\"Coal reserves\"},{\"name\":\"District heating\"},{\"name\":\"Industry\"},{\"name\":\"Heating and cooling - commercial\"},{\"name\":\"Heating and cooling - homes\"},{\"name\":\"Electricity grid\"},{\"name\":\"Over generation / exports\"},{\"name\":\"H2 conversion\"},{\"name\":\"Road transport\"},{\"name\":\"Agriculture\"},{\"name\":\"Rail transport\"},{\"name\":\"Lighting & appliances - commercial\"},{\"name\":\"Lighting & appliances - homes\"},{\"name\":\"Gas imports\"},{\"name\":\"Ngas\"},{\"name\":\"Gas reserves\"},{\"name\":\"Thermal generation\"},{\"name\":\"Geothermal\"},{\"name\":\"H2\"},{\"name\":\"Hydro\"},{\"name\":\"International shipping\"},{\"name\":\"Domestic aviation\"},{\"name\":\"International aviation\"},{\"name\":\"National navigation\"},{\"name\":\"Marine algae\"},{\"name\":\"Nuclear\"},{\"name\":\"Oil imports\"},{\"name\":\"Oil\"},{\"name\":\"Oil reserves\"},{\"name\":\"Other waste\"},{\"name\":\"Pumped heat\"},{\"name\":\"Solar PV\"},{\"name\":\"Solar Thermal\"},{\"name\":\"Solar\"},{\"name\":\"Tidal\"},{\"name\":\"UK land based bioenergy\"},{\"name\":\"Wave\"},{\"name\":\"Wind\"}],\"links\":[{\"source\":0,\"target\":1,\"value\":124.729},{\"source\":1,\"target\":2,\"value\":0.597},{\"source\":1,\"target\":3,\"value\":26.862},{\"source\":1,\"target\":4,\"value\":280.322},{\"source\":1,\"target\":5,\"value\":81.144},{\"source\":6,\"target\":2,\"value\":35},{\"source\":7,\"target\":4,\"value\":35},{\"source\":8,\"target\":9,\"value\":11.606},{\"source\":10,\"target\":9,\"value\":63.965},{\"source\":9,\"target\":4,\"value\":75.571},{\"source\":11,\"target\":12,\"value\":10.639},{\"source\":11,\"target\":13,\"value\":22.505},{\"source\":11,\"target\":14,\"value\":46.184},{\"source\":15,\"target\":16,\"value\":104.453},{\"source\":15,\"target\":14,\"value\":113.726},{\"source\":15,\"target\":17,\"value\":27.14},{\"source\":15,\"target\":12,\"value\":342.165},{\"source\":15,\"target\":18,\"value\":37.797},{\"source\":15,\"target\":19,\"value\":4.412},{\"source\":15,\"target\":13,\"value\":40.858},{\"source\":15,\"target\":3,\"value\":56.691},{\"source\":15,\"target\":20,\"value\":7.863},{\"source\":15,\"target\":21,\"value\":90.008},{\"source\":15,\"target\":22,\"value\":93.494},{\"source\":23,\"target\":24,\"value\":40.719},{\"source\":25,\"target\":24,\"value\":82.233},{\"source\":5,\"target\":13,\"value\":0.129},{\"source\":5,\"target\":3,\"value\":1.401},{\"source\":5,\"target\":26,\"value\":151.891},{\"source\":5,\"target\":19,\"value\":2.096},{\"source\":5,\"target\":12,\"value\":48.58},{\"source\":27,\"target\":15,\"value\":7.013},{\"source\":17,\"target\":28,\"value\":20.897},{\"source\":17,\"target\":3,\"value\":6.242},{\"source\":28,\"target\":18,\"value\":20.897},{\"source\":29,\"target\":15,\"value\":6.995},{\"source\":2,\"target\":12,\"value\":121.066},{\"source\":2,\"target\":30,\"value\":128.69},{\"source\":2,\"target\":18,\"value\":135.835},{\"source\":2,\"target\":31,\"value\":14.458},{\"source\":2,\"target\":32,\"value\":206.267},{\"source\":2,\"target\":19,\"value\":3.64},{\"source\":2,\"target\":33,\"value\":33.218},{\"source\":2,\"target\":20,\"value\":4.413},{\"source\":34,\"target\":1,\"value\":4.375},{\"source\":24,\"target\":5,\"value\":122.952},{\"source\":35,\"target\":26,\"value\":839.978},{\"source\":36,\"target\":37,\"value\":504.287},{\"source\":38,\"target\":37,\"value\":107.703},{\"source\":37,\"target\":2,\"value\":611.99},{\"source\":39,\"target\":4,\"value\":56.587},{\"source\":39,\"target\":1,\"value\":77.81},{\"source\":40,\"target\":14,\"value\":193.026},{\"source\":40,\"target\":13,\"value\":70.672},{\"source\":41,\"target\":15,\"value\":59.901},{\"source\":42,\"target\":14,\"value\":19.263},{\"source\":43,\"target\":42,\"value\":19.263},{\"source\":43,\"target\":41,\"value\":59.901},{\"source\":4,\"target\":19,\"value\":0.882},{\"source\":4,\"target\":26,\"value\":400.12},{\"source\":4,\"target\":12,\"value\":46.477},{\"source\":26,\"target\":15,\"value\":525.531},{\"source\":26,\"target\":3,\"value\":787.129},{\"source\":26,\"target\":11,\"value\":79.329},{\"source\":44,\"target\":15,\"value\":9.452},{\"source\":45,\"target\":1,\"value\":182.01},{\"source\":46,\"target\":15,\"value\":19.013},{\"source\":47,\"target\":15,\"value\":289.366}]}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-sankey/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-sankey/package.json",
    "content": "{\n    \"name\": \"@visx/demo-sankey\",\n    \"description\": \"Standalone visx sankey demo.\",\n    \"main\": \"index.tsx\",\n    \"private\": true,\n    \"dependencies\": {\n      \"@babel/runtime\": \"^7.8.4\",\n      \"@types/react\": \"^18\",\n      \"@types/react-dom\": \"^18\" ,\n      \"@visx/event\": \"latest\",\n      \"@visx/group\": \"latest\",\n      \"@visx/responsive\": \"latest\",\n      \"@visx/sankey\": \"latest\",\n      \"@visx/shape\": \"latest\",\n      \"@visx/tooltip\": \"latest\",\n      \"react\": \"^18\",\n      \"react-dom\": \"^18\",\n      \"react-scripts-ts\": \"3.1.0\",\n      \"typescript\": \"^3\"\n    },\n    \"keywords\": [\n      \"visualization\",\n      \"d3\",\n      \"react\",\n      \"visx\",\n      \"sankey\"\n    ]\n  }\n  "
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-sankey/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-line-radial/Example.tsx",
    "content": "/**\n * Animated radial line example using svg dash offset trick. See here for more\n * https://www.visualcinnamon.com/2016/01/animating-dashed-line-d3.html\n */\nimport React, { useRef, useState, useEffect } from 'react';\nimport { Group } from '@visx/group';\nimport { LineRadial } from '@visx/shape';\nimport type { NumberLike } from '@visx/scale';\nimport { scaleTime, scaleLog } from '@visx/scale';\nimport { curveBasisOpen } from '@visx/curve';\nimport type { AppleStock } from '@visx/mock-data';\nimport { appleStock } from '@visx/mock-data';\nimport { LinearGradient } from '@visx/gradient';\nimport { AxisLeft } from '@visx/axis';\nimport { GridRadial, GridAngle } from '@visx/grid';\nimport { animated, useSpring } from '@react-spring/web';\n\nconst green = '#e5fd3d';\nexport const blue = '#aeeef8';\nconst darkgreen = '#dff84d';\nexport const background = '#744cca';\nconst darkbackground = '#603FA8';\nconst strokeColor = '#744cca';\nconst springConfig = {\n  tension: 20,\n};\n\n// utils\nfunction extent<Datum>(data: Datum[], value: (d: Datum) => number) {\n  const values = data.map(value);\n  return [Math.min(...values), Math.max(...values)];\n}\n\n// accessors\nconst date = (d: AppleStock) => new Date(d.date).valueOf();\nconst close = (d: AppleStock) => d.close;\nconst formatTicks = (val: NumberLike) => String(val);\n\n// scales\nconst xScale = scaleTime({\n  range: [0, Math.PI * 2],\n  domain: extent(appleStock, date),\n});\nconst yScale = scaleLog<number>({\n  domain: extent(appleStock, close),\n});\n\nconst angle = (d: AppleStock) => xScale(date(d)) ?? 0;\nconst radius = (d: AppleStock) => yScale(close(d)) ?? 0;\nconst padding = 20;\n\nconst firstPoint = appleStock[0];\nconst lastPoint = appleStock[appleStock.length - 1];\n\nexport type LineRadialProps = {\n  width: number;\n  height: number;\n  animate?: boolean;\n};\n\nfunction Example({ width, height, animate = true }: LineRadialProps) {\n  const lineRef = useRef<SVGPathElement>(null);\n  const [lineLength, setLineLength] = useState<number>(0);\n  const [shouldAnimate, setShouldAnimate] = useState<boolean>(false);\n\n  const spring = useSpring({\n    frame: shouldAnimate ? 0 : 1,\n    config: springConfig,\n    onRest: () => setShouldAnimate(false),\n  });\n\n  // set line length once it is known after initial render\n  const effectDependency = lineRef.current;\n  useEffect(() => {\n    if (lineRef.current) {\n      setLineLength(lineRef.current.getTotalLength());\n    }\n  }, [effectDependency]);\n\n  if (width < 10) return null;\n\n  // Update scale output to match component dimensions\n  yScale.range([0, height / 2 - padding]);\n  const reverseYScale = yScale.copy().range(yScale.range().reverse());\n  const handlePress = () => setShouldAnimate(true);\n\n  return (\n    <>\n      {animate && (\n        <>\n          <button type=\"button\" onClick={handlePress} onTouchStart={handlePress}>\n            Animate\n          </button>\n          <br />\n        </>\n      )}\n      <svg width={width} height={height} onClick={() => setShouldAnimate(!shouldAnimate)}>\n        <LinearGradient from={green} to={blue} id=\"line-gradient\" />\n        <rect width={width} height={height} fill={background} rx={14} />\n        <Group top={height / 2} left={width / 2}>\n          <GridAngle\n            scale={xScale}\n            outerRadius={height / 2 - padding}\n            stroke={green}\n            strokeWidth={1}\n            strokeOpacity={0.3}\n            strokeDasharray=\"5,2\"\n            numTicks={20}\n          />\n          <GridRadial\n            scale={yScale}\n            numTicks={5}\n            stroke={blue}\n            strokeWidth={1}\n            fill={blue}\n            fillOpacity={0.1}\n            strokeOpacity={0.2}\n          />\n          <AxisLeft\n            top={-height / 2 + padding}\n            scale={reverseYScale}\n            numTicks={5}\n            tickStroke=\"none\"\n            tickLabelProps={{\n              fontSize: 8,\n              fill: blue,\n              fillOpacity: 1,\n              textAnchor: 'middle',\n              dx: '1em',\n              dy: '-0.5em',\n              stroke: strokeColor,\n              strokeWidth: 0.5,\n              paintOrder: 'stroke',\n            }}\n            tickFormat={formatTicks}\n            hideAxisLine\n          />\n          <LineRadial angle={angle} radius={radius} curve={curveBasisOpen}>\n            {({ path }) => {\n              const d = path(appleStock) || '';\n              return (\n                <>\n                  <animated.path\n                    d={d}\n                    ref={lineRef}\n                    strokeWidth={2}\n                    strokeOpacity={0.8}\n                    strokeLinecap=\"round\"\n                    fill=\"none\"\n                    stroke={animate ? darkbackground : 'url(#line-gradient)'}\n                  />\n                  {shouldAnimate && (\n                    <animated.path\n                      d={d}\n                      strokeWidth={2}\n                      strokeOpacity={0.8}\n                      strokeLinecap=\"round\"\n                      fill=\"none\"\n                      stroke=\"url(#line-gradient)\"\n                      strokeDashoffset={spring.frame.interpolate((v) => v * lineLength)}\n                      strokeDasharray={lineLength}\n                    />\n                  )}\n                </>\n              );\n            }}\n          </LineRadial>\n\n          {[firstPoint, lastPoint].map((d, i) => {\n            const cx = ((xScale(date(d)) ?? 0) * Math.PI) / 180;\n            const cy = -(yScale(close(d)) ?? 0);\n            return <circle key={`line-cap-${i}`} cx={cx} cy={cy} fill={darkgreen} r={3} />;\n          })}\n        </Group>\n      </svg>\n    </>\n  );\n}\n\nexport default Example;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-line-radial/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-line-radial/package.json",
    "content": "{\n  \"name\": \"@visx/demo-shape-line-radial\",\n  \"description\": \"Standalone visx line radial demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/grid\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"@react-spring/web\": \"^10.0.3\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"shape\",\n    \"radial\",\n    \"line\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-line-radial/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-pie/Example.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-use-before-define */\nimport React, { useState } from 'react';\nimport type { ProvidedProps, PieArcDatum } from '@visx/shape';\nimport { Pie } from '@visx/shape';\nimport { scaleOrdinal } from '@visx/scale';\nimport { Group } from '@visx/group';\nimport { GradientPinkBlue } from '@visx/gradient';\nimport type { LetterFrequency, BrowserUsage as Browsers } from '@visx/mock-data';\nimport { letterFrequency, browserUsage } from '@visx/mock-data';\nimport { animated, useTransition, interpolate } from '@react-spring/web';\n\n// data and types\ntype BrowserNames = keyof Browsers;\n\ninterface BrowserUsage {\n  label: BrowserNames;\n  usage: number;\n}\n\nconst letters: LetterFrequency[] = letterFrequency.slice(0, 4);\nconst browserNames = Object.keys(browserUsage[0]).filter((k) => k !== 'date') as BrowserNames[];\nconst browsers: BrowserUsage[] = browserNames.map((name) => ({\n  label: name,\n  usage: Number(browserUsage[0][name]),\n}));\n\n// accessor functions\nconst usage = (d: BrowserUsage) => d.usage;\nconst frequency = (d: LetterFrequency) => d.frequency;\n\n// color scales\nconst getBrowserColor = scaleOrdinal({\n  domain: browserNames,\n  range: [\n    'rgba(255,255,255,0.7)',\n    'rgba(255,255,255,0.6)',\n    'rgba(255,255,255,0.5)',\n    'rgba(255,255,255,0.4)',\n    'rgba(255,255,255,0.3)',\n    'rgba(255,255,255,0.2)',\n    'rgba(255,255,255,0.1)',\n  ],\n});\nconst getLetterFrequencyColor = scaleOrdinal({\n  domain: letters.map((l) => l.letter),\n  range: ['rgba(93,30,91,1)', 'rgba(93,30,91,0.8)', 'rgba(93,30,91,0.6)', 'rgba(93,30,91,0.4)'],\n});\n\nconst defaultMargin = { top: 20, right: 20, bottom: 20, left: 20 };\n\nexport type PieProps = {\n  width: number;\n  height: number;\n  margin?: typeof defaultMargin;\n  animate?: boolean;\n};\n\nexport default function Example({\n  width,\n  height,\n  margin = defaultMargin,\n  animate = true,\n}: PieProps) {\n  const [selectedBrowser, setSelectedBrowser] = useState<string | null>(null);\n  const [selectedAlphabetLetter, setSelectedAlphabetLetter] = useState<string | null>(null);\n\n  if (width < 10) return null;\n\n  const innerWidth = width - margin.left - margin.right;\n  const innerHeight = height - margin.top - margin.bottom;\n  const radius = Math.min(innerWidth, innerHeight) / 2;\n  const centerY = innerHeight / 2;\n  const centerX = innerWidth / 2;\n  const donutThickness = 50;\n\n  return (\n    <svg width={width} height={height}>\n      <GradientPinkBlue id=\"visx-pie-gradient\" />\n      <rect rx={14} width={width} height={height} fill=\"url('#visx-pie-gradient')\" />\n      <Group top={centerY + margin.top} left={centerX + margin.left}>\n        <Pie\n          data={\n            selectedBrowser ? browsers.filter(({ label }) => label === selectedBrowser) : browsers\n          }\n          pieValue={usage}\n          outerRadius={radius}\n          innerRadius={radius - donutThickness}\n          cornerRadius={3}\n          padAngle={0.005}\n        >\n          {(pie) => (\n            <AnimatedPie<BrowserUsage>\n              {...pie}\n              animate={animate}\n              getKey={(arc) => arc.data.label}\n              onClickDatum={({ data: { label } }) =>\n                animate &&\n                setSelectedBrowser(selectedBrowser && selectedBrowser === label ? null : label)\n              }\n              getColor={(arc) => getBrowserColor(arc.data.label)}\n            />\n          )}\n        </Pie>\n        <Pie\n          data={\n            selectedAlphabetLetter\n              ? letters.filter(({ letter }) => letter === selectedAlphabetLetter)\n              : letters\n          }\n          pieValue={frequency}\n          pieSortValues={() => -1}\n          outerRadius={radius - donutThickness * 1.3}\n        >\n          {(pie) => (\n            <AnimatedPie<LetterFrequency>\n              {...pie}\n              animate={animate}\n              getKey={({ data: { letter } }) => letter}\n              onClickDatum={({ data: { letter } }) =>\n                animate &&\n                setSelectedAlphabetLetter(\n                  selectedAlphabetLetter && selectedAlphabetLetter === letter ? null : letter,\n                )\n              }\n              getColor={({ data: { letter } }) => getLetterFrequencyColor(letter)}\n            />\n          )}\n        </Pie>\n      </Group>\n      {animate && (\n        <text\n          textAnchor=\"end\"\n          x={width - 16}\n          y={height - 16}\n          fill=\"white\"\n          fontSize={11}\n          fontWeight={300}\n          pointerEvents=\"none\"\n        >\n          Click segments to update\n        </text>\n      )}\n    </svg>\n  );\n}\n\n// react-spring transition definitions\ntype AnimatedStyles = { startAngle: number; endAngle: number; opacity: number };\n\nconst fromLeaveTransition = ({ endAngle }: PieArcDatum<any>) => ({\n  // enter from 360° if end angle is > 180°\n  startAngle: endAngle > Math.PI ? 2 * Math.PI : 0,\n  endAngle: endAngle > Math.PI ? 2 * Math.PI : 0,\n  opacity: 0,\n});\nconst enterUpdateTransition = ({ startAngle, endAngle }: PieArcDatum<any>) => ({\n  startAngle,\n  endAngle,\n  opacity: 1,\n});\n\ntype AnimatedPieProps<Datum> = ProvidedProps<Datum> & {\n  animate?: boolean;\n  getKey: (d: PieArcDatum<Datum>) => string;\n  getColor: (d: PieArcDatum<Datum>) => string;\n  onClickDatum: (d: PieArcDatum<Datum>) => void;\n  delay?: number;\n};\n\nfunction AnimatedPie<Datum>({\n  animate,\n  arcs,\n  path,\n  getKey,\n  getColor,\n  onClickDatum,\n}: AnimatedPieProps<Datum>) {\n  const transitions = useTransition<PieArcDatum<Datum>, AnimatedStyles>(arcs, {\n    from: animate ? fromLeaveTransition : enterUpdateTransition,\n    enter: enterUpdateTransition,\n    update: enterUpdateTransition,\n    leave: animate ? fromLeaveTransition : enterUpdateTransition,\n    keys: getKey,\n  });\n  return transitions((props, arc, { key }) => {\n    const [centroidX, centroidY] = path.centroid(arc);\n    const hasSpaceForLabel = arc.endAngle - arc.startAngle >= 0.1;\n\n    return (\n      <g key={key}>\n        <animated.path\n          // compute interpolated path d attribute from intermediate angle values\n          d={interpolate([props.startAngle, props.endAngle], (startAngle, endAngle) =>\n            path({\n              ...arc,\n              startAngle,\n              endAngle,\n            }),\n          )}\n          fill={getColor(arc)}\n          onClick={() => onClickDatum(arc)}\n          onTouchStart={() => onClickDatum(arc)}\n        />\n        {hasSpaceForLabel && (\n          <animated.g style={{ opacity: props.opacity }}>\n            <text\n              fill=\"white\"\n              x={centroidX}\n              y={centroidY}\n              dy=\".33em\"\n              fontSize={9}\n              textAnchor=\"middle\"\n              pointerEvents=\"none\"\n            >\n              {getKey(arc)}\n            </text>\n          </animated.g>\n        )}\n      </g>\n    );\n  });\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-pie/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-pie/package.json",
    "content": "{\n  \"name\": \"@visx/demo-shape-pie\",\n  \"description\": \"Standalone visx pie demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"@react-spring/web\": \"^10.0.3\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"pie\",\n    \"shape\",\n    \"donut\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-pie/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-splitlinepath/Example.tsx",
    "content": "import React, { useMemo } from 'react';\nimport { chunk } from 'lodash';\nimport { curveCardinal } from '@visx/curve';\nimport { LinePath, SplitLinePath } from '@visx/shape';\nimport { LinearGradient } from '@visx/gradient';\nimport type { SplitLinePathRenderer } from '@visx/shape';\nimport generateSinSegments from './generateSinSegments';\nimport generateSnakePath from './generateSnakePath';\n\ntype Point = { x: number; y: number };\nconst getX = (d: Point) => d.x;\nconst getY = (d: Point) => d.y;\nexport const background = '#045275';\nexport const backgroundLight = '#089099';\nexport const foreground = '#b7e6a5';\n\nexport type SplitLinePathExampleProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n  numberOfWaves?: number;\n  pointsPerWave?: number;\n  numberOfSegments?: number;\n};\n\nconst renderNumberSegment: SplitLinePathRenderer = ({ segment, styles }) => (\n  <g>\n    {segment.map(({ x, y }, i) =>\n      i % 25 === 0 ? (\n        <g key={i} transform={`translate(${x},${y})`}>\n          <circle r={2} fill=\"#222\" />\n          <text key={i} dx={3} dy={3} fontSize={8}>\n            {i}\n          </text>\n        </g>\n      ) : null,\n    )}\n  </g>\n);\n\n/** Overlay growing circles instead of drawing a line */\nconst renderCircleSegment: SplitLinePathRenderer = ({ segment, styles }) => (\n  <g>\n    {segment.map(({ x, y }, i) =>\n      i % 8 === 0 ? (\n        <circle\n          key={i}\n          cx={x}\n          cy={y}\n          r={10 * (i / segment.length)}\n          stroke={styles?.stroke}\n          fill=\"transparent\"\n          strokeWidth={1}\n        />\n      ) : null,\n    )}\n  </g>\n);\n\nconst PADDING = 30;\n\nexport default function SplitLinePathExample({\n  width,\n  height,\n  numberOfWaves = 10,\n  pointsPerWave = 100,\n}: SplitLinePathExampleProps) {\n  const data = useMemo(\n    () => ({\n      leftToRight: generateSinSegments({\n        width: width / 2 - PADDING * 2,\n        height: height / 2 - PADDING * 2,\n        numberOfWaves,\n        pointsPerWave,\n      }),\n      rightToLeft: generateSinSegments({\n        width: width / 2 - PADDING * 2,\n        height: height / 2 - PADDING * 2,\n        numberOfWaves,\n        pointsPerWave,\n        direction: 'right-to-left',\n      }),\n      topToBottom: generateSinSegments({\n        width: width / 2 - PADDING * 2,\n        height: height / 2 - PADDING * 2,\n        numberOfWaves: 5,\n        pointsPerWave,\n        direction: 'top-to-bottom',\n      }),\n      bottomToTop: generateSinSegments({\n        width: width / 2 - PADDING * 2,\n        height: height / 2 - PADDING * 2,\n        numberOfWaves: 5,\n        pointsPerWave,\n        direction: 'bottom-to-top',\n      }),\n      snake: chunk(generateSnakePath({ width: width / 4, height: height / 4, step: 20 }), 8),\n    }),\n    [width, height, numberOfWaves, pointsPerWave],\n  );\n\n  return width < 10 ? null : (\n    <div>\n      <svg width={width} height={height}>\n        {/* Background */}\n        <LinearGradient\n          id=\"visx-shape-splitlinepath-gradient\"\n          from={background}\n          to={backgroundLight}\n          fromOpacity={0.8}\n          toOpacity={0.8}\n        />\n        <rect\n          x={0}\n          y={0}\n          width={width}\n          height={height}\n          fill=\"url(#visx-shape-splitlinepath-gradient)\"\n          rx={14}\n        />\n\n        {/* left to right */}\n        <g transform={`translate(${PADDING}, ${height / 4})`}>\n          {/* Render all segments as a single line for comparison */}\n          <LinePath\n            data={data.leftToRight.flat()}\n            x={getX}\n            y={getY}\n            strokeWidth={8}\n            stroke=\"#fff\"\n            strokeOpacity={0.15}\n            curve={curveCardinal}\n          />\n\n          <SplitLinePath\n            sampleRate={2}\n            segments={data.leftToRight}\n            segmentation=\"x\"\n            x={getX}\n            y={getY}\n            curve={curveCardinal}\n            styles={[\n              { stroke: foreground, strokeWidth: 3 },\n              { stroke: '#fff', strokeWidth: 2, strokeDasharray: '9,5' },\n              { stroke: background, strokeWidth: 2 },\n            ]}\n          >\n            {({ segment, styles, index }) =>\n              index === numberOfWaves - 1 || index === 2 ? (\n                renderCircleSegment({ segment, styles, index })\n              ) : (\n                <LinePath data={segment} x={getX} y={getY} {...styles} />\n              )\n            }\n          </SplitLinePath>\n          <text dy=\"0.3em\" fontSize={10} fontWeight=\"bold\" textAnchor=\"middle\">\n            Start\n          </text>\n        </g>\n\n        {/* right to left */}\n        <g transform={`translate(${width / 2 - PADDING}, ${(height * 3) / 4})`}>\n          {/* Render all segments as a single line for comparison */}\n          <LinePath\n            data={data.rightToLeft.flat()}\n            x={getX}\n            y={getY}\n            strokeWidth={8}\n            stroke=\"#fff\"\n            strokeOpacity={0.15}\n            curve={curveCardinal}\n          />\n\n          <SplitLinePath\n            sampleRate={1}\n            segments={data.rightToLeft}\n            segmentation=\"x\"\n            x={getX}\n            y={getY}\n            curve={curveCardinal}\n            styles={[\n              { stroke: foreground, strokeWidth: 3 },\n              { stroke: '#fff', strokeWidth: 2, strokeDasharray: '9,5' },\n              { stroke: background, strokeWidth: 2 },\n            ]}\n          >\n            {({ segment, styles, index }) =>\n              index === numberOfWaves - 1 || index === 2 ? (\n                renderNumberSegment({ segment, styles, index })\n              ) : (\n                <LinePath data={segment} x={getX} y={getY} {...styles} />\n              )\n            }\n          </SplitLinePath>\n          <text dy=\"0.3em\" fontSize={10} fontWeight=\"bold\" textAnchor=\"middle\">\n            Start\n          </text>\n        </g>\n\n        {/* top to bottom */}\n        <g transform={`translate(${(width * 3) / 4}, ${PADDING})`}>\n          {/* Render all segments as a single line for comparison */}\n          <LinePath\n            data={data.topToBottom.flat()}\n            x={getX}\n            y={getY}\n            strokeWidth={8}\n            stroke=\"#fff\"\n            strokeOpacity={0.15}\n            curve={curveCardinal}\n          />\n\n          <SplitLinePath\n            sampleRate={1}\n            segments={data.topToBottom}\n            segmentation=\"y\"\n            x={getX}\n            y={getY}\n            curve={curveCardinal}\n            styles={[\n              { stroke: foreground, strokeWidth: 3 },\n              { stroke: '#fff', strokeWidth: 2, strokeDasharray: '9,5' },\n              { stroke: background, strokeWidth: 2 },\n            ]}\n          >\n            {({ segment, styles, index }) =>\n              index === numberOfWaves - 1 || index === 2 ? (\n                renderNumberSegment({ segment, styles, index })\n              ) : (\n                <LinePath data={segment} x={getX} y={getY} {...styles} />\n              )\n            }\n          </SplitLinePath>\n          <text dy=\"0.3em\" fontSize={10} fontWeight=\"bold\" textAnchor=\"middle\">\n            Start\n          </text>\n        </g>\n\n        {/* bottom to top */}\n        <g transform={`translate(${(width * 3) / 4}, ${height - PADDING})`}>\n          {/* Render all segments as a single line for comparison */}\n          <LinePath\n            data={data.bottomToTop.flat()}\n            x={getX}\n            y={getY}\n            strokeWidth={8}\n            stroke=\"#fff\"\n            strokeOpacity={0.15}\n            curve={curveCardinal}\n          />\n\n          <SplitLinePath\n            sampleRate={1}\n            segments={data.bottomToTop}\n            segmentation=\"y\"\n            x={getX}\n            y={getY}\n            curve={curveCardinal}\n            styles={[\n              { stroke: foreground, strokeWidth: 3 },\n              { stroke: '#fff', strokeWidth: 2, strokeDasharray: '9,5' },\n              { stroke: background, strokeWidth: 2 },\n            ]}\n          >\n            {({ segment, styles, index }) =>\n              index === numberOfWaves - 1 || index === 2 ? (\n                renderCircleSegment({ segment, styles, index })\n              ) : (\n                <LinePath data={segment} x={getX} y={getY} {...styles} />\n              )\n            }\n          </SplitLinePath>\n          <text dy=\"0.3em\" fontSize={10} fontWeight=\"bold\" textAnchor=\"middle\">\n            Start\n          </text>\n        </g>\n        {/* snake */}\n        <g transform={`translate(${width / 2 - width / 8}, ${height / 2 - height / 8})`}>\n          {/* Render all segments as a single line for comparison */}\n          <LinePath\n            data={data.snake.flat()}\n            x={getX}\n            y={getY}\n            strokeWidth={8}\n            stroke=\"#fff\"\n            strokeOpacity={0.15}\n          />\n\n          <SplitLinePath\n            sampleRate={1}\n            segments={data.snake}\n            segmentation=\"length\"\n            x={getX}\n            y={getY}\n            styles={[\n              { stroke: foreground, strokeWidth: 3 },\n              { stroke: '#fff', strokeWidth: 2, strokeDasharray: '9,5' },\n              { stroke: background, strokeWidth: 2 },\n            ]}\n          />\n          <text\n            x={width / 8}\n            y={height / 8}\n            dy=\"0.3em\"\n            fontSize={10}\n            fontWeight=\"bold\"\n            textAnchor=\"middle\"\n          >\n            Start\n          </text>\n        </g>\n      </svg>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-splitlinepath/generateSinPoints.ts",
    "content": "/** generates points along a sin wave, with increasing height toward the center.  */\nexport default function generateSinPoints({\n  width,\n  height,\n  numberOfWaves = 10,\n  pointsPerWave = 10,\n}: {\n  width: number;\n  height: number;\n  numberOfWaves?: number;\n  pointsPerWave?: number;\n}) {\n  const waveLength = width / numberOfWaves;\n  const distanceBetweenPoints = waveLength / pointsPerWave;\n  const sinPoints: { x: number; y: number }[] = [];\n\n  for (let waveIndex = 0; waveIndex < numberOfWaves; waveIndex += 1) {\n    const waveDistFromStart = waveIndex * waveLength;\n\n    for (let pointIndex = 0; pointIndex <= pointsPerWave; pointIndex += 1) {\n      const waveXFraction = pointIndex / pointsPerWave;\n      const waveX = pointIndex * distanceBetweenPoints;\n      const globalX = waveDistFromStart + waveX;\n      // scale height based x position\n      const globalXFraction = (width - globalX) / width;\n      const waveHeight = Math.min(globalXFraction, 1 - globalXFraction) * height;\n\n      sinPoints.push({ x: globalX, y: waveHeight * Math.sin(waveXFraction * (2 * Math.PI)) });\n    }\n  }\n\n  return sinPoints;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-splitlinepath/generateSinSegments.ts",
    "content": "import generateSinPoints from './generateSinPoints';\n\ntype Point = { x: number; y: number };\n\nexport default function generateSinSegments({\n  width,\n  height,\n  numberOfWaves = 10,\n  pointsPerWave = 10,\n  direction = 'left-to-right',\n}: {\n  width: number;\n  height: number;\n  numberOfWaves?: number;\n  pointsPerWave?: number;\n  direction?: 'left-to-right' | 'right-to-left' | 'top-to-bottom' | 'bottom-to-top';\n}) {\n  const isHorizontal = direction === 'left-to-right' || direction === 'right-to-left';\n\n  // Generate points\n  const data = generateSinPoints({\n    width: isHorizontal ? width : height,\n    height: isHorizontal ? height : width,\n    numberOfWaves,\n    pointsPerWave,\n  });\n\n  // Create empty segments\n  const segments: Point[][] = [];\n  for (let i = 0; i < numberOfWaves; i += 1) {\n    segments.push([]);\n  }\n\n  // Split into equal width or height segments\n  const segmentSize = (isHorizontal ? width : height) / numberOfWaves;\n  data.forEach((d) => {\n    segments[Math.min(Math.floor(d.x / segmentSize), segments.length - 1)].push(d);\n  });\n\n  switch (direction) {\n    case 'right-to-left':\n      return segments.map((segment) => segment.map(({ x, y }) => ({ x: -x, y })));\n    case 'top-to-bottom':\n      return segments.map((segment) => segment.map(({ x, y }) => ({ x: y, y: x })));\n    case 'bottom-to-top':\n      return segments.map((segment) => segment.map(({ x, y }) => ({ x: y, y: -x })));\n    case 'left-to-right':\n    default:\n      return segments;\n  }\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-splitlinepath/generateSnakePath.ts",
    "content": "interface Point {\n  x: number;\n  y: number;\n}\n\nconst pointKey = ({ x, y }: Point) => [x, y].join('_');\n\nfunction distance(a: Point, b: Point) {\n  return Math.sqrt((b.x - a.x) ** 2 + (b.y - a.y) ** 2);\n}\n\n/** generate a continuous path that fill rectangular space, similar to the classic Nokia snake game. */\nexport default function generateSnakePath({\n  width,\n  height,\n  step,\n}: {\n  width: number;\n  height: number;\n  step: number;\n}) {\n  const points: Point[] = [];\n\n  const used = new Set();\n\n  function next(point: Point) {\n    const { x, y } = point;\n    return [\n      { x: x - step, y: y - step },\n      { x: x - step, y },\n      { x: x - step, y: y + step },\n      { x, y: y - step },\n      { x, y: y + step },\n      { x: x + step, y: y - step },\n      { x: x + step, y },\n      { x: x + step, y: y + step },\n    ]\n      .filter(\n        (p) => p.x >= 0 && p.x <= width && p.y >= 0 && p.y <= height && !used.has(pointKey(p)),\n      )\n      .map((p) => ({\n        point: p,\n        distance: distance(point, p),\n      }))\n      .sort((a, b) => a.distance - b.distance);\n  }\n\n  let currentPoint: Point | null = {\n    x: width / 2,\n    y: height / 2,\n  };\n\n  while (currentPoint) {\n    points.push(currentPoint);\n    used.add(pointKey(currentPoint));\n    const choices = next(currentPoint);\n    currentPoint = choices.length > 0 ? choices[0].point : null;\n  }\n\n  return points;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-splitlinepath/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-splitlinepath/package.json",
    "content": "{\n  \"name\": \"@visx/demo-shape-splitlinepath\",\n  \"description\": \"Standalone visx splitlinepath demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"lodash\": \"^4.17.21\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"splitline\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-shape-splitlinepath/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stacked-areas/Example.tsx",
    "content": "import React from 'react';\nimport { AreaStack } from '@visx/shape';\nimport type { SeriesPoint } from '@visx/shape';\nimport { GradientOrangeRed } from '@visx/gradient';\nimport type { BrowserUsage } from '@visx/mock-data';\nimport { browserUsage } from '@visx/mock-data';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport { timeParse } from '@visx/vendor/d3-time-format';\n\ntype BrowserNames = keyof BrowserUsage;\n\nconst data = browserUsage;\nconst keys = Object.keys(data[0]).filter((k) => k !== 'date') as BrowserNames[];\nconst parseDate = timeParse('%Y %b %d');\nexport const background = '#f38181';\n\nconst getDate = (d: BrowserUsage) => (parseDate(d.date) as Date).valueOf();\nconst getY0 = (d: SeriesPoint<BrowserUsage>) => d[0] / 100;\nconst getY1 = (d: SeriesPoint<BrowserUsage>) => d[1] / 100;\n\nexport type StackedAreasProps = {\n  width: number;\n  height: number;\n  events?: boolean;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function Example({\n  width,\n  height,\n  margin = { top: 0, right: 0, bottom: 0, left: 0 },\n  events = false,\n}: StackedAreasProps) {\n  // bounds\n  const yMax = height - margin.top - margin.bottom;\n  const xMax = width - margin.left - margin.right;\n\n  // scales\n  const xScale = scaleTime<number>({\n    range: [0, xMax],\n    domain: [Math.min(...data.map(getDate)), Math.max(...data.map(getDate))],\n  });\n  const yScale = scaleLinear<number>({\n    range: [yMax, 0],\n  });\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <GradientOrangeRed id=\"stacked-area-orangered\" />\n      <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />\n      <AreaStack\n        top={margin.top}\n        left={margin.left}\n        keys={keys}\n        data={data}\n        x={(d) => xScale(getDate(d.data)) ?? 0}\n        y0={(d) => yScale(getY0(d)) ?? 0}\n        y1={(d) => yScale(getY1(d)) ?? 0}\n      >\n        {({ stacks, path }) =>\n          stacks.map((stack) => (\n            <path\n              key={`stack-${stack.key}`}\n              d={path(stack) || ''}\n              stroke=\"transparent\"\n              fill=\"url(#stacked-area-orangered)\"\n              onClick={() => {\n                if (events) alert(`${stack.key}`);\n              }}\n            />\n          ))\n        }\n      </AreaStack>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stacked-areas/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stacked-areas/package.json",
    "content": "{\n  \"name\": \"@visx/demo-stacked-areas\",\n  \"description\": \"Standalone visx stacked area demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"stackedarea\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stacked-areas/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stats/Example.tsx",
    "content": "import React from 'react';\nimport { Group } from '@visx/group';\nimport { ViolinPlot, BoxPlot } from '@visx/stats';\nimport { LinearGradient } from '@visx/gradient';\nimport { scaleBand, scaleLinear } from '@visx/scale';\nimport type { Stats } from '@visx/mock-data';\nimport { genStats, getSeededRandom, getRandomNormal } from '@visx/mock-data';\nimport { withTooltip, Tooltip, defaultStyles as defaultTooltipStyles } from '@visx/tooltip';\nimport type { WithTooltipProvidedProps } from '@visx/tooltip';\nimport { PatternLines } from '@visx/pattern';\n\n// seeded randomness\nconst seededRandom = getSeededRandom(0.1);\nconst randomNormal = getRandomNormal.source(getSeededRandom(0.789))(4, 3);\nconst data: Stats[] = genStats(5, randomNormal, () => 10 * seededRandom());\n\n// accessors\nconst x = (d: Stats) => d.boxPlot.x;\nconst min = (d: Stats) => d.boxPlot.min;\nconst max = (d: Stats) => d.boxPlot.max;\nconst median = (d: Stats) => d.boxPlot.median;\nconst firstQuartile = (d: Stats) => d.boxPlot.firstQuartile;\nconst thirdQuartile = (d: Stats) => d.boxPlot.thirdQuartile;\nconst outliers = (d: Stats) => d.boxPlot.outliers;\n\ninterface TooltipData {\n  name?: string;\n  min?: number;\n  median?: number;\n  max?: number;\n  firstQuartile?: number;\n  thirdQuartile?: number;\n}\n\nexport type StatsPlotProps = {\n  width: number;\n  height: number;\n};\n\nexport default withTooltip<StatsPlotProps, TooltipData>(\n  ({\n    width,\n    height,\n    tooltipOpen,\n    tooltipLeft,\n    tooltipTop,\n    tooltipData,\n    showTooltip,\n    hideTooltip,\n  }: StatsPlotProps & WithTooltipProvidedProps<TooltipData>) => {\n    // bounds\n    const xMax = width;\n    const yMax = height - 120;\n\n    // scales\n    const xScale = scaleBand<string>({\n      range: [0, xMax],\n      round: true,\n      domain: data.map(x),\n      padding: 0.4,\n    });\n\n    const values = data.reduce((allValues, { boxPlot }) => {\n      allValues.push(boxPlot.min, boxPlot.max);\n      return allValues;\n    }, [] as number[]);\n    const minYValue = Math.min(...values);\n    const maxYValue = Math.max(...values);\n\n    const yScale = scaleLinear<number>({\n      range: [yMax, 0],\n      round: true,\n      domain: [minYValue, maxYValue],\n    });\n\n    const boxWidth = xScale.bandwidth();\n    const constrainedWidth = Math.min(40, boxWidth);\n\n    return width < 10 ? null : (\n      <div style={{ position: 'relative' }}>\n        <svg width={width} height={height}>\n          <LinearGradient id=\"statsplot\" to=\"#8b6ce7\" from=\"#87f2d4\" />\n          <rect x={0} y={0} width={width} height={height} fill=\"url(#statsplot)\" rx={14} />\n          <PatternLines\n            id=\"hViolinLines\"\n            height={3}\n            width={3}\n            stroke=\"#ced4da\"\n            strokeWidth={1}\n            // fill=\"rgba(0,0,0,0.3)\"\n            orientation={['horizontal']}\n          />\n          <Group top={40}>\n            {data.map((d: Stats, i) => (\n              <g key={i}>\n                <ViolinPlot\n                  data={d.binData}\n                  stroke=\"#dee2e6\"\n                  left={xScale(x(d))!}\n                  width={constrainedWidth}\n                  valueScale={yScale}\n                  fill=\"url(#hViolinLines)\"\n                />\n                <BoxPlot\n                  min={min(d)}\n                  max={max(d)}\n                  left={xScale(x(d))! + 0.3 * constrainedWidth}\n                  firstQuartile={firstQuartile(d)}\n                  thirdQuartile={thirdQuartile(d)}\n                  median={median(d)}\n                  boxWidth={constrainedWidth * 0.4}\n                  fill=\"#FFFFFF\"\n                  fillOpacity={0.3}\n                  stroke=\"#FFFFFF\"\n                  strokeWidth={2}\n                  valueScale={yScale}\n                  outliers={outliers(d)}\n                  minProps={{\n                    onMouseOver: () => {\n                      showTooltip({\n                        tooltipTop: yScale(min(d)) ?? 0 + 40,\n                        tooltipLeft: xScale(x(d))! + constrainedWidth + 5,\n                        tooltipData: {\n                          min: min(d),\n                          name: x(d),\n                        },\n                      });\n                    },\n                    onMouseLeave: () => {\n                      hideTooltip();\n                    },\n                  }}\n                  maxProps={{\n                    onMouseOver: () => {\n                      showTooltip({\n                        tooltipTop: yScale(max(d)) ?? 0 + 40,\n                        tooltipLeft: xScale(x(d))! + constrainedWidth + 5,\n                        tooltipData: {\n                          max: max(d),\n                          name: x(d),\n                        },\n                      });\n                    },\n                    onMouseLeave: () => {\n                      hideTooltip();\n                    },\n                  }}\n                  boxProps={{\n                    onMouseOver: () => {\n                      showTooltip({\n                        tooltipTop: yScale(median(d)) ?? 0 + 40,\n                        tooltipLeft: xScale(x(d))! + constrainedWidth + 5,\n                        tooltipData: {\n                          ...d.boxPlot,\n                          name: x(d),\n                        },\n                      });\n                    },\n                    onMouseLeave: () => {\n                      hideTooltip();\n                    },\n                  }}\n                  medianProps={{\n                    style: {\n                      stroke: 'white',\n                    },\n                    onMouseOver: () => {\n                      showTooltip({\n                        tooltipTop: yScale(median(d)) ?? 0 + 40,\n                        tooltipLeft: xScale(x(d))! + constrainedWidth + 5,\n                        tooltipData: {\n                          median: median(d),\n                          name: x(d),\n                        },\n                      });\n                    },\n                    onMouseLeave: () => {\n                      hideTooltip();\n                    },\n                  }}\n                />\n              </g>\n            ))}\n          </Group>\n        </svg>\n\n        {tooltipOpen && tooltipData && (\n          <Tooltip\n            top={tooltipTop}\n            left={tooltipLeft}\n            style={{ ...defaultTooltipStyles, backgroundColor: '#283238', color: 'white' }}\n          >\n            <div>\n              <strong>{tooltipData.name}</strong>\n            </div>\n            <div style={{ marginTop: '5px', fontSize: '12px' }}>\n              {tooltipData.max && <div>max: {tooltipData.max}</div>}\n              {tooltipData.thirdQuartile && <div>third quartile: {tooltipData.thirdQuartile}</div>}\n              {tooltipData.median && <div>median: {tooltipData.median}</div>}\n              {tooltipData.firstQuartile && <div>first quartile: {tooltipData.firstQuartile}</div>}\n              {tooltipData.min && <div>min: {tooltipData.min}</div>}\n            </div>\n          </Tooltip>\n        )}\n      </div>\n    );\n  },\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stats/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stats/package.json",
    "content": "{\n  \"name\": \"@visx/demo-stats\",\n  \"description\": \"Standalone visx stats demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/pattern\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/stats\": \"latest\",\n    \"@visx/tooltip\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"stats\",\n    \"boxplot\",\n    \"violin plot\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-stats/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-streamgraph/Example.tsx",
    "content": "/* eslint-disable react-hooks/rules-of-hooks */\n/**\n * Inspired by Mike Bostock's Streamgraph & Lee Byron’s test data generator:\n * https://bl.ocks.org/mbostock/4060954\n */\nimport React from 'react';\nimport { Stack } from '@visx/shape';\nimport { PatternCircles, PatternWaves } from '@visx/pattern';\nimport { scaleLinear, scaleOrdinal } from '@visx/scale';\nimport { transpose } from '@visx/vendor/d3-array';\nimport { animated, useSpring } from '@react-spring/web';\n\nimport useForceUpdate from './useForceUpdate';\nimport generateData from './generateData';\n\n// constants\nconst NUM_LAYERS = 20;\nconst SAMPLES_PER_LAYER = 200;\nconst BUMPS_PER_LAYER = 10;\nexport const BACKGROUND = '#ffdede';\n\n// utils\nconst range = (n: number) => Array.from(new Array(n), (_, i) => i);\n\nconst keys = range(NUM_LAYERS);\n\n// scales\nconst xScale = scaleLinear<number>({\n  domain: [0, SAMPLES_PER_LAYER - 1],\n});\nconst yScale = scaleLinear<number>({\n  domain: [-30, 50],\n});\nconst colorScale = scaleOrdinal<number, string>({\n  domain: keys,\n  range: ['#ffc409', '#f14702', '#262d97', 'white', '#036ecd', '#9ecadd', '#51666e'],\n});\nconst patternScale = scaleOrdinal<number, string>({\n  domain: keys,\n  range: ['mustard', 'cherry', 'navy', 'circles', 'circles', 'circles', 'circles'],\n});\n\n// accessors\ntype Datum = number[];\nconst getY0 = (d: Datum) => yScale(d[0]) ?? 0;\nconst getY1 = (d: Datum) => yScale(d[1]) ?? 0;\n\nexport type StreamGraphProps = {\n  width: number;\n  height: number;\n  animate?: boolean;\n};\n\nexport default function Streamgraph({ width, height, animate = true }: StreamGraphProps) {\n  const forceUpdate = useForceUpdate();\n  const handlePress = () => forceUpdate();\n\n  if (width < 10) return null;\n\n  xScale.range([0, width]);\n  yScale.range([height, 0]);\n\n  // generate layers in render to update on touch\n  const layers = transpose<number>(\n    keys.map(() => generateData(SAMPLES_PER_LAYER, BUMPS_PER_LAYER)),\n  );\n\n  return (\n    <svg width={width} height={height}>\n      <PatternCircles id=\"mustard\" height={40} width={40} radius={5} fill=\"#036ecf\" complement />\n      <PatternWaves\n        id=\"cherry\"\n        height={12}\n        width={12}\n        fill=\"transparent\"\n        stroke=\"#232493\"\n        strokeWidth={1}\n      />\n      <PatternCircles id=\"navy\" height={60} width={60} radius={10} fill=\"white\" complement />\n      <PatternCircles\n        complement\n        id=\"circles\"\n        height={60}\n        width={60}\n        radius={10}\n        fill=\"transparent\"\n      />\n\n      <g onClick={handlePress} onTouchStart={handlePress}>\n        <rect x={0} y={0} width={width} height={height} fill={BACKGROUND} rx={14} />\n        <Stack<number[], number>\n          data={layers}\n          keys={keys}\n          offset=\"wiggle\"\n          color={colorScale}\n          x={(_, i) => xScale(i) ?? 0}\n          y0={getY0}\n          y1={getY1}\n        >\n          {({ stacks, path }) =>\n            stacks.map((stack) => {\n              // Alternatively use renderprops <Spring to={{ d }}>{tweened => ...}</Spring>\n              const pathString = path(stack) || '';\n              const tweened = animate ? useSpring({ pathString }) : { pathString };\n              const color = colorScale(stack.key);\n              const pattern = patternScale(stack.key);\n              return (\n                <g key={`series-${stack.key}`}>\n                  <animated.path d={tweened.pathString} fill={color} />\n                  <animated.path d={tweened.pathString} fill={`url(#${pattern})`} />\n                </g>\n              );\n            })\n          }\n        </Stack>\n      </g>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-streamgraph/generateData.ts",
    "content": "import { getSeededRandom } from '@visx/mock-data';\n\nconst random = getSeededRandom(0.65);\n\nconst getPoints = (array: number[], pointCount: number) => {\n  const x = 1 / (0.1 + random());\n  const y = 2 * random() - 0.5;\n  const z = 10 / (0.1 + random());\n  for (let i = 0; i < pointCount; i += 1) {\n    const w = (i / pointCount - y) * z;\n    array[i] += x * Math.exp(-w * w);\n  }\n};\n\nconst generateData = (pointCount: number, bumpCount: number): number[] => {\n  const arr = [];\n  let i: number;\n  for (i = 0; i < pointCount; i += 1) arr[i] = 0;\n  for (i = 0; i < bumpCount; i += 1) getPoints(arr, pointCount);\n  return arr;\n};\n\nexport default generateData;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-streamgraph/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-streamgraph/package.json",
    "content": "{\n  \"name\": \"@visx/demo-streamgraph\",\n  \"description\": \"Standalone visx streamgraph demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/pattern\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/vendor\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"@react-spring/web\": \"^10.0.3\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"streamgraph\",\n    \"react-spring\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-streamgraph/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-streamgraph/useForceUpdate.ts",
    "content": "import { useState } from 'react';\n\nexport default function useForceUpdate() {\n  const [, setValue] = useState<number>(0);\n  return () => setValue((value) => value + 1); // update state to force render\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-threshold/Example.tsx",
    "content": "import { Group } from '@visx/group';\nimport { curveBasis } from '@visx/curve';\nimport { LinePath } from '@visx/shape';\nimport { Threshold } from '@visx/threshold';\nimport { scaleTime, scaleLinear } from '@visx/scale';\nimport { AxisLeft, AxisBottom } from '@visx/axis';\nimport { GridRows, GridColumns } from '@visx/grid';\nimport { cityTemperature } from '@visx/mock-data';\nimport type { CityTemperature } from '@visx/mock-data';\n\nexport const background = '#f3f3f3';\n\n// accessors\nconst date = (d: CityTemperature) => new Date(d.date).valueOf();\nconst ny = (d: CityTemperature) => Number(d['New York']);\nconst sf = (d: CityTemperature) => Number(d['San Francisco']);\n\n// scales\nconst timeScale = scaleTime<number>({\n  domain: [Math.min(...cityTemperature.map(date)), Math.max(...cityTemperature.map(date))],\n});\nconst temperatureScale = scaleLinear<number>({\n  domain: [\n    Math.min(...cityTemperature.map((d) => Math.min(ny(d), sf(d)))),\n    Math.max(...cityTemperature.map((d) => Math.max(ny(d), sf(d)))),\n  ],\n  nice: true,\n});\n\nconst defaultMargin = { top: 40, right: 30, bottom: 50, left: 40 };\n\nexport type ThresholdProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function Theshold({ width, height, margin = defaultMargin }: ThresholdProps) {\n  if (width < 10) return null;\n\n  // bounds\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n\n  timeScale.range([0, xMax]);\n  temperatureScale.range([yMax, 0]);\n\n  return (\n    <div>\n      <svg width={width} height={height}>\n        <rect x={0} y={0} width={width} height={height} fill={background} rx={14} />\n        <Group left={margin.left} top={margin.top}>\n          <GridRows scale={temperatureScale} width={xMax} height={yMax} stroke=\"#e0e0e0\" />\n          <GridColumns scale={timeScale} width={xMax} height={yMax} stroke=\"#e0e0e0\" />\n          <line x1={xMax} x2={xMax} y1={0} y2={yMax} stroke=\"#e0e0e0\" />\n          <AxisBottom top={yMax} scale={timeScale} numTicks={width > 520 ? 10 : 5} />\n          <AxisLeft scale={temperatureScale} />\n          <text x=\"-70\" y=\"15\" transform=\"rotate(-90)\" fontSize={10}>\n            Temperature (°F)\n          </text>\n          <Threshold<CityTemperature>\n            id={`${Math.random()}`}\n            data={cityTemperature}\n            x={(d) => timeScale(date(d)) ?? 0}\n            y0={(d) => temperatureScale(ny(d)) ?? 0}\n            y1={(d) => temperatureScale(sf(d)) ?? 0}\n            clipAboveTo={0}\n            clipBelowTo={yMax}\n            curve={curveBasis}\n            belowAreaProps={{\n              fill: 'violet',\n              fillOpacity: 0.4,\n            }}\n            aboveAreaProps={{\n              fill: 'green',\n              fillOpacity: 0.4,\n            }}\n          />\n          <LinePath\n            data={cityTemperature}\n            curve={curveBasis}\n            x={(d) => timeScale(date(d)) ?? 0}\n            y={(d) => temperatureScale(sf(d)) ?? 0}\n            stroke=\"#222\"\n            strokeWidth={1.5}\n            strokeOpacity={0.8}\n            strokeDasharray=\"1,2\"\n          />\n          <LinePath\n            data={cityTemperature}\n            curve={curveBasis}\n            x={(d) => timeScale(date(d)) ?? 0}\n            y={(d) => temperatureScale(ny(d)) ?? 0}\n            stroke=\"#222\"\n            strokeWidth={1.5}\n          />\n        </Group>\n      </svg>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-threshold/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-threshold/package.json",
    "content": "{\n  \"name\": \"@visx/demo-threshold\",\n  \"description\": \"Standalone visx threshold demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/axis\": \"latest\",\n    \"@visx/curve\": \"latest\",\n    \"@visx/grid\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"@visx/threshold\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"threshold\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-threshold/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tooltip/Example.tsx",
    "content": "import React, { useState, useCallback } from 'react';\nimport {\n  Tooltip,\n  TooltipWithBounds,\n  useTooltip,\n  useTooltipInPortal,\n  defaultStyles,\n} from '@visx/tooltip';\n\nexport type TooltipProps = {\n  width: number;\n  height: number;\n  showControls?: boolean;\n};\n\ntype TooltipData = string;\n\nconst positionIndicatorSize = 8;\n\nconst tooltipStyles = {\n  ...defaultStyles,\n  backgroundColor: 'rgba(53,71,125,0.8)',\n  color: 'white',\n  width: 152,\n  height: 72,\n  padding: 12,\n};\n\nexport default function Example({ width, height, showControls = true }: TooltipProps) {\n  const [tooltipShouldDetectBounds, setTooltipShouldDetectBounds] = useState(true);\n  const [renderTooltipInPortal, setRenderTooltipInPortal] = useState(false);\n\n  const { containerRef, containerBounds, TooltipInPortal } = useTooltipInPortal({\n    scroll: true,\n    detectBounds: tooltipShouldDetectBounds,\n  });\n\n  const {\n    showTooltip,\n    hideTooltip,\n    tooltipOpen,\n    tooltipData,\n    tooltipLeft = 0,\n    tooltipTop = 0,\n  } = useTooltip<TooltipData>({\n    // initial tooltip state\n    tooltipOpen: true,\n    tooltipLeft: width / 3,\n    tooltipTop: height / 3,\n    tooltipData: 'Move me with your mouse or finger',\n  });\n\n  // event handlers\n  const handlePointerMove = useCallback(\n    (event: React.PointerEvent<HTMLDivElement>) => {\n      // coordinates should be relative to the container in which Tooltip is rendered\n      const containerX = ('clientX' in event ? event.clientX : 0) - containerBounds.left;\n      const containerY = ('clientY' in event ? event.clientY : 0) - containerBounds.top;\n      showTooltip({\n        tooltipLeft: containerX,\n        tooltipTop: containerY,\n        tooltipData: tooltipShouldDetectBounds\n          ? 'I detect my container boundary'\n          : 'I will get clipped by my container',\n      });\n    },\n    [showTooltip, tooltipShouldDetectBounds, containerBounds],\n  );\n\n  const TooltipComponent = renderTooltipInPortal\n    ? TooltipInPortal\n    : tooltipShouldDetectBounds\n    ? TooltipWithBounds\n    : Tooltip;\n\n  return (\n    <>\n      <div\n        ref={containerRef}\n        className=\"tooltip-example\"\n        style={{ width, height }}\n        onPointerMove={handlePointerMove}\n      >\n        {tooltipOpen ? (\n          <>\n            <div\n              className=\"position-indicator\"\n              style={{\n                transform: `translate(${tooltipLeft - positionIndicatorSize / 2}px, ${\n                  tooltipTop - positionIndicatorSize / 2\n                }px)`,\n              }}\n            />\n            <div\n              className=\"crosshair horizontal\"\n              style={{ transform: `translateY(${tooltipTop}px)` }}\n            />\n            <div\n              className=\"crosshair vertical\"\n              style={{ transform: `translateX(${tooltipLeft}px)` }}\n            />\n            <TooltipComponent\n              key={Math.random()} // needed for bounds to update correctly\n              left={tooltipLeft}\n              top={tooltipTop}\n              style={tooltipStyles}\n            >\n              {tooltipData}\n              <br />\n              <br />\n              <strong>left</strong> {tooltipLeft?.toFixed(0)}px&nbsp;&nbsp;\n              <strong>top</strong> {tooltipTop?.toFixed(0)}px\n            </TooltipComponent>\n          </>\n        ) : (\n          <div className=\"no-tooltip\">Move or touch the canvas to see the tooltip</div>\n        )}\n        <div className=\"z-index-bummer\">\n          I have an annoying z-index. Try&nbsp;\n          <label>\n            <input\n              type=\"checkbox\"\n              defaultChecked={renderTooltipInPortal}\n              onClick={(e) => {\n                // if rendered in clickable container, don't trigger that event\n                e.stopPropagation();\n                setRenderTooltipInPortal(!renderTooltipInPortal);\n              }}\n            />\n            &nbsp;rendering in Portal\n          </label>\n          &nbsp;\n          <span role=\"img\" aria-label=\"yay\">\n            🥳\n          </span>\n        </div>\n      </div>\n      {showControls && (\n        <div className=\"tooltip-controls\">\n          <label>\n            <input\n              type=\"checkbox\"\n              checked={tooltipShouldDetectBounds}\n              onChange={() => setTooltipShouldDetectBounds(!tooltipShouldDetectBounds)}\n            />\n            &nbsp;Tooltip with boundary detection\n          </label>\n\n          <button onClick={() => hideTooltip()}>Hide tooltip</button>\n        </div>\n      )}\n      <style>{`\n        .tooltip-example {\n          z-index: 0;\n          position: relative;\n          overflow: hidden;\n          border-radius: 16px;\n          background: linear-gradient(45deg, #6c5b7b, #c06c84, #f67280);\n          font-size: 14px;\n          color: white;\n          width: 100%;\n          height: 100%;\n        }\n        .tooltip-controls label {\n          font-size: 14px;\n          margin-right: 8px;\n        }\n        .position-indicator {\n          width: ${positionIndicatorSize}px;\n          height: ${positionIndicatorSize}px;\n          border-radius: 50%;\n          background: #35477d;\n          position: absolute;\n        }\n        .crosshair {\n          position: absolute;\n          top: 0;\n          left: 0;\n        }\n        .crosshair.horizontal {\n          width: 100%;\n          height: 1px;\n          border-top: 1px dashed #35477d;\n        }\n        .crosshair.vertical {\n          height: 100%;\n          width: 1px;\n          border-left: 1px dashed #35477d;\n        }\n        .no-tooltip {\n          position: absolute;\n          left: 50%;\n          top: 50%;\n          transform: translate(-50%, -50%);\n        }\n        .z-index-bummer {\n          position: absolute;\n          right: 12%;\n          bottom: 20%;\n          max-width: 190px;\n          z-index: 2000;\n          background: rgba(255, 255, 255, 0.8);\n          color: #35477d;\n          border-radius: 8px;\n          padding: 16px;\n          line-height: 1.2em;\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tooltip/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tooltip/package.json",
    "content": "{\n  \"name\": \"@visx/demo-tooltip\",\n  \"description\": \"Standalone visx tooltip demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/tooltip\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tooltip/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tree/Example.tsx",
    "content": "import React, { useMemo } from 'react';\nimport { Group } from '@visx/group';\nimport { Tree, hierarchy } from '@visx/hierarchy';\nimport type { HierarchyPointNode } from '@visx/hierarchy';\nimport { LinkHorizontal } from '@visx/shape';\nimport { LinearGradient } from '@visx/gradient';\n\nconst peach = '#fd9b93';\nconst pink = '#fe6e9e';\nconst blue = '#03c0dc';\nconst green = '#26deb0';\nconst plum = '#71248e';\nconst lightpurple = '#374469';\nconst white = '#ffffff';\nexport const background = '#272b4d';\n\ninterface TreeNode {\n  name: string;\n  children?: this[];\n}\n\ntype HierarchyNode = HierarchyPointNode<TreeNode>;\n\nconst rawTree: TreeNode = {\n  name: 'T',\n  children: [\n    {\n      name: 'A',\n      children: [\n        { name: 'A1' },\n        { name: 'A2' },\n        { name: 'A3' },\n        {\n          name: 'C',\n          children: [\n            {\n              name: 'C1',\n            },\n            {\n              name: 'D',\n              children: [\n                {\n                  name: 'D1',\n                },\n                {\n                  name: 'D2',\n                },\n                {\n                  name: 'D3',\n                },\n              ],\n            },\n          ],\n        },\n      ],\n    },\n    { name: 'Z' },\n    {\n      name: 'B',\n      children: [{ name: 'B1' }, { name: 'B2' }, { name: 'B3' }],\n    },\n  ],\n};\n\nfunction RootNode({ node }: { node: HierarchyNode }) {\n  return (\n    <Group top={node.x} left={node.y}>\n      <circle r={12} fill=\"url('#lg')\" />\n      <text\n        dy=\".33em\"\n        fontSize={9}\n        fontFamily=\"Arial\"\n        textAnchor=\"middle\"\n        style={{ pointerEvents: 'none' }}\n        fill={plum}\n      >\n        {node.data.name}\n      </text>\n    </Group>\n  );\n}\n\nfunction ParentNode({ node }: { node: HierarchyNode }) {\n  const width = 40;\n  const height = 20;\n  const centerX = -width / 2;\n  const centerY = -height / 2;\n\n  return (\n    <Group top={node.x} left={node.y}>\n      <rect\n        height={height}\n        width={width}\n        y={centerY}\n        x={centerX}\n        fill={background}\n        stroke={blue}\n        strokeWidth={1}\n        onClick={() => {\n          alert(`clicked: ${JSON.stringify(node.data.name)}`);\n        }}\n      />\n      <text\n        dy=\".33em\"\n        fontSize={9}\n        fontFamily=\"Arial\"\n        textAnchor=\"middle\"\n        style={{ pointerEvents: 'none' }}\n        fill={white}\n      >\n        {node.data.name}\n      </text>\n    </Group>\n  );\n}\n\n/** Handles rendering Root, Parent, and other Nodes. */\nfunction Node({ node }: { node: HierarchyNode }) {\n  const width = 40;\n  const height = 20;\n  const centerX = -width / 2;\n  const centerY = -height / 2;\n  const isRoot = node.depth === 0;\n  const isParent = !!node.children;\n\n  if (isRoot) return <RootNode node={node} />;\n  if (isParent) return <ParentNode node={node} />;\n\n  return (\n    <Group top={node.x} left={node.y}>\n      <rect\n        height={height}\n        width={width}\n        y={centerY}\n        x={centerX}\n        fill={background}\n        stroke={green}\n        strokeWidth={1}\n        strokeDasharray=\"2,2\"\n        strokeOpacity={0.6}\n        rx={10}\n        onClick={() => {\n          alert(`clicked: ${JSON.stringify(node.data.name)}`);\n        }}\n      />\n      <text\n        dy=\".33em\"\n        fontSize={9}\n        fontFamily=\"Arial\"\n        textAnchor=\"middle\"\n        fill={green}\n        style={{ pointerEvents: 'none' }}\n      >\n        {node.data.name}\n      </text>\n    </Group>\n  );\n}\n\nconst defaultMargin = { top: 10, left: 80, right: 80, bottom: 10 };\n\nexport type TreeProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function Example({ width, height, margin = defaultMargin }: TreeProps) {\n  const data = useMemo(() => hierarchy(rawTree), []);\n  const yMax = height - margin.top - margin.bottom;\n  const xMax = width - margin.left - margin.right;\n\n  return width < 10 ? null : (\n    <svg width={width} height={height}>\n      <LinearGradient id=\"lg\" from={peach} to={pink} />\n      <rect width={width} height={height} rx={14} fill={background} />\n      <Tree<TreeNode> root={data} size={[yMax, xMax]}>\n        {(tree) => (\n          <Group top={margin.top} left={margin.left}>\n            {tree.links().map((link, i) => (\n              <LinkHorizontal\n                key={`link-${i}`}\n                data={link}\n                stroke={lightpurple}\n                strokeWidth=\"1\"\n                fill=\"none\"\n              />\n            ))}\n            {tree.descendants().map((node, i) => (\n              <Node key={`node-${i}`} node={node} />\n            ))}\n          </Group>\n        )}\n      </Tree>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tree/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tree/package.json",
    "content": "{\n  \"name\": \"@visx/demo-tree\",\n  \"description\": \"Standalone visx tree demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/hierarchy\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/shape\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"hierarchy\",\n    \"tree\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-tree/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-treemap/Example.tsx",
    "content": "import React, { useState } from 'react';\nimport { Group } from '@visx/group';\nimport {\n  Treemap,\n  hierarchy,\n  stratify,\n  treemapSquarify,\n  treemapBinary,\n  treemapDice,\n  treemapResquarify,\n  treemapSlice,\n  treemapSliceDice,\n} from '@visx/hierarchy';\nimport type { TileMethod } from '@visx/hierarchy';\nimport type { Shakespeare } from '@visx/mock-data';\nimport { shakespeare } from '@visx/mock-data';\n\nimport { scaleLinear } from '@visx/scale';\n\nexport const color1 = '#f3e9d2';\nconst color2 = '#4281a4';\nexport const background = '#114b5f';\n\nconst colorScale = scaleLinear<string>({\n  domain: [0, Math.max(...shakespeare.map((d) => d.size ?? 0))],\n  range: [color2, color1],\n});\n\nconst data = stratify<Shakespeare>()\n  .id((d) => d.id)\n  .parentId((d) => d.parent)(shakespeare)\n  .sum((d) => d.size ?? 0);\n\nconst tileMethods: { [tile: string]: TileMethod<typeof data> } = {\n  treemapSquarify,\n  treemapBinary,\n  treemapDice,\n  treemapResquarify,\n  treemapSlice,\n  treemapSliceDice,\n};\n\nconst defaultMargin = { top: 10, left: 10, right: 10, bottom: 10 };\n\nexport type TreemapProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nexport default function TreemapDemo({ width, height, margin = defaultMargin }: TreemapProps) {\n  const [tileMethod, setTileMethod] = useState<string>('treemapSquarify');\n  const xMax = width - margin.left - margin.right;\n  const yMax = height - margin.top - margin.bottom;\n  const root = hierarchy(data).sort((a, b) => (b.value || 0) - (a.value || 0));\n\n  return width < 10 ? null : (\n    <div>\n      <label>tile method</label>{' '}\n      <select\n        onClick={(e) => e.stopPropagation()}\n        onChange={(e) => setTileMethod(e.target.value)}\n        value={tileMethod}\n      >\n        {Object.keys(tileMethods).map((tile) => (\n          <option key={tile} value={tile}>\n            {tile}\n          </option>\n        ))}\n      </select>\n      <div>\n        <svg width={width} height={height}>\n          <rect width={width} height={height} rx={14} fill={background} />\n          <Treemap<typeof data>\n            top={margin.top}\n            root={root}\n            size={[xMax, yMax]}\n            tile={tileMethods[tileMethod]}\n            round\n          >\n            {(treemap) => (\n              <Group>\n                {treemap\n                  .descendants()\n                  .reverse()\n                  .map((node, i) => {\n                    const nodeWidth = node.x1 - node.x0;\n                    const nodeHeight = node.y1 - node.y0;\n                    return (\n                      <Group\n                        key={`node-${i}`}\n                        top={node.y0 + margin.top}\n                        left={node.x0 + margin.left}\n                      >\n                        {node.depth === 1 && (\n                          <rect\n                            width={nodeWidth}\n                            height={nodeHeight}\n                            stroke={background}\n                            strokeWidth={4}\n                            fill=\"transparent\"\n                          />\n                        )}\n                        {node.depth > 2 && (\n                          <rect\n                            width={nodeWidth}\n                            height={nodeHeight}\n                            stroke={background}\n                            fill={colorScale(node.value || 0)}\n                          />\n                        )}\n                      </Group>\n                    );\n                  })}\n              </Group>\n            )}\n          </Treemap>\n        </svg>\n      </div>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-treemap/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-treemap/package.json",
    "content": "{\n  \"name\": \"@visx/demo-treemap\",\n  \"description\": \"Standalone visx treemap demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/group\": \"latest\",\n    \"@visx/hierarchy\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"treemap\",\n    \"hierarchy\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-treemap/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-voronoi/Example.tsx",
    "content": "import React, { useState, useMemo, useRef } from 'react';\nimport { Group } from '@visx/group';\nimport { GradientOrangeRed, GradientPinkRed } from '@visx/gradient';\nimport { RectClipPath } from '@visx/clip-path';\nimport { voronoi, VoronoiPolygon } from '@visx/voronoi';\nimport { localPoint } from '@visx/event';\nimport { getSeededRandom } from '@visx/mock-data';\n\ntype Datum = {\n  x: number;\n  y: number;\n  id: string;\n};\n\nconst seededRandom = getSeededRandom(0.88);\n\nconst data: Datum[] = new Array(150).fill(null).map(() => ({\n  x: seededRandom(),\n  y: seededRandom(),\n  id: Math.random().toString(36).slice(2),\n}));\n\nconst neighborRadius = 75;\n\nconst defaultMargin = {\n  top: 0,\n  left: 0,\n  right: 0,\n  bottom: 76,\n};\n\nexport type VoronoiProps = {\n  width: number;\n  height: number;\n  margin?: { top: number; right: number; bottom: number; left: number };\n};\n\nfunction Example({ width, height, margin = defaultMargin }: VoronoiProps) {\n  const innerWidth = width - margin.left - margin.right;\n  const innerHeight = height - margin.top - margin.bottom;\n\n  const voronoiLayout = useMemo(\n    () =>\n      voronoi<Datum>({\n        x: (d) => d.x * innerWidth,\n        y: (d) => d.y * innerHeight,\n        width: innerWidth,\n        height: innerHeight,\n      })(data),\n    [innerWidth, innerHeight],\n  );\n\n  const polygons = voronoiLayout.polygons();\n  const svgRef = useRef<SVGSVGElement>(null);\n  const [hoveredId, setHoveredId] = useState<string | null>(null);\n  const [neighborIds, setNeighborIds] = useState<Set<string>>(new Set());\n\n  return width < 10 ? null : (\n    <svg width={width} height={height} ref={svgRef}>\n      <GradientOrangeRed id=\"voronoi_orange_red\" />\n      <GradientPinkRed id=\"voronoi_pink_red\" />\n      <RectClipPath id=\"voronoi_clip\" width={innerWidth} height={innerHeight} rx={14} />\n      <Group\n        top={margin.top}\n        left={margin.left}\n        clipPath=\"url(#voronoi_clip)\"\n        onMouseMove={(event) => {\n          if (!svgRef.current) return;\n\n          // find the nearest polygon to the current mouse position\n          const point = localPoint(svgRef.current, event);\n          if (!point) return;\n\n          const closest = voronoiLayout.find(point.x, point.y, neighborRadius);\n          // find neighboring polygons to hightlight\n          if (closest && closest.data.id !== hoveredId) {\n            const neighbors = new Set<string>();\n            const cell = voronoiLayout.cells[closest.index];\n            if (!cell) return;\n\n            cell.halfedges.forEach((index) => {\n              const edge = voronoiLayout.edges[index];\n              const { left, right } = edge;\n              if (left && left !== closest) neighbors.add(left.data.id);\n              else if (right && right !== closest) neighbors.add(right.data.id);\n            });\n\n            setNeighborIds(neighbors);\n            setHoveredId(closest.data.id);\n          }\n        }}\n        onMouseLeave={() => {\n          setHoveredId(null);\n          setNeighborIds(new Set());\n        }}\n      >\n        {polygons.map((polygon) => (\n          <VoronoiPolygon\n            key={`polygon-${polygon.data.id}`}\n            polygon={polygon}\n            fill={\n              hoveredId && (polygon.data.id === hoveredId || neighborIds.has(polygon.data.id))\n                ? 'url(#voronoi_orange_red)'\n                : 'url(#voronoi_pink_red)'\n            }\n            stroke=\"#fff\"\n            strokeWidth={1}\n            fillOpacity={hoveredId && neighborIds.has(polygon.data.id) ? 0.5 : 1}\n          />\n        ))}\n        {data.map(({ x, y, id }) => (\n          <circle\n            key={`circle-${id}`}\n            r={2}\n            cx={x * innerWidth}\n            cy={y * innerHeight}\n            fill={id === hoveredId ? 'fuchsia' : '#fff'}\n            fillOpacity={0.8}\n          />\n        ))}\n      </Group>\n    </svg>\n  );\n}\n\nexport default Example;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-voronoi/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-voronoi/package.json",
    "content": "{\n  \"name\": \"@visx/demo-voronoi\",\n  \"description\": \"Standalone visx voronoi demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/clip-path\": \"latest\",\n    \"@visx/event\": \"latest\",\n    \"@visx/gradient\": \"latest\",\n    \"@visx/group\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/voronoi\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"voronoi\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-voronoi/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-wordcloud/Example.tsx",
    "content": "import React, { useState } from 'react';\nimport { Text } from '@visx/text';\nimport { scaleLog } from '@visx/scale';\nimport { Wordcloud } from '@visx/wordcloud';\nimport { totoAfricaLyrics } from './text.fixture';\n\ninterface ExampleProps {\n  width: number;\n  height: number;\n  showControls?: boolean;\n}\n\nexport interface WordData {\n  text: string;\n  value: number;\n}\n\nconst colors = ['#143059', '#2F6B9A', '#82a6c2'];\n\nfunction wordFreq(text: string): WordData[] {\n  const words: string[] = text.replace(/\\./g, '').split(/\\s/);\n  const freqMap: Record<string, number> = {};\n\n  for (const w of words) {\n    if (!freqMap[w]) freqMap[w] = 0;\n    freqMap[w] += 1;\n  }\n  return Object.keys(freqMap).map((word) => ({ text: word, value: freqMap[word] }));\n}\n\nfunction getRotationDegree() {\n  const rand = Math.random();\n  const degree = rand > 0.5 ? 60 : -60;\n  return rand * degree;\n}\n\nconst words = wordFreq(totoAfricaLyrics);\n\nconst fontScale = scaleLog({\n  domain: [Math.min(...words.map((w) => w.value)), Math.max(...words.map((w) => w.value))],\n  range: [10, 100],\n});\nconst fontSizeSetter = (datum: WordData) => fontScale(datum.value);\n\nconst fixedValueGenerator = () => 0.5;\n\ntype SpiralType = 'archimedean' | 'rectangular';\n\nexport default function Example({ width, height, showControls }: ExampleProps) {\n  const [spiralType, setSpiralType] = useState<SpiralType>('archimedean');\n  const [withRotation, setWithRotation] = useState(false);\n\n  return (\n    <div className=\"wordcloud\">\n      <Wordcloud\n        words={words}\n        width={width}\n        height={height}\n        fontSize={fontSizeSetter}\n        font={'Impact'}\n        padding={2}\n        spiral={spiralType}\n        rotate={withRotation ? getRotationDegree : 0}\n        random={fixedValueGenerator}\n      >\n        {(cloudWords) =>\n          cloudWords.map((w, i) => (\n            <Text\n              key={w.text}\n              fill={colors[i % colors.length]}\n              textAnchor={'middle'}\n              transform={`translate(${w.x}, ${w.y}) rotate(${w.rotate})`}\n              fontSize={w.size}\n              fontFamily={w.font}\n            >\n              {w.text}\n            </Text>\n          ))\n        }\n      </Wordcloud>\n      {showControls && (\n        <div>\n          <label>\n            Spiral type &nbsp;\n            <select\n              onChange={(e) => setSpiralType(e.target.value as SpiralType)}\n              value={spiralType}\n            >\n              <option key={'archimedean'} value={'archimedean'}>\n                archimedean\n              </option>\n              <option key={'rectangular'} value={'rectangular'}>\n                rectangular\n              </option>\n            </select>\n          </label>\n          <label>\n            With rotation &nbsp;\n            <input\n              type=\"checkbox\"\n              checked={withRotation}\n              onChange={() => setWithRotation(!withRotation)}\n            />\n          </label>\n          <br />\n        </div>\n      )}\n      <style jsx>{`\n        .wordcloud {\n          display: flex;\n          flex-direction: column;\n          user-select: none;\n        }\n        .wordcloud svg {\n          margin: 1rem 0;\n          cursor: pointer;\n        }\n\n        .wordcloud label {\n          display: inline-flex;\n          align-items: center;\n          font-size: 14px;\n          margin-right: 8px;\n        }\n        .wordcloud textarea {\n          min-height: 100px;\n        }\n      `}</style>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-wordcloud/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-wordcloud/package.json",
    "content": "{\n  \"name\": \"@visx/demo-wordcloud\",\n  \"description\": \"Standalone visx wordcloud demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@visx/responsive\":\"latest\",\n    \"@visx/scale\":\"latest\",\n    \"@visx/text\":\"latest\",\n    \"@visx/wordcloud\":\"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\"\n  },\n  \"devDependencies\": {\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-wordcloud/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-wordcloud/text.fixture.ts",
    "content": "export const totoAfricaLyrics = `I hear the drums echoing tonight\nBut she hears only whispers of some quiet conversation\nShe's coming in, 12:30 flight\nThe moonlit wings reflect the stars that guide me towards salvation\nI stopped an old man along the way\nHoping to find some old forgotten words or ancient melodies\nHe turned to me as if to say, Hurry boy, it's waiting there for you\nIt's gonna take a lot to drag me away from you\nThere's nothing that a hundred men or more could ever do\nI bless the rains down in Africa\nGonna take some time to do the things we never had ooh, ooh\nThe wild dogs cry out in the night\nAs they grow restless, longing for some solitary company\nI know that I must do what's right\nAs sure as Kilimanjaro rises like Olympus above the Serengeti\nI seek to cure what's deep inside, frightened of this thing that I've become\nIt's gonna take a lot to drag me away from you\nThere's nothing that a hundred men or more could ever do\nI bless the rains down in Africa\nGonna take some time to do the things we never had ooh, ooh\nHurry boy, she's waiting there for you\nIt's gonna take a lot to drag me away from you\nThere's nothing that a hundred men or more could ever do\nI bless the rains down in Africa\nI bless the rains down in Africa\nI bless the rain\nI bless the rains down in Africa I bless the rain\nI bless the rains down in Africa\nI bless the rains down in Africa ah, gonna take the time\nGonna take some time to do the things we never had ooh, ooh`;\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/CustomChartBackground.tsx",
    "content": "import React, { useContext } from 'react';\nimport { PatternLines } from '@visx/pattern';\nimport { DataContext } from '@visx/xychart';\n\nconst patternId = 'xy-chart-pattern';\n\nexport default function CustomChartBackground() {\n  const { theme, margin, width, height, innerWidth, innerHeight } = useContext(DataContext);\n\n  // early return values not available in context\n  if (width == null || height == null || margin == null || theme == null) return null;\n\n  return (\n    <>\n      <PatternLines\n        id={patternId}\n        width={16}\n        height={16}\n        orientation={['diagonal']}\n        stroke={theme?.gridStyles?.stroke}\n        strokeWidth={1}\n      />\n      <rect x={0} y={0} width={width} height={height} fill={theme?.backgroundColor ?? '#fff'} />\n      <rect\n        x={margin.left}\n        y={margin.top}\n        width={innerWidth}\n        height={innerHeight}\n        fill={`url(#${patternId})`}\n        fillOpacity={0.3}\n      />\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/Example.tsx",
    "content": "import React from 'react';\nimport type { CityTemperature } from '@visx/mock-data';\n\nimport ExampleControls from './ExampleControls';\nimport CustomChartBackground from './CustomChartBackground';\n\nexport type XYChartProps = {\n  width: number;\n  height: number;\n};\n\ntype City = 'San Francisco' | 'New York' | 'Austin';\n\nexport default function Example({ height }: XYChartProps) {\n  return (\n    <ExampleControls>\n      {({\n        accessors,\n        animationTrajectory,\n        annotationDataKey,\n        annotationDatum,\n        annotationLabelPosition,\n        annotationType,\n        colorAccessorFactory,\n        config,\n        curve,\n        data,\n        editAnnotationLabelPosition,\n        numTicks,\n        renderAreaSeries,\n        renderAreaStack,\n        renderBarGroup,\n        renderBarSeries,\n        renderBarStack,\n        renderGlyph,\n        renderGlyphSeries,\n        enableTooltipGlyph,\n        renderTooltipGlyph,\n        renderHorizontally,\n        renderLineSeries,\n        setAnnotationDataIndex,\n        setAnnotationDataKey,\n        setAnnotationLabelPosition,\n        sharedTooltip,\n        showGridColumns,\n        showGridRows,\n        showHorizontalCrosshair,\n        showTooltip,\n        showVerticalCrosshair,\n        snapTooltipToDatumX,\n        snapTooltipToDatumY,\n        stackOffset,\n        theme,\n        xAxisOrientation,\n        yAxisOrientation,\n\n        // components are animated or not depending on selection\n        Annotation,\n        AreaSeries,\n        AreaStack,\n        Axis,\n        BarGroup,\n        BarSeries,\n        BarStack,\n        GlyphSeries,\n        Grid,\n        LineSeries,\n        AnnotationCircleSubject,\n        AnnotationConnector,\n        AnnotationLabel,\n        AnnotationLineSubject,\n        Tooltip,\n        XYChart,\n      }) => (\n        <XYChart\n          theme={theme}\n          xScale={config.x}\n          yScale={config.y}\n          height={Math.min(400, height)}\n          captureEvents={!editAnnotationLabelPosition}\n          onPointerUp={(d) => {\n            setAnnotationDataKey(d.key as 'New York' | 'San Francisco' | 'Austin');\n            setAnnotationDataIndex(d.index);\n          }}\n        >\n          <CustomChartBackground />\n          <Grid\n            key={`grid-${animationTrajectory}`} // force animate on update\n            rows={showGridRows}\n            columns={showGridColumns}\n            animationTrajectory={animationTrajectory}\n            numTicks={numTicks}\n          />\n          {renderBarStack && (\n            <BarStack offset={stackOffset}>\n              <BarSeries\n                dataKey=\"New York\"\n                data={data}\n                xAccessor={accessors.x['New York']}\n                yAccessor={accessors.y['New York']}\n              />\n              <BarSeries\n                dataKey=\"San Francisco\"\n                data={data}\n                xAccessor={accessors.x['San Francisco']}\n                yAccessor={accessors.y['San Francisco']}\n              />\n              <BarSeries\n                dataKey=\"Austin\"\n                data={data}\n                xAccessor={accessors.x.Austin}\n                yAccessor={accessors.y.Austin}\n              />\n            </BarStack>\n          )}\n          {renderBarGroup && (\n            <BarGroup>\n              <BarSeries\n                dataKey=\"New York\"\n                data={data}\n                xAccessor={accessors.x['New York']}\n                yAccessor={accessors.y['New York']}\n                colorAccessor={colorAccessorFactory('New York')}\n              />\n              <BarSeries\n                dataKey=\"San Francisco\"\n                data={data}\n                xAccessor={accessors.x['San Francisco']}\n                yAccessor={accessors.y['San Francisco']}\n                colorAccessor={colorAccessorFactory('San Francisco')}\n              />\n              <BarSeries\n                dataKey=\"Austin\"\n                data={data}\n                xAccessor={accessors.x.Austin}\n                yAccessor={accessors.y.Austin}\n                colorAccessor={colorAccessorFactory('Austin')}\n              />\n            </BarGroup>\n          )}\n          {renderBarSeries && (\n            <BarSeries\n              dataKey=\"New York\"\n              data={data}\n              xAccessor={accessors.x['New York']}\n              yAccessor={accessors.y['New York']}\n              colorAccessor={colorAccessorFactory('New York')}\n            />\n          )}\n          {renderAreaSeries && (\n            <>\n              <AreaSeries\n                dataKey=\"Austin\"\n                data={data}\n                xAccessor={accessors.x.Austin}\n                yAccessor={accessors.y.Austin}\n                fillOpacity={0.4}\n                curve={curve}\n              />\n              <AreaSeries\n                dataKey=\"New York\"\n                data={data}\n                xAccessor={accessors.x['New York']}\n                yAccessor={accessors.y['New York']}\n                fillOpacity={0.4}\n                curve={curve}\n              />\n              <AreaSeries\n                dataKey=\"San Francisco\"\n                data={data}\n                xAccessor={accessors.x['San Francisco']}\n                yAccessor={accessors.y['San Francisco']}\n                fillOpacity={0.4}\n                curve={curve}\n              />\n            </>\n          )}\n          {renderAreaStack && (\n            <AreaStack curve={curve} offset={stackOffset} renderLine={stackOffset !== 'wiggle'}>\n              <AreaSeries\n                dataKey=\"Austin\"\n                data={data}\n                xAccessor={accessors.x.Austin}\n                yAccessor={accessors.y.Austin}\n                fillOpacity={0.4}\n              />\n              <AreaSeries\n                dataKey=\"New York\"\n                data={data}\n                xAccessor={accessors.x['New York']}\n                yAccessor={accessors.y['New York']}\n                fillOpacity={0.4}\n              />\n              <AreaSeries\n                dataKey=\"San Francisco\"\n                data={data}\n                xAccessor={accessors.x['San Francisco']}\n                yAccessor={accessors.y['San Francisco']}\n                fillOpacity={0.4}\n              />\n            </AreaStack>\n          )}\n          {renderLineSeries && (\n            <>\n              <LineSeries\n                dataKey=\"Austin\"\n                data={data}\n                xAccessor={accessors.x.Austin}\n                yAccessor={accessors.y.Austin}\n                curve={curve}\n              />\n              {!renderBarSeries && (\n                <LineSeries\n                  dataKey=\"New York\"\n                  data={data}\n                  xAccessor={accessors.x['New York']}\n                  yAccessor={accessors.y['New York']}\n                  curve={curve}\n                />\n              )}\n              <LineSeries\n                dataKey=\"San Francisco\"\n                data={data}\n                xAccessor={accessors.x['San Francisco']}\n                yAccessor={accessors.y['San Francisco']}\n                curve={curve}\n              />\n            </>\n          )}\n          {renderGlyphSeries && (\n            <GlyphSeries\n              dataKey=\"San Francisco\"\n              data={data}\n              xAccessor={accessors.x['San Francisco']}\n              yAccessor={accessors.y['San Francisco']}\n              renderGlyph={renderGlyph}\n              colorAccessor={colorAccessorFactory('San Francisco')}\n            />\n          )}\n          <Axis\n            key={`time-axis-${animationTrajectory}-${renderHorizontally}`}\n            orientation={renderHorizontally ? yAxisOrientation : xAxisOrientation}\n            numTicks={numTicks}\n            animationTrajectory={animationTrajectory}\n          />\n          <Axis\n            key={`temp-axis-${animationTrajectory}-${renderHorizontally}`}\n            label={\n              stackOffset == null\n                ? 'Temperature (°F)'\n                : stackOffset === 'expand'\n                ? 'Fraction of total temperature'\n                : ''\n            }\n            orientation={renderHorizontally ? xAxisOrientation : yAxisOrientation}\n            numTicks={numTicks}\n            animationTrajectory={animationTrajectory}\n            // values don't make sense in stream graph\n            tickFormat={stackOffset === 'wiggle' ? () => '' : undefined}\n          />\n          {annotationDataKey && annotationDatum && (\n            <Annotation\n              dataKey={annotationDataKey}\n              datum={annotationDatum}\n              dx={annotationLabelPosition.dx}\n              dy={annotationLabelPosition.dy}\n              editable={editAnnotationLabelPosition}\n              canEditSubject={false}\n              onDragEnd={({ dx, dy }) => setAnnotationLabelPosition({ dx, dy })}\n            >\n              <AnnotationConnector />\n              {annotationType === 'circle' ? (\n                <AnnotationCircleSubject />\n              ) : (\n                <AnnotationLineSubject />\n              )}\n              <AnnotationLabel\n                title={annotationDataKey}\n                subtitle={`${annotationDatum.date}, ${annotationDatum[annotationDataKey]}°F`}\n                width={135}\n                backgroundProps={{\n                  stroke: theme.gridStyles.stroke,\n                  strokeOpacity: 0.5,\n                  fillOpacity: 0.8,\n                }}\n              />\n            </Annotation>\n          )}\n          {showTooltip && (\n            <Tooltip<CityTemperature>\n              showHorizontalCrosshair={showHorizontalCrosshair}\n              showVerticalCrosshair={showVerticalCrosshair}\n              snapTooltipToDatumX={snapTooltipToDatumX}\n              snapTooltipToDatumY={snapTooltipToDatumY}\n              showDatumGlyph={(snapTooltipToDatumX || snapTooltipToDatumY) && !renderBarGroup}\n              showSeriesGlyphs={sharedTooltip && !renderBarGroup}\n              renderGlyph={enableTooltipGlyph ? renderTooltipGlyph : undefined}\n              renderTooltip={({ tooltipData, colorScale }) => (\n                <>\n                  {/** date */}\n                  {(tooltipData?.nearestDatum?.datum &&\n                    accessors.date(tooltipData?.nearestDatum?.datum)) ||\n                    'No date'}\n                  <br />\n                  <br />\n                  {/** temperatures */}\n                  {(\n                    (sharedTooltip\n                      ? Object.keys(tooltipData?.datumByKey ?? {})\n                      : [tooltipData?.nearestDatum?.key]\n                    ).filter((city) => city) as City[]\n                  ).map((city) => {\n                    const temperature =\n                      tooltipData?.nearestDatum?.datum &&\n                      accessors[renderHorizontally ? 'x' : 'y'][city](\n                        tooltipData?.nearestDatum?.datum,\n                      );\n\n                    return (\n                      <div key={city}>\n                        <em\n                          style={{\n                            color: colorScale?.(city),\n                            textDecoration:\n                              tooltipData?.nearestDatum?.key === city ? 'underline' : undefined,\n                          }}\n                        >\n                          {city}\n                        </em>{' '}\n                        {temperature == null || Number.isNaN(temperature)\n                          ? '–'\n                          : `${temperature}° F`}\n                      </div>\n                    );\n                  })}\n                </>\n              )}\n            />\n          )}\n        </XYChart>\n      )}\n    </ExampleControls>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/ExampleControls.tsx",
    "content": "/* eslint-disable jsx-a11y/accessible-emoji */\n/* eslint-disable jsx-a11y/label-has-associated-control */\nimport React, { useCallback, useMemo, useState } from 'react';\nimport type { XYChartTheme, GlyphProps, RenderTooltipGlyphProps } from '@visx/xychart';\nimport { lightTheme, darkTheme } from '@visx/xychart';\nimport { PatternLines } from '@visx/pattern';\nimport type { AnimationTrajectory } from '@visx/react-spring';\nimport type { CityTemperature } from '@visx/mock-data';\nimport { cityTemperature } from '@visx/mock-data';\nimport { GlyphCross, GlyphDot, GlyphStar } from '@visx/glyph';\nimport { curveLinear, curveStep, curveCardinal } from '@visx/curve';\nimport customTheme from './customTheme';\nimport userPrefersReducedMotion from './userPrefersReducedMotion';\nimport getAnimatedOrUnanimatedComponents from './getAnimatedOrUnanimatedComponents';\n\nconst dateScaleConfig = { type: 'band', paddingInner: 0.3 } as const;\nconst temperatureScaleConfig = { type: 'linear' } as const;\nconst numTicks = 4;\nconst withMissingValues = (cityTemperatures: CityTemperature[]) =>\n  cityTemperatures.map((d, i) =>\n    i === 10 || i === 11\n      ? { ...d, 'San Francisco': 'nope', 'New York': 'notanumber', Austin: 'null' }\n      : d,\n  );\nconst addYears = (cityTemperatures: CityTemperature[], years: number) =>\n  cityTemperatures.map((d) => {\n    const date = new Date(d.date);\n    date.setFullYear(date.getFullYear() + years);\n    return {\n      ...d,\n      date: date.toISOString().slice(0, 10),\n    };\n  });\nconst data = {\n  small: cityTemperature.slice(225, 240),\n  regular: cityTemperature.slice(225, 275),\n  large: [...cityTemperature, ...addYears(cityTemperature, 1), ...addYears(cityTemperature, 2)],\n};\nconst dataMissingValues = {\n  small: withMissingValues(data.small),\n  regular: withMissingValues(data.regular),\n  large: withMissingValues(data.large),\n};\nconst getDate = (d: CityTemperature) => d.date;\nconst getSfTemperature = (d: CityTemperature) => Number(d['San Francisco']);\nconst getNegativeSfTemperature = (d: CityTemperature) => -getSfTemperature(d);\nconst getNyTemperature = (d: CityTemperature) => Number(d['New York']);\nconst getAustinTemperature = (d: CityTemperature) => Number(d.Austin);\nconst defaultAnnotationDataIndex = 13;\nconst selectedDatumPatternId = 'xychart-selected-datum';\n\ntype Accessor = (d: CityTemperature) => number | string;\n\ninterface Accessors {\n  'San Francisco': Accessor;\n  'New York': Accessor;\n  Austin: Accessor;\n}\n\ntype DataKey = keyof Accessors;\n\ntype SimpleScaleConfig = { type: 'band' | 'linear'; paddingInner?: number };\n\ntype ProvidedProps = {\n  accessors: {\n    x: Accessors;\n    y: Accessors;\n    date: Accessor;\n  };\n  animationTrajectory?: AnimationTrajectory;\n  annotationDataKey: DataKey | null;\n  annotationDatum?: CityTemperature;\n  annotationLabelPosition: { dx: number; dy: number };\n  annotationType?: 'line' | 'circle';\n  colorAccessorFactory: (key: DataKey) => (d: CityTemperature) => string | null;\n  config: {\n    x: SimpleScaleConfig;\n    y: SimpleScaleConfig;\n  };\n  curve: typeof curveLinear | typeof curveCardinal | typeof curveStep;\n  data: CityTemperature[];\n  editAnnotationLabelPosition: boolean;\n  numTicks: number;\n  setAnnotationDataIndex: (index: number) => void;\n  setAnnotationDataKey: (key: DataKey | null) => void;\n  setAnnotationLabelPosition: (position: { dx: number; dy: number }) => void;\n  renderAreaSeries: boolean;\n  renderAreaStack: boolean;\n  renderBarGroup: boolean;\n  renderBarSeries: boolean;\n  renderBarStack: boolean;\n  renderGlyph: React.FC<GlyphProps<CityTemperature>>;\n  renderGlyphSeries: boolean;\n  enableTooltipGlyph: boolean;\n  renderTooltipGlyph: React.FC<RenderTooltipGlyphProps<CityTemperature>>;\n  renderHorizontally: boolean;\n  renderLineSeries: boolean;\n  sharedTooltip: boolean;\n  showGridColumns: boolean;\n  showGridRows: boolean;\n  showHorizontalCrosshair: boolean;\n  showTooltip: boolean;\n  showVerticalCrosshair: boolean;\n  snapTooltipToDatumX: boolean;\n  snapTooltipToDatumY: boolean;\n  stackOffset?: 'wiggle' | 'expand' | 'diverging' | 'silhouette';\n  theme: XYChartTheme;\n  xAxisOrientation: 'top' | 'bottom';\n  yAxisOrientation: 'left' | 'right';\n} & ReturnType<typeof getAnimatedOrUnanimatedComponents>;\n\ntype ControlsProps = {\n  children: (props: ProvidedProps) => React.ReactNode;\n};\n\nexport default function ExampleControls({ children }: ControlsProps) {\n  const [useAnimatedComponents, setUseAnimatedComponents] = useState(!userPrefersReducedMotion());\n  const [theme, setTheme] = useState<XYChartTheme>(darkTheme);\n  const [animationTrajectory, setAnimationTrajectory] = useState<AnimationTrajectory | undefined>(\n    'center',\n  );\n  const [gridProps, setGridProps] = useState<[boolean, boolean]>([false, false]);\n  const [showGridRows, showGridColumns] = gridProps;\n  const [xAxisOrientation, setXAxisOrientation] = useState<'top' | 'bottom'>('bottom');\n  const [yAxisOrientation, setYAxisOrientation] = useState<'left' | 'right'>('right');\n  const [renderHorizontally, setRenderHorizontally] = useState(false);\n  const [showTooltip, setShowTooltip] = useState(true);\n  const [annotationDataKey, setAnnotationDataKey] =\n    useState<ProvidedProps['annotationDataKey']>(null);\n  const [annotationType, setAnnotationType] = useState<ProvidedProps['annotationType']>('circle');\n  const [showVerticalCrosshair, setShowVerticalCrosshair] = useState(true);\n  const [showHorizontalCrosshair, setShowHorizontalCrosshair] = useState(false);\n  const [snapTooltipToDatumX, setSnapTooltipToDatumX] = useState(true);\n  const [snapTooltipToDatumY, setSnapTooltipToDatumY] = useState(true);\n  const [sharedTooltip, setSharedTooltip] = useState(true);\n  const [renderBarStackOrGroup, setRenderBarStackOrGroup] = useState<\n    'bar' | 'barstack' | 'bargroup' | 'none'\n  >('none');\n  const [renderAreaLineOrStack, setRenderAreaLineOrStack] = useState<\n    'line' | 'area' | 'areastack' | 'none'\n  >('areastack');\n  const [stackOffset, setStackOffset] = useState<ProvidedProps['stackOffset']>();\n  const [renderGlyphSeries, setRenderGlyphSeries] = useState(false);\n  const [editAnnotationLabelPosition, setEditAnnotationLabelPosition] = useState(false);\n  const [annotationLabelPosition, setAnnotationLabelPosition] = useState({ dx: -40, dy: -20 });\n  const [annotationDataIndex, setAnnotationDataIndex] = useState(defaultAnnotationDataIndex);\n  const [negativeValues, setNegativeValues] = useState(false);\n  const [dataSize, setDataSize] = useState<keyof typeof data>('regular');\n  const [missingValues, setMissingValues] = useState(false);\n  const [glyphComponent, setGlyphComponent] = useState<'star' | 'cross' | 'circle' | '🍍'>('star');\n  const [curveType, setCurveType] = useState<'linear' | 'cardinal' | 'step'>('linear');\n  const glyphOutline = theme.gridStyles.stroke;\n  const renderGlyph = useCallback(\n    ({\n      x,\n      y,\n      size,\n      color,\n      onPointerMove,\n      onPointerOut,\n      onPointerUp,\n    }: GlyphProps<CityTemperature>) => {\n      const handlers = { onPointerMove, onPointerOut, onPointerUp };\n      if (glyphComponent === 'star') {\n        return (\n          <GlyphStar\n            left={x}\n            top={y}\n            stroke={glyphOutline}\n            fill={color}\n            size={size * 10}\n            {...handlers}\n          />\n        );\n      }\n      if (glyphComponent === 'circle') {\n        return (\n          <GlyphDot\n            left={x}\n            top={y}\n            stroke={glyphOutline}\n            fill={color}\n            r={size / 2}\n            {...handlers}\n          />\n        );\n      }\n      if (glyphComponent === 'cross') {\n        return (\n          <GlyphCross\n            left={x}\n            top={y}\n            stroke={glyphOutline}\n            fill={color}\n            size={size * 10}\n            {...handlers}\n          />\n        );\n      }\n      return (\n        <text x={x} y={y} dx=\"-0.75em\" dy=\"0.25em\" fontSize={14} {...handlers}>\n          🍍\n        </text>\n      );\n    },\n    [glyphComponent, glyphOutline],\n  );\n  const [enableTooltipGlyph, setEnableTooltipGlyph] = useState(false);\n  const [tooltipGlyphComponent, setTooltipGlyphComponent] = useState<\n    'star' | 'cross' | 'circle' | '🍍'\n  >('star');\n  const renderTooltipGlyph = useCallback(\n    ({\n      x,\n      y,\n      size,\n      color,\n      onPointerMove,\n      onPointerOut,\n      onPointerUp,\n      isNearestDatum,\n    }: RenderTooltipGlyphProps<CityTemperature>) => {\n      const handlers = { onPointerMove, onPointerOut, onPointerUp };\n      if (tooltipGlyphComponent === 'star') {\n        return (\n          <GlyphStar\n            left={x}\n            top={y}\n            stroke={glyphOutline}\n            fill={color}\n            size={size * 10}\n            {...handlers}\n          />\n        );\n      }\n      if (tooltipGlyphComponent === 'circle') {\n        return (\n          <GlyphDot left={x} top={y} stroke={glyphOutline} fill={color} r={size} {...handlers} />\n        );\n      }\n      if (tooltipGlyphComponent === 'cross') {\n        return (\n          <GlyphCross\n            left={x}\n            top={y}\n            stroke={glyphOutline}\n            fill={color}\n            size={size * 10}\n            {...handlers}\n          />\n        );\n      }\n      return (\n        <text x={x} y={y} dx=\"-0.75em\" dy=\"0.25em\" fontSize={14} {...handlers}>\n          {isNearestDatum ? '🍍' : '🍌'}\n        </text>\n      );\n    },\n    [tooltipGlyphComponent, glyphOutline],\n  );\n  // for series that support it, return a colorAccessor which returns a custom color if the datum is selected\n  const colorAccessorFactory = useCallback(\n    (dataKey: DataKey) => (d: CityTemperature) =>\n      annotationDataKey === dataKey && d === data[annotationDataIndex]\n        ? `url(#${selectedDatumPatternId})`\n        : null,\n    [annotationDataIndex, annotationDataKey],\n  );\n\n  const accessors = useMemo(\n    () => ({\n      x: {\n        'San Francisco': renderHorizontally\n          ? negativeValues\n            ? getNegativeSfTemperature\n            : getSfTemperature\n          : getDate,\n        'New York': renderHorizontally ? getNyTemperature : getDate,\n        Austin: renderHorizontally ? getAustinTemperature : getDate,\n      },\n      y: {\n        'San Francisco': renderHorizontally\n          ? getDate\n          : negativeValues\n          ? getNegativeSfTemperature\n          : getSfTemperature,\n        'New York': renderHorizontally ? getDate : getNyTemperature,\n        Austin: renderHorizontally ? getDate : getAustinTemperature,\n      },\n      date: getDate,\n    }),\n    [renderHorizontally, negativeValues],\n  );\n\n  const config = useMemo(\n    () => ({\n      x: renderHorizontally ? temperatureScaleConfig : dateScaleConfig,\n      y: renderHorizontally ? dateScaleConfig : temperatureScaleConfig,\n    }),\n    [renderHorizontally],\n  );\n\n  // cannot snap to a stack position\n  const canSnapTooltipToDatum =\n    renderBarStackOrGroup !== 'barstack' && renderAreaLineOrStack !== 'areastack';\n\n  return (\n    <>\n      {children({\n        accessors,\n        animationTrajectory,\n        annotationDataKey,\n        annotationDatum: data[annotationDataIndex],\n        annotationLabelPosition,\n        annotationType,\n        colorAccessorFactory,\n        config,\n        curve:\n          (curveType === 'cardinal' && curveCardinal) ||\n          (curveType === 'step' && curveStep) ||\n          curveLinear,\n        data: (missingValues ? dataMissingValues : data)[dataSize],\n        editAnnotationLabelPosition,\n        numTicks,\n        renderBarGroup: renderBarStackOrGroup === 'bargroup',\n        renderBarSeries: renderBarStackOrGroup === 'bar',\n        renderBarStack: renderBarStackOrGroup === 'barstack',\n        renderGlyphSeries,\n        renderGlyph,\n        enableTooltipGlyph,\n        renderTooltipGlyph,\n        renderHorizontally,\n        renderAreaSeries: renderAreaLineOrStack === 'area',\n        renderAreaStack: renderAreaLineOrStack === 'areastack',\n        renderLineSeries: renderAreaLineOrStack === 'line',\n        setAnnotationDataIndex,\n        setAnnotationDataKey,\n        setAnnotationLabelPosition,\n        sharedTooltip,\n        showGridColumns,\n        showGridRows,\n        showHorizontalCrosshair,\n        showTooltip,\n        showVerticalCrosshair,\n        snapTooltipToDatumX: canSnapTooltipToDatum && snapTooltipToDatumX,\n        snapTooltipToDatumY: canSnapTooltipToDatum && snapTooltipToDatumY,\n        stackOffset,\n        theme,\n        xAxisOrientation,\n        yAxisOrientation,\n        ...getAnimatedOrUnanimatedComponents(useAnimatedComponents),\n      })}\n      {/** This style is used for annotated elements via colorAccessor. */}\n      <svg className=\"pattern-lines\">\n        <PatternLines\n          id={selectedDatumPatternId}\n          width={6}\n          height={6}\n          orientation={['diagonalRightToLeft']}\n          stroke={theme?.axisStyles.x.bottom.axisLine.stroke}\n          strokeWidth={1.5}\n        />\n      </svg>\n      <div className=\"controls\">\n        {/** data */}\n        <div>\n          <strong>data</strong>\n          <label>\n            <input\n              type=\"checkbox\"\n              onChange={() => setNegativeValues(!negativeValues)}\n              checked={negativeValues}\n            />\n            negative values (SF)\n          </label>\n          <label>\n            <input\n              type=\"checkbox\"\n              onChange={() => setMissingValues(!missingValues)}\n              checked={missingValues}\n            />\n            missing values\n          </label>\n        </div>\n        <div>\n          <strong>data size</strong>\n          {Object.keys(data).map((size: keyof typeof data) => (\n            <label key={size}>\n              <input type=\"radio\" onChange={() => setDataSize(size)} checked={dataSize === size} />\n              {size}\n            </label>\n          ))}\n        </div>\n\n        {/** theme */}\n        <div>\n          <strong>theme</strong>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setTheme(lightTheme)}\n              checked={theme === lightTheme}\n            />\n            light\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setTheme(darkTheme)}\n              checked={theme === darkTheme}\n            />\n            dark\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setTheme(customTheme)}\n              checked={theme === customTheme}\n            />\n            custom\n          </label>\n        </div>\n\n        <br />\n\n        {/** series */}\n        {/** orientation */}\n        <div>\n          <strong>series orientation</strong>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setRenderHorizontally(false)}\n              checked={!renderHorizontally}\n            />\n            vertical\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setRenderHorizontally(true)}\n              checked={renderHorizontally}\n            />\n            horizontal\n          </label>\n        </div>\n        <div>\n          <strong>line series</strong>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => {\n                if (renderBarStackOrGroup === 'barstack' || renderBarStackOrGroup === 'bargroup') {\n                  setRenderBarStackOrGroup('none');\n                }\n                setRenderAreaLineOrStack('line');\n              }}\n              checked={renderAreaLineOrStack === 'line'}\n            />\n            line\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => {\n                if (renderBarStackOrGroup === 'barstack' || renderBarStackOrGroup === 'bargroup') {\n                  setRenderBarStackOrGroup('none');\n                }\n                setRenderAreaLineOrStack('area');\n              }}\n              checked={renderAreaLineOrStack === 'area'}\n            />\n            area\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => {\n                setRenderBarStackOrGroup('none');\n                setRenderAreaLineOrStack('areastack');\n              }}\n              checked={renderAreaLineOrStack === 'areastack'}\n            />\n            area stack\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setRenderAreaLineOrStack('none')}\n              checked={renderAreaLineOrStack === 'none'}\n            />\n            none\n          </label>\n          &nbsp;&nbsp;&nbsp;&nbsp;\n          <strong>curve shape</strong>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={renderAreaLineOrStack === 'none'}\n              onChange={() => setCurveType('linear')}\n              checked={curveType === 'linear'}\n            />\n            linear\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={renderAreaLineOrStack === 'none'}\n              onChange={() => setCurveType('cardinal')}\n              checked={curveType === 'cardinal'}\n            />\n            cardinal (smooth)\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={renderAreaLineOrStack === 'none'}\n              onChange={() => setCurveType('step')}\n              checked={curveType === 'step'}\n            />\n            step\n          </label>\n        </div>\n        {/** glyph */}\n        <div>\n          <strong>glyph series</strong>\n          <label>\n            <input\n              type=\"checkbox\"\n              onChange={() => setRenderGlyphSeries(!renderGlyphSeries)}\n              checked={renderGlyphSeries}\n            />\n            render glyphs\n          </label>\n          &nbsp;&nbsp;&nbsp;&nbsp;\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!renderGlyphSeries}\n              onChange={() => setGlyphComponent('circle')}\n              checked={glyphComponent === 'circle'}\n            />\n            circle\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!renderGlyphSeries}\n              onChange={() => setGlyphComponent('star')}\n              checked={glyphComponent === 'star'}\n            />\n            star\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!renderGlyphSeries}\n              onChange={() => setGlyphComponent('cross')}\n              checked={glyphComponent === 'cross'}\n            />\n            cross\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!renderGlyphSeries}\n              onChange={() => setGlyphComponent('🍍')}\n              checked={glyphComponent === '🍍'}\n            />\n            🍍\n          </label>\n        </div>\n        <div>\n          <strong>bar series</strong>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => {\n                if (renderAreaLineOrStack === 'areastack') {\n                  setRenderAreaLineOrStack('none');\n                }\n                setRenderBarStackOrGroup('bar');\n              }}\n              checked={renderBarStackOrGroup === 'bar'}\n            />\n            bar\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => {\n                setRenderAreaLineOrStack('none');\n                setRenderBarStackOrGroup('barstack');\n              }}\n              checked={renderBarStackOrGroup === 'barstack'}\n            />\n            bar stack\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => {\n                setRenderAreaLineOrStack('none');\n                setRenderBarStackOrGroup('bargroup');\n              }}\n              checked={renderBarStackOrGroup === 'bargroup'}\n            />\n            bar group\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setRenderBarStackOrGroup('none')}\n              checked={renderBarStackOrGroup === 'none'}\n            />\n            none\n          </label>\n        </div>\n        <div>\n          <strong>stack series offset</strong>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={\n                renderAreaLineOrStack !== 'areastack' && renderBarStackOrGroup !== 'barstack'\n              }\n              onChange={() => setStackOffset(undefined)}\n              checked={stackOffset == null}\n            />\n            auto (zero-baseline)\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={\n                renderAreaLineOrStack !== 'areastack' && renderBarStackOrGroup !== 'barstack'\n              }\n              onChange={() => setStackOffset('expand')}\n              checked={stackOffset === 'expand'}\n            />\n            expand (values sum to 1)\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={\n                renderAreaLineOrStack !== 'areastack' && renderBarStackOrGroup !== 'barstack'\n              }\n              onChange={() => setStackOffset('wiggle')}\n              checked={stackOffset === 'wiggle'}\n            />\n            wiggle (stream graph)\n          </label>\n        </div>\n\n        <br />\n        {/** tooltip */}\n        <div>\n          <strong>tooltip</strong>\n          <label>\n            <input\n              type=\"checkbox\"\n              onChange={() => setShowTooltip(!showTooltip)}\n              checked={showTooltip}\n            />\n            show tooltip\n          </label>\n          <label>\n            <input\n              type=\"checkbox\"\n              disabled={!showTooltip || !canSnapTooltipToDatum}\n              onChange={() => setSnapTooltipToDatumX(!snapTooltipToDatumX)}\n              checked={showTooltip && snapTooltipToDatumX}\n            />\n            snap tooltip to datum x\n          </label>\n          <label>\n            <input\n              type=\"checkbox\"\n              disabled={!showTooltip || !canSnapTooltipToDatum}\n              onChange={() => setSnapTooltipToDatumY(!snapTooltipToDatumY)}\n              checked={showTooltip && snapTooltipToDatumY}\n            />\n            snap tooltip to datum y\n          </label>\n          <label>\n            <input\n              type=\"checkbox\"\n              disabled={!showTooltip}\n              onChange={() => setShowVerticalCrosshair(!showVerticalCrosshair)}\n              checked={showTooltip && showVerticalCrosshair}\n            />\n            vertical crosshair\n          </label>\n          <label>\n            <input\n              type=\"checkbox\"\n              disabled={!showTooltip}\n              onChange={() => setShowHorizontalCrosshair(!showHorizontalCrosshair)}\n              checked={showTooltip && showHorizontalCrosshair}\n            />\n            horizontal crosshair\n          </label>\n          <label>\n            <input\n              type=\"checkbox\"\n              disabled={!showTooltip}\n              onChange={() => setSharedTooltip(!sharedTooltip)}\n              checked={showTooltip && sharedTooltip}\n            />\n            shared tooltip\n          </label>\n        </div>\n        <div>\n          <strong>tooltip glyph</strong>\n          <label>\n            <input\n              type=\"checkbox\"\n              onChange={() => setEnableTooltipGlyph(!enableTooltipGlyph)}\n              disabled={!canSnapTooltipToDatum}\n              checked={enableTooltipGlyph}\n            />\n            show custom tooltip glyph\n          </label>\n          &nbsp;&nbsp;&nbsp;&nbsp;\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!enableTooltipGlyph || !canSnapTooltipToDatum}\n              onChange={() => setTooltipGlyphComponent('circle')}\n              checked={tooltipGlyphComponent === 'circle'}\n            />\n            circle\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!enableTooltipGlyph || !canSnapTooltipToDatum}\n              onChange={() => setTooltipGlyphComponent('star')}\n              checked={tooltipGlyphComponent === 'star'}\n            />\n            star\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!enableTooltipGlyph || !canSnapTooltipToDatum}\n              onChange={() => setTooltipGlyphComponent('cross')}\n              checked={tooltipGlyphComponent === 'cross'}\n            />\n            cross\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              disabled={!enableTooltipGlyph || !canSnapTooltipToDatum}\n              onChange={() => setTooltipGlyphComponent('🍍')}\n              checked={tooltipGlyphComponent === '🍍'}\n            />\n            🍍\n          </label>\n        </div>\n        {/** annotation */}\n        <div>\n          <strong>annotation</strong> (click chart to update)\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setAnnotationDataKey(null)}\n              checked={annotationDataKey == null}\n            />\n            none\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setAnnotationDataKey('San Francisco')}\n              checked={annotationDataKey === 'San Francisco'}\n            />\n            SF\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setAnnotationDataKey('New York')}\n              checked={annotationDataKey === 'New York'}\n            />\n            NY\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setAnnotationDataKey('Austin')}\n              checked={annotationDataKey === 'Austin'}\n            />\n            Austin\n          </label>\n          &nbsp;&nbsp;&nbsp;\n          <strong>type</strong>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setAnnotationType('circle')}\n              checked={annotationType === 'circle'}\n            />\n            circle\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setAnnotationType('line')}\n              checked={annotationType === 'line'}\n            />\n            line\n          </label>\n          &nbsp;&nbsp;&nbsp;\n          <label>\n            <input\n              type=\"checkbox\"\n              onChange={() => setEditAnnotationLabelPosition(!editAnnotationLabelPosition)}\n              checked={editAnnotationLabelPosition}\n            />\n            edit label position\n          </label>\n        </div>\n\n        <br />\n\n        {/** axes */}\n        <div>\n          <strong>axes</strong>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setXAxisOrientation('bottom')}\n              checked={xAxisOrientation === 'bottom'}\n            />\n            bottom\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setXAxisOrientation('top')}\n              checked={xAxisOrientation === 'top'}\n            />\n            top\n          </label>\n          &nbsp;&nbsp;&nbsp;&nbsp;\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setYAxisOrientation('left')}\n              checked={yAxisOrientation === 'left'}\n            />\n            left\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setYAxisOrientation('right')}\n              checked={yAxisOrientation === 'right'}\n            />\n            right\n          </label>\n        </div>\n\n        {/** grid */}\n        <div>\n          <strong>grid</strong>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setGridProps([true, false])}\n              checked={showGridRows && !showGridColumns}\n            />\n            rows\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setGridProps([false, true])}\n              checked={!showGridRows && showGridColumns}\n            />\n            columns\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setGridProps([true, true])}\n              checked={showGridRows && showGridColumns}\n            />\n            both\n          </label>\n          <label>\n            <input\n              type=\"radio\"\n              onChange={() => setGridProps([false, false])}\n              checked={!showGridRows && !showGridColumns}\n            />\n            none\n          </label>\n        </div>\n        {/** animation trajectory */}\n        <div>\n          <label>\n            <input\n              type=\"checkbox\"\n              onChange={() => setUseAnimatedComponents(!useAnimatedComponents)}\n              checked={useAnimatedComponents}\n            />\n            use animated components\n          </label>\n\n          {useAnimatedComponents && (\n            <>\n              &nbsp;&nbsp;&nbsp;\n              <strong>axis + grid animation</strong>\n              <label>\n                <input\n                  type=\"radio\"\n                  onChange={() => setAnimationTrajectory('center')}\n                  checked={animationTrajectory === 'center'}\n                />\n                from center\n              </label>\n              <label>\n                <input\n                  type=\"radio\"\n                  onChange={() => setAnimationTrajectory('outside')}\n                  checked={animationTrajectory === 'outside'}\n                />\n                from outside\n              </label>\n              <label>\n                <input\n                  type=\"radio\"\n                  onChange={() => setAnimationTrajectory('min')}\n                  checked={animationTrajectory === 'min'}\n                />\n                from min\n              </label>\n              <label>\n                <input\n                  type=\"radio\"\n                  onChange={() => setAnimationTrajectory('max')}\n                  checked={animationTrajectory === 'max'}\n                />\n                from max\n              </label>\n            </>\n          )}\n        </div>\n      </div>\n      <style jsx>{`\n        .controls {\n          font-size: 13px;\n          line-height: 1.5em;\n        }\n        .controls > div {\n          margin-bottom: 4px;\n        }\n        label {\n          font-size: 12px;\n        }\n        input[type='radio'] {\n          height: 10px;\n        }\n        .pattern-lines {\n          position: absolute;\n          pointer-events: none;\n          opacity: 0;\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/customTheme.ts",
    "content": "import { buildChartTheme } from '@visx/xychart';\n\nexport default buildChartTheme({\n  backgroundColor: '#f09ae9',\n  colors: ['rgba(255,231,143,0.8)', '#6a097d', '#d6e0f0'],\n  gridColor: '#336d88',\n  gridColorDark: '#1d1b38',\n  svgLabelBig: { fill: '#1d1b38' },\n  tickLength: 8,\n});\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/getAnimatedOrUnanimatedComponents.ts",
    "content": "import {\n  // animated\n  AnimatedAnnotation,\n  AnimatedAreaSeries,\n  AnimatedAreaStack,\n  AnimatedAxis,\n  AnimatedBarGroup,\n  AnimatedBarSeries,\n  AnimatedBarStack,\n  AnimatedGlyphSeries,\n  AnimatedGrid,\n  AnimatedLineSeries,\n\n  // not animated\n  Annotation,\n  AreaSeries,\n  AreaStack,\n  Axis,\n  BarGroup,\n  BarSeries,\n  BarStack,\n  GlyphSeries,\n  Grid,\n  LineSeries,\n\n  // no animated equivalents\n  AnnotationCircleSubject,\n  AnnotationConnector,\n  AnnotationLabel,\n  AnnotationLineSubject,\n  Tooltip,\n  XYChart,\n} from '@visx/xychart';\n\nexport default function getAnimatedOrUnanimatedComponents(animated?: boolean) {\n  return animated\n    ? {\n        Annotation: AnimatedAnnotation,\n        AreaSeries: AnimatedAreaSeries,\n        AreaStack: AnimatedAreaStack,\n        Axis: AnimatedAxis,\n        BarGroup: AnimatedBarGroup,\n        BarSeries: AnimatedBarSeries,\n        BarStack: AnimatedBarStack,\n        GlyphSeries: AnimatedGlyphSeries,\n        Grid: AnimatedGrid,\n        LineSeries: AnimatedLineSeries,\n        AnnotationCircleSubject,\n        AnnotationConnector,\n        AnnotationLabel,\n        AnnotationLineSubject,\n        Tooltip,\n        XYChart,\n      }\n    : {\n        Annotation,\n        AreaSeries,\n        AreaStack,\n        Axis,\n        BarGroup,\n        BarSeries,\n        BarStack,\n        GlyphSeries,\n        Grid,\n        LineSeries,\n        AnnotationCircleSubject,\n        AnnotationConnector,\n        AnnotationLabel,\n        AnnotationLineSubject,\n        Tooltip,\n        XYChart,\n      };\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/package.json",
    "content": "{\n  \"name\": \"@visx/demo-xychart\",\n  \"description\": \"Standalone visx xychart demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/curve\": \"1.0.0\",\n    \"@visx/glyph\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/pattern\": \"latest\",\n    \"@visx/react-spring\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/xychart\": \"latest\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"@react-spring/web\": \"^10.0.3\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-xychart/userPrefersReducedMotion.ts",
    "content": "export default function userPrefersReducedMotion() {\n  const prefersReducedMotionQuery =\n    typeof window === 'undefined' ? false : window.matchMedia('(prefers-reduced-motion: reduce)');\n  return !prefersReducedMotionQuery || !!prefersReducedMotionQuery.matches;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-zoom-i/Example.tsx",
    "content": "/* eslint react/jsx-handler-names: \"off\" */\nimport React, { useState } from 'react';\nimport { interpolateRainbow } from 'd3-scale-chromatic';\nimport { Zoom } from '@visx/zoom';\nimport { localPoint } from '@visx/event';\nimport { RectClipPath } from '@visx/clip-path';\nimport type { GenPhyllotaxisFunction, PhyllotaxisPoint } from '@visx/mock-data';\nimport { genPhyllotaxis } from '@visx/mock-data';\nimport { scaleLinear } from '@visx/scale';\n\nconst bg = '#0a0a0a';\nconst points = [...new Array(1000)];\n\nconst colorScale = scaleLinear<number>({ range: [0, 1], domain: [0, 1000] });\nconst sizeScale = scaleLinear<number>({ domain: [0, 600], range: [0.5, 8] });\n\nconst initialTransform = {\n  scaleX: 1.27,\n  scaleY: 1.27,\n  translateX: -211.62,\n  translateY: 162.59,\n  skewX: 0,\n  skewY: 0,\n};\n\nexport type ZoomIProps = {\n  width: number;\n  height: number;\n};\n\nexport default function ZoomI({ width, height }: ZoomIProps) {\n  const [showMiniMap, setShowMiniMap] = useState<boolean>(true);\n\n  const generator: GenPhyllotaxisFunction = genPhyllotaxis({ radius: 10, width, height });\n  const phyllotaxis: PhyllotaxisPoint[] = points.map((d, i) => generator(i));\n\n  return (\n    <>\n      <Zoom<SVGSVGElement>\n        width={width}\n        height={height}\n        scaleXMin={1 / 2}\n        scaleXMax={4}\n        scaleYMin={1 / 2}\n        scaleYMax={4}\n        initialTransformMatrix={initialTransform}\n      >\n        {(zoom) => (\n          <div className=\"relative\">\n            <svg\n              width={width}\n              height={height}\n              style={{ cursor: zoom.isDragging ? 'grabbing' : 'grab', touchAction: 'none' }}\n              ref={zoom.containerRef}\n            >\n              <RectClipPath id=\"zoom-clip\" width={width} height={height} />\n              <rect width={width} height={height} rx={14} fill={bg} />\n              <g transform={zoom.toString()}>\n                {phyllotaxis.map(({ x, y }, i) => (\n                  <React.Fragment key={`dot-${i}`}>\n                    <circle\n                      cx={x}\n                      cy={y}\n                      r={i > 500 ? sizeScale(1000 - i) : sizeScale(i)}\n                      fill={interpolateRainbow(colorScale(i) ?? 0)}\n                    />\n                  </React.Fragment>\n                ))}\n              </g>\n              <rect\n                width={width}\n                height={height}\n                rx={14}\n                fill=\"transparent\"\n                onTouchStart={zoom.dragStart}\n                onTouchMove={zoom.dragMove}\n                onTouchEnd={zoom.dragEnd}\n                onMouseDown={zoom.dragStart}\n                onMouseMove={zoom.dragMove}\n                onMouseUp={zoom.dragEnd}\n                onMouseLeave={() => {\n                  if (zoom.isDragging) zoom.dragEnd();\n                }}\n                onDoubleClick={(event) => {\n                  const point = localPoint(event) || { x: 0, y: 0 };\n                  zoom.scale({ scaleX: 1.1, scaleY: 1.1, point });\n                }}\n              />\n              {showMiniMap && (\n                <g\n                  clipPath=\"url(#zoom-clip)\"\n                  transform={`\n                    scale(0.25)\n                    translate(${width * 4 - width - 60}, ${height * 4 - height - 60})\n                  `}\n                >\n                  <rect width={width} height={height} fill=\"#1a1a1a\" />\n                  {phyllotaxis.map(({ x, y }, i) => (\n                    <React.Fragment key={`dot-sm-${i}`}>\n                      <circle\n                        cx={x}\n                        cy={y}\n                        r={i > 500 ? sizeScale(1000 - i) : sizeScale(i)}\n                        fill={interpolateRainbow(colorScale(i) ?? 0)}\n                      />\n                    </React.Fragment>\n                  ))}\n                  <rect\n                    width={width}\n                    height={height}\n                    fill=\"white\"\n                    fillOpacity={0.2}\n                    stroke=\"white\"\n                    strokeWidth={4}\n                    transform={zoom.toStringInvert()}\n                  />\n                </g>\n              )}\n            </svg>\n            <div className=\"controls\">\n              <button\n                type=\"button\"\n                className=\"btn btn-zoom\"\n                onClick={() => zoom.scale({ scaleX: 1.2, scaleY: 1.2 })}\n              >\n                +\n              </button>\n              <button\n                type=\"button\"\n                className=\"btn btn-zoom btn-bottom\"\n                onClick={() => zoom.scale({ scaleX: 0.8, scaleY: 0.8 })}\n              >\n                -\n              </button>\n              <button type=\"button\" className=\"btn btn-lg\" onClick={zoom.center}>\n                Center\n              </button>\n              <button type=\"button\" className=\"btn btn-lg\" onClick={zoom.reset}>\n                Reset\n              </button>\n              <button type=\"button\" className=\"btn btn-lg\" onClick={zoom.clear}>\n                Clear\n              </button>\n            </div>\n            <div className=\"mini-map\">\n              <button\n                type=\"button\"\n                className=\"btn btn-lg\"\n                onClick={() => setShowMiniMap(!showMiniMap)}\n              >\n                {showMiniMap ? 'Hide' : 'Show'} Mini Map\n              </button>\n            </div>\n          </div>\n        )}\n      </Zoom>\n      <div className=\"description\">\n        Based on Mike Bostock&apos;s{' '}\n        <a href=\"https://bl.ocks.org/mbostock/4e3925cdc804db257a86fdef3a032a45\">Pan & Zoom III</a>\n      </div>\n      <style jsx>{`\n        .btn {\n          margin: 0;\n          text-align: center;\n          border: none;\n          background: #2f2f2f;\n          color: #888;\n          padding: 0 4px;\n          border-top: 1px solid #0a0a0a;\n        }\n        .btn-lg {\n          font-size: 12px;\n          line-height: 1;\n          padding: 4px;\n        }\n        .btn-zoom {\n          width: 26px;\n          font-size: 22px;\n        }\n        .btn-bottom {\n          margin-bottom: 1rem;\n        }\n        .description {\n          font-size: 12px;\n          margin-right: 0.25rem;\n        }\n        .controls {\n          position: absolute;\n          top: 15px;\n          right: 15px;\n          display: flex;\n          flex-direction: column;\n          align-items: flex-end;\n        }\n        .mini-map {\n          position: absolute;\n          bottom: 25px;\n          right: 15px;\n          display: flex;\n          flex-direction: column;\n          align-items: flex-end;\n        }\n        .relative {\n          position: relative;\n        }\n      `}</style>\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-zoom-i/index.tsx",
    "content": "import React from 'react';\nimport { createRoot } from 'react-dom/client';\nimport { ParentSize } from '@visx/responsive';\n\nimport Example from './Example';\nimport './sandbox-styles.css';\n\nconst root = createRoot(document.getElementById('root')!);\n\nroot.render(\n  <ParentSize>{({ width, height }) => <Example width={width} height={height} />}</ParentSize>,\n);\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-zoom-i/package.json",
    "content": "{\n  \"name\": \"@visx/demo-zoom-i\",\n  \"description\": \"Standalone visx zoom demo.\",\n  \"main\": \"index.tsx\",\n  \"private\": true,\n  \"dependencies\": {\n    \"@babel/runtime\": \"^7.8.4\",\n    \"@types/react\": \"^18\",\n    \"@types/react-dom\": \"^18\",\n    \"@visx/clip-path\": \"latest\",\n    \"@visx/event\": \"latest\",\n    \"@visx/mock-data\": \"latest\",\n    \"@visx/responsive\": \"latest\",\n    \"@visx/scale\": \"latest\",\n    \"@visx/zoom\": \"latest\",\n    \"d3-scale-chromatic\": \"^3.1.0\",\n    \"react\": \"^18\",\n    \"react-dom\": \"^18\",\n    \"react-scripts-ts\": \"3.1.0\",\n    \"typescript\": \"^3\"\n  },\n  \"keywords\": [\n    \"visualization\",\n    \"d3\",\n    \"react\",\n    \"visx\",\n    \"zoom\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-demo/src/sandboxes/visx-zoom-i/sandbox-styles.css",
    "content": "html,\nbody,\n#root {\n  height: 100%;\n  font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,\n    'Open Sans', 'Helvetica Neue', sans-serif;\n  line-height: 2em;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/types/index.ts",
    "content": "export interface MarginShape {\n  top: number;\n  right: number;\n  bottom: number;\n  left: number;\n}\n\nexport interface WidthAndHeight {\n  width: number;\n  height: number;\n}\n\nexport type ShowProvidedProps = {\n  width: number;\n  height: number;\n  margin?: MarginShape;\n  events?: boolean;\n};\n\nexport type VisxPackage =\n  | 'annotation'\n  | 'axis'\n  | 'bounds'\n  | 'brush'\n  | 'chord'\n  | 'clip-path'\n  | 'curve'\n  | 'delaunay'\n  | 'drag'\n  | 'event'\n  | 'geo'\n  | 'glyph'\n  | 'gradient'\n  | 'grid'\n  | 'group'\n  | 'heatmap'\n  | 'hierarchy'\n  | 'legend'\n  | 'marker'\n  | 'mock-data'\n  | 'network'\n  | 'pattern'\n  | 'point'\n  | 'react-spring'\n  | 'responsive'\n  | 'sankey'\n  | 'scale'\n  | 'shape'\n  | 'stats'\n  | 'text'\n  | 'threshold'\n  | 'tooltip'\n  | 'voronoi'\n  | 'visx'\n  | 'wordcloud'\n  | 'xychart'\n  | 'zoom';\n\nexport type PackageJson = { dependencies?: { [packageName: string]: string } };\n\n/** DocGenInfo for a single prop */\nexport type PropInfo = {\n  defaultValue?: { value?: unknown };\n  description?: string;\n  name: string;\n  required: boolean;\n  type?: { name: string };\n};\n\n/** ParamInfo for function parameters */\nexport type ParamInfo = {\n  name: string;\n  description?: string;\n  type?: { name: string };\n  defaultValue?: { value?: unknown };\n};\n\n/** DocGenInfo, added to components by react-docgen-typescript-loader or our custom generator */\nexport type DocGenInfo = {\n  description?: string;\n  displayName?: string;\n  // For components/hooks - their props/return values\n  props: { [propName: string]: PropInfo };\n  // For utility functions - their parameters and return type\n  kind?: 'component' | 'hook' | 'function';\n  parameters?: ParamInfo[];\n  returnType?: string;\n  // Source file information for \"View Source\" links\n  filePath?: string;\n  lineNumber?: number;\n};\n"
  },
  {
    "path": "packages/visx-demo/src/types/raw-loader.d.ts",
    "content": "declare module '!!raw-loader!*' {\n  const contents: string\n  export = contents\n}\n"
  },
  {
    "path": "packages/visx-demo/src/utils/getDocGenInfo.ts",
    "content": "/**\n * Utility to get component documentation from the generated docs.json file\n * This replaces the runtime __docgenInfo that was previously added by react-docgen-typescript-loader\n */\n\nimport type { DocGenInfo } from '../types';\nimport generatedDocs from '../generated/docs.json';\n\ntype ComponentWithDocs = {\n  displayName: string;\n  __docgenInfo?: DocGenInfo;\n};\n\n/**\n * Get documentation for components from a specific package\n * @param packageName - The visx package name (e.g., 'chord', 'shape', 'glyph')\n * @param componentNames - Optional array of component names to filter. If not provided, returns all components.\n * @returns Array of objects with displayName and __docgenInfo matching the old loader format\n */\nexport function getComponentDocs(\n  packageName: string,\n  componentNames?: string[],\n): ComponentWithDocs[] {\n  const packageKey = `@visx/${packageName}`;\n  const packageDocs = (generatedDocs as any)[packageKey];\n\n  if (!packageDocs) {\n    console.warn(`No documentation found for package: ${packageKey}`);\n    return [];\n  }\n\n  // Get all component docs or filter by names\n  const components = Object.entries(packageDocs)\n    .filter(([name]) => !componentNames || componentNames.includes(name))\n    .map(([name, docInfo]) => ({\n      displayName: name,\n      __docgenInfo: docInfo as DocGenInfo,\n    }))\n    .sort((a, b) => a.displayName.localeCompare(b.displayName));\n\n  return components;\n}\n\n/**\n * Attach __docgenInfo to component objects (for backward compatibility)\n * This mimics what react-docgen-typescript-loader used to do at build time\n *\n * @param packageName - The visx package name (e.g., 'chord', 'shape', 'glyph')\n * @param components - Object mapping component names to component functions\n * @returns The same components object with __docgenInfo attached\n */\nexport function attachDocGenInfo<T extends Record<string, any>>(\n  packageName: string,\n  components: T,\n): T {\n  const packageKey = `@visx/${packageName}`;\n  const packageDocs = (generatedDocs as any)[packageKey];\n\n  if (!packageDocs) {\n    console.warn(`No documentation found for package: ${packageKey}`);\n    return components;\n  }\n\n  // Attach __docgenInfo to each component\n  Object.keys(components).forEach((componentName) => {\n    const component = components[componentName];\n    const docInfo = packageDocs[componentName];\n\n    if (docInfo && typeof component === 'function') {\n      // Attach the docgenInfo to the component function\n      // eslint-disable-next-line no-underscore-dangle\n      (component as any).__docgenInfo = docInfo;\n    }\n  });\n\n  return components;\n}\n"
  },
  {
    "path": "packages/visx-demo/src/utils/getGitHubUrl.ts",
    "content": "/**\n * Generate a GitHub URL for a source file\n * @param filePath - Relative file path from packages/ (e.g., \"visx-legend/src/legends/Linear.tsx\")\n * @param lineNumber - Line number in the file\n * @returns GitHub URL to the source file\n */\nexport function getGitHubUrl(filePath?: string, lineNumber?: number): string | undefined {\n  if (!filePath) return undefined;\n\n  const baseUrl = 'https://github.com/airbnb/visx/blob/master/packages';\n  const url = `${baseUrl}/${filePath}`;\n\n  return lineNumber ? `${url}#L${lineNumber}` : url;\n}\n"
  },
  {
    "path": "packages/visx-demo/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"allowJs\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"isolatedModules\": true,\n    \"jsx\": \"preserve\",\n    \"lib\": [\n      \"dom\",\n      \"dom.iterable\",\n      \"esnext\"\n    ],\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"composite\": true,\n    \"outDir\": \"lib\",\n    \"resolveJsonModule\": true,\n    \"rootDir\": \"src\",\n    \"skipLibCheck\": true,\n    \"strict\": false,\n    \"target\": \"es5\",\n    \"noEmit\": true,\n    \"incremental\": true\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\",\n    \"src/sandboxes/**/package.json\"\n  ],\n  \"include\": [\n    \"src/**/*.{ts,tsx}\",\n    \"../../types/**/*.{ts,tsx}\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-annotation\"\n    },\n    {\n      \"path\": \"../visx-axis\"\n    },\n    {\n      \"path\": \"../visx-bounds\"\n    },\n    {\n      \"path\": \"../visx-brush\"\n    },\n    {\n      \"path\": \"../visx-chord\"\n    },\n    {\n      \"path\": \"../visx-clip-path\"\n    },\n    {\n      \"path\": \"../visx-curve\"\n    },\n    {\n      \"path\": \"../visx-delaunay\"\n    },\n    {\n      \"path\": \"../visx-drag\"\n    },\n    {\n      \"path\": \"../visx-event\"\n    },\n    {\n      \"path\": \"../visx-geo\"\n    },\n    {\n      \"path\": \"../visx-glyph\"\n    },\n    {\n      \"path\": \"../visx-gradient\"\n    },\n    {\n      \"path\": \"../visx-grid\"\n    },\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-heatmap\"\n    },\n    {\n      \"path\": \"../visx-hierarchy\"\n    },\n    {\n      \"path\": \"../visx-legend\"\n    },\n    {\n      \"path\": \"../visx-marker\"\n    },\n    {\n      \"path\": \"../visx-mock-data\"\n    },\n    {\n      \"path\": \"../visx-network\"\n    },\n    {\n      \"path\": \"../visx-pattern\"\n    },\n    {\n      \"path\": \"../visx-point\"\n    },\n    {\n      \"path\": \"../visx-react-spring\"\n    },\n    {\n      \"path\": \"../visx-responsive\"\n    },\n    {\n      \"path\": \"../visx-sankey\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    },\n    {\n      \"path\": \"../visx-stats\"\n    },\n    {\n      \"path\": \"../visx-text\"\n    },\n    {\n      \"path\": \"../visx-threshold\"\n    },\n    {\n      \"path\": \"../visx-tooltip\"\n    },\n    {\n      \"path\": \"../visx-vendor\"\n    },\n    {\n      \"path\": \"../visx-visx\"\n    },\n    {\n      \"path\": \"../visx-voronoi\"\n    },\n    {\n      \"path\": \"../visx-wordcloud\"\n    },\n    {\n      \"path\": \"../visx-xychart\"\n    },\n    {\n      \"path\": \"../visx-zoom\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-demo/vercel.json",
    "content": "{\n  \"version\": 2,\n  \"cleanUrls\": true\n}\n"
  },
  {
    "path": "packages/visx-drag/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-drag/Readme.md",
    "content": "# @visx/drag\n\n<a title=\"@visx/drag npm downloads\" href=\"https://www.npmjs.com/package/@visx/drag\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/drag.svg?style=flat-square\" />\n</a>\n\n`@visx/drag` provides `react` components and hooks for making items within an interface (or chart)\ndraggable.\n\n## Installation\n\n```\nnpm install --save @visx/drag\n```\n"
  },
  {
    "path": "packages/visx-drag/package.json",
    "content": "{\n  \"name\": \"@visx/drag\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx drag\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/event\": \"workspace:*\",\n    \"@visx/point\": \"workspace:*\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-drag/src/Drag.tsx",
    "content": "/* eslint-disable react/jsx-handler-names */\nimport type { ReactNode } from 'react';\nimport type { UseDrag, UseDragOptions, HandlerArgs as HandlerArgsType } from './useDrag';\nimport useDrag from './useDrag';\n\nexport type HandlerArgs = HandlerArgsType;\n\nexport type DragProps = UseDragOptions & {\n  /** Children render function which is passed the state of dragging and callbacks for drag start/end/move. */\n  children: (args: UseDrag) => ReactNode;\n  /** Width of the drag container. */\n  width: number;\n  /** Height of the drag container. */\n  height: number;\n  /** Whether to render an invisible rect below children to capture the drag area as defined by width and height. */\n  captureDragArea?: boolean;\n  /** If defined, parent controls dragging state. */\n  isDragging?: boolean;\n};\n\nexport default function Drag({\n  captureDragArea = true,\n  snapToPointer = true,\n  children,\n  dx,\n  dy,\n  height,\n  onDragEnd,\n  onDragMove,\n  onDragStart,\n  resetOnStart,\n  width,\n  x,\n  y,\n  isDragging,\n  restrict,\n  restrictToPath,\n}: DragProps) {\n  const drag = useDrag({\n    resetOnStart,\n    snapToPointer,\n    onDragEnd,\n    onDragMove,\n    onDragStart,\n    x,\n    y,\n    dx,\n    dy,\n    isDragging,\n    restrict,\n    restrictToPath,\n  });\n\n  return (\n    <>\n      {drag.isDragging && captureDragArea && (\n        <rect\n          width={width}\n          height={height}\n          onPointerDown={drag.dragStart}\n          onPointerMove={drag.dragMove}\n          onPointerUp={drag.dragEnd}\n          fill=\"transparent\"\n        />\n      )}\n      {children(drag)}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-drag/src/index.ts",
    "content": "// @visx/drag\nexport { default as Drag } from './Drag';\nexport { default as useDrag } from './useDrag';\nexport { default as raise } from './util/raise';\n\nexport type { DragProps } from './Drag';\nexport type {\n  DragState,\n  HandlerArgs,\n  MouseTouchOrPointerEvent,\n  UseDrag,\n  UseDragOptions,\n} from './useDrag';\n"
  },
  {
    "path": "packages/visx-drag/src/useDrag.ts",
    "content": "import type { MouseEvent, TouchEvent, PointerEvent } from 'react';\nimport { useCallback, useEffect, useRef, useState } from 'react';\nimport { Point, subtractPoints, sumPoints } from '@visx/point';\nimport { localPoint } from '@visx/event';\nimport useStateWithCallback from './util/useStateWithCallback';\nimport restrictPoint from './util/restrictPoint';\nimport useSamplesAlongPath from './util/useSamplesAlongPath';\n\nexport type MouseTouchOrPointerEvent = MouseEvent | TouchEvent | PointerEvent;\n\nexport type HandlerArgs = DragState & {\n  /** Drag event. */\n  event: MouseTouchOrPointerEvent;\n};\n\nexport type UseDragOptions = {\n  /** Whether to reset drag state upon the start of a new drag. */\n  resetOnStart?: boolean;\n  /** Optional callback invoked upon drag end. */\n  onDragEnd?: (args: HandlerArgs) => void;\n  /** Optional callback invoked upon drag movement. */\n  onDragMove?: (args: HandlerArgs) => void;\n  /** Optional callback invoked upon drag start. */\n  onDragStart?: (args: HandlerArgs) => void;\n  /** Optionally set the initial drag x, or override the current drag x. */\n  x?: number;\n  /** Optionally set the initial drag y, or override the current drag y. */\n  y?: number;\n  /** Optionally set the initial drag dx, or override the current drag dx. */\n  dx?: number;\n  /** Optionally set the initial drag dy, or override the current drag dy. */\n  dy?: number;\n  /** If defined, parent controls dragging state.  */\n  isDragging?: boolean;\n  /** Snap element being dragged to middle of pointer. */\n  snapToPointer?: boolean;\n  /** Options for limiting dragging in the x and y plane. */\n  restrict?: {\n    xMin?: number;\n    xMax?: number;\n    yMin?: number;\n    yMax?: number;\n  };\n  /** Limit drag to an SVG path. Overrides `restrict` constraints. */\n  restrictToPath?: SVGGeometryElement | null;\n};\n\nexport type DragState = {\n  /** x position of drag at drag start time, reset to 0 if `resetOnStart=true`. */\n  x?: number;\n  /** y position of drag at drag start time, reset to 0 if `resetOnStart=true`. */\n  y?: number;\n  /** Change in x position since drag start, reset to 0 on drag start if `resetOnStart=true`. */\n  dx: number;\n  /** Change in y position since drag start, reset to 0 on drag start if `resetOnStart=true`. */\n  dy: number;\n  /** Whether a drag is currently in progress. */\n  isDragging: boolean;\n};\n\nexport type UseDrag = DragState & {\n  /** Callback to be be invoked on drag end. */\n  dragEnd: (event: MouseTouchOrPointerEvent) => void;\n  /** Callback to be be invoked on drag move. */\n  dragMove: (event: MouseTouchOrPointerEvent) => void;\n  /** Callback to be be invoked on drag start. */\n  dragStart: (event: MouseTouchOrPointerEvent) => void;\n};\n\n/** Hook for dragging, returns a `UseDrag` object. */\nexport default function useDrag({\n  resetOnStart = false,\n  snapToPointer = true,\n  onDragEnd,\n  onDragMove,\n  onDragStart,\n  x,\n  y,\n  dx,\n  dy,\n  isDragging,\n  restrict = {},\n  restrictToPath,\n}: UseDragOptions | undefined = {}): UseDrag {\n  // use ref to detect prop changes\n  const positionPropsRef = useRef({ x, y, dx, dy });\n\n  const [dragState, setDragStateWithCallback] = useStateWithCallback<DragState>({\n    x,\n    y,\n    dx: dx ?? 0,\n    dy: dy ?? 0,\n    isDragging: false,\n  });\n\n  // Track distance between pointer on dragStart and position of element being dragged\n  const [dragStartPointerOffset, setDragStartPointerOffset] = useState<Point>(\n    new Point({ x: 0, y: 0 }),\n  );\n\n  // if prop position changes, update state\n  useEffect(() => {\n    if (\n      positionPropsRef.current.x !== x ||\n      positionPropsRef.current.y !== y ||\n      positionPropsRef.current.dx !== dx ||\n      positionPropsRef.current.dy !== dy\n    ) {\n      positionPropsRef.current = { x, y, dx, dy };\n      setDragStateWithCallback((currState) => ({\n        ...currState,\n        x,\n        y,\n        dx: dx ?? 0,\n        dy: dy ?? 0,\n      }));\n    }\n  });\n\n  useEffect(() => {\n    if (isDragging !== undefined && dragState.isDragging !== isDragging) {\n      setDragStateWithCallback((currState) => ({ ...currState, isDragging }));\n    }\n  }, [dragState.isDragging, isDragging, setDragStateWithCallback]);\n\n  const restrictToPathSamples = useSamplesAlongPath(restrictToPath);\n\n  const handleDragStart = useCallback(\n    (event: MouseTouchOrPointerEvent) => {\n      event.persist();\n\n      setDragStateWithCallback(\n        (currState) => {\n          // eslint-disable-next-line no-shadow\n          const { x = 0, y = 0, dx, dy } = currState;\n          const currentPoint = new Point({\n            x: (x || 0) + dx,\n            y: (y || 0) + dy,\n          });\n          const eventPoint = localPoint(event) || new Point({ x: 0, y: 0 });\n          const point = snapToPointer ? eventPoint : currentPoint;\n          const dragPoint = restrictPoint(point, restrictToPathSamples, restrict);\n\n          setDragStartPointerOffset(subtractPoints(currentPoint, eventPoint));\n\n          return {\n            isDragging: true,\n            dx: resetOnStart ? 0 : currState.dx,\n            dy: resetOnStart ? 0 : currState.dy,\n            x: resetOnStart ? dragPoint.x : dragPoint.x - currState.dx,\n            y: resetOnStart ? dragPoint.y : dragPoint.y - currState.dy,\n          };\n        },\n        onDragStart &&\n          ((currState) => {\n            onDragStart({ ...currState, event });\n          }),\n      );\n    },\n    [\n      onDragStart,\n      resetOnStart,\n      restrict,\n      restrictToPathSamples,\n      setDragStateWithCallback,\n      snapToPointer,\n    ],\n  );\n\n  const handleDragMove = useCallback(\n    (event: MouseTouchOrPointerEvent) => {\n      event.persist();\n\n      setDragStateWithCallback(\n        (currState) => {\n          if (!currState.isDragging) return currState;\n          // eslint-disable-next-line no-shadow\n          const { x = 0, y = 0 } = currState;\n          const pointerPoint = localPoint(event) || new Point({ x: 0, y: 0 });\n          const point = snapToPointer\n            ? pointerPoint\n            : sumPoints(pointerPoint, dragStartPointerOffset);\n          const dragPoint = restrictPoint(point, restrictToPathSamples, restrict);\n          return {\n            ...currState,\n            dx: dragPoint.x - x,\n            dy: dragPoint.y - y,\n          };\n        },\n        onDragMove &&\n          ((currState) => {\n            if (currState.isDragging) onDragMove({ ...currState, event });\n          }),\n      );\n    },\n    [\n      setDragStateWithCallback,\n      onDragMove,\n      snapToPointer,\n      dragStartPointerOffset,\n      restrictToPathSamples,\n      restrict,\n    ],\n  );\n\n  const handleDragEnd = useCallback(\n    (event: MouseTouchOrPointerEvent) => {\n      event.persist();\n\n      setDragStateWithCallback(\n        (currState) => ({ ...currState, isDragging: false }),\n        onDragEnd &&\n          ((currState) => {\n            onDragEnd({ ...currState, event });\n          }),\n      );\n    },\n    [onDragEnd, setDragStateWithCallback],\n  );\n\n  return {\n    ...dragState,\n    dragEnd: handleDragEnd,\n    dragMove: handleDragMove,\n    dragStart: handleDragStart,\n  };\n}\n"
  },
  {
    "path": "packages/visx-drag/src/util/clampNumber.ts",
    "content": "/** Clamps number within the inclusive lower and upper bounds. */\nexport default function clampNumber(number: number, lower: number, upper: number) {\n  return Math.min(Math.max(number, lower), upper);\n}\n"
  },
  {
    "path": "packages/visx-drag/src/util/getClosestPoint.ts",
    "content": "/** Gets closest point from list of points */\nexport default function getClosestPoint(point: { x: number; y: number }, samples: DOMPoint[]) {\n  let closestPoint = point;\n  let minDistance = Infinity;\n  for (const sample of samples) {\n    const distance = Math.sqrt((sample.x - point.x) ** 2 + (sample.y - point.y) ** 2);\n    if (distance < minDistance) {\n      minDistance = distance;\n      closestPoint = { x: sample.x, y: sample.y };\n    }\n  }\n  return closestPoint;\n}\n"
  },
  {
    "path": "packages/visx-drag/src/util/raise.ts",
    "content": "/** Given at an array of items, moves the item at the specified index to the end of the array. */\nexport default function raise<T>(items: T[], raiseIndex: number) {\n  const array = [...items];\n  const lastIndex = array.length - 1;\n  const [raiseItem] = array.splice(raiseIndex, 1);\n  array.splice(lastIndex, 0, raiseItem);\n  return array;\n}\n"
  },
  {
    "path": "packages/visx-drag/src/util/restrictPoint.ts",
    "content": "import type { UseDragOptions } from '../useDrag';\nimport clampNumber from './clampNumber';\nimport getClosestPoint from './getClosestPoint';\n\n/** Restrict a point to an area, or samples along a path. */\nexport default function restrictPoint(\n  point: { x: number; y: number },\n  samples: DOMPoint[],\n  restrict: UseDragOptions['restrict'] = {},\n) {\n  if (samples.length > 0) {\n    return getClosestPoint(point, samples);\n  }\n  return {\n    x: clampNumber(point.x, restrict.xMin ?? -Infinity, restrict.xMax ?? Infinity),\n    y: clampNumber(point.y, restrict.yMin ?? -Infinity, restrict.yMax ?? Infinity),\n  };\n}\n"
  },
  {
    "path": "packages/visx-drag/src/util/useSamplesAlongPath.ts",
    "content": "import { useMemo } from 'react';\n\nfunction getSamples(restrictToPath: SVGGeometryElement, transform?: DOMMatrix, precision = 1) {\n  if (!restrictToPath) return [];\n  const samples = [];\n  const pathLength = restrictToPath.getTotalLength();\n  for (let sampleLength = 0; sampleLength <= pathLength; sampleLength += precision) {\n    const sample = restrictToPath.getPointAtLength(sampleLength);\n    const transformedSample = sample.matrixTransform(transform);\n    samples.push(transformedSample);\n  }\n  return samples;\n}\n\n/** Return samples along a path, relative to the parent SVG  */\nexport default function useSamplesAlongPath(restrictToPath?: SVGGeometryElement | null) {\n  const samples = useMemo(() => {\n    if (!restrictToPath) return [];\n    const transform = restrictToPath.getCTM() || new DOMMatrix();\n    return getSamples(restrictToPath, transform);\n    // The path can transform without triggering a re-render,\n    // so we need to update the samples whenever the length changes.\n    // eslint-disable-next-line react-hooks/exhaustive-deps\n  }, [restrictToPath?.getTotalLength()]);\n  return samples;\n}\n"
  },
  {
    "path": "packages/visx-drag/src/util/useStateWithCallback.ts",
    "content": "import { useCallback, useLayoutEffect, useRef, useState } from 'react';\n\ntype SetStateWithCallback<State> = (\n  nextState: State | ((currState: State) => State),\n  callback?: (currState: State) => void,\n) => void;\n\n/** A hook that exposes a setState(state, callback) API similar to a component class. */\nexport default function useStateWithCallback<State>(\n  initialState: State,\n): [State, SetStateWithCallback<State>] {\n  const [state, setState] = useState(initialState);\n  const callbackRef = useRef<null | ((s: State) => void)>(null);\n\n  const setStateCallback = useCallback<SetStateWithCallback<State>>(\n    (nextState, callback) => {\n      callbackRef.current = callback || null;\n      setState(nextState);\n    },\n    [setState],\n  );\n\n  // if we use useEffect, some callback invocations are skipped\n  useLayoutEffect(() => {\n    // `null` on initial render, so we only execute callback on state *updates*\n    if (callbackRef.current) {\n      callbackRef.current(state);\n      callbackRef.current = null; // reset callback after execution\n    }\n  }, [state]);\n\n  return [state, setStateCallback];\n}\n"
  },
  {
    "path": "packages/visx-drag/test/Drag.test.ts",
    "content": "import { Drag } from '../src';\n\ndescribe('Drag', () => {\n  test('it should be defined', () => {\n    expect(Drag).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-drag/test/raise.test.ts",
    "content": "import { raise } from '../src';\n\ndescribe('raise', () => {\n  test('it should be defined', () => {\n    expect(raise).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-drag/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-drag/test/useDrag.test.tsx",
    "content": "import React, { useRef } from 'react';\nimport { render } from '@testing-library/react';\nimport { useDrag } from '../src';\nimport type { UseDragOptions } from '../lib/useDrag';\n\ndescribe('useDrag', () => {\n  test('it should be defined', () => {\n    expect(useDrag).toBeDefined();\n  });\n  test('should provide UseDrag', () => {\n    expect.assertions(1);\n\n    function Consumer() {\n      const drag = useDrag({ x: 0, y: 0 });\n      expect(drag).toMatchObject({\n        x: 0,\n        y: 0,\n        dx: 0,\n        dy: 0,\n        isDragging: false,\n        dragStart: expect.any(Function),\n        dragMove: expect.any(Function),\n        dragEnd: expect.any(Function),\n      });\n\n      return null;\n    }\n\n    render(<Consumer />);\n  });\n\n  test('should update drag state when useDrag options change', () => {\n    expect.assertions(3);\n\n    const options1 = { x: 1, y: 2, dx: 3, dy: 4 };\n    const options2 = { x: -1, y: -2, dx: -3, dy: -4 };\n\n    function Consumer({ x, y, dx, dy }: Pick<UseDragOptions, 'x' | 'y' | 'dx' | 'dy'>) {\n      const renderCount = useRef(0);\n      const drag = useDrag({ x, y, dx, dy });\n\n      // when this component's props change options1 => 2, it takes one\n      // additional render for the `useDrag` state to update to options2\n      expect(drag).toMatchObject(renderCount.current <= 1 ? options1 : options2);\n      renderCount.current += 1;\n      return null;\n    }\n\n    const { rerender } = render(<Consumer {...options1} />);\n    rerender(<Consumer {...options2} />);\n  });\n});\n"
  },
  {
    "path": "packages/visx-drag/test/useStateWithCallback.test.ts",
    "content": "import useStateWithCallback from '../src/util/useStateWithCallback';\n\ndescribe('useStateWithCallback', () => {\n  test('it should be defined', () => {\n    expect(useStateWithCallback).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-drag/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-event\"\n    },\n    {\n      \"path\": \"../visx-point\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-drag/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/drag',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-drag/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/drag': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-event/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-event/Readme.md",
    "content": "# @visx/event\n\n<a title=\"@visx/event npm downloads\" href=\"https://www.npmjs.com/package/@visx/event\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/event.svg?style=flat-square\" />\n</a>\n\n## Installation\n\n```\nnpm install --save @visx/event\n```\n\n## Usage\n\n`@visx/event` exports a utility `localPoint` that takes an `SVG` `MouseEvent` or `TouchEvent` as\ninput and returns a `{ x: number; y: number; }` point coordinate (or `null` in the case the event\nhas no `ownerSVGElement`) within the coordinate system of the `SVG`. This makes placement of\ntooltips, finding nearby datum, etc. easier.\n\nExample:\n\n```tsx\nimport { localPoint } from '@visx/event';\n\n<svg>\n  <SomeElement\n    {...}\n    onMouseMove={(event: MouseEvent) => {\n      const point = localPoint(event) || { x: 0, y: 0 };\n      // use coordinates ...\n    }}\n  />\n  {...}\n</svg>\n```\n\nYou may optionally pass a reference to the SVG node\n\n```tsx\nimport { useRef } from 'react';\nimport { localPoint } from '@visx/event';\n\nconst svgRef = useRef<SVGSVGElement>(null);\n\n<svg ref={svgRef}>\n  <SomeElement\n    {...}\n    onMouseMove={(event: MouseEvent) => {\n      const point = localPoint(svgRef.current, event) || { x: 0, y: 0 };\n      // use coordinates ...\n    }}\n  />\n  {...}\n</svg>\n```\n"
  },
  {
    "path": "packages/visx-event/package.json",
    "content": "{\n  \"name\": \"@visx/event\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx event\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"d3\",\n    \"react\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/point\": \"workspace:*\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-event/src/getXAndYFromEvent.ts",
    "content": "import type { EventType } from './types';\nimport { isMouseEvent, isTouchEvent } from './typeGuards';\n\nconst DEFAULT_POINT = { x: 0, y: 0 };\n\nexport default function getXAndYFromEvent(event?: EventType) {\n  if (!event) return { ...DEFAULT_POINT };\n\n  if (isTouchEvent(event)) {\n    return event.changedTouches.length > 0\n      ? {\n          x: event.changedTouches[0].clientX,\n          y: event.changedTouches[0].clientY,\n        }\n      : { ...DEFAULT_POINT };\n  }\n\n  if (isMouseEvent(event)) {\n    return {\n      x: event.clientX,\n      y: event.clientY,\n    };\n  }\n\n  // for focus events try to extract the center position of the target element\n  const target = event?.target;\n  const boundingClientRect =\n    target && 'getBoundingClientRect' in target ? target.getBoundingClientRect() : null;\n\n  if (!boundingClientRect) return { ...DEFAULT_POINT };\n\n  return {\n    x: boundingClientRect.x + boundingClientRect.width / 2,\n    y: boundingClientRect.y + boundingClientRect.height / 2,\n  };\n}\n"
  },
  {
    "path": "packages/visx-event/src/index.ts",
    "content": "// @visx/event\nexport { default as localPoint } from './localPoint';\nexport { default as touchPoint } from './touchPoint';\n"
  },
  {
    "path": "packages/visx-event/src/localPoint.ts",
    "content": "import localPointGeneric from './localPointGeneric';\nimport type { EventType } from './types';\nimport { isElement, isEvent } from './typeGuards';\n\n/** Handles two signatures for backwards compatibility. */\nexport default function localPoint(nodeOrEvent: Element | EventType, maybeEvent?: EventType) {\n  // localPoint(node, event)\n  if (isElement(nodeOrEvent) && maybeEvent) {\n    return localPointGeneric(nodeOrEvent, maybeEvent);\n  }\n  // localPoint(event)\n  if (isEvent(nodeOrEvent)) {\n    const event = nodeOrEvent;\n    const node = event.target as Element;\n    if (node) return localPointGeneric(node, event);\n  }\n  return null;\n}\n"
  },
  {
    "path": "packages/visx-event/src/localPointGeneric.ts",
    "content": "import { Point } from '@visx/point';\nimport type { EventType } from './types';\nimport { isSVGElement, isSVGGraphicsElement, isSVGSVGElement } from './typeGuards';\nimport getXAndYFromEvent from './getXAndYFromEvent';\n\nexport default function localPoint(node: Element, event: EventType) {\n  if (!node || !event) return null;\n\n  const coords = getXAndYFromEvent(event);\n\n  // find top-most SVG\n  const svg = isSVGElement(node) ? node.ownerSVGElement : node;\n  const screenCTM = isSVGGraphicsElement(svg) ? svg.getScreenCTM() : null;\n\n  if (isSVGSVGElement(svg) && screenCTM) {\n    let point = svg.createSVGPoint();\n    point.x = coords.x;\n    point.y = coords.y;\n    point = point.matrixTransform(screenCTM.inverse());\n\n    return new Point({\n      x: point.x,\n      y: point.y,\n    });\n  }\n\n  // fall back to bounding box\n  const rect = node.getBoundingClientRect();\n\n  return new Point({\n    x: coords.x - rect.left - node.clientLeft,\n    y: coords.y - rect.top - node.clientTop,\n  });\n}\n"
  },
  {
    "path": "packages/visx-event/src/touchPoint.ts",
    "content": "// eslint-disable-next-line no-restricted-exports\nexport { default } from './localPointGeneric';\n"
  },
  {
    "path": "packages/visx-event/src/typeGuards.ts",
    "content": "import type { EventType } from './types';\n\nexport function isElement(elem?: Element | EventType): elem is Element {\n  return !!elem && elem instanceof Element;\n}\n\n// functional definition of isSVGElement. Note that SVGSVGElements are HTMLElements\nexport function isSVGElement(elem?: Element): elem is SVGElement {\n  return !!elem && (elem instanceof SVGElement || 'ownerSVGElement' in elem);\n}\n\n// functional definition of SVGGElement\nexport function isSVGSVGElement(elem?: Element | null): elem is SVGSVGElement {\n  return !!elem && 'createSVGPoint' in elem;\n}\n\nexport function isSVGGraphicsElement(elem?: Element | null): elem is SVGGraphicsElement {\n  return !!elem && 'getScreenCTM' in elem;\n}\n\n// functional definition of TouchEvent\nexport function isTouchEvent(event?: EventType): event is TouchEvent {\n  return !!event && 'changedTouches' in event;\n}\n\n// functional definition of MouseEvent\nexport function isMouseEvent(event?: EventType): event is MouseEvent {\n  return !!event && 'clientX' in event;\n}\n\n// functional definition of event\nexport function isEvent(event?: EventType | Element): event is EventType {\n  return (\n    !!event &&\n    (event instanceof Event || ('nativeEvent' in event && event.nativeEvent instanceof Event))\n  );\n}\n"
  },
  {
    "path": "packages/visx-event/src/types.ts",
    "content": "import type {\n  FocusEvent as ReactFocusEvent,\n  MouseEvent as ReactMouseEvent,\n  TouchEvent as ReactTouchEvent,\n} from 'react';\n\nexport type EventType =\n  | MouseEvent\n  | TouchEvent\n  | FocusEvent\n  | ReactFocusEvent\n  | ReactMouseEvent\n  | ReactTouchEvent;\n"
  },
  {
    "path": "packages/visx-event/test/getXandYFromEvent.test.ts",
    "content": "import getXAndYFromEvent from '../src/getXAndYFromEvent';\n\ndescribe('getXAndYFromEvent()', () => {\n  it('should return { x: 0, y: 0 } if no event argument', () => {\n    const result = getXAndYFromEvent();\n    // @ts-expect-error\n    const result2 = getXAndYFromEvent(null);\n    expect(result).toEqual({ x: 0, y: 0 });\n    expect(result2).toEqual({ x: 0, y: 0 });\n  });\n\n  it('should return { x, y } for mouse events', () => {\n    const e = { clientX: 0, clientY: 0 };\n    const result = getXAndYFromEvent(e as MouseEvent);\n    expect(result).toEqual({ x: e.clientX, y: e.clientY });\n  });\n\n  it('should return { x, y } for touch events with changedTouches', () => {\n    const touch0 = { clientX: 0, clientY: 0 };\n    const touch1 = { clientX: 1, clientY: 1 };\n    const e = { changedTouches: [touch0, touch1] };\n    const result = getXAndYFromEvent(e as unknown as TouchEvent);\n    expect(result).toEqual({ x: touch0.clientX, y: touch0.clientY });\n  });\n\n  it('should return { x: 0, y: 0 } for touch events with no changedTouches', () => {\n    const e = { changedTouches: [] };\n    const result = getXAndYFromEvent(e as unknown as TouchEvent);\n    expect(result).toEqual({ x: 0, y: 0 });\n  });\n\n  it('should return the middle of an element for focus events', () => {\n    const e = { target: { getBoundingClientRect: () => ({ x: 5, y: 5, width: 10, height: 2 }) } };\n    const result = getXAndYFromEvent(e as unknown as FocusEvent);\n    expect(result).toEqual({ x: 10, y: 6 });\n  });\n});\n"
  },
  {
    "path": "packages/visx-event/test/localPoint.test.ts",
    "content": "import { Point } from '@visx/point';\nimport { localPoint } from '../src';\nimport localPointGeneric from '../src/localPointGeneric';\n\ndescribe('localPoint', () => {\n  test('it should be defined', () => {\n    expect(localPoint).toBeDefined();\n  });\n\n  test('it should return null if called with no arguments', () => {\n    // @ts-expect-error\n    expect(localPoint()).toBeNull();\n    // @ts-expect-error\n    expect(localPointGeneric(document.createElement('div'))).toBeNull();\n  });\n\n  test('it should handle localPoint(event) and get node from event.target', () => {\n    const e = new MouseEvent('test', {\n      clientX: 10,\n      clientY: 10,\n    });\n    Object.defineProperty(e, 'target', {\n      writable: false,\n      value: {\n        clientLeft: 0,\n        clientTop: 0,\n        getBoundingClientRect: () => ({ left: 0, top: 0 }),\n      },\n    });\n    const result = localPoint(e);\n    expect(result).toEqual(new Point({ x: 10, y: 10 }));\n  });\n\n  test('it should handle localPoint(node, event)', () => {\n    const e = new MouseEvent('test', {\n      clientX: 10,\n      clientY: 10,\n    });\n    const node = document.createElementNS('http://www.w3.org/2000/svg', 'path');\n    const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n    // @ts-expect-error\n    svg.createSVGPoint = () => ({ matrixTransform: () => ({ x: 10, y: 10 }) });\n    // @ts-expect-error\n    svg.getScreenCTM = () => ({ inverse: () => [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] });\n    svg.appendChild(node);\n    const result = localPoint(node, e);\n    expect(result).toEqual(new Point({ x: 10, y: 10 }));\n  });\n});\n"
  },
  {
    "path": "packages/visx-event/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-event/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-point\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-event/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/event',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-event/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/event': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-geo/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-geo/Readme.md",
    "content": "# @visx/geo\n\n<a title=\"@visx/geo npm downloads\" href=\"https://www.npmjs.com/package/@visx/geo\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/geo.svg?style=flat-square\" />\n</a>\n\nThe `@visx/geo` package provides `react` components for rendering common and custom geographic\nprojections. `<Projection />` can be used to render preset projections\n(`projection='orthographic' | 'albers' | 'albersUsa' | 'mercator' | 'naturalEarth' | 'equalEarth'`)\nalong with configurable `<Graticule />`s lines. Convenience projections such as `<Mercator />` are\nalso exported, along with `<CustomProjection />` and `<Graticule />` for full customization.\n\n## Installation\n\n```\nnpm install --save @visx/geo\n```\n"
  },
  {
    "path": "packages/visx-geo/package.json",
    "content": "{\n  \"name\": \"@visx/geo\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx geo\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\",\n    \"geo\"\n  ],\n  \"author\": \"@nschnierer\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/geojson\": \"*\",\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"devDependencies\": {\n    \"@types/topojson-client\": \"^3.1.5\",\n    \"topojson-client\": \"^3.1.0\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-geo/src/graticule/Graticule.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport { Group } from '@visx/group';\nimport type { GeoGraticuleGenerator } from '@visx/vendor/d3-geo';\nimport { geoGraticule } from '@visx/vendor/d3-geo';\n// eslint-disable-next-line import/no-unresolved\nimport type { LineString, MultiLineString, Polygon } from 'geojson';\n\nexport type GraticuleProps = {\n  /**\n   * Render function for graticules which is passed a GeoJSON MultiLineString geometry object\n   * representing all meridians and parallels for the graticule.\n   */\n  graticule?: (multiLineString: MultiLineString) => string;\n  /**\n   * Render function for graticule lines, which is invoked once for each meridian or parallel for the graticule,\n   * and is passed the GeoJSON LineString object representing said meridian or parallel.\n   */\n  lines?: (lineString: LineString) => string;\n  /**\n   * Render function for the outline of the graticule (i.e. along the meridians and parallels defining its extent).\n   * It is passed a GeoJSON Polygon geometry object representing the outline.\n   */\n  outline?: (polygon: Polygon) => string;\n  /** Override render function, which is passed the configured graticule generator. */\n  children?: ({ graticule }: { graticule: GeoGraticuleGenerator }) => ReactNode;\n  /** Sets the major and minor extents of the graticule generator, which defaults to ⟨⟨-180°, -80° - ε⟩, ⟨180°, 80° + ε⟩⟩. */\n  extent?: [[number, number], [number, number]];\n  /** Sets the major extent of the graticule generator, which defaults to ⟨⟨-180°, -90° + ε⟩, ⟨180°, 90° - ε⟩⟩. */\n  extentMajor?: [[number, number], [number, number]];\n  /** Sets the major extent of the graticule generator, which defaults to ⟨⟨-180°, -80° - ε⟩, ⟨180°, 80° + ε⟩⟩. */\n  extentMinor?: [[number, number], [number, number]];\n  /** Sets both the major and minor step of the graticule generator. */\n  step?: [number, number];\n  /** Sets the major step of the graticule generator, which defaults to ⟨90°, 360°⟩. */\n  stepMajor?: [number, number];\n  /** Sets the major step of the graticule generator, which defaults to ⟨10°, 10°⟩. */\n  stepMinor?: [number, number];\n  /** Sets the precision of the graticule generator, which defaults to 2.5°. */\n  precision?: number;\n};\n\nexport default function Graticule({\n  graticule,\n  lines,\n  outline,\n  extent,\n  extentMajor,\n  extentMinor,\n  step,\n  stepMajor,\n  stepMinor,\n  precision,\n  children,\n  ...restProps\n}: GraticuleProps & Omit<SVGProps<SVGPathElement>, keyof GraticuleProps>) {\n  const currGraticule = geoGraticule();\n\n  if (extent) currGraticule.extent(extent);\n  if (extentMajor) currGraticule.extentMajor(extentMajor);\n  if (extentMinor) currGraticule.extentMinor(extentMinor);\n  if (step) currGraticule.step(step);\n  if (stepMajor) currGraticule.stepMajor(stepMajor);\n  if (stepMinor) currGraticule.stepMinor(stepMinor);\n  if (precision) currGraticule.precision(precision);\n\n  if (children) return <>{children({ graticule: currGraticule })}</>;\n\n  return (\n    <Group className=\"visx-geo-graticule\">\n      {graticule && (\n        <path d={graticule(currGraticule())} fill=\"none\" stroke=\"black\" {...restProps} />\n      )}\n      {lines &&\n        currGraticule.lines().map((line, i) => (\n          <g key={i}>\n            <path d={lines(line)} fill=\"none\" stroke=\"black\" {...restProps} />\n          </g>\n        ))}\n      {outline && (\n        <path d={outline(currGraticule.outline())} fill=\"none\" stroke=\"black\" {...restProps} />\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-geo/src/index.ts",
    "content": "// @visx/geo\nexport { default as Albers } from './projections/Albers';\nexport { default as AlbersUsa } from './projections/AlbersUsa';\nexport { default as Mercator } from './projections/Mercator';\nexport { default as Orthographic } from './projections/Orthographic';\nexport { default as NaturalEarth } from './projections/NaturalEarth';\nexport { default as EqualEarth } from './projections/EqualEarth';\nexport { default as CustomProjection } from './projections/CustomProjection';\nexport { default as Graticule } from './graticule/Graticule';\n\nexport type * from './types';\nexport type { GraticuleProps } from './graticule/Graticule';\nexport type { ProjectionProps } from './projections/Projection';\n"
  },
  {
    "path": "packages/visx-geo/src/projections/Albers.tsx",
    "content": "import type { ProjectionProps } from './Projection';\nimport Projection from './Projection';\nimport type { GeoPermissibleObjects } from '../types';\n\n/**\n * All props pass through to `<Projection projection=\"albers\" {...props} />`\n */\nexport default function Albers<Datum extends GeoPermissibleObjects>(\n  props: Omit<ProjectionProps<Datum>, 'projection'>,\n) {\n  return <Projection<Datum> projection=\"albers\" {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-geo/src/projections/AlbersUsa.tsx",
    "content": "import type { ProjectionProps } from './Projection';\nimport Projection from './Projection';\nimport type { GeoPermissibleObjects } from '../types';\n\n/**\n * All props pass through to `<Projection projection=\"albersUsa\" {...props} />`\n */\nexport default function AlbersUsa<Datum extends GeoPermissibleObjects>(\n  props: Omit<ProjectionProps<Datum>, 'projection'>,\n) {\n  return <Projection<Datum> projection=\"albersUsa\" {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-geo/src/projections/CustomProjection.tsx",
    "content": "import type { ProjectionProps } from './Projection';\nimport Projection from './Projection';\nimport type { GeoPermissibleObjects } from '../types';\n\n/**\n * All props pass through to `<Projection projection={customProjection} {...props} />`\n */\nexport default function CustomProjection<Datum extends GeoPermissibleObjects>(\n  props: ProjectionProps<Datum>,\n) {\n  return <Projection<Datum> {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-geo/src/projections/EqualEarth.tsx",
    "content": "import type { ProjectionProps } from './Projection';\nimport Projection from './Projection';\nimport type { GeoPermissibleObjects } from '../types';\n\n/**\n * All props pass through to `<Projection projection=\"equalEarth\" {...props} />`\n */\nexport default function EqualEarth<Datum extends GeoPermissibleObjects>(\n  props: Omit<ProjectionProps<Datum>, 'projection'>,\n) {\n  return <Projection<Datum> projection=\"equalEarth\" {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-geo/src/projections/Mercator.tsx",
    "content": "import type { ProjectionProps } from './Projection';\nimport Projection from './Projection';\nimport type { GeoPermissibleObjects } from '../types';\n\n/**\n * All props pass through to `<Projection projection=\"mercator\" {...props} />`\n */\nexport default function Mercator<Datum extends GeoPermissibleObjects>(\n  props: Omit<ProjectionProps<Datum>, 'projection'>,\n) {\n  return <Projection<Datum> projection=\"mercator\" {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-geo/src/projections/NaturalEarth.tsx",
    "content": "import type { ProjectionProps } from './Projection';\nimport Projection from './Projection';\nimport type { GeoPermissibleObjects } from '../types';\n\n/**\n * All props pass through to `<Projection projection=\"naturalEarth\" {...props} />`\n */\nexport default function NaturalEarth<Datum extends GeoPermissibleObjects>(\n  props: Omit<ProjectionProps<Datum>, 'projection'>,\n) {\n  return <Projection<Datum> projection=\"naturalEarth\" {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-geo/src/projections/Orthographic.tsx",
    "content": "import type { ProjectionProps } from './Projection';\nimport Projection from './Projection';\nimport type { GeoPermissibleObjects } from '../types';\n\n/**\n * All props pass through to `<Projection projection=\"orthographic\" {...props} />`\n */\nexport default function Orthographic<Datum extends GeoPermissibleObjects>(\n  props: Omit<ProjectionProps<Datum>, 'projection'>,\n) {\n  return <Projection<Datum> projection=\"orthographic\" {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-geo/src/projections/Projection.tsx",
    "content": "import type { ReactNode, SVGProps, Ref } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { GeoPath, GeoProjection, ExtendedFeature } from '@visx/vendor/d3-geo';\nimport {\n  geoOrthographic,\n  geoAlbers,\n  geoAlbersUsa,\n  geoMercator,\n  geoNaturalEarth1,\n  geoEqualEarth,\n  geoPath,\n} from '@visx/vendor/d3-geo';\n// this is just for types\n// eslint-disable-next-line import/no-unresolved\nimport type { LineString, Polygon, MultiLineString } from 'geojson';\n\nimport type { GraticuleProps } from '../graticule/Graticule';\nimport Graticule from '../graticule/Graticule';\nimport type {\n  GeoPermissibleObjects,\n  ProjectionPreset,\n  Projection as ProjectionShape,\n} from '../types';\n\nconst projectionMapping: { [projection in ProjectionPreset]: () => GeoProjection } = {\n  orthographic: () => geoOrthographic(),\n  albers: () => geoAlbers(),\n  albersUsa: () => geoAlbersUsa(),\n  mercator: () => geoMercator(),\n  naturalEarth: () => geoNaturalEarth1(),\n  equalEarth: () => geoEqualEarth(),\n};\n\nexport type ProjectionProps<Datum extends GeoPermissibleObjects = GeoPermissibleObjects> = {\n  /** Array of features to project. */\n  data: Datum[];\n  /** Preset projection name, or custom projection function which returns a GeoProjection. */\n  projection?: ProjectionShape;\n  /** Hook to render above features, passed the configured projectionFunc. */\n  projectionFunc?: (projection: GeoProjection) => ReactNode;\n  /** Sets the projection’s clipping circle radius to the specified angle in degree. */\n  clipAngle?: number;\n  /**\n   * Sets the projection’s viewport clip extent to the specified bounds in pixels. extent bounds\n   * are specified as an array [[x₀, y₀], [x₁, y₁]], where x₀ is the left-side of the viewport,\n   * y₀ is the top, x₁ is the right and y₁ is the bottom.\n   */\n  clipExtent?: [[number, number], [number, number]];\n  /**\n   * Sets the projection’s scale factor to the specified value. The scale factor corresponds linearly\n   * to the distance between projected points; however, absolute scale factors are not equivalent\n   * across projections.\n   */\n  scale?: number;\n  /**\n   * Sets the projection’s translation offset, which determines the pixel coordinates of the\n   * projection’s center, to the specified two-element array [tx, ty].\n   */\n  translate?: [number, number];\n  /** Sets the projection’s center to the specified two-element array of longitude and latitude in degrees. */\n  center?: [number, number];\n  /** Sets the projection’s three-axis spherical rotation to the specified angles [lambda, phi [, gamma]], corresponding to yaw, pitch, and roll. */\n  rotate?: [number, number] | [number, number, number];\n  /** Sets the threshold for the projection’s adaptive resampling to the specified value in pixels. */\n  precision?: number;\n  /**\n   * Sets the projection’s scale and translate to fit the specified GeoJSON object in the center of the given extent.\n   * The extent is specified as an array [[x₀, y₀], [x₁, y₁]], where x₀ is the left side of the bounding box,\n   * y₀ is the top, x₁ is the right and y₁ is the bottom.\n   */\n  fitExtent?: [\n    [[number, number], [number, number]],\n    ExtendedFeature, // ExtendedFeature | ExtendedFeatureCollection | GeoGeometryObjects,\n  ];\n  /** Convenience prop for props.fitExtent where the top-left corner of the extent is [0, 0]. */\n  fitSize?: [\n    [number, number],\n    ExtendedFeature, // ExtendedFeature | ExtendedFeatureCollection | GeoGeometryObjects\n  ];\n  /** Hook to render anything at the centroid of a feature. */\n  centroid?: (centroid: [number, number], feature: ParsedFeature<Datum>) => ReactNode;\n  /** className to apply to feature path elements.  */\n  className?: string;\n  /** Override render function which is passed path data and a copy of the constructed projection.  */\n  children?: (args: {\n    path: GeoPath<unknown, GeoPermissibleObjects>;\n    features: ParsedFeature<Datum>[];\n    projection: GeoProjection;\n  }) => ReactNode;\n  /** Function invoked for each feature which returns a Ref to the projection path element for that feature. */\n  innerRef?: (feature: ParsedFeature<Datum>, index: number) => Ref<SVGPathElement>;\n  /** If specified, renders a Graticule with the specified props. Specify `graticule.foreground = true` to be rendered on top of features. */\n  graticule?: Omit<GraticuleProps, 'lines'> & { foreground: boolean };\n  /** If specified, renders a Graticule lines with the specified props. Specify `graticuleLines.foreground = true` to be rendered on top of features. */\n  graticuleLines?: Omit<GraticuleProps, 'lines'> & { foreground: boolean };\n  /** If specified, renders a Graticule outline with the specified props. Specify `graticuleOutline.foreground = true` to be rendered on top of features. */\n  graticuleOutline?: Omit<GraticuleProps, 'outline'> & { foreground: boolean };\n  /** Limits the digits for coordinates generated in SVG path strings to the specified number of digits. */\n  digits?: number;\n  /** Sets the radius used to display Point and MultiPoint geometries to the specified number. */\n  pointRadius?: number;\n};\n\nexport interface ParsedFeature<Datum> {\n  feature: Datum;\n  type: ProjectionShape;\n  projection: GeoProjection;\n  index: number;\n  centroid: [number, number];\n  path: string | null;\n}\n\n/**\n * Component for all projections.\n */\nexport default function Projection<Datum extends GeoPermissibleObjects>({\n  data,\n  projection = 'mercator',\n  projectionFunc,\n  clipAngle,\n  clipExtent,\n  scale,\n  translate,\n  center,\n  rotate,\n  precision,\n  fitExtent,\n  fitSize,\n  centroid,\n  graticule,\n  graticuleLines,\n  graticuleOutline,\n  className,\n  innerRef,\n  digits,\n  pointRadius,\n  children,\n  ...restProps\n}: ProjectionProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof ProjectionProps<Datum>>) {\n  const maybeCustomProjection =\n    typeof projection === 'string' ? projectionMapping[projection] : projection;\n\n  const currProjection = maybeCustomProjection();\n\n  if (clipAngle && currProjection.clipAngle) currProjection.clipAngle(clipAngle);\n  if (clipExtent && currProjection.clipExtent) currProjection.clipExtent(clipExtent);\n  if (scale && currProjection.scale) currProjection.scale(scale);\n  if (translate && currProjection.translate) currProjection.translate(translate);\n  if (center && currProjection.center) currProjection.center(center);\n  if (rotate && currProjection.rotate) currProjection.rotate(rotate);\n  if (precision && currProjection.precision) currProjection.precision(precision);\n  if (fitExtent && currProjection.fitExtent) currProjection.fitExtent(...fitExtent);\n  if (fitSize && currProjection.fitSize) currProjection.fitSize(...fitSize);\n\n  const path = geoPath().projection(currProjection);\n\n  if (digits !== undefined) path.digits(digits);\n  if (pointRadius !== undefined) path.pointRadius(pointRadius);\n\n  const features: ParsedFeature<Datum>[] = data.map((feature, i) => ({\n    feature,\n    type: projection,\n    projection: currProjection,\n    index: i,\n    centroid: path.centroid(feature),\n    path: path(feature),\n  }));\n\n  if (children) return <>{children({ path, features, projection: currProjection })}</>;\n\n  return (\n    <Group className=\"visx-geo\">\n      {graticule && !graticule.foreground && (\n        <Graticule graticule={(ml: MultiLineString) => path(ml) || ''} {...graticule} />\n      )}\n      {graticuleLines && !graticuleLines.foreground && (\n        <Graticule lines={(l: LineString) => path(l) || ''} {...graticuleLines} />\n      )}\n      {graticuleOutline && !graticuleOutline.foreground && (\n        <Graticule outline={(p: Polygon) => path(p) || ''} {...graticuleOutline} />\n      )}\n\n      {features.map((feature, i) => (\n        <g key={`${projection}-${i}`}>\n          <path\n            className={cx(`visx-geo-${projection}`, className)}\n            d={feature.path || ''}\n            ref={innerRef?.(feature, i)}\n            {...restProps}\n          />\n          {centroid?.(feature.centroid, feature)}\n        </g>\n      ))}\n\n      {/* TODO: Maybe find a different way to pass projection function to use for example invert */}\n      {projectionFunc?.(currProjection)}\n\n      {graticule?.foreground && (\n        <Graticule graticule={(ml: MultiLineString) => path(ml) || ''} {...graticule} />\n      )}\n\n      {graticuleLines?.foreground && (\n        <Graticule lines={(l: LineString) => path(l) || ''} {...graticuleLines} />\n      )}\n      {graticuleOutline?.foreground && (\n        <Graticule outline={(p: Polygon) => path(p) || ''} {...graticuleOutline} />\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-geo/src/types.ts",
    "content": "import type {\n  GeoProjection,\n  GeoPermissibleObjects as GeoPermissibleObjectType,\n} from '@visx/vendor/d3-geo';\n\nexport type GeoPermissibleObjects = GeoPermissibleObjectType;\n\nexport type Projection = ProjectionPreset | (() => GeoProjection);\n\n// @TODO: Implement all projections of d3-geo\nexport type ProjectionPreset =\n  | 'orthographic'\n  | 'albers'\n  | 'albersUsa'\n  | 'mercator'\n  | 'naturalEarth'\n  | 'equalEarth';\n"
  },
  {
    "path": "packages/visx-geo/test/Albers.test.tsx",
    "content": "import { Albers } from '../src';\n\ndescribe('<Albers />', () => {\n  test('it should be defined', () => {\n    expect(Albers).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-geo/test/AlbersUsa.test.tsx",
    "content": "import { AlbersUsa } from '../src';\n\ndescribe('<AlbersUsa />', () => {\n  test('it should be defined', () => {\n    expect(AlbersUsa).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-geo/test/CustomProjection.test.tsx",
    "content": "import { CustomProjection } from '../src';\n\ndescribe('<CustomProjection />', () => {\n  test('it should be defined', () => {\n    expect(CustomProjection).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-geo/test/EqualEarth.test.tsx",
    "content": "import { EqualEarth } from '../src';\n\ndescribe('<EqualEarth />', () => {\n  test('it should be defined', () => {\n    expect(EqualEarth).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-geo/test/Mercator.test.tsx",
    "content": "import { Mercator } from '../src';\n\ndescribe('<Mercator />', () => {\n  test('it should be defined', () => {\n    expect(Mercator).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-geo/test/Orthographic.test.tsx",
    "content": "import { Orthographic } from '../src';\n\ndescribe('<Orthographic />', () => {\n  test('it should be defined', () => {\n    expect(Orthographic).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-geo/test/Projection.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { feature } from 'topojson-client';\nimport type { GeometryCollection } from 'geojson';\nimport Projection from '../src/projections/Projection';\n\nconst mockTopology = {\n  type: 'Topology',\n  objects: {\n    collection: {\n      type: 'GeometryCollection',\n      geometries: [\n        {\n          type: 'Polygon',\n          arcs: [[0, 1]],\n        },\n        {\n          type: 'Polygon',\n          arcs: [[2, 3]],\n        },\n      ],\n    },\n  },\n  arcs: [\n    [\n      [0, 0],\n      [0, 1],\n    ],\n    [\n      [1, 1],\n      [1, 0],\n    ],\n    [\n      [0, 0],\n      [1, 0],\n    ],\n    [\n      [1, 1],\n      [0, 1],\n    ],\n  ],\n};\n\ndescribe('<Projection />', () => {\n  // Create valid test data\n  const data = feature(mockTopology, mockTopology.objects.collection)\n    .features as GeometryCollection[];\n\n  const defaultProps = { data };\n\n  const renderWithSvg = (ui: React.ReactElement) => render(<svg>{ui}</svg>);\n\n  test('it should be defined', () => {\n    expect(() => renderWithSvg(<Projection {...defaultProps} />)).not.toThrow();\n  });\n\n  test('it should pass className', () => {\n    const { container } = renderWithSvg(<Projection className=\"visx-new\" {...defaultProps} />);\n    const path = container.querySelector('path');\n    expect(path).toHaveClass('visx-geo-mercator');\n    expect(path).toHaveClass('visx-new');\n  });\n\n  test('it should create two paths', () => {\n    const { container } = renderWithSvg(<Projection {...defaultProps} />);\n    const paths = container.querySelectorAll('path');\n    expect(paths).toHaveLength(2);\n  });\n\n  test('it should pass prop to path', () => {\n    const { container } = renderWithSvg(<Projection stroke=\"red\" {...defaultProps} />);\n    const paths = container.querySelectorAll('path');\n    paths.forEach((path) => {\n      expect(path).toHaveAttribute('stroke', 'red');\n    });\n  });\n\n  test('it should call projectionFunc prop function', () => {\n    const projectionFunc = vi.fn();\n    renderWithSvg(<Projection projectionFunc={projectionFunc} {...defaultProps} />);\n    expect(projectionFunc).toHaveBeenCalledTimes(1);\n    // Verify projection is passed\n    expect(projectionFunc.mock.calls[0]?.[0]).toBeDefined();\n  });\n\n  test('it should call centroid prop function', () => {\n    const centroid = vi.fn();\n    renderWithSvg(<Projection centroid={centroid} {...defaultProps} />);\n    expect(centroid).toHaveBeenCalledTimes(2);\n    // Verify centroid coordinates and feature are passed\n    expect(centroid.mock.calls[0]?.[0]).toEqual(expect.any(Array));\n    expect(centroid.mock.calls[0]?.[1]).toEqual(expect.any(Object));\n  });\n});\n"
  },
  {
    "path": "packages/visx-geo/test/topo.json",
    "content": "{\n  \"type\": \"Topology\",\n  \"objects\": {\n    \"collection\": {\n      \"type\": \"GeometryCollection\",\n      \"geometries\": [\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[0]],\n          \"id\": \"poly1\"\n        },\n        {\n          \"type\": \"Polygon\",\n          \"arcs\": [[1]],\n          \"id\": \"poly2\"\n        }\n      ]\n    }\n  },\n  \"arcs\": [\n    [\n      [3598, 6571],\n      [-3598, -6571],\n      [5188, 0],\n      [-1590, 6571]\n    ],\n    [\n      [7823, 9999],\n      [-2008, -9999],\n      [4184, 0],\n      [-2176, 9999]\n    ]\n  ],\n  \"bbox\": [-87.2698974609375, 21.616579336740607, -45.2581787109375, 42.68243539838623],\n  \"transform\": {\n    \"scale\": [0.00420159203420342, 0.002106796285793142],\n    \"translate\": [-87.2698974609375, 21.616579336740607]\n  }\n}\n"
  },
  {
    "path": "packages/visx-geo/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-geo/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-geo/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/geo',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-geo/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/geo': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-glyph/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-glyph/Readme.md",
    "content": "# @visx/glyph\n\n<a title=\"@visx/glyph npm downloads\" href=\"https://www.npmjs.com/package/@visx/glyph\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/glyph.svg?style=flat-square\" />\n</a>\n\nGlyphs are small marks or symbols that you can use in your charts. Example:\n[https://airbnb.io/visx/glyphs](https://airbnb.io/visx/glyphs)\n\n## Installation\n\n```\nnpm install --save @visx/glyph\n```\n"
  },
  {
    "path": "packages/visx-glyph/package.json",
    "content": "{\n  \"name\": \"@visx/glyph\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx glyph\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/Glyph.tsx",
    "content": "import type { ReactNode } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\n\nexport type GlyphProps = {\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** classname to apply to glyph g element container. */\n  className?: string;\n  /** Children to render. */\n  children?: ReactNode;\n};\n\nexport default function Glyph({ top = 0, left = 0, className, children }: GlyphProps) {\n  return (\n    <Group className={cx('visx-glyph', className)} top={top} left={left}>\n      {children}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphCircle.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Symbol } from '@visx/vendor/d3-shape';\nimport { symbol, symbolCircle } from '@visx/vendor/d3-shape';\nimport Glyph from './Glyph';\n\nexport type GlyphCircleProps<Datum> = {\n  /** Render function override which is passed the configured path generator. */\n  children?: ({ path }: { path: Symbol<unknown, Datum> }) => ReactNode;\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Size of circle in px, or an accessor which takes Datum as input and returns a size. */\n  size?: number | ((d: Datum) => number);\n};\n\nexport default function GlyphCircle<Datum = unknown>({\n  children,\n  className,\n  top,\n  left,\n  size,\n  ...restProps\n}: GlyphCircleProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof GlyphCircleProps<Datum>>) {\n  const path = symbol<Datum>();\n  path.type(symbolCircle);\n\n  // TS can't differentiate the method overload here\n  if (typeof size === 'number') path.size(size);\n  else if (size) path.size(size);\n\n  if (children) return <>{children({ path })}</>;\n\n  return (\n    <Glyph top={top} left={left}>\n      <path className={cx('visx-glyph-circle', className)} d={path() || ''} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphCross.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Symbol } from '@visx/vendor/d3-shape';\nimport { symbol, symbolCross } from '@visx/vendor/d3-shape';\nimport Glyph from './Glyph';\n\nexport type GlyphCrossProps<Datum> = {\n  /** Render function override which is passed the configured path generator. */\n  children?: ({ path }: { path: Symbol<unknown, Datum> }) => ReactNode;\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Size of cross in px, or an accessor which takes Datum as input and returns a size. */\n  size?: number | ((d: Datum) => number);\n};\n\nexport default function GlyphCross<Datum = unknown>({\n  children,\n  className,\n  top,\n  left,\n  size,\n  ...restProps\n}: GlyphCrossProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof GlyphCrossProps<Datum>>) {\n  const path = symbol<Datum>();\n  path.type(symbolCross);\n\n  // TS can't differentiate the method overload here\n  if (typeof size === 'number') path.size(size);\n  else if (size) path.size(size);\n\n  if (children) return <>{children({ path })}</>;\n\n  return (\n    <Glyph top={top} left={left}>\n      <path className={cx('visx-glyph-cross', className)} d={path() || ''} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphDiamond.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Symbol } from '@visx/vendor/d3-shape';\nimport { symbol, symbolDiamond } from '@visx/vendor/d3-shape';\nimport Glyph from './Glyph';\n\nexport type GlyphDiamondProps<Datum> = {\n  /** Render function override which is passed the configured path generator. */\n  children?: ({ path }: { path: Symbol<unknown, Datum> }) => ReactNode;\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Size of diamond in px, or an accessor which takes Datum as input and returns a size. */\n  size?: number | ((d: Datum) => number);\n};\n\nexport default function GlyphDiamond<Datum = unknown>({\n  children,\n  className,\n  top,\n  left,\n  size,\n  ...restProps\n}: GlyphDiamondProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof GlyphDiamondProps<Datum>>) {\n  const path = symbol<Datum>();\n  path.type(symbolDiamond);\n\n  // TS can't differentiate the method overload here\n  if (typeof size === 'number') path.size(size);\n  else if (size) path.size(size);\n\n  if (children) return <>{children({ path })}</>;\n\n  return (\n    <Glyph top={top} left={left}>\n      <path className={cx('visx-glyph-diamond', className)} d={path() || ''} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphDot.tsx",
    "content": "import type { SVGProps } from 'react';\nimport cx from 'classnames';\nimport Glyph from './Glyph';\n\nexport type GlyphDotProps = {\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Radius of dot. */\n  r?: number;\n  /** x coordinate of the center of the dot. */\n  cx?: number;\n  /** y coordinate of the center of the dot. */\n  cy?: number;\n};\n\nexport default function GlyphDot({\n  top = 0,\n  left = 0,\n  className,\n  ...restProps\n}: GlyphDotProps & Omit<SVGProps<SVGCircleElement>, keyof GlyphDotProps>) {\n  return (\n    <Glyph top={top} left={left}>\n      <circle className={cx('visx-glyph-dot', className)} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphSquare.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Symbol } from '@visx/vendor/d3-shape';\nimport { symbol, symbolSquare } from '@visx/vendor/d3-shape';\nimport Glyph from './Glyph';\n\nexport type GlyphSquareProps<Datum> = {\n  /** Render function override which is passed the configured path generator. */\n  children?: ({ path }: { path: Symbol<unknown, Datum> }) => ReactNode;\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Size of square in px, or an accessor which takes Datum as input and returns a size. */\n  size?: number | ((d: Datum) => number);\n};\n\nexport default function GlyphSquare<Datum = unknown>({\n  children,\n  className,\n  top,\n  left,\n  size,\n  ...restProps\n}: GlyphSquareProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof GlyphSquareProps<Datum>>) {\n  const path = symbol<Datum>();\n  path.type(symbolSquare);\n\n  // TS can't differentiate the method overload here\n  if (typeof size === 'number') path.size(size);\n  else if (size) path.size(size);\n\n  if (children) return <>{children({ path })}</>;\n\n  return (\n    <Glyph top={top} left={left}>\n      <path className={cx('visx-glyph-square', className)} d={path() || ''} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphStar.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Symbol } from '@visx/vendor/d3-shape';\nimport { symbol, symbolStar } from '@visx/vendor/d3-shape';\nimport Glyph from './Glyph';\n\nexport type GlyphStarProps<Datum> = {\n  /** Render function override which is passed the configured path generator. */\n  children?: ({ path }: { path: Symbol<unknown, Datum> }) => ReactNode;\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Size of star in px, or an accessor which takes Datum as input and returns a size. */\n  size?: number | ((d: Datum) => number);\n};\n\nexport default function GlyphStar<Datum = unknown>({\n  children,\n  className,\n  top,\n  left,\n  size,\n  ...restProps\n}: GlyphStarProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof GlyphStarProps<Datum>>) {\n  const path = symbol<Datum>();\n  path.type(symbolStar);\n\n  // TS can't differentiate the method overload here\n  if (typeof size === 'number') path.size(size);\n  else if (size) path.size(size);\n\n  if (children) return <>{children({ path })}</>;\n  return (\n    <Glyph top={top} left={left}>\n      <path className={cx('visx-glyph-star', className)} d={path() || ''} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphTriangle.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Symbol } from '@visx/vendor/d3-shape';\nimport { symbol, symbolTriangle } from '@visx/vendor/d3-shape';\nimport Glyph from './Glyph';\n\nexport type GlyphTriangleProps<Datum> = {\n  /** Render function override which is passed the configured path generator. */\n  children?: ({ path }: { path: Symbol<unknown, Datum> }) => ReactNode;\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Size of triangle in px, or an accessor which takes Datum as input and returns a size. */\n  size?: number | ((d: Datum) => number);\n};\n\nexport default function GlyphTriangle<Datum = unknown>({\n  children,\n  className,\n  top,\n  left,\n  size,\n  ...restProps\n}: GlyphTriangleProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof GlyphTriangleProps<Datum>>) {\n  const path = symbol<Datum>();\n  path.type(symbolTriangle);\n\n  // TS can't differentiate the method overload here\n  if (typeof size === 'number') path.size(size);\n  else if (size) path.size(size);\n\n  if (children) return <>{children({ path })}</>;\n\n  return (\n    <Glyph top={top} left={left}>\n      <path className={cx('visx-glyph-triangle', className)} d={path() || ''} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/glyphs/GlyphWye.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { Symbol } from '@visx/vendor/d3-shape';\nimport { symbol, symbolWye } from '@visx/vendor/d3-shape';\nimport Glyph from './Glyph';\n\nexport type GlyphWyeProps<Datum> = {\n  /** Render function override which is passed the configured path generator. */\n  children?: ({ path }: { path: Symbol<unknown, Datum> }) => ReactNode;\n  /** classname to apply to glyph path element. */\n  className?: string;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Size of wye glyph in px, or an accessor which takes Datum as input and returns a size. */\n  size?: number | ((d: Datum) => number);\n};\n\nexport default function GlyphWye<Datum = unknown>({\n  children,\n  className,\n  top,\n  left,\n  size,\n  ...restProps\n}: GlyphWyeProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof GlyphWyeProps<Datum>>) {\n  const path = symbol<Datum>();\n  path.type(symbolWye);\n\n  // TS can't differentiate the method overload here\n  if (typeof size === 'number') path.size(size);\n  else if (size) path.size(size);\n\n  if (children) return <>{children({ path })}</>;\n  return (\n    <Glyph top={top} left={left}>\n      <path className={cx('visx-glyph-wye', className)} d={path() || ''} {...restProps} />\n    </Glyph>\n  );\n}\n"
  },
  {
    "path": "packages/visx-glyph/src/index.ts",
    "content": "// @visx/glyph\nexport { default as Glyph } from './glyphs/Glyph';\nexport { default as GlyphDot } from './glyphs/GlyphDot';\nexport { default as GlyphCross } from './glyphs/GlyphCross';\nexport { default as GlyphDiamond } from './glyphs/GlyphDiamond';\nexport { default as GlyphStar } from './glyphs/GlyphStar';\nexport { default as GlyphTriangle } from './glyphs/GlyphTriangle';\nexport { default as GlyphWye } from './glyphs/GlyphWye';\nexport { default as GlyphSquare } from './glyphs/GlyphSquare';\nexport { default as GlyphCircle } from './glyphs/GlyphCircle';\n\nexport type { GlyphProps } from './glyphs/Glyph';\nexport type { GlyphCircleProps } from './glyphs/GlyphCircle';\nexport type { GlyphCrossProps } from './glyphs/GlyphCross';\nexport type { GlyphDiamondProps } from './glyphs/GlyphDiamond';\nexport type { GlyphDotProps } from './glyphs/GlyphDot';\nexport type { GlyphSquareProps } from './glyphs/GlyphSquare';\nexport type { GlyphStarProps } from './glyphs/GlyphStar';\nexport type { GlyphTriangleProps } from './glyphs/GlyphTriangle';\nexport type { GlyphWyeProps } from './glyphs/GlyphWye';\n"
  },
  {
    "path": "packages/visx-glyph/test/Circle.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphCircle } from '../src';\n\ndescribe('<GlyphCircle />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphCircle {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphCircle).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n\n  test('should call children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('should pass path to children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle numeric size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n\n  test('should handle function size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Cross.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphCross } from '../src';\n\ndescribe('<GlyphCross />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphCross {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphCross).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n\n  test('should call children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('should pass path to children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle numeric size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n\n  test('should handle function size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Diamond.test.tsx",
    "content": "import React from 'react';\nimport { vi } from 'vitest';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphDiamond } from '../src';\n\ndescribe('<GlyphDiamond />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphDiamond {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphDiamond).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n\n  test('should call children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('should pass path to children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle numeric size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n\n  test('should handle function size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Dot.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphDot } from '../src';\n\ndescribe('<GlyphDot />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphDot {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphDot).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Glyph.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { Glyph } from '../src';\n\ndescribe('<Glyph />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <Glyph {...props} />\n      </svg>,\n    );\n\n  test('it should be defined', () => {\n    expect(Glyph).toBeDefined();\n  });\n\n  test('it should render with default className', () => {\n    const { container } = renderGlyph();\n    const glyph = container.querySelector('.visx-glyph');\n    expect(glyph).toBeInTheDocument();\n    expect(glyph).toHaveClass('visx-glyph');\n  });\n\n  test('it should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    const glyph = container.querySelector('.test');\n    expect(glyph).toBeInTheDocument();\n    expect(glyph).toHaveClass('test');\n  });\n\n  test('it should apply transform with top/left props', () => {\n    const { container } = renderGlyph({ top: 2, left: 2 });\n    const glyph = container.querySelector('.visx-glyph');\n    expect(glyph).toHaveAttribute('transform', 'translate(2, 2)');\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Square.test.tsx",
    "content": "import React from 'react';\nimport { vi } from 'vitest';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphSquare } from '../src';\n\ndescribe('<GlyphSquare />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphSquare {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphSquare).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n\n  test('should call children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('should pass path to children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle numeric size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n\n  test('should handle function size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Star.test.tsx",
    "content": "import React from 'react';\nimport { vi } from 'vitest';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphStar } from '../src';\n\ndescribe('<GlyphStar />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphStar {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphStar).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n\n  test('should call children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('should pass path to children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle numeric size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n\n  test('should handle function size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Triangle.test.tsx",
    "content": "import React from 'react';\nimport { vi } from 'vitest';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphTriangle } from '../src';\n\ndescribe('<GlyphTriangle />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphTriangle {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphTriangle).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n\n  test('should call children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('should pass path to children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle numeric size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n\n  test('should handle function size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/Wye.test.tsx",
    "content": "import React from 'react';\nimport { vi } from 'vitest';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { GlyphWye } from '../src';\n\ndescribe('<GlyphWye />', () => {\n  const renderGlyph = (props = {}) =>\n    render(\n      <svg>\n        <GlyphWye {...props} />\n      </svg>,\n    );\n\n  test('should be defined', () => {\n    expect(GlyphWye).toBeDefined();\n  });\n\n  test('should render with correct class', () => {\n    const { container } = renderGlyph();\n    expect(container.querySelector('.visx-glyph')).toBeInTheDocument();\n  });\n\n  test('should render with custom className', () => {\n    const { container } = renderGlyph({ className: 'test' });\n    expect(container.querySelector('.test')).toBeInTheDocument();\n  });\n\n  test('should call children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('should pass path to children function', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle numeric size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n\n  test('should handle function size prop', () => {\n    const fn = vi.fn(() => <svg />);\n    renderGlyph({ children: fn, size: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.size()()).toBe(42);\n  });\n});\n"
  },
  {
    "path": "packages/visx-glyph/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-glyph/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-glyph/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/glyph',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-glyph/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/glyph': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-gradient/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-gradient/Readme.md",
    "content": "# @visx/gradient\n\n<a title=\"@visx/gradient npm downloads\" href=\"https://www.npmjs.com/package/@visx/gradient\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/gradient.svg?style=flat-square\" />\n</a>\n\nInspired by: https://dribbble.com/shots/3380672-Sketch-Gradients-Freebie\n\n## Example\n\n```js\nimport { AreaClosed } from '@visx/shape';\nimport { GradientPinkBlue } from '@visx/gradient';\n\nconst GradientArea = () => {\n  return (\n    <svg>\n      <GradientPinkBlue id=\"gradient\" />\n      <AreaClosed fill=\"url('#gradient')\" />\n    </svg>\n  );\n};\n```\n\n## The Definition Caveat\n\nLike patterns, gradients are \"defined.\" When you render `<GradientPinkBlue />`, it's rendering a\n[`<linearGradient/>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/linearGradient)\nelement inside a `<def>` in the SVG.\n\nIt's often better to think of these as variable definitions rather than true DOM elements. When you\nuse `fill=\"url('#gradient')\"` you're referencing the gradient's id: `gradient`.\n\n## Make your own!\n\nIn addition to the preset linear gradients, you can make any linear or radial gradient like so:\n\n```js\nimport { LinearGradient, RadialGradient } from '@visx/gradient';\n\n<LinearGradient from=\"#a18cd1\" to=\"#fbc2eb\" />;\n<RadialGradient from=\"#a18cd1\" to=\"#fbc2eb\" />;\n```\n\n## Installation\n\n```\nnpm install --save @visx/gradient\n```\n"
  },
  {
    "path": "packages/visx-gradient/package.json",
    "content": "{\n  \"name\": \"@visx/gradient\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx gradient\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/react\": \"*\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientDarkgreenGreen.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientDarkgreenGreen({\n  from = '#184E86',\n  to = '#57CA85',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientLightgreenGreen.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientLightgreenGreen({\n  from = '#42E695',\n  to = '#3BB2B8',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientOrangeRed.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientOrangeRed({\n  from = '#FCE38A',\n  to = '#F38181',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientPinkBlue.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientPinkBlue({\n  from = '#F02FC2',\n  to = '#6094EA',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientPinkRed.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientPinkRed({\n  from = '#F54EA2',\n  to = '#FF7676',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientPurpleOrange.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientPurpleOrange({\n  from = '#7117EA',\n  to = '#EA6060',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientPurpleRed.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientPurpleRed({\n  from = '#622774',\n  to = '#C53364',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientPurpleTeal.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientPurpleTeal({\n  from = '#5B247A',\n  to = '#1BCEDF',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientSteelPurple.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientSteelPurple({\n  from = '#65799B',\n  to = '#5E2563',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/GradientTealBlue.tsx",
    "content": "import type { LinearGradientProps } from './LinearGradient';\nimport LinearGradient from './LinearGradient';\n\n/**\n * All props pass through to `<LinearGradient {...props} />`\n */\nexport default function GradientTealBlue({\n  from = '#17EAD9',\n  to = '#6078EA',\n  ...restProps\n}: LinearGradientProps) {\n  return <LinearGradient from={from} to={to} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/LinearGradient.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\n\ntype LinearGradientOwnProps = {\n  /** Unique id for the gradient. Should be unique across all page elements. */\n  id: string;\n  /** Start color of gradient. */\n  from?: string;\n  /** End color of gradient. */\n  to?: string;\n  /** The x coordinate of the starting point along which the linear gradient is drawn. */\n  x1?: string | number;\n  /** The x coordinate of the ending point along which the linear gradient is drawn. */\n  x2?: string | number;\n  /** The y coordinate of the starting point along which the linear gradient is drawn. */\n  y1?: string | number;\n  /** The y coordinate of the ending point along which the linear gradient is drawn. */\n  y2?: string | number;\n  /** Number or percent defining the where the 'from' starting color is placed along the gradient. */\n  fromOffset?: string | number;\n  /** Opacity of the 'from' starting color. */\n  fromOpacity?: string | number;\n  /** Number or percent defining the where the 'to' ending color is placed along the gradient. */\n  toOffset?: string | number;\n  /** Opacity of the 'to' ending color. */\n  toOpacity?: string | number;\n  /** Rotation to apply to gradient. */\n  rotate?: string | number;\n  /** Transform to apply to linearGradient, overrides rotate. */\n  transform?: string;\n  /** Override of linearGradient children. */\n  children?: ReactNode;\n  /** (When no x or y values are passed), will orient the gradient vertically instead of horizontally. */\n  vertical?: boolean;\n};\n\nexport type LinearGradientProps = LinearGradientOwnProps &\n  Omit<SVGProps<SVGLinearGradientElement>, keyof LinearGradientOwnProps>;\n\nexport default function LinearGradient({\n  children,\n  id,\n  from,\n  to,\n  x1: _x1,\n  y1: _y1,\n  x2: _x2,\n  y2: _y2,\n  fromOffset = '0%',\n  fromOpacity = 1,\n  toOffset = '100%',\n  toOpacity = 1,\n  rotate,\n  transform,\n  vertical = true,\n  ...restProps\n}: LinearGradientProps) {\n  let x1 = _x1;\n  let x2 = _x2;\n  let y1 = _y1;\n  let y2 = _y2;\n  if (vertical && !x1 && !x2 && !y1 && !y2) {\n    x1 = '0';\n    x2 = '0';\n    y1 = '0';\n    y2 = '1';\n  }\n  return (\n    <defs>\n      <linearGradient\n        id={id}\n        x1={x1}\n        y1={y1}\n        x2={x2}\n        y2={y2}\n        gradientTransform={rotate ? `rotate(${rotate})` : transform}\n        {...restProps}\n      >\n        {!!children && children}\n        {!children && <stop offset={fromOffset} stopColor={from} stopOpacity={fromOpacity} />}\n        {!children && <stop offset={toOffset} stopColor={to} stopOpacity={toOpacity} />}\n      </linearGradient>\n    </defs>\n  );\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/gradients/RadialGradient.tsx",
    "content": "import type { SVGProps } from 'react';\nimport type { LinearGradientProps } from './LinearGradient';\n\nexport type RadialGradientProps = Pick<\n  LinearGradientProps,\n  | 'id'\n  | 'from'\n  | 'to'\n  | 'fromOffset'\n  | 'fromOpacity'\n  | 'toOffset'\n  | 'toOpacity'\n  | 'rotate'\n  | 'transform'\n  | 'children'\n> &\n  SVGProps<SVGRadialGradientElement>; // passed as rest props to radialGradient\n\nexport default function RadialGradient({\n  children,\n  id,\n  from,\n  to,\n  fromOffset = '0%',\n  fromOpacity = 1,\n  toOffset = '100%',\n  toOpacity = 1,\n  rotate,\n  transform,\n  ...restProps\n}: RadialGradientProps) {\n  return (\n    <defs>\n      <radialGradient\n        id={id}\n        gradientTransform={rotate ? `rotate(${rotate})` : transform}\n        {...restProps}\n      >\n        {!!children && children}\n        {!children && <stop offset={fromOffset} stopColor={from} stopOpacity={fromOpacity} />}\n        {!children && <stop offset={toOffset} stopColor={to} stopOpacity={toOpacity} />}\n      </radialGradient>\n    </defs>\n  );\n}\n"
  },
  {
    "path": "packages/visx-gradient/src/index.ts",
    "content": "// @visx/gradient\nexport { default as LinearGradient } from './gradients/LinearGradient';\nexport { default as RadialGradient } from './gradients/RadialGradient';\nexport { default as GradientDarkgreenGreen } from './gradients/GradientDarkgreenGreen';\nexport { default as GradientLightgreenGreen } from './gradients/GradientLightgreenGreen';\nexport { default as GradientOrangeRed } from './gradients/GradientOrangeRed';\nexport { default as GradientPinkBlue } from './gradients/GradientPinkBlue';\nexport { default as GradientPinkRed } from './gradients/GradientPinkRed';\nexport { default as GradientPurpleOrange } from './gradients/GradientPurpleOrange';\nexport { default as GradientPurpleRed } from './gradients/GradientPurpleRed';\nexport { default as GradientPurpleTeal } from './gradients/GradientPurpleTeal';\nexport { default as GradientSteelPurple } from './gradients/GradientSteelPurple';\nexport { default as GradientTealBlue } from './gradients/GradientTealBlue';\n\nexport type { LinearGradientProps } from './gradients/LinearGradient';\nexport type { RadialGradientProps } from './gradients/RadialGradient';\n"
  },
  {
    "path": "packages/visx-gradient/test/Gradients.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport {\n  GradientDarkgreenGreen,\n  GradientLightgreenGreen,\n  GradientOrangeRed,\n  GradientPinkBlue,\n  GradientPinkRed,\n  GradientPurpleOrange,\n  GradientPurpleRed,\n  GradientPurpleTeal,\n  GradientSteelPurple,\n  GradientTealBlue,\n} from '../src';\n\ndescribe('<GradientDarkgreenGreen />', () => {\n  test('it should be defined', () => {\n    expect(GradientDarkgreenGreen).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientDarkgreenGreen id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientLightgreenGreen />', () => {\n  test('it should be defined', () => {\n    expect(GradientLightgreenGreen).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientLightgreenGreen id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientOrangeRed />', () => {\n  test('it should be defined', () => {\n    expect(GradientOrangeRed).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientOrangeRed id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientPinkBlue />', () => {\n  test('it should be defined', () => {\n    expect(GradientPinkBlue).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientPinkBlue id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientPinkRed />', () => {\n  test('it should be defined', () => {\n    expect(GradientPinkRed).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientPinkRed id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientPurpleOrange />', () => {\n  test('it should be defined', () => {\n    expect(GradientPurpleOrange).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientPurpleOrange id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientPurpleRed />', () => {\n  test('it should be defined', () => {\n    expect(GradientPurpleRed).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientPurpleRed id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientPurpleTeal />', () => {\n  test('it should be defined', () => {\n    expect(GradientPurpleTeal).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientPurpleTeal id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientSteelPurple />', () => {\n  test('it should be defined', () => {\n    expect(GradientSteelPurple).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientSteelPurple id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n\ndescribe('<GradientTealBlue />', () => {\n  test('it should be defined', () => {\n    expect(GradientTealBlue).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <GradientTealBlue id=\"gradient\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n"
  },
  {
    "path": "packages/visx-gradient/test/LinearGradient.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport { LinearGradient } from '../src';\n\ndescribe('<LinearGradient />', () => {\n  test('it should be defined', () => {\n    expect(LinearGradient).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <LinearGradient id=\"linear\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n"
  },
  {
    "path": "packages/visx-gradient/test/RadialGradient.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport { RadialGradient } from '../src';\n\ndescribe('<RadialGradient />', () => {\n  test('it should be defined', () => {\n    expect(RadialGradient).toBeDefined();\n  });\n\n  test('it should render without crashing', () => {\n    expect(() =>\n      render(\n        <svg>\n          <RadialGradient id=\"radial\" />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n});\n"
  },
  {
    "path": "packages/visx-gradient/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-gradient/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-gradient/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/gradient',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-gradient/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/gradient': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-grid/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-grid/Readme.md",
    "content": "# @visx/grid\n\n<a title=\"@visx/grid npm downloads\" href=\"https://www.npmjs.com/package/@visx/grid\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/grid.svg?style=flat-square\" />\n</a>\n\nThe `@visx/grid` package lets you create gridlines for charts. `<GridRows />` render horizontally,\n`<GridColumns />` render vertically, or you can use a `<Grid />` to get them both at once!\n\n## Usage\n\n```js\nimport { Grid } from '@visx/grid';\n// or\n// import * as Grid from '@visx/grid';\n// <Grid.Grid />\n\nconst grid = (\n  <Grid\n    xScale={xScale}\n    yScale={yScale}\n    width={xMax}\n    height={yMax}\n    numTicksRows={numTicksForHeight(height)}\n    numTicksColumns={numTicksForWidth(width)}\n  />\n);\n```\n\n## Installation\n\n```\nnpm install --save @visx/grid\n```\n"
  },
  {
    "path": "packages/visx-grid/package.json",
    "content": "{\n  \"name\": \"@visx/grid\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx grid\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/curve\": \"workspace:*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/point\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-grid/src/grids/Grid.tsx",
    "content": "import cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport type { AllGridRowsProps } from './GridRows';\nimport GridRows from './GridRows';\nimport type { AllGridColumnsProps } from './GridColumns';\nimport GridColumns from './GridColumns';\nimport type { CommonGridProps, GridScale } from '../types';\n\ntype CommonPropsToOmit =\n  | 'scale'\n  | 'offset'\n  | 'numTicks'\n  | 'lineStyle'\n  | 'tickValues'\n  | 'from'\n  | 'to'\n  | 'children';\n\nexport type GridProps<XScale extends GridScale, YScale extends GridScale> = Omit<\n  AllGridRowsProps<YScale> & AllGridColumnsProps<XScale>,\n  CommonPropsToOmit\n> & {\n  /** `@visx/scale` or `d3-scale` object used to map from ScaleInput to x-coordinates (GridColumns). */\n  xScale: XScale;\n  /** `@visx/scale` or `d3-scale` object used to map from ScaleInput to y-coordinates (GridRows). */\n  yScale: YScale;\n  /** Pixel offset to apply as an x-translation to each GridColumns line. */\n  xOffset?: CommonGridProps['offset'];\n  /** Pixel offset to apply as an y-translation to each GridRows line. */\n  yOffset?: CommonGridProps['offset'];\n  /** Approximate number of row gridlines. */\n  numTicksRows?: CommonGridProps['numTicks'];\n  /** Approximate number of column gridlines. */\n  numTicksColumns?: CommonGridProps['numTicks'];\n  /** Style object to apply to GridRows. */\n  rowLineStyle?: CommonGridProps['lineStyle'];\n  /** Style object to apply to GridColumns. */\n  columnLineStyle?: CommonGridProps['lineStyle'];\n  /** Exact values to be used for GridRows lines, passed to yScale. Use this if you need precise control over GridRows values.  */\n  rowTickValues?: ScaleInput<YScale>[];\n  /** Exact values to be used for GridColumns lines, passed to xScale. Use this if you need precise control over GridColumns values.  */\n  columnTickValues?: ScaleInput<XScale>[];\n};\n\nexport default function Grid<XScale extends GridScale, YScale extends GridScale>({\n  top,\n  left,\n  xScale,\n  yScale,\n  width,\n  height,\n  className,\n  stroke,\n  strokeWidth,\n  strokeDasharray,\n  numTicksRows,\n  numTicksColumns,\n  rowLineStyle,\n  columnLineStyle,\n  xOffset,\n  yOffset,\n  rowTickValues,\n  columnTickValues,\n  ...restProps\n}: GridProps<XScale, YScale>) {\n  return (\n    <Group className={cx('visx-grid', className)} top={top} left={left}>\n      <GridRows\n        className={className}\n        scale={yScale}\n        width={width}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        strokeDasharray={strokeDasharray}\n        numTicks={numTicksRows}\n        lineStyle={rowLineStyle}\n        offset={yOffset}\n        tickValues={rowTickValues}\n        {...restProps}\n      />\n      <GridColumns\n        className={className}\n        scale={xScale}\n        height={height}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        strokeDasharray={strokeDasharray}\n        numTicks={numTicksColumns}\n        lineStyle={columnLineStyle}\n        offset={xOffset}\n        tickValues={columnTickValues}\n        {...restProps}\n      />\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-grid/src/grids/GridAngle.tsx",
    "content": "import type { SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { LineProps } from '@visx/shape';\nimport { Line } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport { getTicks, coerceNumber } from '@visx/scale';\nimport { Point } from '@visx/point';\n\nimport type { CommonGridProps, GridScale } from '../types';\nimport polarToCartesian from '../utils/polarToCartesian';\n\nexport type GridAngleProps<Scale extends GridScale> = CommonGridProps & {\n  /** `@visx/scale` or `d3-scale` object used to convert value to angle. */\n  scale: Scale;\n  /**\n   * Exact values used to generate angle grid lines using `scale`.\n   * Overrides `numTicks` if specified.\n   */\n  tickValues?: ScaleInput<Scale>[];\n  /**\n   * Radius which determines the start position of angle lines.\n   */\n  innerRadius?: number;\n  /**\n   * Radius which determines the end position of angle lines.\n   */\n  outerRadius: number;\n  /**\n   * The class name applied to all angle lines.\n   */\n  lineClassName?: string;\n};\n\nexport type AllGridAngleProps<Scale extends GridScale> = GridAngleProps<Scale> &\n  Omit<\n    LineProps & Omit<SVGProps<SVGLineElement>, keyof LineProps | 'children'>,\n    keyof GridAngleProps<Scale>\n  >;\n\nexport default function GridAngle<Scale extends GridScale>({\n  className,\n  innerRadius = 0,\n  left = 0,\n  lineClassName,\n  lineStyle,\n  numTicks = 10,\n  outerRadius = 0,\n  scale,\n  stroke = '#eaf0f6',\n  strokeDasharray,\n  strokeWidth = 1,\n  tickValues,\n  top = 0,\n  children, // Explicitly extract children so it doesn't get spread to Line\n  ...restProps\n}: AllGridAngleProps<Scale>) {\n  const ticks = tickValues ?? getTicks(scale, numTicks);\n  return (\n    <Group className={cx('visx-grid-angle', className)} top={top} left={left}>\n      {ticks.map((tick, i) => {\n        const angle = (coerceNumber(scale(tick)) ?? Math.PI / 2) - Math.PI / 2;\n        return (\n          <Line\n            key={`polar-grid-${tick}-${i}`}\n            className={lineClassName}\n            from={new Point(polarToCartesian({ angle, radius: innerRadius }))}\n            to={new Point(polarToCartesian({ angle, radius: outerRadius }))}\n            stroke={stroke}\n            strokeWidth={strokeWidth}\n            strokeDasharray={strokeDasharray}\n            style={lineStyle}\n            {...restProps}\n          />\n        );\n      })}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-grid/src/grids/GridColumns.tsx",
    "content": "import type { SVGProps } from 'react';\nimport cx from 'classnames';\nimport { Line } from '@visx/shape';\nimport type { LineProps } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { Point } from '@visx/point';\nimport type { ScaleInput } from '@visx/scale';\nimport { getTicks, coerceNumber } from '@visx/scale';\nimport type { CommonGridProps, GridScale } from '../types';\nimport getScaleBandwidth from '../utils/getScaleBandwidth';\n\nexport type GridColumnsProps<Scale extends GridScale> = CommonGridProps & {\n  /** `@visx/scale` or `d3-scale` object used to convert value to position. */\n  scale: Scale;\n  /**\n   * Exact values used to generate grid lines using `scale`.\n   * Overrides `numTicks` if specified.\n   */\n  tickValues?: ScaleInput<Scale>[];\n  /** Total height of each grid column line. */\n  height: number;\n};\n\nexport type AllGridColumnsProps<Scale extends GridScale> = GridColumnsProps<Scale> &\n  Omit<LineProps & Omit<SVGProps<SVGLineElement>, keyof LineProps>, keyof GridColumnsProps<Scale>>;\n\nexport default function GridColumns<Scale extends GridScale>({\n  top = 0,\n  left = 0,\n  scale,\n  height,\n  stroke = '#eaf0f6',\n  strokeWidth = 1,\n  strokeDasharray,\n  className,\n  numTicks = 10,\n  lineStyle,\n  offset,\n  tickValues,\n  children,\n  ...restProps\n}: AllGridColumnsProps<Scale>) {\n  const ticks = tickValues ?? getTicks(scale, numTicks);\n  const scaleOffset = (offset ?? 0) + getScaleBandwidth(scale) / 2;\n  const tickLines = ticks.map((d, index) => {\n    const x = (coerceNumber(scale(d)) ?? 0) + scaleOffset;\n    return {\n      index,\n      from: new Point({\n        x,\n        y: 0,\n      }),\n      to: new Point({\n        x,\n        y: height,\n      }),\n    };\n  });\n  return (\n    <Group className={cx('visx-columns', className)} top={top} left={left}>\n      {children\n        ? children({ lines: tickLines })\n        : tickLines.map(({ from, to, index }) => (\n            <Line\n              key={`column-line-${index}`}\n              from={from}\n              to={to}\n              stroke={stroke}\n              strokeWidth={strokeWidth}\n              strokeDasharray={strokeDasharray}\n              style={lineStyle}\n              {...restProps}\n            />\n          ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-grid/src/grids/GridPolar.tsx",
    "content": "import type { CSSProperties, SVGProps } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport type { LineProps } from '@visx/shape';\nimport GridAngle from './GridAngle';\nimport GridRadial from './GridRadial';\n\nimport type { CommonGridProps, GridScale } from '../types';\n\nexport type GridPolarProps<\n  AngleScale extends GridScale,\n  RadialScale extends GridScale,\n> = CommonGridProps & {\n  /**\n   * If specified, the arc of each radial grid line will have this thickness, useful for fills.\n   */\n  arcThickness?: number;\n  /**\n   * The class name applied to the angle grid group.\n   */\n  classNameAngle?: string;\n  /**\n   * The class name applied to the radial grid group.\n   */\n  classNameRadial?: string;\n  /**\n   * The end angle of the arc of radial grid lines in radians.\n   */\n  endAngle?: number;\n  /**\n   * The color applied to the fill of the radial lines.\n   */\n  fillRadial?: string;\n  /**\n   * Radius which determines the start position of angle lines.\n   */\n  innerRadius?: number;\n  /**\n   * Classname applied to all angle line paths.\n   */\n  lineClassNameAngle?: string;\n  /**\n   * Classname applied to all radial line paths.\n   */\n  lineClassNameRadial?: string;\n  /**\n   * Style object set as the angle line path style attribute.\n   */\n  lineStyleAngle?: CSSProperties & LineProps & Omit<SVGProps<SVGLineElement>, keyof LineProps>;\n  /**\n   * Style object set as the radius line path style attribute.\n   */\n  lineStyleRadial?: CSSProperties & LineProps & Omit<SVGProps<SVGLineElement>, keyof LineProps>;\n  /**\n   * The number of angle ticks wanted for the grid. Note this is approximate due to d3's algorithm,\n   * you can use tickValues for greater control\n   */\n  numTicksAngle?: number;\n  /**\n   * The number of radial ticks wanted for the grid. Note this is approximate due to d3's algorithm,\n   * you can use tickValues for greater control\n   */\n  numTicksRadial?: number;\n  /**\n   * Radius which determines the end position of angle lines.\n   */\n  outerRadius: number;\n  /**\n   * A [d3](https://github.com/d3/d3-scale) or [visx](https://github.com/airbnb/visx/tree/master/packages/visx-scale)\n   * scale function used to generate the angle of angle lines.\n   */\n  scaleAngle: AngleScale;\n  /**\n   * A [d3](https://github.com/d3/d3-scale) or [visx](https://github.com/airbnb/visx/tree/master/packages/visx-scale)\n   * scale function used to generate the radius of radial lines.\n   */\n  scaleRadial: RadialScale;\n  /**\n   * The start angle of the arc of radial grid lines in radians.\n   */\n  startAngle?: number;\n  /**\n   * The color applied to the stroke of the angle lines.\n   */\n  strokeAngle?: string;\n  /**\n   * The color applied to the stroke of the radial lines.\n   */\n  strokeRadial?: string;\n  /**\n   * The pattern of dashes for angle line stroke.\n   */\n  strokeDasharrayAngle?: string;\n  /**\n   * The pattern of dashes for angle radial stroke.\n   */\n  strokeDasharrayRadial?: string;\n  /**\n   * The pixel value for the width of the angle lines.\n   */\n  strokeWidthAngle?: string | number;\n  /**\n   * The pixel value for the width of the radial lines.\n   */\n  strokeWidthRadial?: string | number;\n  /**\n   * An array of values that determine the number and values of the angle ticks. Falls\n   * back to `scale.ticks()` or `.domain()`.\n   */\n  tickValuesAngle?: ScaleInput<AngleScale>[];\n  /**\n   * An array of values that determine the number and values of the radial ticks. Falls\n   * back to `scale.ticks()` or `.domain()`.\n   */\n  tickValuesRadial?: ScaleInput<RadialScale>[];\n  /**\n   * A top pixel offset applied to the entire grid group.\n   */\n  top?: number;\n};\n\nexport default function GridPolar<Scale extends GridScale>({\n  arcThickness,\n  className,\n  classNameAngle,\n  classNameRadial,\n  endAngle,\n  fillRadial,\n  innerRadius,\n  left,\n  lineClassNameAngle,\n  lineClassNameRadial,\n  lineStyleAngle,\n  lineStyleRadial,\n  numTicksAngle,\n  numTicksRadial,\n  outerRadius,\n  scaleAngle,\n  scaleRadial,\n  startAngle,\n  strokeAngle,\n  strokeRadial,\n  strokeWidthAngle,\n  strokeWidthRadial,\n  strokeDasharrayAngle,\n  strokeDasharrayRadial,\n  tickValuesAngle,\n  tickValuesRadial,\n  top,\n}: GridPolarProps<Scale, Scale>) {\n  return (\n    <Group className={cx('visx-grid-polar', className)} top={top} left={left}>\n      <GridAngle\n        className={classNameAngle}\n        innerRadius={innerRadius}\n        lineClassName={lineClassNameAngle}\n        lineStyle={lineStyleAngle}\n        numTicks={numTicksAngle}\n        outerRadius={outerRadius}\n        scale={scaleAngle}\n        stroke={strokeAngle}\n        strokeWidth={strokeWidthAngle}\n        strokeDasharray={strokeDasharrayAngle}\n        tickValues={tickValuesAngle}\n      />\n      <GridRadial\n        arcThickness={arcThickness}\n        className={classNameRadial}\n        endAngle={endAngle}\n        fill={fillRadial}\n        lineClassName={lineClassNameRadial}\n        lineStyle={lineStyleRadial}\n        numTicks={numTicksRadial}\n        scale={scaleRadial}\n        startAngle={startAngle}\n        stroke={strokeRadial}\n        strokeWidth={strokeWidthRadial}\n        strokeDasharray={strokeDasharrayRadial}\n        tickValues={tickValuesRadial}\n      />\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-grid/src/grids/GridRadial.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport { Arc } from '@visx/shape';\nimport type { ArcProps } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport { getTicks } from '@visx/scale';\n\nimport type { CommonGridProps, GridScale } from '../types';\n\nexport type GridRadialProps<Scale extends GridScale> = CommonGridProps & {\n  /** `@visx/scale` or `d3-scale` object used to convert value to position. */\n  scale: Scale;\n  /**\n   * Exact values used to generate grid lines using `scale`.\n   * Overrides `numTicks` if specified.\n   */\n  tickValues?: ScaleInput<Scale>[];\n  /**\n   * If specified, the arc of each radial grid line will have this thickness, useful for fills.\n   */\n  arcThickness?: number;\n  /**\n   * The end angle of the arc of radial grid lines in radians.\n   */\n  endAngle?: number;\n  /**\n   * The class name applied to all radial lines.\n   */\n  lineClassName?: string;\n  /**\n   * The color applied to the fill of the radial lines.\n   */\n  fill?: string;\n  /**\n   * The fill opacity applied to the fill of the radial lines.\n   */\n  fillOpacity?: number;\n  /**\n   * The start angle of the arc of radial grid lines in radians.\n   */\n  startAngle?: number;\n  /**\n   * Child components to the Arc.\n   */\n  children?: () => ReactNode;\n};\n\nexport type AllGridRadialProps<Scale extends GridScale, Datum> = GridRadialProps<Scale> &\n  Omit<\n    ArcProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof ArcProps<Datum>>,\n    keyof GridRadialProps<Scale>\n  >;\n\nexport default function GridRadial<Scale extends GridScale, Datum>({\n  arcThickness,\n  className,\n  endAngle = 2 * Math.PI,\n  fill = 'transparent',\n  fillOpacity = 1,\n  left = 0,\n  lineClassName,\n  lineStyle,\n  numTicks = 10,\n  scale,\n  startAngle = 0,\n  stroke = '#eaf0f6',\n  strokeWidth = 1,\n  strokeDasharray,\n  tickValues,\n  top = 0,\n  ...restProps\n}: AllGridRadialProps<Scale, Datum>) {\n  const radii = tickValues ?? getTicks(scale, numTicks);\n  const innerRadius = Math.min(...scale.domain());\n\n  return (\n    <Group className={cx('visx-grid-radial', className)} top={top} left={left}>\n      {radii.map((radius, i) => (\n        <Arc\n          key={`radial-grid-${radius}-${i}`}\n          className={lineClassName}\n          startAngle={startAngle}\n          endAngle={endAngle}\n          innerRadius={scale(arcThickness ? radius - arcThickness : innerRadius) as number}\n          outerRadius={scale(radius) as number}\n          fill={fill}\n          fillOpacity={fillOpacity}\n          stroke={stroke}\n          strokeWidth={strokeWidth}\n          strokeDasharray={strokeDasharray}\n          style={lineStyle}\n          {...restProps}\n        />\n      ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-grid/src/grids/GridRows.tsx",
    "content": "import type { SVGProps } from 'react';\nimport cx from 'classnames';\nimport { Line } from '@visx/shape';\nimport type { LineProps } from '@visx/shape';\nimport { Group } from '@visx/group';\nimport { Point } from '@visx/point';\nimport type { ScaleInput } from '@visx/scale';\nimport { getTicks, coerceNumber } from '@visx/scale';\nimport type { CommonGridProps, GridScale } from '../types';\nimport getScaleBandwidth from '../utils/getScaleBandwidth';\n\nexport type GridRowsProps<Scale extends GridScale> = CommonGridProps & {\n  /** `@visx/scale` or `d3-scale` object used to convert value to position. */\n  scale: Scale;\n  /**\n   * Exact values used to generate grid lines using `scale`.\n   * Overrides `numTicks` if specified.\n   */\n  tickValues?: ScaleInput<Scale>[];\n  /** Total width of each grid row line. */\n  width: number;\n};\n\nexport type AllGridRowsProps<Scale extends GridScale> = GridRowsProps<Scale> &\n  Omit<LineProps & Omit<SVGProps<SVGLineElement>, keyof LineProps>, keyof GridRowsProps<Scale>>;\n\nexport default function GridRows<Scale extends GridScale>({\n  top = 0,\n  left = 0,\n  scale,\n  width,\n  stroke = '#eaf0f6',\n  strokeWidth = 1,\n  strokeDasharray,\n  className,\n  children,\n  numTicks = 10,\n  lineStyle,\n  offset,\n  tickValues,\n  ...restProps\n}: AllGridRowsProps<Scale>) {\n  const ticks = tickValues ?? getTicks(scale, numTicks);\n  const scaleOffset = (offset ?? 0) + getScaleBandwidth(scale) / 2;\n  const tickLines = ticks.map((d, index) => {\n    const y = (coerceNumber(scale(d)) ?? 0) + scaleOffset;\n    return {\n      index,\n      from: new Point({\n        x: 0,\n        y,\n      }),\n      to: new Point({\n        x: width,\n        y,\n      }),\n    };\n  });\n  return (\n    <Group className={cx('visx-rows', className)} top={top} left={left}>\n      {children\n        ? children({ lines: tickLines })\n        : tickLines.map(({ from, to, index }) => (\n            <Line\n              key={`row-line-${index}`}\n              from={from}\n              to={to}\n              stroke={stroke}\n              strokeWidth={strokeWidth}\n              strokeDasharray={strokeDasharray}\n              style={lineStyle}\n              {...restProps}\n            />\n          ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-grid/src/index.ts",
    "content": "// @visx/grid\nexport { default as GridRows } from './grids/GridRows';\nexport type { GridRowsProps, AllGridRowsProps } from './grids/GridRows';\nexport { default as GridColumns } from './grids/GridColumns';\nexport type { GridColumnsProps, AllGridColumnsProps } from './grids/GridColumns';\nexport { default as Grid } from './grids/Grid';\nexport { default as GridAngle } from './grids/GridAngle';\nexport { default as GridRadial } from './grids/GridRadial';\nexport { default as GridPolar } from './grids/GridPolar';\n\nexport type * from './types';\n"
  },
  {
    "path": "packages/visx-grid/src/types.ts",
    "content": "import type { CSSProperties, ReactNode } from 'react';\nimport type { D3Scale, NumberLike } from '@visx/scale';\n\n// In order to plot values on an axis, output of the scale must be number.\n// Some scales return undefined.\nexport type GridScaleOutput = number | NumberLike | undefined;\n\n/** A catch-all type for scales that are compatible with grid */\nexport type GridScale<Output extends GridScaleOutput = GridScaleOutput> =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  D3Scale<Output, any, any>;\n\nexport type GridLines = {\n  from: { x?: number; y?: number };\n  to: { x?: number; y?: number };\n  index: number;\n}[];\n\nexport type CommonGridProps = {\n  /** classname to apply to line group element. */\n  className?: string;\n  /** Optionally override rendering of grid lines. */\n  children?: (props: { lines: GridLines }) => ReactNode;\n  /** Top offset to apply to glyph g element container. */\n  top?: number;\n  /** Left offset to apply to glyph g element container. */\n  left?: number;\n  /** Grid line stroke color. */\n  stroke?: string;\n  /** Grid line stroke thickness. */\n  strokeWidth?: string | number;\n  /** Grid line stroke-dasharray attribute. */\n  strokeDasharray?: string;\n  /** Approximate number of grid lines. Approximate due to d3 alogrithm, specify `tickValues` for precise control. */\n  numTicks?: number;\n  /** Styles to apply as grid line style. */\n  lineStyle?: CSSProperties;\n  /** Pixel offset to apply as a translation (y- for Rows, x- for Columns) to each grid lines. */\n  offset?: number;\n};\n"
  },
  {
    "path": "packages/visx-grid/src/utils/getScaleBandwidth.ts",
    "content": "import type { GridScale } from '../types';\n\nexport default function getScaleBandwidth(scale: GridScale) {\n  return 'bandwidth' in scale ? scale.bandwidth() : 0;\n}\n"
  },
  {
    "path": "packages/visx-grid/src/utils/polarToCartesian.ts",
    "content": "export type PolarCoordinate = {\n  radius: number;\n  angle: number;\n};\n\nexport type CartesianCoordinate = {\n  x: number;\n  y: number;\n};\n\nexport default function polarToCartesian({ radius, angle }: PolarCoordinate): CartesianCoordinate {\n  return {\n    x: radius * Math.cos(angle),\n    y: radius * Math.sin(angle),\n  };\n}\n"
  },
  {
    "path": "packages/visx-grid/test/Grid.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { Grid } from '../src';\n\ndescribe('<Grid />', () => {\n  it('should be defined', () => {\n    expect(Grid).toBeDefined();\n  });\n\n  it('should create grid lines', () => {\n    const xScale = scaleLinear({\n      domain: [0, 10],\n      range: [0, 100],\n    });\n\n    const yScale = scaleLinear({\n      domain: [0, 10],\n      range: [0, 100],\n    });\n\n    const { container } = render(\n      <svg>\n        <Grid\n          xScale={xScale}\n          yScale={yScale}\n          width={400}\n          height={400}\n          strokeDasharray=\"3,3\"\n          strokeOpacity={0.3}\n          pointerEvents=\"none\"\n        />\n      </svg>,\n    );\n\n    // Verify grid containers exist\n    expect(container.querySelector('.visx-rows')).toBeInTheDocument();\n    expect(container.querySelector('.visx-columns')).toBeInTheDocument();\n\n    // Verify lines are rendered\n    const lines = container.querySelectorAll('line');\n    expect(lines.length).toBeGreaterThan(0);\n\n    // Verify line attributes\n    const firstLine = lines[0];\n    expect(firstLine).toHaveAttribute('stroke-dasharray', '3,3');\n    expect(firstLine).toHaveAttribute('stroke-opacity', '0.3');\n    expect(firstLine).toHaveAttribute('pointer-events', 'none');\n  });\n});\n"
  },
  {
    "path": "packages/visx-grid/test/GridAngle.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\n\nimport { scaleLinear } from '@visx/scale';\nimport { GridAngle } from '../src';\nimport * as polarToCartesian from '../src/utils/polarToCartesian';\n\nconst gridProps = {\n  innerRadius: 0,\n  outerRadius: 10,\n  scale: scaleLinear({\n    range: [0, 2 * Math.PI],\n    domain: [1, 10],\n  }),\n};\n\ndescribe('<GridAngle />', () => {\n  beforeEach(() => {\n    vi.clearAllMocks();\n  });\n\n  it('should render with class .visx-grid-angle', () => {\n    const { container } = render(\n      <svg>\n        <GridAngle {...gridProps} />\n      </svg>,\n    );\n    const element = container.querySelector('g.visx-group');\n    expect(element).toBeTruthy();\n    expect(element?.classList.contains('visx-grid-angle')).toBe(true);\n  });\n\n  it('should set user-specified lineClassName', () => {\n    const { container } = render(\n      <svg>\n        <GridAngle {...gridProps} lineClassName=\"test-class\" />\n      </svg>,\n    );\n    const lines = container.querySelectorAll('line.test-class');\n    expect(lines.length).toBeGreaterThan(0);\n  });\n\n  it('should render `numTicks` grid lines', () => {\n    const { container } = render(\n      <svg>\n        <GridAngle {...gridProps} numTicks={5} />\n      </svg>,\n    );\n    const lines = container.querySelectorAll('line');\n    expect(lines).toHaveLength(5);\n\n    const { container: container2 } = render(\n      <svg>\n        <GridAngle {...gridProps} numTicks={10} />\n      </svg>,\n    );\n    const lines2 = container2.querySelectorAll('line');\n    expect(lines2).toHaveLength(10);\n  });\n\n  it('should render grid lines according to tickValues', () => {\n    const { container } = render(\n      <svg>\n        <GridAngle {...gridProps} tickValues={[1, 2, 3]} />\n      </svg>,\n    );\n    const lines = container.querySelectorAll('line');\n    expect(lines).toHaveLength(3);\n  });\n\n  it('should compute radial lines using innerRadius and outerRadius', () => {\n    const polarToCartesianSpy = vi.spyOn(polarToCartesian, 'default');\n    const innerRadius = 4;\n    const outerRadius = 7;\n\n    render(\n      <svg>\n        <GridAngle {...gridProps} innerRadius={innerRadius} outerRadius={outerRadius} />\n      </svg>,\n    );\n\n    expect(polarToCartesianSpy.mock.calls.length).toBeGreaterThanOrEqual(2);\n\n    const fromPointCall = polarToCartesianSpy.mock.calls[0][0];\n    const toPointCall = polarToCartesianSpy.mock.calls[1][0];\n\n    expect(fromPointCall.radius).toBe(innerRadius);\n    expect(toPointCall.radius).toBe(outerRadius);\n\n    polarToCartesianSpy.mockRestore();\n  });\n});\n"
  },
  {
    "path": "packages/visx-grid/test/GridColumns.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport { scaleLinear } from '@visx/scale';\nimport { GridColumns } from '../src';\n\ndescribe('<GridColumns />', () => {\n  it('should be defined', () => {\n    expect(GridColumns).toBeDefined();\n  });\n\n  it('should create grid lines', () => {\n    const { container } = render(\n      <svg>\n        <GridColumns\n          scale={scaleLinear({ range: [0, 100] })}\n          height={400}\n          strokeDasharray=\"3,3\"\n          strokeOpacity={0.3}\n          pointerEvents=\"none\"\n        />\n      </svg>,\n    );\n\n    const lines = container.querySelectorAll('.visx-line');\n    expect(lines).toHaveLength(11);\n  });\n});\n"
  },
  {
    "path": "packages/visx-grid/test/GridPolar.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport { scaleLinear } from '@visx/scale';\nimport { GridPolar } from '../src';\n\nconst gridProps = {\n  innerRadius: 0,\n  outerRadius: 10,\n  scaleAngle: scaleLinear({ range: [1, 100], domain: [1, 10] }),\n  scaleRadial: scaleLinear({ range: [1, 100], domain: [1, 10] }),\n};\n\ndescribe('<GridPolar />', () => {\n  it('should be defined', () => {\n    expect(GridPolar).toBeDefined();\n  });\n\n  it('should render with class .visx-grid-polar', () => {\n    const { container } = render(\n      <svg>\n        <GridPolar {...gridProps} />\n      </svg>,\n    );\n    expect(container.querySelector('.visx-grid-polar')).toBeTruthy();\n  });\n\n  it('should render both angle and radial grid lines', () => {\n    const { container } = render(\n      <svg>\n        <GridPolar {...gridProps} />\n      </svg>,\n    );\n\n    // Look for actual rendered lines rather than mocked components\n    const lines = container.querySelectorAll('line');\n    const arcs = container.querySelectorAll('path'); // radial grids are rendered as arcs/paths\n\n    expect(lines.length).toBeGreaterThan(0); // Should have some angle lines\n    expect(arcs.length).toBeGreaterThan(0); // Should have some radial lines\n  });\n});\n"
  },
  {
    "path": "packages/visx-grid/test/GridRadial.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { scaleLinear } from '@visx/scale';\nimport { GridRadial } from '../src';\n\nconst gridProps = {\n  innerRadius: 0,\n  outerRadius: 10,\n  scale: scaleLinear({\n    range: [1, 100],\n    domain: [1, 10],\n  }),\n  startAngle: 0,\n  endAngle: Math.PI * 2,\n};\n\ndescribe('<GridRadial />', () => {\n  beforeEach(() => {\n    vi.clearAllMocks();\n  });\n\n  it('should be defined', () => {\n    expect(GridRadial).toBeDefined();\n  });\n\n  it('should render with class .visx-grid-radial', () => {\n    const { container } = render(\n      <svg>\n        <GridRadial {...gridProps} />\n      </svg>,\n    );\n    const group = container.querySelector('.visx-grid-radial');\n    expect(group).toBeInTheDocument();\n  });\n\n  it('should set user-specified lineClassName', () => {\n    const { container } = render(\n      <svg>\n        <GridRadial {...gridProps} lineClassName=\"test-class\" />\n      </svg>,\n    );\n    const paths = container.querySelectorAll('path');\n    expect(paths.length).toBeGreaterThan(0);\n    paths.forEach((path) => {\n      expect(path).toHaveClass('test-class');\n    });\n  });\n\n  it('should render `numTicks` grid line arcs', () => {\n    const { container } = render(\n      <svg>\n        <GridRadial {...gridProps} numTicks={5} />\n      </svg>,\n    );\n    const paths = container.querySelectorAll('path.visx-arc');\n    expect(paths).toHaveLength(5);\n\n    const { container: container2 } = render(\n      <svg>\n        <GridRadial {...gridProps} numTicks={10} />\n      </svg>,\n    );\n    const paths2 = container2.querySelectorAll('path.visx-arc');\n    expect(paths2).toHaveLength(10);\n  });\n\n  it('should render grid line arcs according to tickValues', () => {\n    const { container } = render(\n      <svg>\n        <GridRadial {...gridProps} tickValues={[1, 2, 3]} />\n      </svg>,\n    );\n    const paths = container.querySelectorAll('path.visx-arc');\n    expect(paths).toHaveLength(3);\n  });\n});\n"
  },
  {
    "path": "packages/visx-grid/test/GridRows.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom'; // Added for toHaveAttribute matcher\nimport { scaleLinear } from '@visx/scale';\nimport { GridRows } from '../src';\n\ndescribe('<GridRows />', () => {\n  it('should be defined', () => {\n    expect(GridRows).toBeDefined();\n  });\n\n  it('should create grid lines with correct attributes', () => {\n    const { container } = render(\n      <svg width={400} height={400}>\n        <GridRows\n          scale={scaleLinear({ range: [0, 100] })}\n          width={400}\n          strokeDasharray=\"3,3\"\n          strokeOpacity={0.3}\n          pointerEvents=\"none\"\n        />\n      </svg>,\n    );\n\n    const lines = container.querySelectorAll('.visx-line');\n    expect(lines).toHaveLength(11);\n\n    // Verify line attributes were passed through\n    lines.forEach((line) => {\n      expect(line).toHaveAttribute('stroke-dasharray', '3,3');\n      expect(line).toHaveAttribute('stroke-opacity', '0.3');\n      expect(line).toHaveAttribute('pointer-events', 'none');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-grid/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-grid/test/utils.test.ts",
    "content": "import { scaleLinear, scaleBand } from '@visx/scale';\nimport polarToCartesian from '../src/utils/polarToCartesian';\nimport getScaleBandwidth from '../src/utils/getScaleBandwidth';\n\ndescribe('grid utils', () => {\n  describe('polarToCartesian', () => {\n    const config = {\n      radius: 20,\n      angle: 20,\n    };\n    it('should return cartesian output for the given polar input config', () => {\n      const expected = {\n        x: config.radius * Math.cos(config.angle),\n        y: config.radius * Math.sin(config.angle),\n      };\n      expect(polarToCartesian(config)).toEqual(expected);\n    });\n  });\n\n  describe('getScaleBandwidth', () => {\n    it('should return 0 for non-band scales', () => {\n      expect(\n        getScaleBandwidth(\n          scaleLinear({\n            range: [0, 90],\n            domain: [0, 100],\n          }),\n        ),\n      ).toBe(0);\n    });\n\n    it('should return the size of the band for band scales', () => {\n      expect(\n        getScaleBandwidth(\n          scaleBand({\n            range: [0, 90],\n            domain: ['a', 'b', 'c'],\n            padding: 0,\n          }),\n        ),\n      ).toBe(30);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-grid/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-curve\"\n    },\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-point\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-grid/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/grid',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-grid/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/grid': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-group/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-group/Readme.md",
    "content": "# @visx/group\n\n<a title=\"@visx/group npm downloads\" href=\"https://www.npmjs.com/package/@visx/group\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/group.svg?style=flat-square\" />\n</a>\n\n`<Group />` provides a simplified API for SVG `<g />` elements, which are containers for other SVG\nobjects. You may pass in a `top` and `left` margin (instead of `transform={translate(...)}`) and a\n`className`.\n\n## Installation\n\n```\nnpm install --save @visx/group\n```\n"
  },
  {
    "path": "packages/visx-group/package.json",
    "content": "{\n  \"name\": \"@visx/group\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx group\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\",\n    \"svg\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-group/src/Group.tsx",
    "content": "import type { ReactNode, Ref, SVGProps } from 'react';\nimport cx from 'classnames';\n\nexport type GroupProps = {\n  /** Top offset applied to `<g/>`. */\n  top?: number;\n  /** Left offset applied to `<g/>`. */\n  left?: number;\n  /** Override `top` and `left` to provide the entire `transform` string. */\n  transform?: string;\n  /** className to apply to `<g/>`. */\n  className?: string;\n  children?: ReactNode;\n  /** ref to underlying `<g/>`. */\n  innerRef?: Ref<SVGGElement>;\n};\n\nexport default function Group({\n  top = 0,\n  left = 0,\n  transform,\n  className,\n  children,\n  innerRef,\n  ...restProps\n}: GroupProps & Omit<SVGProps<SVGGElement>, keyof GroupProps>) {\n  return (\n    <g\n      ref={innerRef}\n      className={cx('visx-group', className)}\n      transform={transform || `translate(${left}, ${top})`}\n      {...restProps}\n    >\n      {children}\n    </g>\n  );\n}\n"
  },
  {
    "path": "packages/visx-group/src/index.ts",
    "content": "// @visx/group\nexport { default as Group } from './Group';\n"
  },
  {
    "path": "packages/visx-group/test/Group.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Group } from '../src';\n\ndescribe('<Group />', () => {\n  test('it should be defined', () => {\n    expect(Group).toBeDefined();\n  });\n\n  test(\"it should have class='visx-group'\", () => {\n    const { container } = render(\n      <svg>\n        <Group />\n      </svg>,\n    );\n    const group = container.querySelector('.visx-group');\n    expect(group).toBeInTheDocument();\n  });\n\n  test('it should default props top=0 left=0', () => {\n    const { container } = render(\n      <svg>\n        <Group />\n      </svg>,\n    );\n    const group = container.querySelector('.visx-group');\n    expect(group?.getAttribute('transform')).toBe('translate(0, 0)');\n  });\n\n  test('it should set props top, left, className', () => {\n    const { container } = render(\n      <svg>\n        <Group className=\"test\" top={3} left={4} />\n      </svg>,\n    );\n    const group = container.querySelector('.visx-group');\n    expect(group?.getAttribute('transform')).toBe('translate(4, 3)');\n    expect(group?.getAttribute('class')).toBe('visx-group test');\n  });\n\n  test('it should set restProps', () => {\n    const { container } = render(\n      <svg>\n        <Group clipPath=\"url(#myClip)\" stroke=\"mapleSyrup\" />\n      </svg>,\n    );\n    const group = container.querySelector('.visx-group');\n    expect(group?.getAttribute('clip-path')).toBe('url(#myClip)');\n    expect(group?.getAttribute('stroke')).toBe('mapleSyrup');\n  });\n});\n"
  },
  {
    "path": "packages/visx-group/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-group/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-group/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/group',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-group/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/group': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-heatmap/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-heatmap/Readme.md",
    "content": "# @visx/heatmap\n\n<a title=\"@visx/heatmap npm downloads\" href=\"https://www.npmjs.com/package/@visx/heatmap\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/heatmap.svg?style=flat-square\" />\n</a>\n\nA Heatmap is an arrangement of shapes where the data values are represented as colors.\n\n## Example\n\n<img style=\"display:block; width:34vw;\" src=\"http://i.imgur.com/OzSD3X3.png\">\n\n```js\n<HeatmapRect\n  data={data}\n  xScale={xScale}\n  yScale={yScale}\n  colorScale={colorScale}\n  opacityScale={opacityScale}\n  binWidth={bWidth}\n  binHeight={bWidth}\n  step={dStep}\n  gap={0}\n/>\n```\n\nHeatmaps generally require structure that has this shape:\n\n```js\n[\n  {\n    bin: 1,\n    bins: [\n      {\n        count: 20,\n        bin: 23,\n      },\n    ],\n  },\n];\n```\n\nHowever, you're welcome to use your own structure by defining `x`, `y`, `z` accessors such as:\n\n```js\n// Example accessors\nconst x = (d) => d.myBin;\nconst y = (d) => d.myBins;\nconst z = (d) => d.myCount;\n\n// Example scale with an accessors\nconst xScale = scaleLinear({\n  range: [0, xMax],\n  domain: extent(data, x),\n});\n```\n\n## Installation\n\n```\nnpm install --save @visx/heatmap\n```\n"
  },
  {
    "path": "packages/visx-heatmap/package.json",
    "content": "{\n  \"name\": \"@visx/heatmap\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx heatmap\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-heatmap/src/heatmaps/HeatmapCircle.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { GenericCell, ColorScale, OpacityScale } from '../types';\n\nexport type HeatmapCircleProps<ColumnDatum, BinDatum> = {\n  /** Array of column data (one per column desired) for the heatmap. */\n  data?: ColumnDatum[];\n  /** Left offset applied to heatmap wrapper g element. */\n  left?: number;\n  /** Top offset applied to heatmap wrapper g element. */\n  top?: number;\n  /** Pixel gap between heatmap circles. */\n  gap?: number;\n  /** Pixel radius of heatmap circles. */\n  radius?: number;\n  /** Given a column index, returns the x position of a circle cell. */\n  xScale: (columnIndex: number) => number;\n  /** Given a row index, returns the y position of a circle cell. */\n  yScale: (rowIndex: number) => number;\n  /** Given a count value, returns the desired circle fill color. */\n  colorScale?: ColorScale;\n  /** Given a count value, returns the desired circle fill opacity. */\n  opacityScale?: OpacityScale;\n  /** Accessor that returns an array of cell BinDatums (rows) for the provided ColumnData. */\n  bins?: (column: ColumnDatum) => BinDatum[];\n  /** Accessor that returns the count for the provided Bin. */\n  count?: (bin: BinDatum) => number;\n  /** className to apply to each heatmap circle element. */\n  className?: string;\n  /** Render function override, provided with heatmap. */\n  children?: (cells: CircleCell<ColumnDatum, BinDatum>[][]) => ReactNode;\n};\n\nexport type CircleCell<ColumnDatum, BinDatum> = GenericCell<ColumnDatum, BinDatum> & {\n  /** Computed radius for the circle (radius - gap). */\n  r: number;\n  /** Input radius for the circle including specified gap. */\n  radius: number;\n  /** x position of the cell circle center. */\n  cx: number;\n  /** y position of the cell circle center. */\n  cy: number;\n};\n\nexport default function HeatmapCircle<ColumnDatum, BinDatum>({\n  className,\n  top,\n  left,\n  data = [],\n  gap = 1,\n  radius = 6,\n  xScale,\n  yScale,\n  colorScale = () => undefined,\n  opacityScale = () => 1,\n  bins = (column: any) => column?.bins, // eslint-disable-line @typescript-eslint/no-explicit-any\n  count = (cell: any) => cell?.count, // eslint-disable-line @typescript-eslint/no-explicit-any\n  children,\n  ...restProps\n}: HeatmapCircleProps<ColumnDatum, BinDatum> &\n  Omit<\n    SVGProps<SVGCircleElement>,\n    keyof HeatmapCircleProps<ColumnDatum, BinDatum> | 'r' | 'cx' | 'cy' | 'fill' | 'fillOpacity'\n  >) {\n  const innerRadius = radius - gap;\n\n  const heatmap: CircleCell<ColumnDatum, BinDatum>[][] = data.map((columnDatum, column) => {\n    const x = xScale(column);\n    return bins(columnDatum).map((bin, row) => {\n      const countValue = count(bin);\n      return {\n        bin,\n        row,\n        column,\n        datum: columnDatum,\n        radius,\n        gap,\n        count: countValue,\n        cx: radius + x,\n        cy: yScale(row) + gap + radius,\n        r: innerRadius,\n        opacity: opacityScale(countValue),\n        color: colorScale(countValue),\n      };\n    });\n  });\n\n  if (children) return <>{children(heatmap)}</>;\n\n  return (\n    <Group className=\"visx-heatmap-circles\" top={top} left={left}>\n      {heatmap.map((columns) =>\n        columns.map((bin) => (\n          <circle\n            key={`heatmap-tile-circle-${bin.row}-${bin.column}`}\n            className={cx('visx-heatmap-circle', className)}\n            r={bin.r}\n            cx={bin.cx}\n            cy={bin.cy}\n            fill={bin.color}\n            fillOpacity={bin.opacity}\n            {...restProps}\n          />\n        )),\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-heatmap/src/heatmaps/HeatmapRect.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { GenericCell, ColorScale, OpacityScale } from '../types';\n\nexport type HeatmapRectProps<ColumnDatum, BinDatum> = {\n  /** Array of column data (one per column desired) for the heatmap. */\n  data?: ColumnDatum[];\n  /** Left offset applied to heatmap wrapper g element. */\n  left?: number;\n  /** Top offset applied to heatmap wrapper g element. */\n  top?: number;\n  /** Width of a rect bin. */\n  binWidth?: number;\n  /** Height of a rect bin. */\n  binHeight?: number;\n  /**  */\n  x0?: number;\n  /** Pixel gap between heatmap rects. */\n  gap?: number;\n  /** Given a column index, returns the x position of a rect cell. */\n  xScale: (columnIndex: number) => number;\n  /** Given a row index, returns the y position of a rect cell. */\n  yScale: (rowIndex: number) => number;\n  /** Given a count value, returns the desired rect fill color. */\n  colorScale?: ColorScale;\n  /** Given a count value, returns the desired rect fill opacity. */\n  opacityScale?: OpacityScale;\n  /** Accessor that returns an array of cell BinDatums (rows) for the provided ColumnData. */\n  bins?: (column: ColumnDatum) => BinDatum[];\n  /** Accessor that returns the count for the provided Bin. */\n  count?: (bin: BinDatum) => number;\n  /** className to apply to each heatmap rect element. */\n  className?: string;\n  /** Render function override, provided with heatmap. */\n  children?: (cells: RectCell<ColumnDatum, BinDatum>[][]) => ReactNode;\n};\n\nexport type RectCell<ColumnDatum, BinDatum> = GenericCell<ColumnDatum, BinDatum> & {\n  /** binWidth less grid gap (effective width). */\n  width: number;\n  /** binHeight less grid gap (effective height). */\n  height: number;\n  /** x position of the cell rect. */\n  x: number;\n  /** y position of the cell rect. */\n  y: number;\n};\n\nexport type ComponentProps<ColumnDatum, BinDatum> = HeatmapRectProps<ColumnDatum, BinDatum> &\n  Omit<\n    SVGProps<SVGRectElement>,\n    | keyof HeatmapRectProps<ColumnDatum, BinDatum>\n    | 'width'\n    | 'height'\n    | 'x'\n    | 'y'\n    | 'fill'\n    | 'fillOpacity'\n  >;\n\nexport default function HeatmapRect<ColumnDatum, BinDatum>({\n  className,\n  top,\n  left,\n  data = [],\n  binWidth = 6,\n  binHeight = 6,\n  x0 = 0,\n  gap = 1,\n  xScale,\n  yScale,\n  colorScale = () => undefined,\n  opacityScale = () => 1,\n  bins = (d: any) => d?.bins, // eslint-disable-line @typescript-eslint/no-explicit-any\n  count = (d: any) => d?.count, // eslint-disable-line @typescript-eslint/no-explicit-any\n  children,\n  ...restProps\n}: ComponentProps<ColumnDatum, BinDatum>) {\n  const width = binWidth - gap;\n  const height = binHeight - gap;\n\n  const heatmap: RectCell<ColumnDatum, BinDatum>[][] = data.map((datum, column) => {\n    const x = xScale(column);\n    return bins(datum).map((bin, row) => {\n      const countValue = count(bin);\n      return {\n        bin,\n        row,\n        column,\n        datum,\n        width,\n        height,\n        gap,\n        count: countValue,\n        x: x + x0,\n        y: yScale(row) + gap,\n        color: colorScale(countValue),\n        opacity: opacityScale(countValue),\n      };\n    });\n  });\n\n  if (children) return <>{children(heatmap)}</>;\n\n  return (\n    <Group className=\"visx-heatmap-rects\" top={top} left={left}>\n      {heatmap.map((_bins) =>\n        _bins.map((bin) => (\n          <rect\n            key={`heatmap-tile-rect-${bin.row}-${bin.column}`}\n            className={cx('visx-heatmap-rect', className)}\n            width={bin.width}\n            height={bin.height}\n            x={bin.x}\n            y={bin.y}\n            fill={bin.color}\n            fillOpacity={bin.opacity}\n            {...restProps}\n          />\n        )),\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-heatmap/src/index.ts",
    "content": "// @visx/heatmap\nexport { default as HeatmapCircle } from './heatmaps/HeatmapCircle';\nexport { default as HeatmapRect } from './heatmaps/HeatmapRect';\n\nexport type * from './types';\nexport type { CircleCell, HeatmapCircleProps } from './heatmaps/HeatmapCircle';\nexport type {\n  ComponentProps as HeatmapRectComponentProps,\n  HeatmapRectProps,\n  RectCell,\n} from './heatmaps/HeatmapRect';\n"
  },
  {
    "path": "packages/visx-heatmap/src/types.ts",
    "content": "export interface GenericCell<ColumnDatum, BinDatum> {\n  /** BinDatum for cell. */\n  bin: BinDatum;\n  /** Cell row index. */\n  row: number;\n  /** Cell column index. */\n  column: number;\n  /** ColumnDatum for the cell. */\n  datum: ColumnDatum;\n  /** Cell gap specified. */\n  gap: number;\n  /** Count returned for this BinDatum. */\n  count?: number | null;\n  /** Opacity returned for this BinDatum's count. */\n  opacity: number | undefined;\n  /** Color returned for this BinDatum's count. */\n  color: string | undefined;\n}\n\nexport type ColorScale = (count: number | { valueOf(): number }) => string | undefined;\n\nexport type OpacityScale = (count: number | { valueOf(): number }) => number | undefined;\n"
  },
  {
    "path": "packages/visx-heatmap/test/HeatmapCircle.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { HeatmapCircle } from '../src';\n\nconst data: {\n  bin: number;\n  bins: { bin: number; count: number }[];\n}[] = [{ bin: 0, bins: [{ bin: 0, count: 1 }] }];\n\nconst xScale = () => 50;\nconst yScale = () => 50;\n\ndescribe('<HeatmapCircle />', () => {\n  test('it should be defined', () => {\n    expect(HeatmapCircle).toBeDefined();\n  });\n\n  test('it should have the .visx-heatmap-circles class', () => {\n    expect.assertions(1);\n    const { container } = render(\n      <svg>\n        <HeatmapCircle data={data} xScale={xScale} yScale={yScale} />\n      </svg>,\n    );\n    expect(container.querySelector('.visx-heatmap-circles')).toBeInTheDocument();\n  });\n\n  test('it should have the .visx-heatmap-circle class', () => {\n    expect.assertions(2);\n    const { container } = render(\n      <svg>\n        <HeatmapCircle data={data} xScale={xScale} yScale={yScale} className=\"test\" />\n      </svg>,\n    );\n    const circle = container.querySelector('circle');\n    expect(circle).toHaveClass('visx-heatmap-circle');\n    expect(circle).toHaveClass('test');\n  });\n\n  test('it should set <circle /> r to radius - gap', () => {\n    expect.assertions(1);\n    const { container } = render(\n      <svg>\n        <HeatmapCircle data={data} xScale={xScale} yScale={yScale} radius={10} gap={2} />\n      </svg>,\n    );\n    expect(container.querySelector('circle')).toHaveAttribute('r', '8');\n  });\n});\n"
  },
  {
    "path": "packages/visx-heatmap/test/HeatmapRect.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { HeatmapRect } from '../src';\n\nconst data = [{ bin: 0, bins: [{ bin: 0, count: 1 }] }];\n\nconst xScale = () => 50;\nconst yScale = () => 50;\n\ndescribe('<HeatmapRect />', () => {\n  test('it should be defined', () => {\n    expect(HeatmapRect).toBeDefined();\n  });\n\n  test('it should have the .visx-heatmap-rects class', () => {\n    const { container } = render(\n      <svg>\n        <HeatmapRect data={data} xScale={xScale} yScale={yScale} />\n      </svg>,\n    );\n    const group = container.querySelector('svg g');\n    expect(group).toHaveClass('visx-heatmap-rects');\n  });\n\n  test('it should have the .visx-heatmap-rect class', () => {\n    const { container } = render(\n      <svg>\n        <HeatmapRect data={data} xScale={xScale} yScale={yScale} className=\"test\" />\n      </svg>,\n    );\n    const rect = container.querySelector('svg rect');\n    expect(rect).not.toBeNull();\n    expect(rect).toHaveClass('visx-heatmap-rect');\n    expect(rect).toHaveClass('test');\n  });\n\n  test('it should set <rect /> width & height to bin{Width,Height} - gap', () => {\n    const { container } = render(\n      <svg>\n        <HeatmapRect\n          data={data}\n          xScale={xScale}\n          yScale={yScale}\n          binWidth={10}\n          binHeight={14}\n          gap={2}\n        />\n      </svg>,\n    );\n    const rect = container.querySelector('svg rect');\n    expect(rect).not.toBeNull();\n    expect(rect).toHaveAttribute('width', '8');\n    expect(rect).toHaveAttribute('height', '12');\n  });\n});\n"
  },
  {
    "path": "packages/visx-heatmap/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-heatmap/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-heatmap/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/heatmap',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-heatmap/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/heatmap': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-hierarchy/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-hierarchy/Readme.md",
    "content": "# @visx/hierarchy\n\n<a title=\"@visx/hierarchy npm downloads\" href=\"https://www.npmjs.com/package/@visx/hierarchy\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/hierarchy.svg?style=flat-square\" />\n</a>\n\nMany datasets are intrinsically hierarchical. This package contains several `react` components for\nvisualizing hierarchical data and largely mirrors\n[`d3-hierarchy`](https://github.com/d3/d3-hierarchy).\n\nMany components take the same input `hierarchy` data root node as defined in as specified in the\n[`d3-hierarchy`](https://github.com/d3/d3-hierarchy) module. For convenience, this package also\nexports the [`d3-hierarchy`](https://github.com/d3/d3-hierarchy)utility to generate this format.\n\n```js\n// equivalent to `import { hierarchy } from 'd3-hierarchy';`\nimport { hierarchy } from '@visx/hierarchy';\n\nconst root = hierarchy({\n  name: 'root',\n  children: [\n    { name: 'child #1' },\n    {\n      name: 'child #2',\n      children: [{ name: 'grandchild #1' }, { name: 'grandchild #2' }, { name: 'grandchild #3' }],\n    },\n  ],\n});\n```\n\n## Installation\n\n```\nnpm install --save @visx/hierarchy\n```\n"
  },
  {
    "path": "packages/visx-hierarchy/package.json",
    "content": "{\n  \"name\": \"@visx/hierarchy\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx tree\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"d3\",\n    \"react\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/d3-hierarchy\": \"^1.1.6\",\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\",\n    \"d3-hierarchy\": \"^1.1.4\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/HierarchyDefaultLink.tsx",
    "content": "type Node = { x: number; y: number };\n\nexport type LinkProps = {\n  link?: { source: Node; target: Node };\n};\n\nconst DEFAULT_LINK = { source: { x: 0, y: 0 }, target: { x: 0, y: 0 } };\n\nexport default function HierarchyDefaultLink({ link = DEFAULT_LINK }: LinkProps) {\n  return (\n    <line\n      x1={link.source.x}\n      y1={link.source.y}\n      x2={link.target.x}\n      y2={link.target.y}\n      strokeWidth={2}\n      stroke=\"#999\"\n      strokeOpacity={0.6}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/HierarchyDefaultNode.tsx",
    "content": "export type NodeProps = {\n  node?: { x: number; y: number; r?: number };\n};\n\nexport default function HierarchyDefaultNode({ node = { x: 0, y: 0, r: 15 } }: NodeProps) {\n  return <circle cx={node.x} cy={node.y} r={node.r || 15} fill=\"#21D4FD\" />;\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/HierarchyDefaultRectNode.tsx",
    "content": "export type NodeProps = {\n  node: { x0: number; x1: number; y0: number; y1: number };\n};\n\nexport default function HierarchyDefaultRectNode({ node: { x0, x1, y0, y1 } }: NodeProps) {\n  return <rect x={x0} y={y0} width={Math.abs(x1 - x0)} height={Math.abs(y1 - y0)} fill=\"#21D4FD\" />;\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/hierarchies/Cluster.tsx",
    "content": "import { createElement } from 'react';\nimport type { ReactNode, FunctionComponent, ComponentClass } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { HierarchyNode, HierarchyPointNode, HierarchyPointLink } from 'd3-hierarchy';\nimport { cluster as d3cluster } from 'd3-hierarchy';\nimport DefaultLink from '../HierarchyDefaultLink';\nimport DefaultNode from '../HierarchyDefaultNode';\n\nexport type NodeComponentProps<Datum> = { node: HierarchyPointNode<Datum> };\nexport type LinkComponentProps<Datum> = { link: HierarchyPointLink<Datum> };\n\nexport type ClusterProps<Datum> = {\n  /** The root hierarchy node from which to derive the treemap layout. */\n  root: HierarchyNode<Datum>;\n  /** Render override function which is passed the computed cluster layout data. */\n  children?: (pack: HierarchyPointNode<Datum>) => ReactNode;\n  /** top offset applied to the g element container. */\n  top?: number;\n  /** left offset applied to the g element container. */\n  left?: number;\n  /** className applied to the g element container. */\n  className?: string;\n  /**\n   * Sets this cluster layout’s size to the specified two-element array of numbers `[width, height]`.\n   * This is an arbitrary coordinate system, e.g., for a radial layout, a size of `[360, radius]`\n   * corresponds to a breadth of 360° and a depth of radius.\n   */\n  size?: [number, number];\n  /**\n   * Sets this cluster layout’s node size to the specified two-element array of numbers `[width, height]`.\n   * If unset, layout size is used instead.  When a node size is specified, the root node is always\n   * positioned at `⟨0, 0⟩`.\n   */\n  nodeSize?: [number, number];\n  /** Sets the separation accessor, used to separate neighboring leaves. */\n  separation?: (a: HierarchyPointNode<Datum>, b: HierarchyPointNode<Datum>) => number;\n  /** Component which renders a single cluster link, passed the link object. */\n  linkComponent?:\n    | FunctionComponent<LinkComponentProps<Datum>>\n    | ComponentClass<LinkComponentProps<Datum>>;\n  /** Component which renders a single cluster node, passed the node object. */\n  nodeComponent?:\n    | FunctionComponent<NodeComponentProps<Datum>>\n    | ComponentClass<NodeComponentProps<Datum>>;\n};\n\nexport default function Cluster<Datum>({\n  top,\n  left,\n  className,\n  root,\n  size,\n  nodeSize,\n  separation,\n  children,\n  linkComponent = DefaultLink,\n  nodeComponent = DefaultNode,\n}: ClusterProps<Datum>) {\n  const cluster = d3cluster<Datum>();\n  if (size) cluster.size(size);\n  if (nodeSize !== undefined) cluster.nodeSize(nodeSize);\n  if (separation) cluster.separation(separation);\n\n  const data = cluster(root);\n\n  if (children) return <>{children(data)}</>;\n\n  return (\n    <Group top={top} left={left} className={cx('visx-cluster', className)}>\n      {linkComponent &&\n        data\n          .links()\n          .map((link, i) => (\n            <Group key={`cluster-link-${i}`}>{createElement(linkComponent, { link })}</Group>\n          ))}\n      {nodeComponent &&\n        data\n          .descendants()\n          .map((node, i) => (\n            <Group key={`cluster-node-${i}`}>{createElement(nodeComponent, { node })}</Group>\n          ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/hierarchies/Pack.tsx",
    "content": "import { createElement } from 'react';\nimport type { ReactNode, FunctionComponent, ComponentClass } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { HierarchyNode, HierarchyCircularNode } from 'd3-hierarchy';\nimport { pack as d3pack } from 'd3-hierarchy';\nimport DefaultNode from '../HierarchyDefaultNode';\n\nexport type PackProps<Datum> = {\n  /** The root hierarchy node from which to derive the pack layout. */\n  root: HierarchyNode<Datum>;\n  /** Render override function which is passed the computed pack layout data. */\n  children?: (pack: HierarchyCircularNode<Datum>) => ReactNode;\n  /** top offset applied to the g element container. */\n  top?: number;\n  /** left offset applied to the g element container. */\n  left?: number;\n  /** className applied to the g element container. */\n  className?: string;\n  /**\n   * Radius accessor function which defines the radius of each leaf node.\n   * If the radius accessor is null, the radius of each leaf circle is derived\n   * from the leaf node.value, and scaled proportionally to fit within\n   * the defined layout `size`.\n   */\n  radius?: (node: HierarchyNode<Datum>) => number;\n  /** Sets the pack layout size to the defined [width, height]. */\n  size?: [number, number];\n  /**\n   * Sets this pack layout's padding accessor to the specified number or function,\n   * which determines approximate separation of nodes in the resulting pack.\n   */\n  padding?: number;\n  /** Component which renders a single pack node, passed the node object. */\n  nodeComponent?:\n    | FunctionComponent<NodeComponentProps<Datum>>\n    | ComponentClass<NodeComponentProps<Datum>>;\n};\n\nexport type NodeComponentProps<Datum> = { node: HierarchyCircularNode<Datum> };\n\nexport default function Pack<Datum>({\n  top,\n  left,\n  className,\n  root,\n  radius,\n  size,\n  padding,\n  children,\n  nodeComponent = DefaultNode,\n}: PackProps<Datum>) {\n  const pack = d3pack<Datum>();\n  if (size) pack.size(size);\n  if (radius !== undefined) pack.radius(radius);\n  if (padding) pack.padding(padding);\n\n  const data = pack(root);\n\n  if (children) return <>{children(data)}</>;\n\n  return (\n    <Group top={top} left={left} className={cx('visx-pack', className)}>\n      {nodeComponent &&\n        data\n          .descendants()\n          .map((node, i) => (\n            <Group key={`pack-node-${i}`}>{createElement(nodeComponent, { node })}</Group>\n          ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/hierarchies/Partition.tsx",
    "content": "import { createElement } from 'react';\nimport type { ReactNode, FunctionComponent, ComponentClass } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { HierarchyNode, HierarchyRectangularNode } from 'd3-hierarchy';\nimport { partition as d3partition } from 'd3-hierarchy';\nimport DefaultNode from '../HierarchyDefaultRectNode';\n\nexport type NodeComponentProps<Datum> = { node: HierarchyRectangularNode<Datum> };\n\nexport type PartitionProps<Datum> = {\n  /** The root hierarchy node from which to derive the treemap layout. */\n  root: HierarchyNode<Datum>;\n  /** Render override function which is passed the computed partition layout data. */\n  children?: (pack: HierarchyRectangularNode<Datum>) => ReactNode;\n  /** top offset applied to the g element container. */\n  top?: number;\n  /** left offset applied to the g element container. */\n  left?: number;\n  /** className applied to the g element container. */\n  className?: string;\n  /** Sets this partition layout’s size to the specified two-element array of numbers `[width, height]` . */\n  size?: [number, number];\n  /** Whether partition layout rounds values. */\n  round?: boolean;\n  /** Sets padding, used to separate a node’s adjacent children. */\n  padding?: number;\n  /** Component which renders a single cluster node, passed the node object. */\n  nodeComponent?:\n    | FunctionComponent<NodeComponentProps<Datum>>\n    | ComponentClass<NodeComponentProps<Datum>>;\n};\n\nexport default function Partition<Datum>({\n  top,\n  left,\n  className,\n  root,\n  size,\n  round,\n  padding,\n  children,\n  nodeComponent = DefaultNode,\n}: PartitionProps<Datum>) {\n  const partition = d3partition<Datum>();\n  if (size) partition.size(size);\n  if (round) partition.round(round);\n  if (padding) partition.padding(padding);\n\n  const data = partition(root);\n\n  if (children) return <>{children(data)}</>;\n\n  return (\n    <Group top={top} left={left} className={cx('visx-partition', className)}>\n      {nodeComponent &&\n        data\n          .descendants()\n          .map((node, i) => (\n            <Group key={`partition-node-${i}`}>{createElement(nodeComponent, { node })}</Group>\n          ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/hierarchies/Tree.tsx",
    "content": "import { createElement } from 'react';\nimport type { ReactNode, FunctionComponent, ComponentClass } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { HierarchyNode, HierarchyPointNode, HierarchyPointLink } from 'd3-hierarchy';\nimport { tree as d3tree } from 'd3-hierarchy';\nimport DefaultLink from '../HierarchyDefaultLink';\nimport DefaultNode from '../HierarchyDefaultNode';\n\nexport type NodeComponentProps<Datum> = { node: HierarchyPointNode<Datum> };\nexport type LinkComponentProps<Datum> = { link: HierarchyPointLink<Datum> };\n\nexport type TreeProps<Datum> = {\n  /** The root hierarchy node from which to derive the tree layout. */\n  root: HierarchyNode<Datum>;\n  /** Render override function which is passed the computed cluster layout data. */\n  children?: (pack: HierarchyPointNode<Datum>) => ReactNode;\n  /** top offset applied to the g element container. */\n  top?: number;\n  /** left offset applied to the g element container. */\n  left?: number;\n  /** className applied to the g element container. */\n  className?: string;\n  /**\n   * Sets this tree layout’s size to the specified two-element array of numbers `[width, height]`.\n   * This is an arbitrary coordinate system, e.g., for a radial layout, a size of `[360, radius]`\n   * corresponds to a breadth of 360° and a depth of radius.\n   */\n  size?: [number, number];\n  /**\n   * Sets this tree layout’s node size to the specified two-element array of numbers `[width, height]`.\n   * If unset, layout size is used instead.  When a node size is specified, the root node is always\n   * positioned at `⟨0, 0⟩`.\n   */\n  nodeSize?: [number, number];\n  /**\n   * Sets the layout's separation accessor used to determine the separation of neighboring nodes.\n   * See https://github.com/d3/d3-hierarchy/blob/master/README.md#tree_separation for more.\n   */\n  separation?: (a: HierarchyPointNode<Datum>, b: HierarchyPointNode<Datum>) => number;\n  /** Component which renders a single cluster link, passed the link object. */\n  linkComponent?:\n    | FunctionComponent<LinkComponentProps<Datum>>\n    | ComponentClass<LinkComponentProps<Datum>>;\n  /** Component which renders a single cluster node, passed the node object. */\n  nodeComponent?:\n    | FunctionComponent<NodeComponentProps<Datum>>\n    | ComponentClass<NodeComponentProps<Datum>>;\n};\n\nexport default function Tree<Datum>({\n  top,\n  left,\n  className,\n  root,\n  size,\n  nodeSize,\n  separation,\n  children,\n  linkComponent = DefaultLink,\n  nodeComponent = DefaultNode,\n}: TreeProps<Datum>) {\n  const tree = d3tree<Datum>();\n  if (size) tree.size(size);\n  if (nodeSize) tree.nodeSize(nodeSize);\n  if (separation) tree.separation(separation);\n\n  const data = tree(root);\n\n  if (children) return <>{children(data)}</>;\n\n  return (\n    <Group top={top} left={left} className={cx('visx-tree', className)}>\n      {linkComponent &&\n        data\n          .links()\n          .map((link, i) => (\n            <Group key={`tree-link-${i}`}>{createElement(linkComponent, { link })}</Group>\n          ))}\n      {nodeComponent &&\n        data\n          .descendants()\n          .map((node, i) => (\n            <Group key={`tree-node-${i}`}>{createElement(nodeComponent, { node })}</Group>\n          ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/hierarchies/Treemap.tsx",
    "content": "import { createElement } from 'react';\nimport type { ReactNode, FunctionComponent, ComponentClass } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { HierarchyRectangularNode, HierarchyNode } from 'd3-hierarchy';\nimport { treemap as d3treemap } from 'd3-hierarchy';\nimport HierarchyDefaultRectNode from '../HierarchyDefaultRectNode';\nimport setNumberOrNumberAccessor from '../utils/setNumOrNumAccessor';\nimport type { TileMethod } from '../types';\n\nexport type NodeComponentProps<Datum> = { node: HierarchyRectangularNode<Datum> };\n\ntype NumerOrNumberAccessor<Datum> = number | ((node: HierarchyRectangularNode<Datum>) => number);\n\nexport type TreemapProps<Datum> = {\n  /** The root hierarchy node from which to derive the treemap layout. */\n  root: HierarchyNode<Datum>;\n  /** Render override function which is passed the computed pack layout data. */\n  children?: (pack: HierarchyRectangularNode<Datum>) => ReactNode;\n  /** top offset applied to the g element container. */\n  top?: number;\n  /** left offset applied to the g element container. */\n  left?: number;\n  /** className applied to the g element container. */\n  className?: string;\n  /**\n   * Sets the treemap tiling method to the specified function (exported from this package).\n   * See https://github.com/d3/d3-hierarchy#treemap for more.\n   */\n  tile?: TileMethod<Datum>;\n  /** Sets this treemap layout’s size to the specified two-element array of numbers [width, height]  */\n  size?: [number, number];\n  /** Whether to round treemap values. */\n  round?: boolean;\n  /** Sets both inner and outer padding to the specified number or accessor. */\n  padding?: NumerOrNumberAccessor<Datum>;\n  /** Sets padding used to separate a node’s adjacent children. */\n  paddingInner?: NumerOrNumberAccessor<Datum>;\n  /** Sets padding used to spearate a node from its children. */\n  paddingOuter?: NumerOrNumberAccessor<Datum>;\n  /** Sets padding used to spearate the top edge of a node from its children. */\n  paddingTop?: NumerOrNumberAccessor<Datum>;\n  /** Sets padding used to spearate the right edge of a node from its children. */\n  paddingRight?: NumerOrNumberAccessor<Datum>;\n  /** Sets padding used to spearate the bottom edge of a node from its children. */\n  paddingBottom?: NumerOrNumberAccessor<Datum>;\n  /** Sets padding used to spearate the left edge of a node from its children. */\n  paddingLeft?: NumerOrNumberAccessor<Datum>;\n  /** Component which renders a single pack node, passed the node object. */\n  nodeComponent?:\n    | FunctionComponent<NodeComponentProps<Datum>>\n    | ComponentClass<NodeComponentProps<Datum>>;\n};\n\nexport default function Treemap<Datum>({\n  top,\n  left,\n  className,\n  root,\n  tile,\n  size,\n  round,\n  padding,\n  paddingInner,\n  paddingOuter,\n  paddingTop,\n  paddingRight,\n  paddingBottom,\n  paddingLeft,\n  children,\n  nodeComponent = HierarchyDefaultRectNode,\n}: TreemapProps<Datum>) {\n  const treemap = d3treemap<Datum>();\n  if (tile) treemap.tile(tile);\n  if (size) treemap.size(size);\n  if (round) treemap.round(round);\n  if (padding) setNumberOrNumberAccessor(treemap.padding, padding);\n  if (paddingInner) setNumberOrNumberAccessor(treemap.paddingInner, paddingInner);\n  if (paddingOuter) setNumberOrNumberAccessor(treemap.paddingOuter, paddingOuter);\n  if (paddingTop) setNumberOrNumberAccessor(treemap.paddingTop, paddingTop);\n  if (paddingRight) setNumberOrNumberAccessor(treemap.paddingRight, paddingRight);\n  if (paddingBottom) setNumberOrNumberAccessor(treemap.paddingBottom, paddingBottom);\n  if (paddingLeft) setNumberOrNumberAccessor(treemap.paddingLeft, paddingLeft);\n\n  const data = treemap(root);\n\n  if (children) return <>{children(data)}</>;\n\n  return (\n    <Group top={top} left={left} className={cx('visx-treemap', className)}>\n      {nodeComponent &&\n        data\n          .descendants()\n          .map((node, i) => (\n            <Group key={`treemap-node-${i}`}>{createElement(nodeComponent, { node })}</Group>\n          ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/src/index.ts",
    "content": "// @visx/hierarchy\nexport { default as Tree } from './hierarchies/Tree';\nexport { default as Treemap } from './hierarchies/Treemap';\nexport { default as Cluster } from './hierarchies/Cluster';\nexport { default as Pack } from './hierarchies/Pack';\nexport { default as Partition } from './hierarchies/Partition';\nexport { default as HierarchyDefaultLink } from './HierarchyDefaultLink';\nexport { default as HierarchyDefaultNode } from './HierarchyDefaultNode';\nexport { default as HierarchyDefaultRectNode } from './HierarchyDefaultRectNode';\nexport {\n  hierarchy,\n  stratify,\n  treemapSquarify,\n  treemapBinary,\n  treemapResquarify,\n  treemapDice,\n  treemapSlice,\n  treemapSliceDice,\n} from 'd3-hierarchy';\n\nexport type * from './types';\nexport type { ClusterProps } from './hierarchies/Cluster';\nexport type { PackProps } from './hierarchies/Pack';\nexport type { PartitionProps } from './hierarchies/Partition';\nexport type { TreeProps } from './hierarchies/Tree';\nexport type { TreemapProps } from './hierarchies/Treemap';\n"
  },
  {
    "path": "packages/visx-hierarchy/src/types.ts",
    "content": "/** Re-export useful types from d3-hierarchy. */\nimport type { HierarchyRectangularNode } from 'd3-hierarchy';\n\nexport type {\n  HierarchyNode,\n  HierarchyRectangularNode,\n  HierarchyCircularNode,\n  HierarchyPointLink,\n  HierarchyPointNode,\n  HierarchyCircularLink,\n  HierarchyRectangularLink,\n  HierarchyLink,\n} from 'd3-hierarchy';\n\nexport type TileMethod<Datum> = (\n  n: HierarchyRectangularNode<Datum>,\n  x0: number,\n  y0: number,\n  x1: number,\n  y1: number,\n) => void;\n"
  },
  {
    "path": "packages/visx-hierarchy/src/utils/setNumOrNumAccessor.ts",
    "content": "/**\n * This is a workaround for TypeScript not inferring the correct\n * method overload/signature for some d3 shape methods.\n */\nexport default function setNumberOrNumberAccessor<NumAccessor>(\n  func: (d: number | NumAccessor) => void,\n  value: number | NumAccessor,\n) {\n  if (typeof value === 'number') func(value);\n  else func(value);\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/test/Cluster.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport { hierarchy } from 'd3-hierarchy';\nimport { Cluster } from '../src';\n\ntype Datum = { name: string; children: Datum[] };\nconst childrenFunc = vi.fn();\nconst mockHierarchy = hierarchy({\n  name: 'Eve',\n  children: [\n    { name: 'Cain' },\n    {\n      name: 'Seth',\n      children: [{ name: 'Enos' }, { name: 'Noam' }],\n    },\n  ],\n} as Datum);\n\ndescribe('<Cluster />', () => {\n  test('it should be defined', () => {\n    expect(Cluster).toBeDefined();\n  });\n\n  test('it should call children as a function with required args', () => {\n    render(<Cluster children={childrenFunc} root={mockHierarchy} />);\n    const args = childrenFunc.mock.calls[0][0];\n    expect(childrenFunc).toHaveBeenCalledTimes(1);\n    expect(args.data).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-hierarchy/test/Defaults.test.tsx",
    "content": "import {\n  HierarchyDefaultLink,\n  HierarchyDefaultNode,\n  HierarchyDefaultRectNode,\n  hierarchy,\n  stratify,\n  treemapBinary,\n  treemapDice,\n  treemapResquarify,\n  treemapSlice,\n  treemapSliceDice,\n  treemapSquarify,\n} from '../src';\n\ndescribe('<DefaultLink />', () => {\n  test('should be defined', () => {\n    expect(HierarchyDefaultLink).toBeDefined();\n  });\n});\n\ndescribe('<DefaultNode />', () => {\n  test('should be defined', () => {\n    expect(HierarchyDefaultNode).toBeDefined();\n  });\n});\n\ndescribe('<DefaultRectNode />', () => {\n  test('should be defined', () => {\n    expect(HierarchyDefaultRectNode).toBeDefined();\n  });\n});\n\ndescribe('d3 exports', () => {\n  test('should export hierarchy', () => {\n    expect(hierarchy).toBeDefined();\n  });\n\n  test('should export stratify', () => {\n    expect(stratify).toBeDefined();\n  });\n\n  test('should export treemap tiling functions', () => {\n    const tilers = [\n      treemapBinary,\n      treemapDice,\n      treemapResquarify,\n      treemapSlice,\n      treemapSliceDice,\n      treemapSquarify,\n    ];\n\n    expect.assertions(tilers.length);\n\n    tilers.forEach((tiler) => {\n      expect(tiler).toBeDefined();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-hierarchy/test/Tree.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport { hierarchy } from 'd3-hierarchy';\nimport { Tree } from '../src';\n\ntype Datum = { name: string; children: Datum[] };\nconst childrenFunc = vi.fn();\nconst mockHierarchy = hierarchy({\n  name: 'Eve',\n  children: [\n    { name: 'Cain' },\n    {\n      name: 'Seth',\n      children: [{ name: 'Enos' }, { name: 'Noam' }],\n    },\n  ],\n} as Datum);\n\ndescribe('<Tree />', () => {\n  afterEach(() => {\n    vi.clearAllMocks();\n  });\n\n  test('it should be defined', () => {\n    expect(Tree).toBeDefined();\n  });\n\n  test('it should call children as a function with required args', () => {\n    render(<Tree children={childrenFunc} root={mockHierarchy} />);\n    const args = childrenFunc.mock.calls[0][0];\n    expect(childrenFunc.mock.calls).toHaveLength(1);\n    expect(args.data).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-hierarchy/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-hierarchy/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-hierarchy/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/hierarchy',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-hierarchy/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/hierarchy': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-legend/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-legend/Readme.md",
    "content": "# @visx/legend\n\n<a title=\"@visx/legend npm downloads\" href=\"https://www.npmjs.com/package/@visx/legend\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/legend.svg?style=flat-square\" />\n</a>\n\nLegends associate shapes and colors to data, and are associated with scales.\n\n## Example\n\n```js\nimport { LegendThreshold } from '@visx/legend';\nimport { scaleThreshold } from '@visx/scale';\n\nconst threshold = scaleThreshold({\n  domain: [0.02, 0.04, 0.06, 0.08, 0.1],\n  range: ['#f2f0f7', '#dadaeb', '#bcbddc', '#9e9ac8', '#756bb1', '#54278f'],\n});\n\nfunction MyChart() {\n  return (\n    <div>\n      <svg>{/** chart stuff */}</svg>\n      <LegendThreshold\n        scale={threshold}\n        direction=\"column-reverse\"\n        itemDirection=\"row-reverse\"\n        labelMargin=\"0 20px 0 0\"\n        shapeMargin=\"1px 0 0\"\n      />\n    </div>\n  );\n}\n```\n\n## Installation\n\n```\nnpm install --save @visx/legend\n```\n"
  },
  {
    "path": "packages/visx-legend/package.json",
    "content": "{\n  \"name\": \"@visx/legend\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx legend\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-legend/src/index.ts",
    "content": "// @visx/legend\nexport { default as Legend } from './legends/Legend';\nexport { default as LegendQuantile } from './legends/Quantile';\nexport { default as LegendLinear } from './legends/Linear';\nexport { default as LegendOrdinal } from './legends/Ordinal';\nexport { default as LegendThreshold } from './legends/Threshold';\nexport { default as LegendSize } from './legends/Size';\nexport { default as LegendItem } from './legends/Legend/LegendItem';\nexport { default as LegendLabel } from './legends/Legend/LegendLabel';\nexport { default as LegendShape } from './legends/Legend/LegendShape';\nexport { default as CircleShape } from './shapes/Circle';\nexport { default as LineShape } from './shapes/Line';\nexport { default as RectShape } from './shapes/Rect';\n\nexport type * from './types';\nexport type { LegendProps } from './legends/Legend';\nexport type { LegendItemProps } from './legends/Legend/LegendItem';\nexport type { LegendLabelProps, LegendLabelOwnProps } from './legends/Legend/LegendLabel';\nexport type { LegendShapeProps } from './legends/Legend/LegendShape';\nexport type { LegendLinearProps } from './legends/Linear';\nexport type { LegendOrdinalProps } from './legends/Ordinal';\nexport type { LegendQuantileProps } from './legends/Quantile';\nexport type { LegendSizeProps } from './legends/Size';\nexport type { LegendThresholdProps } from './legends/Threshold';\nexport type { ShapeCircleProps } from './shapes/Circle';\nexport type { ShapeShapeLineProps } from './shapes/Line';\nexport type { ShapeRectProps } from './shapes/Rect';\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Legend/LegendItem.tsx",
    "content": "import type { ReactNode, HTMLProps } from 'react';\nimport type { FlexDirection } from '../../types';\n\nexport type LegendItemProps = {\n  /** Flex direction for the legend item layout. Determines if the shape and label are arranged horizontally or vertically. */\n  flexDirection?: FlexDirection;\n  /** CSS align-items property for vertical alignment of the legend item contents. */\n  alignItems?: string;\n  /** Margin around the legend item. */\n  margin?: string | number;\n  /** Child elements to render inside the legend item (typically LegendShape and LegendLabel). */\n  children?: ReactNode;\n  /** CSS display property for the legend item. */\n  display?: string;\n};\n\nexport default function LegendItem({\n  flexDirection = 'row',\n  alignItems = 'center',\n  margin = '0',\n  display = 'flex',\n  children,\n  ...restProps\n}: LegendItemProps & Omit<HTMLProps<HTMLDivElement>, keyof LegendItemProps>) {\n  return (\n    <div\n      className=\"visx-legend-item\"\n      style={{\n        display,\n        alignItems,\n        flexDirection,\n        margin,\n      }}\n      {...restProps}\n    >\n      {children}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Legend/LegendLabel.tsx",
    "content": "import type { ReactNode, HTMLProps } from 'react';\n\nexport type LegendLabelOwnProps = {\n  /** Horizontal alignment of the label text. Maps to CSS justify-content property. */\n  align?: string;\n  /** The label content to display. Can be a string or any React node. */\n  label?: ReactNode;\n  /** CSS flex property controlling how the label grows/shrinks in the legend item. */\n  flex?: string | number;\n  /** Margin around the label. */\n  margin?: string | number;\n  /** Child elements to render. If provided, overrides the label prop. */\n  children?: ReactNode;\n};\n\nexport type LegendLabelProps = LegendLabelOwnProps &\n  Omit<HTMLProps<HTMLDivElement>, keyof LegendLabelOwnProps>;\n\nexport default function LegendLabel({\n  flex = '1',\n  label,\n  margin = '5px 0',\n  align = 'left',\n  children,\n  ...restProps\n}: LegendLabelProps) {\n  return (\n    <div\n      className=\"visx-legend-label\"\n      style={{\n        justifyContent: align,\n        display: 'flex',\n        flex,\n        margin,\n      }}\n      {...restProps}\n    >\n      {children || label}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Legend/LegendShape.tsx",
    "content": "import ShapeRect from '../../shapes/Rect';\nimport renderShape from '../../util/renderShape';\nimport type {\n  FillAccessor,\n  FormattedLabel,\n  LegendShape as LegendShapeType,\n  SizeAccessor,\n  ShapeStyleAccessor,\n} from '../../types';\n\nexport type LegendShapeProps<Data, Output> = {\n  /** The formatted label object containing datum, index, text, and optional value */\n  label: FormattedLabel<Data, Output>;\n  /** The data item for this legend entry */\n  item: Data;\n  /** The index of this item in the legend */\n  itemIndex: number;\n  /** Margin around the shape */\n  margin?: string | number;\n  /** The shape component or function to render. Defaults to ShapeRect if not provided. */\n  shape?: LegendShapeType<Data, Output>;\n  /** Accessor function for the fill color of the shape */\n  fill?: FillAccessor<Data, Output>;\n  /** Accessor function for the size of the shape */\n  size?: SizeAccessor<Data, Output>;\n  /** Accessor function for additional shape styling */\n  shapeStyle?: ShapeStyleAccessor<Data, Output>;\n  /** Width of the shape container */\n  width?: string | number;\n  /** Height of the shape container */\n  height?: string | number;\n};\n\nexport default function LegendShape<Data, Output>({\n  shape = ShapeRect,\n  width,\n  height,\n  margin,\n  label,\n  item,\n  itemIndex,\n  fill,\n  size,\n  shapeStyle,\n}: LegendShapeProps<Data, Output>) {\n  return (\n    <div\n      className=\"visx-legend-shape\"\n      style={{\n        display: 'flex',\n        width: size ? size({ ...label }) : width,\n        height: size ? size({ ...label }) : height,\n        margin,\n      }}\n    >\n      {renderShape<Data, Output>({\n        shape,\n        item,\n        itemIndex,\n        label,\n        width,\n        height,\n        fill,\n        shapeStyle,\n      })}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Legend/index.tsx",
    "content": "import type { ReactNode, CSSProperties } from 'react';\nimport cx from 'classnames';\nimport type { AnyD3Scale, ScaleInput } from '@visx/scale';\nimport LegendItem from './LegendItem';\nimport type { LegendLabelProps } from './LegendLabel';\nimport LegendLabel from './LegendLabel';\nimport LegendShape from './LegendShape';\nimport valueOrIdentity, { valueOrIdentityString } from '../../util/valueOrIdentity';\nimport labelTransformFactory from '../../util/labelTransformFactory';\nimport type {\n  FlexDirection,\n  FormattedLabel,\n  LabelFormatter,\n  LabelFormatterFactory,\n  LegendShape as LegendShapeType,\n} from '../../types';\n\nexport type LegendProps<Scale extends AnyD3Scale> = {\n  /** Optional render function override. */\n  children?: (labels: FormattedLabel<ScaleInput<Scale>, ReturnType<Scale>>[]) => ReactNode;\n  /** Classname to be applied to legend container. */\n  className?: string;\n  /** Styles to be applied to the legend container. */\n  style?: CSSProperties;\n  /** Legend domain. */\n  domain?: ScaleInput<Scale>[];\n  /** Width of the legend shape. */\n  shapeWidth?: string | number;\n  /** Height of the legend shape. */\n  shapeHeight?: string | number;\n  /** Margin of the legend shape. */\n  shapeMargin?: string | number;\n  /** Flex-box alignment of legend item labels. */\n  labelAlign?: string;\n  /** `@visx/scale` or `d3-scale` object used to generate the legend items. */\n  scale: Scale;\n  /** Flex-box flex of legend item labels. */\n  labelFlex?: string | number;\n  /** Margin of legend item labels. */\n  labelMargin?: string | number;\n  /** Margin of legend items. */\n  itemMargin?: string | number;\n  /** Flex direction of the legend itself. */\n  direction?: FlexDirection;\n  /** Flex direction of legend items. */\n  itemDirection?: FlexDirection;\n  /** Legend item fill accessor function. */\n  fill?: (label: FormattedLabel<ScaleInput<Scale>, ReturnType<Scale>>) => string | undefined;\n  /** Legend item size accessor function. */\n  size?: (\n    label: FormattedLabel<ScaleInput<Scale>, ReturnType<Scale>>,\n  ) => string | number | undefined;\n  /** Legend shape string preset or Element or Component. */\n  shape?: LegendShapeType<ScaleInput<Scale>, ReturnType<Scale>>;\n  /** Styles applied to legend shapes. */\n  shapeStyle?: (label: FormattedLabel<ScaleInput<Scale>, ReturnType<Scale>>) => CSSProperties;\n  /** Given a legend item and its index, returns an item label. */\n  labelFormat?: LabelFormatter<ScaleInput<Scale>>;\n  /** Given the legend scale and labelFormatter, returns a label with datum, index, value, and label. */\n  labelTransform?: LabelFormatterFactory<Scale>;\n  /** Additional props to be set on LegendLabel. */\n  legendLabelProps?: Partial<LegendLabelProps>;\n};\n\nconst defaultStyle = {\n  display: 'flex',\n};\n\nexport default function Legend<Scale extends AnyD3Scale>({\n  className,\n  style = defaultStyle,\n  scale,\n  shape,\n  domain: inputDomain,\n  fill = valueOrIdentityString,\n  size = valueOrIdentityString,\n  labelFormat = valueOrIdentity,\n  labelTransform = labelTransformFactory,\n  shapeWidth = 15,\n  shapeHeight = 15,\n  shapeMargin = '2px 4px 2px 0',\n  shapeStyle,\n  labelAlign = 'left',\n  labelFlex = '1',\n  labelMargin = '0 4px',\n  itemMargin = '0',\n  direction = 'column',\n  itemDirection = 'row',\n  legendLabelProps,\n  children,\n  ...legendItemProps\n}: LegendProps<Scale>) {\n  // `Scale extends ScaleType` constraint is tricky\n  //  could consider removing `scale` altogether in the future and making `domain: Datum[]` required\n  const domain = inputDomain || ('domain' in scale ? scale.domain() : []);\n  const labelFormatter = labelTransform({ scale, labelFormat });\n  const labels = domain.map(labelFormatter);\n  if (children) return <>{children(labels)}</>;\n\n  return (\n    <div\n      className={cx('visx-legend', className)}\n      style={{\n        ...style,\n        flexDirection: direction,\n      }}\n    >\n      {labels.map((label, i) => (\n        <LegendItem\n          key={`legend-${label.text}-${i}`}\n          margin={itemMargin}\n          flexDirection={itemDirection}\n          {...legendItemProps}\n        >\n          <LegendShape\n            shape={shape}\n            height={shapeHeight}\n            width={shapeWidth}\n            margin={shapeMargin}\n            item={domain[i]}\n            itemIndex={i}\n            label={label}\n            fill={fill}\n            size={size}\n            shapeStyle={shapeStyle}\n          />\n          <LegendLabel\n            label={label.text}\n            flex={labelFlex}\n            margin={labelMargin}\n            align={labelAlign}\n            {...legendLabelProps}\n          />\n        </LegendItem>\n      ))}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Linear.tsx",
    "content": "import type { PickD3Scale } from '@visx/scale';\nimport type { LegendProps } from './Legend';\nimport Legend from './Legend';\nimport defaultDomain from '../util/defaultDomain';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyLinearScale = PickD3Scale<'linear', any>;\n\nexport type LegendLinearProps<Scale extends AnyLinearScale> = {\n  /** Number of discrete steps to show in the legend. The scale domain is divided into this many intervals. */\n  steps?: number;\n} & LegendProps<Scale>;\n\n/** Linear scales map from continuous inputs to continuous outputs. */\nexport default function Linear<Scale extends AnyLinearScale>({\n  scale,\n  domain: inputDomain,\n  steps = 5,\n  ...restProps\n}: LegendLinearProps<Scale>) {\n  const domain = inputDomain || defaultDomain({ steps, scale });\n  return <Legend<Scale> scale={scale} domain={domain} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Ordinal.tsx",
    "content": "import type { PickD3Scale } from '@visx/scale';\nimport type { LegendProps } from './Legend';\nimport Legend from './Legend';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyOrdinalScale = PickD3Scale<'ordinal', any, any>;\n\nexport type LegendOrdinalProps<Scale extends AnyOrdinalScale> = LegendProps<Scale>;\n\n/** Ordinal scales map from strings to an Output type. */\nexport default function Ordinal<Scale extends AnyOrdinalScale>(props: LegendOrdinalProps<Scale>) {\n  return <Legend<Scale> {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Quantile.tsx",
    "content": "import type { PickD3Scale } from '@visx/scale';\nimport type { LegendProps } from './Legend';\nimport Legend from './Legend';\nimport type { LabelFormatterFactory } from '../types';\nimport identity from '../util/identity';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyQuantileScale = PickD3Scale<'quantile', any>;\n\ntype FactoryProps = {\n  /** The delimiter string to use between the min and max values in the label (e.g., '-' renders as '0 - 10'). */\n  labelDelimiter?: string;\n};\n\nexport type LegendQuantileProps<Scale extends AnyQuantileScale> = LegendProps<Scale> & FactoryProps;\n\nfunction labelFormatterFactoryFactory<Scale extends AnyQuantileScale>({\n  labelDelimiter,\n}: FactoryProps): LabelFormatterFactory<Scale> {\n  return ({ scale, labelFormat }) =>\n    (datum, index) => {\n      const [x0, x1] = scale.invertExtent(scale(datum));\n      return {\n        extent: [x0, x1],\n        text: `${labelFormat(x0, index)} ${labelDelimiter} ${labelFormat(x1, index)}`,\n        value: scale(x0),\n        datum,\n        index,\n      };\n    };\n}\n\n/** A Quantile scale takes a number input and returns an Output. */\nexport default function Quantile<Scale extends AnyQuantileScale>({\n  domain: inputDomain,\n  scale,\n  labelFormat = identity,\n  labelTransform: inputLabelTransform,\n  labelDelimiter = '-',\n  ...restProps\n}: LegendQuantileProps<Scale>) {\n  // transform range into input values because it may contain more elements\n  const domain = inputDomain || scale.range().map((output) => scale.invertExtent(output)[0]);\n  const labelTransform =\n    inputLabelTransform || labelFormatterFactoryFactory<Scale>({ labelDelimiter });\n\n  return (\n    <Legend<Scale>\n      scale={scale}\n      domain={domain}\n      labelFormat={labelFormat}\n      labelTransform={labelTransform}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Size.tsx",
    "content": "import type { D3Scale } from '@visx/scale';\nimport type { LegendProps } from './Legend';\nimport Legend from './Legend';\nimport labelTransformFactory from '../util/labelTransformFactory';\nimport defaultDomain from '../util/defaultDomain';\nimport identity from '../util/identity';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnySizeScale = D3Scale<number, any, any>;\n\nexport type LegendSizeProps<Scale extends AnySizeScale> = {\n  /** Number of discrete steps to show in the legend. The scale domain is divided into this many intervals. */\n  steps?: number;\n} & LegendProps<Scale>;\n\n/**\n * A Size legend component that creates a legend with discrete size intervals.\n * Useful for visualizing continuous numeric data with size-based scales.\n */\nexport default function Size<Scale extends AnySizeScale>({\n  scale,\n  domain: inputDomain,\n  steps = 5,\n  labelFormat = identity,\n  labelTransform = labelTransformFactory,\n  ...restProps\n}: LegendSizeProps<Scale>) {\n  const domain = inputDomain || defaultDomain({ steps, scale });\n\n  return (\n    <Legend<Scale>\n      scale={scale}\n      domain={domain}\n      labelFormat={labelFormat}\n      labelTransform={labelTransform}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/legends/Threshold.tsx",
    "content": "import type { PickD3Scale, ScaleInput } from '@visx/scale';\nimport type { LegendProps } from './Legend';\nimport Legend from './Legend';\nimport type { LabelFormatterFactory } from '../types';\nimport identity from '../util/identity';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AnyThresholdScale = PickD3Scale<'threshold', any, any, any>;\n\nconst formatZero = (label: unknown) => (label === 0 ? '0' : label || '');\n\ntype TransformProps = {\n  /** The delimiter string to use between threshold values (e.g., '-' renders as '0 - 10'). */\n  labelDelimiter?: string;\n  /** The prefix to use for the lower threshold label (e.g., '<' renders as '< 10'). */\n  labelLower?: string;\n  /** The prefix to use for the upper threshold label (e.g., '>' renders as '> 100'). */\n  labelUpper?: string;\n};\n\nexport type LegendThresholdProps<Scale extends AnyThresholdScale> = LegendProps<Scale> &\n  TransformProps & {\n    labelTransform?: LabelFormatterFactory<Scale>;\n  };\n\n/** Default transform implicitly assumes that Datum is of type number. */\nfunction defaultTransform<Scale extends AnyThresholdScale>({\n  labelDelimiter,\n  labelLower,\n  labelUpper,\n}: TransformProps): LabelFormatterFactory<Scale> {\n  return ({ scale, labelFormat }) => {\n    const scaleRange = scale.range();\n\n    type Datum = ScaleInput<Scale>;\n\n    return (d, i) => {\n      const [d0, d1] =\n        scaleRange.length >= i ? scale.invertExtent(scaleRange[i]) : [undefined, undefined];\n\n      let delimiter = ` ${labelDelimiter} `;\n      let text = '';\n      let value: number | Datum | undefined;\n\n      if (d0 == null && typeof d1 === 'number') {\n        // lower threshold e.g., [undefined, number]\n        delimiter = labelLower || delimiter;\n        value = d1 - Math.abs(2 * d1 - 1); // guarantees a value smaller than the lower threshold\n        text = `${delimiter}${formatZero(labelFormat(d1, i))}`;\n      } else if (d0 != null && d1 != null) {\n        // threshold step\n        value = d;\n        text = `${formatZero(labelFormat(d0, i))}${delimiter}${formatZero(labelFormat(d1, i))}`;\n      } else if (typeof d0 === 'number' && d1 == null) {\n        // upper threshold e.g., [number, undefined]\n        delimiter = labelUpper || delimiter;\n        value = d0 + Math.abs(2 * d0 + 1); // // guarantees a value larger than the upper threshold\n        text = `${delimiter}${formatZero(labelFormat(d0, i))}`;\n      }\n\n      return {\n        extent: [d0, d1],\n        value: scale(value),\n        text,\n        datum: d,\n        index: i,\n      };\n    };\n  };\n}\n\n/**\n * A Threshold legend component for threshold scales.\n * Threshold scales map continuous input values to discrete output values based on threshold boundaries.\n * This component displays the threshold ranges with customizable delimiters and labels.\n */\nexport default function Threshold<Scale extends AnyThresholdScale>({\n  scale,\n  domain: inputDomain,\n  labelFormat = identity,\n  labelTransform: inputLabelTransform,\n  labelDelimiter = 'to',\n  labelLower = 'Less than ',\n  labelUpper = 'More than ',\n  ...restProps\n}: LegendThresholdProps<Scale>) {\n  // d3 docs specify that for n values in a domain, there should be n+1 values in the range\n  // https://github.com/d3/d3-scale#threshold_domain\n  // therefore if a domain is not specified we transform the range into input values\n  // because it should contain more elements\n\n  const domain =\n    inputDomain || scale.range().map((output) => scale.invertExtent(output)[0] as Range);\n\n  const labelTransform =\n    inputLabelTransform ||\n    defaultTransform<Scale>({\n      labelDelimiter,\n      labelLower,\n      labelUpper,\n    });\n\n  return (\n    <Legend<Scale>\n      scale={scale}\n      domain={domain}\n      labelFormat={labelFormat}\n      labelTransform={labelTransform}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/shapes/Circle.tsx",
    "content": "import type { CSSProperties } from 'react';\nimport { Group } from '@visx/group';\n\nexport type ShapeCircleProps = {\n  /** The fill color for the circle. */\n  fill?: string;\n  /** Width of the container. The circle radius is derived from max(width, height). */\n  width?: string | number;\n  /** Height of the container. The circle radius is derived from max(width, height). */\n  height?: string | number;\n  /** Additional CSS styles to apply to the circle. */\n  style?: CSSProperties;\n};\n\nexport default function ShapeCircle({ fill, width, height, style }: ShapeCircleProps) {\n  const cleanWidth = typeof width === 'string' || typeof width === 'undefined' ? 0 : width;\n  const cleanHeight = typeof height === 'string' || typeof height === 'undefined' ? 0 : height;\n  const size = Math.max(cleanWidth, cleanHeight);\n  const radius = size / 2;\n  return (\n    <svg width={size} height={size}>\n      <Group top={radius} left={radius}>\n        <circle r={radius} fill={fill} style={style} />\n      </Group>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/shapes/Line.tsx",
    "content": "import type { CSSProperties } from 'react';\nimport { Group } from '@visx/group';\n\nexport type ShapeShapeLineProps = {\n  /** The stroke color for the line. Note: Despite the name, this is used as the stroke, not fill. */\n  fill?: string;\n  /** Width of the line. */\n  width?: string | number;\n  /** Height of the container. The line is vertically centered. */\n  height?: string | number;\n  /** Additional CSS styles to apply to the line. The strokeWidth from style is used for line thickness. */\n  style?: CSSProperties;\n};\n\nexport default function ShapeLine({ fill, width, height, style }: ShapeShapeLineProps) {\n  const cleanHeight = typeof height === 'string' || typeof height === 'undefined' ? 0 : height;\n  const lineThickness = typeof style?.strokeWidth === 'number' ? style?.strokeWidth : 2;\n  return (\n    <svg width={width} height={height}>\n      <Group top={cleanHeight / 2 - lineThickness / 2}>\n        <line\n          x1={0}\n          x2={width}\n          y1={0}\n          y2={0}\n          stroke={fill}\n          strokeWidth={lineThickness}\n          style={style}\n        />\n      </Group>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/shapes/Rect.tsx",
    "content": "import type { CSSProperties } from 'react';\n\nexport type ShapeRectProps = {\n  /** The fill color for the rectangle. */\n  fill?: string;\n  /** Width of the rectangle. */\n  width?: string | number;\n  /** Height of the rectangle. */\n  height?: string | number;\n  /** Additional CSS styles to apply to the rectangle. */\n  style?: CSSProperties;\n};\n\nexport default function ShapeRect({ fill, width, height, style }: ShapeRectProps) {\n  return (\n    <div\n      style={{\n        width,\n        height,\n        background: fill,\n        ...style,\n      }}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-legend/src/types/index.ts",
    "content": "import type { AnyD3Scale, ScaleInput } from '@visx/scale';\nimport type { ComponentClass, CSSProperties, FC } from 'react';\n\nexport type LabelFormatterFactory<Scale extends AnyD3Scale> = (args: {\n  scale: Scale;\n  labelFormat: LabelFormatter<ScaleInput<Scale>>;\n}) => ItemTransformer<ScaleInput<Scale>, ReturnType<Scale>>;\n\nexport type LabelFormatter<Datum> = (\n  item: Datum,\n  itemIndex: number,\n) => Datum | string | number | undefined;\n\nexport type FormattedLabel<Datum, Output, ExtraAttributes = {}> = {\n  datum: Datum;\n  index: number;\n  text: string;\n  value?: Output;\n} & ExtraAttributes;\n\nexport type ItemTransformer<Datum, Output> = (\n  item: Datum,\n  itemIndex: number,\n) => FormattedLabel<Datum, Output>;\n\nexport type RenderShapeProvidedProps<Data, Output> = {\n  width?: string | number;\n  height?: string | number;\n  label: FormattedLabel<Data, Output>;\n  item: Data;\n  itemIndex: number;\n  fill?: string;\n  size?: string | number;\n  style?: CSSProperties;\n};\n\nexport type LegendShape<Data, Output> =\n  | 'rect'\n  | 'circle'\n  | 'line'\n  | FC<RenderShapeProvidedProps<Data, Output>>\n  | ComponentClass<RenderShapeProvidedProps<Data, Output>>;\n\nexport type FillAccessor<Datum, Output> = (\n  label: FormattedLabel<Datum, Output>,\n) => string | undefined;\n\nexport type SizeAccessor<Datum, Output> = (\n  label: FormattedLabel<Datum, Output>,\n) => string | number | undefined;\n\nexport type ShapeStyleAccessor<Datum, Output> = (\n  label: FormattedLabel<Datum, Output>,\n) => CSSProperties | undefined; // TODO: ideally this would support SVGProps, but this is invalid for Rect/Circle shapes\n\nexport type FlexDirection =\n  | 'inherit'\n  | 'initial'\n  | 'revert'\n  | 'unset'\n  | 'column'\n  | 'column-reverse'\n  | 'row'\n  | 'row-reverse';\n"
  },
  {
    "path": "packages/visx-legend/src/util/defaultDomain.ts",
    "content": "import type { D3Scale } from '@visx/scale';\n\nexport default function defaultDomain<Scale extends D3Scale<number>>({\n  steps = 5,\n  scale,\n}: {\n  steps: number;\n  scale: Scale;\n}) {\n  const domain = scale.domain();\n  const start = domain[0];\n  const end = domain[domain.length - 1];\n  if (typeof start === 'number' && typeof end === 'number') {\n    const step = (end - start) / (steps - 1);\n    return new Array(steps).fill(1).reduce((acc, cur, i) => {\n      acc.push(start + i * step);\n      return acc;\n    }, []);\n  }\n  return [];\n}\n"
  },
  {
    "path": "packages/visx-legend/src/util/identity.ts",
    "content": "export default function identity<T>(x: T) {\n  return x;\n}\n"
  },
  {
    "path": "packages/visx-legend/src/util/labelTransformFactory.ts",
    "content": "import type { AnyD3Scale, ScaleInput } from '@visx/scale';\nimport type { LabelFormatter, ItemTransformer } from '../types';\n\n/** Returns a function which takes a Datum and index as input, and returns a formatted label object. */\nexport default function labelTransformFactory<Scale extends AnyD3Scale>({\n  scale,\n  labelFormat,\n}: {\n  scale: Scale;\n  labelFormat: LabelFormatter<ScaleInput<Scale>>;\n}): ItemTransformer<ScaleInput<Scale>, ReturnType<Scale>> {\n  return (d, i) => ({\n    datum: d,\n    index: i,\n    text: `${labelFormat(d, i)}`,\n    value: scale(d),\n  });\n}\n"
  },
  {
    "path": "packages/visx-legend/src/util/renderShape.ts",
    "content": "import { cloneElement, createElement, isValidElement } from 'react';\nimport RectShape from '../shapes/Rect';\nimport CircleShape from '../shapes/Circle';\nimport LineShape from '../shapes/Line';\n\nimport type {\n  LegendShape,\n  FormattedLabel,\n  FillAccessor,\n  SizeAccessor,\n  ShapeStyleAccessor,\n  RenderShapeProvidedProps,\n} from '../types';\n\ntype RenderShapeArgs<Data, Output> = {\n  shape?: LegendShape<Data, Output>;\n  label: FormattedLabel<Data, Output>;\n  item: Data;\n  itemIndex: number;\n  fill?: FillAccessor<Data, Output>;\n  size?: SizeAccessor<Data, Output>;\n  shapeStyle?: ShapeStyleAccessor<Data, Output>;\n  width?: string | number;\n  height?: string | number;\n};\n\nconst NO_OP = () => undefined;\n\nexport default function renderShape<Data, Output>({\n  shape = 'rect',\n  fill = NO_OP,\n  size = NO_OP,\n  width,\n  height,\n  label,\n  item,\n  itemIndex,\n  shapeStyle = NO_OP,\n}: RenderShapeArgs<Data, Output>) {\n  const props: RenderShapeProvidedProps<Data, Output> = {\n    width,\n    height,\n    item,\n    itemIndex,\n    label,\n    fill: fill({ ...label }),\n    size: size({ ...label }),\n    style: shapeStyle({ ...label }),\n  };\n\n  if (typeof shape === 'string') {\n    if (shape === 'circle') {\n      return createElement(CircleShape, props);\n    }\n    if (shape === 'line') {\n      return createElement(LineShape, props);\n    }\n    return createElement(RectShape, props);\n  }\n  if (isValidElement(shape)) {\n    return cloneElement(shape, props);\n  }\n  if (shape) {\n    return createElement(shape, props);\n  }\n  return null;\n}\n"
  },
  {
    "path": "packages/visx-legend/src/util/valueOrIdentity.ts",
    "content": "export type ValueOrIdentity<T> = T | { value?: T };\n\n/** Returns an object's value if defined, or the object. */\nexport default function valueOrIdentity<T>(_: ValueOrIdentity<T>): T {\n  if (_ && typeof _ === 'object' && 'value' in _ && typeof _.value !== 'undefined') return _.value;\n  return _ as T;\n}\n\n/** Returns an object's value if defined, or the object, coerced to a string. */\nexport function valueOrIdentityString<T>(_: ValueOrIdentity<T>): string {\n  return String(valueOrIdentity(_));\n}\n"
  },
  {
    "path": "packages/visx-legend/test/Legend.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\n\nimport { Legend } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\nconst defaultProps = {\n  scale: scaleLinear<number>({\n    range: [10, 0],\n    round: true,\n    domain: [0, 10],\n  }),\n};\n\ndescribe('<Legend />', () => {\n  beforeEach(() => {\n    vi.clearAllMocks();\n    addMock();\n  });\n  afterEach(removeMock);\n\n  test('it should be defined', () => {\n    expect(Legend).toBeDefined();\n  });\n\n  test('it should default style to display: flex, flex-direction: column', () => {\n    const { container } = render(<Legend {...defaultProps} />);\n    const legend = container.firstChild as HTMLElement;\n    expect(legend.style.display).toBe('flex');\n    expect(legend.style.flexDirection).toBe('column');\n  });\n\n  test('it should extend style prop', () => {\n    const { container } = render(<Legend {...defaultProps} style={{ display: 'block' }} />);\n    const legend = container.firstChild as HTMLElement;\n    expect(legend.style.display).toBe('block');\n    expect(legend.style.flexDirection).toBe('column');\n  });\n\n  test('it should pass through direction prop to style prop', () => {\n    const { container } = render(<Legend {...defaultProps} direction=\"row\" />);\n    const legend = container.firstChild as HTMLElement;\n    expect(legend.style.display).toBe('flex');\n    expect(legend.style.flexDirection).toBe('row');\n  });\n\n  test('it should pass through legendLabelProps to legend labels', () => {\n    const style = { fontFamily: 'Comic Sans MS' };\n    const { container } = render(\n      <Legend {...defaultProps} legendLabelProps={{ id: 'test-legend-label', style }} />,\n    );\n\n    const labelElement = container.querySelector('#test-legend-label');\n    expect(labelElement).not.toBeNull();\n    expect(labelElement).toHaveStyle('font-family: \"Comic Sans MS\"');\n  });\n});\n"
  },
  {
    "path": "packages/visx-legend/test/LegendLinear.test.tsx",
    "content": "import { LegendLinear } from '../src';\n\ndescribe('<LegendLinear />', () => {\n  test('it should be defined', () => {\n    expect(LegendLinear).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-legend/test/LegendOrdinal.test.tsx",
    "content": "import { LegendOrdinal } from '../src';\n\ndescribe('<LegendLOrdinal />', () => {\n  test('it should be defined', () => {\n    expect(LegendOrdinal).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-legend/test/LegendQuantile.test.tsx",
    "content": "import { LegendQuantile } from '../src';\n\ndescribe('<LegendQuantile />', () => {\n  test('it should be defined', () => {\n    expect(LegendQuantile).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-legend/test/LegendSize.test.tsx",
    "content": "import { LegendSize } from '../src';\n\ndescribe('<LegendSize />', () => {\n  test('it should be defined', () => {\n    expect(LegendSize).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-legend/test/LegendThreshold.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleThreshold } from '@visx/scale';\nimport { LegendThreshold } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\ndescribe('<LegendThreshold />', () => {\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  test('it should be defined', () => {\n    expect(LegendThreshold).toBeDefined();\n  });\n\n  it('should render LegendShape with the correct color', () => {\n    const domain = [1, 2, 9];\n    const range = ['green', 'purple', 'blue', 'pink'];\n    const thresholdScale = scaleThreshold({\n      domain,\n      range,\n    });\n\n    const { getAllByTestId } = render(\n      <svg>\n        <LegendThreshold scale={thresholdScale} data-testid=\"thresholdLegend\" />\n      </svg>,\n    );\n\n    const thresholdLegend = getAllByTestId('thresholdLegend');\n\n    range.forEach((color, index) => {\n      const legendItem = thresholdLegend[index];\n      const legendShape = legendItem?.querySelector('.visx-legend-shape');\n      expect(legendShape?.querySelector('div')).toHaveStyle(`background: ${color}`);\n    });\n  });\n\n  it('should render LegendShape with the correct color with a negitive domain', () => {\n    const domain = [-3, -1];\n    const range = ['green', 'purple', 'blue'];\n    const thresholdScale1 = scaleThreshold({\n      domain,\n      range,\n    });\n\n    const { getAllByTestId } = render(\n      <svg>\n        <LegendThreshold scale={thresholdScale1} data-testid=\"thresholdLegend\" />\n      </svg>,\n    );\n\n    const thresholdLegend = getAllByTestId('thresholdLegend');\n\n    range.forEach((color, index) => {\n      const legendItem = thresholdLegend[index];\n      const legendShape = legendItem?.querySelector('.visx-legend-shape');\n      expect(legendShape?.querySelector('div')).toHaveStyle(`background: ${color}`);\n    });\n  });\n\n  it('should render LegendShape with the correct color with 0', () => {\n    const domain = [0, 1, 4];\n    const range = ['green', 'purple', 'blue', 'pink'];\n    const thresholdScale1 = scaleThreshold({\n      domain,\n      range,\n    });\n\n    const { getAllByTestId } = render(\n      <svg>\n        <LegendThreshold scale={thresholdScale1} data-testid=\"thresholdLegend\" />\n      </svg>,\n    );\n\n    const thresholdLegend = getAllByTestId('thresholdLegend');\n\n    range.forEach((color, index) => {\n      const legendItem = thresholdLegend[index];\n      const legendShape = legendItem?.querySelector('.visx-legend-shape');\n      expect(legendShape?.querySelector('div')).toHaveStyle(`background: ${color}`);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-legend/test/scales.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleBand, scaleLinear, scaleOrdinal, scaleThreshold, scaleQuantile } from '@visx/scale';\n\nimport {\n  Legend,\n  LegendLinear,\n  LegendOrdinal,\n  LegendSize,\n  LegendThreshold,\n  LegendQuantile,\n} from '../src';\n\ndescribe('Legend scales', () => {\n  it('should render with scaleLinear', () => {\n    const linearScale = scaleLinear<number>({\n      domain: [0, 10],\n      range: [1, 5, 10, 15, 20],\n    });\n\n    const { container: container1 } = render(<LegendLinear scale={linearScale} />);\n    expect(container1.querySelector('.visx-legend')).toBeInTheDocument();\n\n    const { container: container2 } = render(<LegendSize scale={linearScale} />);\n    expect(container2.querySelector('.visx-legend')).toBeInTheDocument();\n\n    const { container: container3 } = render(<Legend scale={linearScale} />);\n    expect(container3.querySelector('.visx-legend')).toBeInTheDocument();\n  });\n\n  it('should render with scaleOrdinal', () => {\n    const ordinalScale = scaleOrdinal<string, string>({\n      domain: ['a', 'b', 'c', 'd'],\n      range: ['#66d981', '#71f5ef', '#4899f1', '#7d81f6'],\n    });\n\n    const { container: container1 } = render(<LegendOrdinal scale={ordinalScale} />);\n    expect(container1).toBeInTheDocument();\n\n    const { container: container2 } = render(<Legend scale={ordinalScale} />);\n    expect(container2).toBeInTheDocument();\n  });\n\n  it('should render with scaleBand', () => {\n    const bandScale = scaleBand<string>({\n      domain: ['a', 'b', 'c', 'd'],\n      range: [1, 10],\n    });\n\n    const { container } = render(<Legend scale={bandScale} />);\n    expect(container).toBeInTheDocument();\n  });\n\n  it('should render with scaleThreshold', () => {\n    const thresholdScale = scaleThreshold<number, string>({\n      domain: [0.01, 0.02, 0.04, 0.06, 0.08, 0.1],\n      range: ['#f2f0f7', '#dadaeb', '#bcbddc', '#9e9ac8', '#756bb1', '#54278f'],\n    });\n\n    const { container: container1 } = render(<LegendThreshold scale={thresholdScale} />);\n    expect(container1).toBeInTheDocument();\n\n    const { container: container2 } = render(<Legend scale={thresholdScale} />);\n    expect(container2).toBeInTheDocument();\n  });\n\n  it('should render with scaleQuantile', () => {\n    const quantileScale = scaleQuantile<string>({\n      domain: [0.01, 0.02, 0.04, 0.06, 0.08, 0.1],\n      range: ['#f2f0f7', '#dadaeb', '#bcbddc', '#9e9ac8', '#756bb1', '#54278f'],\n    });\n\n    const { container: container1 } = render(<LegendQuantile scale={quantileScale} />);\n    expect(container1).toBeInTheDocument();\n\n    const { container: container2 } = render(<Legend scale={quantileScale} />);\n    expect(container2).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-legend/test/svgMock.ts",
    "content": "// @ts-expect-error\nlet originalFn: typeof SVGElement.prototype.getComputedTextLength;\n\n/**\n * JSDom does not implement getComputedTextLength()\n * so this function add mock implementation for testing.\n */\nexport function addMock() {\n  // @ts-expect-error\n  originalFn = SVGElement.prototype.getComputedTextLength;\n\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = function getComputedTextLength() {\n    // Make every character 10px wide\n    return (this.textContent?.length ?? 0) * 10;\n  };\n}\n\n/**\n * Remove mock from addMock()\n */\nexport function removeMock() {\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = originalFn;\n}\n"
  },
  {
    "path": "packages/visx-legend/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-legend/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-legend/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/legend',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-legend/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/legend': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-marker/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-marker/Readme.md",
    "content": "# @visx/marker\n\n<a title=\"@visx/marker npm downloads\" href=\"https://www.npmjs.com/package/@visx/marker\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/marker.svg?style=flat-square\" />\n</a>\n\nMarkers are graphical objects attached to a `<path>`, `<line>`, `<polyline>`, or `<polygon>`\nelement. [MDN `<marker>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Element/marker)\n\n## Installation\n\n```\nnpm install --save @visx/marker\n```\n"
  },
  {
    "path": "packages/visx-marker/package.json",
    "content": "{\n  \"name\": \"@visx/marker\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx marker\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-marker/src/index.ts",
    "content": "// @visx/marker\nexport { default as Marker } from './markers/Marker';\nexport { default as MarkerArrow } from './markers/Arrow';\nexport { default as MarkerCross } from './markers/Cross';\nexport { default as MarkerX } from './markers/X';\nexport { default as MarkerCircle } from './markers/Circle';\nexport { default as MarkerLine } from './markers/Line';\n\nexport type { MarkerProps, MarkerComponentProps } from './markers/Marker';\n"
  },
  {
    "path": "packages/visx-marker/src/markers/Arrow.tsx",
    "content": "import type { MarkerComponentProps } from './Marker';\nimport Marker from './Marker';\n\nexport default function MarkerArrow({\n  id,\n  size = 9,\n  strokeWidth = 1,\n  ...restProps\n}: MarkerComponentProps) {\n  const max = size + strokeWidth * 2;\n  const midX = size;\n  const midY = max / 2;\n  const points = `0 0, ${size} ${size / 2}, 0 ${size}`;\n  return (\n    <Marker\n      id={id}\n      markerWidth={max}\n      markerHeight={max}\n      refX={midX}\n      refY={midY}\n      orient=\"auto\"\n      markerUnits=\"strokeWidth\"\n      fill=\"none\"\n      strokeWidth={strokeWidth}\n      {...restProps}\n    >\n      <g transform={`translate(${strokeWidth}, ${strokeWidth})`}>\n        <polyline points={points} />\n      </g>\n    </Marker>\n  );\n}\n"
  },
  {
    "path": "packages/visx-marker/src/markers/Circle.tsx",
    "content": "import type { MarkerComponentProps } from './Marker';\nimport Marker from './Marker';\n\nexport default function MarkerCircle({\n  id,\n  size = 9,\n  strokeWidth = 1,\n  ...restProps\n}: MarkerComponentProps) {\n  const diameter = size * 2;\n  const bounds = diameter + strokeWidth;\n  const mid = bounds / 2;\n  return (\n    <Marker\n      id={id}\n      markerWidth={bounds}\n      markerHeight={bounds}\n      refX={0}\n      refY={mid}\n      orient=\"auto-start-reverse\"\n      markerUnits=\"strokeWidth\"\n      strokeWidth={strokeWidth}\n      {...restProps}\n    >\n      <circle r={size} cx={mid} cy={mid} />\n    </Marker>\n  );\n}\n"
  },
  {
    "path": "packages/visx-marker/src/markers/Cross.tsx",
    "content": "import type { MarkerComponentProps } from './Marker';\nimport Marker from './Marker';\n\nexport default function MarkerCross({\n  id,\n  size = 9,\n  strokeWidth = 1,\n  ...restProps\n}: MarkerComponentProps) {\n  const bounds = size + strokeWidth;\n  const mid = size / 2;\n  const points = `0 ${mid}, ${mid} ${mid}, ${mid} 0, ${mid} ${size}, ${mid} ${mid}, ${size} ${mid}`;\n  return (\n    <Marker\n      id={id}\n      markerWidth={bounds}\n      markerHeight={bounds}\n      refX={mid}\n      refY={mid}\n      orient=\"auto\"\n      markerUnits=\"strokeWidth\"\n      fill=\"none\"\n      strokeWidth={strokeWidth}\n      {...restProps}\n    >\n      <polyline points={points} />\n    </Marker>\n  );\n}\n"
  },
  {
    "path": "packages/visx-marker/src/markers/Line.tsx",
    "content": "import type { MarkerComponentProps } from './Marker';\nimport Marker from './Marker';\n\nexport default function MarkerLine({\n  id,\n  size = 9,\n  fill,\n  stroke,\n  strokeWidth = 1,\n  ...restProps\n}: MarkerComponentProps) {\n  const max = Math.max(size, strokeWidth * 2);\n  const midX = max / 2;\n  const midY = size / 2;\n  return (\n    <Marker\n      id={id}\n      markerWidth={max}\n      markerHeight={size}\n      refX={midX}\n      refY={midY}\n      orient=\"auto\"\n      markerUnits=\"strokeWidth\"\n      fill={fill || stroke}\n      stroke=\"none\"\n      {...restProps}\n    >\n      <rect width={strokeWidth} height={size} x={midX} />\n    </Marker>\n  );\n}\n"
  },
  {
    "path": "packages/visx-marker/src/markers/Marker.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\n\nexport interface Props {\n  /** Unique id for the `<marker>`. Should be unique across all page elements. */\n  id: string;\n  /** A number used to determine the size of the bounding box the marker content. */\n  size?: number;\n  /** The width of the marker viewport */\n  markerWidth?: string | number;\n  /** The height of the marker viewport */\n  markerHeight?: string | number;\n  /** Set the coordinate system for the markerWidth, markerHeight, and `<marker>` contents  */\n  markerUnits?: string;\n  /** The x coordinate for the reference point of the maker */\n  refX?: string | number;\n  /** The y coordinate for the reference point of the maker */\n  refY?: string | number;\n  /** The stroke width. constrained to a `number` type due to use in bounding box calculations */\n  strokeWidth?: number;\n  /** The <marker> contents. Typically one of: `<path>`, `<line>`, `<polyline>`, or `<polygon>` */\n  children: ReactNode;\n}\n\nexport type MarkerProps = Props & Omit<SVGProps<SVGMarkerElement>, keyof Props>;\nexport type MarkerComponentProps = Omit<MarkerProps, 'children'>;\n\nexport default function Marker({\n  id,\n  markerWidth = 3,\n  markerHeight = 3,\n  markerUnits = 'userSpaceOnUse',\n  children,\n  ...restProps\n}: MarkerProps) {\n  return (\n    <defs>\n      <marker\n        id={id}\n        markerWidth={markerWidth}\n        markerHeight={markerHeight}\n        markerUnits={markerUnits}\n        {...restProps}\n      >\n        {children}\n      </marker>\n    </defs>\n  );\n}\n"
  },
  {
    "path": "packages/visx-marker/src/markers/X.tsx",
    "content": "import Cross from './Cross';\nimport type { MarkerComponentProps } from './Marker';\n\nexport default function MarkerX(props: MarkerComponentProps) {\n  return <Cross orient={45} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-marker/test/Arrow.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { MarkerArrow } from '../src';\n\ndescribe('<MarkerArrow />', () => {\n  test('it should be defined', () => {\n    expect(MarkerArrow).toBeDefined();\n  });\n\n  test('it should render marker with polyline', () => {\n    const { container } = render(\n      <svg>\n        <defs>\n          <MarkerArrow id=\"marker-arrow-test\" />\n        </defs>\n      </svg>,\n    );\n\n    const marker = container.querySelector('marker');\n    const polyline = container.querySelector('polyline');\n\n    expect(marker).toBeInTheDocument();\n    expect(marker).toHaveAttribute('id', 'marker-arrow-test');\n    expect(polyline).toBeInTheDocument();\n  });\n\n  test('it should size correctly', () => {\n    const size = 8;\n    const strokeWidth = 1;\n    const max = size + strokeWidth * 2;\n    const midX = size;\n    const midY = max / 2;\n\n    const { container } = render(\n      <svg>\n        <defs>\n          <MarkerArrow id=\"marker-circle-test\" size={size} strokeWidth={strokeWidth} />\n        </defs>\n      </svg>,\n    );\n\n    const marker = container.querySelector('marker');\n    expect(marker).toBeInTheDocument();\n    expect(marker).toHaveAttribute('markerWidth', max.toString());\n    expect(marker).toHaveAttribute('markerHeight', max.toString());\n    expect(marker).toHaveAttribute('refX', midX.toString());\n    expect(marker).toHaveAttribute('refY', midY.toString());\n\n    const g = container.querySelector('g');\n    expect(g).toBeInTheDocument();\n    expect(g).toHaveAttribute('transform', `translate(${strokeWidth}, ${strokeWidth})`);\n\n    const polyline = container.querySelector('polyline');\n    expect(polyline).toBeInTheDocument();\n    expect(polyline).toHaveAttribute('points', '0 0, 8 4, 0 8');\n  });\n});\n"
  },
  {
    "path": "packages/visx-marker/test/Circle.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { MarkerCircle } from '../src';\n\ndescribe('<MarkerCircle />', () => {\n  test('it should be defined', () => {\n    expect(MarkerCircle).toBeDefined();\n  });\n\n  test('it should render a marker containing a circle', () => {\n    const { container } = render(\n      <svg>\n        <MarkerCircle id=\"marker-circle-test\" />\n      </svg>,\n    );\n\n    const marker = container.querySelector('marker');\n    const circle = container.querySelector('circle');\n\n    expect(marker).toBeInTheDocument();\n    expect(circle).toBeInTheDocument();\n  });\n\n  test('it should size correctly', () => {\n    const size = 8;\n    const strokeWidth = 1;\n    const diameter = size * 2;\n    const bounds = diameter + strokeWidth;\n    const mid = bounds / 2;\n\n    const { container } = render(\n      <svg>\n        <MarkerCircle id=\"marker-circle-test\" size={size} strokeWidth={strokeWidth} />\n      </svg>,\n    );\n\n    // Check marker attributes\n    const marker = container.querySelector('marker');\n    expect(marker).toHaveAttribute('markerWidth', bounds.toString());\n    expect(marker).toHaveAttribute('markerHeight', bounds.toString());\n    expect(marker).toHaveAttribute('refX', '0');\n    expect(marker).toHaveAttribute('refY', mid.toString());\n\n    // Check circle attributes\n    const circle = container.querySelector('circle');\n    expect(circle).toHaveAttribute('r', size.toString());\n    expect(circle).toHaveAttribute('cx', mid.toString());\n    expect(circle).toHaveAttribute('cy', mid.toString());\n  });\n});\n"
  },
  {
    "path": "packages/visx-marker/test/Cross.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\n\nimport { MarkerCross } from '../src';\n\ndescribe('<MarkerCross />', () => {\n  test('it should be defined', () => {\n    expect(MarkerCross).toBeDefined();\n  });\n\n  test('it should render a Marker containing a polyline', () => {\n    const { container } = render(\n      <svg>\n        <MarkerCross id=\"marker-cross-test\" />\n      </svg>,\n    );\n    expect(container.querySelector('marker')).toBeTruthy();\n    expect(container.querySelector('polyline')).toBeTruthy();\n  });\n\n  test('it should size correctly', () => {\n    const size = 8;\n    const strokeWidth = 1;\n    const bounds = size + strokeWidth;\n    const mid = size / 2;\n    const points = `0 ${mid}, ${mid} ${mid}, ${mid} 0, ${mid} ${size}, ${mid} ${mid}, ${size} ${mid}`;\n\n    const { container } = render(\n      <svg>\n        <MarkerCross id=\"marker-cross-test\" size={size} strokeWidth={strokeWidth} />\n      </svg>,\n    );\n\n    const marker = container.querySelector('marker');\n    const polyline = container.querySelector('polyline');\n\n    expect(marker).toBeTruthy();\n    expect(marker?.getAttribute('markerWidth')).toBe(bounds.toString());\n    expect(marker?.getAttribute('markerHeight')).toBe(bounds.toString());\n    expect(marker?.getAttribute('refX')).toBe(mid.toString());\n    expect(marker?.getAttribute('refY')).toBe(mid.toString());\n    expect(polyline?.getAttribute('points')).toBe(points);\n  });\n});\n"
  },
  {
    "path": "packages/visx-marker/test/Line.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { MarkerLine } from '../src';\n\ndescribe('<MarkerLine />', () => {\n  test('it should be defined', () => {\n    expect(MarkerLine).toBeDefined();\n  });\n\n  test('it should render a marker and rect', () => {\n    const { container } = render(\n      <svg>\n        <MarkerLine id=\"marker-line-test\" />\n      </svg>,\n    );\n\n    const marker = container.querySelector('marker');\n    const rect = container.querySelector('rect');\n    expect(marker).toBeInTheDocument();\n    expect(rect).toBeInTheDocument();\n  });\n\n  test('it should render with correct attributes', () => {\n    const size = 8;\n    const strokeWidth = 1;\n    const stroke = 'blue';\n\n    const { container } = render(\n      <svg>\n        <MarkerLine id=\"marker-line-test\" size={size} stroke={stroke} strokeWidth={strokeWidth} />\n      </svg>,\n    );\n\n    const marker = container.querySelector('marker');\n    const rect = container.querySelector('rect');\n\n    // Calculate expected values\n    const max = Math.max(size, strokeWidth * 2);\n    const midX = max / 2;\n    const midY = size / 2;\n\n    // Check marker attributes\n    expect(marker).toHaveAttribute('markerWidth', max.toString());\n    expect(marker).toHaveAttribute('markerHeight', size.toString());\n    expect(marker).toHaveAttribute('refX', midX.toString());\n    expect(marker).toHaveAttribute('refY', midY.toString());\n    expect(marker).toHaveAttribute('fill', stroke);\n\n    // Check rect element attributes\n    expect(rect).toHaveAttribute('width', strokeWidth.toString());\n    expect(rect).toHaveAttribute('height', size.toString());\n    expect(rect).toHaveAttribute('x', midX.toString());\n  });\n});\n"
  },
  {
    "path": "packages/visx-marker/test/Marker.test.tsx",
    "content": "import { Marker } from '../src';\n\ndescribe('<Marker />', () => {\n  test('it should be defined', () => {\n    expect(Marker).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-marker/test/X.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { MarkerX } from '../src';\n\ndescribe('<MarkerX />', () => {\n  test('it should be defined', () => {\n    expect(MarkerX).toBeDefined();\n  });\n\n  test('it should render marker with 45 degree rotation', () => {\n    const { container } = render(\n      <svg>\n        <defs>\n          <MarkerX id=\"marker-x-test\" />\n        </defs>\n      </svg>,\n    );\n\n    const marker = container.querySelector('#marker-x-test');\n    expect(marker).toBeInTheDocument();\n    expect(marker).toHaveAttribute('orient', '45');\n  });\n});\n"
  },
  {
    "path": "packages/visx-marker/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-marker/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-marker/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/marker',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-marker/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/marker': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-mock-data/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-mock-data/Readme.md",
    "content": "# @visx/mock-data\n\n<a title=\"@visx/mock-data npm downloads\" href=\"https://www.npmjs.com/package/@visx/mock-data\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/mock-data.svg?style=flat-square\" />\n</a>\n\nThe `@visx/mock-data` package is here to help you test out your graphs.\n\n## Installation\n\n```\nnpm install --save @visx/mock-data\n```\n\n## Generators\n\nGenerators can create simple generic data for you like this:\n\n```js\nimport Mock from '@visx/mock-data';\nconst points = Mock.genRandomNormalPoints();\n```\n\n### `Mock.genRandomNormalPoints()`\n\nReturns a series of random normal x,y points.\n\n### `Mock.getDateValue(n)`\n\nGenerates `n` date values an hour apart from each other starting with the current time.\n\n## Mocks\n\nMock are essentially a bunch of data dumps that you can use like this:\n\n```js\nimport Mock from '@visx/mock-data';\n// or import { cityTemperature } from '@visx/mock-data';\nconst data = Mock.cityTemperature;\n```\n\n### `Mock.appleStock`\n\n```js\ninterface AppleStock {\n  date: string;\n  close: number;\n}\n\nconst appleStock: AppleStock[] = [\n  { date: '2007-04-24T07:00:00.000Z', close: 93.24 },\n  ...\n];\n```\n\n### `Mock.bitcoinPrice`\n\n```js\ninterface BitcoinPrices {\n  currency: string;\n  prices: BitcoinPrice[];\n}\n\nconst bitcoinPrice: BitcoinPrices = {\n  currency: 'USD',\n  prices: [\n    { price: '2486.69', time: '2017-07-03T00:00:00Z' },\n    ...\n  ]\n};\n```\n\n### `Mock.browserUsage`\n\n```js\nconst browserUsage: BrowserUsage[] = [\n  {\n    date: '2015 Jun 15',\n    'Google Chrome': '48.09',\n    'Internet Explorer': '24.14',\n    Firefox: '18.82',\n    Safari: '7.46',\n    'Microsoft Edge': '0.03',\n    Opera: '1.32',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  ...\n];\n```\n\n### `Mock.cityTemperature`\n\n```ts\ninterface CityTemperature {\n  date: string;\n  'New York': string;\n  'San Francisco': string;\n  Austin: string;\n}\n\nconst cityTemperature: CityTemperature[] = [\n  {\n    date: '20111001',\n    'New York': '63.4',\n    'San Francisco': '62.7',\n    Austin: '72.2',\n  },\n  ...\n];\n```\n\n### `Mock.exoplanets`\n\n```ts\ninterface Exoplanets {\n  name: string;\n  radius: number;\n  distance: number | null;\n}\n\nconst exoplanets: Exoplanets[] = [\n  {\n    name: 'Jupiter',\n    radius: 10.97,\n    distance: 0,\n  },\n  ...\n];\n```\n\n### `Mock.groupDateValue`\n\n```ts\ninterface GroupDateValue {\n  key: string;\n  value: string;\n  date: string;\n}\n\nconst groupDateValue: GroupDateValue[] = [\n  { key: 'Group1', value: '37', date: '04/23/12' },\n  ...\n];\n```\n\n### `Mock.lesMiserables`\n\n```ts\ninterface LesMiserablesNode {\n  id: string;\n  group: number;\n}\n\ninterface LesMiserablesLink {\n  source: string;\n  target: string;\n  value: number;\n}\n\ninterface LesMiserables {\n  nodes: LesMiserablesNode[];\n  links: LesMiserablesLink[];\n}\n\nconst lesMiserables: LesMiserables = {\n  nodes: [\n    { id: 'Myriel', group: 1 },\n    ...\n  ],\n  links: [\n    { source: 'Napoleon', target: 'Myriel', value: 1 },\n    ...\n  ],\n};\n```\n\n### `Mock.letterFrequency`\n\n```ts\ninterface LetterFrequency {\n  letter: string;\n  frequency: number;\n}\n\nconst letterFrequency: LetterFrequency[] = [\n  { letter: 'A', frequency: 0.08167 },\n  ...\n];\n```\n\n### `Mock.shakespeare`\n\n```ts\ninterface Shakespeare {\n  id: string;\n  parent: string | null;\n  size: number | null;\n}\n\nconst shakespeare: Shakespeare[] = [\n  {\n    id: 'Shakespeare',\n    parent: null,\n    size: 0,\n  },\n  ...\n];\n```\n\n## Source For Components\n\n### `generators/`\n\n- [genDateValue()](https://github.com/airbnb/visx/blob/master/packages/visx-mock-data/src/generators/genDateValue.ts)\n- [genRandomNormalPoints()](https://github.com/airbnb/visx/blob/master/packages/visx-mock-data/src/generators/genRandomNormalPoints.ts)\n\n### `mocks/`\n\n- [appleStock](https://github.com/airbnb/visx/blob/master/packages/visx-mock-data/src/mocks/appleStock.ts)\n- [browserUsage](https://github.com/airbnb/visx/blob/master/packages/visx-mock-data/src/mocks/browserUsage.ts)\n- [cityTemperature](https://github.com/airbnb/visx/blob/master/packages/visx-mock-data/src/mocks/cityTemperature.ts)\n- [groupDateValue](https://github.com/airbnb/visx/blob/master/packages/visx-mock-data/src/mocks/groupDateValue.ts)\n- [letterFrequency](https://github.com/airbnb/visx/blob/master/packages/visx-mock-data/src/mocks/letterFrequency.ts)\n"
  },
  {
    "path": "packages/visx-mock-data/package.json",
    "content": "{\n  \"name\": \"@visx/mock-data\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx mock data\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/d3-random\": \"^2.2.0\",\n    \"d3-random\": \"^2.2.2\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/generators/genBin.ts",
    "content": "export type CountFunction = (idx: number, number: number) => number;\nexport type BinFunction = (idx: number, number?: number) => number;\n\nexport interface Bin {\n  bin: number;\n  count: number;\n}\n\nconst defaultCount: CountFunction = (idx, number) => Math.random() * (25 * (number - idx));\n\nconst defaultBin: BinFunction = (idx, length) => idx * 150;\n\nexport default function genBin(\n  length: number,\n  bin: BinFunction = defaultBin,\n  count: CountFunction = defaultCount,\n): Bin[] {\n  return new Array(length).fill(1).reduce(\n    (data, d, i) =>\n      data.concat([\n        {\n          bin: bin(i, length),\n          count: count(i, length),\n        },\n      ]),\n    [],\n  );\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/generators/genBins.ts",
    "content": "import type { Bin as BinType, BinFunction, CountFunction } from './genBin';\nimport genBin from './genBin';\n\nexport type Bin = BinType;\n\nexport interface Bins {\n  bin: number;\n  bins: Bin[];\n}\n\nexport default function genBins(\n  length: number,\n  height: number,\n  bin?: BinFunction,\n  count?: CountFunction,\n): Bins[] {\n  return new Array(length).fill(1).reduce(\n    (arr, _, i) =>\n      arr.concat([\n        {\n          bin: i,\n          bins: genBin(height, bin, count),\n        },\n      ]),\n    [],\n  );\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/generators/genDateValue.ts",
    "content": "import getSeededRandom from './getSeededRandom';\n\nexport interface DateValue {\n  date: Date;\n  value: number;\n}\n\nexport default function genDateValue(\n  length: number,\n  /** Optional random seed in the interval [0, 1). */\n  seed?: number,\n  /** Optional start time in ms UTC. */\n  startTimeMs?: number,\n): DateValue[] {\n  const random = seed == null ? Math.random : getSeededRandom(seed);\n  const startDateMs = startTimeMs == null ? Date.now() : new Date(startTimeMs).valueOf();\n  return new Array(length).fill(1).map((_, idx: number) => ({\n    date: new Date(startDateMs - idx * 3600000),\n    // eslint-disable-next-line no-bitwise\n    value: (random() * 3000) | 0,\n  }));\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/generators/genPhyllotaxis.ts",
    "content": "export interface GenPhyllotaxis {\n  radius: number;\n  width: number;\n  height: number;\n}\nexport interface PhyllotaxisPoint {\n  x: number;\n  y: number;\n}\n\nexport type GenPhyllotaxisFunction = (idx: number) => PhyllotaxisPoint;\n\nexport default function genPhyllotaxis({\n  radius,\n  width,\n  height,\n}: GenPhyllotaxis): GenPhyllotaxisFunction {\n  const theta = Math.PI * (3 - Math.sqrt(5));\n  return (idx) => {\n    const r = radius * Math.sqrt(idx);\n    const a = theta * idx;\n    return {\n      x: width / 2 + r * Math.cos(a),\n      y: height / 2 + r * Math.sin(a),\n    };\n  };\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/generators/genRandomNormalPoints.ts",
    "content": "import { randomNormal } from 'd3-random';\nimport getSeededRandom from './getSeededRandom';\n\nexport type PointConfig = [number, number, number];\nexport type PointsRange = [number, number, number];\n\nconst sqrt3: number = Math.sqrt(3);\n\nfunction range(length: number): number[] {\n  return new Array(length).fill(1);\n}\n\nexport function genPointsRange(\n  length: number,\n  [offsetX, offsetY, index]: PointConfig,\n  random: () => number = randomNormal(0, 0.2),\n): PointsRange[] {\n  return range(length).map(() => [random() + offsetX, random() + offsetY, index]);\n}\n\nexport default function genPoints(\n  count: number = 300,\n  /** Optional random seed in the interval [0, 1). */\n  seed: number | undefined = undefined,\n): PointsRange[] {\n  const random = seed == null ? undefined : randomNormal.source(getSeededRandom(seed))(0, 0.2);\n  return [\n    ...genPointsRange(count, [sqrt3, 1, 0], random),\n    ...genPointsRange(count, [-sqrt3, 1, 1], random),\n    ...genPointsRange(count, [0, -1, 2], random),\n  ];\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/generators/genStats.ts",
    "content": "import { randomNormal } from 'd3-random';\n\nexport interface BoxPlot {\n  x: string;\n  min: number;\n  firstQuartile: number;\n  median: number;\n  thirdQuartile: number;\n  max: number;\n  outliers: number[];\n}\n\nexport interface BinData {\n  value: number;\n  count: number;\n}\n\nexport interface Stats {\n  boxPlot: BoxPlot;\n  binData: BinData[];\n}\n\nconst defaultRandom = randomNormal(4, 3);\nconst defaultRandomOffset = () => Math.random() * 10;\nconst sampleSize = 1000;\n\nexport default function genStats(\n  /** Number of stat distributions to generate. */\n  number: number,\n  /** Function which generates a random number. */\n  random: () => number = defaultRandom,\n  /** Function which generates an offset for each data point / invocation of random. */\n  randomOffset: () => number = defaultRandomOffset,\n): Stats[] {\n  const data = [];\n\n  for (let i = 0; i < number; i += 1) {\n    const points = [];\n    const offset = randomOffset();\n\n    for (let j = 0; j < sampleSize; j += 1) {\n      points.push(offset + random());\n    }\n\n    points.sort((a, b) => a - b);\n\n    const firstQuartile = points[Math.round(sampleSize / 4)];\n    const thirdQuartile = points[Math.round((3 * sampleSize) / 4)];\n    const IQR = thirdQuartile - firstQuartile;\n\n    const min = firstQuartile - 1.5 * IQR;\n    const max = thirdQuartile + 1.5 * IQR;\n\n    const outliers = points.filter((p) => p < min || p > max);\n    const binWidth = 2 * IQR * (sampleSize - outliers.length) ** (-1 / 3);\n    const binNum = Math.round((max - min) / binWidth);\n    const actualBinWidth = (max - min) / binNum;\n\n    const bins: number[] = new Array(binNum + 2).fill(0);\n    const values: number[] = new Array(binNum + 2).fill(min);\n\n    for (let ii = 1; ii <= binNum; ii += 1) {\n      values[ii] += actualBinWidth * (ii - 0.5);\n    }\n\n    values[values.length - 1] = max;\n\n    points\n      .filter((p) => p >= min && p <= max)\n      .forEach((p) => {\n        bins[Math.floor((p - min) / actualBinWidth) + 1] += 1;\n      });\n\n    const binData: BinData[] = values.map((v: number, index) => ({\n      value: v,\n      count: bins[index],\n    }));\n\n    const boxPlot: BoxPlot = {\n      x: `Statistics ${i}`,\n      min,\n      firstQuartile,\n      median: points[Math.round(sampleSize / 2)],\n      thirdQuartile,\n      max,\n      outliers,\n    };\n\n    data.push({\n      boxPlot,\n      binData,\n    });\n  }\n\n  return data;\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/generators/getSeededRandom.ts",
    "content": "import { randomLcg } from 'd3-random';\n\n// returns a seeded random number generator\nexport default function getSeededRandom(\n  /** Seed in the interval [0, 1). */\n  seed: number,\n) {\n  return randomLcg(seed);\n}\n"
  },
  {
    "path": "packages/visx-mock-data/src/index.ts",
    "content": "// @visx/mock-data\nexport { default as genDateValue } from './generators/genDateValue';\nexport { default as genRandomNormalPoints } from './generators/genRandomNormalPoints';\nexport { default as getSeededRandom } from './generators/getSeededRandom';\nexport { randomNormal as getRandomNormal } from 'd3-random';\nexport { default as genBin } from './generators/genBin';\nexport { default as genBins } from './generators/genBins';\nexport { default as genPhyllotaxis } from './generators/genPhyllotaxis';\nexport { default as genStats } from './generators/genStats';\nexport { default as appleStock } from './mocks/appleStock';\nexport { default as bitcoinPrice } from './mocks/bitcoinPrice';\nexport { default as letterFrequency } from './mocks/letterFrequency';\nexport { default as browserUsage } from './mocks/browserUsage';\nexport { default as groupDateValue } from './mocks/groupDateValue';\nexport { default as cityTemperature } from './mocks/cityTemperature';\nexport { default as lesMiserables } from './mocks/lesMiserables';\nexport { default as exoplanets } from './mocks/exoplanets';\nexport { default as planets } from './mocks/planets';\nexport { default as shakespeare } from './mocks/shakespeare';\n\nexport type { Bin, BinFunction, CountFunction } from './generators/genBin';\nexport type { Bin as GenBin, Bins } from './generators/genBins';\nexport type { DateValue } from './generators/genDateValue';\nexport type {\n  GenPhyllotaxis,\n  GenPhyllotaxisFunction,\n  PhyllotaxisPoint,\n} from './generators/genPhyllotaxis';\nexport type { PointConfig, PointsRange } from './generators/genRandomNormalPoints';\nexport type { BinData, BoxPlot, Stats } from './generators/genStats';\nexport type { AppleStock } from './mocks/appleStock';\nexport type { BitcoinPrice, BitcoinPrices } from './mocks/bitcoinPrice';\nexport type { BrowserUsage } from './mocks/browserUsage';\nexport type { CityTemperature } from './mocks/cityTemperature';\nexport type { Exoplanets } from './mocks/exoplanets';\nexport type { GroupDateValue } from './mocks/groupDateValue';\nexport type { LesMiserables, LesMiserablesLink, LesMiserablesNode } from './mocks/lesMiserables';\nexport type { LetterFrequency } from './mocks/letterFrequency';\nexport type { Planets } from './mocks/planets';\nexport type { Shakespeare } from './mocks/shakespeare';\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/appleStock.ts",
    "content": "export interface AppleStock {\n  date: string;\n  close: number;\n}\n\nconst appleStock: AppleStock[] = [\n  { date: '2007-04-24T07:00:00.000Z', close: 93.24 },\n  { date: '2007-04-25T07:00:00.000Z', close: 95.35 },\n  { date: '2007-04-26T07:00:00.000Z', close: 98.84 },\n  { date: '2007-04-27T07:00:00.000Z', close: 99.92 },\n  { date: '2007-04-30T07:00:00.000Z', close: 99.8 },\n  { date: '2007-05-01T07:00:00.000Z', close: 99.47 },\n  { date: '2007-05-02T07:00:00.000Z', close: 100.39 },\n  { date: '2007-05-03T07:00:00.000Z', close: 100.4 },\n  { date: '2007-05-04T07:00:00.000Z', close: 100.81 },\n  { date: '2007-05-07T07:00:00.000Z', close: 103.92 },\n  { date: '2007-05-08T07:00:00.000Z', close: 105.06 },\n  { date: '2007-05-09T07:00:00.000Z', close: 106.88 },\n  { date: '2007-05-10T07:00:00.000Z', close: 107.34 },\n  { date: '2007-05-11T07:00:00.000Z', close: 108.74 },\n  { date: '2007-05-14T07:00:00.000Z', close: 109.36 },\n  { date: '2007-05-15T07:00:00.000Z', close: 107.52 },\n  { date: '2007-05-16T07:00:00.000Z', close: 107.34 },\n  { date: '2007-05-17T07:00:00.000Z', close: 109.44 },\n  { date: '2007-05-18T07:00:00.000Z', close: 110.02 },\n  { date: '2007-05-21T07:00:00.000Z', close: 111.98 },\n  { date: '2007-05-22T07:00:00.000Z', close: 113.54 },\n  { date: '2007-05-23T07:00:00.000Z', close: 112.89 },\n  { date: '2007-05-24T07:00:00.000Z', close: 110.69 },\n  { date: '2007-05-25T07:00:00.000Z', close: 113.62 },\n  { date: '2007-05-29T07:00:00.000Z', close: 114.35 },\n  { date: '2007-05-30T07:00:00.000Z', close: 118.77 },\n  { date: '2007-05-31T07:00:00.000Z', close: 121.19 },\n  { date: '2007-06-01T07:00:00.000Z', close: 118.4 },\n  { date: '2007-06-04T07:00:00.000Z', close: 121.33 },\n  { date: '2007-06-05T07:00:00.000Z', close: 122.67 },\n  { date: '2007-06-06T07:00:00.000Z', close: 123.64 },\n  { date: '2007-06-07T07:00:00.000Z', close: 124.07 },\n  { date: '2007-06-08T07:00:00.000Z', close: 124.49 },\n  { date: '2007-06-11T07:00:00.000Z', close: 120.19 },\n  { date: '2007-06-12T07:00:00.000Z', close: 120.38 },\n  { date: '2007-06-13T07:00:00.000Z', close: 117.5 },\n  { date: '2007-06-14T07:00:00.000Z', close: 118.75 },\n  { date: '2007-06-15T07:00:00.000Z', close: 120.5 },\n  { date: '2007-06-18T07:00:00.000Z', close: 125.09 },\n  { date: '2007-06-19T07:00:00.000Z', close: 123.66 },\n  { date: '2007-06-20T07:00:00.000Z', close: 121.55 },\n  { date: '2007-06-21T07:00:00.000Z', close: 123.9 },\n  { date: '2007-06-22T07:00:00.000Z', close: 123 },\n  { date: '2007-06-25T07:00:00.000Z', close: 122.34 },\n  { date: '2007-06-26T07:00:00.000Z', close: 119.65 },\n  { date: '2007-06-27T07:00:00.000Z', close: 121.89 },\n  { date: '2007-06-28T07:00:00.000Z', close: 120.56 },\n  { date: '2007-06-29T07:00:00.000Z', close: 122.04 },\n  { date: '2007-07-02T07:00:00.000Z', close: 121.26 },\n  { date: '2007-07-03T07:00:00.000Z', close: 127.17 },\n  { date: '2007-07-05T07:00:00.000Z', close: 132.75 },\n  { date: '2007-07-06T07:00:00.000Z', close: 132.3 },\n  { date: '2007-07-09T07:00:00.000Z', close: 130.33 },\n  { date: '2007-07-10T07:00:00.000Z', close: 132.35 },\n  { date: '2007-07-11T07:00:00.000Z', close: 132.39 },\n  { date: '2007-07-12T07:00:00.000Z', close: 134.07 },\n  { date: '2007-07-13T07:00:00.000Z', close: 137.73 },\n  { date: '2007-07-16T07:00:00.000Z', close: 138.1 },\n  { date: '2007-07-17T07:00:00.000Z', close: 138.91 },\n  { date: '2007-07-18T07:00:00.000Z', close: 138.12 },\n  { date: '2007-07-19T07:00:00.000Z', close: 140 },\n  { date: '2007-07-20T07:00:00.000Z', close: 143.75 },\n  { date: '2007-07-23T07:00:00.000Z', close: 143.7 },\n  { date: '2007-07-24T07:00:00.000Z', close: 134.89 },\n  { date: '2007-07-25T07:00:00.000Z', close: 137.26 },\n  { date: '2007-07-26T07:00:00.000Z', close: 146 },\n  { date: '2007-07-27T07:00:00.000Z', close: 143.85 },\n  { date: '2007-07-30T07:00:00.000Z', close: 141.43 },\n  { date: '2007-07-31T07:00:00.000Z', close: 131.76 },\n  { date: '2007-08-01T07:00:00.000Z', close: 135 },\n  { date: '2007-08-02T07:00:00.000Z', close: 136.49 },\n  { date: '2007-08-03T07:00:00.000Z', close: 131.85 },\n  { date: '2007-08-06T07:00:00.000Z', close: 135.25 },\n  { date: '2007-08-07T07:00:00.000Z', close: 135.03 },\n  { date: '2007-08-08T07:00:00.000Z', close: 134.01 },\n  { date: '2007-08-09T07:00:00.000Z', close: 126.39 },\n  { date: '2007-08-10T07:00:00.000Z', close: 125 },\n  { date: '2007-08-13T07:00:00.000Z', close: 127.79 },\n  { date: '2007-08-14T07:00:00.000Z', close: 124.03 },\n  { date: '2007-08-15T07:00:00.000Z', close: 119.9 },\n  { date: '2007-08-16T07:00:00.000Z', close: 117.05 },\n  { date: '2007-08-17T07:00:00.000Z', close: 122.06 },\n  { date: '2007-08-20T07:00:00.000Z', close: 122.22 },\n  { date: '2007-08-21T07:00:00.000Z', close: 127.57 },\n  { date: '2007-08-22T07:00:00.000Z', close: 132.51 },\n  { date: '2007-08-23T07:00:00.000Z', close: 131.07 },\n  { date: '2007-08-24T07:00:00.000Z', close: 135.3 },\n  { date: '2007-08-27T07:00:00.000Z', close: 132.25 },\n  { date: '2007-08-28T07:00:00.000Z', close: 126.82 },\n  { date: '2007-08-29T07:00:00.000Z', close: 134.08 },\n  { date: '2007-08-30T07:00:00.000Z', close: 136.25 },\n  { date: '2007-08-31T07:00:00.000Z', close: 138.48 },\n  { date: '2007-09-04T07:00:00.000Z', close: 144.16 },\n  { date: '2007-09-05T07:00:00.000Z', close: 136.76 },\n  { date: '2007-09-06T07:00:00.000Z', close: 135.01 },\n  { date: '2007-09-07T07:00:00.000Z', close: 131.77 },\n  { date: '2007-09-10T07:00:00.000Z', close: 136.71 },\n  { date: '2007-09-11T07:00:00.000Z', close: 135.49 },\n  { date: '2007-09-12T07:00:00.000Z', close: 136.85 },\n  { date: '2007-09-13T07:00:00.000Z', close: 137.2 },\n  { date: '2007-09-14T07:00:00.000Z', close: 138.81 },\n  { date: '2007-09-17T07:00:00.000Z', close: 138.41 },\n  { date: '2007-09-18T07:00:00.000Z', close: 140.92 },\n  { date: '2007-09-19T07:00:00.000Z', close: 140.77 },\n  { date: '2007-09-20T07:00:00.000Z', close: 140.31 },\n  { date: '2007-09-21T07:00:00.000Z', close: 144.15 },\n  { date: '2007-09-24T07:00:00.000Z', close: 148.28 },\n  { date: '2007-09-25T07:00:00.000Z', close: 153.18 },\n  { date: '2007-09-26T07:00:00.000Z', close: 152.77 },\n  { date: '2007-09-27T07:00:00.000Z', close: 154.5 },\n  { date: '2007-09-28T07:00:00.000Z', close: 153.47 },\n  { date: '2007-10-01T07:00:00.000Z', close: 156.34 },\n  { date: '2007-10-02T07:00:00.000Z', close: 158.45 },\n  { date: '2007-10-03T07:00:00.000Z', close: 157.92 },\n  { date: '2007-10-04T07:00:00.000Z', close: 156.24 },\n  { date: '2007-10-05T07:00:00.000Z', close: 161.45 },\n  { date: '2007-10-08T07:00:00.000Z', close: 167.91 },\n  { date: '2007-10-09T07:00:00.000Z', close: 167.86 },\n  { date: '2007-10-10T07:00:00.000Z', close: 166.79 },\n  { date: '2007-10-11T07:00:00.000Z', close: 162.23 },\n  { date: '2007-10-12T07:00:00.000Z', close: 167.25 },\n  { date: '2007-10-15T07:00:00.000Z', close: 166.98 },\n  { date: '2007-10-16T07:00:00.000Z', close: 169.58 },\n  { date: '2007-10-17T07:00:00.000Z', close: 172.75 },\n  { date: '2007-10-18T07:00:00.000Z', close: 173.5 },\n  { date: '2007-10-19T07:00:00.000Z', close: 170.42 },\n  { date: '2007-10-22T07:00:00.000Z', close: 174.36 },\n  { date: '2007-10-23T07:00:00.000Z', close: 186.16 },\n  { date: '2007-10-24T07:00:00.000Z', close: 185.93 },\n  { date: '2007-10-25T07:00:00.000Z', close: 182.78 },\n  { date: '2007-10-26T07:00:00.000Z', close: 184.7 },\n  { date: '2007-10-29T07:00:00.000Z', close: 185.09 },\n  { date: '2007-10-30T07:00:00.000Z', close: 187 },\n  { date: '2007-10-31T07:00:00.000Z', close: 189.95 },\n  { date: '2007-11-01T07:00:00.000Z', close: 187.44 },\n  { date: '2007-11-02T07:00:00.000Z', close: 187.87 },\n  { date: '2007-11-05T08:00:00.000Z', close: 186.18 },\n  { date: '2007-11-06T08:00:00.000Z', close: 191.79 },\n  { date: '2007-11-07T08:00:00.000Z', close: 186.3 },\n  { date: '2007-11-08T08:00:00.000Z', close: 175.47 },\n  { date: '2007-11-09T08:00:00.000Z', close: 165.37 },\n  { date: '2007-11-12T08:00:00.000Z', close: 153.76 },\n  { date: '2007-11-13T08:00:00.000Z', close: 169.96 },\n  { date: '2007-11-14T08:00:00.000Z', close: 166.11 },\n  { date: '2007-11-15T08:00:00.000Z', close: 164.3 },\n  { date: '2007-11-16T08:00:00.000Z', close: 166.39 },\n  { date: '2007-11-19T08:00:00.000Z', close: 163.95 },\n  { date: '2007-11-20T08:00:00.000Z', close: 168.85 },\n  { date: '2007-11-21T08:00:00.000Z', close: 168.46 },\n  { date: '2007-11-23T08:00:00.000Z', close: 171.54 },\n  { date: '2007-11-26T08:00:00.000Z', close: 172.54 },\n  { date: '2007-11-27T08:00:00.000Z', close: 174.81 },\n  { date: '2007-11-28T08:00:00.000Z', close: 180.22 },\n  { date: '2007-11-29T08:00:00.000Z', close: 184.29 },\n  { date: '2007-11-30T08:00:00.000Z', close: 182.22 },\n  { date: '2007-12-03T08:00:00.000Z', close: 178.86 },\n  { date: '2007-12-04T08:00:00.000Z', close: 179.81 },\n  { date: '2007-12-05T08:00:00.000Z', close: 185.5 },\n  { date: '2007-12-06T08:00:00.000Z', close: 189.95 },\n  { date: '2007-12-07T08:00:00.000Z', close: 194.3 },\n  { date: '2007-12-10T08:00:00.000Z', close: 194.21 },\n  { date: '2007-12-11T08:00:00.000Z', close: 188.54 },\n  { date: '2007-12-12T08:00:00.000Z', close: 190.86 },\n  { date: '2007-12-13T08:00:00.000Z', close: 191.83 },\n  { date: '2007-12-14T08:00:00.000Z', close: 190.39 },\n  { date: '2007-12-17T08:00:00.000Z', close: 184.4 },\n  { date: '2007-12-18T08:00:00.000Z', close: 182.98 },\n  { date: '2007-12-19T08:00:00.000Z', close: 183.12 },\n  { date: '2007-12-20T08:00:00.000Z', close: 187.21 },\n  { date: '2007-12-21T08:00:00.000Z', close: 193.91 },\n  { date: '2007-12-24T08:00:00.000Z', close: 198.8 },\n  { date: '2007-12-26T08:00:00.000Z', close: 198.95 },\n  { date: '2007-12-27T08:00:00.000Z', close: 198.57 },\n  { date: '2007-12-28T08:00:00.000Z', close: 199.83 },\n  { date: '2007-12-31T08:00:00.000Z', close: 198.08 },\n  { date: '2008-01-02T08:00:00.000Z', close: 194.84 },\n  { date: '2008-01-03T08:00:00.000Z', close: 194.93 },\n  { date: '2008-01-04T08:00:00.000Z', close: 180.05 },\n  { date: '2008-01-07T08:00:00.000Z', close: 177.64 },\n  { date: '2008-01-08T08:00:00.000Z', close: 171.25 },\n  { date: '2008-01-09T08:00:00.000Z', close: 179.4 },\n  { date: '2008-01-10T08:00:00.000Z', close: 178.02 },\n  { date: '2008-01-11T08:00:00.000Z', close: 172.69 },\n  { date: '2008-01-14T08:00:00.000Z', close: 178.78 },\n  { date: '2008-01-15T08:00:00.000Z', close: 169.04 },\n  { date: '2008-01-16T08:00:00.000Z', close: 159.64 },\n  { date: '2008-01-17T08:00:00.000Z', close: 160.89 },\n  { date: '2008-01-18T08:00:00.000Z', close: 161.36 },\n  { date: '2008-01-22T08:00:00.000Z', close: 155.64 },\n  { date: '2008-01-23T08:00:00.000Z', close: 139.07 },\n  { date: '2008-01-24T08:00:00.000Z', close: 135.6 },\n  { date: '2008-01-25T08:00:00.000Z', close: 130.01 },\n  { date: '2008-01-28T08:00:00.000Z', close: 130.01 },\n  { date: '2008-01-29T08:00:00.000Z', close: 131.54 },\n  { date: '2008-01-30T08:00:00.000Z', close: 132.18 },\n  { date: '2008-01-31T08:00:00.000Z', close: 135.36 },\n  { date: '2008-02-01T08:00:00.000Z', close: 133.75 },\n  { date: '2008-02-04T08:00:00.000Z', close: 131.65 },\n  { date: '2008-02-05T08:00:00.000Z', close: 129.36 },\n  { date: '2008-02-06T08:00:00.000Z', close: 122 },\n  { date: '2008-02-07T08:00:00.000Z', close: 121.24 },\n  { date: '2008-02-08T08:00:00.000Z', close: 125.48 },\n  { date: '2008-02-11T08:00:00.000Z', close: 129.45 },\n  { date: '2008-02-12T08:00:00.000Z', close: 124.86 },\n  { date: '2008-02-13T08:00:00.000Z', close: 129.4 },\n  { date: '2008-02-14T08:00:00.000Z', close: 127.46 },\n  { date: '2008-02-15T08:00:00.000Z', close: 124.63 },\n  { date: '2008-02-19T08:00:00.000Z', close: 122.18 },\n  { date: '2008-02-20T08:00:00.000Z', close: 123.82 },\n  { date: '2008-02-21T08:00:00.000Z', close: 121.54 },\n  { date: '2008-02-22T08:00:00.000Z', close: 119.46 },\n  { date: '2008-02-25T08:00:00.000Z', close: 119.74 },\n  { date: '2008-02-26T08:00:00.000Z', close: 119.15 },\n  { date: '2008-02-27T08:00:00.000Z', close: 122.96 },\n  { date: '2008-02-28T08:00:00.000Z', close: 129.91 },\n  { date: '2008-02-29T08:00:00.000Z', close: 125.02 },\n  { date: '2008-03-03T08:00:00.000Z', close: 121.73 },\n  { date: '2008-03-04T08:00:00.000Z', close: 124.62 },\n  { date: '2008-03-05T08:00:00.000Z', close: 124.49 },\n  { date: '2008-03-06T08:00:00.000Z', close: 120.93 },\n  { date: '2008-03-07T08:00:00.000Z', close: 122.25 },\n  { date: '2008-03-10T07:00:00.000Z', close: 119.69 },\n  { date: '2008-03-11T07:00:00.000Z', close: 127.35 },\n  { date: '2008-03-12T07:00:00.000Z', close: 126.03 },\n  { date: '2008-03-13T07:00:00.000Z', close: 127.94 },\n  { date: '2008-03-14T07:00:00.000Z', close: 126.61 },\n  { date: '2008-03-17T07:00:00.000Z', close: 126.73 },\n  { date: '2008-03-18T07:00:00.000Z', close: 132.82 },\n  { date: '2008-03-19T07:00:00.000Z', close: 129.67 },\n  { date: '2008-03-20T07:00:00.000Z', close: 133.27 },\n  { date: '2008-03-24T07:00:00.000Z', close: 139.53 },\n  { date: '2008-03-25T07:00:00.000Z', close: 140.98 },\n  { date: '2008-03-26T07:00:00.000Z', close: 145.06 },\n  { date: '2008-03-27T07:00:00.000Z', close: 140.25 },\n  { date: '2008-03-28T07:00:00.000Z', close: 143.01 },\n  { date: '2008-03-31T07:00:00.000Z', close: 143.5 },\n  { date: '2008-04-01T07:00:00.000Z', close: 149.53 },\n  { date: '2008-04-02T07:00:00.000Z', close: 147.49 },\n  { date: '2008-04-03T07:00:00.000Z', close: 151.61 },\n  { date: '2008-04-04T07:00:00.000Z', close: 153.08 },\n  { date: '2008-04-07T07:00:00.000Z', close: 155.89 },\n  { date: '2008-04-08T07:00:00.000Z', close: 152.84 },\n  { date: '2008-04-09T07:00:00.000Z', close: 151.44 },\n  { date: '2008-04-10T07:00:00.000Z', close: 154.55 },\n  { date: '2008-04-11T07:00:00.000Z', close: 147.14 },\n  { date: '2008-04-14T07:00:00.000Z', close: 147.78 },\n  { date: '2008-04-15T07:00:00.000Z', close: 148.38 },\n  { date: '2008-04-16T07:00:00.000Z', close: 153.7 },\n  { date: '2008-04-17T07:00:00.000Z', close: 154.49 },\n  { date: '2008-04-18T07:00:00.000Z', close: 161.04 },\n  { date: '2008-04-21T07:00:00.000Z', close: 168.16 },\n  { date: '2008-04-22T07:00:00.000Z', close: 160.2 },\n  { date: '2008-04-23T07:00:00.000Z', close: 162.89 },\n  { date: '2008-04-24T07:00:00.000Z', close: 168.94 },\n  { date: '2008-04-25T07:00:00.000Z', close: 169.73 },\n  { date: '2008-04-28T07:00:00.000Z', close: 172.24 },\n  { date: '2008-04-29T07:00:00.000Z', close: 175.05 },\n  { date: '2008-04-30T07:00:00.000Z', close: 173.95 },\n  { date: '2008-05-01T07:00:00.000Z', close: 180 },\n  { date: '2008-05-02T07:00:00.000Z', close: 180.94 },\n  { date: '2008-05-05T07:00:00.000Z', close: 184.73 },\n  { date: '2008-05-06T07:00:00.000Z', close: 186.66 },\n  { date: '2008-05-07T07:00:00.000Z', close: 182.59 },\n  { date: '2008-05-08T07:00:00.000Z', close: 185.06 },\n  { date: '2008-05-09T07:00:00.000Z', close: 183.45 },\n  { date: '2008-05-12T07:00:00.000Z', close: 188.16 },\n  { date: '2008-05-13T07:00:00.000Z', close: 189.96 },\n  { date: '2008-05-14T07:00:00.000Z', close: 186.26 },\n  { date: '2008-05-15T07:00:00.000Z', close: 189.73 },\n  { date: '2008-05-16T07:00:00.000Z', close: 187.62 },\n  { date: '2008-05-19T07:00:00.000Z', close: 183.6 },\n  { date: '2008-05-20T07:00:00.000Z', close: 185.9 },\n  { date: '2008-05-21T07:00:00.000Z', close: 178.19 },\n  { date: '2008-05-22T07:00:00.000Z', close: 177.05 },\n  { date: '2008-05-23T07:00:00.000Z', close: 181.17 },\n  { date: '2008-05-27T07:00:00.000Z', close: 186.43 },\n  { date: '2008-05-28T07:00:00.000Z', close: 187.01 },\n  { date: '2008-05-29T07:00:00.000Z', close: 186.69 },\n  { date: '2008-05-30T07:00:00.000Z', close: 188.75 },\n  { date: '2008-06-02T07:00:00.000Z', close: 186.1 },\n  { date: '2008-06-03T07:00:00.000Z', close: 185.37 },\n  { date: '2008-06-04T07:00:00.000Z', close: 185.19 },\n  { date: '2008-06-05T07:00:00.000Z', close: 189.43 },\n  { date: '2008-06-06T07:00:00.000Z', close: 185.64 },\n  { date: '2008-06-09T07:00:00.000Z', close: 181.61 },\n  { date: '2008-06-10T07:00:00.000Z', close: 185.64 },\n  { date: '2008-06-11T07:00:00.000Z', close: 180.81 },\n  { date: '2008-06-12T07:00:00.000Z', close: 173.26 },\n  { date: '2008-06-13T07:00:00.000Z', close: 172.37 },\n  { date: '2008-06-16T07:00:00.000Z', close: 176.84 },\n  { date: '2008-06-17T07:00:00.000Z', close: 181.43 },\n  { date: '2008-06-18T07:00:00.000Z', close: 178.75 },\n  { date: '2008-06-19T07:00:00.000Z', close: 180.9 },\n  { date: '2008-06-20T07:00:00.000Z', close: 175.27 },\n  { date: '2008-06-23T07:00:00.000Z', close: 173.16 },\n  { date: '2008-06-24T07:00:00.000Z', close: 173.25 },\n  { date: '2008-06-25T07:00:00.000Z', close: 177.39 },\n  { date: '2008-06-26T07:00:00.000Z', close: 168.26 },\n  { date: '2008-06-27T07:00:00.000Z', close: 170.09 },\n  { date: '2008-06-30T07:00:00.000Z', close: 167.44 },\n  { date: '2008-07-01T07:00:00.000Z', close: 174.68 },\n  { date: '2008-07-02T07:00:00.000Z', close: 168.18 },\n  { date: '2008-07-03T07:00:00.000Z', close: 170.12 },\n  { date: '2008-07-07T07:00:00.000Z', close: 175.16 },\n  { date: '2008-07-08T07:00:00.000Z', close: 179.55 },\n  { date: '2008-07-09T07:00:00.000Z', close: 174.25 },\n  { date: '2008-07-10T07:00:00.000Z', close: 176.63 },\n  { date: '2008-07-11T07:00:00.000Z', close: 172.58 },\n  { date: '2008-07-14T07:00:00.000Z', close: 173.88 },\n  { date: '2008-07-15T07:00:00.000Z', close: 169.64 },\n  { date: '2008-07-16T07:00:00.000Z', close: 172.81 },\n  { date: '2008-07-17T07:00:00.000Z', close: 171.81 },\n  { date: '2008-07-18T07:00:00.000Z', close: 165.15 },\n  { date: '2008-07-21T07:00:00.000Z', close: 166.29 },\n  { date: '2008-07-22T07:00:00.000Z', close: 162.02 },\n  { date: '2008-07-23T07:00:00.000Z', close: 166.26 },\n  { date: '2008-07-24T07:00:00.000Z', close: 159.03 },\n  { date: '2008-07-25T07:00:00.000Z', close: 162.12 },\n  { date: '2008-07-28T07:00:00.000Z', close: 154.4 },\n  { date: '2008-07-29T07:00:00.000Z', close: 157.08 },\n  { date: '2008-07-30T07:00:00.000Z', close: 159.88 },\n  { date: '2008-07-31T07:00:00.000Z', close: 158.95 },\n  { date: '2008-08-01T07:00:00.000Z', close: 156.66 },\n  { date: '2008-08-04T07:00:00.000Z', close: 153.23 },\n  { date: '2008-08-05T07:00:00.000Z', close: 160.64 },\n  { date: '2008-08-06T07:00:00.000Z', close: 164.19 },\n  { date: '2008-08-07T07:00:00.000Z', close: 163.57 },\n  { date: '2008-08-08T07:00:00.000Z', close: 169.55 },\n  { date: '2008-08-11T07:00:00.000Z', close: 173.56 },\n  { date: '2008-08-12T07:00:00.000Z', close: 176.73 },\n  { date: '2008-08-13T07:00:00.000Z', close: 179.3 },\n  { date: '2008-08-14T07:00:00.000Z', close: 179.32 },\n  { date: '2008-08-15T07:00:00.000Z', close: 175.74 },\n  { date: '2008-08-18T07:00:00.000Z', close: 175.39 },\n  { date: '2008-08-19T07:00:00.000Z', close: 173.53 },\n  { date: '2008-08-20T07:00:00.000Z', close: 175.84 },\n  { date: '2008-08-21T07:00:00.000Z', close: 174.29 },\n  { date: '2008-08-22T07:00:00.000Z', close: 176.79 },\n  { date: '2008-08-25T07:00:00.000Z', close: 172.55 },\n  { date: '2008-08-26T07:00:00.000Z', close: 173.64 },\n  { date: '2008-08-27T07:00:00.000Z', close: 174.67 },\n  { date: '2008-08-28T07:00:00.000Z', close: 173.74 },\n  { date: '2008-08-29T07:00:00.000Z', close: 169.53 },\n  { date: '2008-09-02T07:00:00.000Z', close: 166.19 },\n  { date: '2008-09-03T07:00:00.000Z', close: 166.96 },\n  { date: '2008-09-04T07:00:00.000Z', close: 161.22 },\n  { date: '2008-09-05T07:00:00.000Z', close: 160.18 },\n  { date: '2008-09-08T07:00:00.000Z', close: 157.92 },\n  { date: '2008-09-09T07:00:00.000Z', close: 151.68 },\n  { date: '2008-09-10T07:00:00.000Z', close: 151.61 },\n  { date: '2008-09-11T07:00:00.000Z', close: 152.65 },\n  { date: '2008-09-12T07:00:00.000Z', close: 148.94 },\n  { date: '2008-09-15T07:00:00.000Z', close: 140.36 },\n  { date: '2008-09-16T07:00:00.000Z', close: 139.88 },\n  { date: '2008-09-17T07:00:00.000Z', close: 127.83 },\n  { date: '2008-09-18T07:00:00.000Z', close: 134.09 },\n  { date: '2008-09-19T07:00:00.000Z', close: 140.91 },\n  { date: '2008-09-22T07:00:00.000Z', close: 131.05 },\n  { date: '2008-09-23T07:00:00.000Z', close: 126.84 },\n  { date: '2008-09-24T07:00:00.000Z', close: 128.71 },\n  { date: '2008-09-25T07:00:00.000Z', close: 131.93 },\n  { date: '2008-09-26T07:00:00.000Z', close: 128.24 },\n  { date: '2008-09-29T07:00:00.000Z', close: 105.26 },\n  { date: '2008-09-30T07:00:00.000Z', close: 113.66 },\n  { date: '2008-10-01T07:00:00.000Z', close: 109.12 },\n  { date: '2008-10-02T07:00:00.000Z', close: 100.1 },\n  { date: '2008-10-03T07:00:00.000Z', close: 97.07 },\n  { date: '2008-10-06T07:00:00.000Z', close: 98.14 },\n  { date: '2008-10-07T07:00:00.000Z', close: 89.16 },\n  { date: '2008-10-08T07:00:00.000Z', close: 89.79 },\n  { date: '2008-10-09T07:00:00.000Z', close: 88.74 },\n  { date: '2008-10-10T07:00:00.000Z', close: 96.8 },\n  { date: '2008-10-13T07:00:00.000Z', close: 110.26 },\n  { date: '2008-10-14T07:00:00.000Z', close: 104.08 },\n  { date: '2008-10-15T07:00:00.000Z', close: 97.95 },\n  { date: '2008-10-16T07:00:00.000Z', close: 101.89 },\n  { date: '2008-10-17T07:00:00.000Z', close: 97.4 },\n  { date: '2008-10-20T07:00:00.000Z', close: 98.44 },\n  { date: '2008-10-21T07:00:00.000Z', close: 91.49 },\n  { date: '2008-10-22T07:00:00.000Z', close: 96.87 },\n  { date: '2008-10-23T07:00:00.000Z', close: 98.23 },\n  { date: '2008-10-24T07:00:00.000Z', close: 96.38 },\n  { date: '2008-10-27T07:00:00.000Z', close: 92.09 },\n  { date: '2008-10-28T07:00:00.000Z', close: 99.91 },\n  { date: '2008-10-29T07:00:00.000Z', close: 104.55 },\n  { date: '2008-10-30T07:00:00.000Z', close: 111.04 },\n  { date: '2008-10-31T07:00:00.000Z', close: 107.59 },\n  { date: '2008-11-03T08:00:00.000Z', close: 106.96 },\n  { date: '2008-11-04T08:00:00.000Z', close: 110.99 },\n  { date: '2008-11-05T08:00:00.000Z', close: 103.3 },\n  { date: '2008-11-06T08:00:00.000Z', close: 99.1 },\n  { date: '2008-11-07T08:00:00.000Z', close: 98.24 },\n  { date: '2008-11-10T08:00:00.000Z', close: 95.88 },\n  { date: '2008-11-11T08:00:00.000Z', close: 94.77 },\n  { date: '2008-11-12T08:00:00.000Z', close: 90.12 },\n  { date: '2008-11-13T08:00:00.000Z', close: 96.44 },\n  { date: '2008-11-14T08:00:00.000Z', close: 90.24 },\n  { date: '2008-11-17T08:00:00.000Z', close: 88.14 },\n  { date: '2008-11-18T08:00:00.000Z', close: 89.91 },\n  { date: '2008-11-19T08:00:00.000Z', close: 86.29 },\n  { date: '2008-11-20T08:00:00.000Z', close: 80.49 },\n  { date: '2008-11-21T08:00:00.000Z', close: 82.58 },\n  { date: '2008-11-24T08:00:00.000Z', close: 92.95 },\n  { date: '2008-11-25T08:00:00.000Z', close: 90.8 },\n  { date: '2008-11-26T08:00:00.000Z', close: 95 },\n  { date: '2008-11-27T08:00:00.000Z', close: 95 },\n  { date: '2008-11-28T08:00:00.000Z', close: 92.67 },\n  { date: '2008-12-01T08:00:00.000Z', close: 88.93 },\n  { date: '2008-12-02T08:00:00.000Z', close: 92.47 },\n  { date: '2008-12-03T08:00:00.000Z', close: 95.9 },\n  { date: '2008-12-04T08:00:00.000Z', close: 91.41 },\n  { date: '2008-12-05T08:00:00.000Z', close: 94 },\n  { date: '2008-12-08T08:00:00.000Z', close: 99.72 },\n  { date: '2008-12-09T08:00:00.000Z', close: 100.06 },\n  { date: '2008-12-10T08:00:00.000Z', close: 98.21 },\n  { date: '2008-12-11T08:00:00.000Z', close: 95 },\n  { date: '2008-12-12T08:00:00.000Z', close: 98.27 },\n  { date: '2008-12-15T08:00:00.000Z', close: 94.75 },\n  { date: '2008-12-16T08:00:00.000Z', close: 95.43 },\n  { date: '2008-12-17T08:00:00.000Z', close: 89.16 },\n  { date: '2008-12-18T08:00:00.000Z', close: 89.43 },\n  { date: '2008-12-19T08:00:00.000Z', close: 90 },\n  { date: '2008-12-22T08:00:00.000Z', close: 85.74 },\n  { date: '2008-12-23T08:00:00.000Z', close: 86.38 },\n  { date: '2008-12-24T08:00:00.000Z', close: 85.04 },\n  { date: '2008-12-25T08:00:00.000Z', close: 85.04 },\n  { date: '2008-12-26T08:00:00.000Z', close: 85.81 },\n  { date: '2008-12-29T08:00:00.000Z', close: 86.61 },\n  { date: '2008-12-30T08:00:00.000Z', close: 86.29 },\n  { date: '2008-12-31T08:00:00.000Z', close: 85.35 },\n  { date: '2009-01-01T08:00:00.000Z', close: 85.35 },\n  { date: '2009-01-02T08:00:00.000Z', close: 90.75 },\n  { date: '2009-01-05T08:00:00.000Z', close: 94.58 },\n  { date: '2009-01-06T08:00:00.000Z', close: 93.02 },\n  { date: '2009-01-07T08:00:00.000Z', close: 91.01 },\n  { date: '2009-01-08T08:00:00.000Z', close: 92.7 },\n  { date: '2009-01-09T08:00:00.000Z', close: 90.58 },\n  { date: '2009-01-12T08:00:00.000Z', close: 88.66 },\n  { date: '2009-01-13T08:00:00.000Z', close: 87.71 },\n  { date: '2009-01-14T08:00:00.000Z', close: 85.33 },\n  { date: '2009-01-15T08:00:00.000Z', close: 83.38 },\n  { date: '2009-01-16T08:00:00.000Z', close: 82.33 },\n  { date: '2009-01-20T08:00:00.000Z', close: 78.2 },\n  { date: '2009-01-21T08:00:00.000Z', close: 82.83 },\n  { date: '2009-01-22T08:00:00.000Z', close: 88.36 },\n  { date: '2009-01-23T08:00:00.000Z', close: 88.36 },\n  { date: '2009-01-26T08:00:00.000Z', close: 89.64 },\n  { date: '2009-01-27T08:00:00.000Z', close: 90.73 },\n  { date: '2009-01-28T08:00:00.000Z', close: 94.2 },\n  { date: '2009-01-29T08:00:00.000Z', close: 93 },\n  { date: '2009-01-30T08:00:00.000Z', close: 90.13 },\n  { date: '2009-02-02T08:00:00.000Z', close: 91.51 },\n  { date: '2009-02-03T08:00:00.000Z', close: 92.98 },\n  { date: '2009-02-04T08:00:00.000Z', close: 93.55 },\n  { date: '2009-02-05T08:00:00.000Z', close: 96.46 },\n  { date: '2009-02-06T08:00:00.000Z', close: 99.72 },\n  { date: '2009-02-09T08:00:00.000Z', close: 102.51 },\n  { date: '2009-02-10T08:00:00.000Z', close: 97.83 },\n  { date: '2009-02-11T08:00:00.000Z', close: 96.82 },\n  { date: '2009-02-12T08:00:00.000Z', close: 99.27 },\n  { date: '2009-02-13T08:00:00.000Z', close: 99.16 },\n  { date: '2009-02-17T08:00:00.000Z', close: 94.53 },\n  { date: '2009-02-18T08:00:00.000Z', close: 94.37 },\n  { date: '2009-02-19T08:00:00.000Z', close: 90.64 },\n  { date: '2009-02-20T08:00:00.000Z', close: 91.2 },\n  { date: '2009-02-23T08:00:00.000Z', close: 86.95 },\n  { date: '2009-02-24T08:00:00.000Z', close: 90.25 },\n  { date: '2009-02-25T08:00:00.000Z', close: 91.16 },\n  { date: '2009-02-26T08:00:00.000Z', close: 89.19 },\n  { date: '2009-02-27T08:00:00.000Z', close: 89.31 },\n  { date: '2009-03-02T08:00:00.000Z', close: 87.94 },\n  { date: '2009-03-03T08:00:00.000Z', close: 88.37 },\n  { date: '2009-03-04T08:00:00.000Z', close: 91.17 },\n  { date: '2009-03-05T08:00:00.000Z', close: 88.84 },\n  { date: '2009-03-06T08:00:00.000Z', close: 85.3 },\n  { date: '2009-03-09T07:00:00.000Z', close: 83.11 },\n  { date: '2009-03-10T07:00:00.000Z', close: 88.63 },\n  { date: '2009-03-11T07:00:00.000Z', close: 92.68 },\n  { date: '2009-03-12T07:00:00.000Z', close: 96.35 },\n  { date: '2009-03-13T07:00:00.000Z', close: 95.93 },\n  { date: '2009-03-16T07:00:00.000Z', close: 95.42 },\n  { date: '2009-03-17T07:00:00.000Z', close: 99.66 },\n  { date: '2009-03-18T07:00:00.000Z', close: 101.52 },\n  { date: '2009-03-19T07:00:00.000Z', close: 101.62 },\n  { date: '2009-03-20T07:00:00.000Z', close: 101.59 },\n  { date: '2009-03-23T07:00:00.000Z', close: 107.66 },\n  { date: '2009-03-24T07:00:00.000Z', close: 106.5 },\n  { date: '2009-03-25T07:00:00.000Z', close: 106.49 },\n  { date: '2009-03-26T07:00:00.000Z', close: 109.87 },\n  { date: '2009-03-27T07:00:00.000Z', close: 106.85 },\n  { date: '2009-03-30T07:00:00.000Z', close: 104.49 },\n  { date: '2009-03-31T07:00:00.000Z', close: 105.12 },\n  { date: '2009-04-01T07:00:00.000Z', close: 108.69 },\n  { date: '2009-04-02T07:00:00.000Z', close: 112.71 },\n  { date: '2009-04-03T07:00:00.000Z', close: 115.99 },\n  { date: '2009-04-06T07:00:00.000Z', close: 118.45 },\n  { date: '2009-04-07T07:00:00.000Z', close: 115 },\n  { date: '2009-04-08T07:00:00.000Z', close: 116.32 },\n  { date: '2009-04-09T07:00:00.000Z', close: 119.57 },\n  { date: '2009-04-10T07:00:00.000Z', close: 119.57 },\n  { date: '2009-04-13T07:00:00.000Z', close: 120.22 },\n  { date: '2009-04-14T07:00:00.000Z', close: 118.31 },\n  { date: '2009-04-15T07:00:00.000Z', close: 117.64 },\n  { date: '2009-04-16T07:00:00.000Z', close: 121.45 },\n  { date: '2009-04-17T07:00:00.000Z', close: 123.42 },\n  { date: '2009-04-20T07:00:00.000Z', close: 120.5 },\n  { date: '2009-04-21T07:00:00.000Z', close: 121.76 },\n  { date: '2009-04-22T07:00:00.000Z', close: 121.51 },\n  { date: '2009-04-23T07:00:00.000Z', close: 125.4 },\n  { date: '2009-04-24T07:00:00.000Z', close: 123.9 },\n  { date: '2009-04-27T07:00:00.000Z', close: 124.73 },\n  { date: '2009-04-28T07:00:00.000Z', close: 123.9 },\n  { date: '2009-04-29T07:00:00.000Z', close: 125.14 },\n  { date: '2009-04-30T07:00:00.000Z', close: 125.83 },\n  { date: '2009-05-01T07:00:00.000Z', close: 127.24 },\n  { date: '2009-05-04T07:00:00.000Z', close: 132.07 },\n  { date: '2009-05-05T07:00:00.000Z', close: 132.71 },\n  { date: '2009-05-06T07:00:00.000Z', close: 132.5 },\n  { date: '2009-05-07T07:00:00.000Z', close: 129.06 },\n  { date: '2009-05-08T07:00:00.000Z', close: 129.19 },\n  { date: '2009-05-11T07:00:00.000Z', close: 129.57 },\n  { date: '2009-05-12T07:00:00.000Z', close: 124.42 },\n  { date: '2009-05-13T07:00:00.000Z', close: 119.49 },\n  { date: '2009-05-14T07:00:00.000Z', close: 122.95 },\n  { date: '2009-05-15T07:00:00.000Z', close: 122.42 },\n  { date: '2009-05-18T07:00:00.000Z', close: 126.65 },\n  { date: '2009-05-19T07:00:00.000Z', close: 127.45 },\n  { date: '2009-05-20T07:00:00.000Z', close: 125.87 },\n  { date: '2009-05-21T07:00:00.000Z', close: 124.18 },\n  { date: '2009-05-22T07:00:00.000Z', close: 122.5 },\n  { date: '2009-05-26T07:00:00.000Z', close: 130.78 },\n  { date: '2009-05-27T07:00:00.000Z', close: 133.05 },\n  { date: '2009-05-28T07:00:00.000Z', close: 135.07 },\n  { date: '2009-05-29T07:00:00.000Z', close: 135.81 },\n  { date: '2009-06-01T07:00:00.000Z', close: 139.35 },\n  { date: '2009-06-02T07:00:00.000Z', close: 139.49 },\n  { date: '2009-06-03T07:00:00.000Z', close: 140.95 },\n  { date: '2009-06-04T07:00:00.000Z', close: 143.74 },\n  { date: '2009-06-05T07:00:00.000Z', close: 144.67 },\n  { date: '2009-06-08T07:00:00.000Z', close: 143.85 },\n  { date: '2009-06-09T07:00:00.000Z', close: 142.72 },\n  { date: '2009-06-10T07:00:00.000Z', close: 140.25 },\n  { date: '2009-06-11T07:00:00.000Z', close: 139.95 },\n  { date: '2009-06-12T07:00:00.000Z', close: 136.97 },\n  { date: '2009-06-15T07:00:00.000Z', close: 136.09 },\n  { date: '2009-06-16T07:00:00.000Z', close: 136.35 },\n  { date: '2009-06-17T07:00:00.000Z', close: 135.58 },\n  { date: '2009-06-18T07:00:00.000Z', close: 135.88 },\n  { date: '2009-06-19T07:00:00.000Z', close: 139.48 },\n  { date: '2009-06-22T07:00:00.000Z', close: 137.37 },\n  { date: '2009-06-23T07:00:00.000Z', close: 134.01 },\n  { date: '2009-06-24T07:00:00.000Z', close: 136.22 },\n  { date: '2009-06-25T07:00:00.000Z', close: 139.86 },\n  { date: '2009-06-26T07:00:00.000Z', close: 142.44 },\n  { date: '2009-06-29T07:00:00.000Z', close: 141.97 },\n  { date: '2009-06-30T07:00:00.000Z', close: 142.43 },\n  { date: '2009-07-01T07:00:00.000Z', close: 142.83 },\n  { date: '2009-07-02T07:00:00.000Z', close: 140.02 },\n  { date: '2009-07-03T07:00:00.000Z', close: 140.02 },\n  { date: '2009-07-06T07:00:00.000Z', close: 138.61 },\n  { date: '2009-07-07T07:00:00.000Z', close: 135.4 },\n  { date: '2009-07-08T07:00:00.000Z', close: 137.22 },\n  { date: '2009-07-09T07:00:00.000Z', close: 136.36 },\n  { date: '2009-07-10T07:00:00.000Z', close: 138.52 },\n  { date: '2009-07-13T07:00:00.000Z', close: 142.34 },\n  { date: '2009-07-14T07:00:00.000Z', close: 142.27 },\n  { date: '2009-07-15T07:00:00.000Z', close: 146.88 },\n  { date: '2009-07-16T07:00:00.000Z', close: 147.52 },\n  { date: '2009-07-17T07:00:00.000Z', close: 151.75 },\n  { date: '2009-07-20T07:00:00.000Z', close: 152.91 },\n  { date: '2009-07-21T07:00:00.000Z', close: 151.51 },\n  { date: '2009-07-22T07:00:00.000Z', close: 156.74 },\n  { date: '2009-07-23T07:00:00.000Z', close: 157.82 },\n  { date: '2009-07-24T07:00:00.000Z', close: 159.99 },\n  { date: '2009-07-27T07:00:00.000Z', close: 160.1 },\n  { date: '2009-07-28T07:00:00.000Z', close: 160 },\n  { date: '2009-07-29T07:00:00.000Z', close: 160.03 },\n  { date: '2009-07-30T07:00:00.000Z', close: 162.79 },\n  { date: '2009-07-31T07:00:00.000Z', close: 163.39 },\n  { date: '2009-08-03T07:00:00.000Z', close: 166.43 },\n  { date: '2009-08-04T07:00:00.000Z', close: 165.55 },\n  { date: '2009-08-05T07:00:00.000Z', close: 165.11 },\n  { date: '2009-08-06T07:00:00.000Z', close: 163.91 },\n  { date: '2009-08-07T07:00:00.000Z', close: 165.51 },\n  { date: '2009-08-10T07:00:00.000Z', close: 164.72 },\n  { date: '2009-08-12T07:00:00.000Z', close: 165.31 },\n  { date: '2009-08-13T07:00:00.000Z', close: 168.42 },\n  { date: '2009-08-14T07:00:00.000Z', close: 166.78 },\n  { date: '2009-08-17T07:00:00.000Z', close: 159.59 },\n  { date: '2009-08-18T07:00:00.000Z', close: 164 },\n  { date: '2009-08-19T07:00:00.000Z', close: 164.6 },\n  { date: '2009-08-20T07:00:00.000Z', close: 166.33 },\n  { date: '2009-08-21T07:00:00.000Z', close: 169.22 },\n  { date: '2009-08-24T07:00:00.000Z', close: 169.06 },\n  { date: '2009-08-25T07:00:00.000Z', close: 169.4 },\n  { date: '2009-08-26T07:00:00.000Z', close: 167.41 },\n  { date: '2009-08-27T07:00:00.000Z', close: 169.45 },\n  { date: '2009-08-28T07:00:00.000Z', close: 170.05 },\n  { date: '2009-08-31T07:00:00.000Z', close: 168.21 },\n  { date: '2009-09-01T07:00:00.000Z', close: 165.3 },\n  { date: '2009-09-02T07:00:00.000Z', close: 165.18 },\n  { date: '2009-09-03T07:00:00.000Z', close: 166.55 },\n  { date: '2009-09-04T07:00:00.000Z', close: 170.31 },\n  { date: '2009-09-08T07:00:00.000Z', close: 172.93 },\n  { date: '2009-09-09T07:00:00.000Z', close: 171.14 },\n  { date: '2009-09-10T07:00:00.000Z', close: 172.56 },\n  { date: '2009-09-11T07:00:00.000Z', close: 172.16 },\n  { date: '2009-09-14T07:00:00.000Z', close: 173.72 },\n  { date: '2009-09-15T07:00:00.000Z', close: 175.16 },\n  { date: '2009-09-16T07:00:00.000Z', close: 181.87 },\n  { date: '2009-09-17T07:00:00.000Z', close: 184.55 },\n  { date: '2009-09-18T07:00:00.000Z', close: 185.02 },\n  { date: '2009-09-21T07:00:00.000Z', close: 184.02 },\n  { date: '2009-09-22T07:00:00.000Z', close: 184.48 },\n  { date: '2009-09-23T07:00:00.000Z', close: 185.5 },\n  { date: '2009-09-24T07:00:00.000Z', close: 183.82 },\n  { date: '2009-09-25T07:00:00.000Z', close: 182.37 },\n  { date: '2009-09-28T07:00:00.000Z', close: 186.15 },\n  { date: '2009-09-29T07:00:00.000Z', close: 185.38 },\n  { date: '2009-09-30T07:00:00.000Z', close: 185.35 },\n  { date: '2009-10-01T07:00:00.000Z', close: 180.86 },\n  { date: '2009-10-02T07:00:00.000Z', close: 184.9 },\n  { date: '2009-10-05T07:00:00.000Z', close: 186.02 },\n  { date: '2009-10-06T07:00:00.000Z', close: 190.01 },\n  { date: '2009-10-07T07:00:00.000Z', close: 190.25 },\n  { date: '2009-10-08T07:00:00.000Z', close: 189.27 },\n  { date: '2009-10-09T07:00:00.000Z', close: 190.47 },\n  { date: '2009-10-12T07:00:00.000Z', close: 190.81 },\n  { date: '2009-10-13T07:00:00.000Z', close: 190.02 },\n  { date: '2009-10-14T07:00:00.000Z', close: 191.29 },\n  { date: '2009-10-15T07:00:00.000Z', close: 190.56 },\n  { date: '2009-10-16T07:00:00.000Z', close: 188.05 },\n  { date: '2009-10-19T07:00:00.000Z', close: 189.86 },\n  { date: '2009-10-20T07:00:00.000Z', close: 198.76 },\n  { date: '2009-10-21T07:00:00.000Z', close: 204.92 },\n  { date: '2009-10-22T07:00:00.000Z', close: 205.2 },\n  { date: '2009-10-23T07:00:00.000Z', close: 203.94 },\n  { date: '2009-10-26T07:00:00.000Z', close: 202.48 },\n  { date: '2009-10-27T07:00:00.000Z', close: 197.37 },\n  { date: '2009-10-28T07:00:00.000Z', close: 192.4 },\n  { date: '2009-10-29T07:00:00.000Z', close: 196.35 },\n  { date: '2009-10-30T07:00:00.000Z', close: 188.5 },\n  { date: '2009-11-02T08:00:00.000Z', close: 189.31 },\n  { date: '2009-11-03T08:00:00.000Z', close: 188.75 },\n  { date: '2009-11-04T08:00:00.000Z', close: 190.81 },\n  { date: '2009-11-05T08:00:00.000Z', close: 194.03 },\n  { date: '2009-11-06T08:00:00.000Z', close: 194.34 },\n  { date: '2009-11-09T08:00:00.000Z', close: 201.46 },\n  { date: '2009-11-10T08:00:00.000Z', close: 202.98 },\n  { date: '2009-11-11T08:00:00.000Z', close: 203.25 },\n  { date: '2009-11-12T08:00:00.000Z', close: 201.99 },\n  { date: '2009-11-13T08:00:00.000Z', close: 204.45 },\n  { date: '2009-11-16T08:00:00.000Z', close: 206.63 },\n  { date: '2009-11-17T08:00:00.000Z', close: 207 },\n  { date: '2009-11-18T08:00:00.000Z', close: 205.96 },\n  { date: '2009-11-19T08:00:00.000Z', close: 200.51 },\n  { date: '2009-11-20T08:00:00.000Z', close: 199.92 },\n  { date: '2009-11-23T08:00:00.000Z', close: 205.88 },\n  { date: '2009-11-24T08:00:00.000Z', close: 204.44 },\n  { date: '2009-11-25T08:00:00.000Z', close: 204.19 },\n  { date: '2009-11-26T08:00:00.000Z', close: 204.19 },\n  { date: '2009-11-27T08:00:00.000Z', close: 200.59 },\n  { date: '2009-11-30T08:00:00.000Z', close: 199.91 },\n  { date: '2009-12-01T08:00:00.000Z', close: 196.97 },\n  { date: '2009-12-02T08:00:00.000Z', close: 196.23 },\n  { date: '2009-12-03T08:00:00.000Z', close: 196.48 },\n  { date: '2009-12-04T08:00:00.000Z', close: 193.32 },\n  { date: '2009-12-07T08:00:00.000Z', close: 188.95 },\n  { date: '2009-12-08T08:00:00.000Z', close: 189.87 },\n  { date: '2009-12-09T08:00:00.000Z', close: 197.8 },\n  { date: '2009-12-10T08:00:00.000Z', close: 196.43 },\n  { date: '2009-12-11T08:00:00.000Z', close: 194.67 },\n  { date: '2009-12-14T08:00:00.000Z', close: 196.98 },\n  { date: '2009-12-15T08:00:00.000Z', close: 194.17 },\n  { date: '2009-12-16T08:00:00.000Z', close: 195.03 },\n  { date: '2009-12-17T08:00:00.000Z', close: 191.86 },\n  { date: '2009-12-18T08:00:00.000Z', close: 195.43 },\n  { date: '2009-12-21T08:00:00.000Z', close: 198.23 },\n  { date: '2009-12-22T08:00:00.000Z', close: 200.36 },\n  { date: '2009-12-23T08:00:00.000Z', close: 202.1 },\n  { date: '2009-12-24T08:00:00.000Z', close: 209.04 },\n  { date: '2009-12-25T08:00:00.000Z', close: 209.04 },\n  { date: '2009-12-28T08:00:00.000Z', close: 211.61 },\n  { date: '2009-12-29T08:00:00.000Z', close: 209.1 },\n  { date: '2009-12-30T08:00:00.000Z', close: 211.64 },\n  { date: '2009-12-31T08:00:00.000Z', close: 210.73 },\n  { date: '2010-01-01T08:00:00.000Z', close: 210.73 },\n  { date: '2010-01-04T08:00:00.000Z', close: 214.01 },\n  { date: '2010-01-05T08:00:00.000Z', close: 214.38 },\n  { date: '2010-01-06T08:00:00.000Z', close: 210.97 },\n  { date: '2010-01-07T08:00:00.000Z', close: 210.58 },\n  { date: '2010-01-08T08:00:00.000Z', close: 211.98 },\n  { date: '2010-01-11T08:00:00.000Z', close: 210.11 },\n  { date: '2010-01-12T08:00:00.000Z', close: 207.72 },\n  { date: '2010-01-13T08:00:00.000Z', close: 210.65 },\n  { date: '2010-01-14T08:00:00.000Z', close: 209.43 },\n  { date: '2010-01-15T08:00:00.000Z', close: 205.93 },\n  { date: '2010-01-18T08:00:00.000Z', close: 205.93 },\n  { date: '2010-01-19T08:00:00.000Z', close: 215.04 },\n  { date: '2010-01-20T08:00:00.000Z', close: 211.72 },\n  { date: '2010-01-21T08:00:00.000Z', close: 208.07 },\n  { date: '2010-01-22T08:00:00.000Z', close: 197.75 },\n  { date: '2010-01-25T08:00:00.000Z', close: 203.08 },\n  { date: '2010-01-26T08:00:00.000Z', close: 205.94 },\n  { date: '2010-01-27T08:00:00.000Z', close: 207.88 },\n  { date: '2010-01-28T08:00:00.000Z', close: 199.29 },\n  { date: '2010-01-29T08:00:00.000Z', close: 192.06 },\n  { date: '2010-02-01T08:00:00.000Z', close: 194.73 },\n  { date: '2010-02-02T08:00:00.000Z', close: 195.86 },\n  { date: '2010-02-03T08:00:00.000Z', close: 199.23 },\n  { date: '2010-02-04T08:00:00.000Z', close: 192.05 },\n  { date: '2010-02-05T08:00:00.000Z', close: 195.46 },\n  { date: '2010-02-08T08:00:00.000Z', close: 194.12 },\n  { date: '2010-02-09T08:00:00.000Z', close: 196.19 },\n  { date: '2010-02-10T08:00:00.000Z', close: 195.12 },\n  { date: '2010-02-11T08:00:00.000Z', close: 198.67 },\n  { date: '2010-02-12T08:00:00.000Z', close: 200.38 },\n  { date: '2010-02-15T08:00:00.000Z', close: 200.38 },\n  { date: '2010-02-16T08:00:00.000Z', close: 203.4 },\n  { date: '2010-02-17T08:00:00.000Z', close: 202.55 },\n  { date: '2010-02-18T08:00:00.000Z', close: 202.93 },\n  { date: '2010-02-19T08:00:00.000Z', close: 201.67 },\n  { date: '2010-02-22T08:00:00.000Z', close: 200.42 },\n  { date: '2010-02-23T08:00:00.000Z', close: 197.06 },\n  { date: '2010-02-24T08:00:00.000Z', close: 200.66 },\n  { date: '2010-02-25T08:00:00.000Z', close: 202 },\n  { date: '2010-02-26T08:00:00.000Z', close: 204.62 },\n  { date: '2010-03-01T08:00:00.000Z', close: 208.99 },\n  { date: '2010-03-02T08:00:00.000Z', close: 208.85 },\n  { date: '2010-03-03T08:00:00.000Z', close: 209.33 },\n  { date: '2010-03-04T08:00:00.000Z', close: 210.71 },\n  { date: '2010-03-05T08:00:00.000Z', close: 218.95 },\n  { date: '2010-03-08T08:00:00.000Z', close: 219.08 },\n  { date: '2010-03-09T08:00:00.000Z', close: 223.02 },\n  { date: '2010-03-10T08:00:00.000Z', close: 224.84 },\n  { date: '2010-03-11T08:00:00.000Z', close: 225.5 },\n  { date: '2010-03-12T08:00:00.000Z', close: 226.6 },\n  { date: '2010-03-15T07:00:00.000Z', close: 223.84 },\n  { date: '2010-03-16T07:00:00.000Z', close: 224.45 },\n  { date: '2010-03-17T07:00:00.000Z', close: 224.12 },\n  { date: '2010-03-18T07:00:00.000Z', close: 224.65 },\n  { date: '2010-03-19T07:00:00.000Z', close: 222.25 },\n  { date: '2010-03-22T07:00:00.000Z', close: 224.75 },\n  { date: '2010-03-23T07:00:00.000Z', close: 228.36 },\n  { date: '2010-03-24T07:00:00.000Z', close: 229.37 },\n  { date: '2010-03-25T07:00:00.000Z', close: 226.65 },\n  { date: '2010-03-26T07:00:00.000Z', close: 230.9 },\n  { date: '2010-03-29T07:00:00.000Z', close: 232.39 },\n  { date: '2010-03-30T07:00:00.000Z', close: 235.84 },\n  { date: '2010-03-31T07:00:00.000Z', close: 235 },\n  { date: '2010-04-01T07:00:00.000Z', close: 235.97 },\n  { date: '2010-04-02T07:00:00.000Z', close: 235.97 },\n  { date: '2010-04-05T07:00:00.000Z', close: 238.49 },\n  { date: '2010-04-06T07:00:00.000Z', close: 239.54 },\n  { date: '2010-04-07T07:00:00.000Z', close: 240.6 },\n  { date: '2010-04-08T07:00:00.000Z', close: 239.95 },\n  { date: '2010-04-09T07:00:00.000Z', close: 241.79 },\n  { date: '2010-04-12T07:00:00.000Z', close: 242.29 },\n  { date: '2010-04-13T07:00:00.000Z', close: 242.43 },\n  { date: '2010-04-14T07:00:00.000Z', close: 245.69 },\n  { date: '2010-04-15T07:00:00.000Z', close: 248.92 },\n  { date: '2010-04-16T07:00:00.000Z', close: 247.4 },\n  { date: '2010-04-19T07:00:00.000Z', close: 247.07 },\n  { date: '2010-04-20T07:00:00.000Z', close: 244.59 },\n  { date: '2010-04-21T07:00:00.000Z', close: 259.22 },\n  { date: '2010-04-22T07:00:00.000Z', close: 266.47 },\n  { date: '2010-04-23T07:00:00.000Z', close: 270.83 },\n  { date: '2010-04-26T07:00:00.000Z', close: 269.5 },\n  { date: '2010-04-27T07:00:00.000Z', close: 262.04 },\n  { date: '2010-04-28T07:00:00.000Z', close: 261.6 },\n  { date: '2010-04-29T07:00:00.000Z', close: 268.64 },\n  { date: '2010-04-30T07:00:00.000Z', close: 261.09 },\n  { date: '2010-05-03T07:00:00.000Z', close: 266.35 },\n  { date: '2010-05-04T07:00:00.000Z', close: 258.68 },\n  { date: '2010-05-05T07:00:00.000Z', close: 255.98 },\n  { date: '2010-05-06T07:00:00.000Z', close: 246.25 },\n  { date: '2010-05-07T07:00:00.000Z', close: 235.86 },\n  { date: '2010-05-10T07:00:00.000Z', close: 253.99 },\n  { date: '2010-05-11T07:00:00.000Z', close: 256.52 },\n  { date: '2010-05-12T07:00:00.000Z', close: 262.09 },\n  { date: '2010-05-13T07:00:00.000Z', close: 258.36 },\n  { date: '2010-05-14T07:00:00.000Z', close: 253.82 },\n  { date: '2010-05-17T07:00:00.000Z', close: 254.22 },\n  { date: '2010-05-18T07:00:00.000Z', close: 252.36 },\n  { date: '2010-05-19T07:00:00.000Z', close: 248.34 },\n  { date: '2010-05-20T07:00:00.000Z', close: 237.76 },\n  { date: '2010-05-21T07:00:00.000Z', close: 242.32 },\n  { date: '2010-05-24T07:00:00.000Z', close: 246.76 },\n  { date: '2010-05-25T07:00:00.000Z', close: 245.22 },\n  { date: '2010-05-26T07:00:00.000Z', close: 244.11 },\n  { date: '2010-05-27T07:00:00.000Z', close: 253.35 },\n  { date: '2010-05-28T07:00:00.000Z', close: 256.88 },\n  { date: '2010-05-31T07:00:00.000Z', close: 256.88 },\n  { date: '2010-06-01T07:00:00.000Z', close: 260.83 },\n  { date: '2010-06-02T07:00:00.000Z', close: 263.95 },\n  { date: '2010-06-03T07:00:00.000Z', close: 263.12 },\n  { date: '2010-06-04T07:00:00.000Z', close: 255.96 },\n  { date: '2010-06-07T07:00:00.000Z', close: 250.94 },\n  { date: '2010-06-08T07:00:00.000Z', close: 249.33 },\n  { date: '2010-06-09T07:00:00.000Z', close: 243.2 },\n  { date: '2010-06-10T07:00:00.000Z', close: 250.51 },\n  { date: '2010-06-11T07:00:00.000Z', close: 253.51 },\n  { date: '2010-06-14T07:00:00.000Z', close: 254.28 },\n  { date: '2010-06-15T07:00:00.000Z', close: 259.69 },\n  { date: '2010-06-16T07:00:00.000Z', close: 267.25 },\n  { date: '2010-06-17T07:00:00.000Z', close: 271.87 },\n  { date: '2010-06-18T07:00:00.000Z', close: 274.07 },\n  { date: '2010-06-21T07:00:00.000Z', close: 270.17 },\n  { date: '2010-06-22T07:00:00.000Z', close: 273.85 },\n  { date: '2010-06-23T07:00:00.000Z', close: 270.97 },\n  { date: '2010-06-24T07:00:00.000Z', close: 269 },\n  { date: '2010-06-25T07:00:00.000Z', close: 266.7 },\n  { date: '2010-06-28T07:00:00.000Z', close: 268.3 },\n  { date: '2010-06-29T07:00:00.000Z', close: 256.17 },\n  { date: '2010-06-30T07:00:00.000Z', close: 251.53 },\n  { date: '2010-07-01T07:00:00.000Z', close: 248.48 },\n  { date: '2010-07-02T07:00:00.000Z', close: 246.94 },\n  { date: '2010-07-05T07:00:00.000Z', close: 246.94 },\n  { date: '2010-07-06T07:00:00.000Z', close: 248.63 },\n  { date: '2010-07-07T07:00:00.000Z', close: 258.66 },\n  { date: '2010-07-08T07:00:00.000Z', close: 258.09 },\n  { date: '2010-07-09T07:00:00.000Z', close: 259.62 },\n  { date: '2010-07-12T07:00:00.000Z', close: 257.28 },\n  { date: '2010-07-13T07:00:00.000Z', close: 251.8 },\n  { date: '2010-07-14T07:00:00.000Z', close: 252.73 },\n  { date: '2010-07-15T07:00:00.000Z', close: 251.45 },\n  { date: '2010-07-16T07:00:00.000Z', close: 249.9 },\n  { date: '2010-07-19T07:00:00.000Z', close: 245.58 },\n  { date: '2010-07-20T07:00:00.000Z', close: 251.89 },\n  { date: '2010-07-21T07:00:00.000Z', close: 254.24 },\n  { date: '2010-07-22T07:00:00.000Z', close: 259.02 },\n  { date: '2010-07-23T07:00:00.000Z', close: 259.94 },\n  { date: '2010-07-26T07:00:00.000Z', close: 259.28 },\n  { date: '2010-07-27T07:00:00.000Z', close: 264.08 },\n  { date: '2010-07-28T07:00:00.000Z', close: 260.96 },\n  { date: '2010-07-29T07:00:00.000Z', close: 258.11 },\n  { date: '2010-07-30T07:00:00.000Z', close: 257.25 },\n  { date: '2010-08-02T07:00:00.000Z', close: 261.85 },\n  { date: '2010-08-03T07:00:00.000Z', close: 261.93 },\n  { date: '2010-08-04T07:00:00.000Z', close: 262.98 },\n  { date: '2010-08-05T07:00:00.000Z', close: 261.7 },\n  { date: '2010-08-06T07:00:00.000Z', close: 260.09 },\n  { date: '2010-08-09T07:00:00.000Z', close: 261.75 },\n  { date: '2010-08-10T07:00:00.000Z', close: 259.41 },\n  { date: '2010-08-11T07:00:00.000Z', close: 250.19 },\n  { date: '2010-08-12T07:00:00.000Z', close: 251.79 },\n  { date: '2010-08-13T07:00:00.000Z', close: 249.1 },\n  { date: '2010-08-16T07:00:00.000Z', close: 247.64 },\n  { date: '2010-08-17T07:00:00.000Z', close: 251.97 },\n  { date: '2010-08-18T07:00:00.000Z', close: 253.07 },\n  { date: '2010-08-19T07:00:00.000Z', close: 249.88 },\n  { date: '2010-08-20T07:00:00.000Z', close: 249.64 },\n  { date: '2010-08-23T07:00:00.000Z', close: 245.8 },\n  { date: '2010-08-24T07:00:00.000Z', close: 239.93 },\n  { date: '2010-08-25T07:00:00.000Z', close: 242.89 },\n  { date: '2010-08-26T07:00:00.000Z', close: 240.28 },\n  { date: '2010-08-27T07:00:00.000Z', close: 241.62 },\n  { date: '2010-08-30T07:00:00.000Z', close: 242.5 },\n  { date: '2010-08-31T07:00:00.000Z', close: 243.1 },\n  { date: '2010-09-01T07:00:00.000Z', close: 250.33 },\n  { date: '2010-09-02T07:00:00.000Z', close: 252.17 },\n  { date: '2010-09-03T07:00:00.000Z', close: 258.77 },\n  { date: '2010-09-06T07:00:00.000Z', close: 258.77 },\n  { date: '2010-09-07T07:00:00.000Z', close: 257.81 },\n  { date: '2010-09-08T07:00:00.000Z', close: 262.92 },\n  { date: '2010-09-09T07:00:00.000Z', close: 263.07 },\n  { date: '2010-09-10T07:00:00.000Z', close: 263.41 },\n  { date: '2010-09-13T07:00:00.000Z', close: 267.04 },\n  { date: '2010-09-14T07:00:00.000Z', close: 268.06 },\n  { date: '2010-09-15T07:00:00.000Z', close: 270.22 },\n  { date: '2010-09-16T07:00:00.000Z', close: 276.57 },\n  { date: '2010-09-17T07:00:00.000Z', close: 275.37 },\n  { date: '2010-09-20T07:00:00.000Z', close: 283.23 },\n  { date: '2010-09-21T07:00:00.000Z', close: 283.77 },\n  { date: '2010-09-22T07:00:00.000Z', close: 287.75 },\n  { date: '2010-09-23T07:00:00.000Z', close: 288.92 },\n  { date: '2010-09-24T07:00:00.000Z', close: 292.32 },\n  { date: '2010-09-27T07:00:00.000Z', close: 291.16 },\n  { date: '2010-09-28T07:00:00.000Z', close: 286.86 },\n  { date: '2010-09-29T07:00:00.000Z', close: 287.37 },\n  { date: '2010-09-30T07:00:00.000Z', close: 283.75 },\n  { date: '2010-10-01T07:00:00.000Z', close: 282.52 },\n  { date: '2010-10-04T07:00:00.000Z', close: 278.64 },\n  { date: '2010-10-05T07:00:00.000Z', close: 288.94 },\n  { date: '2010-10-06T07:00:00.000Z', close: 289.19 },\n  { date: '2010-10-07T07:00:00.000Z', close: 289.22 },\n  { date: '2010-10-08T07:00:00.000Z', close: 294.07 },\n  { date: '2010-10-11T07:00:00.000Z', close: 295.36 },\n  { date: '2010-10-12T07:00:00.000Z', close: 298.54 },\n  { date: '2010-10-13T07:00:00.000Z', close: 300.14 },\n  { date: '2010-10-14T07:00:00.000Z', close: 302.31 },\n  { date: '2010-10-15T07:00:00.000Z', close: 314.74 },\n  { date: '2010-10-18T07:00:00.000Z', close: 318 },\n  { date: '2010-10-19T07:00:00.000Z', close: 309.49 },\n  { date: '2010-10-20T07:00:00.000Z', close: 310.53 },\n  { date: '2010-10-21T07:00:00.000Z', close: 309.52 },\n  { date: '2010-10-22T07:00:00.000Z', close: 307.47 },\n  { date: '2010-10-25T07:00:00.000Z', close: 308.84 },\n  { date: '2010-10-26T07:00:00.000Z', close: 308.05 },\n  { date: '2010-10-27T07:00:00.000Z', close: 307.83 },\n  { date: '2010-10-28T07:00:00.000Z', close: 305.24 },\n  { date: '2010-10-29T07:00:00.000Z', close: 300.98 },\n  { date: '2010-11-01T07:00:00.000Z', close: 304.18 },\n  { date: '2010-11-02T07:00:00.000Z', close: 309.36 },\n  { date: '2010-11-03T07:00:00.000Z', close: 312.8 },\n  { date: '2010-11-04T07:00:00.000Z', close: 318.27 },\n  { date: '2010-11-05T07:00:00.000Z', close: 317.13 },\n  { date: '2010-11-08T08:00:00.000Z', close: 318.62 },\n  { date: '2010-11-09T08:00:00.000Z', close: 316.08 },\n  { date: '2010-11-10T08:00:00.000Z', close: 318.03 },\n  { date: '2010-11-11T08:00:00.000Z', close: 316.66 },\n  { date: '2010-11-12T08:00:00.000Z', close: 308.03 },\n  { date: '2010-11-15T08:00:00.000Z', close: 307.04 },\n  { date: '2010-11-16T08:00:00.000Z', close: 301.59 },\n  { date: '2010-11-17T08:00:00.000Z', close: 300.5 },\n  { date: '2010-11-18T08:00:00.000Z', close: 308.43 },\n  { date: '2010-11-19T08:00:00.000Z', close: 306.73 },\n  { date: '2010-11-22T08:00:00.000Z', close: 313.36 },\n  { date: '2010-11-23T08:00:00.000Z', close: 308.73 },\n  { date: '2010-11-24T08:00:00.000Z', close: 314.8 },\n  { date: '2010-11-26T08:00:00.000Z', close: 315 },\n  { date: '2010-11-29T08:00:00.000Z', close: 316.87 },\n  { date: '2010-11-30T08:00:00.000Z', close: 311.15 },\n  { date: '2010-12-01T08:00:00.000Z', close: 316.4 },\n  { date: '2010-12-02T08:00:00.000Z', close: 318.15 },\n  { date: '2010-12-03T08:00:00.000Z', close: 317.44 },\n  { date: '2010-12-06T08:00:00.000Z', close: 320.15 },\n  { date: '2010-12-07T08:00:00.000Z', close: 318.21 },\n  { date: '2010-12-08T08:00:00.000Z', close: 321.01 },\n  { date: '2010-12-09T08:00:00.000Z', close: 319.76 },\n  { date: '2010-12-10T08:00:00.000Z', close: 320.56 },\n  { date: '2010-12-13T08:00:00.000Z', close: 321.67 },\n  { date: '2010-12-14T08:00:00.000Z', close: 320.29 },\n  { date: '2010-12-15T08:00:00.000Z', close: 320.36 },\n  { date: '2010-12-16T08:00:00.000Z', close: 321.25 },\n  { date: '2010-12-17T08:00:00.000Z', close: 320.61 },\n  { date: '2010-12-20T08:00:00.000Z', close: 322.21 },\n  { date: '2010-12-21T08:00:00.000Z', close: 324.2 },\n  { date: '2010-12-22T08:00:00.000Z', close: 325.16 },\n  { date: '2010-12-23T08:00:00.000Z', close: 323.6 },\n  { date: '2010-12-27T08:00:00.000Z', close: 324.68 },\n  { date: '2010-12-28T08:00:00.000Z', close: 325.47 },\n  { date: '2010-12-29T08:00:00.000Z', close: 325.29 },\n  { date: '2010-12-30T08:00:00.000Z', close: 323.66 },\n  { date: '2010-12-31T08:00:00.000Z', close: 322.56 },\n  { date: '2011-01-03T08:00:00.000Z', close: 329.57 },\n  { date: '2011-01-04T08:00:00.000Z', close: 331.29 },\n  { date: '2011-01-05T08:00:00.000Z', close: 334 },\n  { date: '2011-01-06T08:00:00.000Z', close: 333.73 },\n  { date: '2011-01-07T08:00:00.000Z', close: 336.12 },\n  { date: '2011-01-10T08:00:00.000Z', close: 342.46 },\n  { date: '2011-01-11T08:00:00.000Z', close: 341.64 },\n  { date: '2011-01-12T08:00:00.000Z', close: 344.42 },\n  { date: '2011-01-13T08:00:00.000Z', close: 345.68 },\n  { date: '2011-01-14T08:00:00.000Z', close: 348.48 },\n  { date: '2011-01-18T08:00:00.000Z', close: 340.65 },\n  { date: '2011-01-19T08:00:00.000Z', close: 338.84 },\n  { date: '2011-01-20T08:00:00.000Z', close: 332.68 },\n  { date: '2011-01-21T08:00:00.000Z', close: 326.72 },\n  { date: '2011-01-24T08:00:00.000Z', close: 337.45 },\n  { date: '2011-01-25T08:00:00.000Z', close: 341.4 },\n  { date: '2011-01-26T08:00:00.000Z', close: 343.85 },\n  { date: '2011-01-27T08:00:00.000Z', close: 343.21 },\n  { date: '2011-01-28T08:00:00.000Z', close: 336.1 },\n  { date: '2011-01-31T08:00:00.000Z', close: 339.32 },\n  { date: '2011-02-01T08:00:00.000Z', close: 345.03 },\n  { date: '2011-02-02T08:00:00.000Z', close: 344.32 },\n  { date: '2011-02-03T08:00:00.000Z', close: 343.44 },\n  { date: '2011-02-04T08:00:00.000Z', close: 346.5 },\n  { date: '2011-02-07T08:00:00.000Z', close: 351.88 },\n  { date: '2011-02-08T08:00:00.000Z', close: 355.2 },\n  { date: '2011-02-09T08:00:00.000Z', close: 358.16 },\n  { date: '2011-02-10T08:00:00.000Z', close: 354.54 },\n  { date: '2011-02-11T08:00:00.000Z', close: 356.85 },\n  { date: '2011-02-14T08:00:00.000Z', close: 359.18 },\n  { date: '2011-02-15T08:00:00.000Z', close: 359.9 },\n  { date: '2011-02-16T08:00:00.000Z', close: 363.13 },\n  { date: '2011-02-17T08:00:00.000Z', close: 358.3 },\n  { date: '2011-02-18T08:00:00.000Z', close: 350.56 },\n  { date: '2011-02-22T08:00:00.000Z', close: 338.61 },\n  { date: '2011-02-23T08:00:00.000Z', close: 342.62 },\n  { date: '2011-02-24T08:00:00.000Z', close: 342.88 },\n  { date: '2011-02-25T08:00:00.000Z', close: 348.16 },\n  { date: '2011-02-28T08:00:00.000Z', close: 353.21 },\n  { date: '2011-03-01T08:00:00.000Z', close: 349.31 },\n  { date: '2011-03-02T08:00:00.000Z', close: 352.12 },\n  { date: '2011-03-03T08:00:00.000Z', close: 359.56 },\n  { date: '2011-03-04T08:00:00.000Z', close: 360 },\n  { date: '2011-03-07T08:00:00.000Z', close: 355.36 },\n  { date: '2011-03-08T08:00:00.000Z', close: 355.76 },\n  { date: '2011-03-09T08:00:00.000Z', close: 352.47 },\n  { date: '2011-03-10T08:00:00.000Z', close: 346.67 },\n  { date: '2011-03-11T08:00:00.000Z', close: 351.99 },\n  { date: '2011-03-14T07:00:00.000Z', close: 353.56 },\n  { date: '2011-03-15T07:00:00.000Z', close: 345.43 },\n  { date: '2011-03-16T07:00:00.000Z', close: 330.01 },\n  { date: '2011-03-17T07:00:00.000Z', close: 334.64 },\n  { date: '2011-03-18T07:00:00.000Z', close: 330.67 },\n  { date: '2011-03-21T07:00:00.000Z', close: 339.3 },\n  { date: '2011-03-22T07:00:00.000Z', close: 341.2 },\n  { date: '2011-03-23T07:00:00.000Z', close: 339.19 },\n  { date: '2011-03-24T07:00:00.000Z', close: 344.97 },\n  { date: '2011-03-25T07:00:00.000Z', close: 351.54 },\n  { date: '2011-03-28T07:00:00.000Z', close: 350.44 },\n  { date: '2011-03-29T07:00:00.000Z', close: 350.96 },\n  { date: '2011-03-30T07:00:00.000Z', close: 348.63 },\n  { date: '2011-03-31T07:00:00.000Z', close: 348.51 },\n  { date: '2011-04-01T07:00:00.000Z', close: 344.56 },\n  { date: '2011-04-04T07:00:00.000Z', close: 341.19 },\n  { date: '2011-04-05T07:00:00.000Z', close: 338.89 },\n  { date: '2011-04-06T07:00:00.000Z', close: 338.04 },\n  { date: '2011-04-07T07:00:00.000Z', close: 338.08 },\n  { date: '2011-04-08T07:00:00.000Z', close: 335.06 },\n  { date: '2011-04-11T07:00:00.000Z', close: 330.8 },\n  { date: '2011-04-12T07:00:00.000Z', close: 332.4 },\n  { date: '2011-04-13T07:00:00.000Z', close: 336.13 },\n  { date: '2011-04-14T07:00:00.000Z', close: 332.42 },\n  { date: '2011-04-15T07:00:00.000Z', close: 327.46 },\n  { date: '2011-04-18T07:00:00.000Z', close: 331.85 },\n  { date: '2011-04-19T07:00:00.000Z', close: 337.86 },\n  { date: '2011-04-20T07:00:00.000Z', close: 342.41 },\n  { date: '2011-04-21T07:00:00.000Z', close: 350.7 },\n  { date: '2011-04-25T07:00:00.000Z', close: 353.01 },\n  { date: '2011-04-26T07:00:00.000Z', close: 350.42 },\n  { date: '2011-04-27T07:00:00.000Z', close: 350.15 },\n  { date: '2011-04-28T07:00:00.000Z', close: 346.75 },\n  { date: '2011-04-29T07:00:00.000Z', close: 350.13 },\n  { date: '2011-05-02T07:00:00.000Z', close: 346.28 },\n  { date: '2011-05-03T07:00:00.000Z', close: 348.2 },\n  { date: '2011-05-04T07:00:00.000Z', close: 349.57 },\n  { date: '2011-05-05T07:00:00.000Z', close: 346.75 },\n  { date: '2011-05-06T07:00:00.000Z', close: 346.66 },\n  { date: '2011-05-09T07:00:00.000Z', close: 347.6 },\n  { date: '2011-05-10T07:00:00.000Z', close: 349.45 },\n  { date: '2011-05-11T07:00:00.000Z', close: 347.23 },\n  { date: '2011-05-12T07:00:00.000Z', close: 346.57 },\n  { date: '2011-05-13T07:00:00.000Z', close: 340.5 },\n  { date: '2011-05-16T07:00:00.000Z', close: 333.3 },\n  { date: '2011-05-17T07:00:00.000Z', close: 336.14 },\n  { date: '2011-05-18T07:00:00.000Z', close: 339.87 },\n  { date: '2011-05-19T07:00:00.000Z', close: 340.53 },\n  { date: '2011-05-20T07:00:00.000Z', close: 335.22 },\n  { date: '2011-05-23T07:00:00.000Z', close: 334.4 },\n  { date: '2011-05-24T07:00:00.000Z', close: 332.19 },\n  { date: '2011-05-25T07:00:00.000Z', close: 336.78 },\n  { date: '2011-05-26T07:00:00.000Z', close: 335 },\n  { date: '2011-05-27T07:00:00.000Z', close: 337.41 },\n  { date: '2011-05-31T07:00:00.000Z', close: 347.83 },\n  { date: '2011-06-01T07:00:00.000Z', close: 345.51 },\n  { date: '2011-06-02T07:00:00.000Z', close: 346.1 },\n  { date: '2011-06-03T07:00:00.000Z', close: 343.44 },\n  { date: '2011-06-06T07:00:00.000Z', close: 338.04 },\n  { date: '2011-06-07T07:00:00.000Z', close: 332.04 },\n  { date: '2011-06-08T07:00:00.000Z', close: 332.24 },\n  { date: '2011-06-09T07:00:00.000Z', close: 331.49 },\n  { date: '2011-06-10T07:00:00.000Z', close: 325.9 },\n  { date: '2011-06-13T07:00:00.000Z', close: 326.6 },\n  { date: '2011-06-14T07:00:00.000Z', close: 332.44 },\n  { date: '2011-06-15T07:00:00.000Z', close: 326.75 },\n  { date: '2011-06-16T07:00:00.000Z', close: 325.16 },\n  { date: '2011-06-17T07:00:00.000Z', close: 320.26 },\n  { date: '2011-06-20T07:00:00.000Z', close: 315.32 },\n  { date: '2011-06-21T07:00:00.000Z', close: 325.3 },\n  { date: '2011-06-22T07:00:00.000Z', close: 322.61 },\n  { date: '2011-06-23T07:00:00.000Z', close: 331.23 },\n  { date: '2011-06-24T07:00:00.000Z', close: 326.35 },\n  { date: '2011-06-27T07:00:00.000Z', close: 332.04 },\n  { date: '2011-06-28T07:00:00.000Z', close: 335.26 },\n  { date: '2011-06-29T07:00:00.000Z', close: 334.04 },\n  { date: '2011-06-30T07:00:00.000Z', close: 335.67 },\n  { date: '2011-07-01T07:00:00.000Z', close: 343.26 },\n  { date: '2011-07-05T07:00:00.000Z', close: 349.43 },\n  { date: '2011-07-06T07:00:00.000Z', close: 351.76 },\n  { date: '2011-07-07T07:00:00.000Z', close: 357.2 },\n  { date: '2011-07-08T07:00:00.000Z', close: 359.71 },\n  { date: '2011-07-11T07:00:00.000Z', close: 354 },\n  { date: '2011-07-12T07:00:00.000Z', close: 353.75 },\n  { date: '2011-07-13T07:00:00.000Z', close: 358.02 },\n  { date: '2011-07-14T07:00:00.000Z', close: 357.77 },\n  { date: '2011-07-15T07:00:00.000Z', close: 364.92 },\n  { date: '2011-07-18T07:00:00.000Z', close: 373.8 },\n  { date: '2011-07-19T07:00:00.000Z', close: 376.85 },\n  { date: '2011-07-20T07:00:00.000Z', close: 386.9 },\n  { date: '2011-07-21T07:00:00.000Z', close: 387.29 },\n  { date: '2011-07-22T07:00:00.000Z', close: 393.3 },\n  { date: '2011-07-25T07:00:00.000Z', close: 398.5 },\n  { date: '2011-07-26T07:00:00.000Z', close: 403.41 },\n  { date: '2011-07-27T07:00:00.000Z', close: 392.59 },\n  { date: '2011-07-28T07:00:00.000Z', close: 391.82 },\n  { date: '2011-07-29T07:00:00.000Z', close: 390.48 },\n  { date: '2011-08-01T07:00:00.000Z', close: 396.75 },\n  { date: '2011-08-02T07:00:00.000Z', close: 388.91 },\n  { date: '2011-08-03T07:00:00.000Z', close: 392.57 },\n  { date: '2011-08-04T07:00:00.000Z', close: 377.37 },\n  { date: '2011-08-05T07:00:00.000Z', close: 373.62 },\n  { date: '2011-08-08T07:00:00.000Z', close: 353.21 },\n  { date: '2011-08-09T07:00:00.000Z', close: 374.01 },\n  { date: '2011-08-10T07:00:00.000Z', close: 363.69 },\n  { date: '2011-08-11T07:00:00.000Z', close: 373.7 },\n  { date: '2011-08-12T07:00:00.000Z', close: 376.99 },\n  { date: '2011-08-15T07:00:00.000Z', close: 383.41 },\n  { date: '2011-08-16T07:00:00.000Z', close: 380.48 },\n  { date: '2011-08-17T07:00:00.000Z', close: 380.44 },\n  { date: '2011-08-18T07:00:00.000Z', close: 366.05 },\n  { date: '2011-08-19T07:00:00.000Z', close: 356.03 },\n  { date: '2011-08-22T07:00:00.000Z', close: 356.44 },\n  { date: '2011-08-23T07:00:00.000Z', close: 373.6 },\n  { date: '2011-08-24T07:00:00.000Z', close: 376.18 },\n  { date: '2011-08-25T07:00:00.000Z', close: 373.72 },\n  { date: '2011-08-26T07:00:00.000Z', close: 383.58 },\n  { date: '2011-08-29T07:00:00.000Z', close: 389.97 },\n  { date: '2011-08-30T07:00:00.000Z', close: 389.99 },\n  { date: '2011-08-31T07:00:00.000Z', close: 384.83 },\n  { date: '2011-09-01T07:00:00.000Z', close: 381.03 },\n  { date: '2011-09-02T07:00:00.000Z', close: 374.05 },\n  { date: '2011-09-06T07:00:00.000Z', close: 379.74 },\n  { date: '2011-09-07T07:00:00.000Z', close: 383.93 },\n  { date: '2011-09-08T07:00:00.000Z', close: 384.14 },\n  { date: '2011-09-09T07:00:00.000Z', close: 377.48 },\n  { date: '2011-09-12T07:00:00.000Z', close: 379.94 },\n  { date: '2011-09-13T07:00:00.000Z', close: 384.62 },\n  { date: '2011-09-14T07:00:00.000Z', close: 389.3 },\n  { date: '2011-09-15T07:00:00.000Z', close: 392.96 },\n  { date: '2011-09-16T07:00:00.000Z', close: 400.5 },\n  { date: '2011-09-19T07:00:00.000Z', close: 411.63 },\n  { date: '2011-09-20T07:00:00.000Z', close: 413.45 },\n  { date: '2011-09-21T07:00:00.000Z', close: 412.14 },\n  { date: '2011-09-22T07:00:00.000Z', close: 401.82 },\n  { date: '2011-09-23T07:00:00.000Z', close: 404.3 },\n  { date: '2011-09-26T07:00:00.000Z', close: 403.17 },\n  { date: '2011-09-27T07:00:00.000Z', close: 399.26 },\n  { date: '2011-09-28T07:00:00.000Z', close: 397.01 },\n  { date: '2011-09-29T07:00:00.000Z', close: 390.57 },\n  { date: '2011-09-30T07:00:00.000Z', close: 381.32 },\n  { date: '2011-10-03T07:00:00.000Z', close: 374.6 },\n  { date: '2011-10-04T07:00:00.000Z', close: 372.5 },\n  { date: '2011-10-05T07:00:00.000Z', close: 378.25 },\n  { date: '2011-10-06T07:00:00.000Z', close: 377.37 },\n  { date: '2011-10-07T07:00:00.000Z', close: 369.8 },\n  { date: '2011-10-10T07:00:00.000Z', close: 388.81 },\n  { date: '2011-10-11T07:00:00.000Z', close: 400.29 },\n  { date: '2011-10-12T07:00:00.000Z', close: 402.19 },\n  { date: '2011-10-13T07:00:00.000Z', close: 408.43 },\n  { date: '2011-10-14T07:00:00.000Z', close: 422 },\n  { date: '2011-10-17T07:00:00.000Z', close: 419.99 },\n  { date: '2011-10-18T07:00:00.000Z', close: 422.24 },\n  { date: '2011-10-19T07:00:00.000Z', close: 398.62 },\n  { date: '2011-10-20T07:00:00.000Z', close: 395.31 },\n  { date: '2011-10-21T07:00:00.000Z', close: 392.87 },\n  { date: '2011-10-24T07:00:00.000Z', close: 405.77 },\n  { date: '2011-10-25T07:00:00.000Z', close: 397.77 },\n  { date: '2011-10-26T07:00:00.000Z', close: 400.6 },\n  { date: '2011-10-27T07:00:00.000Z', close: 404.69 },\n  { date: '2011-10-28T07:00:00.000Z', close: 404.95 },\n  { date: '2011-10-31T07:00:00.000Z', close: 404.78 },\n  { date: '2011-11-01T07:00:00.000Z', close: 396.51 },\n  { date: '2011-11-02T07:00:00.000Z', close: 397.41 },\n  { date: '2011-11-03T07:00:00.000Z', close: 403.07 },\n  { date: '2011-11-04T07:00:00.000Z', close: 400.24 },\n  { date: '2011-11-07T08:00:00.000Z', close: 399.73 },\n  { date: '2011-11-08T08:00:00.000Z', close: 406.23 },\n  { date: '2011-11-09T08:00:00.000Z', close: 395.28 },\n  { date: '2011-11-10T08:00:00.000Z', close: 385.22 },\n  { date: '2011-11-11T08:00:00.000Z', close: 384.62 },\n  { date: '2011-11-14T08:00:00.000Z', close: 379.26 },\n  { date: '2011-11-15T08:00:00.000Z', close: 388.83 },\n  { date: '2011-11-16T08:00:00.000Z', close: 384.77 },\n  { date: '2011-11-17T08:00:00.000Z', close: 377.41 },\n  { date: '2011-11-18T08:00:00.000Z', close: 374.94 },\n  { date: '2011-11-21T08:00:00.000Z', close: 369.01 },\n  { date: '2011-11-22T08:00:00.000Z', close: 376.51 },\n  { date: '2011-11-23T08:00:00.000Z', close: 366.99 },\n  { date: '2011-11-25T08:00:00.000Z', close: 363.57 },\n  { date: '2011-11-28T08:00:00.000Z', close: 376.12 },\n  { date: '2011-11-29T08:00:00.000Z', close: 373.2 },\n  { date: '2011-11-30T08:00:00.000Z', close: 382.2 },\n  { date: '2011-12-01T08:00:00.000Z', close: 387.93 },\n  { date: '2011-12-02T08:00:00.000Z', close: 389.7 },\n  { date: '2011-12-05T08:00:00.000Z', close: 393.01 },\n  { date: '2011-12-06T08:00:00.000Z', close: 390.95 },\n  { date: '2011-12-07T08:00:00.000Z', close: 389.09 },\n  { date: '2011-12-08T08:00:00.000Z', close: 390.66 },\n  { date: '2011-12-09T08:00:00.000Z', close: 393.62 },\n  { date: '2011-12-12T08:00:00.000Z', close: 391.84 },\n  { date: '2011-12-13T08:00:00.000Z', close: 388.81 },\n  { date: '2011-12-14T08:00:00.000Z', close: 380.19 },\n  { date: '2011-12-15T08:00:00.000Z', close: 378.94 },\n  { date: '2011-12-16T08:00:00.000Z', close: 381.02 },\n  { date: '2011-12-19T08:00:00.000Z', close: 382.21 },\n  { date: '2011-12-20T08:00:00.000Z', close: 395.95 },\n  { date: '2011-12-21T08:00:00.000Z', close: 396.44 },\n  { date: '2011-12-22T08:00:00.000Z', close: 398.55 },\n  { date: '2011-12-23T08:00:00.000Z', close: 403.43 },\n  { date: '2011-12-27T08:00:00.000Z', close: 406.53 },\n  { date: '2011-12-28T08:00:00.000Z', close: 402.64 },\n  { date: '2011-12-29T08:00:00.000Z', close: 405.12 },\n  { date: '2011-12-30T08:00:00.000Z', close: 405 },\n  { date: '2012-01-03T08:00:00.000Z', close: 411.23 },\n  { date: '2012-01-04T08:00:00.000Z', close: 413.44 },\n  { date: '2012-01-05T08:00:00.000Z', close: 418.03 },\n  { date: '2012-01-06T08:00:00.000Z', close: 422.4 },\n  { date: '2012-01-09T08:00:00.000Z', close: 421.73 },\n  { date: '2012-01-10T08:00:00.000Z', close: 423.24 },\n  { date: '2012-01-11T08:00:00.000Z', close: 422.55 },\n  { date: '2012-01-12T08:00:00.000Z', close: 421.39 },\n  { date: '2012-01-13T08:00:00.000Z', close: 419.81 },\n  { date: '2012-01-17T08:00:00.000Z', close: 424.7 },\n  { date: '2012-01-18T08:00:00.000Z', close: 429.11 },\n  { date: '2012-01-19T08:00:00.000Z', close: 427.75 },\n  { date: '2012-01-20T08:00:00.000Z', close: 420.3 },\n  { date: '2012-01-23T08:00:00.000Z', close: 427.41 },\n  { date: '2012-01-24T08:00:00.000Z', close: 420.41 },\n  { date: '2012-01-25T08:00:00.000Z', close: 446.66 },\n  { date: '2012-01-26T08:00:00.000Z', close: 444.63 },\n  { date: '2012-01-27T08:00:00.000Z', close: 447.28 },\n  { date: '2012-01-30T08:00:00.000Z', close: 453.01 },\n  { date: '2012-01-31T08:00:00.000Z', close: 456.48 },\n  { date: '2012-02-01T08:00:00.000Z', close: 456.19 },\n  { date: '2012-02-02T08:00:00.000Z', close: 455.12 },\n  { date: '2012-02-03T08:00:00.000Z', close: 459.68 },\n  { date: '2012-02-06T08:00:00.000Z', close: 463.97 },\n  { date: '2012-02-07T08:00:00.000Z', close: 468.83 },\n  { date: '2012-02-08T08:00:00.000Z', close: 476.68 },\n  { date: '2012-02-09T08:00:00.000Z', close: 493.17 },\n  { date: '2012-02-10T08:00:00.000Z', close: 493.42 },\n  { date: '2012-02-13T08:00:00.000Z', close: 502.6 },\n  { date: '2012-02-14T08:00:00.000Z', close: 509.46 },\n  { date: '2012-02-15T08:00:00.000Z', close: 497.67 },\n  { date: '2012-02-16T08:00:00.000Z', close: 502.21 },\n  { date: '2012-02-17T08:00:00.000Z', close: 502.12 },\n  { date: '2012-02-21T08:00:00.000Z', close: 514.85 },\n  { date: '2012-02-22T08:00:00.000Z', close: 513.04 },\n  { date: '2012-02-23T08:00:00.000Z', close: 516.39 },\n  { date: '2012-02-24T08:00:00.000Z', close: 522.41 },\n  { date: '2012-02-27T08:00:00.000Z', close: 525.76 },\n  { date: '2012-02-28T08:00:00.000Z', close: 535.41 },\n  { date: '2012-02-29T08:00:00.000Z', close: 542.44 },\n  { date: '2012-03-01T08:00:00.000Z', close: 544.47 },\n  { date: '2012-03-02T08:00:00.000Z', close: 545.18 },\n  { date: '2012-03-05T08:00:00.000Z', close: 533.16 },\n  { date: '2012-03-06T08:00:00.000Z', close: 530.26 },\n  { date: '2012-03-07T08:00:00.000Z', close: 530.69 },\n  { date: '2012-03-08T08:00:00.000Z', close: 541.99 },\n  { date: '2012-03-09T08:00:00.000Z', close: 545.17 },\n  { date: '2012-03-12T07:00:00.000Z', close: 552 },\n  { date: '2012-03-13T07:00:00.000Z', close: 568.1 },\n  { date: '2012-03-14T07:00:00.000Z', close: 589.58 },\n  { date: '2012-03-15T07:00:00.000Z', close: 585.56 },\n  { date: '2012-03-16T07:00:00.000Z', close: 585.57 },\n  { date: '2012-03-19T07:00:00.000Z', close: 601.1 },\n  { date: '2012-03-20T07:00:00.000Z', close: 605.96 },\n  { date: '2012-03-21T07:00:00.000Z', close: 602.5 },\n  { date: '2012-03-22T07:00:00.000Z', close: 599.34 },\n  { date: '2012-03-23T07:00:00.000Z', close: 596.05 },\n  { date: '2012-03-26T07:00:00.000Z', close: 606.98 },\n  { date: '2012-03-27T07:00:00.000Z', close: 614.48 },\n  { date: '2012-03-28T07:00:00.000Z', close: 617.62 },\n  { date: '2012-03-29T07:00:00.000Z', close: 609.86 },\n  { date: '2012-03-30T07:00:00.000Z', close: 599.55 },\n  { date: '2012-04-02T07:00:00.000Z', close: 618.63 },\n  { date: '2012-04-03T07:00:00.000Z', close: 629.32 },\n  { date: '2012-04-04T07:00:00.000Z', close: 624.31 },\n  { date: '2012-04-05T07:00:00.000Z', close: 633.68 },\n  { date: '2012-04-09T07:00:00.000Z', close: 636.23 },\n  { date: '2012-04-10T07:00:00.000Z', close: 628.44 },\n  { date: '2012-04-11T07:00:00.000Z', close: 626.2 },\n  { date: '2012-04-12T07:00:00.000Z', close: 622.77 },\n  { date: '2012-04-13T07:00:00.000Z', close: 605.23 },\n  { date: '2012-04-16T07:00:00.000Z', close: 580.13 },\n  { date: '2012-04-17T07:00:00.000Z', close: 609.7 },\n  { date: '2012-04-18T07:00:00.000Z', close: 608.34 },\n  { date: '2012-04-19T07:00:00.000Z', close: 587.44 },\n  { date: '2012-04-20T07:00:00.000Z', close: 572.98 },\n  { date: '2012-04-23T07:00:00.000Z', close: 571.7 },\n  { date: '2012-04-24T07:00:00.000Z', close: 560.28 },\n  { date: '2012-04-25T07:00:00.000Z', close: 610 },\n  { date: '2012-04-26T07:00:00.000Z', close: 607.7 },\n  { date: '2012-04-27T07:00:00.000Z', close: 603 },\n  { date: '2012-04-30T07:00:00.000Z', close: 583.98 },\n  { date: '2012-05-01T07:00:00.000Z', close: 582.13 },\n];\n\nexport default appleStock;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/bitcoinPrice.ts",
    "content": "export interface BitcoinPrice {\n  price: string;\n  time: string;\n}\n\nexport interface BitcoinPrices {\n  currency: string;\n  prices: BitcoinPrice[];\n}\n\nconst bitcoinPrice: BitcoinPrices = {\n  currency: 'USD',\n  prices: [\n    { price: '2486.69', time: '2017-07-03T00:00:00Z' },\n    { price: '2457.05', time: '2017-07-02T00:00:00Z' },\n    { price: '2486.09', time: '2017-07-01T00:00:00Z' },\n    { price: '2535.85', time: '2017-06-30T00:00:00Z' },\n    { price: '2546.06', time: '2017-06-29T00:00:00Z' },\n    { price: '2465.83', time: '2017-06-28T00:00:00Z' },\n    { price: '2424.59', time: '2017-06-27T00:00:00Z' },\n    { price: '2503.52', time: '2017-06-26T00:00:00Z' },\n    { price: '2605.97', time: '2017-06-25T00:00:00Z' },\n    { price: '2681.55', time: '2017-06-24T00:00:00Z' },\n    { price: '2685.69', time: '2017-06-23T00:00:00Z' },\n    { price: '2677.86', time: '2017-06-22T00:00:00Z' },\n    { price: '2672.44', time: '2017-06-21T00:00:00Z' },\n    { price: '2604.15', time: '2017-06-20T00:00:00Z' },\n    { price: '2560.02', time: '2017-06-19T00:00:00Z' },\n    { price: '2560.02', time: '2017-06-18T00:00:00Z' },\n    { price: '2496.85', time: '2017-06-17T00:00:00Z' },\n    { price: '2396.05', time: '2017-06-16T00:00:00Z' },\n    { price: '2510.72', time: '2017-06-15T00:00:00Z' },\n    { price: '2691.87', time: '2017-06-14T00:00:00Z' },\n    { price: '2767.11', time: '2017-06-13T00:00:00Z' },\n    { price: '2875.40', time: '2017-06-12T00:00:00Z' },\n    { price: '2893.70', time: '2017-06-11T00:00:00Z' },\n    { price: '2840.12', time: '2017-06-10T00:00:00Z' },\n    { price: '2787.07', time: '2017-06-09T00:00:00Z' },\n    { price: '2784.10', time: '2017-06-08T00:00:00Z' },\n    { price: '2824.72', time: '2017-06-07T00:00:00Z' },\n    { price: '2717.66', time: '2017-06-06T00:00:00Z' },\n    { price: '2561.24', time: '2017-06-05T00:00:00Z' },\n    { price: '2521.49', time: '2017-06-04T00:00:00Z' },\n    { price: '2474.40', time: '2017-06-03T00:00:00Z' },\n    { price: '2415.43', time: '2017-06-02T00:00:00Z' },\n    { price: '2326.10', time: '2017-06-01T00:00:00Z' },\n    { price: '2257.12', time: '2017-05-31T00:00:00Z' },\n    { price: '2259.77', time: '2017-05-30T00:00:00Z' },\n    { price: '2241.54', time: '2017-05-29T00:00:00Z' },\n    { price: '2177.53', time: '2017-05-28T00:00:00Z' },\n    { price: '2286.81', time: '2017-05-27T00:00:00Z' },\n    { price: '2529.24', time: '2017-05-26T00:00:00Z' },\n    { price: '2495.06', time: '2017-05-25T00:00:00Z' },\n    { price: '2291.99', time: '2017-05-24T00:00:00Z' },\n    { price: '2193.03', time: '2017-05-23T00:00:00Z' },\n    { price: '2111.77', time: '2017-05-22T00:00:00Z' },\n    { price: '2028.07', time: '2017-05-21T00:00:00Z' },\n    { price: '1969.02', time: '2017-05-20T00:00:00Z' },\n    { price: '1887.03', time: '2017-05-19T00:00:00Z' },\n    { price: '1826.10', time: '2017-05-18T00:00:00Z' },\n    { price: '1780.64', time: '2017-05-17T00:00:00Z' },\n    { price: '1749.55', time: '2017-05-16T00:00:00Z' },\n    { price: '1776.40', time: '2017-05-15T00:00:00Z' },\n    { price: '1757.89', time: '2017-05-14T00:00:00Z' },\n    { price: '1744.99', time: '2017-05-13T00:00:00Z' },\n    { price: '1805.78', time: '2017-05-12T00:00:00Z' },\n    { price: '1797.73', time: '2017-05-11T00:00:00Z' },\n    { price: '1744.12', time: '2017-05-10T00:00:00Z' },\n    { price: '1686.35', time: '2017-05-09T00:00:00Z' },\n    { price: '1615.85', time: '2017-05-08T00:00:00Z' },\n    { price: '1587.20', time: '2017-05-07T00:00:00Z' },\n    { price: '1586.94', time: '2017-05-06T00:00:00Z' },\n    { price: '1581.34', time: '2017-05-05T00:00:00Z' },\n    { price: '1527.60', time: '2017-05-04T00:00:00Z' },\n    { price: '1471.55', time: '2017-05-03T00:00:00Z' },\n    { price: '1443.54', time: '2017-05-02T00:00:00Z' },\n    { price: '1390.24', time: '2017-05-01T00:00:00Z' },\n    { price: '1355.06', time: '2017-04-30T00:00:00Z' },\n    { price: '1348.26', time: '2017-04-29T00:00:00Z' },\n    { price: '1332.27', time: '2017-04-28T00:00:00Z' },\n    { price: '1309.72', time: '2017-04-27T00:00:00Z' },\n    { price: '1284.85', time: '2017-04-26T00:00:00Z' },\n    { price: '1263.26', time: '2017-04-25T00:00:00Z' },\n    { price: '1250.04', time: '2017-04-24T00:00:00Z' },\n    { price: '1246.39', time: '2017-04-23T00:00:00Z' },\n    { price: '1246.58', time: '2017-04-22T00:00:00Z' },\n    { price: '1236.49', time: '2017-04-21T00:00:00Z' },\n    { price: '1213.50', time: '2017-04-20T00:00:00Z' },\n    { price: '1200.11', time: '2017-04-19T00:00:00Z' },\n    { price: '1189.61', time: '2017-04-18T00:00:00Z' },\n    { price: '1181.45', time: '2017-04-17T00:00:00Z' },\n    { price: '1181.88', time: '2017-04-16T00:00:00Z' },\n    { price: '1181.83', time: '2017-04-15T00:00:00Z' },\n    { price: '1186.16', time: '2017-04-14T00:00:00Z' },\n    { price: '1204.46', time: '2017-04-13T00:00:00Z' },\n    { price: '1217.29', time: '2017-04-12T00:00:00Z' },\n    { price: '1213.63', time: '2017-04-11T00:00:00Z' },\n    { price: '1202.89', time: '2017-04-10T00:00:00Z' },\n    { price: '1191.20', time: '2017-04-09T00:00:00Z' },\n    { price: '1190.41', time: '2017-04-08T00:00:00Z' },\n    { price: '1180.29', time: '2017-04-07T00:00:00Z' },\n    { price: '1150.33', time: '2017-04-06T00:00:00Z' },\n    { price: '1140.12', time: '2017-04-05T00:00:00Z' },\n    { price: '1145.39', time: '2017-04-04T00:00:00Z' },\n    { price: '1119.65', time: '2017-04-03T00:00:00Z' },\n    { price: '1093.52', time: '2017-04-02T00:00:00Z' },\n    { price: '1076.90', time: '2017-04-01T00:00:00Z' },\n    { price: '1051.25', time: '2017-03-31T00:00:00Z' },\n    { price: '1037.28', time: '2017-03-30T00:00:00Z' },\n    { price: '1039.87', time: '2017-03-29T00:00:00Z' },\n    { price: '1023.50', time: '2017-03-28T00:00:00Z' },\n    { price: '988.37', time: '2017-03-27T00:00:00Z' },\n    { price: '952.11', time: '2017-03-26T00:00:00Z' },\n    { price: '961.10', time: '2017-03-25T00:00:00Z' },\n    { price: '1014.03', time: '2017-03-24T00:00:00Z' },\n    { price: '1043.38', time: '2017-03-23T00:00:00Z' },\n    { price: '1068.36', time: '2017-03-22T00:00:00Z' },\n    { price: '1060.90', time: '2017-03-21T00:00:00Z' },\n    { price: '1024.30', time: '2017-03-20T00:00:00Z' },\n    { price: '1022.64', time: '2017-03-19T00:00:00Z' },\n    { price: '1082.00', time: '2017-03-18T00:00:00Z' },\n    { price: '1177.35', time: '2017-03-17T00:00:00Z' },\n    { price: '1238.63', time: '2017-03-16T00:00:00Z' },\n    { price: '1250.37', time: '2017-03-15T00:00:00Z' },\n    { price: '1242.67', time: '2017-03-14T00:00:00Z' },\n    { price: '1222.09', time: '2017-03-13T00:00:00Z' },\n    { price: '1193.70', time: '2017-03-12T00:00:00Z' },\n    { price: '1194.52', time: '2017-03-11T00:00:00Z' },\n    { price: '1193.55', time: '2017-03-10T00:00:00Z' },\n    { price: '1188.06', time: '2017-03-09T00:00:00Z' },\n    { price: '1227.60', time: '2017-03-08T00:00:00Z' },\n    { price: '1270.32', time: '2017-03-07T00:00:00Z' },\n    { price: '1274.57', time: '2017-03-06T00:00:00Z' },\n    { price: '1274.54', time: '2017-03-05T00:00:00Z' },\n    { price: '1280.36', time: '2017-03-04T00:00:00Z' },\n    { price: '1262.32', time: '2017-03-03T00:00:00Z' },\n    { price: '1228.19', time: '2017-03-02T00:00:00Z' },\n    { price: '1203.02', time: '2017-03-01T00:00:00Z' },\n    { price: '1192.69', time: '2017-02-28T00:00:00Z' },\n    { price: '1177.64', time: '2017-02-27T00:00:00Z' },\n    { price: '1168.97', time: '2017-02-26T00:00:00Z' },\n    { price: '1180.19', time: '2017-02-25T00:00:00Z' },\n    { price: '1168.59', time: '2017-02-24T00:00:00Z' },\n    { price: '1137.16', time: '2017-02-23T00:00:00Z' },\n    { price: '1114.89', time: '2017-02-22T00:00:00Z' },\n    { price: '1083.83', time: '2017-02-21T00:00:00Z' },\n    { price: '1061.14', time: '2017-02-20T00:00:00Z' },\n    { price: '1062.95', time: '2017-02-19T00:00:00Z' },\n    { price: '1058.15', time: '2017-02-18T00:00:00Z' },\n    { price: '1039.30', time: '2017-02-17T00:00:00Z' },\n    { price: '1020.38', time: '2017-02-16T00:00:00Z' },\n    { price: '1010.49', time: '2017-02-15T00:00:00Z' },\n    { price: '1006.83', time: '2017-02-14T00:00:00Z' },\n    { price: '1008.77', time: '2017-02-13T00:00:00Z' },\n    { price: '1013.09', time: '2017-02-12T00:00:00Z' },\n    { price: '998.84', time: '2017-02-11T00:00:00Z' },\n    { price: '1005.98', time: '2017-02-10T00:00:00Z' },\n    { price: '1040.79', time: '2017-02-09T00:00:00Z' },\n    { price: '1049.02', time: '2017-02-08T00:00:00Z' },\n    { price: '1033.10', time: '2017-02-07T00:00:00Z' },\n    { price: '1022.49', time: '2017-02-06T00:00:00Z' },\n    { price: '1021.09', time: '2017-02-05T00:00:00Z' },\n    { price: '1016.81', time: '2017-02-04T00:00:00Z' },\n    { price: '1004.46', time: '2017-02-03T00:00:00Z' },\n    { price: '985.20', time: '2017-02-02T00:00:00Z' },\n    { price: '960.05', time: '2017-02-01T00:00:00Z' },\n    { price: '932.34', time: '2017-01-31T00:00:00Z' },\n    { price: '921.61', time: '2017-01-30T00:00:00Z' },\n    { price: '923.45', time: '2017-01-29T00:00:00Z' },\n    { price: '922.11', time: '2017-01-28T00:00:00Z' },\n    { price: '914.58', time: '2017-01-27T00:00:00Z' },\n    { price: '903.38', time: '2017-01-26T00:00:00Z' },\n    { price: '902.84', time: '2017-01-25T00:00:00Z' },\n    { price: '915.84', time: '2017-01-24T00:00:00Z' },\n    { price: '926.01', time: '2017-01-23T00:00:00Z' },\n    { price: '923.76', time: '2017-01-22T00:00:00Z' },\n    { price: '908.72', time: '2017-01-21T00:00:00Z' },\n    { price: '897.88', time: '2017-01-20T00:00:00Z' },\n    { price: '893.30', time: '2017-01-19T00:00:00Z' },\n    { price: '884.78', time: '2017-01-18T00:00:00Z' },\n    { price: '857.51', time: '2017-01-17T00:00:00Z' },\n    { price: '830.58', time: '2017-01-16T00:00:00Z' },\n    { price: '830.58', time: '2017-01-15T00:00:00Z' },\n    { price: '823.48', time: '2017-01-14T00:00:00Z' },\n    { price: '801.98', time: '2017-01-13T00:00:00Z' },\n    { price: '822.05', time: '2017-01-12T00:00:00Z' },\n    { price: '879.50', time: '2017-01-11T00:00:00Z' },\n    { price: '903.21', time: '2017-01-10T00:00:00Z' },\n    { price: '911.94', time: '2017-01-09T00:00:00Z' },\n    { price: '901.05', time: '2017-01-08T00:00:00Z' },\n    { price: '908.09', time: '2017-01-07T00:00:00Z' },\n    { price: '996.25', time: '2017-01-06T00:00:00Z' },\n    { price: '1069.40', time: '2017-01-05T00:00:00Z' },\n    { price: '1051.69', time: '2017-01-04T00:00:00Z' },\n    { price: '1016.35', time: '2017-01-03T00:00:00Z' },\n    { price: '996.34', time: '2017-01-02T00:00:00Z' },\n    { price: '970.17', time: '2017-01-01T00:00:00Z' },\n    { price: '958.35', time: '2016-12-31T00:00:00Z' },\n    { price: '964.73', time: '2016-12-30T00:00:00Z' },\n    { price: '962.92', time: '2016-12-29T00:00:00Z' },\n    { price: '934.67', time: '2016-12-28T00:00:00Z' },\n    { price: '908.25', time: '2016-12-27T00:00:00Z' },\n    { price: '886.48', time: '2016-12-26T00:00:00Z' },\n    { price: '887.28', time: '2016-12-25T00:00:00Z' },\n    { price: '899.73', time: '2016-12-24T00:00:00Z' },\n    { price: '877.04', time: '2016-12-23T00:00:00Z' },\n    { price: '835.45', time: '2016-12-22T00:00:00Z' },\n    { price: '803.14', time: '2016-12-21T00:00:00Z' },\n    { price: '792.10', time: '2016-12-20T00:00:00Z' },\n    { price: '791.55', time: '2016-12-19T00:00:00Z' },\n    { price: '789.75', time: '2016-12-18T00:00:00Z' },\n    { price: '784.61', time: '2016-12-17T00:00:00Z' },\n    { price: '779.31', time: '2016-12-16T00:00:00Z' },\n    { price: '778.71', time: '2016-12-15T00:00:00Z' },\n    { price: '779.81', time: '2016-12-14T00:00:00Z' },\n    { price: '778.68', time: '2016-12-13T00:00:00Z' },\n    { price: '773.11', time: '2016-12-12T00:00:00Z' },\n    { price: '772.10', time: '2016-12-11T00:00:00Z' },\n    { price: '772.37', time: '2016-12-10T00:00:00Z' },\n    { price: '769.21', time: '2016-12-09T00:00:00Z' },\n    { price: '764.95', time: '2016-12-08T00:00:00Z' },\n    { price: '759.64', time: '2016-12-07T00:00:00Z' },\n    { price: '756.74', time: '2016-12-06T00:00:00Z' },\n    { price: '761.05', time: '2016-12-05T00:00:00Z' },\n    { price: '766.03', time: '2016-12-04T00:00:00Z' },\n    { price: '767.07', time: '2016-12-03T00:00:00Z' },\n    { price: '758.38', time: '2016-12-02T00:00:00Z' },\n    { price: '743.33', time: '2016-12-01T00:00:00Z' },\n    { price: '734.93', time: '2016-11-30T00:00:00Z' },\n    { price: '731.72', time: '2016-11-29T00:00:00Z' },\n    { price: '732.50', time: '2016-11-28T00:00:00Z' },\n    { price: '734.23', time: '2016-11-27T00:00:00Z' },\n    { price: '734.74', time: '2016-11-26T00:00:00Z' },\n    { price: '736.43', time: '2016-11-25T00:00:00Z' },\n    { price: '740.24', time: '2016-11-24T00:00:00Z' },\n    { price: '740.85', time: '2016-11-23T00:00:00Z' },\n    { price: '737.26', time: '2016-11-22T00:00:00Z' },\n    { price: '738.17', time: '2016-11-21T00:00:00Z' },\n    { price: '745.10', time: '2016-11-20T00:00:00Z' },\n    { price: '745.69', time: '2016-11-19T00:00:00Z' },\n    { price: '742.72', time: '2016-11-18T00:00:00Z' },\n    { price: '732.75', time: '2016-11-17T00:00:00Z' },\n    { price: '716.87', time: '2016-11-16T00:00:00Z' },\n    { price: '707.17', time: '2016-11-15T00:00:00Z' },\n    { price: '700.30', time: '2016-11-14T00:00:00Z' },\n    { price: '703.71', time: '2016-11-13T00:00:00Z' },\n    { price: '712.65', time: '2016-11-12T00:00:00Z' },\n    { price: '715.15', time: '2016-11-11T00:00:00Z' },\n    { price: '721.56', time: '2016-11-10T00:00:00Z' },\n    { price: '718.51', time: '2016-11-09T00:00:00Z' },\n    { price: '708.54', time: '2016-11-08T00:00:00Z' },\n    { price: '710.74', time: '2016-11-07T00:00:00Z' },\n    { price: '709.48', time: '2016-11-06T00:00:00Z' },\n    { price: '703.17', time: '2016-11-05T00:00:00Z' },\n    { price: '712.76', time: '2016-11-04T00:00:00Z' },\n    { price: '725.39', time: '2016-11-03T00:00:00Z' },\n    { price: '723.98', time: '2016-11-02T00:00:00Z' },\n    { price: '710.86', time: '2016-11-01T00:00:00Z' },\n    { price: '703.78', time: '2016-10-31T00:00:00Z' },\n    { price: '708.07', time: '2016-10-30T00:00:00Z' },\n    { price: '697.97', time: '2016-10-29T00:00:00Z' },\n    { price: '685.53', time: '2016-10-28T00:00:00Z' },\n    { price: '673.66', time: '2016-10-27T00:00:00Z' },\n    { price: '658.85', time: '2016-10-26T00:00:00Z' },\n    { price: '651.53', time: '2016-10-25T00:00:00Z' },\n    { price: '650.70', time: '2016-10-24T00:00:00Z' },\n    { price: '645.89', time: '2016-10-23T00:00:00Z' },\n    { price: '634.72', time: '2016-10-22T00:00:00Z' },\n    { price: '629.16', time: '2016-10-21T00:00:00Z' },\n    { price: '630.62', time: '2016-10-20T00:00:00Z' },\n    { price: '635.10', time: '2016-10-19T00:00:00Z' },\n    { price: '638.61', time: '2016-10-18T00:00:00Z' },\n    { price: '640.72', time: '2016-10-17T00:00:00Z' },\n    { price: '640.40', time: '2016-10-16T00:00:00Z' },\n    { price: '638.01', time: '2016-10-15T00:00:00Z' },\n    { price: '636.78', time: '2016-10-14T00:00:00Z' },\n    { price: '638.92', time: '2016-10-13T00:00:00Z' },\n    { price: '637.50', time: '2016-10-12T00:00:00Z' },\n    { price: '626.13', time: '2016-10-11T00:00:00Z' },\n    { price: '617.95', time: '2016-10-10T00:00:00Z' },\n    { price: '618.60', time: '2016-10-09T00:00:00Z' },\n    { price: '617.01', time: '2016-10-08T00:00:00Z' },\n    { price: '613.82', time: '2016-10-07T00:00:00Z' },\n    { price: '612.13', time: '2016-10-06T00:00:00Z' },\n    { price: '611.18', time: '2016-10-05T00:00:00Z' },\n    { price: '612.03', time: '2016-10-04T00:00:00Z' },\n    { price: '613.11', time: '2016-10-03T00:00:00Z' },\n    { price: '613.41', time: '2016-10-02T00:00:00Z' },\n    { price: '610.09', time: '2016-10-01T00:00:00Z' },\n    { price: '605.86', time: '2016-09-30T00:00:00Z' },\n    { price: '605.11', time: '2016-09-29T00:00:00Z' },\n    { price: '604.93', time: '2016-09-28T00:00:00Z' },\n    { price: '605.19', time: '2016-09-27T00:00:00Z' },\n    { price: '603.80', time: '2016-09-26T00:00:00Z' },\n    { price: '603.11', time: '2016-09-25T00:00:00Z' },\n    { price: '601.59', time: '2016-09-24T00:00:00Z' },\n    { price: '598.07', time: '2016-09-23T00:00:00Z' },\n    { price: '597.36', time: '2016-09-22T00:00:00Z' },\n    { price: '603.37', time: '2016-09-21T00:00:00Z' },\n    { price: '609.43', time: '2016-09-20T00:00:00Z' },\n    { price: '609.55', time: '2016-09-19T00:00:00Z' },\n    { price: '608.32', time: '2016-09-18T00:00:00Z' },\n    { price: '607.22', time: '2016-09-17T00:00:00Z' },\n    { price: '607.46', time: '2016-09-16T00:00:00Z' },\n    { price: '608.80', time: '2016-09-15T00:00:00Z' },\n    { price: '608.80', time: '2016-09-14T00:00:00Z' },\n    { price: '607.62', time: '2016-09-13T00:00:00Z' },\n    { price: '614.06', time: '2016-09-12T00:00:00Z' },\n    { price: '622.21', time: '2016-09-11T00:00:00Z' },\n    { price: '623.19', time: '2016-09-10T00:00:00Z' },\n    { price: '623.02', time: '2016-09-09T00:00:00Z' },\n    { price: '618.19', time: '2016-09-08T00:00:00Z' },\n    { price: '611.09', time: '2016-09-07T00:00:00Z' },\n    { price: '608.25', time: '2016-09-06T00:00:00Z' },\n    { price: '607.02', time: '2016-09-05T00:00:00Z' },\n    { price: '593.49', time: '2016-09-04T00:00:00Z' },\n    { price: '576.89', time: '2016-09-03T00:00:00Z' },\n    { price: '572.49', time: '2016-09-02T00:00:00Z' },\n    { price: '572.06', time: '2016-09-01T00:00:00Z' },\n    { price: '573.79', time: '2016-08-31T00:00:00Z' },\n    { price: '574.60', time: '2016-08-30T00:00:00Z' },\n    { price: '573.26', time: '2016-08-29T00:00:00Z' },\n    { price: '573.30', time: '2016-08-28T00:00:00Z' },\n    { price: '576.00', time: '2016-08-27T00:00:00Z' },\n    { price: '576.57', time: '2016-08-26T00:00:00Z' },\n    { price: '577.57', time: '2016-08-25T00:00:00Z' },\n    { price: '581.51', time: '2016-08-24T00:00:00Z' },\n    { price: '582.90', time: '2016-08-23T00:00:00Z' },\n    { price: '582.28', time: '2016-08-22T00:00:00Z' },\n    { price: '580.17', time: '2016-08-21T00:00:00Z' },\n    { price: '576.59', time: '2016-08-20T00:00:00Z' },\n    { price: '575.01', time: '2016-08-19T00:00:00Z' },\n    { price: '575.87', time: '2016-08-18T00:00:00Z' },\n    { price: '574.76', time: '2016-08-17T00:00:00Z' },\n    { price: '571.46', time: '2016-08-16T00:00:00Z' },\n    { price: '574.12', time: '2016-08-15T00:00:00Z' },\n    { price: '583.05', time: '2016-08-14T00:00:00Z' },\n    { price: '587.77', time: '2016-08-13T00:00:00Z' },\n    { price: '590.57', time: '2016-08-12T00:00:00Z' },\n    { price: '592.91', time: '2016-08-11T00:00:00Z' },\n    { price: '590.88', time: '2016-08-10T00:00:00Z' },\n    { price: '591.39', time: '2016-08-09T00:00:00Z' },\n    { price: '593.78', time: '2016-08-08T00:00:00Z' },\n    { price: '588.18', time: '2016-08-07T00:00:00Z' },\n    { price: '580.65', time: '2016-08-06T00:00:00Z' },\n    { price: '580.37', time: '2016-08-05T00:00:00Z' },\n    { price: '568.21', time: '2016-08-04T00:00:00Z' },\n    { price: '573.49', time: '2016-08-03T00:00:00Z' },\n    { price: '606.17', time: '2016-08-02T00:00:00Z' },\n    { price: '629.55', time: '2016-08-01T00:00:00Z' },\n    { price: '648.08', time: '2016-07-31T00:00:00Z' },\n    { price: '657.23', time: '2016-07-30T00:00:00Z' },\n    { price: '657.20', time: '2016-07-29T00:00:00Z' },\n    { price: '655.84', time: '2016-07-28T00:00:00Z' },\n    { price: '654.63', time: '2016-07-27T00:00:00Z' },\n    { price: '656.40', time: '2016-07-26T00:00:00Z' },\n    { price: '658.69', time: '2016-07-25T00:00:00Z' },\n    { price: '659.01', time: '2016-07-24T00:00:00Z' },\n    { price: '660.73', time: '2016-07-23T00:00:00Z' },\n    { price: '664.14', time: '2016-07-22T00:00:00Z' },\n    { price: '668.16', time: '2016-07-21T00:00:00Z' },\n    { price: '672.13', time: '2016-07-20T00:00:00Z' },\n    { price: '676.06', time: '2016-07-19T00:00:00Z' },\n    { price: '675.67', time: '2016-07-18T00:00:00Z' },\n    { price: '669.77', time: '2016-07-17T00:00:00Z' },\n    { price: '666.29', time: '2016-07-16T00:00:00Z' },\n    { price: '662.46', time: '2016-07-15T00:00:00Z' },\n    { price: '661.86', time: '2016-07-14T00:00:00Z' },\n    { price: '661.74', time: '2016-07-13T00:00:00Z' },\n    { price: '656.05', time: '2016-07-12T00:00:00Z' },\n    { price: '651.80', time: '2016-07-11T00:00:00Z' },\n    { price: '652.32', time: '2016-07-10T00:00:00Z' },\n    { price: '651.86', time: '2016-07-09T00:00:00Z' },\n    { price: '647.65', time: '2016-07-08T00:00:00Z' },\n    { price: '659.86', time: '2016-07-07T00:00:00Z' },\n    { price: '674.19', time: '2016-07-06T00:00:00Z' },\n    { price: '674.08', time: '2016-07-05T00:00:00Z' },\n    { price: '676.18', time: '2016-07-04T00:00:00Z' },\n  ],\n};\n\nexport default bitcoinPrice;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/browserUsage.ts",
    "content": "export interface BrowserUsage {\n  date: string;\n  'Google Chrome': string;\n  'Internet Explorer': string;\n  Firefox: string;\n  Safari: string;\n  'Microsoft Edge': string;\n  Opera: string;\n  Mozilla: string;\n  'Other/Unknown': string;\n}\n\nconst browserUsage: BrowserUsage[] = [\n  {\n    date: '2015 Jun 15',\n    'Google Chrome': '48.09',\n    'Internet Explorer': '24.14',\n    Firefox: '18.82',\n    Safari: '7.46',\n    'Microsoft Edge': '0.03',\n    Opera: '1.32',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 16',\n    'Google Chrome': '48',\n    'Internet Explorer': '24.19',\n    Firefox: '18.96',\n    Safari: '7.36',\n    'Microsoft Edge': '0.03',\n    Opera: '1.32',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 17',\n    'Google Chrome': '47.87',\n    'Internet Explorer': '24.44',\n    Firefox: '18.91',\n    Safari: '7.27',\n    'Microsoft Edge': '0.03',\n    Opera: '1.36',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 18',\n    'Google Chrome': '48.22',\n    'Internet Explorer': '23.83',\n    Firefox: '19.16',\n    Safari: '7.24',\n    'Microsoft Edge': '0.04',\n    Opera: '1.39',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 19',\n    'Google Chrome': '47.91',\n    'Internet Explorer': '23.86',\n    Firefox: '19.35',\n    Safari: '7.31',\n    'Microsoft Edge': '0.04',\n    Opera: '1.41',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 20',\n    'Google Chrome': '48.78',\n    'Internet Explorer': '21.14',\n    Firefox: '19.66',\n    Safari: '8.42',\n    'Microsoft Edge': '0.05',\n    Opera: '1.83',\n    Mozilla: '0.1',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 21',\n    'Google Chrome': '49.43',\n    'Internet Explorer': '20.55',\n    Firefox: '19.42',\n    Safari: '8.66',\n    'Microsoft Edge': '0.05',\n    Opera: '1.75',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 22',\n    'Google Chrome': '48.98',\n    'Internet Explorer': '23.47',\n    Firefox: '18.84',\n    Safari: '7.25',\n    'Microsoft Edge': '0.04',\n    Opera: '1.28',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 23',\n    'Google Chrome': '48.69',\n    'Internet Explorer': '23.76',\n    Firefox: '18.89',\n    Safari: '7.22',\n    'Microsoft Edge': '0.04',\n    Opera: '1.27',\n    Mozilla: '0.11',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 24',\n    'Google Chrome': '49.17',\n    'Internet Explorer': '23.35',\n    Firefox: '18.91',\n    Safari: '7.09',\n    'Microsoft Edge': '0.04',\n    Opera: '1.32',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 25',\n    'Google Chrome': '49.32',\n    'Internet Explorer': '23.39',\n    Firefox: '18.76',\n    Safari: '7.03',\n    'Microsoft Edge': '0.04',\n    Opera: '1.34',\n    Mozilla: '0.11',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Jun 26',\n    'Google Chrome': '49.39',\n    'Internet Explorer': '23.11',\n    Firefox: '18.84',\n    Safari: '7.14',\n    'Microsoft Edge': '0.04',\n    Opera: '1.37',\n    Mozilla: '0.1',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Jun 27',\n    'Google Chrome': '49.77',\n    'Internet Explorer': '20.68',\n    Firefox: '19.23',\n    Safari: '8.46',\n    'Microsoft Edge': '0.05',\n    Opera: '1.71',\n    Mozilla: '0.09',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 28',\n    'Google Chrome': '50.07',\n    'Internet Explorer': '20.41',\n    Firefox: '18.91',\n    Safari: '8.77',\n    'Microsoft Edge': '0.05',\n    Opera: '1.69',\n    Mozilla: '0.1',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 29',\n    'Google Chrome': '49.32',\n    'Internet Explorer': '23.3',\n    Firefox: '18.54',\n    Safari: '7.4',\n    'Microsoft Edge': '0.04',\n    Opera: '1.27',\n    Mozilla: '0.11',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jun 30',\n    'Google Chrome': '49.99',\n    'Internet Explorer': '22.94',\n    Firefox: '18.45',\n    Safari: '7.07',\n    'Microsoft Edge': '0.07',\n    Opera: '1.32',\n    Mozilla: '0.13',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 1',\n    'Google Chrome': '50.22',\n    'Internet Explorer': '22.79',\n    Firefox: '18.46',\n    Safari: '6.95',\n    'Microsoft Edge': '0.07',\n    Opera: '1.37',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 2',\n    'Google Chrome': '50.33',\n    'Internet Explorer': '22.59',\n    Firefox: '18.74',\n    Safari: '6.69',\n    'Microsoft Edge': '0.07',\n    Opera: '1.45',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 3',\n    'Google Chrome': '50.4',\n    'Internet Explorer': '21.29',\n    Firefox: '19.28',\n    Safari: '7.28',\n    'Microsoft Edge': '0.08',\n    Opera: '1.54',\n    Mozilla: '0.11',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 4',\n    'Google Chrome': '50.83',\n    'Internet Explorer': '20.02',\n    Firefox: '19.12',\n    Safari: '7.99',\n    'Microsoft Edge': '0.08',\n    Opera: '1.82',\n    Mozilla: '0.11',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 5',\n    'Google Chrome': '51.6',\n    'Internet Explorer': '19.6',\n    Firefox: '18.43',\n    Safari: '8.58',\n    'Microsoft Edge': '0.07',\n    Opera: '1.62',\n    Mozilla: '0.1',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 6',\n    'Google Chrome': '50.53',\n    'Internet Explorer': '22.64',\n    Firefox: '18.04',\n    Safari: '7.33',\n    'Microsoft Edge': '0.07',\n    Opera: '1.27',\n    Mozilla: '0.11',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 7',\n    'Google Chrome': '50.01',\n    'Internet Explorer': '23.02',\n    Firefox: '18.32',\n    Safari: '7.25',\n    'Microsoft Edge': '0.07',\n    Opera: '1.25',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 8',\n    'Google Chrome': '49.52',\n    'Internet Explorer': '23.17',\n    Firefox: '18.55',\n    Safari: '7.31',\n    'Microsoft Edge': '0.07',\n    Opera: '1.32',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 9',\n    'Google Chrome': '49.31',\n    'Internet Explorer': '23.24',\n    Firefox: '18.7',\n    Safari: '7.22',\n    'Microsoft Edge': '0.08',\n    Opera: '1.39',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 10',\n    'Google Chrome': '48.4',\n    'Internet Explorer': '23.68',\n    Firefox: '18.97',\n    Safari: '7.37',\n    'Microsoft Edge': '0.09',\n    Opera: '1.43',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 11',\n    'Google Chrome': '48.87',\n    'Internet Explorer': '21.22',\n    Firefox: '19.33',\n    Safari: '8.65',\n    'Microsoft Edge': '0.1',\n    Opera: '1.76',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 12',\n    'Google Chrome': '49.4',\n    'Internet Explorer': '20.87',\n    Firefox: '18.84',\n    Safari: '8.99',\n    'Microsoft Edge': '0.09',\n    Opera: '1.73',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 13',\n    'Google Chrome': '49.12',\n    'Internet Explorer': '23.35',\n    Firefox: '18.49',\n    Safari: '7.51',\n    'Microsoft Edge': '0.07',\n    Opera: '1.39',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 14',\n    'Google Chrome': '49.36',\n    'Internet Explorer': '23.2',\n    Firefox: '18.48',\n    Safari: '7.48',\n    'Microsoft Edge': '0.08',\n    Opera: '1.35',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 15',\n    'Google Chrome': '48.88',\n    'Internet Explorer': '23.73',\n    Firefox: '18.46',\n    Safari: '7.44',\n    'Microsoft Edge': '0.09',\n    Opera: '1.34',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 16',\n    'Google Chrome': '48.76',\n    'Internet Explorer': '23.77',\n    Firefox: '18.5',\n    Safari: '7.43',\n    'Microsoft Edge': '0.09',\n    Opera: '1.4',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 17',\n    'Google Chrome': '47.58',\n    'Internet Explorer': '24.54',\n    Firefox: '18.76',\n    Safari: '7.53',\n    'Microsoft Edge': '0.09',\n    Opera: '1.43',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 18',\n    'Google Chrome': '48.06',\n    'Internet Explorer': '21.89',\n    Firefox: '19.14',\n    Safari: '8.99',\n    'Microsoft Edge': '0.11',\n    Opera: '1.74',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 19',\n    'Google Chrome': '48.39',\n    'Internet Explorer': '21.5',\n    Firefox: '19',\n    Safari: '9.23',\n    'Microsoft Edge': '0.11',\n    Opera: '1.7',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 20',\n    'Google Chrome': '48.32',\n    'Internet Explorer': '23.91',\n    Firefox: '18.62',\n    Safari: '7.68',\n    'Microsoft Edge': '0.09',\n    Opera: '1.32',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 21',\n    'Google Chrome': '47.81',\n    'Internet Explorer': '24.98',\n    Firefox: '18.34',\n    Safari: '7.52',\n    'Microsoft Edge': '0.08',\n    Opera: '1.2',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 22',\n    'Google Chrome': '48.28',\n    'Internet Explorer': '24.4',\n    Firefox: '18.45',\n    Safari: '7.44',\n    'Microsoft Edge': '0.08',\n    Opera: '1.29',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 23',\n    'Google Chrome': '48.41',\n    'Internet Explorer': '24.2',\n    Firefox: '18.57',\n    Safari: '7.35',\n    'Microsoft Edge': '0.08',\n    Opera: '1.31',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 24',\n    'Google Chrome': '48.22',\n    'Internet Explorer': '23.96',\n    Firefox: '18.67',\n    Safari: '7.55',\n    'Microsoft Edge': '0.1',\n    Opera: '1.42',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 25',\n    'Google Chrome': '48.11',\n    'Internet Explorer': '21.86',\n    Firefox: '19.28',\n    Safari: '8.88',\n    'Microsoft Edge': '0.1',\n    Opera: '1.65',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 26',\n    'Google Chrome': '48.27',\n    'Internet Explorer': '21.57',\n    Firefox: '19',\n    Safari: '9.38',\n    'Microsoft Edge': '0.11',\n    Opera: '1.59',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 27',\n    'Google Chrome': '48.5',\n    'Internet Explorer': '23.72',\n    Firefox: '18.59',\n    Safari: '7.76',\n    'Microsoft Edge': '0.1',\n    Opera: '1.27',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Jul 28',\n    'Google Chrome': '48.48',\n    'Internet Explorer': '23.95',\n    Firefox: '18.46',\n    Safari: '7.61',\n    'Microsoft Edge': '0.12',\n    Opera: '1.31',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 29',\n    'Google Chrome': '48.33',\n    'Internet Explorer': '23.77',\n    Firefox: '18.56',\n    Safari: '7.51',\n    'Microsoft Edge': '0.42',\n    Opera: '1.33',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 30',\n    'Google Chrome': '47.8',\n    'Internet Explorer': '24.06',\n    Firefox: '18.6',\n    Safari: '7.46',\n    'Microsoft Edge': '0.7',\n    Opera: '1.3',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Jul 31',\n    'Google Chrome': '48.41',\n    'Internet Explorer': '22.9',\n    Firefox: '18.88',\n    Safari: '7.48',\n    'Microsoft Edge': '0.84',\n    Opera: '1.41',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 1',\n    'Google Chrome': '48.8',\n    'Internet Explorer': '20.29',\n    Firefox: '19.16',\n    Safari: '8.75',\n    'Microsoft Edge': '1.16',\n    Opera: '1.75',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 2',\n    'Google Chrome': '48.95',\n    'Internet Explorer': '20.27',\n    Firefox: '18.81',\n    Safari: '9',\n    'Microsoft Edge': '1.23',\n    Opera: '1.65',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 3',\n    'Google Chrome': '49.07',\n    'Internet Explorer': '22.67',\n    Firefox: '18.35',\n    Safari: '7.59',\n    'Microsoft Edge': '0.93',\n    Opera: '1.31',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 4',\n    'Google Chrome': '49.18',\n    'Internet Explorer': '22.72',\n    Firefox: '18.31',\n    Safari: '7.44',\n    'Microsoft Edge': '0.95',\n    Opera: '1.32',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 5',\n    'Google Chrome': '49.56',\n    'Internet Explorer': '22.37',\n    Firefox: '18.28',\n    Safari: '7.38',\n    'Microsoft Edge': '0.99',\n    Opera: '1.34',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 6',\n    'Google Chrome': '49.77',\n    'Internet Explorer': '21.81',\n    Firefox: '18.28',\n    Safari: '7.67',\n    'Microsoft Edge': '1.12',\n    Opera: '1.28',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 7',\n    'Google Chrome': '48.73',\n    'Internet Explorer': '22.63',\n    Firefox: '18.42',\n    Safari: '7.5',\n    'Microsoft Edge': '1.26',\n    Opera: '1.39',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 8',\n    'Google Chrome': '49.6',\n    'Internet Explorer': '18.97',\n    Firefox: '19.11',\n    Safari: '8.79',\n    'Microsoft Edge': '1.69',\n    Opera: '1.74',\n    Mozilla: '0.09',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 9',\n    'Google Chrome': '49.68',\n    'Internet Explorer': '18.85',\n    Firefox: '18.71',\n    Safari: '9.23',\n    'Microsoft Edge': '1.72',\n    Opera: '1.72',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 10',\n    'Google Chrome': '49.11',\n    'Internet Explorer': '22.54',\n    Firefox: '17.97',\n    Safari: '7.64',\n    'Microsoft Edge': '1.28',\n    Opera: '1.39',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 11',\n    'Google Chrome': '49.21',\n    'Internet Explorer': '22.59',\n    Firefox: '17.96',\n    Safari: '7.56',\n    'Microsoft Edge': '1.27',\n    Opera: '1.35',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 12',\n    'Google Chrome': '48.95',\n    'Internet Explorer': '22.68',\n    Firefox: '18.21',\n    Safari: '7.44',\n    'Microsoft Edge': '1.3',\n    Opera: '1.35',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 13',\n    'Google Chrome': '49.31',\n    'Internet Explorer': '22.28',\n    Firefox: '18.19',\n    Safari: '7.32',\n    'Microsoft Edge': '1.31',\n    Opera: '1.51',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 14',\n    'Google Chrome': '49.08',\n    'Internet Explorer': '21.98',\n    Firefox: '18.38',\n    Safari: '7.47',\n    'Microsoft Edge': '1.43',\n    Opera: '1.56',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 15',\n    'Google Chrome': '49.1',\n    'Internet Explorer': '19.47',\n    Firefox: '18.77',\n    Safari: '8.85',\n    'Microsoft Edge': '1.87',\n    Opera: '1.86',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 16',\n    'Google Chrome': '49.5',\n    'Internet Explorer': '19.33',\n    Firefox: '18.42',\n    Safari: '9.12',\n    'Microsoft Edge': '1.83',\n    Opera: '1.72',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 17',\n    'Google Chrome': '49.42',\n    'Internet Explorer': '22.12',\n    Firefox: '18.06',\n    Safari: '7.5',\n    'Microsoft Edge': '1.36',\n    Opera: '1.44',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 18',\n    'Google Chrome': '49.46',\n    'Internet Explorer': '22.16',\n    Firefox: '18.05',\n    Safari: '7.43',\n    'Microsoft Edge': '1.41',\n    Opera: '1.41',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 19',\n    'Google Chrome': '49.51',\n    'Internet Explorer': '22.21',\n    Firefox: '17.93',\n    Safari: '7.46',\n    'Microsoft Edge': '1.39',\n    Opera: '1.42',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 20',\n    'Google Chrome': '49.43',\n    'Internet Explorer': '22.38',\n    Firefox: '17.91',\n    Safari: '7.31',\n    'Microsoft Edge': '1.42',\n    Opera: '1.47',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 21',\n    'Google Chrome': '49.44',\n    'Internet Explorer': '21.79',\n    Firefox: '18.3',\n    Safari: '7.39',\n    'Microsoft Edge': '1.51',\n    Opera: '1.47',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 22',\n    'Google Chrome': '49.79',\n    'Internet Explorer': '19.29',\n    Firefox: '18.51',\n    Safari: '8.67',\n    'Microsoft Edge': '1.91',\n    Opera: '1.74',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 23',\n    'Google Chrome': '50.12',\n    'Internet Explorer': '18.91',\n    Firefox: '18.1',\n    Safari: '9.11',\n    'Microsoft Edge': '1.89',\n    Opera: '1.8',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 24',\n    'Google Chrome': '49.34',\n    'Internet Explorer': '22.2',\n    Firefox: '18.01',\n    Safari: '7.62',\n    'Microsoft Edge': '1.48',\n    Opera: '1.29',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Aug 25',\n    'Google Chrome': '49.21',\n    'Internet Explorer': '22.51',\n    Firefox: '17.91',\n    Safari: '7.47',\n    'Microsoft Edge': '1.47',\n    Opera: '1.38',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 26',\n    'Google Chrome': '49.06',\n    'Internet Explorer': '22.58',\n    Firefox: '17.92',\n    Safari: '7.52',\n    'Microsoft Edge': '1.47',\n    Opera: '1.39',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 27',\n    'Google Chrome': '48.89',\n    'Internet Explorer': '22.63',\n    Firefox: '17.98',\n    Safari: '7.57',\n    'Microsoft Edge': '1.51',\n    Opera: '1.35',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Aug 28',\n    'Google Chrome': '48.69',\n    'Internet Explorer': '22.44',\n    Firefox: '18.2',\n    Safari: '7.56',\n    'Microsoft Edge': '1.61',\n    Opera: '1.43',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 29',\n    'Google Chrome': '48.64',\n    'Internet Explorer': '19.87',\n    Firefox: '18.43',\n    Safari: '9.16',\n    'Microsoft Edge': '2.07',\n    Opera: '1.74',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 30',\n    'Google Chrome': '49.72',\n    'Internet Explorer': '18.84',\n    Firefox: '17.88',\n    Safari: '9.76',\n    'Microsoft Edge': '2.03',\n    Opera: '1.69',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Aug 31',\n    'Google Chrome': '49.43',\n    'Internet Explorer': '21.94',\n    Firefox: '17.82',\n    Safari: '7.87',\n    'Microsoft Edge': '1.57',\n    Opera: '1.31',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 1',\n    'Google Chrome': '49.65',\n    'Internet Explorer': '21.91',\n    Firefox: '17.95',\n    Safari: '7.52',\n    'Microsoft Edge': '1.52',\n    Opera: '1.39',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 2',\n    'Google Chrome': '49.73',\n    'Internet Explorer': '21.85',\n    Firefox: '18.02',\n    Safari: '7.49',\n    'Microsoft Edge': '1.53',\n    Opera: '1.3',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 3',\n    'Google Chrome': '49.59',\n    'Internet Explorer': '21.97',\n    Firefox: '17.88',\n    Safari: '7.6',\n    'Microsoft Edge': '1.58',\n    Opera: '1.31',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 4',\n    'Google Chrome': '49.52',\n    'Internet Explorer': '21.64',\n    Firefox: '18.06',\n    Safari: '7.62',\n    'Microsoft Edge': '1.67',\n    Opera: '1.41',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 5',\n    'Google Chrome': '50.28',\n    'Internet Explorer': '18.93',\n    Firefox: '18.19',\n    Safari: '8.71',\n    'Microsoft Edge': '2.13',\n    Opera: '1.69',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 6',\n    'Google Chrome': '50.25',\n    'Internet Explorer': '18.67',\n    Firefox: '18.2',\n    Safari: '9.04',\n    'Microsoft Edge': '2.09',\n    Opera: '1.67',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 7',\n    'Google Chrome': '49.83',\n    'Internet Explorer': '19.8',\n    Firefox: '18.39',\n    Safari: '8.63',\n    'Microsoft Edge': '1.86',\n    Opera: '1.43',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 8',\n    'Google Chrome': '50',\n    'Internet Explorer': '21.8',\n    Firefox: '17.62',\n    Safari: '7.66',\n    'Microsoft Edge': '1.55',\n    Opera: '1.31',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 9',\n    'Google Chrome': '49.81',\n    'Internet Explorer': '21.89',\n    Firefox: '17.58',\n    Safari: '7.83',\n    'Microsoft Edge': '1.59',\n    Opera: '1.25',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 10',\n    'Google Chrome': '49.65',\n    'Internet Explorer': '21.93',\n    Firefox: '17.74',\n    Safari: '7.82',\n    'Microsoft Edge': '1.6',\n    Opera: '1.19',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 11',\n    'Google Chrome': '49.75',\n    'Internet Explorer': '21.71',\n    Firefox: '17.88',\n    Safari: '7.64',\n    'Microsoft Edge': '1.67',\n    Opera: '1.29',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 12',\n    'Google Chrome': '49.86',\n    'Internet Explorer': '19.04',\n    Firefox: '17.96',\n    Safari: '9.3',\n    'Microsoft Edge': '2.21',\n    Opera: '1.56',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 13',\n    'Google Chrome': '50.1',\n    'Internet Explorer': '18.71',\n    Firefox: '17.76',\n    Safari: '9.69',\n    'Microsoft Edge': '2.19',\n    Opera: '1.49',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 14',\n    'Google Chrome': '49.91',\n    'Internet Explorer': '21.55',\n    Firefox: '17.87',\n    Safari: '7.74',\n    'Microsoft Edge': '1.66',\n    Opera: '1.21',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 15',\n    'Google Chrome': '50.1',\n    'Internet Explorer': '21.34',\n    Firefox: '17.96',\n    Safari: '7.63',\n    'Microsoft Edge': '1.66',\n    Opera: '1.25',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 16',\n    'Google Chrome': '50.6',\n    'Internet Explorer': '21.53',\n    Firefox: '17.44',\n    Safari: '7.56',\n    'Microsoft Edge': '1.59',\n    Opera: '1.23',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 17',\n    'Google Chrome': '50.59',\n    'Internet Explorer': '21.59',\n    Firefox: '17.55',\n    Safari: '7.37',\n    'Microsoft Edge': '1.6',\n    Opera: '1.24',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 18',\n    'Google Chrome': '50.57',\n    'Internet Explorer': '21.75',\n    Firefox: '17.43',\n    Safari: '7.17',\n    'Microsoft Edge': '1.7',\n    Opera: '1.32',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Sep 19',\n    'Google Chrome': '51.33',\n    'Internet Explorer': '18.77',\n    Firefox: '17.63',\n    Safari: '8.37',\n    'Microsoft Edge': '2.17',\n    Opera: '1.66',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 20',\n    'Google Chrome': '51.41',\n    'Internet Explorer': '18.15',\n    Firefox: '17.55',\n    Safari: '9.09',\n    'Microsoft Edge': '2.17',\n    Opera: '1.58',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 21',\n    'Google Chrome': '50.76',\n    'Internet Explorer': '21.38',\n    Firefox: '17.41',\n    Safari: '7.52',\n    'Microsoft Edge': '1.67',\n    Opera: '1.22',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 22',\n    'Google Chrome': '50.6',\n    'Internet Explorer': '21.48',\n    Firefox: '17.55',\n    Safari: '7.41',\n    'Microsoft Edge': '1.7',\n    Opera: '1.22',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Sep 23',\n    'Google Chrome': '50.56',\n    'Internet Explorer': '21.5',\n    Firefox: '17.52',\n    Safari: '7.42',\n    'Microsoft Edge': '1.71',\n    Opera: '1.25',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Sep 24',\n    'Google Chrome': '50.66',\n    'Internet Explorer': '21.34',\n    Firefox: '17.52',\n    Safari: '7.45',\n    'Microsoft Edge': '1.7',\n    Opera: '1.29',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Sep 25',\n    'Google Chrome': '50.87',\n    'Internet Explorer': '20.84',\n    Firefox: '17.84',\n    Safari: '7.24',\n    'Microsoft Edge': '1.78',\n    Opera: '1.39',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 26',\n    'Google Chrome': '51.66',\n    'Internet Explorer': '17.77',\n    Firefox: '18.01',\n    Safari: '8.52',\n    'Microsoft Edge': '2.28',\n    Opera: '1.71',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 27',\n    'Google Chrome': '51.99',\n    'Internet Explorer': '17.24',\n    Firefox: '17.71',\n    Safari: '9.17',\n    'Microsoft Edge': '2.25',\n    Opera: '1.6',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Sep 28',\n    'Google Chrome': '50.77',\n    'Internet Explorer': '21.23',\n    Firefox: '17.52',\n    Safari: '7.49',\n    'Microsoft Edge': '1.73',\n    Opera: '1.22',\n    Mozilla: '0.03',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 29',\n    'Google Chrome': '50.75',\n    'Internet Explorer': '21.39',\n    Firefox: '17.47',\n    Safari: '7.38',\n    'Microsoft Edge': '1.74',\n    Opera: '1.22',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Sep 30',\n    'Google Chrome': '50.8',\n    'Internet Explorer': '21.34',\n    Firefox: '17.4',\n    Safari: '7.46',\n    'Microsoft Edge': '1.74',\n    Opera: '1.23',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 1',\n    'Google Chrome': '50.82',\n    'Internet Explorer': '21.39',\n    Firefox: '17.19',\n    Safari: '7.55',\n    'Microsoft Edge': '1.78',\n    Opera: '1.24',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 2',\n    'Google Chrome': '50.93',\n    'Internet Explorer': '21.17',\n    Firefox: '17.32',\n    Safari: '7.38',\n    'Microsoft Edge': '1.86',\n    Opera: '1.32',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 3',\n    'Google Chrome': '51.69',\n    'Internet Explorer': '18.12',\n    Firefox: '17.51',\n    Safari: '8.61',\n    'Microsoft Edge': '2.34',\n    Opera: '1.68',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 4',\n    'Google Chrome': '52.06',\n    'Internet Explorer': '17.59',\n    Firefox: '17.18',\n    Safari: '9.25',\n    'Microsoft Edge': '2.32',\n    Opera: '1.58',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 5',\n    'Google Chrome': '51.4',\n    'Internet Explorer': '20.73',\n    Firefox: '17.24',\n    Safari: '7.56',\n    'Microsoft Edge': '1.81',\n    Opera: '1.22',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 6',\n    'Google Chrome': '51.81',\n    'Internet Explorer': '20.35',\n    Firefox: '17.31',\n    Safari: '7.46',\n    'Microsoft Edge': '1.79',\n    Opera: '1.25',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 7',\n    'Google Chrome': '51.98',\n    'Internet Explorer': '20.18',\n    Firefox: '17.29',\n    Safari: '7.49',\n    'Microsoft Edge': '1.76',\n    Opera: '1.27',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 8',\n    'Google Chrome': '50.97',\n    'Internet Explorer': '20.56',\n    Firefox: '17.72',\n    Safari: '7.63',\n    'Microsoft Edge': '1.79',\n    Opera: '1.3',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 9',\n    'Google Chrome': '50.94',\n    'Internet Explorer': '20.42',\n    Firefox: '17.8',\n    Safari: '7.52',\n    'Microsoft Edge': '1.88',\n    Opera: '1.4',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 10',\n    'Google Chrome': '51.02',\n    'Internet Explorer': '17.74',\n    Firefox: '18.26',\n    Safari: '8.79',\n    'Microsoft Edge': '2.38',\n    Opera: '1.75',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 11',\n    'Google Chrome': '52.07',\n    'Internet Explorer': '16.83',\n    Firefox: '17.77',\n    Safari: '9.23',\n    'Microsoft Edge': '2.32',\n    Opera: '1.72',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Oct 12',\n    'Google Chrome': '50.9',\n    'Internet Explorer': '19.94',\n    Firefox: '17.55',\n    Safari: '8.27',\n    'Microsoft Edge': '1.94',\n    Opera: '1.35',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Oct 13',\n    'Google Chrome': '51.52',\n    'Internet Explorer': '19.66',\n    Firefox: '17.71',\n    Safari: '7.76',\n    'Microsoft Edge': '1.78',\n    Opera: '1.51',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Oct 14',\n    'Google Chrome': '51.75',\n    'Internet Explorer': '19.37',\n    Firefox: '17.85',\n    Safari: '7.72',\n    'Microsoft Edge': '1.82',\n    Opera: '1.44',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 15',\n    'Google Chrome': '51.37',\n    'Internet Explorer': '19.66',\n    Firefox: '17.92',\n    Safari: '7.68',\n    'Microsoft Edge': '1.87',\n    Opera: '1.46',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 16',\n    'Google Chrome': '51.29',\n    'Internet Explorer': '19.56',\n    Firefox: '18.06',\n    Safari: '7.62',\n    'Microsoft Edge': '1.91',\n    Opera: '1.52',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 17',\n    'Google Chrome': '52.47',\n    'Internet Explorer': '15.8',\n    Firefox: '18.39',\n    Safari: '8.96',\n    'Microsoft Edge': '2.46',\n    Opera: '1.88',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 18',\n    'Google Chrome': '51.88',\n    'Internet Explorer': '16.03',\n    Firefox: '18.07',\n    Safari: '9.75',\n    'Microsoft Edge': '2.42',\n    Opera: '1.79',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 19',\n    'Google Chrome': '51.48',\n    'Internet Explorer': '19.69',\n    Firefox: '17.68',\n    Safari: '7.87',\n    'Microsoft Edge': '1.83',\n    Opera: '1.41',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 20',\n    'Google Chrome': '51.58',\n    'Internet Explorer': '19.73',\n    Firefox: '17.63',\n    Safari: '7.85',\n    'Microsoft Edge': '1.8',\n    Opera: '1.38',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 21',\n    'Google Chrome': '52.04',\n    'Internet Explorer': '20.14',\n    Firefox: '16.99',\n    Safari: '7.63',\n    'Microsoft Edge': '1.81',\n    Opera: '1.34',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 22',\n    'Google Chrome': '51.62',\n    'Internet Explorer': '20.1',\n    Firefox: '17.28',\n    Safari: '7.75',\n    'Microsoft Edge': '1.86',\n    Opera: '1.35',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 23',\n    'Google Chrome': '51.87',\n    'Internet Explorer': '19.88',\n    Firefox: '17.17',\n    Safari: '7.64',\n    'Microsoft Edge': '1.94',\n    Opera: '1.45',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Oct 24',\n    'Google Chrome': '52.62',\n    'Internet Explorer': '16.25',\n    Firefox: '17.52',\n    Safari: '9.28',\n    'Microsoft Edge': '2.5',\n    Opera: '1.78',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 25',\n    'Google Chrome': '52.64',\n    'Internet Explorer': '16.1',\n    Firefox: '17.4',\n    Safari: '9.69',\n    'Microsoft Edge': '2.46',\n    Opera: '1.67',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Oct 26',\n    'Google Chrome': '52.29',\n    'Internet Explorer': '19.72',\n    Firefox: '17',\n    Safari: '7.81',\n    'Microsoft Edge': '1.88',\n    Opera: '1.26',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 27',\n    'Google Chrome': '51.88',\n    'Internet Explorer': '20.08',\n    Firefox: '17.1',\n    Safari: '7.73',\n    'Microsoft Edge': '1.87',\n    Opera: '1.3',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 28',\n    'Google Chrome': '51.92',\n    'Internet Explorer': '19.48',\n    Firefox: '17.49',\n    Safari: '7.86',\n    'Microsoft Edge': '1.93',\n    Opera: '1.28',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 29',\n    'Google Chrome': '51.56',\n    'Internet Explorer': '19.74',\n    Firefox: '17.83',\n    Safari: '7.64',\n    'Microsoft Edge': '1.9',\n    Opera: '1.31',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 30',\n    'Google Chrome': '51.8',\n    'Internet Explorer': '19.42',\n    Firefox: '17.86',\n    Safari: '7.5',\n    'Microsoft Edge': '1.99',\n    Opera: '1.38',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Oct 31',\n    'Google Chrome': '52.67',\n    'Internet Explorer': '16.22',\n    Firefox: '18.22',\n    Safari: '8.62',\n    'Microsoft Edge': '2.46',\n    Opera: '1.76',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 1',\n    'Google Chrome': '52.4',\n    'Internet Explorer': '15.92',\n    Firefox: '17.77',\n    Safari: '9.7',\n    'Microsoft Edge': '2.48',\n    Opera: '1.62',\n    Mozilla: '0.1',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 2',\n    'Google Chrome': '51.9',\n    'Internet Explorer': '19.56',\n    Firefox: '17.26',\n    Safari: '7.93',\n    'Microsoft Edge': '1.96',\n    Opera: '1.32',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 3',\n    'Google Chrome': '51.95',\n    'Internet Explorer': '19.83',\n    Firefox: '17.41',\n    Safari: '7.53',\n    'Microsoft Edge': '1.89',\n    Opera: '1.33',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 4',\n    'Google Chrome': '52.25',\n    'Internet Explorer': '19.61',\n    Firefox: '17.24',\n    Safari: '7.57',\n    'Microsoft Edge': '1.83',\n    Opera: '1.44',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 5',\n    'Google Chrome': '51.98',\n    'Internet Explorer': '19.9',\n    Firefox: '17.2',\n    Safari: '7.63',\n    'Microsoft Edge': '1.87',\n    Opera: '1.35',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 6',\n    'Google Chrome': '51.38',\n    'Internet Explorer': '20.09',\n    Firefox: '17.39',\n    Safari: '7.74',\n    'Microsoft Edge': '1.97',\n    Opera: '1.36',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 7',\n    'Google Chrome': '52.45',\n    'Internet Explorer': '16.46',\n    Firefox: '17.38',\n    Safari: '9.32',\n    'Microsoft Edge': '2.6',\n    Opera: '1.7',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Nov 8',\n    'Google Chrome': '52.61',\n    'Internet Explorer': '16.12',\n    Firefox: '16.97',\n    Safari: '9.97',\n    'Microsoft Edge': '2.55',\n    Opera: '1.69',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Nov 9',\n    'Google Chrome': '51.65',\n    'Internet Explorer': '20.18',\n    Firefox: '16.67',\n    Safari: '8.21',\n    'Microsoft Edge': '1.96',\n    Opera: '1.28',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 10',\n    'Google Chrome': '51.95',\n    'Internet Explorer': '19.99',\n    Firefox: '16.46',\n    Safari: '8.29',\n    'Microsoft Edge': '1.95',\n    Opera: '1.29',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Nov 11',\n    'Google Chrome': '52.74',\n    'Internet Explorer': '18.91',\n    Firefox: '16.38',\n    Safari: '8.49',\n    'Microsoft Edge': '2.04',\n    Opera: '1.37',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Nov 12',\n    'Google Chrome': '52.16',\n    'Internet Explorer': '19.88',\n    Firefox: '16.54',\n    Safari: '8.03',\n    'Microsoft Edge': '1.99',\n    Opera: '1.35',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 13',\n    'Google Chrome': '52.17',\n    'Internet Explorer': '19.7',\n    Firefox: '16.65',\n    Safari: '7.98',\n    'Microsoft Edge': '2.09',\n    Opera: '1.35',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 14',\n    'Google Chrome': '52.81',\n    'Internet Explorer': '16.25',\n    Firefox: '17.02',\n    Safari: '9.53',\n    'Microsoft Edge': '2.71',\n    Opera: '1.62',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 15',\n    'Google Chrome': '52.89',\n    'Internet Explorer': '15.65',\n    Firefox: '16.97',\n    Safari: '10.25',\n    'Microsoft Edge': '2.62',\n    Opera: '1.56',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 16',\n    'Google Chrome': '52.68',\n    'Internet Explorer': '19.59',\n    Firefox: '16.23',\n    Safari: '8.22',\n    'Microsoft Edge': '2',\n    Opera: '1.24',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 17',\n    'Google Chrome': '52.6',\n    'Internet Explorer': '19.62',\n    Firefox: '16.38',\n    Safari: '8.12',\n    'Microsoft Edge': '1.96',\n    Opera: '1.28',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 18',\n    'Google Chrome': '52.35',\n    'Internet Explorer': '19.79',\n    Firefox: '16.39',\n    Safari: '8.12',\n    'Microsoft Edge': '1.99',\n    Opera: '1.33',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 19',\n    'Google Chrome': '52.37',\n    'Internet Explorer': '19.81',\n    Firefox: '16.46',\n    Safari: '8',\n    'Microsoft Edge': '2',\n    Opera: '1.31',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 20',\n    'Google Chrome': '52.2',\n    'Internet Explorer': '19.55',\n    Firefox: '16.74',\n    Safari: '7.96',\n    'Microsoft Edge': '2.11',\n    Opera: '1.39',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 21',\n    'Google Chrome': '52.7',\n    'Internet Explorer': '16.03',\n    Firefox: '17.04',\n    Safari: '9.83',\n    'Microsoft Edge': '2.72',\n    Opera: '1.62',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 22',\n    'Google Chrome': '52.72',\n    'Internet Explorer': '15.75',\n    Firefox: '16.9',\n    Safari: '10.36',\n    'Microsoft Edge': '2.68',\n    Opera: '1.54',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 23',\n    'Google Chrome': '52.35',\n    'Internet Explorer': '19.53',\n    Firefox: '16.53',\n    Safari: '8.21',\n    'Microsoft Edge': '2.04',\n    Opera: '1.28',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 24',\n    'Google Chrome': '52.33',\n    'Internet Explorer': '19.53',\n    Firefox: '16.75',\n    Safari: '7.96',\n    'Microsoft Edge': '2.03',\n    Opera: '1.34',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 25',\n    'Google Chrome': '52.34',\n    'Internet Explorer': '19.04',\n    Firefox: '17.02',\n    Safari: '7.82',\n    'Microsoft Edge': '2.07',\n    Opera: '1.64',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 26',\n    'Google Chrome': '53.29',\n    'Internet Explorer': '17.12',\n    Firefox: '17.42',\n    Safari: '8.12',\n    'Microsoft Edge': '2.27',\n    Opera: '1.7',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 27',\n    'Google Chrome': '52.46',\n    'Internet Explorer': '17.83',\n    Firefox: '17.12',\n    Safari: '8.58',\n    'Microsoft Edge': '2.49',\n    Opera: '1.46',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 28',\n    'Google Chrome': '52.84',\n    'Internet Explorer': '15.74',\n    Firefox: '17.03',\n    Safari: '9.7',\n    'Microsoft Edge': '2.97',\n    Opera: '1.67',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 29',\n    'Google Chrome': '52.8',\n    'Internet Explorer': '15.57',\n    Firefox: '16.72',\n    Safari: '10.32',\n    'Microsoft Edge': '2.91',\n    Opera: '1.63',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Nov 30',\n    'Google Chrome': '52.71',\n    'Internet Explorer': '19.08',\n    Firefox: '16.21',\n    Safari: '8.49',\n    'Microsoft Edge': '2.22',\n    Opera: '1.24',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 1',\n    'Google Chrome': '52.41',\n    'Internet Explorer': '19.62',\n    Firefox: '16.28',\n    Safari: '8.11',\n    'Microsoft Edge': '2.25',\n    Opera: '1.29',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 2',\n    'Google Chrome': '52.64',\n    'Internet Explorer': '19.41',\n    Firefox: '16.18',\n    Safari: '8.1',\n    'Microsoft Edge': '2.31',\n    Opera: '1.31',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 3',\n    'Google Chrome': '52.37',\n    'Internet Explorer': '19.3',\n    Firefox: '16.4',\n    Safari: '8.23',\n    'Microsoft Edge': '2.31',\n    Opera: '1.35',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 4',\n    'Google Chrome': '52.15',\n    'Internet Explorer': '19.2',\n    Firefox: '16.72',\n    Safari: '7.98',\n    'Microsoft Edge': '2.46',\n    Opera: '1.44',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 5',\n    'Google Chrome': '52.15',\n    'Internet Explorer': '15.77',\n    Firefox: '17.33',\n    Safari: '9.82',\n    'Microsoft Edge': '3.18',\n    Opera: '1.68',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 6',\n    'Google Chrome': '52.92',\n    'Internet Explorer': '15.33',\n    Firefox: '16.65',\n    Safari: '10.31',\n    'Microsoft Edge': '3.06',\n    Opera: '1.67',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 7',\n    'Google Chrome': '52.59',\n    'Internet Explorer': '19.15',\n    Firefox: '16.25',\n    Safari: '8.36',\n    'Microsoft Edge': '2.34',\n    Opera: '1.26',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 8',\n    'Google Chrome': '52.57',\n    'Internet Explorer': '19.12',\n    Firefox: '16.38',\n    Safari: '8.21',\n    'Microsoft Edge': '2.38',\n    Opera: '1.28',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 9',\n    'Google Chrome': '52.47',\n    'Internet Explorer': '19.47',\n    Firefox: '16.41',\n    Safari: '7.98',\n    'Microsoft Edge': '2.31',\n    Opera: '1.3',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 10',\n    'Google Chrome': '52.22',\n    'Internet Explorer': '20',\n    Firefox: '16.4',\n    Safari: '7.73',\n    'Microsoft Edge': '2.35',\n    Opera: '1.25',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 11',\n    'Google Chrome': '51.97',\n    'Internet Explorer': '19.54',\n    Firefox: '16.69',\n    Safari: '7.91',\n    'Microsoft Edge': '2.49',\n    Opera: '1.34',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 12',\n    'Google Chrome': '52.03',\n    'Internet Explorer': '16.49',\n    Firefox: '16.84',\n    Safari: '9.67',\n    'Microsoft Edge': '3.18',\n    Opera: '1.68',\n    Mozilla: '0.1',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 13',\n    'Google Chrome': '52.17',\n    'Internet Explorer': '16.22',\n    Firefox: '16.61',\n    Safari: '10.18',\n    'Microsoft Edge': '3.16',\n    Opera: '1.57',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 14',\n    'Google Chrome': '51.48',\n    'Internet Explorer': '20.71',\n    Firefox: '16.04',\n    Safari: '8.12',\n    'Microsoft Edge': '2.39',\n    Opera: '1.21',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 15',\n    'Google Chrome': '51.64',\n    'Internet Explorer': '20.54',\n    Firefox: '16.11',\n    Safari: '8.05',\n    'Microsoft Edge': '2.37',\n    Opera: '1.23',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 16',\n    'Google Chrome': '51.32',\n    'Internet Explorer': '21.04',\n    Firefox: '16.04',\n    Safari: '7.9',\n    'Microsoft Edge': '2.45',\n    Opera: '1.2',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 17',\n    'Google Chrome': '51.03',\n    'Internet Explorer': '21.29',\n    Firefox: '16.13',\n    Safari: '7.77',\n    'Microsoft Edge': '2.46',\n    Opera: '1.25',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 18',\n    'Google Chrome': '50.9',\n    'Internet Explorer': '20.71',\n    Firefox: '16.59',\n    Safari: '7.73',\n    'Microsoft Edge': '2.6',\n    Opera: '1.38',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 19',\n    'Google Chrome': '51.36',\n    'Internet Explorer': '17.02',\n    Firefox: '17.13',\n    Safari: '9.36',\n    'Microsoft Edge': '3.29',\n    Opera: '1.75',\n    Mozilla: '0.09',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 20',\n    'Google Chrome': '52.24',\n    'Internet Explorer': '16.39',\n    Firefox: '17.18',\n    Safari: '9.39',\n    'Microsoft Edge': '3.13',\n    Opera: '1.58',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 21',\n    'Google Chrome': '51.44',\n    'Internet Explorer': '20.62',\n    Firefox: '16.64',\n    Safari: '7.45',\n    'Microsoft Edge': '2.51',\n    Opera: '1.28',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 22',\n    'Google Chrome': '51.44',\n    'Internet Explorer': '20.64',\n    Firefox: '16.72',\n    Safari: '7.23',\n    'Microsoft Edge': '2.58',\n    Opera: '1.33',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 23',\n    'Google Chrome': '50.69',\n    'Internet Explorer': '21.15',\n    Firefox: '16.69',\n    Safari: '7.24',\n    'Microsoft Edge': '2.7',\n    Opera: '1.46',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 24',\n    'Google Chrome': '50.13',\n    'Internet Explorer': '20.14',\n    Firefox: '16.68',\n    Safari: '8',\n    'Microsoft Edge': '3.1',\n    Opera: '1.85',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.02',\n  },\n  {\n    date: '2015 Dec 25',\n    'Google Chrome': '50.55',\n    'Internet Explorer': '17.4',\n    Firefox: '16.92',\n    Safari: '9.19',\n    'Microsoft Edge': '3.73',\n    Opera: '2.1',\n    Mozilla: '0.09',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 26',\n    'Google Chrome': '50.12',\n    'Internet Explorer': '17.8',\n    Firefox: '16.92',\n    Safari: '9.44',\n    'Microsoft Edge': '3.72',\n    Opera: '1.9',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 27',\n    'Google Chrome': '50.68',\n    'Internet Explorer': '17.25',\n    Firefox: '16.89',\n    Safari: '9.55',\n    'Microsoft Edge': '3.73',\n    Opera: '1.81',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2015 Dec 28',\n    'Google Chrome': '49.89',\n    'Internet Explorer': '21.09',\n    Firefox: '16.22',\n    Safari: '8.13',\n    'Microsoft Edge': '3.21',\n    Opera: '1.39',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 29',\n    'Google Chrome': '50.27',\n    'Internet Explorer': '20.86',\n    Firefox: '16.25',\n    Safari: '7.95',\n    'Microsoft Edge': '3.22',\n    Opera: '1.37',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 30',\n    'Google Chrome': '49.85',\n    'Internet Explorer': '21.28',\n    Firefox: '16.26',\n    Safari: '7.87',\n    'Microsoft Edge': '3.29',\n    Opera: '1.37',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2015 Dec 31',\n    'Google Chrome': '49.4',\n    'Internet Explorer': '20.41',\n    Firefox: '16.43',\n    Safari: '8.52',\n    'Microsoft Edge': '3.57',\n    Opera: '1.59',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 1',\n    'Google Chrome': '50.07',\n    'Internet Explorer': '16.61',\n    Firefox: '17.36',\n    Safari: '10.09',\n    'Microsoft Edge': '4.01',\n    Opera: '1.76',\n    Mozilla: '0.09',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 2',\n    'Google Chrome': '50.72',\n    'Internet Explorer': '16.66',\n    Firefox: '17.22',\n    Safari: '9.67',\n    'Microsoft Edge': '3.91',\n    Opera: '1.74',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 3',\n    'Google Chrome': '51.23',\n    'Internet Explorer': '16.46',\n    Firefox: '16.95',\n    Safari: '9.87',\n    'Microsoft Edge': '3.75',\n    Opera: '1.67',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 4',\n    'Google Chrome': '51.26',\n    'Internet Explorer': '20.36',\n    Firefox: '16.35',\n    Safari: '7.84',\n    'Microsoft Edge': '2.85',\n    Opera: '1.29',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 5',\n    'Google Chrome': '51.32',\n    'Internet Explorer': '20.21',\n    Firefox: '16.35',\n    Safari: '7.89',\n    'Microsoft Edge': '2.79',\n    Opera: '1.36',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 6',\n    'Google Chrome': '51.81',\n    'Internet Explorer': '19.86',\n    Firefox: '16.2',\n    Safari: '7.93',\n    'Microsoft Edge': '2.76',\n    Opera: '1.38',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 7',\n    'Google Chrome': '51.85',\n    'Internet Explorer': '19.82',\n    Firefox: '16.31',\n    Safari: '7.81',\n    'Microsoft Edge': '2.76',\n    Opera: '1.4',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 8',\n    'Google Chrome': '50.99',\n    'Internet Explorer': '20.36',\n    Firefox: '16.55',\n    Safari: '7.64',\n    'Microsoft Edge': '2.9',\n    Opera: '1.49',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 9',\n    'Google Chrome': '51.5',\n    'Internet Explorer': '16.58',\n    Firefox: '17.03',\n    Safari: '9.38',\n    'Microsoft Edge': '3.57',\n    Opera: '1.86',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 10',\n    'Google Chrome': '51.88',\n    'Internet Explorer': '15.91',\n    Firefox: '17',\n    Safari: '9.79',\n    'Microsoft Edge': '3.52',\n    Opera: '1.81',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 11',\n    'Google Chrome': '51.91',\n    'Internet Explorer': '19.73',\n    Firefox: '16.3',\n    Safari: '7.93',\n    'Microsoft Edge': '2.72',\n    Opera: '1.37',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 12',\n    'Google Chrome': '51.99',\n    'Internet Explorer': '19.63',\n    Firefox: '16.35',\n    Safari: '7.84',\n    'Microsoft Edge': '2.74',\n    Opera: '1.39',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 13',\n    'Google Chrome': '52.31',\n    'Internet Explorer': '19.26',\n    Firefox: '16.25',\n    Safari: '7.95',\n    'Microsoft Edge': '2.85',\n    Opera: '1.33',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 14',\n    'Google Chrome': '52.07',\n    'Internet Explorer': '19.64',\n    Firefox: '16.1',\n    Safari: '7.95',\n    'Microsoft Edge': '2.87',\n    Opera: '1.32',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 15',\n    'Google Chrome': '52.21',\n    'Internet Explorer': '18.83',\n    Firefox: '16.42',\n    Safari: '7.98',\n    'Microsoft Edge': '3.04',\n    Opera: '1.46',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 16',\n    'Google Chrome': '52.65',\n    'Internet Explorer': '15.51',\n    Firefox: '16.86',\n    Safari: '9.5',\n    'Microsoft Edge': '3.66',\n    Opera: '1.75',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 17',\n    'Google Chrome': '52.48',\n    'Internet Explorer': '15.69',\n    Firefox: '16.61',\n    Safari: '9.84',\n    'Microsoft Edge': '3.66',\n    Opera: '1.66',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 18',\n    'Google Chrome': '52.07',\n    'Internet Explorer': '18.91',\n    Firefox: '16.31',\n    Safari: '8.36',\n    'Microsoft Edge': '3',\n    Opera: '1.3',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 19',\n    'Google Chrome': '52.51',\n    'Internet Explorer': '19.48',\n    Firefox: '16.08',\n    Safari: '7.91',\n    'Microsoft Edge': '2.72',\n    Opera: '1.25',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 20',\n    'Google Chrome': '52.82',\n    'Internet Explorer': '19.01',\n    Firefox: '16.14',\n    Safari: '7.97',\n    'Microsoft Edge': '2.76',\n    Opera: '1.25',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 21',\n    'Google Chrome': '52.76',\n    'Internet Explorer': '19.26',\n    Firefox: '16.12',\n    Safari: '7.79',\n    'Microsoft Edge': '2.74',\n    Opera: '1.3',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 22',\n    'Google Chrome': '52.56',\n    'Internet Explorer': '18.8',\n    Firefox: '16.33',\n    Safari: '7.9',\n    'Microsoft Edge': '2.95',\n    Opera: '1.4',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 23',\n    'Google Chrome': '52.38',\n    'Internet Explorer': '15.76',\n    Firefox: '16.79',\n    Safari: '9.5',\n    'Microsoft Edge': '3.78',\n    Opera: '1.72',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 24',\n    'Google Chrome': '53.12',\n    'Internet Explorer': '15.22',\n    Firefox: '16.55',\n    Safari: '9.83',\n    'Microsoft Edge': '3.57',\n    Opera: '1.65',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 25',\n    'Google Chrome': '52.55',\n    'Internet Explorer': '19.12',\n    Firefox: '16.15',\n    Safari: '7.94',\n    'Microsoft Edge': '2.89',\n    Opera: '1.32',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 26',\n    'Google Chrome': '52.45',\n    'Internet Explorer': '19.49',\n    Firefox: '16.03',\n    Safari: '7.83',\n    'Microsoft Edge': '2.87',\n    Opera: '1.28',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 27',\n    'Google Chrome': '52.64',\n    'Internet Explorer': '19.42',\n    Firefox: '16.06',\n    Safari: '7.7',\n    'Microsoft Edge': '2.84',\n    Opera: '1.29',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 28',\n    'Google Chrome': '51.95',\n    'Internet Explorer': '19.87',\n    Firefox: '16.15',\n    Safari: '7.77',\n    'Microsoft Edge': '2.92',\n    Opera: '1.32',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 29',\n    'Google Chrome': '51.03',\n    'Internet Explorer': '20',\n    Firefox: '16.6',\n    Safari: '7.85',\n    'Microsoft Edge': '3.07',\n    Opera: '1.4',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jan 30',\n    'Google Chrome': '50.97',\n    'Internet Explorer': '16.86',\n    Firefox: '17.28',\n    Safari: '9.36',\n    'Microsoft Edge': '3.71',\n    Opera: '1.76',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jan 31',\n    'Google Chrome': '52.36',\n    'Internet Explorer': '15.75',\n    Firefox: '16.71',\n    Safari: '9.85',\n    'Microsoft Edge': '3.63',\n    Opera: '1.63',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 1',\n    'Google Chrome': '52.62',\n    'Internet Explorer': '19.09',\n    Firefox: '16.1',\n    Safari: '7.98',\n    'Microsoft Edge': '2.88',\n    Opera: '1.28',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 2',\n    'Google Chrome': '52.48',\n    'Internet Explorer': '19.25',\n    Firefox: '16.25',\n    Safari: '7.83',\n    'Microsoft Edge': '2.85',\n    Opera: '1.29',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 3',\n    'Google Chrome': '52.47',\n    'Internet Explorer': '19.16',\n    Firefox: '16.16',\n    Safari: '7.94',\n    'Microsoft Edge': '2.91',\n    Opera: '1.31',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 4',\n    'Google Chrome': '51.91',\n    'Internet Explorer': '19.77',\n    Firefox: '16.12',\n    Safari: '7.83',\n    'Microsoft Edge': '3',\n    Opera: '1.31',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 5',\n    'Google Chrome': '51.76',\n    'Internet Explorer': '19.36',\n    Firefox: '16.44',\n    Safari: '7.78',\n    'Microsoft Edge': '3.15',\n    Opera: '1.44',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 6',\n    'Google Chrome': '52.11',\n    'Internet Explorer': '15.66',\n    Firefox: '16.99',\n    Safari: '9.43',\n    'Microsoft Edge': '3.96',\n    Opera: '1.78',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 7',\n    'Google Chrome': '52.41',\n    'Internet Explorer': '15.14',\n    Firefox: '17.12',\n    Safari: '9.69',\n    'Microsoft Edge': '3.81',\n    Opera: '1.77',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 8',\n    'Google Chrome': '51.83',\n    'Internet Explorer': '19.4',\n    Firefox: '15.93',\n    Safari: '8.38',\n    'Microsoft Edge': '3.13',\n    Opera: '1.27',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 9',\n    'Google Chrome': '52.01',\n    'Internet Explorer': '19.2',\n    Firefox: '16.01',\n    Safari: '8.25',\n    'Microsoft Edge': '3.09',\n    Opera: '1.37',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 10',\n    'Google Chrome': '52.92',\n    'Internet Explorer': '18.52',\n    Firefox: '15.94',\n    Safari: '8.23',\n    'Microsoft Edge': '2.93',\n    Opera: '1.41',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 11',\n    'Google Chrome': '52.71',\n    'Internet Explorer': '18.9',\n    Firefox: '16.17',\n    Safari: '7.94',\n    'Microsoft Edge': '2.88',\n    Opera: '1.35',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 12',\n    'Google Chrome': '52.37',\n    'Internet Explorer': '18.63',\n    Firefox: '16.65',\n    Safari: '7.84',\n    'Microsoft Edge': '3.01',\n    Opera: '1.45',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 13',\n    'Google Chrome': '52.73',\n    'Internet Explorer': '14.69',\n    Firefox: '17.33',\n    Safari: '9.38',\n    'Microsoft Edge': '3.92',\n    Opera: '1.87',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 14',\n    'Google Chrome': '52.73',\n    'Internet Explorer': '14.91',\n    Firefox: '17.06',\n    Safari: '9.67',\n    'Microsoft Edge': '3.85',\n    Opera: '1.71',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 15',\n    'Google Chrome': '52.68',\n    'Internet Explorer': '17.65',\n    Firefox: '16.58',\n    Safari: '8.54',\n    'Microsoft Edge': '3.2',\n    Opera: '1.31',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 16',\n    'Google Chrome': '53.18',\n    'Internet Explorer': '18.24',\n    Firefox: '16.32',\n    Safari: '7.98',\n    'Microsoft Edge': '2.93',\n    Opera: '1.3',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 17',\n    'Google Chrome': '52.8',\n    'Internet Explorer': '18.68',\n    Firefox: '16.37',\n    Safari: '7.83',\n    'Microsoft Edge': '2.97',\n    Opera: '1.3',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 18',\n    'Google Chrome': '52.85',\n    'Internet Explorer': '18.74',\n    Firefox: '16.32',\n    Safari: '7.74',\n    'Microsoft Edge': '2.93',\n    Opera: '1.37',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 19',\n    'Google Chrome': '52.5',\n    'Internet Explorer': '18.49',\n    Firefox: '16.7',\n    Safari: '7.75',\n    'Microsoft Edge': '3.08',\n    Opera: '1.43',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 20',\n    'Google Chrome': '52.15',\n    'Internet Explorer': '15.14',\n    Firefox: '17.4',\n    Safari: '9.45',\n    'Microsoft Edge': '3.89',\n    Opera: '1.9',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 21',\n    'Google Chrome': '52.1',\n    'Internet Explorer': '14.95',\n    Firefox: '17.14',\n    Safari: '10.17',\n    'Microsoft Edge': '3.9',\n    Opera: '1.66',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 22',\n    'Google Chrome': '52.35',\n    'Internet Explorer': '18.91',\n    Firefox: '16.41',\n    Safari: '8.05',\n    'Microsoft Edge': '2.97',\n    Opera: '1.25',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 23',\n    'Google Chrome': '52',\n    'Internet Explorer': '19.19',\n    Firefox: '16.48',\n    Safari: '8.07',\n    'Microsoft Edge': '2.97',\n    Opera: '1.25',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 24',\n    'Google Chrome': '52.27',\n    'Internet Explorer': '18.8',\n    Firefox: '16.71',\n    Safari: '7.93',\n    'Microsoft Edge': '2.96',\n    Opera: '1.28',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 25',\n    'Google Chrome': '52.2',\n    'Internet Explorer': '18.84',\n    Firefox: '16.71',\n    Safari: '7.91',\n    'Microsoft Edge': '2.98',\n    Opera: '1.31',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 26',\n    'Google Chrome': '52.28',\n    'Internet Explorer': '18.37',\n    Firefox: '16.95',\n    Safari: '7.86',\n    'Microsoft Edge': '3.09',\n    Opera: '1.39',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 27',\n    'Google Chrome': '52.63',\n    'Internet Explorer': '14.89',\n    Firefox: '17.29',\n    Safari: '9.44',\n    'Microsoft Edge': '3.9',\n    Opera: '1.77',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Feb 28',\n    'Google Chrome': '52.74',\n    'Internet Explorer': '14.98',\n    Firefox: '16.83',\n    Safari: '9.89',\n    'Microsoft Edge': '3.85',\n    Opera: '1.64',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Feb 29',\n    'Google Chrome': '53.2',\n    'Internet Explorer': '18.53',\n    Firefox: '16.18',\n    Safari: '7.88',\n    'Microsoft Edge': '3',\n    Opera: '1.17',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 1',\n    'Google Chrome': '53.27',\n    'Internet Explorer': '18.36',\n    Firefox: '16.23',\n    Safari: '7.99',\n    'Microsoft Edge': '2.92',\n    Opera: '1.18',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 2',\n    'Google Chrome': '53.37',\n    'Internet Explorer': '18.14',\n    Firefox: '16.21',\n    Safari: '8.14',\n    'Microsoft Edge': '2.89',\n    Opera: '1.19',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 3',\n    'Google Chrome': '53.03',\n    'Internet Explorer': '18.51',\n    Firefox: '16.26',\n    Safari: '7.98',\n    'Microsoft Edge': '2.97',\n    Opera: '1.22',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 4',\n    'Google Chrome': '52.47',\n    'Internet Explorer': '18.63',\n    Firefox: '16.48',\n    Safari: '7.92',\n    'Microsoft Edge': '3.13',\n    Opera: '1.32',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 5',\n    'Google Chrome': '52.43',\n    'Internet Explorer': '14.9',\n    Firefox: '17.03',\n    Safari: '9.82',\n    'Microsoft Edge': '4.04',\n    Opera: '1.72',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Mar 6',\n    'Google Chrome': '52.86',\n    'Internet Explorer': '14.56',\n    Firefox: '16.85',\n    Safari: '10.1',\n    'Microsoft Edge': '3.95',\n    Opera: '1.63',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 7',\n    'Google Chrome': '52.59',\n    'Internet Explorer': '18.9',\n    Firefox: '16.25',\n    Safari: '7.99',\n    'Microsoft Edge': '3.01',\n    Opera: '1.22',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 8',\n    'Google Chrome': '52.75',\n    'Internet Explorer': '18.59',\n    Firefox: '16.36',\n    Safari: '7.99',\n    'Microsoft Edge': '3.01',\n    Opera: '1.24',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 9',\n    'Google Chrome': '53.16',\n    'Internet Explorer': '18.21',\n    Firefox: '16.39',\n    Safari: '7.89',\n    'Microsoft Edge': '3.05',\n    Opera: '1.26',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 10',\n    'Google Chrome': '52.99',\n    'Internet Explorer': '18.49',\n    Firefox: '16.45',\n    Safari: '7.7',\n    'Microsoft Edge': '3.04',\n    Opera: '1.28',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 11',\n    'Google Chrome': '52.42',\n    'Internet Explorer': '18.46',\n    Firefox: '16.68',\n    Safari: '7.81',\n    'Microsoft Edge': '3.22',\n    Opera: '1.36',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 12',\n    'Google Chrome': '51.86',\n    'Internet Explorer': '15.55',\n    Firefox: '17.13',\n    Safari: '9.46',\n    'Microsoft Edge': '4.16',\n    Opera: '1.78',\n    Mozilla: '0.06',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Mar 13',\n    'Google Chrome': '51.95',\n    'Internet Explorer': '15.09',\n    Firefox: '17.03',\n    Safari: '10.04',\n    'Microsoft Edge': '4.17',\n    Opera: '1.66',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 14',\n    'Google Chrome': '51.94',\n    'Internet Explorer': '19.4',\n    Firefox: '16.23',\n    Safari: '8.01',\n    'Microsoft Edge': '3.16',\n    Opera: '1.21',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 15',\n    'Google Chrome': '52.49',\n    'Internet Explorer': '18.73',\n    Firefox: '16.42',\n    Safari: '7.96',\n    'Microsoft Edge': '3.11',\n    Opera: '1.23',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Mar 16',\n    'Google Chrome': '52.41',\n    'Internet Explorer': '18.66',\n    Firefox: '16.61',\n    Safari: '7.85',\n    'Microsoft Edge': '3.17',\n    Opera: '1.26',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 17',\n    'Google Chrome': '52.26',\n    'Internet Explorer': '19.15',\n    Firefox: '16.53',\n    Safari: '7.58',\n    'Microsoft Edge': '3.15',\n    Opera: '1.29',\n    Mozilla: '0.04',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Mar 18',\n    'Google Chrome': '51.98',\n    'Internet Explorer': '18.86',\n    Firefox: '16.76',\n    Safari: '7.69',\n    'Microsoft Edge': '3.3',\n    Opera: '1.37',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 19',\n    'Google Chrome': '51.89',\n    'Internet Explorer': '15.61',\n    Firefox: '17',\n    Safari: '9.39',\n    'Microsoft Edge': '4.21',\n    Opera: '1.79',\n    Mozilla: '0.11',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Mar 20',\n    'Google Chrome': '51.86',\n    'Internet Explorer': '15.29',\n    Firefox: '16.87',\n    Safari: '9.91',\n    'Microsoft Edge': '4.27',\n    Opera: '1.71',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Mar 21',\n    'Google Chrome': '52.74',\n    'Internet Explorer': '18.37',\n    Firefox: '16.28',\n    Safari: '7.99',\n    'Microsoft Edge': '3.22',\n    Opera: '1.35',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 22',\n    'Google Chrome': '52.93',\n    'Internet Explorer': '18.46',\n    Firefox: '16.22',\n    Safari: '7.76',\n    'Microsoft Edge': '3.12',\n    Opera: '1.45',\n    Mozilla: '0.05',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Mar 23',\n    'Google Chrome': '52.65',\n    'Internet Explorer': '18.47',\n    Firefox: '16.28',\n    Safari: '7.76',\n    'Microsoft Edge': '3.22',\n    Opera: '1.58',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 24',\n    'Google Chrome': '52.53',\n    'Internet Explorer': '18.25',\n    Firefox: '16.21',\n    Safari: '8.03',\n    'Microsoft Edge': '3.36',\n    Opera: '1.58',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 25',\n    'Google Chrome': '52.15',\n    'Internet Explorer': '16.95',\n    Firefox: '16.75',\n    Safari: '8.7',\n    'Microsoft Edge': '3.76',\n    Opera: '1.64',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 26',\n    'Google Chrome': '52.24',\n    'Internet Explorer': '15.04',\n    Firefox: '17.07',\n    Safari: '9.52',\n    'Microsoft Edge': '4.23',\n    Opera: '1.85',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 27',\n    'Google Chrome': '52.56',\n    'Internet Explorer': '14.27',\n    Firefox: '16.98',\n    Safari: '10.11',\n    'Microsoft Edge': '4.26',\n    Opera: '1.78',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 28',\n    'Google Chrome': '53.31',\n    'Internet Explorer': '17.05',\n    Firefox: '16.2',\n    Safari: '8.49',\n    'Microsoft Edge': '3.48',\n    Opera: '1.43',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 29',\n    'Google Chrome': '52.98',\n    'Internet Explorer': '17.82',\n    Firefox: '16.37',\n    Safari: '8.09',\n    'Microsoft Edge': '3.23',\n    Opera: '1.48',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 30',\n    'Google Chrome': '53.07',\n    'Internet Explorer': '17.84',\n    Firefox: '16.37',\n    Safari: '7.96',\n    'Microsoft Edge': '3.27',\n    Opera: '1.45',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Mar 31',\n    'Google Chrome': '53.4',\n    'Internet Explorer': '17.73',\n    Firefox: '16.24',\n    Safari: '7.84',\n    'Microsoft Edge': '3.3',\n    Opera: '1.43',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 1',\n    'Google Chrome': '52.72',\n    'Internet Explorer': '18.26',\n    Firefox: '16.4',\n    Safari: '7.72',\n    'Microsoft Edge': '3.4',\n    Opera: '1.47',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 2',\n    'Google Chrome': '52.99',\n    'Internet Explorer': '14.44',\n    Firefox: '16.96',\n    Safari: '9.33',\n    'Microsoft Edge': '4.35',\n    Opera: '1.87',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 3',\n    'Google Chrome': '53.29',\n    'Internet Explorer': '14.13',\n    Firefox: '16.7',\n    Safari: '9.8',\n    'Microsoft Edge': '4.2',\n    Opera: '1.82',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 4',\n    'Google Chrome': '53.65',\n    'Internet Explorer': '17.74',\n    Firefox: '16.06',\n    Safari: '7.79',\n    'Microsoft Edge': '3.22',\n    Opera: '1.5',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 5',\n    'Google Chrome': '53.21',\n    'Internet Explorer': '18.25',\n    Firefox: '16.05',\n    Safari: '7.71',\n    'Microsoft Edge': '3.21',\n    Opera: '1.54',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 6',\n    'Google Chrome': '53.29',\n    'Internet Explorer': '18.24',\n    Firefox: '16.02',\n    Safari: '7.52',\n    'Microsoft Edge': '3.28',\n    Opera: '1.6',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 7',\n    'Google Chrome': '52.77',\n    'Internet Explorer': '18.33',\n    Firefox: '16.26',\n    Safari: '7.56',\n    'Microsoft Edge': '3.35',\n    Opera: '1.69',\n    Mozilla: '0.03',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 8',\n    'Google Chrome': '52.41',\n    'Internet Explorer': '18.15',\n    Firefox: '16.82',\n    Safari: '7.65',\n    'Microsoft Edge': '3.5',\n    Opera: '1.42',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 9',\n    'Google Chrome': '52.03',\n    'Internet Explorer': '15.11',\n    Firefox: '17.19',\n    Safari: '9.37',\n    'Microsoft Edge': '4.48',\n    Opera: '1.77',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 10',\n    'Google Chrome': '52.62',\n    'Internet Explorer': '14.85',\n    Firefox: '16.78',\n    Safari: '9.63',\n    'Microsoft Edge': '4.42',\n    Opera: '1.66',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 11',\n    'Google Chrome': '52.54',\n    'Internet Explorer': '18.79',\n    Firefox: '16.17',\n    Safari: '7.73',\n    'Microsoft Edge': '3.37',\n    Opera: '1.34',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 12',\n    'Google Chrome': '53.2',\n    'Internet Explorer': '18.04',\n    Firefox: '16.1',\n    Safari: '7.61',\n    'Microsoft Edge': '3.34',\n    Opera: '1.65',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 13',\n    'Google Chrome': '53.01',\n    'Internet Explorer': '17.89',\n    Firefox: '16.22',\n    Safari: '7.67',\n    'Microsoft Edge': '3.39',\n    Opera: '1.72',\n    Mozilla: '0.1',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 14',\n    'Google Chrome': '53.2',\n    'Internet Explorer': '18.06',\n    Firefox: '16.08',\n    Safari: '7.53',\n    'Microsoft Edge': '3.3',\n    Opera: '1.68',\n    Mozilla: '0.15',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 15',\n    'Google Chrome': '52.96',\n    'Internet Explorer': '17.82',\n    Firefox: '16.32',\n    Safari: '7.52',\n    'Microsoft Edge': '3.46',\n    Opera: '1.81',\n    Mozilla: '0.12',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 16',\n    'Google Chrome': '52.52',\n    'Internet Explorer': '14.52',\n    Firefox: '17.23',\n    Safari: '9.32',\n    'Microsoft Edge': '4.47',\n    Opera: '1.81',\n    Mozilla: '0.13',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 17',\n    'Google Chrome': '52.71',\n    'Internet Explorer': '14.25',\n    Firefox: '16.94',\n    Safari: '9.9',\n    'Microsoft Edge': '4.4',\n    Opera: '1.7',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 18',\n    'Google Chrome': '53.22',\n    'Internet Explorer': '17.85',\n    Firefox: '16.08',\n    Safari: '7.79',\n    'Microsoft Edge': '3.33',\n    Opera: '1.66',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 19',\n    'Google Chrome': '53.51',\n    'Internet Explorer': '17.76',\n    Firefox: '16.19',\n    Safari: '7.77',\n    'Microsoft Edge': '3.27',\n    Opera: '1.43',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 20',\n    'Google Chrome': '53.62',\n    'Internet Explorer': '17.44',\n    Firefox: '16.12',\n    Safari: '7.81',\n    'Microsoft Edge': '3.36',\n    Opera: '1.57',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 21',\n    'Google Chrome': '53.4',\n    'Internet Explorer': '17.94',\n    Firefox: '15.94',\n    Safari: '7.59',\n    'Microsoft Edge': '3.47',\n    Opera: '1.6',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 22',\n    'Google Chrome': '52.62',\n    'Internet Explorer': '18.57',\n    Firefox: '16.13',\n    Safari: '7.55',\n    'Microsoft Edge': '3.61',\n    Opera: '1.46',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 23',\n    'Google Chrome': '52.42',\n    'Internet Explorer': '14.46',\n    Firefox: '17.12',\n    Safari: '9.44',\n    'Microsoft Edge': '4.72',\n    Opera: '1.75',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 24',\n    'Google Chrome': '53.43',\n    'Internet Explorer': '13.62',\n    Firefox: '16.79',\n    Safari: '9.84',\n    'Microsoft Edge': '4.59',\n    Opera: '1.66',\n    Mozilla: '0.07',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Apr 25',\n    'Google Chrome': '53.48',\n    'Internet Explorer': '17.72',\n    Firefox: '15.98',\n    Safari: '7.79',\n    'Microsoft Edge': '3.46',\n    Opera: '1.5',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 26',\n    'Google Chrome': '53.5',\n    'Internet Explorer': '17.81',\n    Firefox: '16.13',\n    Safari: '7.73',\n    'Microsoft Edge': '3.4',\n    Opera: '1.36',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 27',\n    'Google Chrome': '53.68',\n    'Internet Explorer': '17.4',\n    Firefox: '16.39',\n    Safari: '7.76',\n    'Microsoft Edge': '3.45',\n    Opera: '1.24',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 28',\n    'Google Chrome': '53.08',\n    'Internet Explorer': '18.16',\n    Firefox: '16.31',\n    Safari: '7.68',\n    'Microsoft Edge': '3.49',\n    Opera: '1.21',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Apr 29',\n    'Google Chrome': '53.09',\n    'Internet Explorer': '17.74',\n    Firefox: '16.65',\n    Safari: '7.59',\n    'Microsoft Edge': '3.56',\n    Opera: '1.28',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Apr 30',\n    'Google Chrome': '53.1',\n    'Internet Explorer': '14.09',\n    Firefox: '16.82',\n    Safari: '9.4',\n    'Microsoft Edge': '4.86',\n    Opera: '1.65',\n    Mozilla: '0.1',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 1',\n    'Google Chrome': '52.76',\n    'Internet Explorer': '13.89',\n    Firefox: '16.72',\n    Safari: '10.07',\n    'Microsoft Edge': '4.88',\n    Opera: '1.58',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 May 2',\n    'Google Chrome': '53.44',\n    'Internet Explorer': '17.2',\n    Firefox: '16.17',\n    Safari: '8.2',\n    'Microsoft Edge': '3.67',\n    Opera: '1.21',\n    Mozilla: '0.1',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 3',\n    'Google Chrome': '52.97',\n    'Internet Explorer': '17.96',\n    Firefox: '16.21',\n    Safari: '7.85',\n    'Microsoft Edge': '3.52',\n    Opera: '1.41',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 4',\n    'Google Chrome': '53.55',\n    'Internet Explorer': '17.62',\n    Firefox: '16.01',\n    Safari: '7.62',\n    'Microsoft Edge': '3.57',\n    Opera: '1.54',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 5',\n    'Google Chrome': '53.76',\n    'Internet Explorer': '17.45',\n    Firefox: '15.92',\n    Safari: '7.6',\n    'Microsoft Edge': '3.63',\n    Opera: '1.57',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 6',\n    'Google Chrome': '52.97',\n    'Internet Explorer': '17.61',\n    Firefox: '16.28',\n    Safari: '7.72',\n    'Microsoft Edge': '3.78',\n    Opera: '1.55',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 7',\n    'Google Chrome': '51.82',\n    'Internet Explorer': '14.56',\n    Firefox: '17.28',\n    Safari: '9.66',\n    'Microsoft Edge': '4.86',\n    Opera: '1.72',\n    Mozilla: '0.1',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 8',\n    'Google Chrome': '52.46',\n    'Internet Explorer': '14.09',\n    Firefox: '17.17',\n    Safari: '9.79',\n    'Microsoft Edge': '4.69',\n    Opera: '1.71',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 9',\n    'Google Chrome': '53.05',\n    'Internet Explorer': '18.2',\n    Firefox: '16.1',\n    Safari: '7.92',\n    'Microsoft Edge': '3.58',\n    Opera: '1.08',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 10',\n    'Google Chrome': '52.83',\n    'Internet Explorer': '18.34',\n    Firefox: '16.14',\n    Safari: '7.77',\n    'Microsoft Edge': '3.62',\n    Opera: '1.24',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 11',\n    'Google Chrome': '53.18',\n    'Internet Explorer': '17.93',\n    Firefox: '16.28',\n    Safari: '7.67',\n    'Microsoft Edge': '3.6',\n    Opera: '1.26',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 12',\n    'Google Chrome': '52.5',\n    'Internet Explorer': '18.46',\n    Firefox: '16.41',\n    Safari: '7.53',\n    'Microsoft Edge': '3.63',\n    Opera: '1.4',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 13',\n    'Google Chrome': '51.81',\n    'Internet Explorer': '18.58',\n    Firefox: '16.66',\n    Safari: '7.6',\n    'Microsoft Edge': '3.77',\n    Opera: '1.48',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 14',\n    'Google Chrome': '50.29',\n    'Internet Explorer': '15.33',\n    Firefox: '17.99',\n    Safari: '9.42',\n    'Microsoft Edge': '4.96',\n    Opera: '1.91',\n    Mozilla: '0.1',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 15',\n    'Google Chrome': '51.36',\n    'Internet Explorer': '14.55',\n    Firefox: '17.56',\n    Safari: '9.66',\n    'Microsoft Edge': '4.91',\n    Opera: '1.87',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 16',\n    'Google Chrome': '52.3',\n    'Internet Explorer': '18.24',\n    Firefox: '16.41',\n    Safari: '7.76',\n    'Microsoft Edge': '3.73',\n    Opera: '1.49',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 17',\n    'Google Chrome': '52.05',\n    'Internet Explorer': '18.88',\n    Firefox: '16.42',\n    Safari: '7.64',\n    'Microsoft Edge': '3.57',\n    Opera: '1.37',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 18',\n    'Google Chrome': '51.99',\n    'Internet Explorer': '18.87',\n    Firefox: '16.43',\n    Safari: '7.76',\n    'Microsoft Edge': '3.64',\n    Opera: '1.24',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 19',\n    'Google Chrome': '51.67',\n    'Internet Explorer': '19.25',\n    Firefox: '16.18',\n    Safari: '7.96',\n    'Microsoft Edge': '3.77',\n    Opera: '1.1',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 20',\n    'Google Chrome': '51.75',\n    'Internet Explorer': '18.51',\n    Firefox: '16.52',\n    Safari: '7.88',\n    'Microsoft Edge': '4.09',\n    Opera: '1.19',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 21',\n    'Google Chrome': '51.83',\n    'Internet Explorer': '14.13',\n    Firefox: '17.6',\n    Safari: '9.54',\n    'Microsoft Edge': '5.19',\n    Opera: '1.62',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 22',\n    'Google Chrome': '52.46',\n    'Internet Explorer': '13.53',\n    Firefox: '17.44',\n    Safari: '9.82',\n    'Microsoft Edge': '5.07',\n    Opera: '1.61',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 23',\n    'Google Chrome': '52.6',\n    'Internet Explorer': '18.04',\n    Firefox: '16.37',\n    Safari: '7.69',\n    'Microsoft Edge': '3.95',\n    Opera: '1.3',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 24',\n    'Google Chrome': '52.83',\n    'Internet Explorer': '17.85',\n    Firefox: '16.46',\n    Safari: '7.58',\n    'Microsoft Edge': '3.91',\n    Opera: '1.32',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 25',\n    'Google Chrome': '53.16',\n    'Internet Explorer': '17.45',\n    Firefox: '16.35',\n    Safari: '7.6',\n    'Microsoft Edge': '3.99',\n    Opera: '1.39',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 26',\n    'Google Chrome': '52.81',\n    'Internet Explorer': '17.8',\n    Firefox: '16.38',\n    Safari: '7.67',\n    'Microsoft Edge': '3.95',\n    Opera: '1.33',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 27',\n    'Google Chrome': '52.54',\n    'Internet Explorer': '17.27',\n    Firefox: '16.86',\n    Safari: '7.73',\n    'Microsoft Edge': '4.17',\n    Opera: '1.35',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 28',\n    'Google Chrome': '52.58',\n    'Internet Explorer': '13.24',\n    Firefox: '17.76',\n    Safari: '9.27',\n    'Microsoft Edge': '5.33',\n    Opera: '1.74',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 29',\n    'Google Chrome': '52.85',\n    'Internet Explorer': '12.95',\n    Firefox: '17.78',\n    Safari: '9.34',\n    'Microsoft Edge': '5.29',\n    Opera: '1.72',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 30',\n    'Google Chrome': '52.89',\n    'Internet Explorer': '14.39',\n    Firefox: '17.67',\n    Safari: '8.53',\n    'Microsoft Edge': '4.86',\n    Opera: '1.59',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 May 31',\n    'Google Chrome': '53.61',\n    'Internet Explorer': '17.15',\n    Firefox: '16.08',\n    Safari: '7.6',\n    'Microsoft Edge': '4.13',\n    Opera: '1.37',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 1',\n    'Google Chrome': '53.58',\n    'Internet Explorer': '16.65',\n    Firefox: '16.01',\n    Safari: '7.99',\n    'Microsoft Edge': '4.29',\n    Opera: '1.42',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 2',\n    'Google Chrome': '52.76',\n    'Internet Explorer': '17.4',\n    Firefox: '16.35',\n    Safari: '7.81',\n    'Microsoft Edge': '4.29',\n    Opera: '1.33',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 3',\n    'Google Chrome': '52.44',\n    'Internet Explorer': '16.96',\n    Firefox: '16.52',\n    Safari: '7.71',\n    'Microsoft Edge': '4.6',\n    Opera: '1.69',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 4',\n    'Google Chrome': '52.33',\n    'Internet Explorer': '12.93',\n    Firefox: '17.3',\n    Safari: '9.52',\n    'Microsoft Edge': '5.88',\n    Opera: '1.96',\n    Mozilla: '0.08',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 5',\n    'Google Chrome': '52.38',\n    'Internet Explorer': '12.56',\n    Firefox: '17.42',\n    Safari: '9.66',\n    'Microsoft Edge': '5.76',\n    Opera: '2.14',\n    Mozilla: '0.08',\n    'Other/Unknown': '0.01',\n  },\n  {\n    date: '2016 Jun 6',\n    'Google Chrome': '52.69',\n    'Internet Explorer': '17.32',\n    Firefox: '16.31',\n    Safari: '7.43',\n    'Microsoft Edge': '4.18',\n    Opera: '2.01',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 7',\n    'Google Chrome': '52.95',\n    'Internet Explorer': '17.47',\n    Firefox: '16.28',\n    Safari: '7.65',\n    'Microsoft Edge': '4.05',\n    Opera: '1.55',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 8',\n    'Google Chrome': '52.68',\n    'Internet Explorer': '17.66',\n    Firefox: '16.3',\n    Safari: '7.6',\n    'Microsoft Edge': '4.14',\n    Opera: '1.56',\n    Mozilla: '0.06',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 9',\n    'Google Chrome': '52.3',\n    'Internet Explorer': '18.02',\n    Firefox: '16.25',\n    Safari: '7.85',\n    'Microsoft Edge': '4.14',\n    Opera: '1.38',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 10',\n    'Google Chrome': '52.22',\n    'Internet Explorer': '17.36',\n    Firefox: '16.46',\n    Safari: '7.96',\n    'Microsoft Edge': '4.44',\n    Opera: '1.49',\n    Mozilla: '0.07',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 11',\n    'Google Chrome': '52.06',\n    'Internet Explorer': '13.19',\n    Firefox: '17.21',\n    Safari: '9.98',\n    'Microsoft Edge': '5.78',\n    Opera: '1.69',\n    Mozilla: '0.09',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 12',\n    'Google Chrome': '52.09',\n    'Internet Explorer': '12.75',\n    Firefox: '16.89',\n    Safari: '10.65',\n    'Microsoft Edge': '5.96',\n    Opera: '1.6',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 13',\n    'Google Chrome': '53.18',\n    'Internet Explorer': '16.87',\n    Firefox: '16.21',\n    Safari: '8.15',\n    'Microsoft Edge': '4.39',\n    Opera: '1.15',\n    Mozilla: '0.05',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 14',\n    'Google Chrome': '53.45',\n    'Internet Explorer': '17.03',\n    Firefox: '16.15',\n    Safari: '7.8',\n    'Microsoft Edge': '4.31',\n    Opera: '1.21',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n  {\n    date: '2016 Jun 15',\n    'Google Chrome': '53.4',\n    'Internet Explorer': '18.12',\n    Firefox: '16.51',\n    Safari: '6.69',\n    'Microsoft Edge': '3.84',\n    Opera: '1.4',\n    Mozilla: '0.04',\n    'Other/Unknown': '0',\n  },\n];\n\nexport default browserUsage;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/cityTemperature.ts",
    "content": "export interface CityTemperature {\n  date: string;\n  'New York': string;\n  'San Francisco': string;\n  Austin: string;\n}\n\nconst cityTemperature: CityTemperature[] = [\n  {\n    date: '2011-10-01',\n    'New York': '63.4',\n    'San Francisco': '62.7',\n    Austin: '72.2',\n  },\n  {\n    date: '2011-10-02',\n    'New York': '58.0',\n    'San Francisco': '59.9',\n    Austin: '67.7',\n  },\n  {\n    date: '2011-10-03',\n    'New York': '53.3',\n    'San Francisco': '59.1',\n    Austin: '69.4',\n  },\n  {\n    date: '2011-10-04',\n    'New York': '55.7',\n    'San Francisco': '58.8',\n    Austin: '68.0',\n  },\n  {\n    date: '2011-10-05',\n    'New York': '64.2',\n    'San Francisco': '58.7',\n    Austin: '72.4',\n  },\n  {\n    date: '2011-10-06',\n    'New York': '58.8',\n    'San Francisco': '57.0',\n    Austin: '77.0',\n  },\n  {\n    date: '2011-10-07',\n    'New York': '57.9',\n    'San Francisco': '56.7',\n    Austin: '82.3',\n  },\n  {\n    date: '2011-10-08',\n    'New York': '61.8',\n    'San Francisco': '56.8',\n    Austin: '78.9',\n  },\n  {\n    date: '2011-10-09',\n    'New York': '69.3',\n    'San Francisco': '56.7',\n    Austin: '68.8',\n  },\n  {\n    date: '2011-10-10',\n    'New York': '71.2',\n    'San Francisco': '60.1',\n    Austin: '68.7',\n  },\n  {\n    date: '2011-10-11',\n    'New York': '68.7',\n    'San Francisco': '61.1',\n    Austin: '70.3',\n  },\n  {\n    date: '2011-10-12',\n    'New York': '61.8',\n    'San Francisco': '61.5',\n    Austin: '75.3',\n  },\n  {\n    date: '2011-10-13',\n    'New York': '63.0',\n    'San Francisco': '64.3',\n    Austin: '76.6',\n  },\n  {\n    date: '2011-10-14',\n    'New York': '66.9',\n    'San Francisco': '67.1',\n    Austin: '66.6',\n  },\n  {\n    date: '2011-10-15',\n    'New York': '61.7',\n    'San Francisco': '64.6',\n    Austin: '68.0',\n  },\n  {\n    date: '2011-10-16',\n    'New York': '61.8',\n    'San Francisco': '61.6',\n    Austin: '70.6',\n  },\n  {\n    date: '2011-10-17',\n    'New York': '62.8',\n    'San Francisco': '61.1',\n    Austin: '71.1',\n  },\n  {\n    date: '2011-10-18',\n    'New York': '60.8',\n    'San Francisco': '59.2',\n    Austin: '70.0',\n  },\n  {\n    date: '2011-10-19',\n    'New York': '62.1',\n    'San Francisco': '58.9',\n    Austin: '61.6',\n  },\n  {\n    date: '2011-10-20',\n    'New York': '65.1',\n    'San Francisco': '57.2',\n    Austin: '57.4',\n  },\n  {\n    date: '2011-10-21',\n    'New York': '55.6',\n    'San Francisco': '56.4',\n    Austin: '64.3',\n  },\n  {\n    date: '2011-10-22',\n    'New York': '54.4',\n    'San Francisco': '60.7',\n    Austin: '72.4',\n  },\n  {\n    date: '2011-10-23',\n    'New York': '54.4',\n    'San Francisco': '65.1',\n    Austin: '72.4',\n  },\n  {\n    date: '2011-10-24',\n    'New York': '54.8',\n    'San Francisco': '60.9',\n    Austin: '72.5',\n  },\n  {\n    date: '2011-10-25',\n    'New York': '57.9',\n    'San Francisco': '56.1',\n    Austin: '72.7',\n  },\n  {\n    date: '2011-10-26',\n    'New York': '54.6',\n    'San Francisco': '54.6',\n    Austin: '73.4',\n  },\n  {\n    date: '2011-10-27',\n    'New York': '54.4',\n    'San Francisco': '56.1',\n    Austin: '70.7',\n  },\n  {\n    date: '2011-10-28',\n    'New York': '42.5',\n    'San Francisco': '58.1',\n    Austin: '56.8',\n  },\n  {\n    date: '2011-10-29',\n    'New York': '40.9',\n    'San Francisco': '57.5',\n    Austin: '51.0',\n  },\n  {\n    date: '2011-10-30',\n    'New York': '38.6',\n    'San Francisco': '57.7',\n    Austin: '54.9',\n  },\n  {\n    date: '2011-10-31',\n    'New York': '44.2',\n    'San Francisco': '55.1',\n    Austin: '58.8',\n  },\n  {\n    date: '2011-11-01',\n    'New York': '49.6',\n    'San Francisco': '57.9',\n    Austin: '62.6',\n  },\n  {\n    date: '2011-11-02',\n    'New York': '47.2',\n    'San Francisco': '64.6',\n    Austin: '71.0',\n  },\n  {\n    date: '2011-11-03',\n    'New York': '50.1',\n    'San Francisco': '56.2',\n    Austin: '58.4',\n  },\n  {\n    date: '2011-11-04',\n    'New York': '50.1',\n    'San Francisco': '50.5',\n    Austin: '45.1',\n  },\n  {\n    date: '2011-11-05',\n    'New York': '43.5',\n    'San Francisco': '51.3',\n    Austin: '52.2',\n  },\n  {\n    date: '2011-11-06',\n    'New York': '43.8',\n    'San Francisco': '52.6',\n    Austin: '73.0',\n  },\n  {\n    date: '2011-11-07',\n    'New York': '48.9',\n    'San Francisco': '51.4',\n    Austin: '75.4',\n  },\n  {\n    date: '2011-11-08',\n    'New York': '55.5',\n    'San Francisco': '50.6',\n    Austin: '72.1',\n  },\n  {\n    date: '2011-11-09',\n    'New York': '53.7',\n    'San Francisco': '54.6',\n    Austin: '56.6',\n  },\n  {\n    date: '2011-11-10',\n    'New York': '57.7',\n    'San Francisco': '55.6',\n    Austin: '55.4',\n  },\n  {\n    date: '2011-11-11',\n    'New York': '48.5',\n    'San Francisco': '53.9',\n    Austin: '46.7',\n  },\n  {\n    date: '2011-11-12',\n    'New York': '46.8',\n    'San Francisco': '54.0',\n    Austin: '62.0',\n  },\n  {\n    date: '2011-11-13',\n    'New York': '51.1',\n    'San Francisco': '53.8',\n    Austin: '71.6',\n  },\n  {\n    date: '2011-11-14',\n    'New York': '56.8',\n    'San Francisco': '53.5',\n    Austin: '75.5',\n  },\n  {\n    date: '2011-11-15',\n    'New York': '59.7',\n    'San Francisco': '53.4',\n    Austin: '72.1',\n  },\n  {\n    date: '2011-11-16',\n    'New York': '56.5',\n    'San Francisco': '52.2',\n    Austin: '65.7',\n  },\n  {\n    date: '2011-11-17',\n    'New York': '49.6',\n    'San Francisco': '52.7',\n    Austin: '56.8',\n  },\n  {\n    date: '2011-11-18',\n    'New York': '41.5',\n    'San Francisco': '53.1',\n    Austin: '49.9',\n  },\n  {\n    date: '2011-11-19',\n    'New York': '44.3',\n    'San Francisco': '49.0',\n    Austin: '71.7',\n  },\n  {\n    date: '2011-11-20',\n    'New York': '54.0',\n    'San Francisco': '50.4',\n    Austin: '77.7',\n  },\n  {\n    date: '2011-11-21',\n    'New York': '54.1',\n    'San Francisco': '51.1',\n    Austin: '76.4',\n  },\n  {\n    date: '2011-11-22',\n    'New York': '49.4',\n    'San Francisco': '52.3',\n    Austin: '68.8',\n  },\n  {\n    date: '2011-11-23',\n    'New York': '50.0',\n    'San Francisco': '54.6',\n    Austin: '57.0',\n  },\n  {\n    date: '2011-11-24',\n    'New York': '44.0',\n    'San Francisco': '55.1',\n    Austin: '55.5',\n  },\n  {\n    date: '2011-11-25',\n    'New York': '50.3',\n    'San Francisco': '51.5',\n    Austin: '61.6',\n  },\n  {\n    date: '2011-11-26',\n    'New York': '52.1',\n    'San Francisco': '53.6',\n    Austin: '64.1',\n  },\n  {\n    date: '2011-11-27',\n    'New York': '49.6',\n    'San Francisco': '52.3',\n    Austin: '51.1',\n  },\n  {\n    date: '2011-11-28',\n    'New York': '57.2',\n    'San Francisco': '51.0',\n    Austin: '43.0',\n  },\n  {\n    date: '2011-11-29',\n    'New York': '59.1',\n    'San Francisco': '49.5',\n    Austin: '46.4',\n  },\n  {\n    date: '2011-11-30',\n    'New York': '50.6',\n    'San Francisco': '49.8',\n    Austin: '48.0',\n  },\n  {\n    date: '2011-12-01',\n    'New York': '44.3',\n    'San Francisco': '60.4',\n    Austin: '48.1',\n  },\n  {\n    date: '2011-12-02',\n    'New York': '43.9',\n    'San Francisco': '62.2',\n    Austin: '60.6',\n  },\n  {\n    date: '2011-12-03',\n    'New York': '42.1',\n    'San Francisco': '58.3',\n    Austin: '62.6',\n  },\n  {\n    date: '2011-12-04',\n    'New York': '43.9',\n    'San Francisco': '52.7',\n    Austin: '57.1',\n  },\n  {\n    date: '2011-12-05',\n    'New York': '50.2',\n    'San Francisco': '51.5',\n    Austin: '44.2',\n  },\n  {\n    date: '2011-12-06',\n    'New York': '54.2',\n    'San Francisco': '49.9',\n    Austin: '37.4',\n  },\n  {\n    date: '2011-12-07',\n    'New York': '54.6',\n    'San Francisco': '48.6',\n    Austin: '35.0',\n  },\n  {\n    date: '2011-12-08',\n    'New York': '43.4',\n    'San Francisco': '46.4',\n    Austin: '37.0',\n  },\n  {\n    date: '2011-12-09',\n    'New York': '42.2',\n    'San Francisco': '49.8',\n    Austin: '45.4',\n  },\n  {\n    date: '2011-12-10',\n    'New York': '45.0',\n    'San Francisco': '52.1',\n    Austin: '50.7',\n  },\n  {\n    date: '2011-12-11',\n    'New York': '33.8',\n    'San Francisco': '48.8',\n    Austin: '48.6',\n  },\n  {\n    date: '2011-12-12',\n    'New York': '36.8',\n    'San Francisco': '47.4',\n    Austin: '52.2',\n  },\n  {\n    date: '2011-12-13',\n    'New York': '38.6',\n    'San Francisco': '47.2',\n    Austin: '60.8',\n  },\n  {\n    date: '2011-12-14',\n    'New York': '41.9',\n    'San Francisco': '46.1',\n    Austin: '70.0',\n  },\n  {\n    date: '2011-12-15',\n    'New York': '49.6',\n    'San Francisco': '48.8',\n    Austin: '64.2',\n  },\n  {\n    date: '2011-12-16',\n    'New York': '50.2',\n    'San Francisco': '47.9',\n    Austin: '50.9',\n  },\n  {\n    date: '2011-12-17',\n    'New York': '40.6',\n    'San Francisco': '49.8',\n    Austin: '51.6',\n  },\n  {\n    date: '2011-12-18',\n    'New York': '29.1',\n    'San Francisco': '49.1',\n    Austin: '55.2',\n  },\n  {\n    date: '2011-12-19',\n    'New York': '33.7',\n    'San Francisco': '48.3',\n    Austin: '62.1',\n  },\n  {\n    date: '2011-12-20',\n    'New York': '45.8',\n    'San Francisco': '49.3',\n    Austin: '56.3',\n  },\n  {\n    date: '2011-12-21',\n    'New York': '47.4',\n    'San Francisco': '48.4',\n    Austin: '47.2',\n  },\n  {\n    date: '2011-12-22',\n    'New York': '54.4',\n    'San Francisco': '53.3',\n    Austin: '52.3',\n  },\n  {\n    date: '2011-12-23',\n    'New York': '47.8',\n    'San Francisco': '47.5',\n    Austin: '45.2',\n  },\n  {\n    date: '2011-12-24',\n    'New York': '34.9',\n    'San Francisco': '47.9',\n    Austin: '43.6',\n  },\n  {\n    date: '2011-12-25',\n    'New York': '35.9',\n    'San Francisco': '48.9',\n    Austin: '42.9',\n  },\n  {\n    date: '2011-12-26',\n    'New York': '43.6',\n    'San Francisco': '45.9',\n    Austin: '48.2',\n  },\n  {\n    date: '2011-12-27',\n    'New York': '42.9',\n    'San Francisco': '47.2',\n    Austin: '45.4',\n  },\n  {\n    date: '2011-12-28',\n    'New York': '46.2',\n    'San Francisco': '48.9',\n    Austin: '44.2',\n  },\n  {\n    date: '2011-12-29',\n    'New York': '30.8',\n    'San Francisco': '50.9',\n    Austin: '50.4',\n  },\n  {\n    date: '2011-12-30',\n    'New York': '40.8',\n    'San Francisco': '52.9',\n    Austin: '52.4',\n  },\n  {\n    date: '2011-12-31',\n    'New York': '49.8',\n    'San Francisco': '50.1',\n    Austin: '53.5',\n  },\n  {\n    date: '2012-01-01',\n    'New York': '46.3',\n    'San Francisco': '53.9',\n    Austin: '55.9',\n  },\n  {\n    date: '2012-01-02',\n    'New York': '43.2',\n    'San Francisco': '53.1',\n    Austin: '48.2',\n  },\n  {\n    date: '2012-01-03',\n    'New York': '30.3',\n    'San Francisco': '49.7',\n    Austin: '41.0',\n  },\n  {\n    date: '2012-01-04',\n    'New York': '19.2',\n    'San Francisco': '52.7',\n    Austin: '48.9',\n  },\n  {\n    date: '2012-01-05',\n    'New York': '32.1',\n    'San Francisco': '52.6',\n    Austin: '54.8',\n  },\n  {\n    date: '2012-01-06',\n    'New York': '41.2',\n    'San Francisco': '49.0',\n    Austin: '61.2',\n  },\n  {\n    date: '2012-01-07',\n    'New York': '47.0',\n    'San Francisco': '51.0',\n    Austin: '59.7',\n  },\n  {\n    date: '2012-01-08',\n    'New York': '46.0',\n    'San Francisco': '56.8',\n    Austin: '52.5',\n  },\n  {\n    date: '2012-01-09',\n    'New York': '34.7',\n    'San Francisco': '52.3',\n    Austin: '54.0',\n  },\n  {\n    date: '2012-01-10',\n    'New York': '39.4',\n    'San Francisco': '51.6',\n    Austin: '47.7',\n  },\n  {\n    date: '2012-01-11',\n    'New York': '40.4',\n    'San Francisco': '49.8',\n    Austin: '49.2',\n  },\n  {\n    date: '2012-01-12',\n    'New York': '45.4',\n    'San Francisco': '51.9',\n    Austin: '48.4',\n  },\n  {\n    date: '2012-01-13',\n    'New York': '40.7',\n    'San Francisco': '53.7',\n    Austin: '40.2',\n  },\n  {\n    date: '2012-01-14',\n    'New York': '30.4',\n    'San Francisco': '52.9',\n    Austin: '43.9',\n  },\n  {\n    date: '2012-01-15',\n    'New York': '23.9',\n    'San Francisco': '49.7',\n    Austin: '45.2',\n  },\n  {\n    date: '2012-01-16',\n    'New York': '22.6',\n    'San Francisco': '45.3',\n    Austin: '65.0',\n  },\n  {\n    date: '2012-01-17',\n    'New York': '39.8',\n    'San Francisco': '43.6',\n    Austin: '68.2',\n  },\n  {\n    date: '2012-01-18',\n    'New York': '43.2',\n    'San Francisco': '45.0',\n    Austin: '47.5',\n  },\n  {\n    date: '2012-01-19',\n    'New York': '26.3',\n    'San Francisco': '47.3',\n    Austin: '57.1',\n  },\n  {\n    date: '2012-01-20',\n    'New York': '32.8',\n    'San Francisco': '51.4',\n    Austin: '61.9',\n  },\n  {\n    date: '2012-01-21',\n    'New York': '27.4',\n    'San Francisco': '53.7',\n    Austin: '54.6',\n  },\n  {\n    date: '2012-01-22',\n    'New York': '25.0',\n    'San Francisco': '48.3',\n    Austin: '56.7',\n  },\n  {\n    date: '2012-01-23',\n    'New York': '39.4',\n    'San Francisco': '52.9',\n    Austin: '54.4',\n  },\n  {\n    date: '2012-01-24',\n    'New York': '48.7',\n    'San Francisco': '49.1',\n    Austin: '52.7',\n  },\n  {\n    date: '2012-01-25',\n    'New York': '43.0',\n    'San Francisco': '52.1',\n    Austin: '61.8',\n  },\n  {\n    date: '2012-01-26',\n    'New York': '37.1',\n    'San Francisco': '53.6',\n    Austin: '55.0',\n  },\n  {\n    date: '2012-01-27',\n    'New York': '48.2',\n    'San Francisco': '50.4',\n    Austin: '50.7',\n  },\n  {\n    date: '2012-01-28',\n    'New York': '43.7',\n    'San Francisco': '50.3',\n    Austin: '52.9',\n  },\n  {\n    date: '2012-01-29',\n    'New York': '40.1',\n    'San Francisco': '53.8',\n    Austin: '44.4',\n  },\n  {\n    date: '2012-01-30',\n    'New York': '38.0',\n    'San Francisco': '51.9',\n    Austin: '49.1',\n  },\n  {\n    date: '2012-01-31',\n    'New York': '43.5',\n    'San Francisco': '50.0',\n    Austin: '62.8',\n  },\n  {\n    date: '2012-02-01',\n    'New York': '50.4',\n    'San Francisco': '50.0',\n    Austin: '64.6',\n  },\n  {\n    date: '2012-02-02',\n    'New York': '45.8',\n    'San Francisco': '51.3',\n    Austin: '61.1',\n  },\n  {\n    date: '2012-02-03',\n    'New York': '37.5',\n    'San Francisco': '51.5',\n    Austin: '70.0',\n  },\n  {\n    date: '2012-02-04',\n    'New York': '40.8',\n    'San Francisco': '52.0',\n    Austin: '61.3',\n  },\n  {\n    date: '2012-02-05',\n    'New York': '36.5',\n    'San Francisco': '53.8',\n    Austin: '48.2',\n  },\n  {\n    date: '2012-02-06',\n    'New York': '39.1',\n    'San Francisco': '54.6',\n    Austin: '44.2',\n  },\n  {\n    date: '2012-02-07',\n    'New York': '43.2',\n    'San Francisco': '54.3',\n    Austin: '51.3',\n  },\n  {\n    date: '2012-02-08',\n    'New York': '36.5',\n    'San Francisco': '51.9',\n    Austin: '49.2',\n  },\n  {\n    date: '2012-02-09',\n    'New York': '36.5',\n    'San Francisco': '53.8',\n    Austin: '45.7',\n  },\n  {\n    date: '2012-02-10',\n    'New York': '38.3',\n    'San Francisco': '53.9',\n    Austin: '54.1',\n  },\n  {\n    date: '2012-02-11',\n    'New York': '36.9',\n    'San Francisco': '52.3',\n    Austin: '44.9',\n  },\n  {\n    date: '2012-02-12',\n    'New York': '29.7',\n    'San Francisco': '50.1',\n    Austin: '36.5',\n  },\n  {\n    date: '2012-02-13',\n    'New York': '33.1',\n    'San Francisco': '49.5',\n    Austin: '44.8',\n  },\n  {\n    date: '2012-02-14',\n    'New York': '39.6',\n    'San Francisco': '48.6',\n    Austin: '52.3',\n  },\n  {\n    date: '2012-02-15',\n    'New York': '42.3',\n    'San Francisco': '49.9',\n    Austin: '68.0',\n  },\n  {\n    date: '2012-02-16',\n    'New York': '39.7',\n    'San Francisco': '52.4',\n    Austin: '54.6',\n  },\n  {\n    date: '2012-02-17',\n    'New York': '46.0',\n    'San Francisco': '49.9',\n    Austin: '53.8',\n  },\n  {\n    date: '2012-02-18',\n    'New York': '41.2',\n    'San Francisco': '51.6',\n    Austin: '56.2',\n  },\n  {\n    date: '2012-02-19',\n    'New York': '39.8',\n    'San Francisco': '47.8',\n    Austin: '50.8',\n  },\n  {\n    date: '2012-02-20',\n    'New York': '38.1',\n    'San Francisco': '48.7',\n    Austin: '53.0',\n  },\n  {\n    date: '2012-02-21',\n    'New York': '37.1',\n    'San Francisco': '49.7',\n    Austin: '61.0',\n  },\n  {\n    date: '2012-02-22',\n    'New York': '45.5',\n    'San Francisco': '53.4',\n    Austin: '68.8',\n  },\n  {\n    date: '2012-02-23',\n    'New York': '50.6',\n    'San Francisco': '54.1',\n    Austin: '69.4',\n  },\n  {\n    date: '2012-02-24',\n    'New York': '42.7',\n    'San Francisco': '55.9',\n    Austin: '59.3',\n  },\n  {\n    date: '2012-02-25',\n    'New York': '42.6',\n    'San Francisco': '51.7',\n    Austin: '47.2',\n  },\n  {\n    date: '2012-02-26',\n    'New York': '36.9',\n    'San Francisco': '47.7',\n    Austin: '47.7',\n  },\n  {\n    date: '2012-02-27',\n    'New York': '40.9',\n    'San Francisco': '45.4',\n    Austin: '61.9',\n  },\n  {\n    date: '2012-02-28',\n    'New York': '45.9',\n    'San Francisco': '47.0',\n    Austin: '67.2',\n  },\n  {\n    date: '2012-02-29',\n    'New York': '40.7',\n    'San Francisco': '49.8',\n    Austin: '70.1',\n  },\n  {\n    date: '2012-03-01',\n    'New York': '41.3',\n    'San Francisco': '48.9',\n    Austin: '62.1',\n  },\n  {\n    date: '2012-03-02',\n    'New York': '36.8',\n    'San Francisco': '48.1',\n    Austin: '72.7',\n  },\n  {\n    date: '2012-03-03',\n    'New York': '47.6',\n    'San Francisco': '50.7',\n    Austin: '59.0',\n  },\n  {\n    date: '2012-03-04',\n    'New York': '44.2',\n    'San Francisco': '55.0',\n    Austin: '51.8',\n  },\n  {\n    date: '2012-03-05',\n    'New York': '38.5',\n    'San Francisco': '48.8',\n    Austin: '55.0',\n  },\n  {\n    date: '2012-03-06',\n    'New York': '32.9',\n    'San Francisco': '48.4',\n    Austin: '61.8',\n  },\n  {\n    date: '2012-03-07',\n    'New York': '43.3',\n    'San Francisco': '49.9',\n    Austin: '67.1',\n  },\n  {\n    date: '2012-03-08',\n    'New York': '51.2',\n    'San Francisco': '49.2',\n    Austin: '72.0',\n  },\n  {\n    date: '2012-03-09',\n    'New York': '47.8',\n    'San Francisco': '51.7',\n    Austin: '46.4',\n  },\n  {\n    date: '2012-03-10',\n    'New York': '37.2',\n    'San Francisco': '49.3',\n    Austin: '46.7',\n  },\n  {\n    date: '2012-03-11',\n    'New York': '42.9',\n    'San Francisco': '50.0',\n    Austin: '56.9',\n  },\n  {\n    date: '2012-03-12',\n    'New York': '48.8',\n    'San Francisco': '48.6',\n    Austin: '61.9',\n  },\n  {\n    date: '2012-03-13',\n    'New York': '52.6',\n    'San Francisco': '53.9',\n    Austin: '68.8',\n  },\n  {\n    date: '2012-03-14',\n    'New York': '60.5',\n    'San Francisco': '55.2',\n    Austin: '71.9',\n  },\n  {\n    date: '2012-03-15',\n    'New York': '47.2',\n    'San Francisco': '55.9',\n    Austin: '72.0',\n  },\n  {\n    date: '2012-03-16',\n    'New York': '44.7',\n    'San Francisco': '54.6',\n    Austin: '72.5',\n  },\n  {\n    date: '2012-03-17',\n    'New York': '48.2',\n    'San Francisco': '48.2',\n    Austin: '71.7',\n  },\n  {\n    date: '2012-03-18',\n    'New York': '48.2',\n    'San Francisco': '47.1',\n    Austin: '71.1',\n  },\n  {\n    date: '2012-03-19',\n    'New York': '53.1',\n    'San Francisco': '45.8',\n    Austin: '73.0',\n  },\n  {\n    date: '2012-03-20',\n    'New York': '57.8',\n    'San Francisco': '49.7',\n    Austin: '63.8',\n  },\n  {\n    date: '2012-03-21',\n    'New York': '57.5',\n    'San Francisco': '51.4',\n    Austin: '60.0',\n  },\n  {\n    date: '2012-03-22',\n    'New York': '57.3',\n    'San Francisco': '51.4',\n    Austin: '62.3',\n  },\n  {\n    date: '2012-03-23',\n    'New York': '61.7',\n    'San Francisco': '48.4',\n    Austin: '61.1',\n  },\n  {\n    date: '2012-03-24',\n    'New York': '55.8',\n    'San Francisco': '49.0',\n    Austin: '62.0',\n  },\n  {\n    date: '2012-03-25',\n    'New York': '48.4',\n    'San Francisco': '46.4',\n    Austin: '64.6',\n  },\n  {\n    date: '2012-03-26',\n    'New York': '49.8',\n    'San Francisco': '49.7',\n    Austin: '66.0',\n  },\n  {\n    date: '2012-03-27',\n    'New York': '39.6',\n    'San Francisco': '54.1',\n    Austin: '65.8',\n  },\n  {\n    date: '2012-03-28',\n    'New York': '49.7',\n    'San Francisco': '54.6',\n    Austin: '69.2',\n  },\n  {\n    date: '2012-03-29',\n    'New York': '56.8',\n    'San Francisco': '52.3',\n    Austin: '69.5',\n  },\n  {\n    date: '2012-03-30',\n    'New York': '46.5',\n    'San Francisco': '54.5',\n    Austin: '73.5',\n  },\n  {\n    date: '2012-03-31',\n    'New York': '42.2',\n    'San Francisco': '56.2',\n    Austin: '73.9',\n  },\n  {\n    date: '2012-04-01',\n    'New York': '45.3',\n    'San Francisco': '51.1',\n    Austin: '75.3',\n  },\n  {\n    date: '2012-04-02',\n    'New York': '48.1',\n    'San Francisco': '50.5',\n    Austin: '75.4',\n  },\n  {\n    date: '2012-04-03',\n    'New York': '51.2',\n    'San Francisco': '52.2',\n    Austin: '77.3',\n  },\n  {\n    date: '2012-04-04',\n    'New York': '61.0',\n    'San Francisco': '50.6',\n    Austin: '67.0',\n  },\n  {\n    date: '2012-04-05',\n    'New York': '50.7',\n    'San Francisco': '47.9',\n    Austin: '71.1',\n  },\n  {\n    date: '2012-04-06',\n    'New York': '48.0',\n    'San Francisco': '47.4',\n    Austin: '70.4',\n  },\n  {\n    date: '2012-04-07',\n    'New York': '51.1',\n    'San Francisco': '49.4',\n    Austin: '73.6',\n  },\n  {\n    date: '2012-04-08',\n    'New York': '55.7',\n    'San Francisco': '50.0',\n    Austin: '71.1',\n  },\n  {\n    date: '2012-04-09',\n    'New York': '58.3',\n    'San Francisco': '51.3',\n    Austin: '70.0',\n  },\n  {\n    date: '2012-04-10',\n    'New York': '55.0',\n    'San Francisco': '53.8',\n    Austin: '69.0',\n  },\n  {\n    date: '2012-04-11',\n    'New York': '49.0',\n    'San Francisco': '52.9',\n    Austin: '69.2',\n  },\n  {\n    date: '2012-04-12',\n    'New York': '51.7',\n    'San Francisco': '53.9',\n    Austin: '74.5',\n  },\n  {\n    date: '2012-04-13',\n    'New York': '53.1',\n    'San Francisco': '50.2',\n    Austin: '73.4',\n  },\n  {\n    date: '2012-04-14',\n    'New York': '55.2',\n    'San Francisco': '50.9',\n    Austin: '76.0',\n  },\n  {\n    date: '2012-04-15',\n    'New York': '62.3',\n    'San Francisco': '51.5',\n    Austin: '74.5',\n  },\n  {\n    date: '2012-04-16',\n    'New York': '62.9',\n    'San Francisco': '51.9',\n    Austin: '63.6',\n  },\n  {\n    date: '2012-04-17',\n    'New York': '69.3',\n    'San Francisco': '53.2',\n    Austin: '67.3',\n  },\n  {\n    date: '2012-04-18',\n    'New York': '59.0',\n    'San Francisco': '53.0',\n    Austin: '65.1',\n  },\n  {\n    date: '2012-04-19',\n    'New York': '54.1',\n    'San Francisco': '55.1',\n    Austin: '67.9',\n  },\n  {\n    date: '2012-04-20',\n    'New York': '56.5',\n    'San Francisco': '55.8',\n    Austin: '68.9',\n  },\n  {\n    date: '2012-04-21',\n    'New York': '58.2',\n    'San Francisco': '58.0',\n    Austin: '65.1',\n  },\n  {\n    date: '2012-04-22',\n    'New York': '52.4',\n    'San Francisco': '52.8',\n    Austin: '65.4',\n  },\n  {\n    date: '2012-04-23',\n    'New York': '51.6',\n    'San Francisco': '55.1',\n    Austin: '70.1',\n  },\n  {\n    date: '2012-04-24',\n    'New York': '49.3',\n    'San Francisco': '57.9',\n    Austin: '67.0',\n  },\n  {\n    date: '2012-04-25',\n    'New York': '52.5',\n    'San Francisco': '57.5',\n    Austin: '75.4',\n  },\n  {\n    date: '2012-04-26',\n    'New York': '50.5',\n    'San Francisco': '55.3',\n    Austin: '77.5',\n  },\n  {\n    date: '2012-04-27',\n    'New York': '51.9',\n    'San Francisco': '53.5',\n    Austin: '77.0',\n  },\n  {\n    date: '2012-04-28',\n    'New York': '47.4',\n    'San Francisco': '54.7',\n    Austin: '77.7',\n  },\n  {\n    date: '2012-04-29',\n    'New York': '54.1',\n    'San Francisco': '54.0',\n    Austin: '77.7',\n  },\n  {\n    date: '2012-04-30',\n    'New York': '51.9',\n    'San Francisco': '53.4',\n    Austin: '77.7',\n  },\n  {\n    date: '2012-05-01',\n    'New York': '57.4',\n    'San Francisco': '52.7',\n    Austin: '77.0',\n  },\n  {\n    date: '2012-05-02',\n    'New York': '53.7',\n    'San Francisco': '50.7',\n    Austin: '77.9',\n  },\n  {\n    date: '2012-05-03',\n    'New York': '53.1',\n    'San Francisco': '52.6',\n    Austin: '79.1',\n  },\n  {\n    date: '2012-05-04',\n    'New York': '57.2',\n    'San Francisco': '53.4',\n    Austin: '80.1',\n  },\n  {\n    date: '2012-05-05',\n    'New York': '57.0',\n    'San Francisco': '53.1',\n    Austin: '82.1',\n  },\n  {\n    date: '2012-05-06',\n    'New York': '56.6',\n    'San Francisco': '56.5',\n    Austin: '79.0',\n  },\n  {\n    date: '2012-05-07',\n    'New York': '54.6',\n    'San Francisco': '55.3',\n    Austin: '79.8',\n  },\n  {\n    date: '2012-05-08',\n    'New York': '57.9',\n    'San Francisco': '52.0',\n    Austin: '70.0',\n  },\n  {\n    date: '2012-05-09',\n    'New York': '59.2',\n    'San Francisco': '52.4',\n    Austin: '69.8',\n  },\n  {\n    date: '2012-05-10',\n    'New York': '61.1',\n    'San Francisco': '53.4',\n    Austin: '71.3',\n  },\n  {\n    date: '2012-05-11',\n    'New York': '59.7',\n    'San Francisco': '53.1',\n    Austin: '69.4',\n  },\n  {\n    date: '2012-05-12',\n    'New York': '64.1',\n    'San Francisco': '49.9',\n    Austin: '72.0',\n  },\n  {\n    date: '2012-05-13',\n    'New York': '65.3',\n    'San Francisco': '52.0',\n    Austin: '72.4',\n  },\n  {\n    date: '2012-05-14',\n    'New York': '64.2',\n    'San Francisco': '56.0',\n    Austin: '72.5',\n  },\n  {\n    date: '2012-05-15',\n    'New York': '62.0',\n    'San Francisco': '53.0',\n    Austin: '67.6',\n  },\n  {\n    date: '2012-05-16',\n    'New York': '63.8',\n    'San Francisco': '51.0',\n    Austin: '69.0',\n  },\n  {\n    date: '2012-05-17',\n    'New York': '64.5',\n    'San Francisco': '51.4',\n    Austin: '72.7',\n  },\n  {\n    date: '2012-05-18',\n    'New York': '61.0',\n    'San Francisco': '52.2',\n    Austin: '73.7',\n  },\n  {\n    date: '2012-05-19',\n    'New York': '62.6',\n    'San Francisco': '52.4',\n    Austin: '77.5',\n  },\n  {\n    date: '2012-05-20',\n    'New York': '66.2',\n    'San Francisco': '54.5',\n    Austin: '75.8',\n  },\n  {\n    date: '2012-05-21',\n    'New York': '62.7',\n    'San Francisco': '52.8',\n    Austin: '76.9',\n  },\n  {\n    date: '2012-05-22',\n    'New York': '63.7',\n    'San Francisco': '53.9',\n    Austin: '78.8',\n  },\n  {\n    date: '2012-05-23',\n    'New York': '66.4',\n    'San Francisco': '56.5',\n    Austin: '77.7',\n  },\n  {\n    date: '2012-05-24',\n    'New York': '64.5',\n    'San Francisco': '54.7',\n    Austin: '80.6',\n  },\n  {\n    date: '2012-05-25',\n    'New York': '65.4',\n    'San Francisco': '52.5',\n    Austin: '81.4',\n  },\n  {\n    date: '2012-05-26',\n    'New York': '69.4',\n    'San Francisco': '52.1',\n    Austin: '82.3',\n  },\n  {\n    date: '2012-05-27',\n    'New York': '71.9',\n    'San Francisco': '52.2',\n    Austin: '80.3',\n  },\n  {\n    date: '2012-05-28',\n    'New York': '74.4',\n    'San Francisco': '52.9',\n    Austin: '80.3',\n  },\n  {\n    date: '2012-05-29',\n    'New York': '75.9',\n    'San Francisco': '52.1',\n    Austin: '82.2',\n  },\n  {\n    date: '2012-05-30',\n    'New York': '72.9',\n    'San Francisco': '52.1',\n    Austin: '81.9',\n  },\n  {\n    date: '2012-05-31',\n    'New York': '72.5',\n    'San Francisco': '53.3',\n    Austin: '82.4',\n  },\n  {\n    date: '2012-06-01',\n    'New York': '67.2',\n    'San Francisco': '54.8',\n    Austin: '77.9',\n  },\n  {\n    date: '2012-06-02',\n    'New York': '68.3',\n    'San Francisco': '54.0',\n    Austin: '81.1',\n  },\n  {\n    date: '2012-06-03',\n    'New York': '67.7',\n    'San Francisco': '52.3',\n    Austin: '82.2',\n  },\n  {\n    date: '2012-06-04',\n    'New York': '61.9',\n    'San Francisco': '55.3',\n    Austin: '81.2',\n  },\n  {\n    date: '2012-06-05',\n    'New York': '58.3',\n    'San Francisco': '53.5',\n    Austin: '83.0',\n  },\n  {\n    date: '2012-06-06',\n    'New York': '61.7',\n    'San Francisco': '54.1',\n    Austin: '83.2',\n  },\n  {\n    date: '2012-06-07',\n    'New York': '66.7',\n    'San Francisco': '53.9',\n    Austin: '82.1',\n  },\n  {\n    date: '2012-06-08',\n    'New York': '68.7',\n    'San Francisco': '54.4',\n    Austin: '77.5',\n  },\n  {\n    date: '2012-06-09',\n    'New York': '72.2',\n    'San Francisco': '55.0',\n    Austin: '77.9',\n  },\n  {\n    date: '2012-06-10',\n    'New York': '72.6',\n    'San Francisco': '60.0',\n    Austin: '82.9',\n  },\n  {\n    date: '2012-06-11',\n    'New York': '69.2',\n    'San Francisco': '57.2',\n    Austin: '86.8',\n  },\n  {\n    date: '2012-06-12',\n    'New York': '66.9',\n    'San Francisco': '55.1',\n    Austin: '85.3',\n  },\n  {\n    date: '2012-06-13',\n    'New York': '66.7',\n    'San Francisco': '53.3',\n    Austin: '76.9',\n  },\n  {\n    date: '2012-06-14',\n    'New York': '67.7',\n    'San Francisco': '53.4',\n    Austin: '84.5',\n  },\n  {\n    date: '2012-06-15',\n    'New York': '68.5',\n    'San Francisco': '54.6',\n    Austin: '84.4',\n  },\n  {\n    date: '2012-06-16',\n    'New York': '67.5',\n    'San Francisco': '57.0',\n    Austin: '83.8',\n  },\n  {\n    date: '2012-06-17',\n    'New York': '64.2',\n    'San Francisco': '55.6',\n    Austin: '82.5',\n  },\n  {\n    date: '2012-06-18',\n    'New York': '61.7',\n    'San Francisco': '52.5',\n    Austin: '82.9',\n  },\n  {\n    date: '2012-06-19',\n    'New York': '66.4',\n    'San Francisco': '53.9',\n    Austin: '82.5',\n  },\n  {\n    date: '2012-06-20',\n    'New York': '77.9',\n    'San Francisco': '55.3',\n    Austin: '81.3',\n  },\n  {\n    date: '2012-06-21',\n    'New York': '88.3',\n    'San Francisco': '53.3',\n    Austin: '80.8',\n  },\n  {\n    date: '2012-06-22',\n    'New York': '82.2',\n    'San Francisco': '54.1',\n    Austin: '81.7',\n  },\n  {\n    date: '2012-06-23',\n    'New York': '77.0',\n    'San Francisco': '55.2',\n    Austin: '83.9',\n  },\n  {\n    date: '2012-06-24',\n    'New York': '75.4',\n    'San Francisco': '55.8',\n    Austin: '85.5',\n  },\n  {\n    date: '2012-06-25',\n    'New York': '70.9',\n    'San Francisco': '56.8',\n    Austin: '87.2',\n  },\n  {\n    date: '2012-06-26',\n    'New York': '65.9',\n    'San Francisco': '57.5',\n    Austin: '88.0',\n  },\n  {\n    date: '2012-06-27',\n    'New York': '73.5',\n    'San Francisco': '57.7',\n    Austin: '89.6',\n  },\n  {\n    date: '2012-06-28',\n    'New York': '77.4',\n    'San Francisco': '56.6',\n    Austin: '86.7',\n  },\n  {\n    date: '2012-06-29',\n    'New York': '79.6',\n    'San Francisco': '56.4',\n    Austin: '85.3',\n  },\n  {\n    date: '2012-06-30',\n    'New York': '84.2',\n    'San Francisco': '58.4',\n    Austin: '81.7',\n  },\n  {\n    date: '2012-07-01',\n    'New York': '81.8',\n    'San Francisco': '58.8',\n    Austin: '78.5',\n  },\n  {\n    date: '2012-07-02',\n    'New York': '82.5',\n    'San Francisco': '56.4',\n    Austin: '83.1',\n  },\n  {\n    date: '2012-07-03',\n    'New York': '80.2',\n    'San Francisco': '56.5',\n    Austin: '83.1',\n  },\n  {\n    date: '2012-07-04',\n    'New York': '77.8',\n    'San Francisco': '55.8',\n    Austin: '84.5',\n  },\n  {\n    date: '2012-07-05',\n    'New York': '86.1',\n    'San Francisco': '54.8',\n    Austin: '84.6',\n  },\n  {\n    date: '2012-07-06',\n    'New York': '79.9',\n    'San Francisco': '54.9',\n    Austin: '84.2',\n  },\n  {\n    date: '2012-07-07',\n    'New York': '83.5',\n    'San Francisco': '54.7',\n    Austin: '86.7',\n  },\n  {\n    date: '2012-07-08',\n    'New York': '81.5',\n    'San Francisco': '52.8',\n    Austin: '84.3',\n  },\n  {\n    date: '2012-07-09',\n    'New York': '77.8',\n    'San Francisco': '53.7',\n    Austin: '83.7',\n  },\n  {\n    date: '2012-07-10',\n    'New York': '76.1',\n    'San Francisco': '53.1',\n    Austin: '77.1',\n  },\n  {\n    date: '2012-07-11',\n    'New York': '76.3',\n    'San Francisco': '52.7',\n    Austin: '77.4',\n  },\n  {\n    date: '2012-07-12',\n    'New York': '75.8',\n    'San Francisco': '52.0',\n    Austin: '80.6',\n  },\n  {\n    date: '2012-07-13',\n    'New York': '77.2',\n    'San Francisco': '53.4',\n    Austin: '81.4',\n  },\n  {\n    date: '2012-07-14',\n    'New York': '79.3',\n    'San Francisco': '54.0',\n    Austin: '80.2',\n  },\n  {\n    date: '2012-07-15',\n    'New York': '78.9',\n    'San Francisco': '54.0',\n    Austin: '81.8',\n  },\n  {\n    date: '2012-07-16',\n    'New York': '79.6',\n    'San Francisco': '54.5',\n    Austin: '77.3',\n  },\n  {\n    date: '2012-07-17',\n    'New York': '83.3',\n    'San Francisco': '56.7',\n    Austin: '80.8',\n  },\n  {\n    date: '2012-07-18',\n    'New York': '84.3',\n    'San Francisco': '57.5',\n    Austin: '81.6',\n  },\n  {\n    date: '2012-07-19',\n    'New York': '75.1',\n    'San Francisco': '57.1',\n    Austin: '80.9',\n  },\n  {\n    date: '2012-07-20',\n    'New York': '68.4',\n    'San Francisco': '58.1',\n    Austin: '83.9',\n  },\n  {\n    date: '2012-07-21',\n    'New York': '68.4',\n    'San Francisco': '57.6',\n    Austin: '85.6',\n  },\n  {\n    date: '2012-07-22',\n    'New York': '72.2',\n    'San Francisco': '56.0',\n    Austin: '83.6',\n  },\n  {\n    date: '2012-07-23',\n    'New York': '75.6',\n    'San Francisco': '56.6',\n    Austin: '84.0',\n  },\n  {\n    date: '2012-07-24',\n    'New York': '82.6',\n    'San Francisco': '57.8',\n    Austin: '83.0',\n  },\n  {\n    date: '2012-07-25',\n    'New York': '78.4',\n    'San Francisco': '57.5',\n    Austin: '84.8',\n  },\n  {\n    date: '2012-07-26',\n    'New York': '77.0',\n    'San Francisco': '56.4',\n    Austin: '84.4',\n  },\n  {\n    date: '2012-07-27',\n    'New York': '79.4',\n    'San Francisco': '55.3',\n    Austin: '84.3',\n  },\n  {\n    date: '2012-07-28',\n    'New York': '77.4',\n    'San Francisco': '55.0',\n    Austin: '83.9',\n  },\n  {\n    date: '2012-07-29',\n    'New York': '72.5',\n    'San Francisco': '55.6',\n    Austin: '85.0',\n  },\n  {\n    date: '2012-07-30',\n    'New York': '72.9',\n    'San Francisco': '55.6',\n    Austin: '84.9',\n  },\n  {\n    date: '2012-07-31',\n    'New York': '73.6',\n    'San Francisco': '55.9',\n    Austin: '86.3',\n  },\n  {\n    date: '2012-08-01',\n    'New York': '75.0',\n    'San Francisco': '55.4',\n    Austin: '86.5',\n  },\n  {\n    date: '2012-08-02',\n    'New York': '77.7',\n    'San Francisco': '54.4',\n    Austin: '85.8',\n  },\n  {\n    date: '2012-08-03',\n    'New York': '79.7',\n    'San Francisco': '53.7',\n    Austin: '85.3',\n  },\n  {\n    date: '2012-08-04',\n    'New York': '79.6',\n    'San Francisco': '54.1',\n    Austin: '86.0',\n  },\n  {\n    date: '2012-08-05',\n    'New York': '81.5',\n    'San Francisco': '57.8',\n    Austin: '84.2',\n  },\n  {\n    date: '2012-08-06',\n    'New York': '80.0',\n    'San Francisco': '58.2',\n    Austin: '81.9',\n  },\n  {\n    date: '2012-08-07',\n    'New York': '75.7',\n    'San Francisco': '58.0',\n    Austin: '86.5',\n  },\n  {\n    date: '2012-08-08',\n    'New York': '77.8',\n    'San Francisco': '57.0',\n    Austin: '86.1',\n  },\n  {\n    date: '2012-08-09',\n    'New York': '78.6',\n    'San Francisco': '55.0',\n    Austin: '86.8',\n  },\n  {\n    date: '2012-08-10',\n    'New York': '77.8',\n    'San Francisco': '54.8',\n    Austin: '88.0',\n  },\n  {\n    date: '2012-08-11',\n    'New York': '78.5',\n    'San Francisco': '53.0',\n    Austin: '85.1',\n  },\n  {\n    date: '2012-08-12',\n    'New York': '78.8',\n    'San Francisco': '52.5',\n    Austin: '87.4',\n  },\n  {\n    date: '2012-08-13',\n    'New York': '78.6',\n    'San Francisco': '53.3',\n    Austin: '88.0',\n  },\n  {\n    date: '2012-08-14',\n    'New York': '76.8',\n    'San Francisco': '53.9',\n    Austin: '88.0',\n  },\n  {\n    date: '2012-08-15',\n    'New York': '76.7',\n    'San Francisco': '56.2',\n    Austin: '87.2',\n  },\n  {\n    date: '2012-08-16',\n    'New York': '75.9',\n    'San Francisco': '57.1',\n    Austin: '86.1',\n  },\n  {\n    date: '2012-08-17',\n    'New York': '77.6',\n    'San Francisco': '55.3',\n    Austin: '86.8',\n  },\n  {\n    date: '2012-08-18',\n    'New York': '72.6',\n    'San Francisco': '56.2',\n    Austin: '84.9',\n  },\n  {\n    date: '2012-08-19',\n    'New York': '70.4',\n    'San Francisco': '54.3',\n    Austin: '76.8',\n  },\n  {\n    date: '2012-08-20',\n    'New York': '71.8',\n    'San Francisco': '53.1',\n    Austin: '80.6',\n  },\n  {\n    date: '2012-08-21',\n    'New York': '73.6',\n    'San Francisco': '53.4',\n    Austin: '80.0',\n  },\n  {\n    date: '2012-08-22',\n    'New York': '74.7',\n    'San Francisco': '54.5',\n    Austin: '78.2',\n  },\n  {\n    date: '2012-08-23',\n    'New York': '74.6',\n    'San Francisco': '55.7',\n    Austin: '79.1',\n  },\n  {\n    date: '2012-08-24',\n    'New York': '76.0',\n    'San Francisco': '54.8',\n    Austin: '81.9',\n  },\n  {\n    date: '2012-08-25',\n    'New York': '76.2',\n    'San Francisco': '53.8',\n    Austin: '84.7',\n  },\n  {\n    date: '2012-08-26',\n    'New York': '73.4',\n    'San Francisco': '56.5',\n    Austin: '83.5',\n  },\n  {\n    date: '2012-08-27',\n    'New York': '74.6',\n    'San Francisco': '58.3',\n    Austin: '82.1',\n  },\n  {\n    date: '2012-08-28',\n    'New York': '79.4',\n    'San Francisco': '58.7',\n    Austin: '84.0',\n  },\n  {\n    date: '2012-08-29',\n    'New York': '74.7',\n    'San Francisco': '57.5',\n    Austin: '85.7',\n  },\n  {\n    date: '2012-08-30',\n    'New York': '73.5',\n    'San Francisco': '55.9',\n    Austin: '87.2',\n  },\n  {\n    date: '2012-08-31',\n    'New York': '77.9',\n    'San Francisco': '55.4',\n    Austin: '82.9',\n  },\n  {\n    date: '2012-09-01',\n    'New York': '80.7',\n    'San Francisco': '55.7',\n    Austin: '84.8',\n  },\n  {\n    date: '2012-09-02',\n    'New York': '75.1',\n    'San Francisco': '53.1',\n    Austin: '83.9',\n  },\n  {\n    date: '2012-09-03',\n    'New York': '73.5',\n    'San Francisco': '53.5',\n    Austin: '85.5',\n  },\n  {\n    date: '2012-09-04',\n    'New York': '73.5',\n    'San Francisco': '52.5',\n    Austin: '86.4',\n  },\n  {\n    date: '2012-09-05',\n    'New York': '77.7',\n    'San Francisco': '54.5',\n    Austin: '85.8',\n  },\n  {\n    date: '2012-09-06',\n    'New York': '74.2',\n    'San Francisco': '56.3',\n    Austin: '85.4',\n  },\n  {\n    date: '2012-09-07',\n    'New York': '76.0',\n    'San Francisco': '56.4',\n    Austin: '85.3',\n  },\n  {\n    date: '2012-09-08',\n    'New York': '77.1',\n    'San Francisco': '56.5',\n    Austin: '81.9',\n  },\n  {\n    date: '2012-09-09',\n    'New York': '69.7',\n    'San Francisco': '56.4',\n    Austin: '74.8',\n  },\n  {\n    date: '2012-09-10',\n    'New York': '67.8',\n    'San Francisco': '55.4',\n    Austin: '71.6',\n  },\n  {\n    date: '2012-09-11',\n    'New York': '64.0',\n    'San Francisco': '56.2',\n    Austin: '75.9',\n  },\n  {\n    date: '2012-09-12',\n    'New York': '68.1',\n    'San Francisco': '55.7',\n    Austin: '82.1',\n  },\n  {\n    date: '2012-09-13',\n    'New York': '69.3',\n    'San Francisco': '54.3',\n    Austin: '80.5',\n  },\n  {\n    date: '2012-09-14',\n    'New York': '70.0',\n    'San Francisco': '55.2',\n    Austin: '70.0',\n  },\n  {\n    date: '2012-09-15',\n    'New York': '69.3',\n    'San Francisco': '54.3',\n    Austin: '71.2',\n  },\n  {\n    date: '2012-09-16',\n    'New York': '66.3',\n    'San Francisco': '52.9',\n    Austin: '70.3',\n  },\n  {\n    date: '2012-09-17',\n    'New York': '67.0',\n    'San Francisco': '54.8',\n    Austin: '72.1',\n  },\n  {\n    date: '2012-09-18',\n    'New York': '72.8',\n    'San Francisco': '54.8',\n    Austin: '73.7',\n  },\n  {\n    date: '2012-09-19',\n    'New York': '67.2',\n    'San Francisco': '56.8',\n    Austin: '72.7',\n  },\n  {\n    date: '2012-09-20',\n    'New York': '62.1',\n    'San Francisco': '55.4',\n    Austin: '71.7',\n  },\n  {\n    date: '2012-09-21',\n    'New York': '64.0',\n    'San Francisco': '55.8',\n    Austin: '72.9',\n  },\n  {\n    date: '2012-09-22',\n    'New York': '65.5',\n    'San Francisco': '55.9',\n    Austin: '73.1',\n  },\n  {\n    date: '2012-09-23',\n    'New York': '65.7',\n    'San Francisco': '52.8',\n    Austin: '75.6',\n  },\n  {\n    date: '2012-09-24',\n    'New York': '60.4',\n    'San Francisco': '54.5',\n    Austin: '78.3',\n  },\n  {\n    date: '2012-09-25',\n    'New York': '63.2',\n    'San Francisco': '53.3',\n    Austin: '78.3',\n  },\n  {\n    date: '2012-09-26',\n    'New York': '68.5',\n    'San Francisco': '53.6',\n    Austin: '79.6',\n  },\n  {\n    date: '2012-09-27',\n    'New York': '69.2',\n    'San Francisco': '52.1',\n    Austin: '76.4',\n  },\n  {\n    date: '2012-09-28',\n    'New York': '68.7',\n    'San Francisco': '52.6',\n    Austin: '77.2',\n  },\n  {\n    date: '2012-09-29',\n    'New York': '62.5',\n    'San Francisco': '53.9',\n    Austin: '75.2',\n  },\n  {\n    date: '2012-09-30',\n    'New York': '62.3',\n    'San Francisco': '55.1',\n    Austin: '71.9',\n  },\n];\n\nexport default cityTemperature;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/exoplanets.ts",
    "content": "export interface Exoplanets {\n  name: string;\n  radius: number;\n  distance: number | null;\n}\n\nconst exoplanets: Exoplanets[] = [\n  {\n    name: 'Jupiter',\n    radius: 10.97,\n    distance: 0,\n  },\n  {\n    name: 'Saturn',\n    radius: 9.14,\n    distance: 0,\n  },\n  {\n    name: 'Uranus',\n    radius: 3.98,\n    distance: 0,\n  },\n  {\n    name: 'Neptune',\n    radius: 3.86,\n    distance: 0,\n  },\n  {\n    name: 'Earth',\n    radius: 1,\n    distance: 0,\n  },\n  {\n    name: 'Venus',\n    radius: 0.95,\n    distance: 0,\n  },\n  {\n    name: 'Mars',\n    radius: 0.532,\n    distance: 0,\n  },\n  {\n    name: 'Mercury',\n    radius: 0.383,\n    distance: 0,\n  },\n  {\n    name: 'Pluto',\n    radius: 0.181,\n    distance: 0,\n  },\n  {\n    name: '11 Com b',\n    radius: 12.64,\n    distance: 110.6,\n  },\n  {\n    name: '11 UMi b',\n    radius: 12.89,\n    distance: 119.5,\n  },\n  {\n    name: '14 And b',\n    radius: 13.18,\n    distance: 76.4,\n  },\n  {\n    name: '14 Her b',\n    radius: 13.24,\n    distance: 18.1,\n  },\n  {\n    name: '16 Cyg B b',\n    radius: 13.69,\n    distance: 21.41,\n  },\n  {\n    name: '18 Del b',\n    radius: 12.9,\n    distance: 73.1,\n  },\n  {\n    name: '1RXS1609 b',\n    radius: 19.04,\n    distance: 145,\n  },\n  {\n    name: '24 Sex b',\n    radius: 13.62,\n    distance: 74.8,\n  },\n  {\n    name: '24 Sex c',\n    radius: 13.99,\n    distance: 74.8,\n  },\n  {\n    name: '2M 0103(AB) b',\n    radius: 12.74,\n    distance: 47.2,\n  },\n  {\n    name: '2M 0122-2439 b',\n    radius: 12.74,\n    distance: 36,\n  },\n  {\n    name: '2M 044144 b',\n    radius: 13.04,\n    distance: 140,\n  },\n  {\n    name: '2M 0746+20 b',\n    radius: 10.86,\n    distance: 12.21,\n  },\n  {\n    name: '2M 2140+16 b',\n    radius: 10.3,\n    distance: 25,\n  },\n  {\n    name: '2M 2206-20 b',\n    radius: 14.56,\n    distance: 26.67,\n  },\n  {\n    name: '2M1207 b',\n    radius: 13.31,\n    distance: 52.4,\n  },\n  {\n    name: '30 Ari B b',\n    radius: 12.92,\n    distance: 39.4,\n  },\n  {\n    name: '4 Uma b',\n    radius: 13.06,\n    distance: 78.5,\n  },\n  {\n    name: '42 Dra b',\n    radius: 13.32,\n    distance: 97.3,\n  },\n  {\n    name: '47 Uma b',\n    radius: 13.51,\n    distance: 13.97,\n  },\n  {\n    name: '47 Uma c',\n    radius: 14.21,\n    distance: 13.97,\n  },\n  {\n    name: '47 Uma d',\n    radius: 13.7,\n    distance: 13.97,\n  },\n  {\n    name: '51 Peg b',\n    radius: 14.28,\n    distance: 14.7,\n  },\n  {\n    name: '55 Cnc b',\n    radius: 14.03,\n    distance: 12.34,\n  },\n  {\n    name: '55 Cnc c',\n    radius: 8.48,\n    distance: 12.34,\n  },\n  {\n    name: '55 Cnc d',\n    radius: 13.33,\n    distance: 12.34,\n  },\n  {\n    name: '55 Cnc e',\n    radius: 1.99,\n    distance: 12.34,\n  },\n  {\n    name: '55 Cnc f',\n    radius: 7.75,\n    distance: 12.34,\n  },\n  {\n    name: '6 Lyn b',\n    radius: 13.53,\n    distance: 56.9,\n  },\n  {\n    name: '61 Vir b',\n    radius: 1.89,\n    distance: 8.52,\n  },\n  {\n    name: '61 Vir c',\n    radius: 4.63,\n    distance: 8.52,\n  },\n  {\n    name: '61 Vir d',\n    radius: 5.26,\n    distance: 8.52,\n  },\n  {\n    name: '7 CMa b',\n    radius: 13.5,\n    distance: 19.75,\n  },\n  {\n    name: '70 Vir b',\n    radius: 13.09,\n    distance: 22,\n  },\n  {\n    name: '75 Cet b',\n    radius: 13.37,\n    distance: 81.5,\n  },\n  {\n    name: '81 Cet b',\n    radius: 13.19,\n    distance: 97.2,\n  },\n  {\n    name: '91 Aqr b',\n    radius: 13.41,\n    distance: 45.9,\n  },\n  {\n    name: 'AB Pic b',\n    radius: 12.79,\n    distance: 47.3,\n  },\n  {\n    name: 'alf Ari b',\n    radius: 13.66,\n    distance: 20.2,\n  },\n  {\n    name: 'alf Cen B b',\n    radius: 1.1,\n    distance: 1.3,\n  },\n  {\n    name: 'BD +48 738 b',\n    radius: 13.9,\n    distance: null,\n  },\n  {\n    name: 'BD+15 2940 b',\n    radius: 13.81,\n    distance: 585,\n  },\n  {\n    name: 'BD+20 274 c',\n    radius: 13.22,\n    distance: null,\n  },\n  {\n    name: 'BD-061339 b',\n    radius: 3.29,\n    distance: 20,\n  },\n  {\n    name: 'BD-061339 c',\n    radius: 9.22,\n    distance: 20,\n  },\n  {\n    name: 'BD-082823 b',\n    radius: 4.04,\n    distance: 42.2,\n  },\n  {\n    name: 'BD-082823 c',\n    radius: 14.44,\n    distance: 42.2,\n  },\n  {\n    name: 'BD-10 3166 b',\n    radius: 14.26,\n    distance: 66,\n  },\n  {\n    name: 'BD-17 63 b',\n    radius: 13.2,\n    distance: 34.6,\n  },\n  {\n    name: 'BD14 4559 b',\n    radius: 13.75,\n    distance: 50,\n  },\n  {\n    name: 'BD20 2457 b',\n    radius: 12.6,\n    distance: 200,\n  },\n  {\n    name: 'BD20 2457 c',\n    radius: 12.82,\n    distance: 200,\n  },\n  {\n    name: 'beta Pic b',\n    radius: 13.07,\n    distance: 19.3,\n  },\n  {\n    name: 'CD-35 2722 b',\n    radius: 12.44,\n    distance: 21.3,\n  },\n  {\n    name: 'CFBDS 1458 b',\n    radius: 13.1,\n    distance: 23.1,\n  },\n  {\n    name: 'CHXR 73 b',\n    radius: 12.78,\n    distance: null,\n  },\n  {\n    name: 'CoRoT-1 b',\n    radius: 16.69,\n    distance: 460,\n  },\n  {\n    name: 'CoRoT-10 b',\n    radius: 10.86,\n    distance: 345,\n  },\n  {\n    name: 'CoRoT-11 b',\n    radius: 16.02,\n    distance: 560,\n  },\n  {\n    name: 'CoRoT-12 b',\n    radius: 16.13,\n    distance: 1150,\n  },\n  {\n    name: 'CoRoT-13 b',\n    radius: 9.91,\n    distance: 1310,\n  },\n  {\n    name: 'CoRoT-14 b',\n    radius: 12.21,\n    distance: 1340,\n  },\n  {\n    name: 'CoRoT-16 b',\n    radius: 13.1,\n    distance: 840,\n  },\n  {\n    name: 'CoRoT-17 b',\n    radius: 11.42,\n    distance: 920,\n  },\n  {\n    name: 'CoRoT-18 b',\n    radius: 14.67,\n    distance: 870,\n  },\n  {\n    name: 'CoRoT-19 b',\n    radius: 14.45,\n    distance: 800,\n  },\n  {\n    name: 'CoRoT-2 b',\n    radius: 16.41,\n    distance: 300,\n  },\n  {\n    name: 'CoRoT-20 b',\n    radius: 9.41,\n    distance: 1230,\n  },\n  {\n    name: 'CoRoT-21 b',\n    radius: 14.56,\n    distance: null,\n  },\n  {\n    name: 'CoRoT-23 b',\n    radius: 12.1,\n    distance: 600,\n  },\n  {\n    name: 'CoRoT-25 b',\n    radius: 12.1,\n    distance: 1000,\n  },\n  {\n    name: 'CoRoT-26 b',\n    radius: 14.11,\n    distance: 1670,\n  },\n  {\n    name: 'CoRoT-3 b',\n    radius: 11.31,\n    distance: 680,\n  },\n  {\n    name: 'CoRoT-4 b',\n    radius: 13.33,\n    distance: null,\n  },\n  {\n    name: 'CoRoT-5 b',\n    radius: 14.9,\n    distance: 400,\n  },\n  {\n    name: 'CoRoT-6 b',\n    radius: 13.06,\n    distance: null,\n  },\n  {\n    name: 'CoRoT-7 b',\n    radius: 1.67,\n    distance: 150,\n  },\n  {\n    name: 'CoRoT-7 c',\n    radius: 2.43,\n    distance: 150,\n  },\n  {\n    name: 'CoRoT-8 b',\n    radius: 6.37,\n    distance: 380,\n  },\n  {\n    name: 'CoRoT-9 b',\n    radius: 10.53,\n    distance: 460,\n  },\n  {\n    name: 'CT Cha b',\n    radius: 24.64,\n    distance: 165,\n  },\n  {\n    name: 'DH Tau b',\n    radius: 12.81,\n    distance: null,\n  },\n  {\n    name: 'DP Leo b',\n    radius: 13.07,\n    distance: null,\n  },\n  {\n    name: 'eps CrB b',\n    radius: 13.02,\n    distance: 67.9,\n  },\n  {\n    name: 'eps Eridani b',\n    radius: 13.73,\n    distance: 3.2,\n  },\n  {\n    name: 'eps Tau b',\n    radius: 13.03,\n    distance: 45,\n  },\n  {\n    name: 'Fomalhaut b',\n    radius: 13.61,\n    distance: 7.7,\n  },\n  {\n    name: 'FU Tau b',\n    radius: 12.74,\n    distance: 140,\n  },\n  {\n    name: 'gamma 1 Leo b',\n    radius: 12.97,\n    distance: 38.5,\n  },\n  {\n    name: 'gamma Cephei b',\n    radius: 13.65,\n    distance: 13.79,\n  },\n  {\n    name: 'GJ 1214 b',\n    radius: 2.67,\n    distance: 13,\n  },\n  {\n    name: 'GJ 163 b',\n    radius: 3.71,\n    distance: 15,\n  },\n  {\n    name: 'GJ 163 c',\n    radius: 2.43,\n    distance: 15,\n  },\n  {\n    name: 'Gj 163 d',\n    radius: 5.58,\n    distance: 15,\n  },\n  {\n    name: 'GJ 176 b',\n    radius: 2.43,\n    distance: 9.42,\n  },\n  {\n    name: 'GJ 3021 b',\n    radius: 13.38,\n    distance: 17.62,\n  },\n  {\n    name: 'GJ 317 b',\n    radius: 13.66,\n    distance: 15.1,\n  },\n  {\n    name: 'GJ 317 c',\n    radius: 13.61,\n    distance: 15.1,\n  },\n  {\n    name: 'GJ 328 b',\n    radius: 13.49,\n    distance: 19.8,\n  },\n  {\n    name: 'GJ 3470 b',\n    radius: 4.19,\n    distance: 30.7,\n  },\n  {\n    name: 'GJ 3634 b',\n    radius: 2.2,\n    distance: 19.8,\n  },\n  {\n    name: 'GJ 433 b',\n    radius: 2.01,\n    distance: 9.04,\n  },\n  {\n    name: 'GJ 433 c',\n    radius: 7.63,\n    distance: 9.04,\n  },\n  {\n    name: 'GJ 436 b',\n    radius: 4.09,\n    distance: 10.2,\n  },\n  {\n    name: 'GJ 504 b',\n    radius: 13.24,\n    distance: 17.56,\n  },\n  {\n    name: 'GJ 667C b',\n    radius: 1.95,\n    distance: 7.23,\n  },\n  {\n    name: 'GJ 667C c',\n    radius: 1.74,\n    distance: 7.23,\n  },\n  {\n    name: 'GJ 667C d',\n    radius: 2.19,\n    distance: 7.23,\n  },\n  {\n    name: 'GJ 667C e',\n    radius: 1.52,\n    distance: 7.23,\n  },\n  {\n    name: 'GJ 667C f',\n    radius: 1.52,\n    distance: 7.23,\n  },\n  {\n    name: 'GJ 667C g',\n    radius: 1.93,\n    distance: 7.23,\n  },\n  {\n    name: 'GJ 674 b',\n    radius: 3.62,\n    distance: 4.54,\n  },\n  {\n    name: 'GJ 676A b',\n    radius: 13.21,\n    distance: 16.45,\n  },\n  {\n    name: 'GJ 676A c',\n    radius: 13.37,\n    distance: 16.45,\n  },\n  {\n    name: 'GJ 676A d',\n    radius: 1.9,\n    distance: 16.45,\n  },\n  {\n    name: 'GJ 676A e',\n    radius: 3.87,\n    distance: 16.45,\n  },\n  {\n    name: 'GJ 832 b',\n    radius: 14.13,\n    distance: 4.94,\n  },\n  {\n    name: 'GJ 849 b',\n    radius: 13.97,\n    distance: 9.1,\n  },\n  {\n    name: 'GJ 849 c',\n    radius: 13.98,\n    distance: 9.1,\n  },\n  {\n    name: 'Gl 179 b',\n    radius: 14.02,\n    distance: 12.3,\n  },\n  {\n    name: 'Gl 581 b',\n    radius: 4.29,\n    distance: 6.21,\n  },\n  {\n    name: 'Gl 581 c',\n    radius: 1.94,\n    distance: 6.21,\n  },\n  {\n    name: 'Gl 581 d',\n    radius: 2.05,\n    distance: 6.21,\n  },\n  {\n    name: 'Gl 581 e',\n    radius: 1.27,\n    distance: 6.21,\n  },\n  {\n    name: 'Gl 649 b',\n    radius: 14.44,\n    distance: 10.34,\n  },\n  {\n    name: 'Gl 649 c',\n    radius: 3.49,\n    distance: 10.34,\n  },\n  {\n    name: 'Gl 86 b',\n    radius: 13.31,\n    distance: 10.9,\n  },\n  {\n    name: 'Gliese 876 b',\n    radius: 13.56,\n    distance: 4.7,\n  },\n  {\n    name: 'Gliese 876 c',\n    radius: 14.08,\n    distance: 4.7,\n  },\n  {\n    name: 'Gliese 876 d',\n    radius: 2.15,\n    distance: 4.7,\n  },\n  {\n    name: 'Gliese 876 e',\n    radius: 4.09,\n    distance: 4.7,\n  },\n  {\n    name: 'GQ Lup b',\n    radius: 20.16,\n    distance: 140,\n  },\n  {\n    name: 'GSC 06214-00210 b',\n    radius: 12.69,\n    distance: 145,\n  },\n  {\n    name: 'HAT-P-1 b',\n    radius: 14.77,\n    distance: 139,\n  },\n  {\n    name: 'HAT-P-11 b',\n    radius: 4.73,\n    distance: 38,\n  },\n  {\n    name: 'HAT-P-12 b',\n    radius: 10.69,\n    distance: 142.5,\n  },\n  {\n    name: 'HAT-P-13 b',\n    radius: 14.34,\n    distance: 214,\n  },\n  {\n    name: 'HAT-P-13 c',\n    radius: 12.76,\n    distance: 214,\n  },\n  {\n    name: 'HAT-P-14 b',\n    radius: 13.44,\n    distance: 205,\n  },\n  {\n    name: 'HAT-P-15 b',\n    radius: 12.01,\n    distance: 190,\n  },\n  {\n    name: 'HAT-P-16 b',\n    radius: 14.44,\n    distance: 235,\n  },\n  {\n    name: 'HAT-P-17 b',\n    radius: 11.31,\n    distance: 90,\n  },\n  {\n    name: 'HAT-P-17 c',\n    radius: 13.77,\n    distance: 90,\n  },\n  {\n    name: 'HAT-P-18 b',\n    radius: 11.09,\n    distance: 166,\n  },\n  {\n    name: 'HAT-P-19 b',\n    radius: 12.68,\n    distance: 215,\n  },\n  {\n    name: 'HAT-P-2 b',\n    radius: 10.65,\n    distance: 118,\n  },\n  {\n    name: 'HAT-P-20 b',\n    radius: 9.71,\n    distance: 70,\n  },\n  {\n    name: 'HAT-P-21 b',\n    radius: 11.47,\n    distance: 254,\n  },\n  {\n    name: 'HAT-P-22 b',\n    radius: 12.1,\n    distance: 82,\n  },\n  {\n    name: 'HAT-P-23 b',\n    radius: 15.32,\n    distance: 393,\n  },\n  {\n    name: 'HAT-P-24 b',\n    radius: 13.91,\n    distance: 306,\n  },\n  {\n    name: 'HAT-P-25 b',\n    radius: 13.33,\n    distance: 297,\n  },\n  {\n    name: 'HAT-P-26 b',\n    radius: 6.32,\n    distance: 134,\n  },\n  {\n    name: 'HAT-P-27-WASP-40 b',\n    radius: 11.82,\n    distance: 204,\n  },\n  {\n    name: 'HAT-P-28 b',\n    radius: 13.57,\n    distance: 395,\n  },\n  {\n    name: 'HAT-P-29 b',\n    radius: 12.4,\n    distance: 322,\n  },\n  {\n    name: 'HAT-P-3 b',\n    radius: 9.26,\n    distance: 130,\n  },\n  {\n    name: 'HAT-P-30-WASP-51 b',\n    radius: 15.01,\n    distance: 193,\n  },\n  {\n    name: 'HAT-P-31 b',\n    radius: 11.98,\n    distance: 354,\n  },\n  {\n    name: 'HAT-P-32 b',\n    radius: 22.81,\n    distance: 320,\n  },\n  {\n    name: 'HAT-P-33 b',\n    radius: 20.46,\n    distance: 419,\n  },\n  {\n    name: 'HAT-P-34 b',\n    radius: 12.4,\n    distance: 257,\n  },\n  {\n    name: 'HAT-P-35 b',\n    radius: 14.92,\n    distance: 535,\n  },\n  {\n    name: 'HAT-P-36 b',\n    radius: 14.16,\n    distance: 317,\n  },\n  {\n    name: 'HAT-P-37 b',\n    radius: 13.19,\n    distance: 411,\n  },\n  {\n    name: 'HAT-P-38 b',\n    radius: 9.24,\n    distance: 249,\n  },\n  {\n    name: 'HAT-P-39 b',\n    radius: 17.6,\n    distance: 642,\n  },\n  {\n    name: 'HAT-P-4 b',\n    radius: 14.22,\n    distance: 310,\n  },\n  {\n    name: 'HAT-P-40 b',\n    radius: 19.38,\n    distance: 501,\n  },\n  {\n    name: 'HAT-P-41 b',\n    radius: 17.12,\n    distance: 311,\n  },\n  {\n    name: 'HAT-P-42 b',\n    radius: 14.3,\n    distance: 447,\n  },\n  {\n    name: 'HAT-P-43 b',\n    radius: 14.37,\n    distance: 543,\n  },\n  {\n    name: 'HAT-P-44 b',\n    radius: 14.34,\n    distance: 374,\n  },\n  {\n    name: 'HAT-P-44 c',\n    radius: 13.65,\n    distance: 374,\n  },\n  {\n    name: 'HAT-P-45 b',\n    radius: 15.97,\n    distance: 305,\n  },\n  {\n    name: 'HAT-P-46 b',\n    radius: 14.38,\n    distance: 296,\n  },\n  {\n    name: 'HAT-P-46 c',\n    radius: 13.55,\n    distance: 296,\n  },\n  {\n    name: 'HAT-P-5 b',\n    radius: 14.02,\n    distance: 340,\n  },\n  {\n    name: 'HAT-P-6 b',\n    radius: 14.9,\n    distance: 200,\n  },\n  {\n    name: 'HAT-P-7 b',\n    radius: 15.92,\n    distance: 320,\n  },\n  {\n    name: 'HAT-P-8 b',\n    radius: 16.8,\n    distance: 230,\n  },\n  {\n    name: 'HAT-P-9 b',\n    radius: 15.68,\n    distance: 480,\n  },\n  {\n    name: 'HATS-1 b',\n    radius: 14.58,\n    distance: 303,\n  },\n  {\n    name: 'HATS-2 b',\n    radius: 13.08,\n    distance: 360,\n  },\n  {\n    name: 'HATS-3 b',\n    radius: 15.47,\n    distance: 453,\n  },\n  {\n    name: 'HD 100655 b',\n    radius: 13.69,\n    distance: 122,\n  },\n  {\n    name: 'HD 100777 b',\n    radius: 13.86,\n    distance: 52.8,\n  },\n  {\n    name: 'HD 10180 c',\n    radius: 3.85,\n    distance: 39.4,\n  },\n  {\n    name: 'HD 10180 d',\n    radius: 3.62,\n    distance: 39.4,\n  },\n  {\n    name: 'HD 10180 e',\n    radius: 5.54,\n    distance: 39.4,\n  },\n  {\n    name: 'HD 10180 f',\n    radius: 5.39,\n    distance: 39.4,\n  },\n  {\n    name: 'HD 10180 g',\n    radius: 5.06,\n    distance: 39.4,\n  },\n  {\n    name: 'HD 10180 h',\n    radius: 9.38,\n    distance: 39.4,\n  },\n  {\n    name: 'HD 101930 b',\n    radius: 11.69,\n    distance: 30.49,\n  },\n  {\n    name: 'HD 102117 b',\n    radius: 8.56,\n    distance: 42,\n  },\n  {\n    name: 'HD 102195 b',\n    radius: 14.3,\n    distance: 28.98,\n  },\n  {\n    name: 'HD 102272 b',\n    radius: 13.14,\n    distance: 360,\n  },\n  {\n    name: 'HD 102272 c',\n    radius: 13.5,\n    distance: 360,\n  },\n  {\n    name: 'HD 102329 b',\n    radius: 13.14,\n    distance: 158,\n  },\n  {\n    name: 'HD 102365 b',\n    radius: 4.29,\n    distance: 9.24,\n  },\n  {\n    name: 'HD 102956 b',\n    radius: 13.94,\n    distance: 126,\n  },\n  {\n    name: 'HD 103197 b',\n    radius: 6.25,\n    distance: 49.3,\n  },\n  {\n    name: 'HD 103774 b',\n    radius: 14.32,\n    distance: 55,\n  },\n  {\n    name: 'HD 104067 b',\n    radius: 8.95,\n    distance: 20.8,\n  },\n  {\n    name: 'HD 104985 b',\n    radius: 13.11,\n    distance: 102,\n  },\n  {\n    name: 'HD 106252 b',\n    radius: 13.03,\n    distance: 37.44,\n  },\n  {\n    name: 'HD 106270 b',\n    radius: 12.87,\n    distance: 84.9,\n  },\n  {\n    name: 'HD 10647 b',\n    radius: 13.96,\n    distance: 17.3,\n  },\n  {\n    name: 'HD 106515A b',\n    radius: 12.87,\n    distance: 35.2,\n  },\n  {\n    name: 'HD 10697 b',\n    radius: 13.11,\n    distance: 32.56,\n  },\n  {\n    name: 'HD 107148 b',\n    radius: 9.57,\n    distance: 51.3,\n  },\n  {\n    name: 'HD 108147 b',\n    radius: 10.81,\n    distance: 38.57,\n  },\n  {\n    name: 'HD 108863 b',\n    radius: 13.5,\n    distance: 139,\n  },\n  {\n    name: 'HD 108874 b',\n    radius: 13.79,\n    distance: 68.5,\n  },\n  {\n    name: 'HD 108874 c',\n    radius: 13.92,\n    distance: 68.5,\n  },\n  {\n    name: 'HD 109246 b',\n    radius: 14.05,\n    distance: 65.6,\n  },\n  {\n    name: 'HD 109271 b',\n    radius: 4.85,\n    distance: 62,\n  },\n  {\n    name: 'HD 109271 c',\n    radius: 5.87,\n    distance: 62,\n  },\n  {\n    name: 'HD 109749 b',\n    radius: 11.25,\n    distance: 59,\n  },\n  {\n    name: 'HD 110014 b',\n    radius: 12.87,\n    distance: 90,\n  },\n  {\n    name: 'HD 111232 b',\n    radius: 13.08,\n    distance: 29,\n  },\n  {\n    name: 'HD 113337 b',\n    radius: 13.4,\n    distance: 36.9,\n  },\n  {\n    name: 'HD 113538 b',\n    radius: 11.02,\n    distance: 15.8,\n  },\n  {\n    name: 'HD 113538 c',\n    radius: 14.08,\n    distance: 15.8,\n  },\n  {\n    name: 'HD 114386 b',\n    radius: 13.83,\n    distance: 28,\n  },\n  {\n    name: 'HD 114386 c',\n    radius: 13.78,\n    distance: 28,\n  },\n  {\n    name: 'HD 114729 b',\n    radius: 14.01,\n    distance: 35,\n  },\n  {\n    name: 'HD 114762 b',\n    radius: 12.87,\n    distance: 39.46,\n  },\n  {\n    name: 'HD 114783 b',\n    radius: 13.93,\n    distance: 20.4,\n  },\n  {\n    name: 'HD 11506 b',\n    radius: 13.37,\n    distance: 53.82,\n  },\n  {\n    name: 'HD 11506 c',\n    radius: 14.02,\n    distance: 53.82,\n  },\n  {\n    name: 'HD 116029 b',\n    radius: 13.59,\n    distance: 123.2,\n  },\n  {\n    name: 'HD 117207 b',\n    radius: 13.6,\n    distance: 33,\n  },\n  {\n    name: 'HD 117618 b',\n    radius: 8.73,\n    distance: 38,\n  },\n  {\n    name: 'HD 117618 c',\n    radius: 10.1,\n    distance: 38,\n  },\n  {\n    name: 'HD 118203 b',\n    radius: 13.59,\n    distance: 88.6,\n  },\n  {\n    name: 'HD 11964 b',\n    radius: 14.14,\n    distance: 33.98,\n  },\n  {\n    name: 'HD 11964 c',\n    radius: 5.54,\n    distance: 33.98,\n  },\n  {\n    name: 'HD 11977 b',\n    radius: 13.09,\n    distance: 66.5,\n  },\n  {\n    name: 'HD 120084 b',\n    radius: 13.19,\n    distance: 97.7,\n  },\n  {\n    name: 'HD 121504 b',\n    radius: 13.84,\n    distance: 44.37,\n  },\n  {\n    name: 'HD 122430 b',\n    radius: 13.34,\n    distance: 135,\n  },\n  {\n    name: 'HD 125595 b',\n    radius: 3.89,\n    distance: 27.4,\n  },\n  {\n    name: 'HD 125612 b',\n    radius: 13.43,\n    distance: 52.82,\n  },\n  {\n    name: 'HD 125612 c',\n    radius: 4.66,\n    distance: 52.82,\n  },\n  {\n    name: 'HD 125612 d',\n    radius: 13.05,\n    distance: 52.82,\n  },\n  {\n    name: 'HD 126525 b',\n    radius: 9.93,\n    distance: 38.1,\n  },\n  {\n    name: 'HD 12661 b',\n    radius: 13.55,\n    distance: 37.16,\n  },\n  {\n    name: 'HD 12661 c',\n    radius: 13.72,\n    distance: 37.16,\n  },\n  {\n    name: 'HD 126614 b',\n    radius: 14.37,\n    distance: 72.4,\n  },\n  {\n    name: 'HD 128311 b',\n    radius: 13.57,\n    distance: 16.6,\n  },\n  {\n    name: 'HD 128311 c',\n    radius: 13.4,\n    distance: 16.6,\n  },\n  {\n    name: 'HD 129445 b',\n    radius: 13.71,\n    distance: 67.61,\n  },\n  {\n    name: 'HD 130322 b',\n    radius: 13.92,\n    distance: 30,\n  },\n  {\n    name: 'HD 131496 b',\n    radius: 13.57,\n    distance: 110,\n  },\n  {\n    name: 'HD 13189 b',\n    radius: 12.77,\n    distance: 185,\n  },\n  {\n    name: 'HD 132406 b',\n    radius: 13.16,\n    distance: 71,\n  },\n  {\n    name: 'HD 132563B b',\n    radius: 13.75,\n    distance: 96,\n  },\n  {\n    name: 'HD 134060 b',\n    radius: 3.52,\n    distance: 24.2,\n  },\n  {\n    name: 'HD 134060 c',\n    radius: 7.95,\n    distance: 24.2,\n  },\n  {\n    name: 'HD 134606 b',\n    radius: 2.57,\n    distance: 26.5,\n  },\n  {\n    name: 'HD 134606 c',\n    radius: 3.69,\n    distance: 26.5,\n  },\n  {\n    name: 'HD 134606 d',\n    radius: 7.03,\n    distance: 26.5,\n  },\n  {\n    name: 'HD 134987 b',\n    radius: 13.72,\n    distance: 22.2,\n  },\n  {\n    name: 'HD 134987 c',\n    radius: 14.02,\n    distance: 22.2,\n  },\n  {\n    name: 'HD 136352 b',\n    radius: 1.92,\n    distance: 14.8,\n  },\n  {\n    name: 'HD 136352 c',\n    radius: 3.56,\n    distance: 14.8,\n  },\n  {\n    name: 'HD 136352 d',\n    radius: 3.22,\n    distance: 14.8,\n  },\n  {\n    name: 'HD 136418 b',\n    radius: 13.61,\n    distance: 98.2,\n  },\n  {\n    name: 'HD 137388 b',\n    radius: 9.9,\n    distance: 38,\n  },\n  {\n    name: 'HD 13808 b',\n    radius: 3.37,\n    distance: 28.6,\n  },\n  {\n    name: 'HD 13808 c',\n    radius: 3.57,\n    distance: 28.6,\n  },\n  {\n    name: 'HD 13908 b',\n    radius: 13.93,\n    distance: 71.2,\n  },\n  {\n    name: 'HD 13908 c',\n    radius: 13.14,\n    distance: 71.2,\n  },\n  {\n    name: 'HD 13931 b',\n    radius: 13.64,\n    distance: 44.2,\n  },\n  {\n    name: 'HD 139357 b',\n    radius: 12.92,\n    distance: 121.4,\n  },\n  {\n    name: 'HD 141937 b',\n    radius: 12.93,\n    distance: 33.46,\n  },\n  {\n    name: 'HD 142 b',\n    radius: 13.82,\n    distance: 20.6,\n  },\n  {\n    name: 'HD 142 c',\n    radius: 13.19,\n    distance: 20.6,\n  },\n  {\n    name: 'HD 142022 A b',\n    radius: 13.2,\n    distance: 35.87,\n  },\n  {\n    name: 'HD 142245 b',\n    radius: 13.64,\n    distance: 109.5,\n  },\n  {\n    name: 'HD 142415 b',\n    radius: 13.71,\n    distance: 34.2,\n  },\n  {\n    name: 'HD 143361 b',\n    radius: 13.42,\n    distance: 59.35,\n  },\n  {\n    name: 'HD 145377 b',\n    radius: 13.15,\n    distance: 57.7,\n  },\n  {\n    name: 'HD 145457 b',\n    radius: 13.45,\n    distance: 126,\n  },\n  {\n    name: 'HD 1461 b',\n    radius: 2.3,\n    distance: 23.4,\n  },\n  {\n    name: 'HD 1461 c',\n    radius: 2.03,\n    distance: 23.4,\n  },\n  {\n    name: 'HD 147018 b',\n    radius: 13.59,\n    distance: 42.96,\n  },\n  {\n    name: 'HD 147018 c',\n    radius: 13.09,\n    distance: 42.96,\n  },\n  {\n    name: 'HD 147513 b',\n    radius: 13.84,\n    distance: 12.9,\n  },\n  {\n    name: 'HD 148156 b',\n    radius: 14,\n    distance: 53.05,\n  },\n  {\n    name: 'HD 148427 b',\n    radius: 13.94,\n    distance: 59.3,\n  },\n  {\n    name: 'HD 149026 b',\n    radius: 8.04,\n    distance: 78.9,\n  },\n  {\n    name: 'HD 149143 b',\n    radius: 13.79,\n    distance: 63,\n  },\n  {\n    name: 'HD 1502 b',\n    radius: 13.42,\n    distance: 159,\n  },\n  {\n    name: 'HD 150433 b',\n    radius: 8.45,\n    distance: 29.6,\n  },\n  {\n    name: 'HD 150706 b',\n    radius: 13.48,\n    distance: 27.2,\n  },\n  {\n    name: 'HD 152079 b',\n    radius: 13.43,\n    distance: 85.17,\n  },\n  {\n    name: 'HD 152581 b',\n    radius: 13.74,\n    distance: 186,\n  },\n  {\n    name: 'HD 153950 b',\n    radius: 13.48,\n    distance: 49.6,\n  },\n  {\n    name: 'HD 154088 b',\n    radius: 2.06,\n    distance: 17.8,\n  },\n  {\n    name: 'HD 154345 b',\n    radius: 13.93,\n    distance: 18.06,\n  },\n  {\n    name: 'HD 154672 b',\n    radius: 13.21,\n    distance: 65.8,\n  },\n  {\n    name: 'HD 154857 b',\n    radius: 13.66,\n    distance: 68.5,\n  },\n  {\n    name: 'HD 155358 b',\n    radius: 14,\n    distance: 43,\n  },\n  {\n    name: 'HD 155358 c',\n    radius: 14.02,\n    distance: 43,\n  },\n  {\n    name: 'HD 156279 b',\n    radius: 12.93,\n    distance: 36.6,\n  },\n  {\n    name: 'HD 156411 b',\n    radius: 14.06,\n    distance: 55.1,\n  },\n  {\n    name: 'HD 156668 b',\n    radius: 1.72,\n    distance: 24.5,\n  },\n  {\n    name: 'HD 157172 b',\n    radius: 7,\n    distance: 31.9,\n  },\n  {\n    name: 'HD 158038 b',\n    radius: 13.66,\n    distance: 103.6,\n  },\n  {\n    name: 'HD 159243 b',\n    radius: 13.81,\n    distance: 69.2,\n  },\n  {\n    name: 'HD 159243 c',\n    radius: 13.57,\n    distance: 69.2,\n  },\n  {\n    name: 'HD 159868 b',\n    radius: 13.59,\n    distance: 52.7,\n  },\n  {\n    name: 'HD 159868 c',\n    radius: 14.07,\n    distance: 52.7,\n  },\n  {\n    name: 'HD 16141 b',\n    radius: 9.7,\n    distance: 35.9,\n  },\n  {\n    name: 'HD 16175 b',\n    radius: 13.27,\n    distance: 59.8,\n  },\n  {\n    name: 'HD 162020 b',\n    radius: 12.76,\n    distance: 31.26,\n  },\n  {\n    name: 'HD 163607 b',\n    radius: 14.05,\n    distance: 69,\n  },\n  {\n    name: 'HD 163607 c',\n    radius: 13.55,\n    distance: 69,\n  },\n  {\n    name: 'HD 16417 b',\n    radius: 5.13,\n    distance: 25.5,\n  },\n  {\n    name: 'HD 164509 b',\n    radius: 14.26,\n    distance: 52,\n  },\n  {\n    name: 'HD 164604 b',\n    radius: 13.48,\n    distance: 38,\n  },\n  {\n    name: 'HD 164922 b',\n    radius: 14.4,\n    distance: 21.93,\n  },\n  {\n    name: 'HD 166724 b',\n    radius: 13.3,\n    distance: 42.3,\n  },\n  {\n    name: 'HD 167042 b',\n    radius: 13.71,\n    distance: 50,\n  },\n  {\n    name: 'HD 168443 b',\n    radius: 13.03,\n    distance: 37.38,\n  },\n  {\n    name: 'HD 168443 c',\n    radius: 12.69,\n    distance: 37.38,\n  },\n  {\n    name: 'HD 168746 b',\n    radius: 10.07,\n    distance: 43.12,\n  },\n  {\n    name: 'HD 1690 b',\n    radius: 13.12,\n    distance: 319,\n  },\n  {\n    name: 'HD 169830 b',\n    radius: 13.45,\n    distance: 36.32,\n  },\n  {\n    name: 'HD 169830 c',\n    radius: 13.3,\n    distance: 36.32,\n  },\n  {\n    name: 'HD 170469 b',\n    radius: 14.11,\n    distance: 64.97,\n  },\n  {\n    name: 'HD 17092 b',\n    radius: 13.25,\n    distance: 109,\n  },\n  {\n    name: 'HD 171028 b',\n    radius: 13.62,\n    distance: 90,\n  },\n  {\n    name: 'HD 171238 b',\n    radius: 13.5,\n    distance: 50.28,\n  },\n  {\n    name: 'HD 17156 b',\n    radius: 12.26,\n    distance: 78.24,\n  },\n  {\n    name: 'HD 173416 b',\n    radius: 13.48,\n    distance: 135,\n  },\n  {\n    name: 'HD 175167 b',\n    radius: 13.02,\n    distance: 67.02,\n  },\n  {\n    name: 'HD 175541 b',\n    radius: 14.15,\n    distance: 128,\n  },\n  {\n    name: 'HD 176051 b',\n    radius: 13.74,\n    distance: 14.99,\n  },\n  {\n    name: 'HD 177830 b',\n    radius: 13.75,\n    distance: 59,\n  },\n  {\n    name: 'HD 177830 c',\n    radius: 7.93,\n    distance: 59,\n  },\n  {\n    name: 'HD 178911 B b',\n    radius: 13.11,\n    distance: 46.73,\n  },\n  {\n    name: 'HD 179079 b',\n    radius: 5.58,\n    distance: 63.69,\n  },\n  {\n    name: 'HD 179949 b',\n    radius: 13.95,\n    distance: 27,\n  },\n  {\n    name: 'HD 180314 b',\n    radius: 12.58,\n    distance: 132,\n  },\n  {\n    name: 'HD 180902 b',\n    radius: 13.71,\n    distance: 110,\n  },\n  {\n    name: 'HD 181342 b',\n    radius: 13.39,\n    distance: 110.6,\n  },\n  {\n    name: 'HD 181433 b',\n    radius: 2.3,\n    distance: 26.15,\n  },\n  {\n    name: 'HD 181433 c',\n    radius: 14.13,\n    distance: 26.15,\n  },\n  {\n    name: 'HD 181433 d',\n    radius: 14.21,\n    distance: 26.15,\n  },\n  {\n    name: 'HD 181720 b',\n    radius: 14.39,\n    distance: 56,\n  },\n  {\n    name: 'HD 183263 b',\n    radius: 13.35,\n    distance: 53,\n  },\n  {\n    name: 'HD 183263 c',\n    radius: 13.33,\n    distance: 53,\n  },\n  {\n    name: 'HD 185269 b',\n    radius: 13.95,\n    distance: 47,\n  },\n  {\n    name: 'HD 187085 b',\n    radius: 14.06,\n    distance: 44.98,\n  },\n  {\n    name: 'HD 187123 b',\n    radius: 14.23,\n    distance: 50,\n  },\n  {\n    name: 'HD 187123 c',\n    radius: 13.62,\n    distance: 50,\n  },\n  {\n    name: 'HD 18742 b',\n    radius: 13.48,\n    distance: 135,\n  },\n  {\n    name: 'HD 188015 b',\n    radius: 13.82,\n    distance: 52.6,\n  },\n  {\n    name: 'HD 189567 b',\n    radius: 3.32,\n    distance: 17.7,\n  },\n  {\n    name: 'HD 189733 b',\n    radius: 12.75,\n    distance: 19.3,\n  },\n  {\n    name: 'HD 190360 b',\n    radius: 13.74,\n    distance: 15.89,\n  },\n  {\n    name: 'HD 190360 c',\n    radius: 4.61,\n    distance: 15.89,\n  },\n  {\n    name: 'HD 190647 b',\n    radius: 13.64,\n    distance: 54.2,\n  },\n  {\n    name: 'HD 190984 b',\n    radius: 13.42,\n    distance: 103,\n  },\n  {\n    name: 'HD 192263 b',\n    radius: 14.07,\n    distance: 19.9,\n  },\n  {\n    name: 'HD 192310 b',\n    radius: 4.43,\n    distance: 8.82,\n  },\n  {\n    name: 'HD 192310 c',\n    radius: 5.38,\n    distance: 8.82,\n  },\n  {\n    name: 'HD 192699 b',\n    radius: 13.51,\n    distance: 67,\n  },\n  {\n    name: 'HD 195019 b',\n    radius: 13.34,\n    distance: 37.36,\n  },\n  {\n    name: 'HD 196050 b',\n    radius: 13.46,\n    distance: 46.9,\n  },\n  {\n    name: 'HD 196067 b',\n    radius: 13.01,\n    distance: 44.3,\n  },\n  {\n    name: 'HD 196885 A b',\n    radius: 13.44,\n    distance: 33,\n  },\n  {\n    name: 'HD 197037 b',\n    radius: 14.03,\n    distance: 33,\n  },\n  {\n    name: 'HD 19994 b',\n    radius: 13.69,\n    distance: 22.38,\n  },\n  {\n    name: 'HD 20003 b',\n    radius: 3.67,\n    distance: 43.8,\n  },\n  {\n    name: 'HD 20003 c',\n    radius: 3.9,\n    distance: 43.8,\n  },\n  {\n    name: 'HD 200964 b',\n    radius: 13.65,\n    distance: 68.4,\n  },\n  {\n    name: 'HD 200964 c',\n    radius: 13.97,\n    distance: 68.4,\n  },\n  {\n    name: 'HD 202206 b',\n    radius: 12.68,\n    distance: 46.34,\n  },\n  {\n    name: 'HD 202206 c',\n    radius: 13.52,\n    distance: 46.34,\n  },\n  {\n    name: 'HD 20367 b',\n    radius: 13.9,\n    distance: 27,\n  },\n  {\n    name: 'HD 2039 b',\n    radius: 13.22,\n    distance: 89.8,\n  },\n  {\n    name: 'HD 204313 b',\n    radius: 13.36,\n    distance: 47.37,\n  },\n  {\n    name: 'HD 204313 c',\n    radius: 4.48,\n    distance: 47.37,\n  },\n  {\n    name: 'HD 204313 d',\n    radius: 13.69,\n    distance: 47.37,\n  },\n  {\n    name: 'HD 204941 b',\n    radius: 10.93,\n    distance: 27,\n  },\n  {\n    name: 'HD 205739 b',\n    radius: 13.78,\n    distance: 90.3,\n  },\n  {\n    name: 'HD 206610 b',\n    radius: 13.57,\n    distance: 194,\n  },\n  {\n    name: 'HD 20781 b',\n    radius: 3.67,\n    distance: 35.4,\n  },\n  {\n    name: 'HD 20781 c',\n    radius: 4.27,\n    distance: 35.4,\n  },\n  {\n    name: 'HD 20782 b',\n    radius: 13.64,\n    distance: 36.02,\n  },\n  {\n    name: 'HD 207832 b',\n    radius: 14.13,\n    distance: 54.4,\n  },\n  {\n    name: 'HD 207832 c',\n    radius: 14,\n    distance: 54.4,\n  },\n  {\n    name: 'HD 20794 b',\n    radius: 1.44,\n    distance: 6.06,\n  },\n  {\n    name: 'HD 20794 c',\n    radius: 1.38,\n    distance: 6.06,\n  },\n  {\n    name: 'HD 20794 d',\n    radius: 1.83,\n    distance: 6.06,\n  },\n  {\n    name: 'HD 208487 b',\n    radius: 14.34,\n    distance: 45,\n  },\n  {\n    name: 'HD 208527 b',\n    radius: 12.86,\n    distance: 320.2,\n  },\n  {\n    name: 'HD 20868 b',\n    radius: 13.62,\n    distance: 48.9,\n  },\n  {\n    name: 'HD 209458 b',\n    radius: 15.46,\n    distance: 47,\n  },\n  {\n    name: 'HD 210277 b',\n    radius: 13.83,\n    distance: 21.29,\n  },\n  {\n    name: 'HD 210702 b',\n    radius: 13.64,\n    distance: 56,\n  },\n  {\n    name: 'HD 212301 b',\n    radius: 14.3,\n    distance: 52.7,\n  },\n  {\n    name: 'HD 212771 b',\n    radius: 13.55,\n    distance: 131,\n  },\n  {\n    name: 'HD 213240 b',\n    radius: 13.26,\n    distance: 40.75,\n  },\n  {\n    name: 'HD 215152 b',\n    radius: 1.45,\n    distance: 21.5,\n  },\n  {\n    name: 'HD 215152 c',\n    radius: 1.52,\n    distance: 21.5,\n  },\n  {\n    name: 'HD 215456 b',\n    radius: 6.35,\n    distance: 38,\n  },\n  {\n    name: 'HD 215456 c',\n    radius: 10.46,\n    distance: 38,\n  },\n  {\n    name: 'HD 215497 b',\n    radius: 2.1,\n    distance: 44,\n  },\n  {\n    name: 'HD 215497 c',\n    radius: 14.44,\n    distance: 44,\n  },\n  {\n    name: 'HD 216435 b',\n    radius: 13.82,\n    distance: 33.3,\n  },\n  {\n    name: 'HD 216437 b',\n    radius: 13.66,\n    distance: 26.5,\n  },\n  {\n    name: 'HD 216770 b',\n    radius: 14.12,\n    distance: 38,\n  },\n  {\n    name: 'HD 21693 b',\n    radius: 3.35,\n    distance: 32.4,\n  },\n  {\n    name: 'HD 21693 c',\n    radius: 4.95,\n    distance: 32.4,\n  },\n  {\n    name: 'HD 217107 b',\n    radius: 13.8,\n    distance: 19.72,\n  },\n  {\n    name: 'HD 217107 c',\n    radius: 13.52,\n    distance: 19.72,\n  },\n  {\n    name: 'HD 217786 b',\n    radius: 12.8,\n    distance: 54.8,\n  },\n  {\n    name: 'HD 218566 b',\n    radius: 9.57,\n    distance: 29.94,\n  },\n  {\n    name: 'HD 219077 b',\n    radius: 12.84,\n    distance: 29.35,\n  },\n  {\n    name: 'HD 219415 b',\n    radius: 13.86,\n    distance: null,\n  },\n  {\n    name: 'HD 219828 b',\n    radius: 5.01,\n    distance: 81.1,\n  },\n  {\n    name: 'HD 220074 b',\n    radius: 12.81,\n    distance: 290.2,\n  },\n  {\n    name: 'HD 220689 b',\n    radius: 13.83,\n    distance: 44.6,\n  },\n  {\n    name: 'HD 220773 b',\n    radius: 13.76,\n    distance: 49,\n  },\n  {\n    name: 'HD 221287 b',\n    radius: 13.42,\n    distance: 52.9,\n  },\n  {\n    name: 'HD 222155 b',\n    radius: 13.64,\n    distance: 49.1,\n  },\n  {\n    name: 'HD 222582 b',\n    radius: 13.02,\n    distance: 42,\n  },\n  {\n    name: 'HD 224693 b',\n    radius: 14.08,\n    distance: 94,\n  },\n  {\n    name: 'HD 22781 b',\n    radius: 12.78,\n    distance: 31.79,\n  },\n  {\n    name: 'HD 23079 b',\n    radius: 13.51,\n    distance: 34.8,\n  },\n  {\n    name: 'HD 23127 b',\n    radius: 13.74,\n    distance: 89.1,\n  },\n  {\n    name: 'HD 231701 b',\n    radius: 13.89,\n    distance: 108.4,\n  },\n  {\n    name: 'HD 233604 b',\n    radius: 13.03,\n    distance: null,\n  },\n  {\n    name: 'HD 23596 b',\n    radius: 13,\n    distance: 52,\n  },\n  {\n    name: 'HD 240210 b',\n    radius: 13.07,\n    distance: 143,\n  },\n  {\n    name: 'HD 240237 b',\n    radius: 13.19,\n    distance: 1500,\n  },\n  {\n    name: 'HD 24040 b',\n    radius: 13.31,\n    distance: 46.51,\n  },\n  {\n    name: 'HD 25171 b',\n    radius: 13.95,\n    distance: 55,\n  },\n  {\n    name: 'HD 2638 b',\n    radius: 14.26,\n    distance: 53.71,\n  },\n  {\n    name: 'HD 27442 b',\n    radius: 13.79,\n    distance: 18.1,\n  },\n  {\n    name: 'HD 27631 b',\n    radius: 13.69,\n    distance: 45.5,\n  },\n  {\n    name: 'HD 27894 b',\n    radius: 14.15,\n    distance: 42.37,\n  },\n  {\n    name: 'HD 28185 b',\n    radius: 13.15,\n    distance: 39.4,\n  },\n  {\n    name: 'HD 28254 b',\n    radius: 13.86,\n    distance: 56.2,\n  },\n  {\n    name: 'HD 285507 b',\n    radius: 13.9,\n    distance: 41.3,\n  },\n  {\n    name: 'HD 28678 b',\n    radius: 13.69,\n    distance: 227,\n  },\n  {\n    name: 'HD 290327 b',\n    radius: 13.51,\n    distance: 54.9,\n  },\n  {\n    name: 'HD 2952 b',\n    radius: 13.65,\n    distance: 115.2,\n  },\n  {\n    name: 'HD 30177 b',\n    radius: 13.02,\n    distance: 55,\n  },\n  {\n    name: 'HD 30562 b',\n    radius: 13.81,\n    distance: 26.5,\n  },\n  {\n    name: 'HD 30856 b',\n    radius: 13.66,\n    distance: 118.1,\n  },\n  {\n    name: 'HD 31253 b',\n    radius: 14.25,\n    distance: 53.82,\n  },\n  {\n    name: 'HD 31527 b',\n    radius: 3.58,\n    distance: 38.6,\n  },\n  {\n    name: 'HD 31527 c',\n    radius: 4.28,\n    distance: 38.6,\n  },\n  {\n    name: 'HD 31527 d',\n    radius: 4.38,\n    distance: 38.6,\n  },\n  {\n    name: 'HD 32518 b',\n    radius: 13.43,\n    distance: 117.4,\n  },\n  {\n    name: 'HD 330075 b',\n    radius: 14.15,\n    distance: 50.2,\n  },\n  {\n    name: 'HD 33142 b',\n    radius: 13.81,\n    distance: 126,\n  },\n  {\n    name: 'HD 33283 b',\n    radius: 14.44,\n    distance: 86,\n  },\n  {\n    name: 'HD 33564 b',\n    radius: 12.95,\n    distance: 20.98,\n  },\n  {\n    name: 'HD 34445 b',\n    radius: 14.03,\n    distance: 46.5,\n  },\n  {\n    name: 'HD 3651 b',\n    radius: 9.32,\n    distance: 11,\n  },\n  {\n    name: 'HD 3651 c',\n    radius: 6.46,\n    distance: 11,\n  },\n  {\n    name: 'HD 37124 b',\n    radius: 14.11,\n    distance: 33,\n  },\n  {\n    name: 'HD 37124 c',\n    radius: 14.12,\n    distance: 33,\n  },\n  {\n    name: 'HD 37124 d',\n    radius: 14.09,\n    distance: 33,\n  },\n  {\n    name: 'HD 37605 b',\n    radius: 13.46,\n    distance: 44,\n  },\n  {\n    name: 'HD 37605 c',\n    radius: 13.32,\n    distance: 44,\n  },\n  {\n    name: 'HD 38283 b',\n    radius: 14.43,\n    distance: 37.7,\n  },\n  {\n    name: 'HD 38529 b',\n    radius: 14.04,\n    distance: 39.28,\n  },\n  {\n    name: 'HD 38529 c',\n    radius: 12.67,\n    distance: 39.28,\n  },\n  {\n    name: 'HD 38801 b',\n    radius: 12.89,\n    distance: 99.4,\n  },\n  {\n    name: 'HD 38858 b',\n    radius: 6.18,\n    distance: 15.2,\n  },\n  {\n    name: 'HD 39091 b',\n    radius: 12.9,\n    distance: 18.32,\n  },\n  {\n    name: 'HD 39194 b',\n    radius: 1.64,\n    distance: 25.9,\n  },\n  {\n    name: 'HD 39194 c',\n    radius: 2.03,\n    distance: 25.9,\n  },\n  {\n    name: 'HD 39194 d',\n    radius: 1.9,\n    distance: 25.9,\n  },\n  {\n    name: 'HD 40307 b',\n    radius: 1.69,\n    distance: 12.8,\n  },\n  {\n    name: 'HD 40307 c',\n    radius: 2.14,\n    distance: 12.8,\n  },\n  {\n    name: 'HD 40307 d',\n    radius: 3.21,\n    distance: 12.8,\n  },\n  {\n    name: 'HD 40307 e',\n    radius: 1.7,\n    distance: 12.8,\n  },\n  {\n    name: 'HD 40307 f',\n    radius: 2.04,\n    distance: 12.8,\n  },\n  {\n    name: 'HD 40307 g',\n    radius: 2.39,\n    distance: 12.8,\n  },\n  {\n    name: 'HD 40979 b',\n    radius: 13.39,\n    distance: 33.3,\n  },\n  {\n    name: 'HD 41004 A b',\n    radius: 13.51,\n    distance: 42.5,\n  },\n  {\n    name: 'HD 41004 B b',\n    radius: 12.66,\n    distance: 43.03,\n  },\n  {\n    name: 'HD 4113 b',\n    radius: 13.72,\n    distance: 44,\n  },\n  {\n    name: 'HD 41248 b',\n    radius: 4.03,\n    distance: 52.38,\n  },\n  {\n    name: 'HD 41248 c',\n    radius: 3.3,\n    distance: 52.38,\n  },\n  {\n    name: 'HD 4203 b',\n    radius: 13.6,\n    distance: 77.5,\n  },\n  {\n    name: 'HD 4208 b',\n    radius: 14.03,\n    distance: 33.9,\n  },\n  {\n    name: 'HD 4308 b',\n    radius: 3.81,\n    distance: 21.9,\n  },\n  {\n    name: 'HD 4313 b',\n    radius: 13.55,\n    distance: 137,\n  },\n  {\n    name: 'HD 43197 b',\n    radius: 14.16,\n    distance: 54.9,\n  },\n  {\n    name: 'HD 43691 b',\n    radius: 13.52,\n    distance: 93.2,\n  },\n  {\n    name: 'HD 44219 b',\n    radius: 14.18,\n    distance: 50.43,\n  },\n  {\n    name: 'HD 45184 b',\n    radius: 3.78,\n    distance: 21.9,\n  },\n  {\n    name: 'HD 45350 b',\n    radius: 13.66,\n    distance: 49,\n  },\n  {\n    name: 'HD 45364 b',\n    radius: 8.98,\n    distance: 32.6,\n  },\n  {\n    name: 'HD 45364 c',\n    radius: 14.12,\n    distance: 32.6,\n  },\n  {\n    name: 'HD 45652 b',\n    radius: 14.27,\n    distance: 36,\n  },\n  {\n    name: 'HD 46375 b',\n    radius: 10.53,\n    distance: 33.4,\n  },\n  {\n    name: 'HD 47186 b',\n    radius: 5.24,\n    distance: 37.84,\n  },\n  {\n    name: 'HD 47186 c',\n    radius: 14.41,\n    distance: 37.84,\n  },\n  {\n    name: 'HD 47536 b',\n    radius: 13.21,\n    distance: 121.36,\n  },\n  {\n    name: 'HD 47536 c',\n    radius: 13,\n    distance: 121.36,\n  },\n  {\n    name: 'HD 48265 b',\n    radius: 13.86,\n    distance: 87.4,\n  },\n  {\n    name: 'HD 49674 b',\n    radius: 6.83,\n    distance: 40.7,\n  },\n  {\n    name: 'HD 50499 b',\n    radius: 13.68,\n    distance: 47.26,\n  },\n  {\n    name: 'HD 50554 b',\n    radius: 13.2,\n    distance: 31.03,\n  },\n  {\n    name: 'HD 51608 b',\n    radius: 3.85,\n    distance: 34.8,\n  },\n  {\n    name: 'HD 51608 c',\n    radius: 4.59,\n    distance: 34.8,\n  },\n  {\n    name: 'HD 52265 b',\n    radius: 13.9,\n    distance: 28,\n  },\n  {\n    name: 'HD 52265 c',\n    radius: 14.35,\n    distance: 28,\n  },\n  {\n    name: 'HD 5319 b',\n    radius: 13.63,\n    distance: 100,\n  },\n  {\n    name: 'HD 5608 b',\n    radius: 13.71,\n    distance: 58.2,\n  },\n  {\n    name: 'HD 5891 b',\n    radius: 13.03,\n    distance: 251,\n  },\n  {\n    name: 'HD 59686 b',\n    radius: 13.19,\n    distance: 92,\n  },\n  {\n    name: 'HD 60532 b',\n    radius: 13.41,\n    distance: 25.7,\n  },\n  {\n    name: 'HD 60532 c',\n    radius: 13.04,\n    distance: 25.7,\n  },\n  {\n    name: 'HD 62509 b',\n    radius: 13.45,\n    distance: 10.34,\n  },\n  {\n    name: 'HD 63454 b',\n    radius: 14.37,\n    distance: 35.8,\n  },\n  {\n    name: 'HD 63765 b',\n    radius: 14.13,\n    distance: 32.6,\n  },\n  {\n    name: 'HD 6434 b',\n    radius: 14.36,\n    distance: 40.32,\n  },\n  {\n    name: 'HD 65216 b',\n    radius: 13.84,\n    distance: 34.3,\n  },\n  {\n    name: 'HD 65216 c',\n    radius: 9.22,\n    distance: 34.3,\n  },\n  {\n    name: 'HD 66141 b',\n    radius: 13.07,\n    distance: 80.9,\n  },\n  {\n    name: 'HD 66428 b',\n    radius: 13.46,\n    distance: 55,\n  },\n  {\n    name: 'HD 6718 b',\n    radius: 13.72,\n    distance: 55.9,\n  },\n  {\n    name: 'HD 68988 b',\n    radius: 13.64,\n    distance: 58,\n  },\n  {\n    name: 'HD 69830 b',\n    radius: 3.4,\n    distance: 12.6,\n  },\n  {\n    name: 'HD 69830 c',\n    radius: 3.68,\n    distance: 12.6,\n  },\n  {\n    name: 'HD 69830 d',\n    radius: 4.66,\n    distance: 12.6,\n  },\n  {\n    name: 'HD 70573 b',\n    radius: 13.12,\n    distance: 45.7,\n  },\n  {\n    name: 'HD 70642 b',\n    radius: 13.61,\n    distance: 28.8,\n  },\n  {\n    name: 'HD 7199 b',\n    radius: 11.47,\n    distance: 36,\n  },\n  {\n    name: 'HD 72659 b',\n    radius: 13.41,\n    distance: 49.8,\n  },\n  {\n    name: 'HD 73256 b',\n    radius: 13.64,\n    distance: 36.5,\n  },\n  {\n    name: 'HD 73267 b',\n    radius: 13.42,\n    distance: 54.91,\n  },\n  {\n    name: 'HD 73526 b',\n    radius: 13.45,\n    distance: 99,\n  },\n  {\n    name: 'HD 73526 c',\n    radius: 13.51,\n    distance: 99,\n  },\n  {\n    name: 'HD 73534 b',\n    radius: 13.86,\n    distance: 96.99,\n  },\n  {\n    name: 'HD 74156 b',\n    radius: 13.64,\n    distance: 64.56,\n  },\n  {\n    name: 'HD 74156 c',\n    radius: 13.01,\n    distance: 64.56,\n  },\n  {\n    name: 'HD 7449 b',\n    radius: 13.88,\n    distance: 39,\n  },\n  {\n    name: 'HD 7449 c',\n    radius: 13.61,\n    distance: 39,\n  },\n  {\n    name: 'HD 75289 b',\n    radius: 14.33,\n    distance: 28.94,\n  },\n  {\n    name: 'HD 75898 b',\n    radius: 13.51,\n    distance: 80.58,\n  },\n  {\n    name: 'HD 76700 b',\n    radius: 9.24,\n    distance: 59.7,\n  },\n  {\n    name: 'HD 77338 b',\n    radius: 14.18,\n    distance: 40.75,\n  },\n  {\n    name: 'HD 7924 b',\n    radius: 2.56,\n    distance: 16.8,\n  },\n  {\n    name: 'HD 79498 b',\n    radius: 13.79,\n    distance: 49,\n  },\n  {\n    name: 'HD 80606 b',\n    radius: 10.32,\n    distance: 58.4,\n  },\n  {\n    name: 'HD 81040 b',\n    radius: 13.07,\n    distance: 32.56,\n  },\n  {\n    name: 'HD 81688 b',\n    radius: 13.48,\n    distance: 88.26,\n  },\n  {\n    name: 'HD 82886 b',\n    radius: 13.81,\n    distance: 125,\n  },\n  {\n    name: 'HD 82943 b',\n    radius: 13.23,\n    distance: 27.46,\n  },\n  {\n    name: 'HD 82943 c',\n    radius: 13.23,\n    distance: 27.46,\n  },\n  {\n    name: 'HD 82943 d',\n    radius: 14.43,\n    distance: 27.46,\n  },\n  {\n    name: 'HD 83443 b',\n    radius: 14.35,\n    distance: 43.54,\n  },\n  {\n    name: 'HD 8535 b',\n    radius: 14.1,\n    distance: 52.5,\n  },\n  {\n    name: 'HD 85390 b',\n    radius: 7.38,\n    distance: 33.96,\n  },\n  {\n    name: 'HD 85390 c',\n    radius: 10.1,\n    distance: 33.96,\n  },\n  {\n    name: 'HD 85512 b',\n    radius: 1.6,\n    distance: 11.15,\n  },\n  {\n    name: 'HD 8574 b',\n    radius: 13.59,\n    distance: 44.2,\n  },\n  {\n    name: 'HD 86081 b',\n    radius: 13.74,\n    distance: 91,\n  },\n  {\n    name: 'HD 86226 b',\n    radius: 13.74,\n    distance: 42.48,\n  },\n  {\n    name: 'HD 86264 b',\n    radius: 13.07,\n    distance: 72.6,\n  },\n  {\n    name: 'HD 8673 b',\n    radius: 12.77,\n    distance: 38.25,\n  },\n  {\n    name: 'HD 87883 b',\n    radius: 12.83,\n    distance: 18.1,\n  },\n  {\n    name: 'HD 88133 b',\n    radius: 9.83,\n    distance: 74.5,\n  },\n  {\n    name: 'HD 89307 b',\n    radius: 13.61,\n    distance: 30.9,\n  },\n  {\n    name: 'HD 89744 b',\n    radius: 13.05,\n    distance: 40,\n  },\n  {\n    name: 'HD 89744 c',\n    radius: 13.34,\n    distance: 40,\n  },\n  {\n    name: 'HD 90156 b',\n    radius: 4.61,\n    distance: 39.6,\n  },\n  {\n    name: 'HD 92788 b',\n    radius: 13.32,\n    distance: 32.82,\n  },\n  {\n    name: 'HD 92788 c',\n    radius: 13.91,\n    distance: 32.82,\n  },\n  {\n    name: 'HD 93083 b',\n    radius: 14.39,\n    distance: 28.9,\n  },\n  {\n    name: 'HD 93385 b',\n    radius: 2.42,\n    distance: 42.2,\n  },\n  {\n    name: 'HD 93385 c',\n    radius: 3.33,\n    distance: 42.2,\n  },\n  {\n    name: 'HD 9446 b',\n    radius: 14.09,\n    distance: 53,\n  },\n  {\n    name: 'HD 9446 c',\n    radius: 13.66,\n    distance: 53,\n  },\n  {\n    name: 'HD 95086 b',\n    radius: 13.19,\n    distance: 90.4,\n  },\n  {\n    name: 'HD 95089 b',\n    radius: 13.84,\n    distance: 139,\n  },\n  {\n    name: 'HD 9578 b',\n    radius: 14.08,\n    distance: 57.24,\n  },\n  {\n    name: 'HD 96063 b',\n    radius: 13.97,\n    distance: 158,\n  },\n  {\n    name: 'HD 96127 b',\n    radius: 13.31,\n    distance: 540,\n  },\n  {\n    name: 'HD 96167 b',\n    radius: 14.1,\n    distance: 84,\n  },\n  {\n    name: 'HD 96700 b',\n    radius: 2.53,\n    distance: 25.6,\n  },\n  {\n    name: 'HD 96700 c',\n    radius: 3.78,\n    distance: 25.6,\n  },\n  {\n    name: 'HD 97658 b',\n    radius: 2.34,\n    distance: 21.1,\n  },\n  {\n    name: 'HD 98219 b',\n    radius: 13.66,\n    distance: 134,\n  },\n  {\n    name: 'HD 98649 b',\n    radius: 13.02,\n    distance: 40.3,\n  },\n  {\n    name: 'HD 99109 b',\n    radius: 14.24,\n    distance: 60.5,\n  },\n  {\n    name: 'HD 99492 b',\n    radius: 6.63,\n    distance: 18,\n  },\n  {\n    name: 'HD 99492 c',\n    radius: 14.4,\n    distance: 18,\n  },\n  {\n    name: 'HD 99706 b',\n    radius: 13.77,\n    distance: 129,\n  },\n  {\n    name: 'HIP 12961 b',\n    radius: 14.41,\n    distance: 23,\n  },\n  {\n    name: 'HIP 13044 b',\n    radius: 13.82,\n    distance: 701,\n  },\n  {\n    name: 'HIP 14810 b',\n    radius: 13.32,\n    distance: 52.9,\n  },\n  {\n    name: 'HIP 14810 c',\n    radius: 13.81,\n    distance: 52.9,\n  },\n  {\n    name: 'HIP 14810 d',\n    radius: 14.18,\n    distance: 52.9,\n  },\n  {\n    name: 'HIP 5158 b',\n    radius: 13.76,\n    distance: 45,\n  },\n  {\n    name: 'HIP 5158 c',\n    radius: 12.74,\n    distance: 45,\n  },\n  {\n    name: 'HIP 57050 b',\n    radius: 11.65,\n    distance: 11,\n  },\n  {\n    name: 'HIP 57274 b',\n    radius: 3.57,\n    distance: 25.92,\n  },\n  {\n    name: 'HIP 57274 c',\n    radius: 14.34,\n    distance: 25.92,\n  },\n  {\n    name: 'HIP 57274 d',\n    radius: 14.22,\n    distance: 25.92,\n  },\n  {\n    name: 'HIP 63242 b',\n    radius: 12.89,\n    distance: 135,\n  },\n  {\n    name: 'HIP 70849 b',\n    radius: 12.96,\n    distance: 24,\n  },\n  {\n    name: 'HIP 75458 b',\n    radius: 12.97,\n    distance: 31.5,\n  },\n  {\n    name: 'HIP 77900 b',\n    radius: 12.56,\n    distance: null,\n  },\n  {\n    name: 'HIP 78530 b',\n    radius: 12.57,\n    distance: 156.7,\n  },\n  {\n    name: 'HIP 79431 b',\n    radius: 13.59,\n    distance: 14.4,\n  },\n  {\n    name: 'HIP 91258 b',\n    radius: 13.83,\n    distance: 44.9,\n  },\n  {\n    name: 'HN Peg b',\n    radius: 12.32,\n    distance: 18.4,\n  },\n  {\n    name: 'HR 228 b',\n    radius: 13.47,\n    distance: null,\n  },\n  {\n    name: 'HR 228 c',\n    radius: 13.47,\n    distance: null,\n  },\n  {\n    name: 'HR 810 b',\n    radius: 13.56,\n    distance: 17.17,\n  },\n  {\n    name: 'HR 8799 b',\n    radius: 12.32,\n    distance: 39.4,\n  },\n  {\n    name: 'HR 8799 c',\n    radius: 14.56,\n    distance: 39.4,\n  },\n  {\n    name: 'HR 8799 d',\n    radius: 13.44,\n    distance: 39.4,\n  },\n  {\n    name: 'HR 8799 e',\n    radius: 12.96,\n    distance: 39.4,\n  },\n  {\n    name: 'HU Aqr(AB) c',\n    radius: 13.08,\n    distance: null,\n  },\n  {\n    name: 'HW Vir(AB) b',\n    radius: 12.76,\n    distance: 181,\n  },\n  {\n    name: 'kappa And b',\n    radius: 12.74,\n    distance: 51.6,\n  },\n  {\n    name: 'kappa CrB b',\n    radius: 13.71,\n    distance: 31.1,\n  },\n  {\n    name: 'KELT-1 b',\n    radius: 12.5,\n    distance: 263,\n  },\n  {\n    name: 'KELT-2A b',\n    radius: 14.63,\n    distance: 128.9,\n  },\n  {\n    name: 'KELT-3 b',\n    radius: 14.93,\n    distance: 178,\n  },\n  {\n    name: 'KELT-6 b',\n    radius: 13.33,\n    distance: null,\n  },\n  {\n    name: 'Kepler-10 b',\n    radius: 1.41,\n    distance: 173,\n  },\n  {\n    name: 'Kepler-10 c',\n    radius: 2.23,\n    distance: 173,\n  },\n  {\n    name: 'Kepler-11 b',\n    radius: 1.8,\n    distance: null,\n  },\n  {\n    name: 'Kepler-11 c',\n    radius: 2.87,\n    distance: null,\n  },\n  {\n    name: 'Kepler-11 d',\n    radius: 3.12,\n    distance: null,\n  },\n  {\n    name: 'Kepler-11 e',\n    radius: 4.53,\n    distance: null,\n  },\n  {\n    name: 'Kepler-11 f',\n    radius: 2.49,\n    distance: null,\n  },\n  {\n    name: 'Kepler-11 g',\n    radius: 3.67,\n    distance: null,\n  },\n  {\n    name: 'Kepler-12 b',\n    radius: 18.98,\n    distance: null,\n  },\n  {\n    name: 'Kepler-13 b',\n    radius: 20.5,\n    distance: null,\n  },\n  {\n    name: 'Kepler-14 b',\n    radius: 12.72,\n    distance: 980,\n  },\n  {\n    name: 'Kepler-15 b',\n    radius: 10.75,\n    distance: null,\n  },\n  {\n    name: 'Kepler-16(AB) b',\n    radius: 8.44,\n    distance: null,\n  },\n  {\n    name: 'Kepler-17 b',\n    radius: 14.69,\n    distance: 800,\n  },\n  {\n    name: 'Kepler-18 b',\n    radius: 2,\n    distance: null,\n  },\n  {\n    name: 'Kepler-18 c',\n    radius: 5.48,\n    distance: null,\n  },\n  {\n    name: 'Kepler-18 d',\n    radius: 6.96,\n    distance: null,\n  },\n  {\n    name: 'Kepler-19 b',\n    radius: 2.22,\n    distance: null,\n  },\n  {\n    name: 'Kepler-20 b',\n    radius: 1.9,\n    distance: 290,\n  },\n  {\n    name: 'Kepler-20 c',\n    radius: 3.06,\n    distance: 290,\n  },\n  {\n    name: 'Kepler-20 d',\n    radius: 2.8,\n    distance: 290,\n  },\n  {\n    name: 'Kepler-20 e',\n    radius: 0.87,\n    distance: 290,\n  },\n  {\n    name: 'Kepler-20 f',\n    radius: 1.01,\n    distance: 290,\n  },\n  {\n    name: 'Kepler-21 b',\n    radius: 1.63,\n    distance: 108,\n  },\n  {\n    name: 'Kepler-22 b',\n    radius: 2.35,\n    distance: 190,\n  },\n  {\n    name: 'Kepler-23 b',\n    radius: 1.9,\n    distance: null,\n  },\n  {\n    name: 'Kepler-23 c',\n    radius: 3.25,\n    distance: null,\n  },\n  {\n    name: 'Kepler-24 b',\n    radius: 2.35,\n    distance: null,\n  },\n  {\n    name: 'Kepler-24 c',\n    radius: 2.8,\n    distance: null,\n  },\n  {\n    name: 'Kepler-25 b',\n    radius: 2.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-25 c',\n    radius: 4.48,\n    distance: null,\n  },\n  {\n    name: 'Kepler-26 b',\n    radius: 3.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-26 c',\n    radius: 3.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-27 b',\n    radius: 4.03,\n    distance: null,\n  },\n  {\n    name: 'Kepler-27 c',\n    radius: 4.93,\n    distance: null,\n  },\n  {\n    name: 'Kepler-28 b',\n    radius: 3.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-28 c',\n    radius: 3.36,\n    distance: null,\n  },\n  {\n    name: 'Kepler-29 b',\n    radius: 3.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-29 c',\n    radius: 2.91,\n    distance: null,\n  },\n  {\n    name: 'Kepler-30 b',\n    radius: 3.92,\n    distance: null,\n  },\n  {\n    name: 'Kepler-30 c',\n    radius: 12.32,\n    distance: null,\n  },\n  {\n    name: 'Kepler-30 d',\n    radius: 8.85,\n    distance: null,\n  },\n  {\n    name: 'Kepler-31 b',\n    radius: 4.26,\n    distance: null,\n  },\n  {\n    name: 'Kepler-31 c',\n    radius: 4.26,\n    distance: null,\n  },\n  {\n    name: 'Kepler-32 b',\n    radius: 4.14,\n    distance: null,\n  },\n  {\n    name: 'Kepler-32 c',\n    radius: 3.7,\n    distance: null,\n  },\n  {\n    name: 'Kepler-33 b',\n    radius: 1.79,\n    distance: null,\n  },\n  {\n    name: 'Kepler-33 c',\n    radius: 3.25,\n    distance: null,\n  },\n  {\n    name: 'Kepler-33 d',\n    radius: 5.38,\n    distance: null,\n  },\n  {\n    name: 'Kepler-33 e',\n    radius: 4.03,\n    distance: null,\n  },\n  {\n    name: 'Kepler-33 f',\n    radius: 4.48,\n    distance: null,\n  },\n  {\n    name: 'Kepler-34(AB)  b',\n    radius: 8.55,\n    distance: 1499,\n  },\n  {\n    name: 'Kepler-35(AB) b',\n    radius: 8.15,\n    distance: 1645,\n  },\n  {\n    name: 'Kepler-36 b',\n    radius: 1.48,\n    distance: null,\n  },\n  {\n    name: 'Kepler-36 c',\n    radius: 3.68,\n    distance: null,\n  },\n  {\n    name: 'Kepler-37 b',\n    radius: 0.3,\n    distance: 66,\n  },\n  {\n    name: 'Kepler-37 c',\n    radius: 0.74,\n    distance: 66,\n  },\n  {\n    name: 'Kepler-37 d',\n    radius: 1.98,\n    distance: 66,\n  },\n  {\n    name: 'Kepler-38(AB) b',\n    radius: 4.37,\n    distance: null,\n  },\n  {\n    name: 'Kepler-39 b',\n    radius: 13.66,\n    distance: 1200,\n  },\n  {\n    name: 'Kepler-4 b',\n    radius: 4,\n    distance: 550,\n  },\n  {\n    name: 'Kepler-40 b',\n    radius: 13.1,\n    distance: 2700,\n  },\n  {\n    name: 'Kepler-41  b',\n    radius: 9.42,\n    distance: 730,\n  },\n  {\n    name: 'Kepler-42 b',\n    radius: 0.78,\n    distance: 38.7,\n  },\n  {\n    name: 'Kepler-42 c',\n    radius: 0.73,\n    distance: 38.7,\n  },\n  {\n    name: 'Kepler-42 d',\n    radius: 0.57,\n    distance: 38.7,\n  },\n  {\n    name: 'Kepler-43 b',\n    radius: 13.44,\n    distance: 1950,\n  },\n  {\n    name: 'Kepler-44 b',\n    radius: 13.89,\n    distance: 2250,\n  },\n  {\n    name: 'Kepler-45 b',\n    radius: 10.75,\n    distance: 333,\n  },\n  {\n    name: 'Kepler-46 b',\n    radius: 9.09,\n    distance: 857,\n  },\n  {\n    name: 'Kepler-46 c',\n    radius: 14.38,\n    distance: 857,\n  },\n  {\n    name: 'Kepler-47(AB) b',\n    radius: 3.02,\n    distance: null,\n  },\n  {\n    name: 'Kepler-47(AB) c',\n    radius: 4.59,\n    distance: null,\n  },\n  {\n    name: 'Kepler-48 b',\n    radius: 2.02,\n    distance: null,\n  },\n  {\n    name: 'Kepler-48 c',\n    radius: 3.36,\n    distance: null,\n  },\n  {\n    name: 'Kepler-49 b',\n    radius: 2.69,\n    distance: null,\n  },\n  {\n    name: 'Kepler-49 c',\n    radius: 2.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-5 b',\n    radius: 16.03,\n    distance: null,\n  },\n  {\n    name: 'Kepler-50 b',\n    radius: 2.24,\n    distance: null,\n  },\n  {\n    name: 'Kepler-50 c',\n    radius: 2.8,\n    distance: null,\n  },\n  {\n    name: 'Kepler-51 b',\n    radius: 7.06,\n    distance: null,\n  },\n  {\n    name: 'Kepler-51 c',\n    radius: 5.71,\n    distance: null,\n  },\n  {\n    name: 'Kepler-52 b',\n    radius: 2.13,\n    distance: null,\n  },\n  {\n    name: 'Kepler-52 c',\n    radius: 1.79,\n    distance: null,\n  },\n  {\n    name: 'Kepler-53 b',\n    radius: 2.91,\n    distance: null,\n  },\n  {\n    name: 'Kepler-53 c',\n    radius: 3.14,\n    distance: null,\n  },\n  {\n    name: 'Kepler-54 b',\n    radius: 2.13,\n    distance: null,\n  },\n  {\n    name: 'Kepler-54 c',\n    radius: 1.23,\n    distance: null,\n  },\n  {\n    name: 'Kepler-55 b',\n    radius: 2.46,\n    distance: null,\n  },\n  {\n    name: 'Kepler-55 c',\n    radius: 2.24,\n    distance: null,\n  },\n  {\n    name: 'Kepler-56 b',\n    radius: 6.5,\n    distance: null,\n  },\n  {\n    name: 'Kepler-56 c',\n    radius: 9.86,\n    distance: null,\n  },\n  {\n    name: 'Kepler-56 d',\n    radius: 13.33,\n    distance: null,\n  },\n  {\n    name: 'Kepler-57 b',\n    radius: 2.24,\n    distance: null,\n  },\n  {\n    name: 'Kepler-57 c',\n    radius: 1.57,\n    distance: null,\n  },\n  {\n    name: 'Kepler-58 b',\n    radius: 2.8,\n    distance: null,\n  },\n  {\n    name: 'Kepler-58 c',\n    radius: 2.91,\n    distance: null,\n  },\n  {\n    name: 'Kepler-59 b',\n    radius: 1.1,\n    distance: null,\n  },\n  {\n    name: 'Kepler-59 c',\n    radius: 2.02,\n    distance: null,\n  },\n  {\n    name: 'Kepler-6 b',\n    radius: 14.82,\n    distance: null,\n  },\n  {\n    name: 'Kepler-60 b',\n    radius: 2.24,\n    distance: null,\n  },\n  {\n    name: 'Kepler-60 c',\n    radius: 2.46,\n    distance: null,\n  },\n  {\n    name: 'Kepler-60 d',\n    radius: 2.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-61 b',\n    radius: 2.15,\n    distance: 326,\n  },\n  {\n    name: 'Kepler-62 b',\n    radius: 1.31,\n    distance: 368,\n  },\n  {\n    name: 'Kepler-62 c',\n    radius: 0.54,\n    distance: 368,\n  },\n  {\n    name: 'Kepler-62 d',\n    radius: 1.95,\n    distance: 368,\n  },\n  {\n    name: 'Kepler-62 e',\n    radius: 1.61,\n    distance: 368,\n  },\n  {\n    name: 'Kepler-62 f',\n    radius: 1.41,\n    distance: 368,\n  },\n  {\n    name: 'Kepler-63 b',\n    radius: 6.1,\n    distance: 200,\n  },\n  {\n    name: 'Kepler-65 b',\n    radius: 1.42,\n    distance: null,\n  },\n  {\n    name: 'Kepler-65 c',\n    radius: 2.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-65 d',\n    radius: 1.51,\n    distance: null,\n  },\n  {\n    name: 'Kepler-66 b',\n    radius: 2.8,\n    distance: 1107,\n  },\n  {\n    name: 'Kepler-67 b',\n    radius: 2.91,\n    distance: 1107,\n  },\n  {\n    name: 'Kepler-68 b',\n    radius: 2.3,\n    distance: 135,\n  },\n  {\n    name: 'Kepler-68 c',\n    radius: 0.91,\n    distance: 135,\n  },\n  {\n    name: 'Kepler-68 d',\n    radius: 13.89,\n    distance: 135,\n  },\n  {\n    name: 'Kepler-69 b',\n    radius: 2.24,\n    distance: null,\n  },\n  {\n    name: 'Kepler-69 c',\n    radius: 1.71,\n    distance: null,\n  },\n  {\n    name: 'Kepler-7 b',\n    radius: 18.08,\n    distance: null,\n  },\n  {\n    name: 'Kepler-70  b',\n    radius: 0.76,\n    distance: 1180,\n  },\n  {\n    name: 'Kepler-70 c',\n    radius: 0.87,\n    distance: 1180,\n  },\n  {\n    name: 'Kepler-71 b',\n    radius: 11.71,\n    distance: null,\n  },\n  {\n    name: 'Kepler-74 b',\n    radius: 14.78,\n    distance: 1330,\n  },\n  {\n    name: 'Kepler-75 b',\n    radius: 11.54,\n    distance: 1140,\n  },\n  {\n    name: 'Kepler-76 b',\n    radius: 14,\n    distance: null,\n  },\n  {\n    name: 'Kepler-77 b',\n    radius: 10.75,\n    distance: 570,\n  },\n  {\n    name: 'Kepler-78 b',\n    radius: 1.2,\n    distance: null,\n  },\n  {\n    name: 'Kepler-79 b',\n    radius: 3.3,\n    distance: null,\n  },\n  {\n    name: 'Kepler-79 c',\n    radius: 3.73,\n    distance: null,\n  },\n  {\n    name: 'Kepler-79 d',\n    radius: 7.17,\n    distance: null,\n  },\n  {\n    name: 'Kepler-79 e',\n    radius: 3.49,\n    distance: null,\n  },\n  {\n    name: 'Kepler-8 b',\n    radius: 15.89,\n    distance: 1330,\n  },\n  {\n    name: 'Kepler-80 b',\n    radius: 2.35,\n    distance: null,\n  },\n  {\n    name: 'Kepler-80 c',\n    radius: 2.58,\n    distance: null,\n  },\n  {\n    name: 'Kepler-80 d',\n    radius: 1.4,\n    distance: null,\n  },\n  {\n    name: 'Kepler-80 e',\n    radius: 1.5,\n    distance: null,\n  },\n  {\n    name: 'Kepler-80 f',\n    radius: 1.3,\n    distance: null,\n  },\n  {\n    name: 'Kepler-81 b',\n    radius: 2.54,\n    distance: null,\n  },\n  {\n    name: 'Kepler-81 c',\n    radius: 2.45,\n    distance: null,\n  },\n  {\n    name: 'Kepler-82 b',\n    radius: 4,\n    distance: null,\n  },\n  {\n    name: 'Kepler-82 c',\n    radius: 5.3,\n    distance: null,\n  },\n  {\n    name: 'Kepler-83 b',\n    radius: 2.34,\n    distance: null,\n  },\n  {\n    name: 'Kepler-83 c',\n    radius: 1.94,\n    distance: null,\n  },\n  {\n    name: 'Kepler-84 b',\n    radius: 2.2,\n    distance: null,\n  },\n  {\n    name: 'Kepler-84 c',\n    radius: 2.4,\n    distance: null,\n  },\n  {\n    name: 'Kepler-85 b',\n    radius: 1.99,\n    distance: null,\n  },\n  {\n    name: 'Kepler-85 c',\n    radius: 2.21,\n    distance: null,\n  },\n  {\n    name: 'Kepler-86 b',\n    radius: 10.14,\n    distance: null,\n  },\n  {\n    name: 'Kepler-87 b',\n    radius: 13.55,\n    distance: null,\n  },\n  {\n    name: 'Kepler-87 c',\n    radius: 6.15,\n    distance: null,\n  },\n  {\n    name: 'Kepler-88 b',\n    radius: 4.22,\n    distance: 385,\n  },\n  {\n    name: 'Kepler-88 c',\n    radius: 14.04,\n    distance: 385,\n  },\n  {\n    name: 'Kepler-89 b',\n    radius: 1.71,\n    distance: null,\n  },\n  {\n    name: 'Kepler-89 c',\n    radius: 4.32,\n    distance: null,\n  },\n  {\n    name: 'Kepler-89 d',\n    radius: 11.2,\n    distance: null,\n  },\n  {\n    name: 'Kepler-89 e',\n    radius: 6.16,\n    distance: null,\n  },\n  {\n    name: 'Kepler-9 b',\n    radius: 9.42,\n    distance: null,\n  },\n  {\n    name: 'Kepler-9 c',\n    radius: 9.21,\n    distance: null,\n  },\n  {\n    name: 'Kepler-9 d',\n    radius: 1.65,\n    distance: null,\n  },\n  {\n    name: 'Kepler-90 b',\n    radius: 1.31,\n    distance: null,\n  },\n  {\n    name: 'Kepler-90 c',\n    radius: 1.19,\n    distance: null,\n  },\n  {\n    name: 'Kepler-90 d',\n    radius: 2.88,\n    distance: null,\n  },\n  {\n    name: 'Kepler-90 e',\n    radius: 2.67,\n    distance: null,\n  },\n  {\n    name: 'Kepler-90 f',\n    radius: 2.89,\n    distance: null,\n  },\n  {\n    name: 'Kepler-90 g',\n    radius: 8.12,\n    distance: null,\n  },\n  {\n    name: 'Kepler-90 h',\n    radius: 11.31,\n    distance: null,\n  },\n  {\n    name: 'KIC-10255705 b',\n    radius: 7.28,\n    distance: null,\n  },\n  {\n    name: 'KIC-10905746 b',\n    radius: 2.65,\n    distance: null,\n  },\n  {\n    name: 'KIC-11152511 b',\n    radius: 4.03,\n    distance: null,\n  },\n  {\n    name: 'KIC-12351927(AB) b',\n    radius: 4.37,\n    distance: null,\n  },\n  {\n    name: 'KIC-12454613 b',\n    radius: 2.69,\n    distance: null,\n  },\n  {\n    name: 'KIC-12557548 b',\n    radius: 0.85,\n    distance: 470,\n  },\n  {\n    name: 'KIC-5010054 b',\n    radius: 6.94,\n    distance: null,\n  },\n  {\n    name: 'KIC-5094412 b',\n    radius: 5.71,\n    distance: null,\n  },\n  {\n    name: 'KIC-5522786 b',\n    radius: 1.23,\n    distance: null,\n  },\n  {\n    name: 'KIC-5732155 b',\n    radius: 12.77,\n    distance: null,\n  },\n  {\n    name: 'KIC-6185331 b',\n    radius: 8.06,\n    distance: null,\n  },\n  {\n    name: 'KIC-6372194 b',\n    radius: 8.29,\n    distance: null,\n  },\n  {\n    name: 'KIC-6436029 c',\n    radius: 3.07,\n    distance: null,\n  },\n  {\n    name: 'KIC-8852719 b',\n    radius: 3.53,\n    distance: null,\n  },\n  {\n    name: 'KIC-9662267 b',\n    radius: 3.81,\n    distance: null,\n  },\n  {\n    name: 'KIC-9704149 b',\n    radius: 4.48,\n    distance: null,\n  },\n  {\n    name: 'KOI-111 b',\n    radius: 2.14,\n    distance: null,\n  },\n  {\n    name: 'KOI-111 c',\n    radius: 2.05,\n    distance: null,\n  },\n  {\n    name: 'KOI-115 b',\n    radius: 4.82,\n    distance: null,\n  },\n  {\n    name: 'KOI-115 c',\n    radius: 1.91,\n    distance: null,\n  },\n  {\n    name: 'KOI-117 b',\n    radius: 1.58,\n    distance: null,\n  },\n  {\n    name: 'KOI-117 c',\n    radius: 1.71,\n    distance: null,\n  },\n  {\n    name: 'KOI-1203 b',\n    radius: 2.9,\n    distance: null,\n  },\n  {\n    name: 'KOI-1203 c',\n    radius: 2.8,\n    distance: null,\n  },\n  {\n    name: 'KOI-1215 b',\n    radius: 2.92,\n    distance: null,\n  },\n  {\n    name: 'KOI-1215 c',\n    radius: 3.36,\n    distance: null,\n  },\n  {\n    name: 'KOI-1236 b',\n    radius: 4.31,\n    distance: null,\n  },\n  {\n    name: 'KOI-1236 c',\n    radius: 3.1,\n    distance: null,\n  },\n  {\n    name: 'KOI-1278 b',\n    radius: 2.46,\n    distance: null,\n  },\n  {\n    name: 'KOI-1278 c',\n    radius: 3.1,\n    distance: null,\n  },\n  {\n    name: 'KOI-156 b',\n    radius: 1.18,\n    distance: null,\n  },\n  {\n    name: 'KOI-156 c',\n    radius: 1.6,\n    distance: null,\n  },\n  {\n    name: 'KOI-156 d',\n    radius: 2.53,\n    distance: null,\n  },\n  {\n    name: 'KOI-1563 b',\n    radius: 3.61,\n    distance: null,\n  },\n  {\n    name: 'KOI-1563 c',\n    radius: 3.3,\n    distance: null,\n  },\n  {\n    name: 'KOI-1576 c',\n    radius: 2.8,\n    distance: null,\n  },\n  {\n    name: 'KOI-1676 b',\n    radius: 3.2,\n    distance: null,\n  },\n  {\n    name: 'KOI-1781 b',\n    radius: 1.88,\n    distance: null,\n  },\n  {\n    name: 'KOI-1843 b',\n    radius: 0.58,\n    distance: null,\n  },\n  {\n    name: 'KOI-1873 b',\n    radius: 2.31,\n    distance: null,\n  },\n  {\n    name: 'KOI-1873 c',\n    radius: 5.41,\n    distance: null,\n  },\n  {\n    name: 'KOI-202 b',\n    radius: 11.42,\n    distance: null,\n  },\n  {\n    name: 'KOI-2025 b',\n    radius: 3.1,\n    distance: null,\n  },\n  {\n    name: 'KOI-2025 c',\n    radius: 2.8,\n    distance: null,\n  },\n  {\n    name: 'KOI-206 b',\n    radius: 7.84,\n    distance: null,\n  },\n  {\n    name: 'KOI-2672 b',\n    radius: 3.47,\n    distance: null,\n  },\n  {\n    name: 'KOI-2672 c',\n    radius: 5.26,\n    distance: null,\n  },\n  {\n    name: 'KOI-274 b',\n    radius: 1.13,\n    distance: null,\n  },\n  {\n    name: 'KOI-274 c',\n    radius: 1.13,\n    distance: null,\n  },\n  {\n    name: 'KOI-282 b',\n    radius: 2.9,\n    distance: null,\n  },\n  {\n    name: 'KOI-285 b',\n    radius: 3.52,\n    distance: null,\n  },\n  {\n    name: 'KOI-285 c',\n    radius: 2.61,\n    distance: null,\n  },\n  {\n    name: 'KOI-370 b',\n    radius: 2.65,\n    distance: null,\n  },\n  {\n    name: 'KOI-370 c',\n    radius: 4.42,\n    distance: null,\n  },\n  {\n    name: 'KOI-523 b',\n    radius: 2.9,\n    distance: null,\n  },\n  {\n    name: 'KOI-523 c',\n    radius: 7.11,\n    distance: null,\n  },\n  {\n    name: 'KOI-680 b',\n    radius: 7.28,\n    distance: null,\n  },\n  {\n    name: 'KOI-730 b',\n    radius: 3.47,\n    distance: null,\n  },\n  {\n    name: 'KOI-730 c',\n    radius: 2.58,\n    distance: null,\n  },\n  {\n    name: 'KOI-730 d',\n    radius: 2.8,\n    distance: null,\n  },\n  {\n    name: 'KOI-730 e',\n    radius: 2.02,\n    distance: null,\n  },\n  {\n    name: 'KOI-82 b',\n    radius: 2.2,\n    distance: null,\n  },\n  {\n    name: 'KOI-82 c',\n    radius: 1.34,\n    distance: null,\n  },\n  {\n    name: 'KOI-82 d',\n    radius: 0.69,\n    distance: null,\n  },\n  {\n    name: 'KOI-834 b',\n    radius: 5.61,\n    distance: null,\n  },\n  {\n    name: 'KOI-834 c',\n    radius: 2,\n    distance: null,\n  },\n  {\n    name: 'ksi Aql b',\n    radius: 13.46,\n    distance: 62.7,\n  },\n  {\n    name: 'LKCA 15 b',\n    radius: 13.13,\n    distance: 145,\n  },\n  {\n    name: 'MOA-2007-BLG-192-L b',\n    radius: 1.54,\n    distance: 700,\n  },\n  {\n    name: 'MOA-2007-BLG-400-L b',\n    radius: 13.97,\n    distance: 6000,\n  },\n  {\n    name: 'MOA-2008-BLG-310-L b',\n    radius: 10.07,\n    distance: 6000,\n  },\n  {\n    name: 'MOA-2008-BLG-379L b',\n    radius: 13.17,\n    distance: 3600,\n  },\n  {\n    name: 'MOA-2009-BLG-266L b',\n    radius: 3.38,\n    distance: 3040,\n  },\n  {\n    name: 'MOA-2009-BLG-319 b',\n    radius: 8.14,\n    distance: 6100,\n  },\n  {\n    name: 'MOA-2009-BLG-387L b',\n    radius: 13.5,\n    distance: 5700,\n  },\n  {\n    name: 'MOA-2010-BLG-328L b',\n    radius: 3.42,\n    distance: 810,\n  },\n  {\n    name: 'MOA-2010-BLG-477L b',\n    radius: 13.74,\n    distance: 2300,\n  },\n  {\n    name: 'MOA-2011-BLG-293L b',\n    radius: 13.23,\n    distance: 7700,\n  },\n  {\n    name: 'MOA-2011-BLG-322 b',\n    radius: 12.96,\n    distance: 7740,\n  },\n  {\n    name: 'MOA-bin-1 b',\n    radius: 13.34,\n    distance: 5100,\n  },\n  {\n    name: 'mu Ara b',\n    radius: 13.69,\n    distance: 15.3,\n  },\n  {\n    name: 'mu Ara c',\n    radius: 3.41,\n    distance: 15.3,\n  },\n  {\n    name: 'mu Ara d',\n    radius: 14.23,\n    distance: 15.3,\n  },\n  {\n    name: 'mu Ara e',\n    radius: 13.66,\n    distance: 15.3,\n  },\n  {\n    name: 'NGC 2423 3 b',\n    radius: 12.89,\n    distance: 766,\n  },\n  {\n    name: 'NGC 4349 No 127 b',\n    radius: 12.63,\n    distance: 2176,\n  },\n  {\n    name: 'NN Ser(AB) c',\n    radius: 13.07,\n    distance: 500,\n  },\n  {\n    name: 'NN Ser(AB) d',\n    radius: 13.55,\n    distance: 500,\n  },\n  {\n    name: 'nu Oph b',\n    radius: 12.55,\n    distance: 46.8,\n  },\n  {\n    name: 'nu Oph c',\n    radius: 12.5,\n    distance: 46.8,\n  },\n  {\n    name: 'NY Vir b',\n    radius: 13.49,\n    distance: null,\n  },\n  {\n    name: 'OGLE-05-071L b',\n    radius: 13.37,\n    distance: 3300,\n  },\n  {\n    name: 'OGLE-05-169L b',\n    radius: 3.78,\n    distance: 2700,\n  },\n  {\n    name: 'OGLE-05-390L b',\n    radius: 1.94,\n    distance: 6500,\n  },\n  {\n    name: 'OGLE-06-109L b',\n    radius: 14.07,\n    distance: 1510,\n  },\n  {\n    name: 'OGLE-06-109L c',\n    radius: 11.04,\n    distance: 1510,\n  },\n  {\n    name: 'OGLE-2007-BLG-368L b',\n    radius: 5.15,\n    distance: 5900,\n  },\n  {\n    name: 'OGLE-2009-BLG-151_MOA-2009-232 b',\n    radius: 12.97,\n    distance: 390,\n  },\n  {\n    name: 'OGLE-2011-BLG-0251 b',\n    radius: 13.88,\n    distance: 4090,\n  },\n  {\n    name: 'OGLE-2011-BLG-0420 b',\n    radius: 12.88,\n    distance: 1990,\n  },\n  {\n    name: 'OGLE-2012-BLG-0026L b',\n    radius: 7.22,\n    distance: 4080,\n  },\n  {\n    name: 'OGLE-2012-BLG-0026L c',\n    radius: 14.04,\n    distance: 4080,\n  },\n  {\n    name: 'OGLE-2012-BLG-0358L b',\n    radius: 13.58,\n    distance: 1760,\n  },\n  {\n    name: 'OGLE-2012-BLG-0406L b',\n    radius: 13.41,\n    distance: 4970,\n  },\n  {\n    name: 'OGLE-TR-10 b',\n    radius: 19.26,\n    distance: 1500,\n  },\n  {\n    name: 'OGLE-TR-111 b',\n    radius: 12.06,\n    distance: 1500,\n  },\n  {\n    name: 'OGLE-TR-113 b',\n    radius: 12.43,\n    distance: 1500,\n  },\n  {\n    name: 'OGLE-TR-132 b',\n    radius: 13.78,\n    distance: 1500,\n  },\n  {\n    name: 'OGLE-TR-182 b',\n    radius: 16.46,\n    distance: null,\n  },\n  {\n    name: 'OGLE-TR-211 b',\n    radius: 14.11,\n    distance: null,\n  },\n  {\n    name: 'OGLE-TR-56 b',\n    radius: 13.44,\n    distance: 1500,\n  },\n  {\n    name: 'OGLE2-TR-L9 b',\n    radius: 18.08,\n    distance: 900,\n  },\n  {\n    name: 'OGLE235-MOA53 b',\n    radius: 13.5,\n    distance: 5200,\n  },\n  {\n    name: 'ome Ser b',\n    radius: 13.62,\n    distance: 80.6,\n  },\n  {\n    name: 'omi CrB b',\n    radius: 13.68,\n    distance: 84,\n  },\n  {\n    name: 'omi UMa b',\n    radius: 13.23,\n    distance: 56.3,\n  },\n  {\n    name: 'Oph 11 b',\n    radius: 12.6,\n    distance: 145,\n  },\n  {\n    name: 'PH1-Kepler-64 b',\n    radius: 6.19,\n    distance: null,\n  },\n  {\n    name: 'POTS-1 b',\n    radius: 10.54,\n    distance: null,\n  },\n  {\n    name: 'Pr0201 c',\n    radius: 14.14,\n    distance: null,\n  },\n  {\n    name: 'Pr0211 b',\n    radius: 13.59,\n    distance: null,\n  },\n  {\n    name: 'PSR 1257 12 b',\n    radius: 0.3,\n    distance: 710,\n  },\n  {\n    name: 'PSR 1257 12 c',\n    radius: 1.72,\n    distance: 710,\n  },\n  {\n    name: 'PSR 1257 12 d',\n    radius: 1.66,\n    distance: 710,\n  },\n  {\n    name: 'PSR 1719-14 b',\n    radius: 4.48,\n    distance: 1200,\n  },\n  {\n    name: 'PSR B1620-26 b',\n    radius: 13.51,\n    distance: 3800,\n  },\n  {\n    name: 'Qatar-1 b',\n    radius: 13.04,\n    distance: null,\n  },\n  {\n    name: 'Qatar-2 b',\n    radius: 12.81,\n    distance: null,\n  },\n  {\n    name: 'Ross 458(AB) c',\n    radius: 12.98,\n    distance: 114,\n  },\n  {\n    name: 'ROXs 42B b',\n    radius: 12.83,\n    distance: 135,\n  },\n  {\n    name: 'RR Cae b',\n    radius: 13.22,\n    distance: null,\n  },\n  {\n    name: 'SR 12 AB c',\n    radius: 12.8,\n    distance: 125,\n  },\n  {\n    name: 'SWEEPS-04b',\n    radius: 9.07,\n    distance: 8500,\n  },\n  {\n    name: 'SWEEPS-11b',\n    radius: 12.66,\n    distance: 8500,\n  },\n  {\n    name: 'tau Boo b',\n    radius: 13.14,\n    distance: 15.6,\n  },\n  {\n    name: 'tau Gem b',\n    radius: 12.55,\n    distance: 98.4,\n  },\n  {\n    name: 'TrES-1b',\n    radius: 12.31,\n    distance: 157,\n  },\n  {\n    name: 'TrES-2b',\n    radius: 13.09,\n    distance: 220,\n  },\n  {\n    name: 'TrES-3b',\n    radius: 14.62,\n    distance: null,\n  },\n  {\n    name: 'TrES-4b',\n    radius: 19.11,\n    distance: 479,\n  },\n  {\n    name: 'TrES-5b',\n    radius: 13.54,\n    distance: 360,\n  },\n  {\n    name: 'ups And b',\n    radius: 14.15,\n    distance: 13.47,\n  },\n  {\n    name: 'ups And c',\n    radius: 13.66,\n    distance: 13.47,\n  },\n  {\n    name: 'ups And d',\n    radius: 12.91,\n    distance: 13.47,\n  },\n  {\n    name: 'ups And e',\n    radius: 13.9,\n    distance: 13.47,\n  },\n  {\n    name: 'USco1602-2401 b',\n    radius: 12.22,\n    distance: null,\n  },\n  {\n    name: 'USco1610-1913 b',\n    radius: 12.56,\n    distance: null,\n  },\n  {\n    name: 'USco1612-1800 b',\n    radius: 12.46,\n    distance: null,\n  },\n  {\n    name: 'UScoCTIO 108 b',\n    radius: 12.72,\n    distance: 145,\n  },\n  {\n    name: 'UZ For(ab) d',\n    radius: 12.96,\n    distance: null,\n  },\n  {\n    name: 'V391 Peg b',\n    radius: 13.41,\n    distance: 1400,\n  },\n  {\n    name: 'WASP-1 b',\n    radius: 16.62,\n    distance: null,\n  },\n  {\n    name: 'WASP-10 b',\n    radius: 12.1,\n    distance: 90,\n  },\n  {\n    name: 'WASP-100 b',\n    radius: 18.93,\n    distance: null,\n  },\n  {\n    name: 'WASP-101 b',\n    radius: 15.79,\n    distance: null,\n  },\n  {\n    name: 'WASP-11-HAT-P-10 b',\n    radius: 11.7,\n    distance: 125,\n  },\n  {\n    name: 'WASP-12 b',\n    radius: 19.44,\n    distance: 427,\n  },\n  {\n    name: 'WASP-13 b',\n    radius: 15.29,\n    distance: 156,\n  },\n  {\n    name: 'WASP-14 b',\n    radius: 14.35,\n    distance: 160,\n  },\n  {\n    name: 'WASP-15 b',\n    radius: 15.99,\n    distance: 308,\n  },\n  {\n    name: 'WASP-16 b',\n    radius: 11.29,\n    distance: null,\n  },\n  {\n    name: 'WASP-17 b',\n    radius: 22.3,\n    distance: null,\n  },\n  {\n    name: 'WASP-18 b',\n    radius: 13.05,\n    distance: 100,\n  },\n  {\n    name: 'WASP-19 b',\n    radius: 15.62,\n    distance: null,\n  },\n  {\n    name: 'WASP-2 b',\n    radius: 12.08,\n    distance: 144,\n  },\n  {\n    name: 'WASP-20 b',\n    radius: 10.08,\n    distance: null,\n  },\n  {\n    name: 'WASP-21 b',\n    radius: 13.55,\n    distance: 230,\n  },\n  {\n    name: 'WASP-22 b',\n    radius: 12.97,\n    distance: 300,\n  },\n  {\n    name: 'WASP-23 b',\n    radius: 10.77,\n    distance: null,\n  },\n  {\n    name: 'WASP-24 b',\n    radius: 12.36,\n    distance: 330,\n  },\n  {\n    name: 'WASP-25 b',\n    radius: 14.11,\n    distance: 169,\n  },\n  {\n    name: 'WASP-26 b',\n    radius: 14.35,\n    distance: 250,\n  },\n  {\n    name: 'WASP-28 b',\n    radius: 12.54,\n    distance: 334,\n  },\n  {\n    name: 'WASP-29 b',\n    radius: 9.42,\n    distance: 80,\n  },\n  {\n    name: 'WASP-3 b',\n    radius: 16.28,\n    distance: 223,\n  },\n  {\n    name: 'WASP-31 b',\n    radius: 17.21,\n    distance: 400,\n  },\n  {\n    name: 'WASP-32 b',\n    radius: 13.22,\n    distance: null,\n  },\n  {\n    name: 'WASP-33 b',\n    radius: 16.11,\n    distance: 116,\n  },\n  {\n    name: 'WASP-34 b',\n    radius: 13.66,\n    distance: 120,\n  },\n  {\n    name: 'WASP-35 b',\n    radius: 14.78,\n    distance: null,\n  },\n  {\n    name: 'WASP-36 b',\n    radius: 14.21,\n    distance: 450,\n  },\n  {\n    name: 'WASP-37 b',\n    radius: 12.72,\n    distance: 338,\n  },\n  {\n    name: 'WASP-38 b',\n    radius: 12.08,\n    distance: 110,\n  },\n  {\n    name: 'WASP-39 b',\n    radius: 14.22,\n    distance: 230,\n  },\n  {\n    name: 'WASP-4 b',\n    radius: 15.62,\n    distance: 300,\n  },\n  {\n    name: 'WASP-41 b',\n    radius: 13.55,\n    distance: 180,\n  },\n  {\n    name: 'WASP-42 b',\n    radius: 12.1,\n    distance: null,\n  },\n  {\n    name: 'WASP-43 b',\n    radius: 11.6,\n    distance: null,\n  },\n  {\n    name: 'WASP-44 b',\n    radius: 12.77,\n    distance: null,\n  },\n  {\n    name: 'WASP-45 b',\n    radius: 12.99,\n    distance: null,\n  },\n  {\n    name: 'WASP-46 b',\n    radius: 14.67,\n    distance: null,\n  },\n  {\n    name: 'WASP-47 b',\n    radius: 12.88,\n    distance: 200,\n  },\n  {\n    name: 'WASP-48 b',\n    radius: 18.7,\n    distance: null,\n  },\n  {\n    name: 'WASP-49 b',\n    radius: 12.49,\n    distance: null,\n  },\n  {\n    name: 'WASP-5 b',\n    radius: 13.12,\n    distance: 297,\n  },\n  {\n    name: 'WASP-50 b',\n    radius: 12.75,\n    distance: 230,\n  },\n  {\n    name: 'WASP-52 b',\n    radius: 14.22,\n    distance: 140,\n  },\n  {\n    name: 'WASP-53 b',\n    radius: 13.44,\n    distance: null,\n  },\n  {\n    name: 'WASP-54 b',\n    radius: 15.68,\n    distance: null,\n  },\n  {\n    name: 'WASP-55 b',\n    radius: 14.56,\n    distance: 330,\n  },\n  {\n    name: 'WASP-56 b',\n    radius: 13.44,\n    distance: null,\n  },\n  {\n    name: 'WASP-57 b',\n    radius: 12.32,\n    distance: null,\n  },\n  {\n    name: 'WASP-58 b',\n    radius: 15.34,\n    distance: 300,\n  },\n  {\n    name: 'WASP-59 b',\n    radius: 10.08,\n    distance: 125,\n  },\n  {\n    name: 'WASP-6 b',\n    radius: 13.71,\n    distance: 307,\n  },\n  {\n    name: 'WASP-60 b',\n    radius: 10.08,\n    distance: 400,\n  },\n  {\n    name: 'WASP-61 b',\n    radius: 13.89,\n    distance: 480,\n  },\n  {\n    name: 'WASP-62 b',\n    radius: 15.57,\n    distance: 160,\n  },\n  {\n    name: 'WASP-63 b',\n    radius: 16.02,\n    distance: 330,\n  },\n  {\n    name: 'WASP-64 b',\n    radius: 7.84,\n    distance: null,\n  },\n  {\n    name: 'WASP-65 b',\n    radius: 12.45,\n    distance: 310,\n  },\n  {\n    name: 'WASP-66 b',\n    radius: 15.57,\n    distance: 380,\n  },\n  {\n    name: 'WASP-67 b',\n    radius: 15.68,\n    distance: 225,\n  },\n  {\n    name: 'WASP-68 b',\n    radius: 10.08,\n    distance: null,\n  },\n  {\n    name: 'WASP-69 b',\n    radius: 11.2,\n    distance: null,\n  },\n  {\n    name: 'WASP-7 b',\n    radius: 14.9,\n    distance: 140,\n  },\n  {\n    name: 'WASP-70 b',\n    radius: 8.96,\n    distance: null,\n  },\n  {\n    name: 'WASP-71 b',\n    radius: 16.8,\n    distance: 200,\n  },\n  {\n    name: 'WASP-72 b',\n    radius: 14.22,\n    distance: null,\n  },\n  {\n    name: 'WASP-75 b',\n    radius: 14.22,\n    distance: 260,\n  },\n  {\n    name: 'WASP-76 b',\n    radius: 20.5,\n    distance: 120,\n  },\n  {\n    name: 'WASP-77A b',\n    radius: 13.55,\n    distance: null,\n  },\n  {\n    name: 'WASP-78 b',\n    radius: 19.6,\n    distance: 550,\n  },\n  {\n    name: 'WASP-79 b',\n    radius: 19.04,\n    distance: 240,\n  },\n  {\n    name: 'WASP-8 b',\n    radius: 11.63,\n    distance: 87,\n  },\n  {\n    name: 'WASP-80 b',\n    radius: 10.66,\n    distance: 60,\n  },\n  {\n    name: 'WASP-82 b',\n    radius: 18.7,\n    distance: 200,\n  },\n  {\n    name: 'WASP-84 b',\n    radius: 10.55,\n    distance: 120,\n  },\n  {\n    name: 'WASP-90 b',\n    radius: 18.26,\n    distance: 340,\n  },\n  {\n    name: 'WASP-95 b',\n    radius: 13.55,\n    distance: null,\n  },\n  {\n    name: 'WASP-96 b',\n    radius: 13.44,\n    distance: null,\n  },\n  {\n    name: 'WASP-97 b',\n    radius: 12.66,\n    distance: null,\n  },\n  {\n    name: 'WASP-98 b',\n    radius: 12.32,\n    distance: null,\n  },\n  {\n    name: 'WASP-99 b',\n    radius: 12.32,\n    distance: null,\n  },\n  {\n    name: 'WD 0806-661B b',\n    radius: 13.01,\n    distance: 19.2,\n  },\n  {\n    name: 'WISE 1217+16A b',\n    radius: 11.2,\n    distance: 10,\n  },\n  {\n    name: 'WISE 1711+3500 b',\n    radius: 12.74,\n    distance: 19,\n  },\n  {\n    name: 'WTS-1 b',\n    radius: 16.69,\n    distance: 3200,\n  },\n  {\n    name: 'WTS-2 b',\n    radius: 14.56,\n    distance: 1000,\n  },\n  {\n    name: 'XO-1 b',\n    radius: 13.26,\n    distance: 200,\n  },\n  {\n    name: 'XO-2 b',\n    radius: 10.9,\n    distance: 149,\n  },\n  {\n    name: 'XO-3 b',\n    radius: 13.63,\n    distance: 260,\n  },\n  {\n    name: 'XO-4 b',\n    radius: 15.01,\n    distance: 293,\n  },\n  {\n    name: 'XO-5 b',\n    radius: 11.54,\n    distance: 255,\n  },\n];\n\nexport default exoplanets;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/groupDateValue.ts",
    "content": "export interface GroupDateValue {\n  key: string;\n  value: string;\n  date: string;\n}\n\nconst groupDateValue: GroupDateValue[] = [\n  { key: 'Group1', value: '37', date: '04/23/12' },\n  { key: 'Group2', value: '12', date: '04/23/12' },\n  { key: 'Group3', value: '46', date: '04/23/12' },\n  { key: 'Group1', value: '32', date: '04/24/12' },\n  { key: 'Group2', value: '19', date: '04/24/12' },\n  { key: 'Group3', value: '42', date: '04/24/12' },\n  { key: 'Group1', value: '45', date: '04/25/12' },\n  { key: 'Group2', value: '16', date: '04/25/12' },\n  { key: 'Group3', value: '44', date: '04/25/12' },\n  { key: 'Group1', value: '24', date: '04/26/12' },\n  { key: 'Group2', value: '52', date: '04/26/12' },\n  { key: 'Group3', value: '64', date: '04/26/12' },\n];\n\nexport default groupDateValue;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/lesMiserables.ts",
    "content": "export interface LesMiserablesNode {\n  id: string;\n  group: number;\n}\n\nexport interface LesMiserablesLink {\n  source: string;\n  target: string;\n  value: number;\n}\n\nexport interface LesMiserables {\n  nodes: LesMiserablesNode[];\n  links: LesMiserablesLink[];\n}\n\nconst lesMiserables: LesMiserables = {\n  nodes: [\n    { id: 'Myriel', group: 1 },\n    { id: 'Napoleon', group: 1 },\n    { id: 'Mlle.Baptistine', group: 1 },\n    { id: 'Mme.Magloire', group: 1 },\n    { id: 'CountessdeLo', group: 1 },\n    { id: 'Geborand', group: 1 },\n    { id: 'Champtercier', group: 1 },\n    { id: 'Cravatte', group: 1 },\n    { id: 'Count', group: 1 },\n    { id: 'OldMan', group: 1 },\n    { id: 'Labarre', group: 2 },\n    { id: 'Valjean', group: 2 },\n    { id: 'Marguerite', group: 3 },\n    { id: 'Mme.deR', group: 2 },\n    { id: 'Isabeau', group: 2 },\n    { id: 'Gervais', group: 2 },\n    { id: 'Tholomyes', group: 3 },\n    { id: 'Listolier', group: 3 },\n    { id: 'Fameuil', group: 3 },\n    { id: 'Blacheville', group: 3 },\n    { id: 'Favourite', group: 3 },\n    { id: 'Dahlia', group: 3 },\n    { id: 'Zephine', group: 3 },\n    { id: 'Fantine', group: 3 },\n    { id: 'Mme.Thenardier', group: 4 },\n    { id: 'Thenardier', group: 4 },\n    { id: 'Cosette', group: 5 },\n    { id: 'Javert', group: 4 },\n    { id: 'Fauchelevent', group: 0 },\n    { id: 'Bamatabois', group: 2 },\n    { id: 'Perpetue', group: 3 },\n    { id: 'Simplice', group: 2 },\n    { id: 'Scaufflaire', group: 2 },\n    { id: 'Woman1', group: 2 },\n    { id: 'Judge', group: 2 },\n    { id: 'Champmathieu', group: 2 },\n    { id: 'Brevet', group: 2 },\n    { id: 'Chenildieu', group: 2 },\n    { id: 'Cochepaille', group: 2 },\n    { id: 'Pontmercy', group: 4 },\n    { id: 'Boulatruelle', group: 6 },\n    { id: 'Eponine', group: 4 },\n    { id: 'Anzelma', group: 4 },\n    { id: 'Woman2', group: 5 },\n    { id: 'MotherInnocent', group: 0 },\n    { id: 'Gribier', group: 0 },\n    { id: 'Jondrette', group: 7 },\n    { id: 'Mme.Burgon', group: 7 },\n    { id: 'Gavroche', group: 8 },\n    { id: 'Gillenormand', group: 5 },\n    { id: 'Magnon', group: 5 },\n    { id: 'Mlle.Gillenormand', group: 5 },\n    { id: 'Mme.Pontmercy', group: 5 },\n    { id: 'Mlle.Vaubois', group: 5 },\n    { id: 'Lt.Gillenormand', group: 5 },\n    { id: 'Marius', group: 8 },\n    { id: 'BaronessT', group: 5 },\n    { id: 'Mabeuf', group: 8 },\n    { id: 'Enjolras', group: 8 },\n    { id: 'Combeferre', group: 8 },\n    { id: 'Prouvaire', group: 8 },\n    { id: 'Feuilly', group: 8 },\n    { id: 'Courfeyrac', group: 8 },\n    { id: 'Bahorel', group: 8 },\n    { id: 'Bossuet', group: 8 },\n    { id: 'Joly', group: 8 },\n    { id: 'Grantaire', group: 8 },\n    { id: 'MotherPlutarch', group: 9 },\n    { id: 'Gueulemer', group: 4 },\n    { id: 'Babet', group: 4 },\n    { id: 'Claquesous', group: 4 },\n    { id: 'Montparnasse', group: 4 },\n    { id: 'Toussaint', group: 5 },\n    { id: 'Child1', group: 10 },\n    { id: 'Child2', group: 10 },\n    { id: 'Brujon', group: 4 },\n    { id: 'Mme.Hucheloup', group: 8 },\n  ],\n  links: [\n    { source: 'Napoleon', target: 'Myriel', value: 1 },\n    { source: 'Mlle.Baptistine', target: 'Myriel', value: 8 },\n    { source: 'Mme.Magloire', target: 'Myriel', value: 10 },\n    { source: 'Mme.Magloire', target: 'Mlle.Baptistine', value: 6 },\n    { source: 'CountessdeLo', target: 'Myriel', value: 1 },\n    { source: 'Geborand', target: 'Myriel', value: 1 },\n    { source: 'Champtercier', target: 'Myriel', value: 1 },\n    { source: 'Cravatte', target: 'Myriel', value: 1 },\n    { source: 'Count', target: 'Myriel', value: 2 },\n    { source: 'OldMan', target: 'Myriel', value: 1 },\n    { source: 'Valjean', target: 'Labarre', value: 1 },\n    { source: 'Valjean', target: 'Mme.Magloire', value: 3 },\n    { source: 'Valjean', target: 'Mlle.Baptistine', value: 3 },\n    { source: 'Valjean', target: 'Myriel', value: 5 },\n    { source: 'Marguerite', target: 'Valjean', value: 1 },\n    { source: 'Mme.deR', target: 'Valjean', value: 1 },\n    { source: 'Isabeau', target: 'Valjean', value: 1 },\n    { source: 'Gervais', target: 'Valjean', value: 1 },\n    { source: 'Listolier', target: 'Tholomyes', value: 4 },\n    { source: 'Fameuil', target: 'Tholomyes', value: 4 },\n    { source: 'Fameuil', target: 'Listolier', value: 4 },\n    { source: 'Blacheville', target: 'Tholomyes', value: 4 },\n    { source: 'Blacheville', target: 'Listolier', value: 4 },\n    { source: 'Blacheville', target: 'Fameuil', value: 4 },\n    { source: 'Favourite', target: 'Tholomyes', value: 3 },\n    { source: 'Favourite', target: 'Listolier', value: 3 },\n    { source: 'Favourite', target: 'Fameuil', value: 3 },\n    { source: 'Favourite', target: 'Blacheville', value: 4 },\n    { source: 'Dahlia', target: 'Tholomyes', value: 3 },\n    { source: 'Dahlia', target: 'Listolier', value: 3 },\n    { source: 'Dahlia', target: 'Fameuil', value: 3 },\n    { source: 'Dahlia', target: 'Blacheville', value: 3 },\n    { source: 'Dahlia', target: 'Favourite', value: 5 },\n    { source: 'Zephine', target: 'Tholomyes', value: 3 },\n    { source: 'Zephine', target: 'Listolier', value: 3 },\n    { source: 'Zephine', target: 'Fameuil', value: 3 },\n    { source: 'Zephine', target: 'Blacheville', value: 3 },\n    { source: 'Zephine', target: 'Favourite', value: 4 },\n    { source: 'Zephine', target: 'Dahlia', value: 4 },\n    { source: 'Fantine', target: 'Tholomyes', value: 3 },\n    { source: 'Fantine', target: 'Listolier', value: 3 },\n    { source: 'Fantine', target: 'Fameuil', value: 3 },\n    { source: 'Fantine', target: 'Blacheville', value: 3 },\n    { source: 'Fantine', target: 'Favourite', value: 4 },\n    { source: 'Fantine', target: 'Dahlia', value: 4 },\n    { source: 'Fantine', target: 'Zephine', value: 4 },\n    { source: 'Fantine', target: 'Marguerite', value: 2 },\n    { source: 'Fantine', target: 'Valjean', value: 9 },\n    { source: 'Mme.Thenardier', target: 'Fantine', value: 2 },\n    { source: 'Mme.Thenardier', target: 'Valjean', value: 7 },\n    { source: 'Thenardier', target: 'Mme.Thenardier', value: 13 },\n    { source: 'Thenardier', target: 'Fantine', value: 1 },\n    { source: 'Thenardier', target: 'Valjean', value: 12 },\n    { source: 'Cosette', target: 'Mme.Thenardier', value: 4 },\n    { source: 'Cosette', target: 'Valjean', value: 31 },\n    { source: 'Cosette', target: 'Tholomyes', value: 1 },\n    { source: 'Cosette', target: 'Thenardier', value: 1 },\n    { source: 'Javert', target: 'Valjean', value: 17 },\n    { source: 'Javert', target: 'Fantine', value: 5 },\n    { source: 'Javert', target: 'Thenardier', value: 5 },\n    { source: 'Javert', target: 'Mme.Thenardier', value: 1 },\n    { source: 'Javert', target: 'Cosette', value: 1 },\n    { source: 'Fauchelevent', target: 'Valjean', value: 8 },\n    { source: 'Fauchelevent', target: 'Javert', value: 1 },\n    { source: 'Bamatabois', target: 'Fantine', value: 1 },\n    { source: 'Bamatabois', target: 'Javert', value: 1 },\n    { source: 'Bamatabois', target: 'Valjean', value: 2 },\n    { source: 'Perpetue', target: 'Fantine', value: 1 },\n    { source: 'Simplice', target: 'Perpetue', value: 2 },\n    { source: 'Simplice', target: 'Valjean', value: 3 },\n    { source: 'Simplice', target: 'Fantine', value: 2 },\n    { source: 'Simplice', target: 'Javert', value: 1 },\n    { source: 'Scaufflaire', target: 'Valjean', value: 1 },\n    { source: 'Woman1', target: 'Valjean', value: 2 },\n    { source: 'Woman1', target: 'Javert', value: 1 },\n    { source: 'Judge', target: 'Valjean', value: 3 },\n    { source: 'Judge', target: 'Bamatabois', value: 2 },\n    { source: 'Champmathieu', target: 'Valjean', value: 3 },\n    { source: 'Champmathieu', target: 'Judge', value: 3 },\n    { source: 'Champmathieu', target: 'Bamatabois', value: 2 },\n    { source: 'Brevet', target: 'Judge', value: 2 },\n    { source: 'Brevet', target: 'Champmathieu', value: 2 },\n    { source: 'Brevet', target: 'Valjean', value: 2 },\n    { source: 'Brevet', target: 'Bamatabois', value: 1 },\n    { source: 'Chenildieu', target: 'Judge', value: 2 },\n    { source: 'Chenildieu', target: 'Champmathieu', value: 2 },\n    { source: 'Chenildieu', target: 'Brevet', value: 2 },\n    { source: 'Chenildieu', target: 'Valjean', value: 2 },\n    { source: 'Chenildieu', target: 'Bamatabois', value: 1 },\n    { source: 'Cochepaille', target: 'Judge', value: 2 },\n    { source: 'Cochepaille', target: 'Champmathieu', value: 2 },\n    { source: 'Cochepaille', target: 'Brevet', value: 2 },\n    { source: 'Cochepaille', target: 'Chenildieu', value: 2 },\n    { source: 'Cochepaille', target: 'Valjean', value: 2 },\n    { source: 'Cochepaille', target: 'Bamatabois', value: 1 },\n    { source: 'Pontmercy', target: 'Thenardier', value: 1 },\n    { source: 'Boulatruelle', target: 'Thenardier', value: 1 },\n    { source: 'Eponine', target: 'Mme.Thenardier', value: 2 },\n    { source: 'Eponine', target: 'Thenardier', value: 3 },\n    { source: 'Anzelma', target: 'Eponine', value: 2 },\n    { source: 'Anzelma', target: 'Thenardier', value: 2 },\n    { source: 'Anzelma', target: 'Mme.Thenardier', value: 1 },\n    { source: 'Woman2', target: 'Valjean', value: 3 },\n    { source: 'Woman2', target: 'Cosette', value: 1 },\n    { source: 'Woman2', target: 'Javert', value: 1 },\n    { source: 'MotherInnocent', target: 'Fauchelevent', value: 3 },\n    { source: 'MotherInnocent', target: 'Valjean', value: 1 },\n    { source: 'Gribier', target: 'Fauchelevent', value: 2 },\n    { source: 'Mme.Burgon', target: 'Jondrette', value: 1 },\n    { source: 'Gavroche', target: 'Mme.Burgon', value: 2 },\n    { source: 'Gavroche', target: 'Thenardier', value: 1 },\n    { source: 'Gavroche', target: 'Javert', value: 1 },\n    { source: 'Gavroche', target: 'Valjean', value: 1 },\n    { source: 'Gillenormand', target: 'Cosette', value: 3 },\n    { source: 'Gillenormand', target: 'Valjean', value: 2 },\n    { source: 'Magnon', target: 'Gillenormand', value: 1 },\n    { source: 'Magnon', target: 'Mme.Thenardier', value: 1 },\n    { source: 'Mlle.Gillenormand', target: 'Gillenormand', value: 9 },\n    { source: 'Mlle.Gillenormand', target: 'Cosette', value: 2 },\n    { source: 'Mlle.Gillenormand', target: 'Valjean', value: 2 },\n    { source: 'Mme.Pontmercy', target: 'Mlle.Gillenormand', value: 1 },\n    { source: 'Mme.Pontmercy', target: 'Pontmercy', value: 1 },\n    { source: 'Mlle.Vaubois', target: 'Mlle.Gillenormand', value: 1 },\n    { source: 'Lt.Gillenormand', target: 'Mlle.Gillenormand', value: 2 },\n    { source: 'Lt.Gillenormand', target: 'Gillenormand', value: 1 },\n    { source: 'Lt.Gillenormand', target: 'Cosette', value: 1 },\n    { source: 'Marius', target: 'Mlle.Gillenormand', value: 6 },\n    { source: 'Marius', target: 'Gillenormand', value: 12 },\n    { source: 'Marius', target: 'Pontmercy', value: 1 },\n    { source: 'Marius', target: 'Lt.Gillenormand', value: 1 },\n    { source: 'Marius', target: 'Cosette', value: 21 },\n    { source: 'Marius', target: 'Valjean', value: 19 },\n    { source: 'Marius', target: 'Tholomyes', value: 1 },\n    { source: 'Marius', target: 'Thenardier', value: 2 },\n    { source: 'Marius', target: 'Eponine', value: 5 },\n    { source: 'Marius', target: 'Gavroche', value: 4 },\n    { source: 'BaronessT', target: 'Gillenormand', value: 1 },\n    { source: 'BaronessT', target: 'Marius', value: 1 },\n    { source: 'Mabeuf', target: 'Marius', value: 1 },\n    { source: 'Mabeuf', target: 'Eponine', value: 1 },\n    { source: 'Mabeuf', target: 'Gavroche', value: 1 },\n    { source: 'Enjolras', target: 'Marius', value: 7 },\n    { source: 'Enjolras', target: 'Gavroche', value: 7 },\n    { source: 'Enjolras', target: 'Javert', value: 6 },\n    { source: 'Enjolras', target: 'Mabeuf', value: 1 },\n    { source: 'Enjolras', target: 'Valjean', value: 4 },\n    { source: 'Combeferre', target: 'Enjolras', value: 15 },\n    { source: 'Combeferre', target: 'Marius', value: 5 },\n    { source: 'Combeferre', target: 'Gavroche', value: 6 },\n    { source: 'Combeferre', target: 'Mabeuf', value: 2 },\n    { source: 'Prouvaire', target: 'Gavroche', value: 1 },\n    { source: 'Prouvaire', target: 'Enjolras', value: 4 },\n    { source: 'Prouvaire', target: 'Combeferre', value: 2 },\n    { source: 'Feuilly', target: 'Gavroche', value: 2 },\n    { source: 'Feuilly', target: 'Enjolras', value: 6 },\n    { source: 'Feuilly', target: 'Prouvaire', value: 2 },\n    { source: 'Feuilly', target: 'Combeferre', value: 5 },\n    { source: 'Feuilly', target: 'Mabeuf', value: 1 },\n    { source: 'Feuilly', target: 'Marius', value: 1 },\n    { source: 'Courfeyrac', target: 'Marius', value: 9 },\n    { source: 'Courfeyrac', target: 'Enjolras', value: 17 },\n    { source: 'Courfeyrac', target: 'Combeferre', value: 13 },\n    { source: 'Courfeyrac', target: 'Gavroche', value: 7 },\n    { source: 'Courfeyrac', target: 'Mabeuf', value: 2 },\n    { source: 'Courfeyrac', target: 'Eponine', value: 1 },\n    { source: 'Courfeyrac', target: 'Feuilly', value: 6 },\n    { source: 'Courfeyrac', target: 'Prouvaire', value: 3 },\n    { source: 'Bahorel', target: 'Combeferre', value: 5 },\n    { source: 'Bahorel', target: 'Gavroche', value: 5 },\n    { source: 'Bahorel', target: 'Courfeyrac', value: 6 },\n    { source: 'Bahorel', target: 'Mabeuf', value: 2 },\n    { source: 'Bahorel', target: 'Enjolras', value: 4 },\n    { source: 'Bahorel', target: 'Feuilly', value: 3 },\n    { source: 'Bahorel', target: 'Prouvaire', value: 2 },\n    { source: 'Bahorel', target: 'Marius', value: 1 },\n    { source: 'Bossuet', target: 'Marius', value: 5 },\n    { source: 'Bossuet', target: 'Courfeyrac', value: 12 },\n    { source: 'Bossuet', target: 'Gavroche', value: 5 },\n    { source: 'Bossuet', target: 'Bahorel', value: 4 },\n    { source: 'Bossuet', target: 'Enjolras', value: 10 },\n    { source: 'Bossuet', target: 'Feuilly', value: 6 },\n    { source: 'Bossuet', target: 'Prouvaire', value: 2 },\n    { source: 'Bossuet', target: 'Combeferre', value: 9 },\n    { source: 'Bossuet', target: 'Mabeuf', value: 1 },\n    { source: 'Bossuet', target: 'Valjean', value: 1 },\n    { source: 'Joly', target: 'Bahorel', value: 5 },\n    { source: 'Joly', target: 'Bossuet', value: 7 },\n    { source: 'Joly', target: 'Gavroche', value: 3 },\n    { source: 'Joly', target: 'Courfeyrac', value: 5 },\n    { source: 'Joly', target: 'Enjolras', value: 5 },\n    { source: 'Joly', target: 'Feuilly', value: 5 },\n    { source: 'Joly', target: 'Prouvaire', value: 2 },\n    { source: 'Joly', target: 'Combeferre', value: 5 },\n    { source: 'Joly', target: 'Mabeuf', value: 1 },\n    { source: 'Joly', target: 'Marius', value: 2 },\n    { source: 'Grantaire', target: 'Bossuet', value: 3 },\n    { source: 'Grantaire', target: 'Enjolras', value: 3 },\n    { source: 'Grantaire', target: 'Combeferre', value: 1 },\n    { source: 'Grantaire', target: 'Courfeyrac', value: 2 },\n    { source: 'Grantaire', target: 'Joly', value: 2 },\n    { source: 'Grantaire', target: 'Gavroche', value: 1 },\n    { source: 'Grantaire', target: 'Bahorel', value: 1 },\n    { source: 'Grantaire', target: 'Feuilly', value: 1 },\n    { source: 'Grantaire', target: 'Prouvaire', value: 1 },\n    { source: 'MotherPlutarch', target: 'Mabeuf', value: 3 },\n    { source: 'Gueulemer', target: 'Thenardier', value: 5 },\n    { source: 'Gueulemer', target: 'Valjean', value: 1 },\n    { source: 'Gueulemer', target: 'Mme.Thenardier', value: 1 },\n    { source: 'Gueulemer', target: 'Javert', value: 1 },\n    { source: 'Gueulemer', target: 'Gavroche', value: 1 },\n    { source: 'Gueulemer', target: 'Eponine', value: 1 },\n    { source: 'Babet', target: 'Thenardier', value: 6 },\n    { source: 'Babet', target: 'Gueulemer', value: 6 },\n    { source: 'Babet', target: 'Valjean', value: 1 },\n    { source: 'Babet', target: 'Mme.Thenardier', value: 1 },\n    { source: 'Babet', target: 'Javert', value: 2 },\n    { source: 'Babet', target: 'Gavroche', value: 1 },\n    { source: 'Babet', target: 'Eponine', value: 1 },\n    { source: 'Claquesous', target: 'Thenardier', value: 4 },\n    { source: 'Claquesous', target: 'Babet', value: 4 },\n    { source: 'Claquesous', target: 'Gueulemer', value: 4 },\n    { source: 'Claquesous', target: 'Valjean', value: 1 },\n    { source: 'Claquesous', target: 'Mme.Thenardier', value: 1 },\n    { source: 'Claquesous', target: 'Javert', value: 1 },\n    { source: 'Claquesous', target: 'Eponine', value: 1 },\n    { source: 'Claquesous', target: 'Enjolras', value: 1 },\n    { source: 'Montparnasse', target: 'Javert', value: 1 },\n    { source: 'Montparnasse', target: 'Babet', value: 2 },\n    { source: 'Montparnasse', target: 'Gueulemer', value: 2 },\n    { source: 'Montparnasse', target: 'Claquesous', value: 2 },\n    { source: 'Montparnasse', target: 'Valjean', value: 1 },\n    { source: 'Montparnasse', target: 'Gavroche', value: 1 },\n    { source: 'Montparnasse', target: 'Eponine', value: 1 },\n    { source: 'Montparnasse', target: 'Thenardier', value: 1 },\n    { source: 'Toussaint', target: 'Cosette', value: 2 },\n    { source: 'Toussaint', target: 'Javert', value: 1 },\n    { source: 'Toussaint', target: 'Valjean', value: 1 },\n    { source: 'Child1', target: 'Gavroche', value: 2 },\n    { source: 'Child2', target: 'Gavroche', value: 2 },\n    { source: 'Child2', target: 'Child1', value: 3 },\n    { source: 'Brujon', target: 'Babet', value: 3 },\n    { source: 'Brujon', target: 'Gueulemer', value: 3 },\n    { source: 'Brujon', target: 'Thenardier', value: 3 },\n    { source: 'Brujon', target: 'Gavroche', value: 1 },\n    { source: 'Brujon', target: 'Eponine', value: 1 },\n    { source: 'Brujon', target: 'Claquesous', value: 1 },\n    { source: 'Brujon', target: 'Montparnasse', value: 1 },\n    { source: 'Mme.Hucheloup', target: 'Bossuet', value: 1 },\n    { source: 'Mme.Hucheloup', target: 'Joly', value: 1 },\n    { source: 'Mme.Hucheloup', target: 'Grantaire', value: 1 },\n    { source: 'Mme.Hucheloup', target: 'Bahorel', value: 1 },\n    { source: 'Mme.Hucheloup', target: 'Courfeyrac', value: 1 },\n    { source: 'Mme.Hucheloup', target: 'Gavroche', value: 1 },\n    { source: 'Mme.Hucheloup', target: 'Enjolras', value: 1 },\n  ],\n};\n\nexport default lesMiserables;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/letterFrequency.ts",
    "content": "export interface LetterFrequency {\n  letter: string;\n  frequency: number;\n}\n\nconst letterFrequency: LetterFrequency[] = [\n  { letter: 'A', frequency: 0.08167 },\n  { letter: 'B', frequency: 0.01492 },\n  { letter: 'C', frequency: 0.02782 },\n  { letter: 'D', frequency: 0.04253 },\n  { letter: 'E', frequency: 0.12702 },\n  { letter: 'F', frequency: 0.02288 },\n  { letter: 'G', frequency: 0.02015 },\n  { letter: 'H', frequency: 0.06094 },\n  { letter: 'I', frequency: 0.06966 },\n  { letter: 'J', frequency: 0.00153 },\n  { letter: 'K', frequency: 0.00772 },\n  { letter: 'L', frequency: 0.04025 },\n  { letter: 'M', frequency: 0.02406 },\n  { letter: 'N', frequency: 0.06749 },\n  { letter: 'O', frequency: 0.07507 },\n  { letter: 'P', frequency: 0.01929 },\n  { letter: 'Q', frequency: 0.00095 },\n  { letter: 'R', frequency: 0.05987 },\n  { letter: 'S', frequency: 0.06327 },\n  { letter: 'T', frequency: 0.09056 },\n  { letter: 'U', frequency: 0.02758 },\n  { letter: 'V', frequency: 0.00978 },\n  { letter: 'W', frequency: 0.0236 },\n  { letter: 'X', frequency: 0.0015 },\n  { letter: 'Y', frequency: 0.01974 },\n  { letter: 'Z', frequency: 0.00074 },\n];\n\nexport default letterFrequency;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/planets.ts",
    "content": "export interface Planets {\n  name: string;\n  radius: string;\n  distance: string;\n}\n\nconst planets: Planets[] = [\n  {\n    name: 'Jupiter',\n    radius: '10.97',\n    distance: '0',\n  },\n  {\n    name: 'Saturn',\n    radius: '9.14',\n    distance: '0',\n  },\n  {\n    name: 'Uranus',\n    radius: '3.98',\n    distance: '0',\n  },\n  {\n    name: 'Neptune',\n    radius: '3.86',\n    distance: '0',\n  },\n  {\n    name: 'Earth',\n    radius: '1',\n    distance: '0',\n  },\n  {\n    name: 'Venus',\n    radius: '0.950',\n    distance: '0',\n  },\n  {\n    name: 'Mars',\n    radius: '0.532',\n    distance: '0',\n  },\n  {\n    name: 'Mercury',\n    radius: '0.383',\n    distance: '0',\n  },\n  {\n    name: 'Pluto',\n    radius: '0.181',\n    distance: '0',\n  },\n];\n\nexport default planets;\n"
  },
  {
    "path": "packages/visx-mock-data/src/mocks/shakespeare.ts",
    "content": "export interface Shakespeare {\n  id: string;\n  parent: string | null;\n  size: number | null;\n}\n\nconst shakespeare: Shakespeare[] = [\n  {\n    id: 'Shakespeare',\n    parent: null,\n    size: 0,\n  },\n  {\n    id: 'Comedies',\n    parent: 'Shakespeare',\n    size: null,\n  },\n  {\n    id: 'Tragedies',\n    parent: 'Shakespeare',\n    size: null,\n  },\n  {\n    id: 'Histories',\n    parent: 'Shakespeare',\n    size: null,\n  },\n  {\n    id: 'As You Like It',\n    parent: 'Comedies',\n    size: null,\n  },\n  {\n    id: 'Adam',\n    parent: 'As You Like It',\n    size: 10,\n  },\n  {\n    id: 'Amiens',\n    parent: 'As You Like It',\n    size: 10,\n  },\n  {\n    id: 'Audrey',\n    parent: 'As You Like It',\n    size: 12,\n  },\n  {\n    id: 'Celia',\n    parent: 'As You Like It',\n    size: 108,\n  },\n  {\n    id: 'Charles',\n    parent: 'As You Like It',\n    size: 8,\n  },\n  {\n    id: 'Corin',\n    parent: 'As You Like It',\n    size: 24,\n  },\n  {\n    id: 'Dennis',\n    parent: 'As You Like It',\n    size: 2,\n  },\n  {\n    id: 'Duke',\n    parent: 'As You Like It',\n    size: 32,\n  },\n  {\n    id: 'Frederick',\n    parent: 'As You Like It',\n    size: 20,\n  },\n  {\n    id: 'Hymen',\n    parent: 'As You Like It',\n    size: 1,\n  },\n  {\n    id: 'Jaques (lord)',\n    parent: 'As You Like It',\n    size: 57,\n  },\n  {\n    id: 'Jaques (son)',\n    parent: 'As You Like It',\n    size: 2,\n  },\n  {\n    id: 'Le Beau',\n    parent: 'As You Like It',\n    size: 14,\n  },\n  {\n    id: 'Oliver',\n    parent: 'As You Like It',\n    size: 37,\n  },\n  {\n    id: 'Orlando',\n    parent: 'As You Like It',\n    size: 120,\n  },\n  {\n    id: 'Phebe',\n    parent: 'As You Like It',\n    size: 23,\n  },\n  {\n    id: 'Rosalind',\n    parent: 'As You Like It',\n    size: 201,\n  },\n  {\n    id: 'Silvius',\n    parent: 'As You Like It',\n    size: 24,\n  },\n  {\n    id: 'Sir Oliver Martext',\n    parent: 'As You Like It',\n    size: 3,\n  },\n  {\n    id: 'Touchstone',\n    parent: 'As You Like It',\n    size: 74,\n  },\n  {\n    id: 'William',\n    parent: 'As You Like It',\n    size: 11,\n  },\n  {\n    id: 'Comedy Of Errors',\n    parent: 'Comedies',\n    size: null,\n  },\n  {\n    id: 'Adriana',\n    parent: 'Comedy Of Errors',\n    size: 79,\n  },\n  {\n    id: 'Aegeon',\n    parent: 'Comedy Of Errors',\n    size: 17,\n  },\n  {\n    id: 'Aemilia',\n    parent: 'Comedy Of Errors',\n    size: 16,\n  },\n  {\n    id: 'Angelo',\n    parent: 'Comedy Of Errors',\n    size: 31,\n  },\n  {\n    id: 'Antipholus of Ephesus',\n    parent: 'Comedy Of Errors',\n    size: 76,\n  },\n  {\n    id: 'Antipholus of Syracuse',\n    parent: 'Comedy Of Errors',\n    size: 103,\n  },\n  {\n    id: 'Balthazar',\n    parent: 'Comedy Of Errors',\n    size: 5,\n  },\n  {\n    id: 'Courtezan',\n    parent: 'Comedy Of Errors',\n    size: 11,\n  },\n  {\n    id: 'Dromio of Ephesus',\n    parent: 'Comedy Of Errors',\n    size: 63,\n  },\n  {\n    id: 'Dromio of Syracuse',\n    parent: 'Comedy Of Errors',\n    size: 99,\n  },\n  {\n    id: 'Luce',\n    parent: 'Comedy Of Errors',\n    size: 7,\n  },\n  {\n    id: 'Luciana',\n    parent: 'Comedy Of Errors',\n    size: 43,\n  },\n  {\n    id: 'Pinch',\n    parent: 'Comedy Of Errors',\n    size: 6,\n  },\n  {\n    id: 'Solinus',\n    parent: 'Comedy Of Errors',\n    size: 22,\n  },\n  {\n    id: 'Merchant Of Venice',\n    parent: 'Comedies',\n    size: null,\n  },\n  {\n    id: 'Antonio',\n    parent: 'Merchant Of Venice',\n    size: 47,\n  },\n  {\n    id: 'Balthasar',\n    parent: 'Merchant Of Venice',\n    size: 1,\n  },\n  {\n    id: 'Bassanio',\n    parent: 'Merchant Of Venice',\n    size: 73,\n  },\n  {\n    id: 'Duke (of Venice)',\n    parent: 'Merchant Of Venice',\n    size: 18,\n  },\n  {\n    id: 'Gratiano',\n    parent: 'Merchant Of Venice',\n    size: 48,\n  },\n  {\n    id: 'Jessica',\n    parent: 'Merchant Of Venice',\n    size: 26,\n  },\n  {\n    id: 'Launcelot Gobbo',\n    parent: 'Merchant Of Venice',\n    size: 44,\n  },\n  {\n    id: 'Leonardo',\n    parent: 'Merchant Of Venice',\n    size: 2,\n  },\n  {\n    id: 'Lorenzo',\n    parent: 'Merchant Of Venice',\n    size: 47,\n  },\n  {\n    id: 'Nerissa',\n    parent: 'Merchant Of Venice',\n    size: 36,\n  },\n  {\n    id: 'Old Gobbo',\n    parent: 'Merchant Of Venice',\n    size: 19,\n  },\n  {\n    id: 'Portia',\n    parent: 'Merchant Of Venice',\n    size: 117,\n  },\n  {\n    id: 'Prince of Arragon',\n    parent: 'Merchant Of Venice',\n    size: 4,\n  },\n  {\n    id: 'Prince of Morocco',\n    parent: 'Merchant Of Venice',\n    size: 7,\n  },\n  {\n    id: 'Salanio',\n    parent: 'Merchant Of Venice',\n    size: 18,\n  },\n  {\n    id: 'Salarino',\n    parent: 'Merchant Of Venice',\n    size: 27,\n  },\n  {\n    id: 'Salerio',\n    parent: 'Merchant Of Venice',\n    size: 6,\n  },\n  {\n    id: 'Shylock',\n    parent: 'Merchant Of Venice',\n    size: 79,\n  },\n  {\n    id: 'Stephano',\n    parent: 'Merchant Of Venice',\n    size: 3,\n  },\n  {\n    id: 'Tubal',\n    parent: 'Merchant Of Venice',\n    size: 8,\n  },\n  {\n    id: \"Midsummer Night's Dream\",\n    parent: 'Comedies',\n    size: null,\n  },\n  {\n    id: 'Bottom',\n    parent: \"Midsummer Night's Dream\",\n    size: 59,\n  },\n  {\n    id: 'Cobweb',\n    parent: \"Midsummer Night's Dream\",\n    size: 4,\n  },\n  {\n    id: 'Demetrius',\n    parent: \"Midsummer Night's Dream\",\n    size: 48,\n  },\n  {\n    id: 'Egeus',\n    parent: \"Midsummer Night's Dream\",\n    size: 7,\n  },\n  {\n    id: 'Fairy',\n    parent: \"Midsummer Night's Dream\",\n    size: 4,\n  },\n  {\n    id: 'Flute',\n    parent: \"Midsummer Night's Dream\",\n    size: 18,\n  },\n  {\n    id: 'Helena',\n    parent: \"Midsummer Night's Dream\",\n    size: 36,\n  },\n  {\n    id: 'Hermia',\n    parent: \"Midsummer Night's Dream\",\n    size: 48,\n  },\n  {\n    id: 'Hippolyta',\n    parent: \"Midsummer Night's Dream\",\n    size: 14,\n  },\n  {\n    id: 'Lysander',\n    parent: \"Midsummer Night's Dream\",\n    size: 50,\n  },\n  {\n    id: 'Moth',\n    parent: \"Midsummer Night's Dream\",\n    size: 2,\n  },\n  {\n    id: 'Mustardseed',\n    parent: \"Midsummer Night's Dream\",\n    size: 5,\n  },\n  {\n    id: 'Oberon',\n    parent: \"Midsummer Night's Dream\",\n    size: 29,\n  },\n  {\n    id: 'Peaseblossom',\n    parent: \"Midsummer Night's Dream\",\n    size: 4,\n  },\n  {\n    id: 'Philostrate',\n    parent: \"Midsummer Night's Dream\",\n    size: 6,\n  },\n  {\n    id: 'Puck',\n    parent: \"Midsummer Night's Dream\",\n    size: 33,\n  },\n  {\n    id: 'Quince',\n    parent: \"Midsummer Night's Dream\",\n    size: 40,\n  },\n  {\n    id: 'Snout',\n    parent: \"Midsummer Night's Dream\",\n    size: 9,\n  },\n  {\n    id: 'Snug',\n    parent: \"Midsummer Night's Dream\",\n    size: 4,\n  },\n  {\n    id: 'Starveling',\n    parent: \"Midsummer Night's Dream\",\n    size: 7,\n  },\n  {\n    id: 'Theseus',\n    parent: \"Midsummer Night's Dream\",\n    size: 48,\n  },\n  {\n    id: 'Titania',\n    parent: \"Midsummer Night's Dream\",\n    size: 23,\n  },\n  {\n    id: 'Taming Of The Shrew',\n    parent: 'Comedies',\n    size: null,\n  },\n  {\n    id: 'Baptista Minola',\n    parent: 'Taming Of The Shrew',\n    size: 68,\n  },\n  {\n    id: 'Bianca',\n    parent: 'Taming Of The Shrew',\n    size: 29,\n  },\n  {\n    id: 'Biondello',\n    parent: 'Taming Of The Shrew',\n    size: 39,\n  },\n  {\n    id: 'Christopher Sly',\n    parent: 'Taming Of The Shrew',\n    size: 24,\n  },\n  {\n    id: 'Curtis',\n    parent: 'Taming Of The Shrew',\n    size: 20,\n  },\n  {\n    id: 'Gremio',\n    parent: 'Taming Of The Shrew',\n    size: 58,\n  },\n  {\n    id: 'Grumio',\n    parent: 'Taming Of The Shrew',\n    size: 63,\n  },\n  {\n    id: 'Haberdasher',\n    parent: 'Taming Of The Shrew',\n    size: 1,\n  },\n  {\n    id: 'Hortensio',\n    parent: 'Taming Of The Shrew',\n    size: 70,\n  },\n  {\n    id: 'Joseph',\n    parent: 'Taming Of The Shrew',\n    size: 1,\n  },\n  {\n    id: 'Katherina',\n    parent: 'Taming Of The Shrew',\n    size: 82,\n  },\n  {\n    id: 'Lucentio',\n    parent: 'Taming Of The Shrew',\n    size: 61,\n  },\n  {\n    id: 'Nathaniel',\n    parent: 'Taming Of The Shrew',\n    size: 4,\n  },\n  {\n    id: 'Nicholas',\n    parent: 'Taming Of The Shrew',\n    size: 1,\n  },\n  {\n    id: 'Peter',\n    parent: 'Taming Of The Shrew',\n    size: 2,\n  },\n  {\n    id: 'Petruchio',\n    parent: 'Taming Of The Shrew',\n    size: 158,\n  },\n  {\n    id: 'Philip',\n    parent: 'Taming Of The Shrew',\n    size: 1,\n  },\n  {\n    id: 'Tranio',\n    parent: 'Taming Of The Shrew',\n    size: 90,\n  },\n  {\n    id: 'Vincentio',\n    parent: 'Taming Of The Shrew',\n    size: 23,\n  },\n  {\n    id: 'The Tempest',\n    parent: 'Comedies',\n    size: null,\n  },\n  {\n    id: 'Adrian',\n    parent: 'The Tempest',\n    size: 9,\n  },\n  {\n    id: 'Alonso',\n    parent: 'The Tempest',\n    size: 40,\n  },\n  {\n    id: 'Antonio, duke of Milan',\n    parent: 'The Tempest',\n    size: 57,\n  },\n  {\n    id: 'Ariel',\n    parent: 'The Tempest',\n    size: 45,\n  },\n  {\n    id: 'Caliban',\n    parent: 'The Tempest',\n    size: 50,\n  },\n  {\n    id: 'Ceres',\n    parent: 'The Tempest',\n    size: 4,\n  },\n  {\n    id: 'Ferdinand',\n    parent: 'The Tempest',\n    size: 31,\n  },\n  {\n    id: 'Francisco',\n    parent: 'The Tempest',\n    size: 2,\n  },\n  {\n    id: 'Gonzalo',\n    parent: 'The Tempest',\n    size: 52,\n  },\n  {\n    id: 'Iris',\n    parent: 'The Tempest',\n    size: 4,\n  },\n  {\n    id: 'Juno',\n    parent: 'The Tempest',\n    size: 2,\n  },\n  {\n    id: 'Master',\n    parent: 'The Tempest',\n    size: 2,\n  },\n  {\n    id: 'Miranda',\n    parent: 'The Tempest',\n    size: 50,\n  },\n  {\n    id: 'Nymphs',\n    parent: 'The Tempest',\n    size: 0,\n  },\n  {\n    id: 'Prospero',\n    parent: 'The Tempest',\n    size: 114,\n  },\n  {\n    id: 'Reapers',\n    parent: 'The Tempest',\n    size: 0,\n  },\n  {\n    id: 'Sebastian',\n    parent: 'The Tempest',\n    size: 67,\n  },\n  {\n    id: 'Stephano (Servant to Portia)',\n    parent: 'The Tempest',\n    size: 60,\n  },\n  {\n    id: 'Trinculo',\n    parent: 'The Tempest',\n    size: 39,\n  },\n  {\n    id: 'Henry VIII',\n    parent: 'Histories',\n    size: null,\n  },\n  {\n    id: 'Anne Bullen',\n    parent: 'Henry VIII',\n    size: 18,\n  },\n  {\n    id: 'Archbishop Cranmer',\n    parent: 'Henry VIII',\n    size: 21,\n  },\n  {\n    id: 'Bishop Lincoln',\n    parent: 'Henry VIII',\n    size: 2,\n  },\n  {\n    id: 'Brandon',\n    parent: 'Henry VIII',\n    size: 6,\n  },\n  {\n    id: 'Capucius',\n    parent: 'Henry VIII',\n    size: 5,\n  },\n  {\n    id: 'Cardinal Campeius',\n    parent: 'Henry VIII',\n    size: 14,\n  },\n  {\n    id: 'Cardinal Wolsey',\n    parent: 'Henry VIII',\n    size: 79,\n  },\n  {\n    id: 'Cromwell',\n    parent: 'Henry VIII',\n    size: 21,\n  },\n  {\n    id: 'Doctor Butts',\n    parent: 'Henry VIII',\n    size: 4,\n  },\n  {\n    id: 'Duke of Buckingham',\n    parent: 'Henry VIII',\n    size: 26,\n  },\n  {\n    id: 'Duke of Norfolk',\n    parent: 'Henry VIII',\n    size: 48,\n  },\n  {\n    id: 'Duke of Suffolk',\n    parent: 'Henry VIII',\n    size: 30,\n  },\n  {\n    id: 'Earl of Surrey',\n    parent: 'Henry VIII',\n    size: 24,\n  },\n  {\n    id: 'First Secretary to Wolsey',\n    parent: 'Henry VIII',\n    size: 2,\n  },\n  {\n    id: 'Gardiner',\n    parent: 'Henry VIII',\n    size: 22,\n  },\n  {\n    id: 'Garter',\n    parent: 'Henry VIII',\n    size: 1,\n  },\n  {\n    id: 'Griffith',\n    parent: 'Henry VIII',\n    size: 13,\n  },\n  {\n    id: 'King Henry VIII',\n    parent: 'Henry VIII',\n    size: 81,\n  },\n  {\n    id: 'Lord Abergavenny',\n    parent: 'Henry VIII',\n    size: 5,\n  },\n  {\n    id: 'Lord Chamberlain',\n    parent: 'Henry VIII',\n    size: 38,\n  },\n  {\n    id: 'Lord Chancellor',\n    parent: 'Henry VIII',\n    size: 7,\n  },\n  {\n    id: 'Lord Sands',\n    parent: 'Henry VIII',\n    size: 17,\n  },\n  {\n    id: 'Old Lady',\n    parent: 'Henry VIII',\n    size: 14,\n  },\n  {\n    id: 'Patience',\n    parent: 'Henry VIII',\n    size: 3,\n  },\n  {\n    id: 'Porter (door-keeper of the Council-chamber)',\n    parent: 'Henry VIII',\n    size: 10,\n  },\n  {\n    id: 'Queen Katharine',\n    parent: 'Henry VIII',\n    size: 50,\n  },\n  {\n    id: 'Sir Anthony Denny',\n    parent: 'Henry VIII',\n    size: 3,\n  },\n  {\n    id: 'Sir Henry Guildford',\n    parent: 'Henry VIII',\n    size: 1,\n  },\n  {\n    id: 'Sir Nicholas Vaux',\n    parent: 'Henry VIII',\n    size: 1,\n  },\n  {\n    id: 'Sir Thomas Lovell',\n    parent: 'Henry VIII',\n    size: 21,\n  },\n  {\n    id: 'Surveyor to the Duke of Buckingham',\n    parent: 'Henry VIII',\n    size: 9,\n  },\n  {\n    id: 'History Of King John',\n    parent: 'Histories',\n    size: null,\n  },\n  {\n    id: 'Arthur Duke of Bretagne',\n    parent: 'History Of King John',\n    size: 23,\n  },\n  {\n    id: 'Blanch',\n    parent: 'History Of King John',\n    size: 9,\n  },\n  {\n    id: 'Cardinal Pandulph',\n    parent: 'History Of King John',\n    size: 23,\n  },\n  {\n    id: 'Chatillon',\n    parent: 'History Of King John',\n    size: 5,\n  },\n  {\n    id: 'Constance',\n    parent: 'History Of King John',\n    size: 36,\n  },\n  {\n    id: 'Essex',\n    parent: 'History Of King John',\n    size: 1,\n  },\n  {\n    id: 'Faulconbridge',\n    parent: 'History Of King John',\n    size: 4,\n  },\n  {\n    id: 'Hubert de Burgh',\n    parent: 'History Of King John',\n    size: 52,\n  },\n  {\n    id: 'James Gurney',\n    parent: 'History Of King John',\n    size: 1,\n  },\n  {\n    id: 'King John',\n    parent: 'History Of King John',\n    size: 95,\n  },\n  {\n    id: 'King Phillip',\n    parent: 'History Of King John',\n    size: 43,\n  },\n  {\n    id: 'Lady Faulconbridge',\n    parent: 'History Of King John',\n    size: 5,\n  },\n  {\n    id: 'Lewis the Dauphin',\n    parent: 'History Of King John',\n    size: 29,\n  },\n  {\n    id: 'Lord Bigot',\n    parent: 'History Of King John',\n    size: 6,\n  },\n  {\n    id: 'Lymoges duke of Austria',\n    parent: 'History Of King John',\n    size: 16,\n  },\n  {\n    id: 'Melun',\n    parent: 'History Of King John',\n    size: 3,\n  },\n  {\n    id: 'Pembroke earl of Pembroke',\n    parent: 'History Of King John',\n    size: 20,\n  },\n  {\n    id: 'Peter of Pomfret',\n    parent: 'History Of King John',\n    size: 1,\n  },\n  {\n    id: 'Philip the Bastard',\n    parent: 'History Of King John',\n    size: 89,\n  },\n  {\n    id: 'Prince Henry',\n    parent: 'History Of King John',\n    size: 8,\n  },\n  {\n    id: 'Queen Elinor',\n    parent: 'History Of King John',\n    size: 22,\n  },\n  {\n    id: 'Salisbury earl of Salisbury',\n    parent: 'History Of King John',\n    size: 36,\n  },\n  {\n    id: 'Antony And Cleopatra',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Agrippa',\n    parent: 'Antony And Cleopatra',\n    size: 28,\n  },\n  {\n    id: 'Alexas',\n    parent: 'Antony And Cleopatra',\n    size: 15,\n  },\n  {\n    id: 'Antony',\n    parent: 'Antony And Cleopatra',\n    size: 202,\n  },\n  {\n    id: 'Canidius',\n    parent: 'Antony And Cleopatra',\n    size: 10,\n  },\n  {\n    id: 'Captain',\n    parent: 'Antony And Cleopatra',\n    size: 1,\n  },\n  {\n    id: 'Charmian',\n    parent: 'Antony And Cleopatra',\n    size: 63,\n  },\n  {\n    id: 'Cleopatra',\n    parent: 'Antony And Cleopatra',\n    size: 204,\n  },\n  {\n    id: 'Demetrius (Friend to Antony)',\n    parent: 'Antony And Cleopatra',\n    size: 2,\n  },\n  {\n    id: 'Dercetas',\n    parent: 'Antony And Cleopatra',\n    size: 5,\n  },\n  {\n    id: 'Diomedes',\n    parent: 'Antony And Cleopatra',\n    size: 7,\n  },\n  {\n    id: 'Dolabella',\n    parent: 'Antony And Cleopatra',\n    size: 23,\n  },\n  {\n    id: 'Domitius Enobarus',\n    parent: 'Antony And Cleopatra',\n    size: 113,\n  },\n  {\n    id: 'Egyptian',\n    parent: 'Antony And Cleopatra',\n    size: 2,\n  },\n  {\n    id: 'Eros',\n    parent: 'Antony And Cleopatra',\n    size: 27,\n  },\n  {\n    id: 'Euphronius',\n    parent: 'Antony And Cleopatra',\n    size: 5,\n  },\n  {\n    id: 'Gallus',\n    parent: 'Antony And Cleopatra',\n    size: 1,\n  },\n  {\n    id: 'Iras',\n    parent: 'Antony And Cleopatra',\n    size: 18,\n  },\n  {\n    id: 'Lepidus',\n    parent: 'Antony And Cleopatra',\n    size: 30,\n  },\n  {\n    id: 'Mardian',\n    parent: 'Antony And Cleopatra',\n    size: 7,\n  },\n  {\n    id: 'Mecaenas',\n    parent: 'Antony And Cleopatra',\n    size: 16,\n  },\n  {\n    id: 'Menas',\n    parent: 'Antony And Cleopatra',\n    size: 35,\n  },\n  {\n    id: 'Menecrates',\n    parent: 'Antony And Cleopatra',\n    size: 2,\n  },\n  {\n    id: 'Octavia',\n    parent: 'Antony And Cleopatra',\n    size: 13,\n  },\n  {\n    id: 'Octavius',\n    parent: 'Antony And Cleopatra',\n    size: 98,\n  },\n  {\n    id: 'Philo',\n    parent: 'Antony And Cleopatra',\n    size: 2,\n  },\n  {\n    id: 'Pompey',\n    parent: 'Antony And Cleopatra',\n    size: 41,\n  },\n  {\n    id: 'Proculeius',\n    parent: 'Antony And Cleopatra',\n    size: 10,\n  },\n  {\n    id: 'Scarus',\n    parent: 'Antony And Cleopatra',\n    size: 12,\n  },\n  {\n    id: 'Seleucus',\n    parent: 'Antony And Cleopatra',\n    size: 3,\n  },\n  {\n    id: 'Silius',\n    parent: 'Antony And Cleopatra',\n    size: 3,\n  },\n  {\n    id: 'Taurus',\n    parent: 'Antony And Cleopatra',\n    size: 1,\n  },\n  {\n    id: 'Thyreus',\n    parent: 'Antony And Cleopatra',\n    size: 12,\n  },\n  {\n    id: 'Varrius',\n    parent: 'Antony And Cleopatra',\n    size: 1,\n  },\n  {\n    id: 'Ventidius',\n    parent: 'Antony And Cleopatra',\n    size: 4,\n  },\n  {\n    id: 'Coriolanus',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Aedile',\n    parent: 'Coriolanus',\n    size: 10,\n  },\n  {\n    id: 'Cominius',\n    parent: 'Coriolanus',\n    size: 67,\n  },\n  {\n    id: 'Coriolanus (Caius Marcius Coriolanus)',\n    parent: 'Coriolanus',\n    size: 189,\n  },\n  {\n    id: 'Junius Brutus',\n    parent: 'Coriolanus',\n    size: 91,\n  },\n  {\n    id: 'Lieutenant',\n    parent: 'Coriolanus',\n    size: 4,\n  },\n  {\n    id: 'Menenius Agrippa',\n    parent: 'Coriolanus',\n    size: 162,\n  },\n  {\n    id: 'Patrician',\n    parent: 'Coriolanus',\n    size: 3,\n  },\n  {\n    id: 'Roman',\n    parent: 'Coriolanus',\n    size: 10,\n  },\n  {\n    id: 'Sicinius Velutus',\n    parent: 'Coriolanus',\n    size: 117,\n  },\n  {\n    id: 'Titus Lartius',\n    parent: 'Coriolanus',\n    size: 23,\n  },\n  {\n    id: 'Tullus Aufidius',\n    parent: 'Coriolanus',\n    size: 45,\n  },\n  {\n    id: 'Valeria',\n    parent: 'Coriolanus',\n    size: 14,\n  },\n  {\n    id: 'Virgilia',\n    parent: 'Coriolanus',\n    size: 26,\n  },\n  {\n    id: 'Volsce',\n    parent: 'Coriolanus',\n    size: 9,\n  },\n  {\n    id: 'Volumnia',\n    parent: 'Coriolanus',\n    size: 57,\n  },\n  {\n    id: 'Young Coriolanus',\n    parent: 'Coriolanus',\n    size: 1,\n  },\n  {\n    id: 'Cymbeline',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Arviragus',\n    parent: 'Cymbeline',\n    size: 46,\n  },\n  {\n    id: 'Belarius',\n    parent: 'Cymbeline',\n    size: 58,\n  },\n  {\n    id: 'Caius Lucius',\n    parent: 'Cymbeline',\n    size: 25,\n  },\n  {\n    id: 'Cloten',\n    parent: 'Cymbeline',\n    size: 77,\n  },\n  {\n    id: 'Cornelius (physician)',\n    parent: 'Cymbeline',\n    size: 13,\n  },\n  {\n    id: 'Cymbeline, King of Britain',\n    parent: 'Cymbeline',\n    size: 81,\n  },\n  {\n    id: 'Guiderius',\n    parent: 'Cymbeline',\n    size: 62,\n  },\n  {\n    id: 'Helen',\n    parent: 'Cymbeline',\n    size: 0,\n  },\n  {\n    id: 'Iachimo',\n    parent: 'Cymbeline',\n    size: 77,\n  },\n  {\n    id: 'Imogen',\n    parent: 'Cymbeline',\n    size: 118,\n  },\n  {\n    id: 'Jupiter',\n    parent: 'Cymbeline',\n    size: 1,\n  },\n  {\n    id: 'Philario',\n    parent: 'Cymbeline',\n    size: 14,\n  },\n  {\n    id: 'Pisanio',\n    parent: 'Cymbeline',\n    size: 58,\n  },\n  {\n    id: 'Posthumus Leonatus',\n    parent: 'Cymbeline',\n    size: 77,\n  },\n  {\n    id: 'Queen',\n    parent: 'Cymbeline',\n    size: 27,\n  },\n  {\n    id: 'Roman Captain',\n    parent: 'Cymbeline',\n    size: 4,\n  },\n  {\n    id: 'Sicilius Leonatus',\n    parent: 'Cymbeline',\n    size: 7,\n  },\n  {\n    id: 'The Tragedy of Hamlet, Prince of Denmark',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Bernardo',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 19,\n  },\n  {\n    id: 'Claudius, King of Denmark',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 102,\n  },\n  {\n    id: 'Cornelius',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 1,\n  },\n  {\n    id: \"Father's Ghost\",\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 15,\n  },\n  {\n    id: 'Fortinbras',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 6,\n  },\n  {\n    id: 'Francisco ',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 8,\n  },\n  {\n    id: 'Gertrude',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 69,\n  },\n  {\n    id: 'Guildenstern',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 29,\n  },\n  {\n    id: 'Hamlet',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 358,\n  },\n  {\n    id: 'Horatio',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 109,\n  },\n  {\n    id: 'Laertes',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 62,\n  },\n  {\n    id: 'Lucianus',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 0,\n  },\n  {\n    id: 'Marcellus',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 37,\n  },\n  {\n    id: 'Ophelia',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 58,\n  },\n  {\n    id: 'Osric',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 25,\n  },\n  {\n    id: 'Polonius',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 86,\n  },\n  {\n    id: 'Reynaldo',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 13,\n  },\n  {\n    id: 'Rosencrantz',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 48,\n  },\n  {\n    id: 'Voltemand',\n    parent: 'The Tragedy of Hamlet, Prince of Denmark',\n    size: 1,\n  },\n  {\n    id: 'Julius Caesar',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Antony (Marcus Antonius)',\n    parent: 'Julius Caesar',\n    size: 51,\n  },\n  {\n    id: 'Artemidorus of Cnidos',\n    parent: 'Julius Caesar',\n    size: 4,\n  },\n  {\n    id: 'Brutus (Marcus Brutus)',\n    parent: 'Julius Caesar',\n    size: 194,\n  },\n  {\n    id: 'Caesar (Julius Caesar)',\n    parent: 'Julius Caesar',\n    size: 42,\n  },\n  {\n    id: 'Calpurnia',\n    parent: 'Julius Caesar',\n    size: 6,\n  },\n  {\n    id: 'Casca',\n    parent: 'Julius Caesar',\n    size: 39,\n  },\n  {\n    id: 'Cassius',\n    parent: 'Julius Caesar',\n    size: 140,\n  },\n  {\n    id: 'Cicero',\n    parent: 'Julius Caesar',\n    size: 4,\n  },\n  {\n    id: 'Cinna',\n    parent: 'Julius Caesar',\n    size: 11,\n  },\n  {\n    id: 'Cinna the Poet',\n    parent: 'Julius Caesar',\n    size: 8,\n  },\n  {\n    id: 'Claudius',\n    parent: 'Julius Caesar',\n    size: 2,\n  },\n  {\n    id: 'Clitus',\n    parent: 'Julius Caesar',\n    size: 8,\n  },\n  {\n    id: 'Dardanius',\n    parent: 'Julius Caesar',\n    size: 3,\n  },\n  {\n    id: 'Decius Brutus',\n    parent: 'Julius Caesar',\n    size: 12,\n  },\n  {\n    id: 'Flavius',\n    parent: 'Julius Caesar',\n    size: 5,\n  },\n  {\n    id: 'Lepidus (Marcus Antonius Lepidus)',\n    parent: 'Julius Caesar',\n    size: 3,\n  },\n  {\n    id: 'Ligarius',\n    parent: 'Julius Caesar',\n    size: 5,\n  },\n  {\n    id: 'Lucilius',\n    parent: 'Julius Caesar',\n    size: 10,\n  },\n  {\n    id: 'Lucius',\n    parent: 'Julius Caesar',\n    size: 24,\n  },\n  {\n    id: 'Marullus',\n    parent: 'Julius Caesar',\n    size: 6,\n  },\n  {\n    id: 'Messala',\n    parent: 'Julius Caesar',\n    size: 20,\n  },\n  {\n    id: 'Metellus Cimber',\n    parent: 'Julius Caesar',\n    size: 5,\n  },\n  {\n    id: 'Octavius (Octavius Caesar)',\n    parent: 'Julius Caesar',\n    size: 19,\n  },\n  {\n    id: 'Pindarus',\n    parent: 'Julius Caesar',\n    size: 5,\n  },\n  {\n    id: 'Popilius (Popilius Lena)',\n    parent: 'Julius Caesar',\n    size: 2,\n  },\n  {\n    id: 'Portia (wife of Brutus)',\n    parent: 'Julius Caesar',\n    size: 16,\n  },\n  {\n    id: 'Publius',\n    parent: 'Julius Caesar',\n    size: 2,\n  },\n  {\n    id: 'Strato',\n    parent: 'Julius Caesar',\n    size: 4,\n  },\n  {\n    id: 'Tintinius',\n    parent: 'Julius Caesar',\n    size: 10,\n  },\n  {\n    id: 'Trebonius',\n    parent: 'Julius Caesar',\n    size: 4,\n  },\n  {\n    id: 'Varro',\n    parent: 'Julius Caesar',\n    size: 6,\n  },\n  {\n    id: 'Volumnius',\n    parent: 'Julius Caesar',\n    size: 3,\n  },\n  {\n    id: 'Young Cato',\n    parent: 'Julius Caesar',\n    size: 3,\n  },\n  {\n    id: 'King Lear',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Cordelia',\n    parent: 'King Lear',\n    size: 31,\n  },\n  {\n    id: 'Curan',\n    parent: 'King Lear',\n    size: 4,\n  },\n  {\n    id: 'Duke of Albany',\n    parent: 'King Lear',\n    size: 58,\n  },\n  {\n    id: 'Duke of Burgundy',\n    parent: 'King Lear',\n    size: 5,\n  },\n  {\n    id: 'Duke of Cornwall',\n    parent: 'King Lear',\n    size: 53,\n  },\n  {\n    id: 'Earl of Gloucester',\n    parent: 'King Lear',\n    size: 118,\n  },\n  {\n    id: 'Earl of Kent',\n    parent: 'King Lear',\n    size: 127,\n  },\n  {\n    id: 'Edgar',\n    parent: 'King Lear',\n    size: 98,\n  },\n  {\n    id: 'Edmund',\n    parent: 'King Lear',\n    size: 79,\n  },\n  {\n    id: 'Goneril',\n    parent: 'King Lear',\n    size: 53,\n  },\n  {\n    id: 'King of France',\n    parent: 'King Lear',\n    size: 5,\n  },\n  {\n    id: 'Lear',\n    parent: 'King Lear',\n    size: 188,\n  },\n  {\n    id: 'Oswald',\n    parent: 'King Lear',\n    size: 38,\n  },\n  {\n    id: 'Regan',\n    parent: 'King Lear',\n    size: 73,\n  },\n  {\n    id: 'The Tragedy Of Macbeth',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Angus',\n    parent: 'The Tragedy Of Macbeth',\n    size: 4,\n  },\n  {\n    id: 'Banquo',\n    parent: 'The Tragedy Of Macbeth',\n    size: 33,\n  },\n  {\n    id: 'Caithness',\n    parent: 'The Tragedy Of Macbeth',\n    size: 3,\n  },\n  {\n    id: 'Donalbain',\n    parent: 'The Tragedy Of Macbeth',\n    size: 3,\n  },\n  {\n    id: 'Duncan',\n    parent: 'The Tragedy Of Macbeth',\n    size: 18,\n  },\n  {\n    id: 'Fleance',\n    parent: 'The Tragedy Of Macbeth',\n    size: 2,\n  },\n  {\n    id: 'Hecate',\n    parent: 'The Tragedy Of Macbeth',\n    size: 2,\n  },\n  {\n    id: 'Lady Macbeth',\n    parent: 'The Tragedy Of Macbeth',\n    size: 59,\n  },\n  {\n    id: 'Lady Macduff',\n    parent: 'The Tragedy Of Macbeth',\n    size: 19,\n  },\n  {\n    id: 'Lennox',\n    parent: 'The Tragedy Of Macbeth',\n    size: 21,\n  },\n  {\n    id: 'Macbeth',\n    parent: 'The Tragedy Of Macbeth',\n    size: 146,\n  },\n  {\n    id: 'Macduff',\n    parent: 'The Tragedy Of Macbeth',\n    size: 59,\n  },\n  {\n    id: 'Malcolm',\n    parent: 'The Tragedy Of Macbeth',\n    size: 40,\n  },\n  {\n    id: 'Menteith',\n    parent: 'The Tragedy Of Macbeth',\n    size: 5,\n  },\n  {\n    id: 'Porter',\n    parent: 'The Tragedy Of Macbeth',\n    size: 4,\n  },\n  {\n    id: 'Ross',\n    parent: 'The Tragedy Of Macbeth',\n    size: 39,\n  },\n  {\n    id: 'Seyton',\n    parent: 'The Tragedy Of Macbeth',\n    size: 5,\n  },\n  {\n    id: 'Siward',\n    parent: 'The Tragedy Of Macbeth',\n    size: 11,\n  },\n  {\n    id: \"Son (Macduff's son)\",\n    parent: 'The Tragedy Of Macbeth',\n    size: 14,\n  },\n  {\n    id: 'Young Siward',\n    parent: 'The Tragedy Of Macbeth',\n    size: 4,\n  },\n  {\n    id: 'The Tragedy Of Othello',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Bianca (Mistress to Cassio)',\n    parent: 'The Tragedy Of Othello',\n    size: 15,\n  },\n  {\n    id: 'Brabantio',\n    parent: 'The Tragedy Of Othello',\n    size: 30,\n  },\n  {\n    id: 'Cassio',\n    parent: 'The Tragedy Of Othello',\n    size: 110,\n  },\n  {\n    id: 'Desdemona',\n    parent: 'The Tragedy Of Othello',\n    size: 165,\n  },\n  {\n    id: 'Duke of Venice',\n    parent: 'The Tragedy Of Othello',\n    size: 25,\n  },\n  {\n    id: 'Emilia',\n    parent: 'The Tragedy Of Othello',\n    size: 103,\n  },\n  {\n    id: 'Gratiano (Brother to Brabantio)',\n    parent: 'The Tragedy Of Othello',\n    size: 20,\n  },\n  {\n    id: 'Iago',\n    parent: 'The Tragedy Of Othello',\n    size: 272,\n  },\n  {\n    id: 'Lodovico',\n    parent: 'The Tragedy Of Othello',\n    size: 33,\n  },\n  {\n    id: 'Montano',\n    parent: 'The Tragedy Of Othello',\n    size: 24,\n  },\n  {\n    id: 'Othello',\n    parent: 'The Tragedy Of Othello',\n    size: 274,\n  },\n  {\n    id: 'Roderigo',\n    parent: 'The Tragedy Of Othello',\n    size: 59,\n  },\n  {\n    id: 'Romeo And Juliet',\n    parent: 'Tragedies',\n    size: null,\n  },\n  {\n    id: 'Abraham',\n    parent: 'Romeo And Juliet',\n    size: 5,\n  },\n  {\n    id: 'Balthasar (Servant to Romeo)',\n    parent: 'Romeo And Juliet',\n    size: 12,\n  },\n  {\n    id: 'Benvolio',\n    parent: 'Romeo And Juliet',\n    size: 64,\n  },\n  {\n    id: 'Capulet',\n    parent: 'Romeo And Juliet',\n    size: 51,\n  },\n  {\n    id: 'Friar John',\n    parent: 'Romeo And Juliet',\n    size: 4,\n  },\n  {\n    id: 'Friar Laurence',\n    parent: 'Romeo And Juliet',\n    size: 55,\n  },\n  {\n    id: 'Gregory',\n    parent: 'Romeo And Juliet',\n    size: 15,\n  },\n  {\n    id: 'Juliet',\n    parent: 'Romeo And Juliet',\n    size: 118,\n  },\n  {\n    id: 'Lady Capulet',\n    parent: 'Romeo And Juliet',\n    size: 45,\n  },\n  {\n    id: 'Lady Montague',\n    parent: 'Romeo And Juliet',\n    size: 2,\n  },\n  {\n    id: 'Mercutio',\n    parent: 'Romeo And Juliet',\n    size: 62,\n  },\n  {\n    id: 'Montague',\n    parent: 'Romeo And Juliet',\n    size: 10,\n  },\n  {\n    id: 'Paris',\n    parent: 'Romeo And Juliet',\n    size: 23,\n  },\n  {\n    id: \"Peter (Servant to Juliet's Nurse)\",\n    parent: 'Romeo And Juliet',\n    size: 13,\n  },\n  {\n    id: 'Prince Escalus',\n    parent: 'Romeo And Juliet',\n    size: 16,\n  },\n  {\n    id: 'Romeo',\n    parent: 'Romeo And Juliet',\n    size: 163,\n  },\n  {\n    id: 'Sampson',\n    parent: 'Romeo And Juliet',\n    size: 20,\n  },\n  {\n    id: 'Tybalt',\n    parent: 'Romeo And Juliet',\n    size: 17,\n  },\n];\n\nexport default shakespeare;\n"
  },
  {
    "path": "packages/visx-mock-data/test/appleStock.test.ts",
    "content": "import { appleStock } from '../src';\n\ndescribe('mocks/appleStock', () => {\n  test('it should be defined', () => {\n    expect(appleStock).toBeDefined();\n  });\n\n  test('it should be an array', () => {\n    expect(appleStock.length).toBeDefined();\n  });\n\n  test('it should return [{ date, close }]', () => {\n    const data = appleStock;\n    expect(data[0].date).toBeDefined();\n    expect(data[0].close).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/browserUsage.test.ts",
    "content": "import { browserUsage } from '../src';\n\ndescribe('mocks/browserUsage', () => {\n  test('it should be defined', () => {\n    expect(browserUsage).toBeDefined();\n  });\n\n  test('it should be an array', () => {\n    expect(browserUsage.length).toBeDefined();\n  });\n\n  test('it should return [{ date, browser names }]', () => {\n    const data = browserUsage;\n    expect(data[0].date).toBeDefined();\n    expect(data[0]['Google Chrome']).toBeDefined();\n    expect(data[0]['Microsoft Edge']).toBeDefined();\n    expect(data[0]['Internet Explorer']).toBeDefined();\n    expect(data[0].Safari).toBeDefined();\n    expect(data[0].Opera).toBeDefined();\n    expect(data[0].Mozilla).toBeDefined();\n    expect(data[0].Firefox).toBeDefined();\n    expect(data[0]['Other/Unknown']).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/cityTemperature.test.ts",
    "content": "import { cityTemperature } from '../src';\n\ndescribe('mocks/cityTemperature', () => {\n  test('it should be defined', () => {\n    expect(cityTemperature).toBeDefined();\n  });\n\n  test('it should be an array', () => {\n    expect(cityTemperature.length).toBeDefined();\n  });\n\n  test('it should return [{ date, city names }]', () => {\n    const data = cityTemperature;\n    expect(data[0].date).toBeDefined();\n    expect(data[0]['New York']).toBeDefined();\n    expect(data[0]['San Francisco']).toBeDefined();\n    expect(data[0].Austin).toBeDefined();\n    expect(typeof data[0]['New York']).toBe('string');\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/genBin.test.ts",
    "content": "import { genBin, getSeededRandom } from '../src';\n\ndescribe('generators/genBin', () => {\n  it('should be defined', () => {\n    expect(genBin).toBeDefined();\n  });\n\n  it('should have shape [{ bin, count }]', () => {\n    const bin = genBin(1);\n    expect(bin).toHaveLength(1);\n    expect(bin[0].bin).toBeDefined();\n    expect(bin[0].count).toBeDefined();\n  });\n\n  it('should take optional bin function', () => {\n    const bin = genBin(1, (i) => i);\n    expect(bin[0].bin).toBe(0);\n  });\n\n  it('should take an optional count function', () => {\n    const bin = genBin(1, undefined, (i) => i);\n    expect(bin[0].count).toBe(0);\n    expect(bin[0].bin).toBe(0);\n  });\n\n  it('should support seeded randomness', () => {\n    const n = 3;\n    const seededRandom1 = getSeededRandom(0.5);\n    const seededRandom2 = getSeededRandom(0.5);\n\n    expect(\n      genBin(\n        n,\n        (i) => i,\n        (i, number) => 25 * (number - i) * seededRandom1(),\n      ),\n    ).toEqual(\n      genBin(\n        n,\n        (i) => i,\n        (i, number) => 25 * (number - i) * seededRandom2(),\n      ),\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/genBins.test.ts",
    "content": "import { genBins, getSeededRandom } from '../src';\n\ndescribe('generators/genBins', () => {\n  it('should be defined', () => {\n    expect(genBins).toBeDefined();\n  });\n\n  it('should have the shape of [{bin, bins: [{ bin, count }]}]', () => {\n    const bins = genBins(1, 2);\n    expect(bins[0].bin).toBe(0);\n    expect(bins).toHaveLength(1);\n    expect(bins[0].bins).toHaveLength(2);\n    expect(bins[0].bins[1].bin).toBe(150);\n  });\n\n  it('should take an optional bin function parameter', () => {\n    const bins = genBins(1, 1, (i) => i);\n    expect(bins[0].bins[0].bin).toBe(0);\n  });\n\n  it('should take an optional count function parameter', () => {\n    const bins = genBins(1, 1, undefined, (i) => i);\n    expect(bins[0].bins[0].count).toBe(0);\n  });\n\n  it('should support seeded randomness', () => {\n    const seededRandom1 = getSeededRandom(0.5);\n    const seededRandom2 = getSeededRandom(0.5);\n\n    expect(\n      genBins(\n        2,\n        2,\n        (i) => i,\n        (i, number) => 25 * (number - i) * seededRandom1(),\n      ),\n    ).toEqual(\n      genBins(\n        2,\n        2,\n        (i) => i,\n        (i, number) => 25 * (number - i) * seededRandom2(),\n      ),\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/genDateValue.test.ts",
    "content": "import { genDateValue } from '../src';\n\ndescribe('generators/genDateValue', () => {\n  it('should be defined', () => {\n    expect(genDateValue).toBeDefined();\n  });\n\n  it('should be function', () => {\n    expect(typeof genDateValue).toBe('function');\n  });\n\n  it('should return a array of n', () => {\n    const n = 3;\n    const data = genDateValue(n);\n    expect(data).toHaveLength(3);\n  });\n\n  it('should return [{ date, value }]', () => {\n    const n = 1;\n    const data = genDateValue(n);\n    expect(data[0].date.constructor).toEqual(Date);\n    expect(typeof data[0].value).toBe('number');\n  });\n\n  it('should should use a start date and seed if provided', () => {\n    const n = 3;\n    const seed = 0.5;\n    const startDate = new Date('2020-01-01').getUTCMilliseconds();\n    expect(genDateValue(n, seed, startDate)).toEqual(genDateValue(n, seed, startDate));\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/genPhyllotaxis.test.ts",
    "content": "import { genPhyllotaxis } from '../src';\n\ndescribe('generators/genPhyllotaxis', () => {\n  test('it should be defined', () => {\n    expect(genPhyllotaxis).toBeDefined();\n  });\n\n  test('it should return a function', () => {\n    const pointFn = genPhyllotaxis({\n      radius: 10,\n      width: 200,\n      height: 200,\n    });\n    expect(typeof pointFn).toBe('function');\n  });\n\n  test('it should return a point [x, y] when calling the returned function', () => {\n    const pointFn = genPhyllotaxis({\n      radius: 10,\n      width: 200,\n      height: 200,\n    });\n    const point = pointFn(3);\n    const expected = { x: 110, y: 113 };\n    expect(Math.floor(point.x)).toEqual(expected.x);\n    expect(Math.floor(point.y)).toEqual(expected.y);\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/genRandomNormalPoints.test.ts",
    "content": "import { genRandomNormalPoints } from '../src';\n\ndescribe('generators/genRandomNormalPoints', () => {\n  it('should be defined', () => {\n    expect(genRandomNormalPoints).toBeDefined();\n  });\n\n  it('should be function', () => {\n    expect(typeof genRandomNormalPoints).toBe('function');\n  });\n\n  it('should default to 3x300 points', () => {\n    const data = genRandomNormalPoints();\n    expect(data).toHaveLength(900);\n  });\n\n  it('should return 3 * n', () => {\n    const n = 3;\n    const data = genRandomNormalPoints(n);\n    expect(data).toHaveLength(9);\n  });\n\n  it('should return points with x, y, index', () => {\n    const n = 3;\n    const data = genRandomNormalPoints(n);\n    expect(data[0]).toHaveLength(3);\n    expect(data[0][0]).toBeDefined();\n    expect(data[0][1]).toBeDefined();\n    expect(data[0][2]).toBeDefined();\n    expect(data[0][2]).toBe(0);\n    expect(data[3][2]).toBe(1);\n    expect(data[6][2]).toBe(2);\n  });\n\n  it('should support seeded randomness', () => {\n    const n = 3;\n    const data1 = genRandomNormalPoints(n, 0.5);\n    const data2 = genRandomNormalPoints(n, 0.5);\n    expect(data1).toMatchObject(data2);\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/genStats.test.ts",
    "content": "import { genStats, getSeededRandom } from '../src';\n\ndescribe('generators/genStats', () => {\n  it('should be defined', () => {\n    expect(genStats).toBeDefined();\n  });\n\n  it('should have boxPlot and binData', () => {\n    const data = genStats(2);\n    expect(data.length).toBeDefined();\n    expect(data).toHaveLength(2);\n    expect(data[0].boxPlot).toBeDefined();\n    expect(data[0].binData).toBeDefined();\n  });\n\n  it('should support seeded randomness', () => {\n    const data1 = genStats(1, getSeededRandom(0.5), getSeededRandom(0.75));\n    const data2 = genStats(1, getSeededRandom(0.5), getSeededRandom(0.75));\n    expect(data1).toMatchObject(data2);\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/getSeededRandom.test.ts",
    "content": "import { getSeededRandom } from '../src';\n\ndescribe('generators/getSeededRandom', () => {\n  it('should be defined', () => {\n    expect(getSeededRandom).toBeDefined();\n  });\n\n  it('should return a random number generator that returns the same value given the same seed', () => {\n    const random1 = getSeededRandom(0.5)();\n    const random2 = getSeededRandom(0.5)();\n    const random3 = getSeededRandom(0.1)();\n\n    expect(random1).toEqual(random2);\n    expect(random1).not.toEqual(random3);\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/groupDateValue.test.ts",
    "content": "import { groupDateValue } from '../src';\n\ndescribe('mocks/groupDateValue', () => {\n  test('it should be defined', () => {\n    expect(groupDateValue).toBeDefined();\n  });\n\n  test('it should be an array', () => {\n    expect(groupDateValue.length).toBeDefined();\n  });\n\n  test('it should return [{ key, value, date }]', () => {\n    const data = groupDateValue;\n    expect(data[0].key).toBeDefined();\n    expect(data[0].value).toBeDefined();\n    expect(data[0].date).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/letterFrequency.test.ts",
    "content": "import { letterFrequency } from '../src';\n\ndescribe('mocks/letterFrequency', () => {\n  test('it should be defined', () => {\n    expect(letterFrequency).toBeDefined();\n  });\n\n  test('it should be an array', () => {\n    expect(letterFrequency.length).toBeDefined();\n  });\n\n  test('it should return [{ letter, frequency }]', () => {\n    const data = letterFrequency;\n    expect(data[0].letter).toBeDefined();\n    expect(data[0].frequency).toBeDefined();\n    expect(typeof data[0].letter).toBe('string');\n    expect(typeof data[0].frequency).toBe('number');\n  });\n});\n"
  },
  {
    "path": "packages/visx-mock-data/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-mock-data/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-mock-data/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/mock-data',\n    globals: true,\n    environment: 'node',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-mock-data/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/mock-data': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-network/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-network/Readme.md",
    "content": "# @visx/network\n\n<a title=\"@visx/network npm downloads\" href=\"https://www.npmjs.com/package/@visx/network\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/network.svg?style=flat-square\" />\n</a>\n\nA simple package to visualize a network or graph layout. Does not currently handle network layout.\n\n## Example Usage\n\n```js\nimport { Graph, DefaultLink, DefaultNode } from '@visx/network';\nconst nodes = [\n  { x: 50, y: 20 },\n  { x: 200, y: 300 },\n  { x: 300, y: 40 },\n];\n\nconst dataSample = {\n  nodes,\n  links: [\n    { source: nodes[0], target: nodes[1] },\n    { source: nodes[1], target: nodes[2] },\n    { source: nodes[2], target: nodes[0] },\n  ],\n};\n\nconst MyGraph = () => (\n  <Graph graph={dataSample} linkComponent={DefaultLink} nodeComponent={DefaultNode} />\n);\n```\n\n## Installation\n\n```\nnpm install --save @visx/network\n```\n"
  },
  {
    "path": "packages/visx-network/package.json",
    "content": "{\n  \"name\": \"@visx/network\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx network\",\n  \"sideEffects\": false,\n  \"repository\": \"https://github.com/airbnb/visx\",\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"keywords\": [\n    \"visx\",\n    \"data\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@andyfang_dz\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-network/src/DefaultLink.tsx",
    "content": "import type { LinkProvidedProps } from './types';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport default function DefaultLink({ link }: LinkProvidedProps<any>) {\n  return link?.source && link.target ? (\n    <line\n      x1={link.source.x}\n      y1={link.source.y}\n      x2={link.target.x}\n      y2={link.target.y}\n      strokeWidth={2}\n      stroke=\"#999\"\n      strokeOpacity={0.6}\n    />\n  ) : null;\n}\n"
  },
  {
    "path": "packages/visx-network/src/DefaultNode.tsx",
    "content": "import type { SVGProps } from 'react';\n\nexport type NodeProps = {\n  cx?: number;\n  cy?: number;\n  node?: unknown; // Allow node prop for internal usage when used as nodeComponent\n};\n\nexport default function DefaultNode({\n  r = 15,\n  fill = '#21D4FD',\n  node, // Accept but don't use the node prop\n  ...rest\n}: NodeProps & Omit<SVGProps<SVGCircleElement>, keyof NodeProps>) {\n  return <circle r={r} fill={fill} {...rest} />;\n}\n"
  },
  {
    "path": "packages/visx-network/src/Graph.tsx",
    "content": "import type { ComponentClass, FunctionComponent } from 'react';\nimport { Group } from '@visx/group';\nimport Links from './Links';\nimport Nodes from './Nodes';\nimport DefaultNode from './DefaultNode';\nimport DefaultLink from './DefaultLink';\nimport type {\n  Graph as GraphType,\n  DefaultNode as DefaultNodeType,\n  Link as LinkType,\n  LinkProvidedProps,\n  NodeProvidedProps,\n} from './types';\n\nexport type GraphProps<Link, Node> = {\n  /** Graph to render nodes and links for. */\n  graph?: GraphType<Link, Node>;\n  /** Component for rendering a single Link. */\n  linkComponent?:\n    | FunctionComponent<LinkProvidedProps<Link>>\n    | ComponentClass<LinkProvidedProps<Link>>;\n  /** Component for rendering a single Node. */\n  nodeComponent?:\n    | FunctionComponent<NodeProvidedProps<Node>>\n    | ComponentClass<NodeProvidedProps<Node>>;\n  /** Top transform offset to apply to links and nodes. */\n  top?: number;\n  /** Left transform offset to apply to links and nodes. */\n  left?: number;\n};\n\nexport default function Graph<Link = LinkType<DefaultNodeType>, Node = DefaultNodeType>({\n  graph,\n  linkComponent = DefaultLink,\n  nodeComponent = DefaultNode,\n  top,\n  left,\n}: GraphProps<Link, Node>) {\n  return graph ? (\n    <Group top={top} left={left}>\n      <Links<Link> links={graph.links} linkComponent={linkComponent} />\n      <Nodes<Node> nodes={graph.nodes} nodeComponent={nodeComponent} />\n    </Group>\n  ) : null;\n}\n"
  },
  {
    "path": "packages/visx-network/src/Links.tsx",
    "content": "import { createElement } from 'react';\nimport type { FunctionComponent, ComponentClass } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { LinkProvidedProps } from './types';\n\nexport type LinkProps<Link> = {\n  /** Array of links to render. */\n  links?: Link[];\n  /** Component for rendering a single link. */\n  linkComponent:\n    | FunctionComponent<LinkProvidedProps<Link>>\n    | ComponentClass<LinkProvidedProps<Link>>;\n  /** Classname to add to each link parent g element. */\n  className?: string;\n};\n\nexport default function Links<Link>({ links = [], linkComponent, className }: LinkProps<Link>) {\n  return (\n    <>\n      {links.map((link, i) => (\n        <Group key={`network-link-${i}`} className={cx('visx-network-link', className)}>\n          {createElement(linkComponent, { link })}\n        </Group>\n      ))}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-network/src/Nodes.tsx",
    "content": "import { createElement } from 'react';\nimport type { FunctionComponent, ComponentClass } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\n\nimport DefaultNode from './DefaultNode';\nimport type { NodeProvidedProps } from './types';\n\nexport type NodeProps<Node> = {\n  /** Array of links to render. */\n  nodes?: Node[];\n  /** Component for rendering a single link. */\n  nodeComponent:\n    | FunctionComponent<NodeProvidedProps<Node>>\n    | ComponentClass<NodeProvidedProps<Node>>;\n  /** Classname to add to each node parent g element. */\n  className?: string;\n  /** Returns the center x coordinate of a node. */\n  x?: (d: Node) => number;\n  /** Returns the center y coordinate of a node. */\n  y?: (d: Node) => number;\n};\n\nexport default function Nodes<Node>({\n  nodes = [],\n  nodeComponent = DefaultNode,\n  className,\n  x = (d: any) => d?.x || 0, // eslint-disable-line @typescript-eslint/no-explicit-any\n  y = (d: any) => d?.y || 0, // eslint-disable-line @typescript-eslint/no-explicit-any\n}: NodeProps<Node>) {\n  return (\n    <>\n      {nodes.map((node, i) => (\n        <Group\n          key={`network-node-${i}`}\n          className={cx('visx-network-node', className)}\n          left={x(node)}\n          top={y(node)}\n        >\n          {createElement(nodeComponent, { node })}\n        </Group>\n      ))}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-network/src/index.ts",
    "content": "// @visx/network\nexport { default as Graph } from './Graph';\nexport { default as Links } from './Links';\nexport { default as Nodes } from './Nodes';\nexport { default as DefaultLink } from './DefaultLink';\nexport { default as DefaultNode } from './DefaultNode';\n\nexport type * from './types';\nexport type { GraphProps } from './Graph';\nexport type { LinkProps as LinksProps } from './Links';\nexport type { NodeProps as NodesProps } from './Nodes';\n"
  },
  {
    "path": "packages/visx-network/src/types.ts",
    "content": "export interface DefaultNode {\n  x: number;\n  y: number;\n}\n\nexport interface Link<Node> {\n  source: Node;\n  target: Node;\n}\n\nexport interface Graph<L, Node> {\n  links: L[];\n  nodes: Node[];\n}\n\nexport interface LinkProvidedProps<L> {\n  link: L;\n}\n\nexport interface NodeProvidedProps<Node> {\n  node: Node;\n}\n"
  },
  {
    "path": "packages/visx-network/test/Graph.test.tsx",
    "content": "import { Graph } from '../src';\n\ndescribe('Graph', () => {\n  test('Graph should be defined', () => {\n    expect(Graph).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-network/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-network/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-network/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/network',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-network/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/network': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-pattern/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-pattern/Readme.md",
    "content": "# @visx/pattern\n\n<a title=\"@visx/pattern npm downloads\" href=\"https://www.npmjs.com/package/@visx/pattern\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/pattern.svg?style=flat-square\" />\n</a>\n\nInspired by: http://riccardoscalco.github.io/textures/\n\n## Example\n\n```js\nimport { AreaClosed } from '@visx/shape';\nimport { PatternLines } from '@visx/pattern';\n\nconst PatternArea = () => {\n  return (\n    <svg>\n      <PatternLines\n        id=\"lines\"\n        height={5}\n        width={5}\n        stroke={'black'}\n        strokeWidth={1}\n        orientation={['diagonal']}\n      />\n      <AreaClosed fill=\"url('#lines')\" />\n    </svg>\n  );\n};\n```\n\n## The Definition Caveat\n\nLike gradients, patterns are \"defined.\" When you put down a `<PatternXYZ />`, it's putting a\n[`<pattern/>`](https://developer.mozilla.org/en-US/docs/Web/SVG/Tutorial/Patterns) attribute in the\nSVG.\n\nIt's often better to think of these as variable definitions rather than true DOM elements. When you\nuse `fill=\"url('#pattern')\"` you're referencing the pattern's id: `pattern`.\n\n## Pre-Made Patterns\n\n### `PatternsCircles`\n\n![circles example](http://i.imgur.com/jd9YGJi.png)\n\n```js\n<PatternCircles id=\"circles\" height={6} width={6} stroke={'black'} strokeWidth={1} />\n```\n\n### `PatternsHexagons`\n\n![hexagon example](http://i.imgur.com/3EL1Lza.png)\n\n```js\n<PatternHexagons id=\"hexagons\" height={3} size={8} stroke={'red'} strokeWidth={1} />\n```\n\n### `PatternsLines`\n\n![lines example](http://i.imgur.com/E3cTmLZ.png)\n\n```js\n<PatternLines\n  id=\"lines\"\n  height={5}\n  width={5}\n  stroke={'black'}\n  strokeWidth={1}\n  orientation={['diagonal']}\n/>\n```\n\n### `PatternsWaves`\n\n![waves example](http://i.imgur.com/4fdwbhv.png)\n\n```js\n<PatternWaves id=\"waves\" height={4} width={4} stroke={'blue'} strokeWidth={1} />\n```\n\n## Installation\n\n```\nnpm install --save @visx/pattern\n```\n"
  },
  {
    "path": "packages/visx-pattern/package.json",
    "content": "{\n  \"name\": \"@visx/pattern\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx pattern\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualization\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-pattern/src/constants/index.ts",
    "content": "export const PatternOrientation = {\n  horizontal: 'horizontal',\n  vertical: 'vertical',\n  diagonal: 'diagonal',\n  diagonalRightToLeft: 'diagonalRightToLeft',\n} as const;\n\nexport type PatternOrientationType = (typeof PatternOrientation)[keyof typeof PatternOrientation];\n"
  },
  {
    "path": "packages/visx-pattern/src/index.ts",
    "content": "// @visx/pattern\nexport { default as Pattern } from './patterns/Pattern';\nexport { default as PatternLines } from './patterns/Lines';\nexport { default as PatternCircles } from './patterns/Circles';\nexport { default as PatternWaves } from './patterns/Waves';\nexport { default as PatternHexagons } from './patterns/Hexagons';\nexport { default as PatternPath } from './patterns/Path';\nexport { PatternOrientation } from './constants';\n\nexport type { PatternOrientationType } from './constants';\nexport type { PatternCirclesProps } from './patterns/Circles';\nexport type { PatternHexagonsProps } from './patterns/Hexagons';\nexport type { PatternLinesProps } from './patterns/Lines';\nexport type { PatternPathProps } from './patterns/Path';\nexport type { PatternProps } from './patterns/Pattern';\nexport type { PatternWavesProps } from './patterns/Waves';\n"
  },
  {
    "path": "packages/visx-pattern/src/patterns/Circles.tsx",
    "content": "import cx from 'classnames';\nimport Pattern from './Pattern';\n\nexport type PatternCirclesProps = {\n  /** Unique id for the pattern. */\n  id: string;\n  /** Width of the pattern element. */\n  width: number;\n  /** Height of the pattern element. */\n  height: number;\n  /** Radius of the pattern circles. */\n  radius?: number;\n  /** Fill applied to circles. */\n  fill?: string;\n  /** className applied to circles. */\n  className?: string;\n  /** stroke applied to circles. */\n  stroke?: string;\n  /** strokeWidth applied to circles. */\n  strokeWidth?: number | string;\n  /** strokeDasharray applied to circles. */\n  strokeDasharray?: number | string;\n  /** Whether to fill in circles within the pattern gaps to increase pattern density. */\n  complement?: boolean;\n  /** Background color applied behind cirlces. */\n  background?: string;\n};\n\nexport default function Circles({\n  id,\n  width,\n  height,\n  radius = 2,\n  fill,\n  stroke,\n  strokeWidth,\n  strokeDasharray,\n  background,\n  complement = false,\n  className,\n}: PatternCirclesProps) {\n  let corners: [number, number][] | undefined;\n  if (complement) {\n    corners = [\n      [0, 0],\n      [0, height],\n      [width, 0],\n      [width, height],\n    ];\n  }\n  return (\n    <Pattern id={id} width={width} height={height}>\n      {!!background && <rect width={width} height={height} fill={background} />}\n      <circle\n        className={cx('visx-pattern-circle', className)}\n        cx={width / 2}\n        cy={height / 2}\n        r={radius}\n        fill={fill}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        strokeDasharray={strokeDasharray}\n      />\n      {corners?.map(([cornerX, cornerY]) => (\n        <circle\n          key={`${id}-complement-${cornerX}-${cornerY}`}\n          className={cx('visx-pattern-circle visx-pattern-circle-complement', className)}\n          cx={cornerX}\n          cy={cornerY}\n          r={radius}\n          fill={fill}\n          stroke={stroke}\n          strokeWidth={strokeWidth}\n          strokeDasharray={strokeDasharray}\n        />\n      ))}\n    </Pattern>\n  );\n}\n"
  },
  {
    "path": "packages/visx-pattern/src/patterns/Hexagons.tsx",
    "content": "import cx from 'classnames';\nimport Path from './Path';\n\nexport type PatternHexagonsProps = {\n  /** Unique id for the pattern. */\n  id: string;\n  /** Height of the pattern element. */\n  height: number;\n  /** Size of the hexagon shape. */\n  size?: number;\n  /** Fill applied to hexagons. */\n  fill?: string;\n  /** className applied to hexagon path element. */\n  className?: string;\n  /** Background color applied behind hexagons. */\n  background?: string;\n  /** Stroke color applied to hexagon paths. */\n  stroke?: string;\n  /** strokeWidth applied to hexagon paths. */\n  strokeWidth?: number | string;\n  /** strokeDasharray applied to hexagon paths. */\n  strokeDasharray?: string | number;\n  /** strokeLinecap applied to hexagon paths. */\n  strokeLinecap?: 'square' | 'butt' | 'round' | 'inherit';\n  /** shapeRendering applied to hexagon paths. */\n  shapeRendering?: string | number;\n};\n\nexport default function Hexagons({\n  id,\n  height,\n  fill,\n  stroke,\n  strokeWidth,\n  strokeDasharray,\n  strokeLinecap,\n  shapeRendering,\n  background,\n  className,\n  size = 3,\n}: PatternHexagonsProps) {\n  const sqrtSize = Math.sqrt(size);\n  return (\n    <Path\n      className={cx('visx-pattern-hexagon', className)}\n      path={`M ${height},0 l ${height},0 l ${height / 2},${(height * sqrtSize) / 2} l ${\n        -height / 2\n      },${(height * sqrtSize) / 2} l ${-height},0 l ${-height / 2},${\n        (-height * sqrtSize) / 2\n      } Z M 0,${(height * sqrtSize) / 2} l ${height / 2},0 M ${3 * height},${\n        (height * sqrtSize) / 2\n      } l ${-height / 2},0`}\n      id={id}\n      width={size}\n      height={sqrtSize}\n      fill={fill}\n      stroke={stroke}\n      strokeWidth={strokeWidth}\n      strokeDasharray={strokeDasharray}\n      strokeLinecap={strokeLinecap}\n      shapeRendering={shapeRendering}\n      background={background}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-pattern/src/patterns/Lines.tsx",
    "content": "import cx from 'classnames';\nimport Pattern from './Pattern';\nimport type { PatternOrientationType } from '../constants';\nimport { PatternOrientation } from '../constants';\n\nexport function pathForOrientation({\n  height,\n  orientation,\n}: {\n  height: number;\n  orientation: PatternOrientationType;\n}) {\n  switch (orientation) {\n    case PatternOrientation.horizontal:\n      return `M 0,${height / 2} l ${height},0`;\n    case PatternOrientation.diagonal:\n      return `M 0,${height} l ${height},${-height} M ${-height / 4},${height / 4} l ${height / 2},${\n        -height / 2\n      }\n             M ${(3 / 4) * height},${(5 / 4) * height} l ${height / 2},${-height / 2}`;\n    case PatternOrientation.diagonalRightToLeft:\n      return `M 0,0 l ${height},${height}\n        M ${-height / 4},${(3 / 4) * height} l ${height / 2},${height / 2}\n        M ${(3 / 4) * height},${-height / 4} l ${height / 2},${height / 2}`;\n    case PatternOrientation.vertical:\n    default:\n      return `M ${height / 2}, 0 l 0, ${height}`;\n  }\n}\n\nexport type PatternLinesProps = {\n  /** Unique id for the pattern. */\n  id: string;\n  /** Width of the pattern element. */\n  width: number;\n  /** Height of the pattern element. */\n  height: number;\n  /** className applied to line path element. */\n  className?: string;\n  /** Background color applied behind lines. */\n  background?: string;\n  /** Stroke color applied to path elements. */\n  stroke?: string;\n  /** strokeWidth applied to path elements. */\n  strokeWidth?: number | string;\n  /** strokeDasharray applied to path elements. */\n  strokeDasharray?: string | number;\n  /** strokeLinecap applied to path elements. */\n  strokeLinecap?: 'square' | 'butt' | 'round' | 'inherit';\n  /** shapeRendering applied to path elements. */\n  shapeRendering?: string | number;\n  /** Array of orientations to render (can mix multiple). */\n  orientation?: PatternOrientationType[];\n};\n\nexport default function Lines({\n  id,\n  width,\n  height,\n  stroke,\n  strokeWidth,\n  strokeDasharray,\n  strokeLinecap = 'square',\n  shapeRendering = 'auto',\n  orientation = ['vertical'],\n  background,\n  className,\n}: PatternLinesProps) {\n  const orientations = Array.isArray(orientation) ? orientation : [orientation];\n\n  return (\n    <Pattern id={id} width={width} height={height}>\n      {!!background && (\n        <rect\n          className={cx('visx-pattern-line-background')}\n          width={width}\n          height={height}\n          fill={background}\n        />\n      )}\n      {orientations.map((o, i) => (\n        <path\n          key={`visx-${id}-line-${o}-${i}`}\n          className={cx('visx-pattern-line', className)}\n          d={pathForOrientation({ orientation: o, height })}\n          stroke={stroke}\n          strokeWidth={strokeWidth}\n          strokeDasharray={strokeDasharray}\n          strokeLinecap={strokeLinecap}\n          shapeRendering={shapeRendering}\n        />\n      ))}\n    </Pattern>\n  );\n}\n"
  },
  {
    "path": "packages/visx-pattern/src/patterns/Path.tsx",
    "content": "import cx from 'classnames';\nimport Pattern from './Pattern';\n\nexport type PatternPathProps = {\n  /** Unique id for the pattern. */\n  id: string;\n  /** Width of the pattern element. */\n  width: number;\n  /** Height of the pattern element. */\n  height: number;\n  /** d attribute of the path element */\n  path?: string;\n  /** fill color applied to path. */\n  fill?: string;\n  /** className applied to the path element. */\n  className?: string;\n  /** Background color applied behind path. */\n  background?: string;\n  /** Stroke color applied to path. */\n  stroke?: string;\n  /** strokeWidth applied to path. */\n  strokeWidth?: number | string;\n  /** strokeDasharray applied to path. */\n  strokeDasharray?: string | number;\n  /** strokeLinecap applied to path. */\n  strokeLinecap?: 'square' | 'butt' | 'round' | 'inherit';\n  /** shapeRendering applied to path. */\n  shapeRendering?: string | number;\n};\n\nexport default function Path({\n  id,\n  width,\n  height,\n  path,\n  fill = 'transparent',\n  stroke,\n  strokeWidth,\n  strokeDasharray,\n  strokeLinecap = 'square',\n  shapeRendering = 'auto',\n  background,\n  className,\n}: PatternPathProps) {\n  return (\n    <Pattern id={id} width={width} height={height}>\n      {!!background && <rect width={width} height={height} fill={background} />}\n      <path\n        className={cx('visx-pattern-path', className)}\n        d={path}\n        fill={fill}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        strokeDasharray={strokeDasharray}\n        strokeLinecap={strokeLinecap}\n        shapeRendering={shapeRendering}\n      />\n    </Pattern>\n  );\n}\n"
  },
  {
    "path": "packages/visx-pattern/src/patterns/Pattern.tsx",
    "content": "import type { ReactNode } from 'react';\n\nexport type PatternProps = {\n  /** Unique id of the pattern element. */\n  id: string;\n  /** Width of the pattern. */\n  width: number;\n  /** Height of the pattern. */\n  height: number;\n  /** Children of pattern element to render. */\n  children: ReactNode;\n};\n\nexport default function Pattern({ id, width, height, children }: PatternProps) {\n  return (\n    <defs>\n      <pattern id={id} width={width} height={height} patternUnits=\"userSpaceOnUse\">\n        {children}\n      </pattern>\n    </defs>\n  );\n}\n"
  },
  {
    "path": "packages/visx-pattern/src/patterns/Waves.tsx",
    "content": "import cx from 'classnames';\nimport Path from './Path';\n\nexport type PatternWavesProps = {\n  /** Unique id for the pattern. */\n  id: string;\n  /** Width of the pattern element. */\n  width: number;\n  /** Height of the pattern element. */\n  height: number;\n  /** fill color applied to path. */\n  fill?: string;\n  /** className applied to the path element. */\n  className?: string;\n  /** Background color applied behind path. */\n  background?: string;\n  /** Stroke color applied to path. */\n  stroke?: string;\n  /** strokeWidth applied to path. */\n  strokeWidth?: number | string;\n  /** strokeDasharray applied to path. */\n  strokeDasharray?: string | number;\n  /** strokeLinecap applied to path. */\n  strokeLinecap?: 'square' | 'butt' | 'round' | 'inherit';\n  /** shapeRendering applied to path. */\n  shapeRendering?: string | number;\n};\n\nexport default function Waves({\n  id,\n  width,\n  height,\n  fill,\n  stroke,\n  strokeWidth,\n  strokeDasharray,\n  strokeLinecap,\n  shapeRendering,\n  background,\n  className,\n}: PatternWavesProps) {\n  return (\n    <Path\n      className={cx('visx-pattern-wave', className)}\n      path={`M 0 ${height / 2} c ${height / 8} ${-height / 4} , ${(height * 3) / 8} ${\n        -height / 4\n      } , ${height / 2} 0\n             c ${height / 8} ${height / 4} , ${(height * 3) / 8} ${height / 4} , ${\n        height / 2\n      } 0 M ${-height / 2} ${height / 2}\n             c ${height / 8} ${height / 4} , ${(height * 3) / 8} ${height / 4} , ${\n        height / 2\n      } 0 M ${height} ${height / 2}\n             c ${height / 8} ${-height / 4} , ${(height * 3) / 8} ${-height / 4} , ${height / 2} 0`}\n      id={id}\n      width={width}\n      height={height}\n      fill={fill}\n      stroke={stroke}\n      strokeWidth={strokeWidth}\n      strokeDasharray={strokeDasharray}\n      strokeLinecap={strokeLinecap}\n      shapeRendering={shapeRendering}\n      background={background}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-pattern/test/Pattern.test.tsx",
    "content": "import { Pattern } from '../src';\n\ndescribe('<Pattern />', () => {\n  test('it should be defined', () => {\n    expect(Pattern).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-pattern/test/PatternCircles.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { PatternCircles } from '../src';\n\ndescribe('<PatternCircles />', () => {\n  test('should be defined', () => {\n    expect(PatternCircles).toBeDefined();\n  });\n\n  test('should render a rect background if background prop defined', () => {\n    const { container } = render(\n      <svg>\n        <PatternCircles id=\"test\" height={4} width={4} background=\"blue\" />\n      </svg>,\n    );\n    const rect = container.querySelector('pattern rect');\n    expect(rect).toBeInTheDocument();\n    expect(rect).toHaveAttribute('fill', 'blue');\n  });\n\n  test('should not render a rect background if no background prop', () => {\n    const { container } = render(\n      <svg>\n        <PatternCircles id=\"test\" height={4} width={4} />\n      </svg>,\n    );\n    const rect = container.querySelector('pattern rect');\n    expect(rect).not.toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-pattern/test/PatternHexagons.test.tsx",
    "content": "import { PatternHexagons } from '../src';\n\ndescribe('<PatternHexagons />', () => {\n  test('it should be defined', () => {\n    expect(PatternHexagons).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-pattern/test/PatternLines.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { PatternLines } from '../src';\nimport type { PatternOrientationType } from '../src/constants';\nimport { pathForOrientation } from '../src/patterns/Lines';\n\nconst SVGWrapper = ({ children }: { children: React.ReactNode }) => (\n  <svg data-testid=\"svg-wrapper\">{children}</svg>\n);\n\ndescribe('<PatternLines />', () => {\n  test('should be defined', () => {\n    expect(PatternLines).toBeDefined();\n  });\n\n  test('should render background when background prop is provided', () => {\n    const { container } = render(\n      <SVGWrapper>\n        <PatternLines id=\"test\" height={4} width={4} background=\"blue\" />\n      </SVGWrapper>,\n    );\n\n    const pattern = container.querySelector('pattern');\n    expect(pattern).toBeInTheDocument();\n\n    const backgroundRect = container.querySelector('rect');\n    expect(backgroundRect).toBeInTheDocument();\n    expect(backgroundRect).toHaveAttribute('fill', 'blue');\n    expect(backgroundRect).toHaveAttribute('width', '4');\n    expect(backgroundRect).toHaveAttribute('height', '4');\n  });\n\n  test('should not render background when background prop is not provided', () => {\n    const { container } = render(\n      <SVGWrapper>\n        <PatternLines id=\"test\" height={4} width={4} />\n      </SVGWrapper>,\n    );\n\n    const backgroundRect = container.querySelector('.visx-pattern-line-background');\n    expect(backgroundRect).not.toBeInTheDocument();\n  });\n\n  test('should render correct pattern lines based on orientation', () => {\n    const size = 4;\n    const orientation: PatternOrientationType[] = ['diagonal', 'diagonalRightToLeft'];\n    const expectedPaths = orientation.map((o) =>\n      pathForOrientation({ orientation: o, height: size }),\n    );\n\n    const { container } = render(\n      <SVGWrapper>\n        <PatternLines id=\"test\" height={size} width={size} orientation={orientation} />\n      </SVGWrapper>,\n    );\n\n    const paths = container.querySelectorAll('.visx-pattern-line');\n    expect(paths).toHaveLength(2);\n\n    paths.forEach((path, index) => {\n      expect(path).toHaveAttribute('d', expectedPaths[index]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-pattern/test/PatternPath.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { PatternPath } from '../src';\n\ndescribe('<PatternPath />', () => {\n  test('it should be defined', () => {\n    expect(PatternPath).toBeDefined();\n  });\n\n  test('it should render a rect background if background prop defined', () => {\n    const { container } = render(\n      <svg>\n        <PatternPath id=\"test\" height={4} width={4} background=\"blue\" />\n      </svg>,\n    );\n    expect(container.querySelector('rect')).toBeInTheDocument();\n  });\n\n  test('it should not render a rect background if no background prop', () => {\n    const { container } = render(\n      <svg>\n        <PatternPath id=\"test\" height={4} width={4} />\n      </svg>,\n    );\n    expect(container.querySelector('rect')).not.toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-pattern/test/PatternWaves.test.tsx",
    "content": "import { PatternWaves } from '../src';\n\ndescribe('<PatternWaves />', () => {\n  test('it should be defined', () => {\n    expect(PatternWaves).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-pattern/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-pattern/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-pattern/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/pattern',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-pattern/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/pattern': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-point/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-point/Readme.md",
    "content": "# @visx/point\n\n<a title=\"@visx/point npm downloads\" href=\"https://www.npmjs.com/package/@visx/point\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/point.svg?style=flat-square\" />\n</a>\n\nA simple class to represent an `x, y` coordinate.\n\n## Installation\n\n```\nnpm install --save @visx/point\n```\n\n## Example Usage\n\n```js\nimport { Point } from '@visx/point';\n\nconst point = new Point({ x: 2, y: 3 });\nconst { x, y } = point.value(); // Get the coords as an object\nconst [x, y] = point.toArray(); // or array\n```\n\n## Methods\n\n### `point.value()`\n\nReturns an `{ x, y }` object with the x and y coordinates.\n\n### `point.toArray()`\n\nReturns the coordinates as an array `[x, y]`.\n"
  },
  {
    "path": "packages/visx-point/package.json",
    "content": "{\n  \"name\": \"@visx/point\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx point\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"repository\": \"https://github.com/airbnb/visx\",\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"keywords\": [\n    \"visx\",\n    \"data\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-point/src/Point.ts",
    "content": "export default class Point {\n  public x: number = 0;\n  public y: number = 0;\n\n  constructor({ x = 0, y = 0 }) {\n    this.x = x;\n    this.y = y;\n  }\n\n  value() {\n    return {\n      x: this.x,\n      y: this.y,\n    };\n  }\n\n  toArray() {\n    return [this.x, this.y];\n  }\n}\n"
  },
  {
    "path": "packages/visx-point/src/index.ts",
    "content": "// @visx/point\nexport { default as Point } from './Point';\nexport { default as sumPoints } from './sumPoints';\nexport { default as subtractPoints } from './subtractPoints';\n"
  },
  {
    "path": "packages/visx-point/src/subtractPoints.ts",
    "content": "import Point from './Point';\n\nexport default function subtractPoints(point1: Point, point2: Point) {\n  return new Point({\n    x: point1.x - point2.x,\n    y: point1.y - point2.y,\n  });\n}\n"
  },
  {
    "path": "packages/visx-point/src/sumPoints.ts",
    "content": "import Point from './Point';\n\nexport default function sumPoints(point1: Point, point2: Point) {\n  return new Point({\n    x: point1.x + point2.x,\n    y: point1.y + point2.y,\n  });\n}\n"
  },
  {
    "path": "packages/visx-point/test/point.test.ts",
    "content": "import { Point } from '../src';\n\ndescribe('Point', () => {\n  test('Point should be defined', () => {\n    expect(Point).toBeDefined();\n  });\n\n  test('constructor defaults to 0,0', () => {\n    const p = new Point({});\n    expect(p.x).toBe(0);\n    expect(p.y).toBe(0);\n  });\n\n  test('constructor sets x,y', () => {\n    const p = new Point({ x: 3, y: 4 });\n    expect(p.x).toBe(3);\n    expect(p.y).toBe(4);\n  });\n\n  test('value()', () => {\n    const c = { x: 3, y: 4 };\n    const p = new Point(c);\n    expect(p.value()).toEqual(c);\n  });\n\n  test('toArray()', () => {\n    const c = { x: 3, y: 4 };\n    const p = new Point(c);\n    expect(p.toArray()).toEqual([c.x, c.y]);\n  });\n});\n"
  },
  {
    "path": "packages/visx-point/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-point/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-point/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/point',\n    globals: true,\n    environment: 'node',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-point/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/point': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-react-spring/README.md",
    "content": "# @visx/react-spring\n\n<a title=\"@visx/react-spring npm downloads\" href=\"https://www.npmjs.com/package/@visx/react-spring\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/react-spring.svg?style=flat-square\" />\n</a>\n\nAlthough `visx` is largely unopinioned on animation, there is value in abstracting the complexity +\nboilerplate of building **animated** `visx` visualization components. This package requires\n`react-spring` as a `peerDependency` (to be compatible with any usage within your app) and exports\nall `visx` components that depend on `react-spring`.\n\n[`react-spring`](https://www.react-spring.io/) provides performant primitives for animating react\ncomponents and is our recommended library for making animated charts. In order to minimize\n`react-spring` as a dependency across other `visx` packages, we've consolidated components which\ndepend on it here.\n\n## Installation\n\n```\nnpm install --save react-spring @visx/react-spring\n```\n"
  },
  {
    "path": "packages/visx-react-spring/package.json",
    "content": "{\n  \"name\": \"@visx/react-spring\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx primitives that rely on react-spring for animation\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\",\n    \"animation\",\n    \"react-spring\"\n  ],\n  \"contributors\": [\n    {\n      \"name\": \"Chris Williams\",\n      \"url\": \"https://github.com/williaster\"\n    }\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"@react-spring/web\": \"^9.7.5 || ^10.0.0\",\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/axis\": \"workspace:*\",\n    \"@visx/grid\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/text\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-react-spring/src/axis/AnimatedAxis.tsx",
    "content": "import { useMemo } from 'react';\nimport { Axis } from '@visx/axis';\nimport type { AxisProps, AxisScale, TicksRendererProps } from '@visx/axis';\nimport AnimatedTicks from './AnimatedTicks';\nimport type { AnimationTrajectory } from '../types';\n\nexport type AnimatedAxisProps<Scale extends AxisScale> = Omit<\n  AxisProps<Scale>,\n  'ticksComponent'\n> & { animationTrajectory?: AnimationTrajectory };\n\nexport default function AnimatedAxis<Scale extends AxisScale>({\n  animationTrajectory,\n  tickComponent,\n  ...axisProps\n}: AnimatedAxisProps<Scale>) {\n  // wrap the ticksComponent so we can pass animationTrajectory\n  const ticksComponent = useMemo(\n    () =>\n      // eslint-disable-next-line react/no-unstable-nested-components\n      function TicksComponent(ticks: TicksRendererProps<Scale>) {\n        return (\n          <AnimatedTicks\n            {...ticks}\n            tickComponent={tickComponent}\n            animationTrajectory={animationTrajectory}\n          />\n        );\n      },\n    [animationTrajectory, tickComponent],\n  );\n  return <Axis {...axisProps} ticksComponent={ticksComponent} />;\n}\n"
  },
  {
    "path": "packages/visx-react-spring/src/axis/AnimatedTicks.tsx",
    "content": "import type { SpringValue } from '@react-spring/web';\nimport { animated, useTransition, to } from '@react-spring/web';\nimport cx from 'classnames';\nimport { Orientation } from '@visx/axis';\nimport type { ComputedTick, TicksRendererProps, AxisScale } from '@visx/axis';\nimport { Text } from '@visx/text';\n\nimport useLineTransitionConfig from '../spring-configs/useLineTransitionConfig';\nimport type { AnimationTrajectory } from '../types';\n\nexport default function AnimatedTicks<Scale extends AxisScale>({\n  hideTicks,\n  horizontal,\n  orientation,\n  scale,\n  tickClassName,\n  tickComponent,\n  tickLabelProps: allTickLabelProps,\n  tickStroke = '#222',\n  tickTransform,\n  ticks,\n  tickLineProps,\n  animationTrajectory,\n}: TicksRendererProps<Scale> & { animationTrajectory?: AnimationTrajectory }) {\n  const animatedTicks = useTransition(ticks, {\n    ...useLineTransitionConfig({\n      scale,\n      animateXOrY: horizontal ? 'x' : 'y',\n      animationTrajectory,\n    }),\n    keys: (tick: ComputedTick<Scale>) => `tick-${tick.value}-${tick.index}`,\n  });\n\n  return (\n    <>\n      {/* @ts-expect-error react-spring's type inference issue on the styles */}\n      {animatedTicks(({ fromX, toX, fromY, toY, opacity }, item, { key }, index) => {\n        const tickLabelProps = allTickLabelProps[index] ?? allTickLabelProps[0] ?? {};\n        return item == null || key == null ? null : (\n          <animated.g\n            key={key}\n            className={cx('visx-axis-tick', tickClassName)}\n            transform={tickTransform}\n          >\n            {!hideTicks && (\n              <animated.line\n                x1={fromX}\n                x2={toX}\n                y1={fromY}\n                y2={toY}\n                stroke={tickStroke}\n                strokeLinecap=\"square\"\n                strokeOpacity={opacity}\n                {...tickLineProps}\n              />\n            )}\n            {/** animate the group, not the Text */}\n            <animated.g\n              key={index}\n              transform={to(\n                [toX as SpringValue<number>, toY as SpringValue<number>],\n                (interpolatedX, interpolatedY) =>\n                  `translate(${interpolatedX},${\n                    interpolatedY +\n                    (orientation === Orientation.bottom &&\n                    typeof tickLabelProps.fontSize === 'number'\n                      ? tickLabelProps.fontSize ?? 10\n                      : 0)\n                  })`,\n              )}\n              opacity={opacity}\n            >\n              {tickComponent ? (\n                tickComponent({\n                  ...tickLabelProps,\n                  x: toX,\n                  y: toY,\n                  formattedValue: item?.formattedValue,\n                })\n              ) : (\n                <Text {...tickLabelProps}>{item?.formattedValue}</Text>\n              )}\n            </animated.g>\n          </animated.g>\n        );\n      })}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-react-spring/src/grid/AnimatedGridColumns.tsx",
    "content": "import type { GridColumnsProps, GridScale } from '@visx/grid';\nimport { GridColumns } from '@visx/grid';\nimport AnimatedGridLines from './AnimatedGridLines';\nimport type { AnimationTrajectory } from '../types';\n\nexport default function AnimatedGridColumns<Scale extends GridScale>({\n  scale,\n  height,\n  numTicks,\n  tickValues,\n  offset,\n  className,\n  animationTrajectory,\n  top,\n  left,\n  ...lineProps\n}: Omit<GridColumnsProps<Scale>, 'children'> & { animationTrajectory?: AnimationTrajectory }) {\n  return (\n    <GridColumns\n      scale={scale}\n      height={height}\n      numTicks={numTicks}\n      tickValues={tickValues}\n      className={className}\n      offset={offset}\n      top={top}\n      left={left}\n    >\n      {({ lines }) => (\n        <AnimatedGridLines\n          scale={scale}\n          lines={lines}\n          animationTrajectory={animationTrajectory}\n          animateXOrY=\"x\"\n          lineKey={(line) => `column-${line?.from?.x ?? ''}-${line.index}`}\n          {...lineProps}\n        />\n      )}\n    </GridColumns>\n  );\n}\n"
  },
  {
    "path": "packages/visx-react-spring/src/grid/AnimatedGridLines.tsx",
    "content": "import type { SVGProps } from 'react';\nimport { animated, useTransition } from '@react-spring/web';\nimport type { GridScale, GridLines, CommonGridProps } from '@visx/grid';\nimport type { TransitionConfig } from '../spring-configs/useLineTransitionConfig';\nimport useLineTransitionConfig from '../spring-configs/useLineTransitionConfig';\n\nexport type AnimatedGridLinesProps<Scale extends GridScale> = {\n  lines: GridLines;\n  lineKey: (line: GridLines[number]) => string;\n  scale: Scale;\n} & Omit<SVGProps<SVGLineElement>, 'ref' | 'scale'> &\n  Pick<TransitionConfig<Scale>, 'animationTrajectory' | 'animateXOrY'> &\n  Pick<CommonGridProps, 'stroke' | 'strokeWidth' | 'lineStyle' | 'strokeDasharray'>;\n\nexport default function AnimatedGridLines<Scale extends GridScale>({\n  scale,\n  lines,\n  animationTrajectory,\n  animateXOrY,\n  lineKey,\n  lineStyle,\n  ...lineProps\n}: AnimatedGridLinesProps<Scale>) {\n  const animatedLines = useTransition(lines, {\n    ...useLineTransitionConfig({\n      scale,\n      animateXOrY,\n      animationTrajectory,\n    }),\n    key: lineKey,\n  });\n\n  return (\n    <>\n      {/* @ts-expect-error react-spring's type inference issue on the styles */}\n      {animatedLines(({ fromX, toX, fromY, toY, opacity }, _, { key }) => (\n        <animated.line\n          key={key}\n          x1={fromX}\n          x2={toX}\n          y1={fromY}\n          y2={toY}\n          strokeOpacity={opacity}\n          style={lineStyle}\n          {...lineProps}\n        />\n      ))}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-react-spring/src/grid/AnimatedGridRows.tsx",
    "content": "import type { GridRowsProps, GridScale } from '@visx/grid';\nimport { GridRows } from '@visx/grid';\nimport AnimatedGridLines from './AnimatedGridLines';\nimport type { AnimationTrajectory } from '../types';\n\nexport default function AnimatedGridRows<Scale extends GridScale>({\n  scale,\n  width,\n  numTicks,\n  tickValues,\n  offset,\n  className,\n  animationTrajectory,\n  top,\n  left,\n  ...lineProps\n}: Omit<GridRowsProps<Scale>, 'children'> & { animationTrajectory?: AnimationTrajectory }) {\n  return (\n    <GridRows\n      scale={scale}\n      width={width}\n      numTicks={numTicks}\n      tickValues={tickValues}\n      className={className}\n      top={top}\n      left={left}\n      offset={offset}\n    >\n      {({ lines }) => (\n        <AnimatedGridLines\n          scale={scale}\n          lines={lines}\n          animationTrajectory={animationTrajectory}\n          animateXOrY=\"y\"\n          lineKey={(line) => `row-${line?.from?.y ?? ''}-${line.index}`}\n          {...lineProps}\n        />\n      )}\n    </GridRows>\n  );\n}\n"
  },
  {
    "path": "packages/visx-react-spring/src/index.ts",
    "content": "// @visx/react-spring\nexport { default as AnimatedTicks } from './axis/AnimatedTicks';\nexport { default as AnimatedAxis } from './axis/AnimatedAxis';\nexport { default as AnimatedGridRows } from './grid/AnimatedGridRows';\nexport { default as AnimatedGridColumns } from './grid/AnimatedGridColumns';\n\nexport type * from './types';\n"
  },
  {
    "path": "packages/visx-react-spring/src/spring-configs/useLineTransitionConfig.ts",
    "content": "import { useMemo } from 'react';\nimport { coerceNumber } from '@visx/scale';\nimport type { AxisScale } from '@visx/axis';\nimport type { GridScale } from '@visx/grid';\nimport type { AnimationTrajectory } from '../types';\n\ninterface Point {\n  x?: number;\n  y?: number;\n}\n\ninterface Line {\n  from: Point;\n  to: Point;\n}\n\nfunction animatedValue(\n  animationTrajectory: AnimationTrajectory,\n  positionOnScale: number | undefined,\n  scaleMin: number | undefined,\n  scaleMax: number | undefined,\n  scaleHalfwayPoint: number,\n): number {\n  switch (animationTrajectory) {\n    case 'center':\n      return scaleHalfwayPoint;\n    case 'min':\n      return scaleMin ?? 0;\n    case 'max':\n      return scaleMax ?? 0;\n    case 'outside':\n    default:\n      return ((positionOnScale ?? 0) < scaleHalfwayPoint ? scaleMin : scaleMax) ?? 0;\n  }\n}\n\nfunction enterUpdate({ from, to }: Line) {\n  return {\n    fromX: from.x,\n    toX: to.x,\n    fromY: from.y,\n    toY: to.y,\n    opacity: 1,\n  };\n}\n\nexport type TransitionConfig<Scale extends AxisScale | GridScale> = {\n  /** Scale along which animation occurs. */\n  scale: Scale;\n  /** Whether to animate the `x` or `y` values of a Line. */\n  animateXOrY: 'x' | 'y';\n  /** The scale position entering lines come from, and exiting lines leave to. */\n  animationTrajectory?: AnimationTrajectory;\n};\n\n/**\n * A hook that returns `react-spring` transition config for animating a Line\n * horizontally, vertically, and from a specific starting point.\n */\nexport default function useLineTransitionConfig<Scale extends AxisScale | GridScale>({\n  scale,\n  animateXOrY,\n  animationTrajectory: initAnimationTrajectory = 'outside',\n}: TransitionConfig<Scale>) {\n  const shouldAnimateX = animateXOrY === 'x';\n  return useMemo(() => {\n    const [a, b] = scale.range().map(coerceNumber);\n    const isDescending = b != null && a != null && b < a;\n    const [scaleMin, scaleMax] = isDescending ? [b, a] : [a, b];\n    const scaleLength = b != null && a != null ? Math.abs(b - a) : 0;\n    const scaleHalfwayPoint = (scaleMin ?? 0) + scaleLength / 2;\n    let animationTrajectory = initAnimationTrajectory;\n\n    // correct direction for y-axis which is inverted due to svg coords\n    if (!shouldAnimateX && initAnimationTrajectory === 'min') animationTrajectory = 'max';\n    if (!shouldAnimateX && initAnimationTrajectory === 'max') animationTrajectory = 'min';\n\n    const fromLeave = ({ from, to }: Line) => ({\n      fromX: shouldAnimateX\n        ? animatedValue(animationTrajectory, from.x, scaleMin, scaleMax, scaleHalfwayPoint)\n        : from.x,\n      toX: shouldAnimateX\n        ? animatedValue(animationTrajectory, from.x, scaleMin, scaleMax, scaleHalfwayPoint)\n        : to.x,\n      fromY: shouldAnimateX\n        ? from.y\n        : animatedValue(animationTrajectory, from.y, scaleMin, scaleMax, scaleHalfwayPoint),\n      toY: shouldAnimateX\n        ? to.y\n        : animatedValue(animationTrajectory, from.y, scaleMin, scaleMax, scaleHalfwayPoint),\n      opacity: 0,\n    });\n\n    return {\n      from: fromLeave,\n      leave: fromLeave,\n      enter: enterUpdate,\n      update: enterUpdate,\n    };\n  }, [scale, shouldAnimateX, initAnimationTrajectory]);\n}\n"
  },
  {
    "path": "packages/visx-react-spring/src/types/index.ts",
    "content": "export type AnimationTrajectory = 'outside' | 'center' | 'min' | 'max';\n"
  },
  {
    "path": "packages/visx-react-spring/test/AnimatedAxis.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { AnimatedAxis } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\ndescribe('AnimatedAxis', () => {\n  const defaultProps = {\n    scale: scaleLinear({\n      domain: [0, 10],\n      range: [0, 100],\n    }),\n    orientation: 'bottom',\n  } as const;\n\n  beforeEach(() => {\n    vi.clearAllMocks();\n    addMock();\n  });\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(AnimatedAxis).toBeDefined();\n  });\n\n  it('should render without errors', async () => {\n    const { container } = render(\n      <svg width={100} height={100}>\n        <AnimatedAxis {...defaultProps} />\n      </svg>,\n    );\n\n    await waitFor(() => {\n      // Check for SVG container\n      const svg = container.querySelector('svg');\n      expect(svg).toBeInTheDocument();\n\n      // Check for axis line\n      const axisLine = container.querySelector('.visx-axis-line');\n      expect(axisLine).toBeInTheDocument();\n\n      // Check for tick elements\n      const ticks = container.querySelectorAll('.visx-axis-tick');\n      expect(ticks.length).toBeGreaterThan(0);\n\n      // Check for tick labels\n      const tickLabels = container.querySelectorAll('text');\n      expect(tickLabels.length).toBeGreaterThan(0);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-react-spring/test/AnimatedGridColumns.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { AnimatedGridColumns } from '../src';\n\ndescribe('AnimatedGridColumns', () => {\n  const defaultProps = {\n    scale: scaleLinear({ domain: [0, 10], range: [0, 10] }),\n    width: 100,\n    height: 100,\n    numTicks: 5,\n  };\n\n  it('should be defined', () => {\n    expect(AnimatedGridColumns).toBeDefined();\n  });\n\n  it('should render without crashing', () => {\n    const { container } = render(\n      <svg>\n        <AnimatedGridColumns {...defaultProps} />\n      </svg>,\n    );\n\n    // Check that SVG elements are rendered\n    const gridGroup = container.querySelector('g.visx-columns');\n    expect(gridGroup).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-react-spring/test/AnimatedGridRows.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { AnimatedGridRows } from '../src';\n\ndescribe('AnimatedGridRows', () => {\n  const defaultProps = {\n    width: 100,\n    height: 100,\n    scale: scaleLinear({\n      domain: [0, 10],\n      range: [0, 100],\n    }),\n    numTicks: 5,\n  };\n\n  it('should be defined', () => {\n    expect(AnimatedGridRows).toBeDefined();\n  });\n\n  it('should render without crashing', () => {\n    const { container } = render(\n      <svg>\n        <AnimatedGridRows {...defaultProps} />\n      </svg>,\n    );\n    expect(container.querySelector('g.visx-rows')).toBeInTheDocument();\n  });\n\n  it('should render with custom dimensions', () => {\n    const { container } = render(\n      <svg>\n        <AnimatedGridRows {...defaultProps} width={200} />\n      </svg>,\n    );\n    const gridGroup = container.querySelector('g.visx-rows');\n    expect(gridGroup).toBeInTheDocument();\n\n    const lines = container.querySelectorAll('line');\n    expect(lines[0]).toHaveAttribute('x2', '200');\n  });\n\n  it('should render with custom scale', () => {\n    const customScale = scaleLinear({\n      domain: [0, 100],\n      range: [0, 500],\n    });\n\n    const { container } = render(\n      <svg>\n        <AnimatedGridRows {...defaultProps} scale={customScale} />\n      </svg>,\n    );\n    const gridGroup = container.querySelector('g.visx-rows');\n    expect(gridGroup).toBeInTheDocument();\n    expect(gridGroup?.getAttribute('transform')).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-react-spring/test/AnimatedTicks.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { AnimatedTicks } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\ndescribe('AnimatedTicks', () => {\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(AnimatedTicks).toBeDefined();\n  });\n\n  it('should render tickComponent defined', () => {\n    const { getByText } = render(\n      <svg>\n        <AnimatedTicks\n          hideTicks={false}\n          horizontal={false}\n          orientation=\"bottom\"\n          tickComponent={() => <text>Test Component</text>}\n          scale={scaleLinear({ domain: [0, 10], range: [0, 10] })}\n          tickLabelProps={[]}\n          ticks={[\n            {\n              from: { x: 0, y: 0 },\n              to: { x: 0, y: 5 },\n              value: 0,\n              index: 0,\n              formattedValue: '0',\n            },\n          ]}\n        />\n      </svg>,\n    );\n\n    expect(getByText('Test Component')).toBeInTheDocument();\n  });\n\n  it('should render without errors', () => {\n    const { container } = render(\n      <svg>\n        <AnimatedTicks\n          hideTicks={false}\n          horizontal={false}\n          orientation=\"bottom\"\n          scale={scaleLinear({ domain: [0, 10], range: [0, 10] })}\n          tickLabelProps={[]}\n          ticks={[\n            { from: { x: 0, y: 0 }, to: { x: 0, y: 5 }, value: 0, index: 0, formattedValue: '0' },\n          ]}\n        />\n      </svg>,\n    );\n    // Check that ticks are rendered\n    const tickGroup = container.querySelector('.visx-axis-tick');\n    expect(tickGroup).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-react-spring/test/svgMock.ts",
    "content": "// @ts-expect-error\nlet originalFn: typeof SVGElement.prototype.getComputedTextLength;\n\n/**\n * JSDom does not implement getComputedTextLength()\n * so this function add mock implementation for testing.\n */\nexport function addMock() {\n  // @ts-expect-error\n  originalFn = SVGElement.prototype.getComputedTextLength;\n\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = function getComputedTextLength() {\n    // Make every character 10px wide\n    return (this.textContent?.length ?? 0) * 10;\n  };\n}\n\n/**\n * Remove mock from addMock()\n */\nexport function removeMock() {\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = originalFn;\n}\n"
  },
  {
    "path": "packages/visx-react-spring/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-react-spring/test/useLineTransitionConfig.test.tsx",
    "content": "import { renderHook } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport useLineTransitionConfig from '../src/spring-configs/useLineTransitionConfig';\n\nconst scale = scaleLinear({ domain: [0, 10], range: [0, 10] });\nconst invertedScale = scaleLinear({ domain: [0, 10], range: [10, 0] });\nconst verticalLine = { from: { x: 0, y: 0 }, to: { x: 0, y: 5 } };\nconst verticalLineMax = { from: { x: 8, y: 0 }, to: { x: 8, y: 5 } };\n\ndescribe('useLineTransitionConfig', () => {\n  it('should be defined', () => {\n    expect(useLineTransitionConfig).toBeDefined();\n  });\n\n  it('should return react-spring config with from, enter, update, leave keys', () => {\n    const { result } = renderHook(() => useLineTransitionConfig({ scale, animateXOrY: 'x' }));\n\n    expect(result.current).toMatchObject({\n      from: expect.any(Function),\n      enter: expect.any(Function),\n      update: expect.any(Function),\n      leave: expect.any(Function),\n    });\n  });\n\n  it('should animate from scale min', () => {\n    const { result } = renderHook(() =>\n      useLineTransitionConfig({\n        scale,\n        animateXOrY: 'x',\n        animationTrajectory: 'min',\n      }),\n    );\n\n    const { result: invertedResult } = renderHook(() =>\n      useLineTransitionConfig({\n        scale: invertedScale,\n        animateXOrY: 'y',\n        animationTrajectory: 'min',\n      }),\n    );\n\n    expect(result.current.from(verticalLine).fromX).toBe(0);\n    expect(invertedResult.current.from(verticalLine).fromY).toBe(10);\n  });\n\n  it('should animate from scale max', () => {\n    const { result } = renderHook(() =>\n      useLineTransitionConfig({\n        scale,\n        animateXOrY: 'x',\n        animationTrajectory: 'max',\n      }),\n    );\n\n    const { result: invertedResult } = renderHook(() =>\n      useLineTransitionConfig({\n        scale: invertedScale,\n        animateXOrY: 'y',\n        animationTrajectory: 'max',\n      }),\n    );\n\n    expect(result.current.from(verticalLine).fromX).toBe(10);\n    expect(invertedResult.current.from(verticalLine).fromY).toBe(0);\n  });\n\n  it('should animate from outside', () => {\n    const { result } = renderHook(() =>\n      useLineTransitionConfig({\n        scale,\n        animateXOrY: 'x',\n        animationTrajectory: 'outside',\n      }),\n    );\n\n    expect(result.current.from(verticalLine).fromX).toBe(0);\n    expect(result.current.from(verticalLineMax).fromX).toBe(10);\n  });\n\n  it('should animate from center', () => {\n    const { result } = renderHook(() =>\n      useLineTransitionConfig({\n        scale,\n        animateXOrY: 'x',\n        animationTrajectory: 'center',\n      }),\n    );\n\n    expect(result.current.from(verticalLine).fromX).toBe(5);\n  });\n});\n"
  },
  {
    "path": "packages/visx-react-spring/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-axis\"\n    },\n    {\n      \"path\": \"../visx-grid\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-text\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-react-spring/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/react-spring',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-react-spring/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/react-spring': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-responsive/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-responsive/Readme.md",
    "content": "# @visx/responsive\n\n<a title=\"@visx/responsive npm downloads\" href=\"https://www.npmjs.com/package/@visx/responsive\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/responsive.svg?style=flat-square\" />\n</a>\n\nThe `@visx/responsive` package is here to help you make responsive graphs by providing a collection\nof hooks, enhancers and components.\n\n## Installation\n\n```\nnpm install --save @visx/responsive\n```\n\n## Hooks\n\n### `useScreenSize`\n\nIf you would like your graph to adapt to the screen size, you can use the `useScreenSize()` hook. It\nreturns current screen width and height and updates the value automatically on browser window\nresize. You can optionally pass a config object as an argument to the hook. Config object attributes\nare:\n\n- `initialSize` - initial size before measuring the screen, defaults to `{ width: 0, height: 0 }`.\n- `debounceTime` - determines how often the size is updated in milliseconds, defaults to `300`.\n- `enableDebounceLeadingCall` - determines whether the size is updated immediately on first render,\n  defaults to `true`. This is essentially the value of\n  [`options.leading` in Lodash's `debounce`](https://lodash.com/docs/4.17.15#debounce).\n\n#### Example\n\n```tsx\nimport { useScreenSize } from '@visx/responsive';\n\nconst ChartToRender = () => {\n  const { width, height } = useScreenSize({ debounceTime: 150 });\n\n  return (\n    <svg width={width} height={height}>\n      {/* content */}\n    </svg>\n  );\n};\n\nconst chartToRender = <ChartToRender myProp=\"string\" />;\n```\n\n### `useParentSize`\n\nIf you want your graph to adapt to its parent size, you can use `useParentSize()` hook.\n`<ParentSize>` uses this hook internally. The hook returns `width`, `height`, `left`, `top`\nproperties which describe dimensions of the container which received `parentRef` ref. You can\noptionally pass a config object as an argument to the hook. Config object attributes are:\n\n- `initialSize` - initial size before measuring the parent, defaults to\n  `{ width: 0, height: 0, left: 0, top: 0 }`.\n- `debounceTime` - determines how often the size is updated in miliseconds, defaults to `300`.\n- `enableDebounceLeadingCall` - determines whether the size is updated immediately on first render,\n  defaults to `true`. This is essentially the value of\n  [`options.leading` in Lodash's `debounce`](https://lodash.com/docs/4.17.15#debounce).\n- `ignoreDimensions` - array of dimensions for which an update should be skipped. For example, if\n  you pass `['width']`, width changes of the component that received `parentRef` won't be\n  propagated. Defaults to `[]` (all dimensions changes trigger updates).\n\n#### Example\n\n```tsx\nimport { useParentSize } from '@visx/responsive';\n\nconst ChartToRender = () => {\n  const { parentRef, width, height } = useParentSize({ debounceTime: 150 });\n\n  return (\n    <div ref={parentRef}>\n      <svg width={width} height={height}>\n        {/* content */}\n      </svg>\n    </div>\n  );\n};\n\nconst chartToRender = <ChartToRender myProp=\"string\" />;\n```\n\n## Enhancers / (HOCs)\n\n### `withScreenSize`\n\nIf you prefer to use an enhancer, you can use the `withScreenSize()`. The resulting component will\npass `screenWidth` and `screenHeight` props to the wrapped component containing the respective\nscreen dimensions. You can also optionally pass config props to the wrapped component:\n\n- `debounceTime` - determines how often the size is updated in milliseconds, defaults to `300`.\n- `windowResizeDebounceTime` - deprecated, equivalent to the above, kept for backwards compatibility\n- `enableDebounceLeadingCall` - determines whether the size is updated immediately on first render,\n  defaults to `true`. This is essentially the value of\n  [`options.leading` in Lodash's `debounce`](https://lodash.com/docs/4.17.15#debounce).\n\n#### Example\n\n```tsx\nimport { withScreenSize, WithScreenSizeProvidedProps } from '@visx/responsive';\n\ninterface Props extends WithScreenSizeProvidedProps {\n  myProp: string;\n}\n\nconst MySuperCoolVisxChart = ({ myProp, screenWidth, screenHeight }: Props) => {\n  // ...\n};\n\nconst ChartToRender = withScreenSize(MySuperCoolVisxChart);\n\nconst chartToRender = <ChartToRender myProp=\"string\" />;\n```\n\n### `withParentSize`\n\nIf you prefer to use an enhancer to adapt your graph to its parent component's size, you can use\n`withParentSize()`. The resulting component will pass `parentWidth` and `parentHeight` props to the\nwrapped component containing the respective parent's dimensions. You can also optionally pass config\nprops to the wrapped component:\n\n- `initialWidth` - initial chart width used before the parent size is determined.\n- `initialHeight` - initial chart height used before the parent size is determined.\n- `debounceTime` - determines how often the size is updated in miliseconds, defaults to `300`.\n- `enableDebounceLeadingCall` - determines whether the size is updated immediately on first render,\n  defaults to `true`. This is essentially the value of\n  [`options.leading` in Lodash's `debounce`](https://lodash.com/docs/4.17.15#debounce).\n\n#### Example\n\n```tsx\nimport { withParentSize, WithParentSizeProvidedProps } from '@visx/responsive';\n\ninterface Props extends WithParentSizeProvidedProps {\n  myProp: string;\n}\n\nconst MySuperCoolVisxChart = ({ myProp, parentWidth, parentHeight }: Props) => {\n  // ...\n};\n\nconst ChartWithParentSize = withParentSize(MySuperCoolVisxChart);\n\nconst chartToRender = <ChartWithParentSize myProp=\"string\" initialWidth={400} />;\n```\n\n## Components\n\n### `ParentSize`\n\nYou might do the same thing as `useParentSize` or `withParentSize` using the `ParentSize` component.\n\n#### Example\n\n```tsx\nimport { ParentSize } from '@visx/responsive';\n\nconst chartToRender = (\n  <ParentSize>\n    {(parent) => (\n      <MySuperCoolVisxChart\n        parentWidth={parent.width}\n        parentHeight={parent.height}\n        parentTop={parent.top}\n        parentLeft={parent.left}\n        // this is the referrer to the wrapper component\n        parentRef={parent.ref}\n        // this function can be called inside MyVisxChart to cause a resize of the wrapper component\n        resizeParent={parent.resize}\n      />\n    )}\n  </ParentSize>\n);\n```\n\n### `ScaleSVG`\n\nYou can also create a responsive chart with a specific viewBox with the `ScaleSVG` component.\n\n#### Example\n\n```tsx\nimport { ScaleSVG } from '@visx/responsive';\n\nconst chartToRender = (\n  <ScaleSVG width={400} height={400}>\n    <MySuperCoolVXChart />\n  </ScaleSVG>\n);\n```\n\n## ⚠️ `ResizeObserver` dependency\n\n`useParentSize`, `ParentSize` and `withParentSize` rely on `ResizeObserver`s for auto-sizing. If you\nneed a polyfill, you can either pollute the `window` object or inject it cleanly like this:\n\n```tsx\nimport { ResizeObserver } from 'your-favorite-polyfill';\n\n// hook\nuseParentSize({ resizeObserverPolyfill: ResizeObserver });\n\n// component\n<ParentSize resizeObserverPolyfill={ResizeObserver} {...}>\n  {() => {...}}\n</ParentSize>\n\n// enhancer\nwithParentSize(MyComponent, ResizeObserver);\n```\n"
  },
  {
    "path": "packages/visx-responsive/package.json",
    "content": "{\n  \"name\": \"@visx/responsive\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx responsive svg\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/lodash\": \"^4.17.13\",\n    \"@types/react\": \"*\",\n    \"lodash\": \"^4.17.21\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"devDependencies\": {\n    \"@juggle/resize-observer\": \"^3.3.1\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-responsive/src/components/ParentSize.tsx",
    "content": "import type { CSSProperties, ReactNode, HTMLAttributes } from 'react';\nimport type { ParentSizeState, UseParentSizeConfig } from '../hooks/useParentSize';\nimport useParentSize from '../hooks/useParentSize';\n\nexport type ParentSizeProvidedProps = ParentSizeState & {\n  ref: HTMLDivElement | null;\n  resize: (state: ParentSizeState) => void;\n};\n\nexport type ParentSizeProps = {\n  /** Optional `className` to add to the parent `div` wrapper used for size measurement. */\n  className?: string;\n  /**\n   * @deprecated - use `style` prop as all other props are passed directly to the parent `div`.\n   * @TODO remove in the next major version.\n   * Optional `style` object to apply to the parent `div` wrapper used for size measurement.\n   * */\n  parentSizeStyles?: CSSProperties;\n  /** Child render function `({ width, height, top, left, ref, resize }) => ReactNode`. */\n  children: (args: ParentSizeProvidedProps) => ReactNode;\n} & UseParentSizeConfig;\n\nconst defaultParentSizeStyles = { width: '100%', height: '100%' };\n\nexport default function ParentSize({\n  className,\n  children,\n  debounceTime,\n  ignoreDimensions,\n  initialSize,\n  parentSizeStyles = defaultParentSizeStyles,\n  enableDebounceLeadingCall = true,\n  resizeObserverPolyfill,\n  ...restProps\n}: ParentSizeProps & Omit<HTMLAttributes<HTMLDivElement>, keyof ParentSizeProps>) {\n  const { parentRef, resize, ...dimensions } = useParentSize({\n    initialSize,\n    debounceTime,\n    ignoreDimensions,\n    enableDebounceLeadingCall,\n    resizeObserverPolyfill,\n  });\n\n  return (\n    <div style={parentSizeStyles} ref={parentRef} className={className} {...restProps}>\n      {children({\n        ...dimensions,\n        ref: parentRef.current,\n        resize,\n      })}\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-responsive/src/components/ScaleSVG.tsx",
    "content": "import type { ReactNode, Ref } from 'react';\n\nexport type ScaleSVGProps = {\n  /** Child SVG to scale, rendered as the child of the parent wrappers provided by this component `<div><svg>{children}</svg></div>`. */\n  children?: ReactNode;\n  /** Width of the desired SVG. */\n  width?: number | string;\n  /** Height of the desired SVG. */\n  height?: number | string;\n  /** xOrigin of the desired SVG. */\n  xOrigin?: number | string;\n  /** yOrigin of the desired SVG. */\n  yOrigin?: number | string;\n  /** Whether to preserve SVG aspect ratio. */\n  preserveAspectRatio?: string;\n  /** Ref to the parent `<svg />` used for scaling. */\n  innerRef?: Ref<SVGSVGElement>;\n};\n\nexport default function ScaleSVG({\n  children,\n  width,\n  height,\n  xOrigin = 0,\n  yOrigin = 0,\n  preserveAspectRatio = 'xMinYMin meet',\n  innerRef,\n}: ScaleSVGProps) {\n  return (\n    <div\n      style={{\n        display: 'inline-block',\n        position: 'relative',\n        width: '100%',\n        verticalAlign: 'top',\n        overflow: 'hidden',\n      }}\n    >\n      <svg\n        preserveAspectRatio={preserveAspectRatio}\n        viewBox={`${xOrigin} ${yOrigin} ${width} ${height}`}\n        ref={innerRef}\n      >\n        {children}\n      </svg>\n    </div>\n  );\n}\n"
  },
  {
    "path": "packages/visx-responsive/src/enhancers/withParentSize.tsx",
    "content": "import debounce from 'lodash/debounce';\nimport { Component } from 'react';\nimport type { ComponentType } from 'react';\nimport type {\n  DebounceSettings,\n  Simplify,\n  PrivateWindow,\n  ResizeObserverPolyfill,\n  ResizeObserver,\n} from '../types';\n\nconst CONTAINER_STYLES = { width: '100%', height: '100%' };\n\n/**\n * @deprecated\n * @TODO remove in the next major version - exported for backwards compatibility\n */\nexport type WithParentSizeProps = DebounceSettings;\n\ntype WithParentSizeConfig = {\n  initialWidth?: number;\n  initialHeight?: number;\n} & DebounceSettings;\n\ntype WithParentSizeState = {\n  parentWidth?: number;\n  parentHeight?: number;\n};\n\nexport type WithParentSizeProvidedProps = WithParentSizeState;\n\ntype WithParentSizeComponentProps<P extends WithParentSizeProvidedProps> = Simplify<\n  Omit<P, keyof WithParentSizeProvidedProps> & WithParentSizeConfig\n>;\n\nexport default function withParentSize<P extends WithParentSizeProvidedProps>(\n  BaseComponent: ComponentType<P>,\n  /** Optionally inject a ResizeObserver polyfill, else this *must* be globally available. */\n  resizeObserverPolyfill?: ResizeObserverPolyfill,\n): ComponentType<WithParentSizeComponentProps<P>> {\n  return class WrappedComponent extends Component<\n    WithParentSizeComponentProps<P>,\n    WithParentSizeState\n  > {\n    displayName = `withParentSize(${\n      BaseComponent.displayName ?? BaseComponent.name ?? 'Component'\n    })`;\n    state = {\n      parentWidth: undefined,\n      parentHeight: undefined,\n    };\n    animationFrameID: number = 0;\n    resizeObserver: ResizeObserver | undefined;\n    container: HTMLDivElement | null = null;\n\n    componentDidMount() {\n      const ResizeObserverLocal =\n        resizeObserverPolyfill || (window as unknown as PrivateWindow).ResizeObserver;\n\n      this.resizeObserver = new ResizeObserverLocal((entries) => {\n        entries.forEach((entry) => {\n          const { width, height } = entry.contentRect;\n          this.animationFrameID = window.requestAnimationFrame(() => {\n            this.resize({\n              width,\n              height,\n            });\n          });\n        });\n      });\n      if (this.container) this.resizeObserver.observe(this.container);\n    }\n\n    componentWillUnmount() {\n      window.cancelAnimationFrame(this.animationFrameID);\n      if (this.resizeObserver) this.resizeObserver.disconnect();\n      this.resize.cancel();\n    }\n\n    setRef = (ref: HTMLDivElement) => {\n      this.container = ref;\n    };\n\n    resize = debounce(\n      // eslint-disable-next-line unicorn/consistent-function-scoping\n      ({ width, height }: { width: number; height: number }) => {\n        this.setState({\n          parentWidth: width,\n          parentHeight: height,\n        });\n      },\n      this.props.debounceTime ?? 300,\n      { leading: this.props.enableDebounceLeadingCall ?? true },\n    );\n\n    render() {\n      const { initialWidth, initialHeight } = this.props;\n      const { parentWidth = initialWidth, parentHeight = initialHeight } = this.state;\n      return (\n        <div style={CONTAINER_STYLES} ref={this.setRef}>\n          {parentWidth != null && parentHeight != null && (\n            <BaseComponent\n              parentWidth={parentWidth}\n              parentHeight={parentHeight}\n              {...(this.props as P)}\n            />\n          )}\n        </div>\n      );\n    }\n  };\n}\n"
  },
  {
    "path": "packages/visx-responsive/src/enhancers/withScreenSize.tsx",
    "content": "import debounce from 'lodash/debounce';\nimport { Component } from 'react';\nimport type { ComponentType } from 'react';\nimport type { Simplify, DebounceSettings } from '../types';\n\ntype WithScreenSizeConfig = {\n  /** @deprecated use `debounceTime` instead */\n  windowResizeDebounceTime?: number;\n} & DebounceSettings;\n\n/**\n * @deprecated\n * @TODO remove in the next major version - exported for backwards compatibility\n */\nexport type WithParentSizeProps = Omit<WithScreenSizeConfig, 'debounceTime'>;\n\ntype WithScreenSizeState = {\n  screenWidth?: number;\n  screenHeight?: number;\n};\n\nexport type WithScreenSizeProvidedProps = WithScreenSizeState;\n\ntype WithScreenSizeComponentProps<P extends WithScreenSizeProvidedProps> = Simplify<\n  Omit<P, keyof WithScreenSizeProvidedProps> & WithScreenSizeConfig\n>;\n\nexport default function withScreenSize<P extends WithScreenSizeProvidedProps>(\n  BaseComponent: ComponentType<P>,\n): ComponentType<WithScreenSizeComponentProps<P>> {\n  return class WrappedComponent extends Component<\n    WithScreenSizeComponentProps<P>,\n    WithScreenSizeState\n  > {\n    displayName = `withScreenSize(${\n      BaseComponent.displayName ?? BaseComponent.name ?? 'Component'\n    })`;\n    state = {\n      screenWidth: undefined,\n      screenHeight: undefined,\n    };\n\n    componentDidMount() {\n      window.addEventListener('resize', this.resize, false);\n      this.resize();\n    }\n\n    componentWillUnmount() {\n      window.removeEventListener('resize', this.resize, false);\n      this.resize.cancel();\n    }\n\n    resize = debounce(\n      // eslint-disable-next-line unicorn/consistent-function-scoping\n      () => {\n        this.setState((/** prevState, props */) => ({\n          screenWidth: window.innerWidth,\n          screenHeight: window.innerHeight,\n        }));\n      },\n      this.props.debounceTime ?? this.props.windowResizeDebounceTime ?? 300,\n      { leading: this.props.enableDebounceLeadingCall ?? true },\n    );\n\n    render() {\n      const { screenWidth, screenHeight } = this.state;\n      return screenWidth == null || screenHeight == null ? null : (\n        <BaseComponent\n          screenWidth={screenWidth}\n          screenHeight={screenHeight}\n          {...(this.props as P)}\n        />\n      );\n    }\n  };\n}\n"
  },
  {
    "path": "packages/visx-responsive/src/hooks/useParentSize.ts",
    "content": "import debounce from 'lodash/debounce';\nimport type { RefObject } from 'react';\nimport { useEffect, useMemo, useRef, useState } from 'react';\nimport type { DebounceSettings, PrivateWindow, ResizeObserverPolyfill } from '../types';\n\nexport type ParentSizeState = {\n  width: number;\n  height: number;\n  top: number;\n  left: number;\n};\n\nexport type UseParentSizeConfig = {\n  /** Initial size before measuring the parent. */\n  initialSize?: Partial<ParentSizeState>;\n  /** Optionally inject a ResizeObserver polyfill, else this *must* be globally available. */\n  resizeObserverPolyfill?: ResizeObserverPolyfill;\n  /** Optional dimensions provided won't trigger a state change when changed. */\n  ignoreDimensions?: keyof ParentSizeState | (keyof ParentSizeState)[];\n} & DebounceSettings;\n\ntype UseParentSizeResult<T extends HTMLElement = HTMLDivElement> = ParentSizeState & {\n  parentRef: RefObject<T | null>;\n  resize: (state: ParentSizeState) => void;\n};\n\nconst defaultIgnoreDimensions: UseParentSizeConfig['ignoreDimensions'] = [];\nconst defaultInitialSize: ParentSizeState = {\n  width: 0,\n  height: 0,\n  top: 0,\n  left: 0,\n};\n\nexport default function useParentSize<T extends HTMLElement = HTMLDivElement>({\n  initialSize = defaultInitialSize,\n  debounceTime = 300,\n  ignoreDimensions = defaultIgnoreDimensions,\n  enableDebounceLeadingCall = true,\n  resizeObserverPolyfill,\n}: UseParentSizeConfig = {}): UseParentSizeResult<T> {\n  const parentRef = useRef<T>(null);\n  const animationFrameID = useRef(0);\n\n  const [state, setState] = useState<ParentSizeState>({ ...defaultInitialSize, ...initialSize });\n\n  const resize = useMemo(() => {\n    const normalized = Array.isArray(ignoreDimensions) ? ignoreDimensions : [ignoreDimensions];\n\n    return debounce(\n      (incoming: ParentSizeState) => {\n        setState((existing) => {\n          const stateKeys = Object.keys(existing) as (keyof ParentSizeState)[];\n          const keysWithChanges = stateKeys.filter((key) => existing[key] !== incoming[key]);\n          const shouldBail = keysWithChanges.every((key) => normalized.includes(key));\n\n          return shouldBail ? existing : incoming;\n        });\n      },\n      debounceTime,\n      { leading: enableDebounceLeadingCall },\n    );\n  }, [debounceTime, enableDebounceLeadingCall, ignoreDimensions]);\n\n  useEffect(() => {\n    const LocalResizeObserver =\n      resizeObserverPolyfill || (window as unknown as PrivateWindow).ResizeObserver;\n\n    const observer = new LocalResizeObserver((entries) => {\n      entries.forEach((entry) => {\n        const { left, top, width, height } = entry?.contentRect ?? {};\n        animationFrameID.current = window.requestAnimationFrame(() => {\n          resize({ width, height, top, left });\n        });\n      });\n    });\n    if (parentRef.current) observer.observe(parentRef.current);\n\n    return () => {\n      window.cancelAnimationFrame(animationFrameID.current);\n      observer.disconnect();\n      resize.cancel();\n    };\n  }, [resize, resizeObserverPolyfill]);\n\n  return { parentRef, resize, ...state };\n}\n"
  },
  {
    "path": "packages/visx-responsive/src/hooks/useScreenSize.ts",
    "content": "import debounce from 'lodash/debounce';\nimport { useEffect, useMemo, useState } from 'react';\nimport type { DebounceSettings } from '../types/index';\n\ninterface ScreenSize {\n  width: number;\n  height: number;\n}\n\nconst defaultInitialSize: ScreenSize = {\n  width: 0,\n  height: 0,\n};\n\nexport type UseScreenSizeConfig = {\n  /** Initial size before measuring the screen. */\n  initialSize?: ScreenSize;\n} & DebounceSettings;\n\nconst useScreenSize = ({\n  initialSize = defaultInitialSize,\n  debounceTime = 300,\n  enableDebounceLeadingCall = true,\n}: UseScreenSizeConfig = {}) => {\n  const [screenSize, setScreenSize] = useState<ScreenSize>(initialSize);\n\n  const handleResize = useMemo(\n    () =>\n      debounce(\n        () => {\n          setScreenSize(() => ({\n            width: window.innerWidth,\n            height: window.innerHeight,\n          }));\n        },\n        debounceTime,\n        { leading: enableDebounceLeadingCall },\n      ),\n    [debounceTime, enableDebounceLeadingCall],\n  );\n\n  useEffect(() => {\n    handleResize();\n    window.addEventListener('resize', handleResize, false);\n    return () => {\n      window.removeEventListener('resize', handleResize, false);\n      handleResize.cancel();\n    };\n  }, [handleResize]);\n\n  return screenSize;\n};\n\nexport default useScreenSize;\n"
  },
  {
    "path": "packages/visx-responsive/src/index.ts",
    "content": "// @visx/responsive\nexport { default as ParentSize } from './components/ParentSize';\nexport { default as ScaleSVG } from './components/ScaleSVG';\nexport { default as withParentSize } from './enhancers/withParentSize';\nexport type { WithParentSizeProvidedProps } from './enhancers/withParentSize';\nexport { default as withScreenSize } from './enhancers/withScreenSize';\nexport type { WithScreenSizeProvidedProps } from './enhancers/withScreenSize';\nexport { default as useParentSize } from './hooks/useParentSize';\nexport type { UseParentSizeConfig, ParentSizeState } from './hooks/useParentSize';\nexport { default as useScreenSize } from './hooks/useScreenSize';\nexport type { UseScreenSizeConfig } from './hooks/useScreenSize';\n\nexport type { ParentSizeProps, ParentSizeProvidedProps } from './components/ParentSize';\nexport type { ScaleSVGProps } from './components/ScaleSVG';\nexport type * from './types';\n"
  },
  {
    "path": "packages/visx-responsive/src/types/index.ts",
    "content": "// @TODO remove all these types when upgraded to TS 4 which has its own declaration\ninterface ResizeObserverEntry {\n  contentRect: {\n    left: number;\n    top: number;\n    width: number;\n    height: number;\n  };\n}\n\ntype ResizeObserverCallback = (entries: ResizeObserverEntry[], observer: ResizeObserver) => void;\n\nexport declare class ResizeObserver {\n  constructor(callback: ResizeObserverCallback);\n  observe(target: Element, options?: any): void;\n  unobserve(target: Element): void;\n  disconnect(): void;\n  static toString(): string;\n}\n\nexport interface ResizeObserverPolyfill {\n  new (callback: ResizeObserverCallback): ResizeObserver;\n}\n\nexport interface PrivateWindow {\n  ResizeObserver: ResizeObserverPolyfill;\n}\n\nexport type Simplify<T> = { [Key in keyof T]: T[Key] } & {};\n\nexport interface DebounceSettings {\n  /** Child render updates upon resize are delayed until `debounceTime` milliseconds _after_ the last resize event is observed. Defaults to `300`. */\n  debounceTime?: number;\n  /** Optional flag to toggle leading debounce calls. When set to true this will ensure that the component always renders immediately. Defaults to `true`. */\n  enableDebounceLeadingCall?: boolean;\n}\n"
  },
  {
    "path": "packages/visx-responsive/test/ParentSize.test.tsx",
    "content": "import React from 'react';\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { render } from '@testing-library/react';\nimport { ParentSize } from '../src';\n\ndescribe('<ParentSize />', () => {\n  it('should be defined', () => {\n    expect(ParentSize).toBeDefined();\n  });\n  it('does not throw', () => {\n    const wrapper = render(\n      <ParentSize resizeObserverPolyfill={ResizeObserver}>\n        {() => <div data-testid=\"test\" />}\n      </ParentSize>,\n    );\n    expect(wrapper.findByTestId('test')).not.toBeNull();\n  });\n});\n"
  },
  {
    "path": "packages/visx-responsive/test/ScaleSVG.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { ScaleSVG } from '../src';\n\ndescribe('<ScaleSVG />', () => {\n  test('it should be defined', () => {\n    expect(ScaleSVG).toBeDefined();\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGSVGElement>();\n    const { container } = render(<ScaleSVG innerRef={fakeRef} />);\n    const SVGElement = container.querySelector('svg');\n    expect(fakeRef.current).toContainElement(SVGElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-responsive/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-responsive/test/useScreenSize.test.ts",
    "content": "import { vi } from 'vitest';\nimport { act, fireEvent, renderHook } from '@testing-library/react';\nimport useScreenSize from '../src/hooks/useScreenSize';\n\nconst setWindowSize = (width: number, height: number) => {\n  Object.defineProperty(window, 'innerWidth', {\n    writable: true,\n    configurable: true,\n    value: width,\n  });\n  Object.defineProperty(window, 'innerHeight', {\n    writable: true,\n    configurable: true,\n    value: height,\n  });\n};\n\ndescribe('useScreenSize', () => {\n  beforeEach(() => {\n    setWindowSize(1280, 1024);\n  });\n\n  afterEach(() => {\n    // @ts-ignore is just a test why you heff to be mad\n    delete window.innerWidth;\n    // @ts-ignore\n    delete window.innerHeight;\n  });\n\n  test('it should return the initial screen size', () => {\n    const { result } = renderHook(() => useScreenSize());\n    expect(result.current).toEqual({ width: 1280, height: 1024 });\n  });\n\n  test('it should update the screen size on window resize', () => {\n    // Use modern fake timers to gain better control of timers\n    vi.useFakeTimers();\n\n    const { result } = renderHook(() => useScreenSize());\n\n    expect(result.current).toEqual({ width: 1280, height: 1024 });\n\n    // Simulate the window resize event\n    setWindowSize(800, 600);\n    act(() => {\n      fireEvent(window, new Event('resize'));\n      // Move the timers forward, triggering the debounce/throttle logic in `useScreenSize`\n      vi.advanceTimersByTime(500);\n    });\n\n    expect(result.current).toEqual({ width: 800, height: 600 });\n\n    // Reset to real timers after the test\n    vi.useRealTimers();\n  });\n});\n"
  },
  {
    "path": "packages/visx-responsive/test/withParentSize.test.tsx",
    "content": "import { ResizeObserver } from '@juggle/resize-observer';\nimport '@testing-library/jest-dom';\nimport { render } from '@testing-library/react';\nimport React from 'react';\nimport type { WithParentSizeProvidedProps } from '../src';\nimport { withParentSize } from '../src';\n\ninterface ComponentProps extends WithParentSizeProvidedProps {\n  // only there to ensure that TS allows enhanced component to have own props, different than the ones passed by the HOC\n  role: string;\n}\n\nfunction Component({ parentWidth, parentHeight, role }: ComponentProps) {\n  return (\n    <div data-testid=\"Component\" role={role} style={{ width: parentWidth, height: parentHeight }} />\n  );\n}\n\ndescribe('withParentSize', () => {\n  test('it should be defined', () => {\n    expect(withParentSize).toBeDefined();\n  });\n\n  test('it should pass parentWidth and parentHeight props to its child', () => {\n    const WrappedComponent = withParentSize(Component, ResizeObserver);\n\n    // @ts-expect-error ensure unknown types still error\n    render(<WrappedComponent unknown=\"prop\" />);\n\n    const { getByTestId } = render(\n      <WrappedComponent role=\"img\" initialWidth={200} initialHeight={200} />,\n    );\n\n    const RenderedComponent = getByTestId('Component');\n    expect(RenderedComponent).toHaveStyle('width: 200px; height: 200px');\n  });\n});\n"
  },
  {
    "path": "packages/visx-responsive/test/withScreenSize.test.ts",
    "content": "import { withScreenSize } from '../src';\n\ndescribe('withScreenSize', () => {\n  test('it should be defined', () => {\n    expect(withScreenSize).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-responsive/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-responsive/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/responsive',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-responsive/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/responsive': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-sankey/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-sankey/Readme.md",
    "content": "# @visx/sankey\n\n<a title=\"@visx/sankey npm downloads\" href=\"https://www.npmjs.com/package/@visx/sankey\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/sankey.svg?style=flat-square\" />\n</a>\n\nSankey diagrams visualize the directed flow between nodes in an acyclic network. This package\ncontains `react` components for visualizing sankey diagrams and largely mirrors\n[`d3-sankey`](https://github.com/d3/d3-sankey).\n\nMany components take the same input `sankey` data as defined in as specified in the\n[`d3-sankey`](https://github.com/d3/d3-sankey) module to output a graph of the sankey layout. For\nconvenience, this package also exports the [`d3-sankey`](https://github.com/d3/d3-sankey)utility to\ngenerate this format.\n\n## Installation\n\n```\nnpm install --save @visx/sankey\n```\n\n## Usage\n\nThe `@visx/sankey` package exports a wrapped version of `d3-sankey` for flexible usage, as well as a\n`<Sankey />` component for rendering the sankey layout.\n\n```js\n// equivalent to `import { sankey } from 'd3-sankey';`\nimport { sankey } from '@visx/sankey';\n\nconst generator = sankey();\nconst graph = generator({\n  nodes: [{ name: 'node 1' }, { name: 'node 2' }, { name: 'node 3' }],\n  links: [\n    { source: 0, target: 1, value: 10 },\n    { source: 1, target: 2, value: 5 },\n  ],\n});\n```\n\n```js\nimport { Sankey, sankeyCenter } from '@visx/sankey';\n\nconst nodes = [{ name: 'node 1' }, { name: 'node 2' }, { name: 'node 3' }];\nconst links = [\n  { source: 0, target: 1, value: 10 },\n  { source: 1, target: 2, value: 5 },\n];\nconst data = { nodes, links };\n\nreturn (\n  <svg>\n    <Sankey root={data} nodeAlign={sankeyCenter} size={[100, 100]} />\n  </svg>\n);\n```\n\nThe layout output can also be customized by providing a children function to the `<Sankey />`\ncomponent.\n\n```js\nimport { Sankey, sankeyCenter } from '@visx/sankey';\nimport { Group } from '@visx/group';\nimport { BarRounded, LinkHorizontal } from '@visx/group';\n\nconst nodes = [{ name: 'node 1' }, { name: 'node 2' }, { name: 'node 3' }];\nconst links = [\n  { source: 0, target: 1, value: 10 },\n  { source: 1, target: 2, value: 5 },\n];\nconst data = { nodes, links };\n\nreturn (\n  <svg>\n    <Sankey root={data} nodeAlign={sankeyCenter} size={[100, 100]}>\n      {({ graph, createPath }) => (\n        <>\n          <Group>\n            {graph.links.map((link, i) => (\n              <LinkHorizontal\n                key={i}\n                data={link}\n                path={createPath}\n                fill=\"transparent\"\n                stroke=\"#f50057\"\n                strokeWidth={link.width}\n                strokeOpacity={0.5}\n              />\n            ))}\n          </Group>\n          <Group>\n            {graph.nodes.map(({ y0, y1, x0, x1, name }, i) => (\n              <BarRounded\n                key={i}\n                width={x1 - x0}\n                height={y1 - y0}\n                x={x0}\n                y={y0}\n                radius={3}\n                fill=\"#f50057\"\n                all\n              />\n            ))}\n          </Group>\n        </>\n      )}\n    </Sankey>\n  </svg>\n);\n```\n"
  },
  {
    "path": "packages/visx-sankey/package.json",
    "content": "{\n  \"name\": \"@visx/sankey\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx sankey\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"d3\",\n    \"react\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@jacksonhardaker\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/d3-sankey\": \"^0.12.4\",\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\",\n    \"d3-sankey\": \"^0.12.3\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-sankey/src/Sankey.tsx",
    "content": "import type { ReactNode, SVGAttributes } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { SankeyExtraProperties, SankeyGraph, SankeyLink, SankeyNode } from 'd3-sankey';\nimport { sankey as d3sankey, sankeyLinkHorizontal } from 'd3-sankey';\nimport type { Link } from '@visx/vendor/d3-shape';\n\nconst DEFAULT_COLOR = '#000';\n\ntype NodeProps = Pick<\n  SVGAttributes<SVGRectElement>,\n  'stroke' | 'strokeOpacity' | 'strokeWidth' | 'fill' | 'fillOpacity'\n>;\ntype LinkProps = Pick<\n  SVGAttributes<SVGPathElement>,\n  | 'fill'\n  | 'fillOpacity'\n  | 'stroke'\n  | 'strokeOpacity'\n  | 'strokeWidth'\n  | 'strokeDasharray'\n  | 'strokeDashoffset'\n>;\n\ntype CreatePath<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n> = Link<any, SankeyLink<NodeDatum, LinkDatum>, [number, number]>;\n\ntype NodeIdAccessor<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n> = (node: SankeyNode<NodeDatum, LinkDatum>) => string | number;\n\ntype SourceAccessor<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n> = Exclude<Parameters<CreatePath<NodeDatum, LinkDatum>['source']>, undefined>[0];\n\ntype TargetAccessor<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n> = Exclude<Parameters<CreatePath<NodeDatum, LinkDatum>['target']>, undefined>[0];\n\ntype NodeAlignment<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n> = (node: SankeyNode<NodeDatum, LinkDatum>, n: number) => number;\n\ntype SankeyChildrenFunction<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n> = (args: {\n  graph: SankeyGraph<NodeDatum, LinkDatum>;\n  createPath: CreatePath<NodeDatum, LinkDatum>;\n}) => ReactNode;\n\nexport type SankeyProps<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n> = {\n  /** The root data from which to derive the sankey layout. */\n  root: SankeyGraph<NodeDatum, LinkDatum>;\n  /** The class name(s) applied to the g element container. */\n  className?: string;\n  /** Render override function which is passed the computed sankey data graph */\n  children?: SankeyChildrenFunction<NodeDatum, LinkDatum>;\n  /** Sets the node id accessor. */\n  nodeId?: NodeIdAccessor<NodeDatum, LinkDatum>;\n  /** Sets the node width. */\n  nodeWidth?: number;\n  /** Sets the node padding. */\n  nodePadding?: number;\n  /** Sets the node alignment function. */\n  nodeAlign?: NodeAlignment<NodeDatum, LinkDatum>;\n  /** Sets the extent of the sankey layout. */\n  extent?: [[number, number], [number, number]];\n  /** Sets the size of the layout. A convenience method equivalent to using an extent of [[0, 0], [width, height]] */\n  size?: [number, number];\n  /** Sets the number of relaxation iterations. */\n  iterations?: number;\n  /** Sets the node comparison function. */\n  nodeSort?: (\n    a: SankeyNode<NodeDatum, LinkDatum>,\n    b: SankeyNode<NodeDatum, LinkDatum>,\n  ) => number | undefined | null;\n  /** Sets the link comparison function */\n  linkSort?: (\n    a: SankeyLink<NodeDatum, LinkDatum>,\n    b: SankeyLink<NodeDatum, LinkDatum>,\n  ) => number | undefined | null;\n  /** Sets the props for the default rendered node rect. Ignored when children is defined. */\n  nodeProps?: NodeProps;\n  /** Sets the props for the default rendered link path. Ignored when children is defined. */\n  linkProps?: LinkProps;\n  /** Sets the source accessor for determining the link path. */\n  sourceAccessor?: SourceAccessor<NodeDatum, LinkDatum>;\n  /** Sets the target accessor for determining the link path. */\n  targetAccessor?: TargetAccessor<NodeDatum, LinkDatum>;\n};\n\n/**\n * Exposes d3-sankey as a React component.\n */\nexport default function Sankey<\n  NodeDatum extends SankeyExtraProperties,\n  LinkDatum extends SankeyExtraProperties,\n>({\n  root,\n  className,\n  children,\n  nodeId,\n  nodeWidth = 2,\n  nodePadding,\n  nodeAlign,\n  extent,\n  size,\n  iterations,\n  nodeSort,\n  linkSort,\n  nodeProps = {},\n  linkProps = {},\n  sourceAccessor,\n  targetAccessor,\n}: SankeyProps<NodeDatum, LinkDatum>) {\n  const sankey = d3sankey<NodeDatum, LinkDatum>();\n  if (nodeId) sankey.nodeId(nodeId);\n  if (nodeWidth) sankey.nodeWidth(nodeWidth);\n  if (nodePadding) sankey.nodePadding(nodePadding);\n  if (nodeAlign) sankey.nodeAlign(nodeAlign);\n  if (extent) sankey.extent(extent);\n  if (size) sankey.size(size);\n  if (iterations) sankey.iterations(iterations);\n  if (nodeSort) sankey.nodeSort(nodeSort);\n  if (linkSort) sankey.linkSort(linkSort);\n\n  const graph = sankey(root);\n  const createPath = sankeyLinkHorizontal<NodeDatum, LinkDatum>();\n  if (sourceAccessor) createPath.source(sourceAccessor);\n  if (targetAccessor) createPath.target(targetAccessor);\n\n  if (children) {\n    return <>{children({ graph, createPath })}</>;\n  }\n\n  return (\n    <Group className={cx('visx-sankey', className)}>\n      <Group className=\"visx-sankey-links\">\n        {graph.links.map((link, i) => (\n          <path\n            d={createPath(link) ?? ''}\n            key={i}\n            fill=\"transparent\"\n            stroke={DEFAULT_COLOR}\n            strokeWidth={Math.max(1, link.width ?? 0)}\n            strokeOpacity={0.5}\n            {...linkProps}\n          />\n        ))}\n      </Group>\n      <Group className=\"visx-sankey-nodes\">\n        {graph.nodes.map(({ y0, y1, x0, x1 }, i) =>\n          y0 !== undefined && y1 !== undefined && x0 !== undefined && x1 !== undefined ? (\n            <rect\n              fill={DEFAULT_COLOR}\n              width={x1 - x0}\n              height={y1 - y0}\n              x={x0}\n              y={y0}\n              key={i}\n              {...nodeProps}\n            />\n          ) : null,\n        )}\n      </Group>\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-sankey/src/index.ts",
    "content": "// @visx/sankey\nexport { default as Sankey } from './Sankey';\nexport {\n  sankey,\n  sankeyLinkHorizontal,\n  sankeyLeft,\n  sankeyRight,\n  sankeyCenter,\n  sankeyJustify,\n} from 'd3-sankey';\nexport type {\n  SankeyProps,\n  SankeyExtraProperties,\n  SankeyGraph,\n  SankeyLink,\n  SankeyNode,\n  SankeyNodeMinimal,\n  SankeyLinkMinimal,\n  SankeyLayout,\n} from './types';\n"
  },
  {
    "path": "packages/visx-sankey/src/types.ts",
    "content": "export type { SankeyProps } from './Sankey';\nexport type {\n  SankeyExtraProperties,\n  SankeyGraph,\n  SankeyLink,\n  SankeyNode,\n  SankeyNodeMinimal,\n  SankeyLinkMinimal,\n  SankeyLayout,\n} from 'd3-sankey';\n"
  },
  {
    "path": "packages/visx-sankey/test/Sankey.test.tsx",
    "content": "import React from 'react';\nimport { render, screen } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport type { SankeyProps } from '../src/Sankey';\nimport Sankey from '../src/Sankey';\n\nconst nodes = [{ name: 'node 1' }, { name: 'node 2' }, { name: 'node 3' }];\nconst links = [\n  { source: 0, target: 1, value: 10 },\n  { source: 1, target: 2, value: 5 },\n];\nconst root = { nodes, links };\n\nconst renderTest = (props: SankeyProps<(typeof nodes)[number], {}>) =>\n  render(\n    <svg>\n      <Sankey {...props} />\n    </svg>,\n  );\n\ndescribe('<Sankey />', () => {\n  test('it should render', () => {\n    const { container } = renderTest({ root });\n\n    expect(container.querySelector('.visx-sankey')).toBeInTheDocument();\n  });\n\n  test('it should render children', () => {\n    renderTest({\n      root,\n      children: ({ graph }) => (\n        <>\n          {graph.nodes.map((node, i) => (\n            <text key={i}>{node.name}</text>\n          ))}\n        </>\n      ),\n    });\n\n    expect(screen.getByText('node 2')).toBeInTheDocument();\n  });\n\n  test('it should render links with custom props', () => {\n    const { container } = renderTest({\n      root,\n      linkProps: { stroke: 'red' },\n      nodeProps: { fill: 'blue' },\n    });\n\n    expect(container.querySelector('.visx-sankey-links > path')).toHaveAttribute('stroke', 'red');\n    expect(container.querySelector('.visx-sankey-nodes > rect')).toHaveAttribute('fill', 'blue');\n  });\n\n  test('it should render links with custom id accessors', () => {\n    const { container } = renderTest({\n      root: {\n        nodes,\n        links: [\n          {\n            source: 'node 1',\n            target: 'node 2',\n            value: 10,\n          },\n          {\n            source: 'node 2',\n            target: 'node 3',\n            value: 5,\n          },\n        ],\n      },\n      nodeId: (node) => node.name,\n    });\n\n    expect(container.querySelectorAll('.visx-sankey-links > path')).toHaveLength(2);\n  });\n});\n"
  },
  {
    "path": "packages/visx-sankey/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-sankey/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/sankey',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-sankey/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/sankey': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-scale/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-scale/Readme.md",
    "content": "# @visx/scale\n\n<a title=\"@visx/scale npm downloads\" href=\"https://www.npmjs.com/package/@visx/scale\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/scale.svg?style=flat-square\" />\n</a>\n\n## Installation\n\n```sh\nnpm install --save @visx/scale\n```\n\n## Overview of scales\n\nThe `@visx/scale` package aims to provide a wrapper around existing `d3` scaling originally defined\nin the [d3-scale](https://github.com/d3/d3-scale) package.\n\nScales are functions that help you map your data values to the physical pixel size that your graph\nrequires. For example, let's say you wanted to create a bar chart to show populations per country.\nIf you were to use a 1-to-1 scale (IE: 1 pixel per y value) your bar for the USA would be about\n321.4 million pixels high!\n\nInstead, you can tell `visx` a function to use that takes a data value (like your population per\ncountry) and quantitatively maps to another dimensional space, like pixels.\n\nFor example, we could create a linear scale like this:\n\n```js\nconst graphWidth = 500;\nconst graphHeight = 200;\nconst [minX, maxX] = getXMinAndMax();\nconst [minY, maxY] = getYMinAndMax();\n\nconst xScale = Scale.scaleLinear({\n  domain: [minX, maxX], // x-coordinate data values\n  range: [0, graphWidth], // svg x-coordinates, svg x-coordinates increase left to right\n  round: true,\n});\n\nconst yScale = Scale.scaleLinear({\n  domain: [minY, maxY], // y-coordinate data values\n  // svg y-coordinates, these increase from top to bottom so we reverse the order\n  // so that minY in data space maps to graphHeight in svg y-coordinate space\n  range: [graphHeight, 0],\n  round: true,\n});\n\n// ...\n\nconst points = data.map((d, i) => {\n  const barHeight = graphHeight - yScale(d.y);\n  return <Shape.Bar height={barHeight} y={graphHeight - barHeight} />;\n});\n```\n\n## Different types of scales\n\n### Band scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#_band)\n\nExample:\n\n```js\nconst scale = Scale.scaleBand({\n  /*\n    range,\n    round,\n    domain,\n    padding,\n    nice = false\n  */\n});\n```\n\n### Linear scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#scaleLinear)\n\nExample:\n\n```js\nconst scale = Scale.scaleLinear({\n  /*\n    range,\n    round,\n    domain,\n    nice = false,\n    clamp = false,\n  */\n});\n```\n\n### Log scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#scaleLog)\n\nExample:\n\n```js\nconst scale = Scale.scaleLog({\n  /*\n    range,\n    round,\n    domain,\n    base,\n    nice = false,\n    clamp = false,\n  */\n});\n```\n\n**Important note:** As log(0) = -∞, a log scale domain must be strictly-positive or\nstrictly-negative; the domain must not include or cross zero.\n\n### Radial scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#scaleRadial)\n\nExample:\n\n```js\nconst scale = Scale.scaleRadial({\n  /*\n    range,\n    round,\n    domain,\n    nice = false,\n    clamp = false,\n  */\n});\n```\n\n### Ordinal scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#scaleOrdinal)\n\nExample:\n\n```js\nconst scale = Scale.scaleOrdinal({\n  /*\n    range,\n    domain,\n    unknown,\n  */\n});\n```\n\n### Point scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#scalePoint)\n\nExample:\n\n```js\nconst scale = Scale.scalePoint({\n  /*\n    range,\n    round,\n    domain,\n    padding,\n    align,\n    nice = false,\n  */\n});\n```\n\n### Power scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#scalePow)\n\nExample:\n\n```js\nconst scale = Scale.scalePower({\n  /*\n    range,\n    round,\n    domain,\n    exponent,\n    nice = false,\n    clamp = false,\n  */\n});\n```\n\n### Square Root scale\n\n[Original d3 docs](https://github.com/d3/d3-scale#scaleSqrt)\n\nExample:\n\n```js\n// No need to set the exponent, It is always 0.5\nconst scale = Scale.scaleSqrt({\n  /*\n    range,\n    round,\n    domain,\n    nice = false,\n    clamp = false,\n  */\n});\n```\n\n### Time scale\n\n[Original d3 docs](https://github.com/d3/d3-scale/blob/master/README.md#scaleTime)\n\nExample:\n\n```js\nconst scale = Scale.scaleTime({\n  /*\n    range,\n    round,\n    domain,\n    nice = false,\n    clamp = false,\n   */\n});\n```\n\nYou also can scale time with Coordinated Universal Time via `scaleUtc`.\n\nExample:\n\n```js\nconst scale = Scale.scaleUtc({\n  /*\n    range,\n    round,\n    domain,\n    nice = false,\n    clamp = false,\n   */\n});\n```\n\n### Color Scales\n\nD3 scales offer the ability to map points to colors. You can use\n[`d3-scale-chromatic`](https://github.com/d3/d3-scale-chromatic) in conjunction with visx's\n`scaleOrdinal` to make color scales.\n\nYou can install `d3-scale-chromatic` with npm:\n\n```sh\nnpm install --save d3-scale-chromatic\n```\n\nYou create a color scale like so:\n\n```js\nimport { scaleOrdinal } from '@visx/scale';\nimport { schemeSet1 } from 'd3-scale-chromatic';\n\nconst colorScale = scaleOrdinal({\n  domain: arrayOfThings,\n  range: schemeSet1,\n});\n```\n\nThis generates a color scale with the following colors:\n\n![d3-scale-chromatic schemeSet1](https://raw.githubusercontent.com/d3/d3-scale-chromatic/master/img/Set1.png)\n\nThere are a number of other\n[categorical color schemes](https://github.com/d3/d3-scale-chromatic/blob/master/README.md#categorical)\navailable, along with other continuous color schemes.\n"
  },
  {
    "path": "packages/visx-scale/package.json",
    "content": "{\n  \"name\": \"@visx/scale\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx scale\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"authors\": [\n    \"@hshoff\",\n    \"@kristw\"\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@visx/vendor\": \"workspace:*\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/createScale.ts",
    "content": "/* eslint-disable @typescript-eslint/no-unused-vars */\n/* eslint-disable no-redeclare */\nimport type { ScaleConfig, PickScaleConfigWithoutType, PickScaleConfig } from './types/ScaleConfig';\nimport type { DefaultThresholdInput, PickD3Scale, D3Scale } from './types/Scale';\nimport type { StringLike, DefaultOutput } from './types/Base';\nimport createLinearScale from './scales/linear';\nimport createLogScale from './scales/log';\nimport createPowScale from './scales/power';\nimport createSqrtScale from './scales/squareRoot';\nimport createSymlogScale from './scales/symlog';\nimport createTimeScale from './scales/time';\nimport createUtcScale from './scales/utc';\nimport createQuantileScale from './scales/quantile';\nimport createQuantizeScale from './scales/quantize';\nimport createThresholdScale from './scales/threshold';\nimport createOrdinalScale from './scales/ordinal';\nimport createPointScale from './scales/point';\nimport createBandScale from './scales/band';\nimport createRadialScale from './scales/radial';\n\n// Overload function for more strict typing, e.g.,\n// If the config is a linear config then a ScaleLinear will be returned\n// instead of a union type of all scales.\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  config?: PickScaleConfig<'linear', Output> | PickScaleConfigWithoutType<'linear', Output>,\n): PickD3Scale<'linear', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'log', Output>): PickD3Scale<'log', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'pow', Output>): PickD3Scale<'pow', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'sqrt', Output>): PickD3Scale<'sqrt', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'symlog', Output>): PickD3Scale<'symlog', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'time', Output>): PickD3Scale<'time', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'utc', Output>): PickD3Scale<'utc', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'quantile', Output>): PickD3Scale<'quantile', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'quantize', Output>): PickD3Scale<'quantize', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  config: PickScaleConfig<'threshold', Output, StringLike, ThresholdInput>,\n): PickD3Scale<'threshold', Output, StringLike, ThresholdInput>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  config: PickScaleConfig<'ordinal', Output, DiscreteInput>,\n): PickD3Scale<'ordinal', Output, DiscreteInput>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  config: PickScaleConfig<'point', Output, DiscreteInput>,\n): PickD3Scale<'point', Output, DiscreteInput>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  config: PickScaleConfig<'band', Output, DiscreteInput>,\n): PickD3Scale<'band', Output, DiscreteInput>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(config: PickScaleConfig<'radial', Output>): PickD3Scale<'radial', Output>;\n\nfunction createScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  config: ScaleConfig<Output, DiscreteInput, ThresholdInput>,\n): D3Scale<Output, DiscreteInput, ThresholdInput>;\n\n// Actual implementation\n\nfunction createScale<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  config?:\n    | ScaleConfig<Output, DiscreteInput, ThresholdInput>\n    | PickScaleConfigWithoutType<'linear', Output>,\n) {\n  if (typeof config !== 'undefined' && 'type' in config) {\n    switch (config.type) {\n      case 'linear':\n        return createLinearScale(config);\n      case 'log':\n        return createLogScale(config);\n      case 'pow':\n        return createPowScale(config);\n      case 'sqrt':\n        return createSqrtScale(config);\n      case 'symlog':\n        return createSymlogScale(config);\n      case 'time':\n        return createTimeScale(config);\n      case 'utc':\n        return createUtcScale(config);\n      case 'quantile':\n        return createQuantileScale(config);\n      case 'quantize':\n        return createQuantizeScale(config);\n      case 'threshold':\n        return createThresholdScale(config);\n      case 'ordinal':\n        return createOrdinalScale(config);\n      case 'point':\n        return createPointScale(config);\n      case 'band':\n        return createBandScale(config);\n      case 'radial':\n        return createRadialScale(config);\n      default:\n    }\n  }\n\n  // If type is not specified, fallback to linear scale\n  return createLinearScale(config);\n}\n\nexport default createScale;\n"
  },
  {
    "path": "packages/visx-scale/src/index.ts",
    "content": "// @visx/scale\nexport { default as scaleBand } from './scales/band';\nexport { default as scalePoint } from './scales/point';\nexport { default as scaleLinear } from './scales/linear';\nexport { default as scaleRadial } from './scales/radial';\nexport { default as scaleTime } from './scales/time';\nexport { default as scaleUtc } from './scales/utc';\nexport { default as scaleLog } from './scales/log';\nexport { default as scalePower } from './scales/power';\nexport { default as scaleOrdinal } from './scales/ordinal';\nexport { default as scaleQuantize } from './scales/quantize';\nexport { default as scaleQuantile } from './scales/quantile';\nexport { default as scaleSymlog } from './scales/symlog';\nexport { default as scaleThreshold } from './scales/threshold';\nexport { default as scaleSqrt } from './scales/squareRoot';\n\nexport { default as createScale } from './createScale';\nexport { default as updateScale } from './updateScale';\nexport { default as inferScaleType } from './utils/inferScaleType';\n\nexport { default as coerceNumber } from './utils/coerceNumber';\nexport { default as getTicks } from './utils/getTicks';\nexport { default as toString } from './utils/toString';\nexport { default as scaleCanBeZeroed } from './utils/scaleCanBeZeroed';\n\n// export types\nexport type * from './types/Base';\nexport type * from './types/Nice';\nexport type * from './types/Scale';\nexport type * from './types/ScaleConfig';\nexport type * from './types/ScaleInterpolate';\n"
  },
  {
    "path": "packages/visx-scale/src/operators/align.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyAlign<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('align' in scale && 'align' in config && typeof config.align !== 'undefined') {\n    scale.align(config.align);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/base.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyBase<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('base' in scale && 'base' in config && typeof config.base !== 'undefined') {\n    scale.base(config.base);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/clamp.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyClamp<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('clamp' in scale && 'clamp' in config && typeof config.clamp !== 'undefined') {\n    scale.clamp(config.clamp);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/constant.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyConstant<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('constant' in scale && 'constant' in config && typeof config.constant !== 'undefined') {\n    scale.constant(config.constant);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/domain.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyDomain<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if (config.domain) {\n    if ('nice' in scale || 'quantiles' in scale) {\n      // continuous input scales\n      scale.domain(config.domain as number[] | Date[]);\n    } else if ('padding' in scale) {\n      // point and band scales\n      scale.domain(config.domain as DiscreteInput[]);\n    } else {\n      // ordinal and threshold scale\n      scale.domain(config.domain as ThresholdInput[]);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/exponent.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyExponent<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('exponent' in scale && 'exponent' in config && typeof config.exponent !== 'undefined') {\n    scale.exponent(config.exponent);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/interpolate.ts",
    "content": "import type { InterpolatorFactory } from '@visx/vendor/d3-scale';\nimport type { StringLike } from '../types/Base';\nimport type { D3Scale, DefaultThresholdInput } from '../types/Scale';\nimport createColorInterpolator from '../utils/createColorInterpolator';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyInterpolate<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if (\n    'interpolate' in config &&\n    'interpolate' in scale &&\n    typeof config.interpolate !== 'undefined'\n  ) {\n    const interpolator = createColorInterpolator(config.interpolate);\n    scale.interpolate(interpolator as unknown as InterpolatorFactory<Output, Output>);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/nice.ts",
    "content": "import type { CountableTimeInterval } from '@visx/vendor/d3-time';\nimport {\n  timeSecond,\n  timeMinute,\n  timeHour,\n  timeDay,\n  timeYear,\n  timeMonth,\n  timeWeek,\n  utcSecond,\n  utcMinute,\n  utcHour,\n  utcDay,\n  utcWeek,\n  utcMonth,\n  utcYear,\n} from '@visx/vendor/d3-time';\nimport type { ScaleTime } from '@visx/vendor/d3-scale';\nimport type { StringLike } from '../types/Base';\nimport type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\nimport type { NiceTime } from '../types/Nice';\nimport isUtcScale from '../utils/isUtcScale';\n\nconst localTimeIntervals: {\n  [key in NiceTime]: CountableTimeInterval;\n} = {\n  day: timeDay,\n  hour: timeHour,\n  minute: timeMinute,\n  month: timeMonth,\n  second: timeSecond,\n  week: timeWeek,\n  year: timeYear,\n};\n\nconst utcIntervals: {\n  [key in NiceTime]: CountableTimeInterval;\n} = {\n  day: utcDay,\n  hour: utcHour,\n  minute: utcMinute,\n  month: utcMonth,\n  second: utcSecond,\n  week: utcWeek,\n  year: utcYear,\n};\n\nexport default function applyNice<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('nice' in config && typeof config.nice !== 'undefined' && 'nice' in scale) {\n    const { nice } = config;\n    if (typeof nice === 'boolean') {\n      if (nice) {\n        scale.nice();\n      }\n    } else if (typeof nice === 'number') {\n      scale.nice(nice);\n    } else {\n      const timeScale = scale as ScaleTime<Output, Output>;\n      const isUtc = isUtcScale(timeScale);\n      if (typeof nice === 'string') {\n        timeScale.nice(isUtc ? utcIntervals[nice] : localTimeIntervals[nice]);\n      } else {\n        const { interval, step } = nice;\n        const parsedInterval = (\n          isUtc ? utcIntervals[interval] : localTimeIntervals[interval]\n        ).every(step);\n        if (parsedInterval != null) {\n          timeScale.nice(parsedInterval as CountableTimeInterval);\n        }\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/padding.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyPadding<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('padding' in scale && 'padding' in config && typeof config.padding !== 'undefined') {\n    scale.padding(config.padding);\n  }\n  if (\n    'paddingInner' in scale &&\n    'paddingInner' in config &&\n    typeof config.paddingInner !== 'undefined'\n  ) {\n    scale.paddingInner(config.paddingInner);\n  }\n  if (\n    'paddingOuter' in scale &&\n    'paddingOuter' in config &&\n    typeof config.paddingOuter !== 'undefined'\n  ) {\n    scale.paddingOuter(config.paddingOuter);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/range.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyRange<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if (config.range) {\n    if ('padding' in scale) {\n      // point and band scales\n      scale.range(config.range as [number, number]);\n    } else {\n      // the rest\n      scale.range(config.range as Output[]);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/reverse.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyReverse<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if (config.reverse) {\n    const reversedRange = scale.range().slice().reverse();\n    if ('padding' in scale) {\n      // point and band scales\n      scale.range(reversedRange as [number, number]);\n    } else {\n      // the rest\n      scale.range(reversedRange as Output[]);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/round.ts",
    "content": "import { interpolateRound } from '@visx/vendor/d3-interpolate';\nimport type { InterpolatorFactory } from '@visx/vendor/d3-scale';\nimport type { StringLike } from '../types/Base';\nimport type { D3Scale, DefaultThresholdInput } from '../types/Scale';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyRound<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('round' in config && typeof config.round !== 'undefined') {\n    if (config.round && 'interpolate' in config && typeof config.interpolate !== 'undefined') {\n      console.warn(\n        `[visx/scale/applyRound] ignoring round: scale config contains round and interpolate. only applying interpolate. config:`,\n        config,\n      );\n    } else if ('round' in scale) {\n      // for point and band scales\n      scale.round(config.round);\n    } else if ('interpolate' in scale && config.round) {\n      // for continuous output scales\n      // setting config.round = true\n      // is actually setting interpolator to interpolateRound\n      // as these scales do not have scale.round() function\n      scale.interpolate(interpolateRound as unknown as InterpolatorFactory<Output, Output>);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/scaleOperator.ts",
    "content": "import type { DefaultThresholdInput, PickD3Scale } from '../types/Scale';\nimport type { ScaleType, PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport type { DefaultOutput, StringLike } from '../types/Base';\nimport domain from './domain';\nimport range from './range';\nimport align from './align';\nimport base from './base';\nimport clamp from './clamp';\nimport constant from './constant';\nimport exponent from './exponent';\nimport interpolate from './interpolate';\nimport nice from './nice';\nimport padding from './padding';\nimport reverse from './reverse';\nimport round from './round';\nimport unknown from './unknown';\nimport zero from './zero';\n\n/**\n * List of all operators, in order of execution\n */\nexport const ALL_OPERATORS = [\n  // domain => nice => zero\n  'domain',\n  'nice',\n  'zero',\n\n  // interpolate before round\n  'interpolate',\n  'round',\n\n  // set range then reverse\n  'range',\n  'reverse',\n\n  // Order does not matter for these operators\n  'align',\n  'base',\n  'clamp',\n  'constant',\n  'exponent',\n  'padding',\n  'unknown',\n] as const;\n\ntype OperatorType = (typeof ALL_OPERATORS)[number];\n\n// Use Record to enforce that all keys in OperatorType must exist.\nconst operators: Record<OperatorType, typeof domain> = {\n  domain,\n  nice,\n  zero,\n  interpolate,\n  round,\n  align,\n  base,\n  clamp,\n  constant,\n  exponent,\n  padding,\n  range,\n  reverse,\n  unknown,\n};\n\nexport default function scaleOperator<T extends ScaleType>(...ops: OperatorType[]) {\n  const selection = new Set(ops);\n  const selectedOps = ALL_OPERATORS.filter((o) => selection.has(o));\n\n  return function applyOperators<\n    Output = DefaultOutput,\n    DiscreteInput extends StringLike = StringLike,\n    ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n  >(\n    scale: PickD3Scale<T, Output, DiscreteInput, ThresholdInput>,\n    config?: PickScaleConfigWithoutType<T, Output, DiscreteInput, ThresholdInput>,\n  ) {\n    if (typeof config !== 'undefined') {\n      selectedOps.forEach((op) => {\n        operators[op]<Output, DiscreteInput, ThresholdInput>(scale, config);\n      });\n    }\n\n    return scale;\n  };\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/unknown.ts",
    "content": "import type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { StringLike } from '../types/Base';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyUnknown<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('unknown' in scale && 'unknown' in config && typeof config.unknown !== 'undefined') {\n    (scale.unknown as Function)(config.unknown);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/operators/zero.ts",
    "content": "import type { StringLike } from '../types/Base';\nimport type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { ScaleConfigWithoutType } from '../types/ScaleConfig';\n\nexport default function applyZero<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  if ('zero' in config && config.zero === true) {\n    const domain = scale.domain() as number[];\n    const [a, b] = domain;\n    const isDescending = b < a;\n    const [min, max] = isDescending ? [b, a] : [a, b];\n    const domainWithZero = [Math.min(0, min), Math.max(0, max)];\n    scale.domain(isDescending ? domainWithZero.reverse() : domainWithZero);\n  }\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/band.ts",
    "content": "import { scaleBand } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput, StringLike } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateBandScale = scaleOperator<'band'>(\n  'domain',\n  'range',\n  'reverse',\n  'align',\n  'padding',\n  'round',\n);\n\nexport default function createBandScale<DiscreteInput extends StringLike = StringLike>(\n  config?: PickScaleConfigWithoutType<'band', DefaultOutput, DiscreteInput>,\n) {\n  return updateBandScale(scaleBand<DiscreteInput>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/linear.ts",
    "content": "import { scaleLinear } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateLinearScale = scaleOperator<'linear'>(\n  'domain',\n  'range',\n  'reverse',\n  'clamp',\n  'interpolate',\n  'nice',\n  'round',\n  'zero',\n);\n\nexport default function createLinearScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'linear', Output>,\n) {\n  return updateLinearScale(scaleLinear<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/log.ts",
    "content": "import { scaleLog } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateLogScale = scaleOperator<'log'>(\n  'domain',\n  'range',\n  'reverse',\n  'base',\n  'clamp',\n  'interpolate',\n  'nice',\n  'round',\n);\n\nexport default function createLogScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'log', Output>,\n) {\n  return updateLogScale(scaleLog<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/ordinal.ts",
    "content": "import { scaleOrdinal } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput, StringLike } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateOrdinalScale = scaleOperator<'ordinal'>('domain', 'range', 'reverse', 'unknown');\n\nexport default function createOrdinalScale<\n  DiscreteInput extends StringLike = StringLike,\n  Output = DefaultOutput,\n>(config?: PickScaleConfigWithoutType<'ordinal', Output, DiscreteInput>) {\n  return updateOrdinalScale(scaleOrdinal<DiscreteInput, Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/point.ts",
    "content": "import { scalePoint } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput, StringLike } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updatePointScale = scaleOperator<'point'>(\n  'domain',\n  'range',\n  'reverse',\n  'align',\n  'padding',\n  'round',\n);\n\nexport default function createPointScale<DiscreteInput extends StringLike = StringLike>(\n  config?: PickScaleConfigWithoutType<'point', DefaultOutput, DiscreteInput>,\n) {\n  return updatePointScale(scalePoint<DiscreteInput>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/power.ts",
    "content": "import { scalePow } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updatePowScale = scaleOperator<'pow'>(\n  'domain',\n  'range',\n  'reverse',\n  'clamp',\n  'exponent',\n  'interpolate',\n  'nice',\n  'round',\n  'zero',\n);\n\nexport default function createPowScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'pow', Output>,\n) {\n  return updatePowScale(scalePow<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/quantile.ts",
    "content": "import { scaleQuantile } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateQuantileScale = scaleOperator<'quantile'>('domain', 'range', 'reverse');\n\nexport default function createQuantileScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'quantile', Output>,\n) {\n  return updateQuantileScale(scaleQuantile<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/quantize.ts",
    "content": "import { scaleQuantize } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateQuantizeScale = scaleOperator<'quantize'>(\n  'domain',\n  'range',\n  'reverse',\n  'nice',\n  'zero',\n);\n\nexport default function createQuantizeScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'quantize', Output>,\n) {\n  return updateQuantizeScale(scaleQuantize<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/radial.ts",
    "content": "import { scaleRadial } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateRadialScale = scaleOperator<'radial'>(\n  'domain',\n  'range',\n  'clamp',\n  'nice',\n  'round',\n  'unknown',\n);\n\nexport default function createRadialScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'radial', Output>,\n) {\n  return updateRadialScale(scaleRadial<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/squareRoot.ts",
    "content": "import { scaleSqrt } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateSqrtScale = scaleOperator<'sqrt'>(\n  'domain',\n  'range',\n  'reverse',\n  'clamp',\n  'interpolate',\n  'nice',\n  'round',\n  'zero',\n);\n\nexport default function createSqrtScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'sqrt', Output>,\n) {\n  return updateSqrtScale(scaleSqrt<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/symlog.ts",
    "content": "import { scaleSymlog } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateSymlogScale = scaleOperator<'symlog'>(\n  'domain',\n  'range',\n  'reverse',\n  'clamp',\n  'constant',\n  'nice',\n  'zero',\n  'round',\n);\n\nexport default function createSymlogScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'symlog', Output>,\n) {\n  return updateSymlogScale(scaleSymlog<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/threshold.ts",
    "content": "import { scaleThreshold } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput, StringLike } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport type { DefaultThresholdInput } from '../types/Scale';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateThresholdScale = scaleOperator<'threshold'>('domain', 'range', 'reverse');\n\nexport default function createThresholdScale<\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n  Output = DefaultOutput,\n>(config?: PickScaleConfigWithoutType<'threshold', Output, StringLike, ThresholdInput>) {\n  return updateThresholdScale(scaleThreshold<ThresholdInput, Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/time.ts",
    "content": "import { scaleTime } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateTimeScale = scaleOperator<'time'>(\n  'domain',\n  'range',\n  'reverse',\n  'clamp',\n  'interpolate',\n  'nice',\n  'round',\n);\n\nexport default function createTimeScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'time', Output>,\n) {\n  return updateTimeScale(scaleTime<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/scales/utc.ts",
    "content": "import { scaleUtc } from '@visx/vendor/d3-scale';\nimport type { DefaultOutput } from '../types/Base';\nimport type { PickScaleConfigWithoutType } from '../types/ScaleConfig';\nimport scaleOperator from '../operators/scaleOperator';\n\nexport const updateUtcScale = scaleOperator<'utc'>(\n  'domain',\n  'range',\n  'reverse',\n  'clamp',\n  'interpolate',\n  'nice',\n  'round',\n);\n\nexport default function createUtcScale<Output = DefaultOutput>(\n  config?: PickScaleConfigWithoutType<'utc', Output>,\n) {\n  return updateUtcScale(scaleUtc<Output>(), config);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/types/Base.ts",
    "content": "/** A value that has .valueOf() function */\nexport type NumberLike = { valueOf(): number };\n\n/** A value that has .toString() function */\nexport type StringLike = { toString(): string };\n\n/** Default output type */\nexport type DefaultOutput = number | string | boolean | null;\n\n/** Union types of all values from a map type */\nexport type ValueOf<T> = T[keyof T];\n\n/** Extract generic type from array */\nexport type Unarray<T> = T extends Array<infer U> ? U : T;\n"
  },
  {
    "path": "packages/visx-scale/src/types/BaseScaleConfig.ts",
    "content": "import type { Unarray } from './Base';\nimport type { ScaleInterpolate, ScaleInterpolateParams } from './ScaleInterpolate';\n\nexport interface BaseScaleConfig<T, D, R> {\n  type: T;\n\n  /**\n   * The domain of the scale.\n   */\n  domain?: D;\n\n  /**\n   * The range of the scale.\n   */\n  range?: R;\n\n  /**\n   * The alignment of the steps within the scale range.\n   *\n   * This value must lie in the range `[0,1]`. A value of `0.5` indicates that the steps should be centered within the range. A value of `0` or `1` may be used to shift the bands to one side, say to position them adjacent to an axis.\n   *\n   * __Default value:__ `0.5`\n   */\n  align?: number;\n\n  /**\n   * The logarithm base of the `log` scale (default `10`).\n   */\n  base?: number;\n\n  /**\n   * If `true`, values that exceed the data domain are clamped to either the minimum or maximum range value\n   *\n   * __Default value:__ `false`.\n   */\n  clamp?: boolean;\n\n  /**\n   * A constant determining the slope of the symlog function around zero. Only used for `symlog` scales.\n   *\n   * __Default value:__ `1`\n   */\n  constant?: number;\n\n  /**\n   * The exponent of the `pow` scale.\n   */\n  exponent?: number;\n\n  /**\n   * The interpolation method for range values.\n   * By default, a general interpolator for numbers, dates, strings and colors (in HCL space) is used.\n   * For color ranges, this property allows interpolation in alternative color spaces. Legal values include `rgb`, `hsl`, `hsl-long`, `lab`, `hcl`, `hcl-long`, `cubehelix` and `cubehelix-long` ('-long' variants use longer paths in polar coordinate spaces). If object-valued, this property accepts an object with a string-valued _type_ property and an optional numeric _gamma_ property applicable to rgb and cubehelix interpolators. For more, see the [d3-interpolate documentation](https://github.com/d3/d3-interpolate).\n   *\n   */\n  interpolate?: ScaleInterpolate | ScaleInterpolateParams;\n\n  /**\n   * Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n   *\n   * For quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n   *\n   * __Default value:__ `true` for _quantitative_ fields; `false` otherwise.\n   *\n   */\n  nice?: boolean | number;\n\n  /**\n   * For band scale, shortcut for setting `paddingInner` and `paddingOuter` to the same value.\n   *\n   * For point scale, the outer padding (spacing) at the ends of the range.\n   * This is similar to band scale's `paddingOuter`.\n   *\n   * @minimum 0\n   */\n  padding?: number;\n\n  /**\n   * The inner padding (spacing) within each band step of band scales, as a fraction of the step size. This value must lie in the range [0,1].\n   *\n   * @minimum 0\n   * @maximum 1\n   */\n  paddingInner?: number;\n\n  /**\n   * The outer padding (spacing) at the ends of the range of band and point scales,\n   * as a fraction of the step size. This value must lie in the range [0,1].\n   *\n   * @minimum 0\n   * @maximum 1\n   */\n  paddingOuter?: number;\n\n  /**\n   * If true, reverses the order of the scale range.\n   * __Default value:__ `false`.\n   *\n   * @hidden\n   */\n  reverse?: boolean;\n\n  /**\n   * If `true`, rounds numeric output values to integers. This can be helpful for snapping to the pixel grid.\n   *\n   * __Default value:__ `false`.\n   */\n  round?: boolean;\n\n  /**\n   * Sets the output value of the scale for unknown input values.\n   */\n  unknown?: Unarray<R> | { name: 'implicit' };\n\n  /**\n   * If `true`, ensures that a zero baseline value is included in the scale domain.\n   *\n   * __Default value:__ `false`\n   *\n   * __Note:__ Log, time, and utc scales do not support `zero`.\n   */\n  zero?: boolean;\n}\n"
  },
  {
    "path": "packages/visx-scale/src/types/Nice.ts",
    "content": "export type NiceTime = 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'year';\n"
  },
  {
    "path": "packages/visx-scale/src/types/Scale.ts",
    "content": "import type {\n  ScaleOrdinal,\n  ScaleLinear,\n  ScaleLogarithmic,\n  ScalePower,\n  ScaleRadial,\n  ScaleTime,\n  ScaleQuantile,\n  ScaleQuantize,\n  ScaleThreshold,\n  ScalePoint,\n  ScaleBand,\n  ScaleSymLog,\n} from '@visx/vendor/d3-scale';\nimport type { StringLike, DefaultOutput, ValueOf } from './Base';\n\nexport type DefaultThresholdInput = number | string | Date;\n\n/**\n * Map scale type to D3Scale type\n * @type `Output`: Output type of all scales except point and band\n * @type `ThresholdInput`: Input type for threshold scale\n * @type `DiscreteInput`: Input type for ordinal, point and band scales\n */\nexport interface ScaleTypeToD3Scale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> {\n  // Input of these continuous scales are `number | { valueOf(): number }`\n  // and cannot be customized via generic type.\n  linear: ScaleLinear<Output, Output>;\n  log: ScaleLogarithmic<Output, Output>;\n  pow: ScalePower<Output, Output>;\n  sqrt: ScalePower<Output, Output>;\n  symlog: ScaleSymLog<Output, Output>;\n  radial: ScaleRadial<Output, Output>;\n  // Input of time scales are `Date | number | { valueOf(): number }`\n  // and cannot be customized via generic type.\n  time: ScaleTime<Output, Output>;\n  utc: ScaleTime<Output, Output>;\n  // Input of these discretizing scales are `number | { valueOf(): number }`\n  // and cannot be customized via generic type.\n  quantile: ScaleQuantile<Output>;\n  quantize: ScaleQuantize<Output>;\n  // Threshold scale has its own Input generic type.\n  threshold: ScaleThreshold<ThresholdInput, Output>;\n  // Ordinal scale can customize both Input and Output types.\n  ordinal: ScaleOrdinal<DiscreteInput, Output>;\n  // Output of these two scales are always number while Input can be customized.\n  point: ScalePoint<DiscreteInput>;\n  band: ScaleBand<DiscreteInput>;\n}\n\nexport type PickD3Scale<\n  T extends keyof ScaleTypeToD3Scale<Output, DiscreteInput, DefaultThresholdInput>,\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> = ValueOf<Pick<ScaleTypeToD3Scale<Output, DiscreteInput, ThresholdInput>, T>>;\n\nexport type D3Scale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> = ValueOf<ScaleTypeToD3Scale<Output, DiscreteInput, ThresholdInput>>;\n\n/**\n * A catch-all type for all D3 scales.\n *\n * Use this instead of `D3Scale`\n * unless other generic types (`Output`, `DiscreteInput` and `ThresholdInput`)\n * are also included and passed to `D3Scale`.\n * Otherwise it may not match some scales (band, point, threshold) correctly and cause TS errors.\n *\n * Example error messages:\n * * \"Type 'StringLike' is not assignable to type 'string'\"\n * * \"Type 'number' is not assignable to type 'DefaultThresholdInput'\"\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyD3Scale = D3Scale<any, any, any>;\n\nexport type InferD3ScaleOutput<Scale extends AnyD3Scale> =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  Scale extends D3Scale<infer X, any, any> ? X : DefaultOutput;\n\nexport type InferD3ScaleDiscreteInput<Scale extends AnyD3Scale> =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  Scale extends D3Scale<any, infer X, any> ? X : StringLike;\n\nexport type InferD3ScaleThresholdInput<Scale extends AnyD3Scale> =\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  Scale extends D3Scale<any, any, infer X> ? X : DefaultThresholdInput;\n\n/** Get type of scale input from D3 scale */\nexport type ScaleInput<Scale extends AnyD3Scale> = Parameters<Scale>[0];\n"
  },
  {
    "path": "packages/visx-scale/src/types/ScaleConfig.ts",
    "content": "import type { BaseScaleConfig } from './BaseScaleConfig';\nimport type { StringLike, DefaultOutput, ValueOf, NumberLike } from './Base';\nimport type { NiceTime } from './Nice';\nimport type { DefaultThresholdInput, ScaleTypeToD3Scale } from './Scale';\n\ntype Numeric = number | NumberLike;\n\nexport type TimeInput = number | Date;\nexport type ContinuousInput = number | Date;\n\nexport type TimeDomain = TimeInput[];\nexport type ContinuousDomain = ContinuousInput[];\n\n// Make the specific scales pick\n// from same base type to share property documentation\n// (which is useful for auto-complete/intellisense)\n// and add `type` property as discriminant of union type.\ntype CreateScaleConfig<T, D, R, Fields extends keyof BaseScaleConfig<T, D, R> = 'type'> = Pick<\n  BaseScaleConfig<T, D, R>,\n  'type' | 'domain' | 'range' | 'reverse' | Fields\n>;\n\nexport type LinearScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'linear',\n  ContinuousDomain,\n  Output[],\n  'clamp' | 'interpolate' | 'nice' | 'round' | 'zero'\n>;\n\nexport type LogScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'log',\n  ContinuousDomain,\n  Output[],\n  'base' | 'clamp' | 'interpolate' | 'nice' | 'round'\n>;\n\nexport type PowScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'pow',\n  ContinuousDomain,\n  Output[],\n  'clamp' | 'exponent' | 'interpolate' | 'nice' | 'round' | 'zero'\n>;\n\nexport type SqrtScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'sqrt',\n  ContinuousDomain,\n  Output[],\n  'clamp' | 'interpolate' | 'nice' | 'round' | 'zero'\n>;\n\nexport type SymlogScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'symlog',\n  ContinuousDomain,\n  Output[],\n  'clamp' | 'constant' | 'nice' | 'round' | 'zero'\n>;\n\nexport type RadialScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'radial',\n  ContinuousDomain,\n  Output[],\n  'clamp' | 'nice' | 'round' | 'unknown'\n>;\n\nexport type QuantileScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'quantile',\n  ContinuousDomain,\n  Output[]\n>;\n\nexport type QuantizeScaleConfig<Output = DefaultOutput> = CreateScaleConfig<\n  'quantize',\n  [ContinuousInput, ContinuousInput],\n  Output[],\n  'nice' | 'zero'\n>;\n\nexport type ThresholdScaleConfig<\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n  Output = DefaultOutput,\n> = CreateScaleConfig<'threshold', ThresholdInput[], Output[]>;\n\nexport type OrdinalScaleConfig<\n  DiscreteInput extends StringLike = StringLike,\n  Output = DefaultOutput,\n> = CreateScaleConfig<'ordinal', DiscreteInput[], Output[], 'unknown'>;\n\nexport type PointScaleConfig<DiscreteInput extends StringLike = StringLike> = CreateScaleConfig<\n  'point',\n  DiscreteInput[],\n  [Numeric, Numeric],\n  'align' | 'padding' | 'round'\n>;\n\nexport type BandScaleConfig<DiscreteInput extends StringLike = StringLike> = CreateScaleConfig<\n  'band',\n  DiscreteInput[],\n  [Numeric, Numeric],\n  'align' | 'padding' | 'paddingInner' | 'paddingOuter' | 'round'\n>;\n\ninterface TemporalScaleConfig<T, Output = DefaultOutput>\n  extends CreateScaleConfig<T, TimeDomain, Output[], 'clamp' | 'interpolate' | 'round'> {\n  /**\n   * Extending the domain so that it starts and ends on nice round values. This method typically modifies the scale’s domain, and may only extend the bounds to the nearest round value. Nicing is useful if the domain is computed from data and may be irregular. For example, for a domain of _[0.201479…, 0.996679…]_, a nice domain might be _[0.2, 1.0]_.\n   *\n   * For quantitative scales such as linear, `nice` can be either a boolean flag or a number. If `nice` is a number, it will represent a desired tick count. This allows greater control over the step size used to extend the bounds, guaranteeing that the returned ticks will exactly cover the domain.\n   *\n   * For temporal fields with time and utc scales, the `nice` value can be a string indicating the desired time interval. Legal values are `\"millisecond\"`, `\"second\"`, `\"minute\"`, `\"hour\"`, `\"day\"`, `\"week\"`, `\"month\"`, and `\"year\"`. Alternatively, `time` and `utc` scales can accept an object-valued interval specifier of the form `{\"interval\": \"month\", \"step\": 3}`, which includes a desired number of interval steps. Here, the domain would snap to quarter (Jan, Apr, Jul, Oct) boundaries.\n   *\n   * __Default value:__ `true` for unbinned _quantitative_ fields; `false` otherwise.\n   *\n   */\n  nice?: boolean | number | NiceTime | { interval: NiceTime; step: number };\n}\n\nexport type TimeScaleConfig<Output = DefaultOutput> = TemporalScaleConfig<'time', Output>;\n\nexport type UtcScaleConfig<Output = DefaultOutput> = TemporalScaleConfig<'utc', Output>;\n\n/**\n * Map scale type to D3Scale type\n * @type `Output`: Output type of all scales except point and band\n * @type `ThresholdInput`: Input type for threshold scale\n * @type `DiscreteInput`: Input type for ordinal, point and band scales\n */\nexport interface ScaleTypeToScaleConfig<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> {\n  linear: LinearScaleConfig<Output>;\n  log: LogScaleConfig<Output>;\n  pow: PowScaleConfig<Output>;\n  sqrt: SqrtScaleConfig<Output>;\n  symlog: SymlogScaleConfig<Output>;\n  radial: RadialScaleConfig<Output>;\n  time: TimeScaleConfig<Output>;\n  utc: UtcScaleConfig<Output>;\n  quantile: QuantileScaleConfig<Output>;\n  quantize: QuantizeScaleConfig<Output>;\n  threshold: ThresholdScaleConfig<ThresholdInput, Output>;\n  ordinal: OrdinalScaleConfig<DiscreteInput, Output>;\n  point: PointScaleConfig<DiscreteInput>;\n  band: BandScaleConfig<DiscreteInput>;\n}\n\n/** All scale types */\nexport type ScaleType = keyof ScaleTypeToScaleConfig;\n\n/** Scales that take time as domains */\nexport type TimeScaleType = 'time' | 'utc';\n\n/** Scales that take continuous domains and return continuous ranges */\nexport type ContinuousScaleType =\n  | 'linear'\n  | 'log'\n  | 'pow'\n  | 'sqrt'\n  | 'symlog'\n  | 'radial'\n  | TimeScaleType;\n/** Scales that convert continuous domains to discrete ranges */\nexport type DiscretizingScaleType = 'quantile' | 'quantize' | 'threshold';\n/** Scales that take discrete domains and return discrete ranges */\nexport type DiscreteScaleType = 'ordinal' | 'point' | 'band';\n\n/** Scales that take continuous domains */\nexport type ContinuousDomainScaleType = ContinuousScaleType | DiscretizingScaleType;\n\nexport type PickScaleConfig<\n  T extends ScaleType,\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> = ValueOf<Pick<ScaleTypeToScaleConfig<Output, DiscreteInput, ThresholdInput>, T>>;\n\ntype OmitType<T> = {\n  [key in keyof T]: Omit<T[key], 'type'>;\n};\n\nexport type PickScaleConfigWithoutType<\n  T extends ScaleType,\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> = ValueOf<Pick<OmitType<ScaleTypeToScaleConfig<Output, DiscreteInput, ThresholdInput>>, T>>;\n\nexport type ScaleConfig<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> = ValueOf<ScaleTypeToScaleConfig<Output, DiscreteInput, ThresholdInput>>;\n\nexport type ScaleConfigWithoutType<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> = PickScaleConfigWithoutType<ScaleType, Output, DiscreteInput, ThresholdInput>;\n\nexport type ScaleConfigToD3Scale<\n  Config extends ScaleConfig<Output, DiscreteInput, ThresholdInput>,\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n> = ScaleTypeToD3Scale<Output, DiscreteInput, ThresholdInput>[Config['type']];\n"
  },
  {
    "path": "packages/visx-scale/src/types/ScaleInterpolate.ts",
    "content": "export type ScaleInterpolate =\n  | 'rgb'\n  | 'lab'\n  | 'hcl'\n  | 'hsl'\n  | 'hsl-long'\n  | 'hcl-long'\n  | 'cubehelix'\n  | 'cubehelix-long';\n\nexport interface ScaleInterpolateParams {\n  type: 'rgb' | 'cubehelix' | 'cubehelix-long';\n  gamma?: number;\n}\n"
  },
  {
    "path": "packages/visx-scale/src/updateScale.ts",
    "content": "/* eslint-disable no-redeclare */\n/* eslint-disable @typescript-eslint/no-unused-vars */\nimport type { PickScaleConfigWithoutType, ScaleConfigWithoutType } from './types/ScaleConfig';\nimport type { DefaultThresholdInput, D3Scale, PickD3Scale } from './types/Scale';\nimport type { StringLike, DefaultOutput } from './types/Base';\nimport scaleOperator, { ALL_OPERATORS } from './operators/scaleOperator';\n\nconst applyAllOperators = scaleOperator(...ALL_OPERATORS);\n\n// Overload function signature for more strict typing, e.g.,\n// If the scale is a ScaleLinear, the config is a linear config.\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'linear', Output>,\n  config: PickScaleConfigWithoutType<'linear', Output>,\n): PickD3Scale<'linear', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'log', Output>,\n  config: PickScaleConfigWithoutType<'log', Output>,\n): PickD3Scale<'log', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'pow', Output>,\n  config: PickScaleConfigWithoutType<'pow', Output>,\n): PickD3Scale<'pow', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'sqrt', Output>,\n  config: PickScaleConfigWithoutType<'sqrt', Output>,\n): PickD3Scale<'sqrt', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'symlog', Output>,\n  config: PickScaleConfigWithoutType<'symlog', Output>,\n): PickD3Scale<'symlog', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'time', Output>,\n  config: PickScaleConfigWithoutType<'time', Output>,\n): PickD3Scale<'time', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'utc', Output>,\n  config: PickScaleConfigWithoutType<'utc', Output>,\n): PickD3Scale<'utc', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'quantile', Output>,\n  config: PickScaleConfigWithoutType<'quantile', Output>,\n): PickD3Scale<'quantile', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'quantize', Output>,\n  config: PickScaleConfigWithoutType<'quantize', Output>,\n): PickD3Scale<'quantize', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'threshold', Output, StringLike, ThresholdInput>,\n  config: PickScaleConfigWithoutType<'threshold', Output, StringLike, ThresholdInput>,\n): PickD3Scale<'threshold', Output, StringLike, ThresholdInput>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'ordinal', Output, DiscreteInput>,\n  config: PickScaleConfigWithoutType<'ordinal', Output, DiscreteInput>,\n): PickD3Scale<'ordinal', Output, DiscreteInput>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'point', Output, DiscreteInput>,\n  config: PickScaleConfigWithoutType<'point', Output, DiscreteInput>,\n): PickD3Scale<'point', Output, DiscreteInput>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'band', Output, DiscreteInput>,\n  config: PickScaleConfigWithoutType<'band', Output, DiscreteInput>,\n): PickD3Scale<'band', Output, DiscreteInput>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n>(\n  scale: PickD3Scale<'radial', Output>,\n  config: PickScaleConfigWithoutType<'radial', Output>,\n): PickD3Scale<'radial', Output>;\n\nfunction updateScale<\n  Output = DefaultOutput,\n  DiscreteInput extends StringLike = StringLike,\n  ThresholdInput extends DefaultThresholdInput = DefaultThresholdInput,\n  Scale extends D3Scale<Output, DiscreteInput, ThresholdInput> = D3Scale<\n    Output,\n    DiscreteInput,\n    ThresholdInput\n  >,\n>(scale: Scale, config?: undefined): Scale;\n\n// Actual implementation\n\nfunction updateScale<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(\n  scale: D3Scale<Output, DiscreteInput, ThresholdInput>,\n  config?: ScaleConfigWithoutType<Output, DiscreteInput, ThresholdInput>,\n) {\n  return applyAllOperators(scale.copy(), config);\n}\n\nexport default updateScale;\n"
  },
  {
    "path": "packages/visx-scale/src/utils/coerceNumber.ts",
    "content": "import type { NumberLike } from '../types/Base';\n\nexport default function coerceNumber<T>(val: T | NumberLike): T | number {\n  if ((typeof val === 'function' || (typeof val === 'object' && !!val)) && 'valueOf' in val) {\n    const num = val.valueOf();\n    if (typeof num === 'number') return num;\n  }\n\n  return val as T;\n}\n"
  },
  {
    "path": "packages/visx-scale/src/utils/createColorInterpolator.ts",
    "content": "import {\n  interpolateRgb,\n  interpolateLab,\n  interpolateHcl,\n  interpolateHclLong,\n  interpolateHsl,\n  interpolateHslLong,\n  interpolateCubehelix,\n  interpolateCubehelixLong,\n} from '@visx/vendor/d3-interpolate';\nimport type { ScaleInterpolateParams, ScaleInterpolate } from '../types/ScaleInterpolate';\n\nconst interpolatorMap = {\n  lab: interpolateLab,\n  hcl: interpolateHcl,\n  'hcl-long': interpolateHclLong,\n  hsl: interpolateHsl,\n  'hsl-long': interpolateHslLong,\n  cubehelix: interpolateCubehelix,\n  'cubehelix-long': interpolateCubehelixLong,\n  rgb: interpolateRgb,\n} as const;\n\nexport default function createColorInterpolator(\n  interpolate: ScaleInterpolate | ScaleInterpolateParams,\n) {\n  switch (interpolate) {\n    case 'lab':\n    case 'hcl':\n    case 'hcl-long':\n    case 'hsl':\n    case 'hsl-long':\n    case 'cubehelix':\n    case 'cubehelix-long':\n    case 'rgb':\n      return interpolatorMap[interpolate];\n    default:\n  }\n\n  const { type, gamma } = interpolate;\n  const interpolator = interpolatorMap[type];\n  return typeof gamma === 'undefined' ? interpolator : interpolator.gamma(gamma);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/utils/getTicks.ts",
    "content": "import type { AnyD3Scale, ScaleInput } from '../types/Scale';\n\nexport default function getTicks<Scale extends AnyD3Scale>(\n  scale: Scale,\n  numTicks?: number,\n): ScaleInput<Scale>[] {\n  // Because `Scale` is generic type which maybe a subset of AnyD3Scale\n  // that may not have `ticks` field,\n  // TypeScript will not let us do the `'ticks' in scale` check directly.\n  // Have to manually cast and expand type first.\n  const s = scale as AnyD3Scale;\n\n  if ('ticks' in s) {\n    return s.ticks(numTicks);\n  }\n\n  return s\n    .domain()\n    .filter(\n      (_, index, arr) =>\n        numTicks == null ||\n        arr.length <= numTicks ||\n        index % Math.round((arr.length - 1) / numTicks) === 0,\n    );\n}\n"
  },
  {
    "path": "packages/visx-scale/src/utils/inferScaleType.ts",
    "content": "import type { ScaleTime } from '@visx/vendor/d3-scale';\nimport type { StringLike } from '../types/Base';\nimport type { DefaultThresholdInput, D3Scale } from '../types/Scale';\nimport type { ScaleType } from '../types/ScaleConfig';\nimport isUtcScale from './isUtcScale';\n\nexport default function inferScaleType<\n  Output,\n  DiscreteInput extends StringLike,\n  ThresholdInput extends DefaultThresholdInput,\n>(scale: D3Scale<Output, DiscreteInput, ThresholdInput>): ScaleType {\n  // Try a sequence of typeguards to figure out the scale type\n\n  if ('paddingInner' in scale) {\n    return 'band';\n  }\n\n  if ('padding' in scale) {\n    return 'point';\n  }\n\n  if ('quantiles' in scale) {\n    return 'quantile';\n  }\n\n  if ('base' in scale) {\n    return 'log';\n  }\n\n  if ('exponent' in scale) {\n    return scale.exponent() === 0.5 ? 'sqrt' : 'pow';\n  }\n\n  if ('constant' in scale) {\n    return 'symlog';\n  }\n\n  if ('clamp' in scale) {\n    // Radial scales don't have interpolate method (unlike linear/time/utc)\n    if (!('interpolate' in scale)) {\n      return 'radial';\n    }\n    // Linear, Time or Utc scales\n    const ticks = (scale as any).ticks?.();\n    if (ticks?.[0] instanceof Date) {\n      return isUtcScale(scale as ScaleTime<Output, Output>) ? 'utc' : 'time';\n    }\n    return 'linear';\n  }\n\n  if ('nice' in scale) {\n    return 'quantize';\n  }\n\n  if ('invertExtent' in scale) {\n    return 'threshold';\n  }\n\n  return 'ordinal';\n}\n"
  },
  {
    "path": "packages/visx-scale/src/utils/isUtcScale.ts",
    "content": "import type { ScaleTime } from '@visx/vendor/d3-scale';\n\nconst TEST_TIME = new Date(Date.UTC(2020, 1, 2, 3, 4, 5));\nconst TEST_FORMAT = '%Y-%m-%d %H:%M';\n\n/**\n * Check if the scale is UTC or Time scale\n * When local time is equal to UTC, always return true\n * @param scale time or utc scale\n */\nexport default function isUtcScale<Output>(scale: ScaleTime<Output, Output>) {\n  // The only difference between time and utc scale is\n  // whether the tick format function is utcFormat or timeFormat\n  const output = scale.tickFormat(1, TEST_FORMAT)(TEST_TIME);\n  return output === '2020-02-02 03:04';\n}\n"
  },
  {
    "path": "packages/visx-scale/src/utils/scaleCanBeZeroed.ts",
    "content": "import type { DefaultOutput } from '../types/Base';\nimport type {\n  LinearScaleConfig,\n  PowScaleConfig,\n  QuantizeScaleConfig,\n  ScaleConfig,\n  ScaleType,\n  SqrtScaleConfig,\n  SymlogScaleConfig,\n} from '../types/ScaleConfig';\n\ntype ZeroableScaleConfigs<Output = DefaultOutput> =\n  | LinearScaleConfig<Output>\n  | PowScaleConfig<Output>\n  | SqrtScaleConfig<Output>\n  | SymlogScaleConfig<Output>\n  | QuantizeScaleConfig<Output>;\n\nconst zeroableScaleTypes = new Set<ScaleType>(['linear', 'pow', 'quantize', 'sqrt', 'symlog']);\n\nexport default function scaleCanBeZeroed<Output = DefaultOutput>(\n  scaleConfig: ScaleConfig<Output>,\n): scaleConfig is ZeroableScaleConfigs<Output> {\n  return zeroableScaleTypes.has(scaleConfig.type);\n}\n"
  },
  {
    "path": "packages/visx-scale/src/utils/toString.ts",
    "content": "import type { StringLike } from '../types/Base';\n\nexport default function toString<T extends StringLike>(x?: T) {\n  return x?.toString();\n}\n"
  },
  {
    "path": "packages/visx-scale/test/createScale.test.ts",
    "content": "import { createScale } from '../src';\n\ndescribe('createScale()', () => {\n  it('linear', () => {\n    const scale = createScale({ type: 'linear', domain: [0, 10], range: [2, 4] });\n    expect(scale(5)).toBe(3);\n  });\n  it('fallbacks to linear if type is not defined', () => {\n    const scale = createScale({ domain: [0, 10], range: [2, 4] });\n    expect(scale(5)).toBe(3);\n  });\n  it('log', () => {\n    const scale = createScale({\n      type: 'log',\n      base: 2,\n      domain: [2, 8],\n      range: [1, 3],\n    });\n    expect(scale(4)?.toFixed(2)).toBe('2.00');\n  });\n  it('pow', () => {\n    const scale = createScale({ type: 'pow', exponent: 2, domain: [1, 3], range: [2, 18] });\n    expect(scale(2)).toBe(8);\n  });\n  it('sqrt', () => {\n    const scale = createScale({ type: 'sqrt', domain: [1, 9], range: [1, 3] });\n    expect(scale(4)).toBe(2);\n  });\n  it('symlog', () => {\n    const scale = createScale({ type: 'symlog', domain: [1, 9], range: [1, 3], constant: 2 });\n    expect(scale(4)?.toFixed(2)).toBe('2.07');\n  });\n  it('time', () => {\n    const scale = createScale({\n      type: 'time',\n      domain: [new Date(2020, 0, 1), new Date(2020, 0, 10)],\n      range: [1, 10],\n    });\n    expect(scale(new Date(2020, 0, 4))).toBe(4);\n  });\n  it('utc', () => {\n    const scale = createScale({\n      type: 'utc',\n      domain: [new Date(Date.UTC(2020, 0, 1)), new Date(Date.UTC(2020, 0, 10))],\n      range: [1, 10],\n    });\n    expect(scale(new Date(Date.UTC(2020, 0, 4)))).toBe(4);\n  });\n  it('quantile', () => {\n    const scale = createScale({ type: 'quantile', domain: [1, 3, 5, 7], range: [0, 10] });\n    expect(scale(2)).toBe(0);\n  });\n  it('quantize', () => {\n    const scale = createScale({ type: 'quantize', domain: [1, 10], range: ['red', 'green'] });\n    expect(scale(2)).toBe('red');\n    expect(scale(6)).toBe('green');\n  });\n  it('threshold', () => {\n    const scale = createScale({\n      type: 'threshold',\n      domain: [0, 1] as number[],\n      range: ['red', 'white', 'green'],\n    });\n    expect(scale(-1)).toBe('red');\n    expect(scale(0)).toBe('white');\n    expect(scale(0.5)).toBe('white');\n    expect(scale(1)).toBe('green');\n    expect(scale(1000)).toBe('green');\n  });\n  it('ordinal', () => {\n    const scale = createScale({ type: 'ordinal', domain: ['pig', 'cat'], range: ['red', 'green'] });\n    expect(scale('pig')).toBe('red');\n    expect(scale('cat')).toBe('green');\n  });\n  it('point', () => {\n    const scale = createScale({\n      type: 'point',\n      domain: ['a', 'b', 'c'],\n      range: [1.1, 3.5],\n      round: true,\n    });\n    expect(scale('a')).toBe(1);\n    expect(scale('b')).toBe(2);\n    expect(scale('c')).toBe(3);\n  });\n  it('band', () => {\n    const scale = createScale({\n      type: 'band',\n      domain: ['a', 'b', 'c'],\n      range: [1.1, 3.5],\n      round: false,\n    });\n    expect(scale('a')).toBe(1.1);\n    expect(scale('b')).toBe(1.9);\n    expect(scale('c')).toBe(2.7);\n  });\n  it('radial', () => {\n    const scale = createScale({\n      type: 'radial',\n      domain: [0, 100],\n      range: [0, Math.PI],\n    });\n    expect(scale(50)).toBeCloseTo(Math.PI / Math.sqrt(2));\n  });\n  it('invalid type', () => {\n    // @ts-expect-error\n    expect(createScale({ type: 'invalid' })).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleBand.test.ts",
    "content": "import { scaleBand } from '../src';\n\ndescribe('scaleBand', () => {\n  it('should be defined', () => {\n    expect(scaleBand).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [0, 350];\n    const scale = scaleBand({ domain });\n    expect(scale.domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const scale = scaleBand({ range: [2, 3] });\n    expect(scale.range()).toEqual([2, 3]);\n  });\n  it('set align', () => {\n    expect(scaleBand({ align: 0.5 }).align()).toBe(0.5);\n  });\n  it('set padding', () => {\n    expect(scaleBand({ padding: 0.3 }).padding()).toBe(0.3);\n  });\n  it('set paddingInner', () => {\n    expect(scaleBand({ paddingInner: 0.7 }).paddingInner()).toBe(0.7);\n  });\n  it('set paddingOuter', () => {\n    expect(scaleBand({ paddingOuter: 0.7 }).paddingOuter()).toBe(0.7);\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scaleBand({ domain: ['a', 'b', 'c'], range: [1.1, 3.5], round: true });\n      expect(scale('a')).toBe(2);\n      expect(scale('b')).toBe(2);\n      expect(scale('c')).toBe(2);\n    });\n    it('false', () => {\n      const scale = scaleBand({ domain: ['a', 'b', 'c'], range: [1.1, 3.5], round: false });\n      expect(scale('a')).toBe(1.1);\n      expect(scale('b')).toBe(1.9);\n      expect(scale('c')).toBe(2.7);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleLinear.test.ts",
    "content": "import { vi } from 'vitest';\nimport { scaleLinear } from '../src';\n\ndescribe('scaleLinear()', () => {\n  it('should be defined', () => {\n    expect(scaleLinear).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [1, 2];\n    expect(scaleLinear({ domain: [1, 2] }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleLinear({ range: [1, 2] }).range()).toEqual(range);\n  });\n  it('set reverse', () => {\n    expect(scaleLinear({ reverse: true }).range()).toEqual([1, 0]);\n    expect(scaleLinear({ range: [1, 2], reverse: true }).range()).toEqual([2, 1]);\n  });\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scaleLinear({ clamp: true });\n      expect(scale(10)).toBe(1);\n    });\n    it('false', () => {\n      const scale = scaleLinear({ clamp: false });\n      expect(scale(10)).toBe(10);\n    });\n  });\n  describe('set (color) interpolate', () => {\n    it('string', () => {\n      const scale = scaleLinear({\n        domain: [0, 10],\n        range: ['#ff0000', '#000000'],\n        interpolate: 'lab',\n      });\n      expect(scale(5)).toBe('rgb(122, 27, 11)');\n    });\n    it('config object', () => {\n      const scale = scaleLinear({\n        domain: [0, 10],\n        range: ['#ff0000', '#000000'],\n        interpolate: {\n          type: 'rgb',\n        },\n      });\n      expect(scale(5)).toBe('rgb(128, 0, 0)');\n    });\n    it('config object with gamma', () => {\n      const scale = scaleLinear({\n        domain: [0, 10],\n        range: ['#ff0000', '#000000'],\n        interpolate: {\n          type: 'rgb',\n          gamma: 0.9,\n        },\n      });\n      expect(scale(5)).toBe('rgb(118, 0, 0)');\n    });\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleLinear({ domain: [0.1, 0.91], nice: true });\n      expect(scale.domain()).toEqual([0.1, 1]);\n    });\n    it('false', () => {\n      const scale = scaleLinear({ domain: [0.1, 0.91], nice: false });\n      expect(scale.domain()).toEqual([0.1, 0.91]);\n    });\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scaleLinear({ domain: [0, 10], range: [0, 10], round: true });\n      expect(scale(2.2)).toBe(2);\n      expect(scale(2.6)).toBe(3);\n    });\n    it('false', () => {\n      const scale = scaleLinear({ domain: [0, 10], range: [0, 10], round: false });\n      expect(scale(2.2)).toBe(2.2);\n      expect(scale(2.6)).toBe(2.6);\n    });\n    it('warns if do both interpolate and round', () => {\n      const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n      scaleLinear({\n        domain: [0, 10],\n        range: [0, 10],\n        interpolate: 'hsl',\n        round: true,\n      });\n      expect(warnSpy).toHaveBeenCalledTimes(1);\n      warnSpy.mockRestore();\n    });\n  });\n  describe('set zero', () => {\n    it('true', () => {\n      expect(scaleLinear({ domain: [1, 2], zero: true }).domain()).toEqual([0, 2]);\n      expect(scaleLinear({ domain: [-2, -1], zero: true }).domain()).toEqual([-2, 0]);\n      expect(scaleLinear({ domain: [1, -2], zero: true }).domain()).toEqual([1, -2]);\n      expect(scaleLinear({ domain: [-2, 3], zero: true }).domain()).toEqual([-2, 3]);\n    });\n    it('false', () => {\n      expect(scaleLinear({ domain: [1, 2], zero: false }).domain()).toEqual([1, 2]);\n      expect(scaleLinear({ domain: [-2, -1], zero: false }).domain()).toEqual([-2, -1]);\n      expect(scaleLinear({ domain: [-2, 3], zero: false }).domain()).toEqual([-2, 3]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleLog.test.ts",
    "content": "import { scaleLog } from '../src';\n\ndescribe('scaleLog()', () => {\n  it('should be defined', () => {\n    expect(scaleLog).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [1, 2];\n    expect(scaleLog({ domain: [1, 2] }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleLog({ range: [1, 2] }).range()).toEqual(range);\n  });\n  it('set base', () => {\n    expect(scaleLog({ base: 2 }).base()).toBe(2);\n  });\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scaleLog({ range: [1, 2], clamp: true });\n      expect(scale(100)).toBe(2);\n    });\n    it('false', () => {\n      const scale = scaleLog({ range: [1, 2], clamp: false });\n      expect(scale(100)).toBe(3);\n    });\n  });\n  it('set (color) interpolate', () => {\n    const scale = scaleLog({\n      domain: [1, 100],\n      range: ['#ff0000', '#000000'],\n      interpolate: 'lab',\n    });\n    expect(scale(10)).toBe('rgb(122, 27, 11)');\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleLog({ domain: [0.1, 0.91], nice: true });\n      expect(scale.domain()).toEqual([0.1, 1]);\n    });\n    it('false', () => {\n      const scale = scaleLog({ domain: [0.1, 0.91], nice: false });\n      expect(scale.domain()).toEqual([0.1, 0.91]);\n    });\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scaleLog({ domain: [1, 10], range: [1, 10], round: true });\n      expect(scale(2.2)).toBe(4);\n    });\n    it('false', () => {\n      const scale = scaleLog({ domain: [1, 10], range: [1, 10], round: false });\n      expect(scale(5)?.toFixed(2)).toBe('7.29');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleOrdinal.test.ts",
    "content": "import { scaleOrdinal } from '../src';\n\ndescribe('scaleOrdinal', () => {\n  it('should be defined', () => {\n    expect(scaleOrdinal).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = ['noodle', 'burger'];\n    const scale = scaleOrdinal({ domain });\n    expect(scale.domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = ['red', 'green'];\n    const scale = scaleOrdinal({ range });\n    expect(scale.range()).toEqual(range);\n  });\n  it('set unknown', () => {\n    const scale = scaleOrdinal({ domain: ['noodle', 'burger'], unknown: 'green' });\n    expect(scale('sandwich')).toBe('green');\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scalePoint.test.ts",
    "content": "import { scalePoint } from '../src';\n\ndescribe('scalePoint', () => {\n  it('should be defined', () => {\n    expect(scalePoint).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [0, 350];\n    const scale = scalePoint({ domain });\n    expect(scale.domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const scale = scalePoint({ range: [2, 3] });\n    expect(scale.range()).toEqual([2, 3]);\n  });\n  it('set reverse', () => {\n    expect(scalePoint({ reverse: true }).range()).toEqual([1, 0]);\n    expect(scalePoint({ range: [1, 2], reverse: true }).range()).toEqual([2, 1]);\n  });\n  it('set align', () => {\n    expect(scalePoint({ align: 0.5 }).align()).toBe(0.5);\n  });\n  it('set padding', () => {\n    expect(scalePoint({ padding: 0.5 }).padding()).toBe(0.5);\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scalePoint({ domain: ['a', 'b', 'c'], range: [1.1, 3.5], round: true });\n      expect(scale('a')).toBe(1);\n      expect(scale('b')).toBe(2);\n      expect(scale('c')).toBe(3);\n    });\n    it('false', () => {\n      const scale = scalePoint({ domain: ['a', 'b', 'c'], range: [1.1, 3.5], round: false });\n      expect(scale('a')).toBe(1.1);\n      expect(scale('b')).toBe(2.3);\n      expect(scale('c')).toBe(3.5);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scalePower.test.ts",
    "content": "import { scalePower } from '../src';\n\ndescribe('scalePower()', () => {\n  it('should be defined', () => {\n    expect(scalePower).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [1, 2];\n    expect(scalePower({ domain: [1, 2] }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scalePower({ range: [1, 2] }).range()).toEqual(range);\n  });\n  it('set exponent', () => {\n    expect(scalePower({ exponent: 3 }).exponent()).toBe(3);\n  });\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scalePower({ clamp: true });\n      expect(scale(10)).toBe(1);\n    });\n    it('false', () => {\n      const scale = scalePower({ clamp: false });\n      expect(scale(10)).toBe(10);\n    });\n  });\n  it('set (color) interpolate', () => {\n    const scale = scalePower({\n      domain: [0, 10],\n      range: ['#ff0000', '#000000'],\n      interpolate: 'lab',\n    });\n    expect(scale(5)).toBe('rgb(122, 27, 11)');\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scalePower({ domain: [0.1, 0.91], nice: true });\n      expect(scale.domain()).toEqual([0.1, 1]);\n    });\n    it('false', () => {\n      const scale = scalePower({ domain: [0.1, 0.91], nice: false });\n      expect(scale.domain()).toEqual([0.1, 0.91]);\n    });\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scalePower({ domain: [0, 10], range: [0, 10], round: true });\n      expect(scale(2.2)).toBe(2);\n      expect(scale(2.6)).toBe(3);\n    });\n    it('false', () => {\n      const scale = scalePower({ domain: [0, 10], range: [0, 10], round: false });\n      expect(scale(2.2)).toBe(2.2);\n      expect(scale(2.6)).toBe(2.6);\n    });\n  });\n  describe('set zero', () => {\n    it('true', () => {\n      expect(scalePower({ domain: [1, 2], zero: true }).domain()).toEqual([0, 2]);\n      expect(scalePower({ domain: [-2, -1], zero: true }).domain()).toEqual([-2, 0]);\n      expect(scalePower({ domain: [-2, 3], zero: true }).domain()).toEqual([-2, 3]);\n    });\n    it('false', () => {\n      expect(scalePower({ domain: [1, 2], zero: false }).domain()).toEqual([1, 2]);\n      expect(scalePower({ domain: [-2, -1], zero: false }).domain()).toEqual([-2, -1]);\n      expect(scalePower({ domain: [-2, 3], zero: false }).domain()).toEqual([-2, 3]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleQuantile.test.ts",
    "content": "import { scaleQuantile } from '../src';\n\ndescribe('scaleQuantile', () => {\n  it('should be defined', () => {\n    expect(scaleQuantile).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [0, 350];\n    const scale = scaleQuantile({ domain });\n    expect(scale.domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [2, 3];\n    const scale = scaleQuantile({ range });\n    expect(scale.range()).toEqual(range);\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleQuantize.test.ts",
    "content": "import { scaleQuantize } from '../src';\n\ndescribe('scaleQuantize', () => {\n  it('should be defined', () => {\n    expect(scaleQuantize).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [1, 2];\n    expect(scaleQuantize({ domain: [1, 2] }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleQuantize({ range: [1, 2] }).range()).toEqual(range);\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleQuantize({ domain: [0.1, 0.91], nice: true });\n      expect(scale.domain()).toEqual([0.1, 1]);\n    });\n    it('false', () => {\n      const scale = scaleQuantize({ domain: [0.1, 0.91], nice: false });\n      expect(scale.domain()).toEqual([0.1, 0.91]);\n    });\n  });\n  describe('set zero', () => {\n    it('true', () => {\n      expect(scaleQuantize({ domain: [1, 2], zero: true }).domain()).toEqual([0, 2]);\n      expect(scaleQuantize({ domain: [-2, -1], zero: true }).domain()).toEqual([-2, 0]);\n      expect(scaleQuantize({ domain: [-2, 3], zero: true }).domain()).toEqual([-2, 3]);\n    });\n    it('false', () => {\n      expect(scaleQuantize({ domain: [1, 2], zero: false }).domain()).toEqual([1, 2]);\n      expect(scaleQuantize({ domain: [-2, -1], zero: false }).domain()).toEqual([-2, -1]);\n      expect(scaleQuantize({ domain: [-2, 3], zero: false }).domain()).toEqual([-2, 3]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleRadial.test.ts",
    "content": "import { scaleRadial } from '../src';\n\ndescribe('sclaeRadial()', () => {\n  it('should be defined', () => {\n    expect(scaleRadial).toBeDefined();\n  });\n\n  it('set domain', () => {\n    const domain = [1, 2];\n    expect(scaleRadial({ domain: [1, 2] }).domain()).toEqual(domain);\n  });\n\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleRadial({ range: [1, 2] }).range()).toEqual(range);\n  });\n\n  it('set unknown', () => {\n    const scale = scaleRadial({ domain: [0, 10], unknown: 'green' });\n    // coerce to make TS happy\n    expect(scale('sandwich' as unknown as number)).toBe('green');\n  });\n\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scaleRadial({ clamp: true });\n      expect(scale(10)).toBe(1);\n    });\n    it('false', () => {\n      const scale = scaleRadial({ clamp: false });\n      expect(scale(10)).toEqual(Math.sqrt(10));\n    });\n  });\n\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleRadial({ domain: [0.1, 0.91], nice: true });\n      expect(scale.domain()).toEqual([0.1, 1]);\n    });\n    it('false', () => {\n      const scale = scaleRadial({ domain: [0.1, 0.91], nice: false });\n      expect(scale.domain()).toEqual([0.1, 0.91]);\n    });\n  });\n\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scaleRadial({ round: true });\n      expect(scale(10)).toEqual(Math.round(Math.sqrt(10)));\n      expect(scale(2.6)).toEqual(Math.round(Math.sqrt(2.6)));\n    });\n    it('false', () => {\n      const scale = scaleRadial({ round: false });\n      expect(scale(10)).toEqual(Math.sqrt(10));\n      expect(scale(2.6)).toEqual(Math.sqrt(2.6));\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleSqrt.test.ts",
    "content": "import { scaleSqrt } from '../src';\n\ndescribe('scaleSqrt()', () => {\n  it('should be defined', () => {\n    expect(scaleSqrt).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [1, 2];\n    expect(scaleSqrt({ domain: [1, 2] }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleSqrt({ range: [1, 2] }).range()).toEqual(range);\n  });\n  it('exponent is 0.5', () => {\n    expect(scaleSqrt({}).exponent()).toBe(0.5);\n  });\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scaleSqrt({ clamp: true });\n      expect(scale(10)).toBe(1);\n    });\n    it('false', () => {\n      const scale = scaleSqrt<number>({ clamp: false });\n      expect(scale(10)?.toFixed(2)).toBe('3.16');\n    });\n  });\n  it('set (color) interpolate', () => {\n    const scale = scaleSqrt({\n      domain: [0, 10],\n      range: ['#ff0000', '#000000'],\n      interpolate: 'lab',\n    });\n    expect(scale(5)).toBe('rgb(73, 23, 9)');\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleSqrt({ domain: [0.1, 0.91], nice: true });\n      expect(scale.domain()).toEqual([0.1, 1]);\n    });\n    it('false', () => {\n      const scale = scaleSqrt({ domain: [0.1, 0.91], nice: false });\n      expect(scale.domain()).toEqual([0.1, 0.91]);\n    });\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scaleSqrt({ domain: [0, 4], range: [0, 2], round: true });\n      expect(scale(3)).toBe(2);\n    });\n    it('false', () => {\n      const scale = scaleSqrt({ domain: [0, 4], range: [0, 2], round: false });\n      expect(scale(3)?.toFixed(2)).toBe('1.73');\n    });\n  });\n  describe('set zero', () => {\n    it('true', () => {\n      expect(scaleSqrt({ domain: [1, 2], zero: true }).domain()).toEqual([0, 2]);\n      expect(scaleSqrt({ domain: [-2, -1], zero: true }).domain()).toEqual([-2, 0]);\n      expect(scaleSqrt({ domain: [-2, 3], zero: true }).domain()).toEqual([-2, 3]);\n    });\n    it('false', () => {\n      expect(scaleSqrt({ domain: [1, 2], zero: false }).domain()).toEqual([1, 2]);\n      expect(scaleSqrt({ domain: [-2, -1], zero: false }).domain()).toEqual([-2, -1]);\n      expect(scaleSqrt({ domain: [-2, 3], zero: false }).domain()).toEqual([-2, 3]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleSymlog.test.ts",
    "content": "import { scaleSymlog } from '../src';\n\ndescribe('scaleSymlog', () => {\n  it('should be defined', () => {\n    expect(scaleSymlog).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [1, 2];\n    expect(scaleSymlog({ domain: [1, 2] }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleSymlog({ range: [1, 2] }).range()).toEqual(range);\n  });\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scaleSymlog({ clamp: true });\n      expect(scale(10)).toBe(1);\n    });\n    it('false', () => {\n      const scale = scaleSymlog<number>({ clamp: false });\n      expect(scale(10)?.toFixed(2)).toBe('3.46');\n    });\n  });\n  it('set constant', () => {\n    const constant = 2;\n    const scale = scaleSymlog({ constant });\n    expect(scale.constant()).toEqual(constant);\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleSymlog({ domain: [0.1, 0.91], nice: true });\n      expect(scale.domain()).toEqual([0.1, 1]);\n    });\n    it('false', () => {\n      const scale = scaleSymlog({ domain: [0.1, 0.91], nice: false });\n      expect(scale.domain()).toEqual([0.1, 0.91]);\n    });\n  });\n  describe('set zero', () => {\n    it('true', () => {\n      expect(scaleSymlog({ domain: [1, 2], zero: true }).domain()).toEqual([0, 2]);\n      expect(scaleSymlog({ domain: [-2, -1], zero: true }).domain()).toEqual([-2, 0]);\n      expect(scaleSymlog({ domain: [-2, 3], zero: true }).domain()).toEqual([-2, 3]);\n    });\n    it('false', () => {\n      expect(scaleSymlog({ domain: [1, 2], zero: false }).domain()).toEqual([1, 2]);\n      expect(scaleSymlog({ domain: [-2, -1], zero: false }).domain()).toEqual([-2, -1]);\n      expect(scaleSymlog({ domain: [-2, 3], zero: false }).domain()).toEqual([-2, 3]);\n    });\n  });\n  describe('set round', () => {\n    it('true', () => {\n      expect(scaleSymlog({ domain: [1, 3], round: true })(2)).toBe(1);\n    });\n    it('false', () => {\n      expect((scaleSymlog({ domain: [1, 3], round: false })(2) as number).toFixed(3)).toBe('0.585');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleThreshold.test.ts",
    "content": "import { scaleThreshold } from '../src';\n\ndescribe('scaleThreshold', () => {\n  it('should be defined', () => {\n    expect(scaleThreshold).toBeDefined();\n  });\n  it('set domain', () => {\n    const domain = [0, 350];\n    const scale = scaleThreshold({ domain });\n    expect(scale.domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [2, 3];\n    const scale = scaleThreshold({ range });\n    expect(scale.range()).toEqual(range);\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleTime.test.ts",
    "content": "import TimezoneMock from 'timezone-mock';\nimport { scaleTime } from '../src';\n\ndescribe('scaleTime()', () => {\n  let domain: [Date, Date];\n  let unniceDomain: [Date, Date];\n\n  beforeAll(() => {\n    TimezoneMock.register('US/Pacific');\n    domain = [new Date(2020, 0, 1), new Date(2020, 0, 10)];\n    unniceDomain = [new Date(2020, 0, 1), new Date(2020, 0, 9, 20)];\n  });\n\n  afterAll(() => {\n    TimezoneMock.unregister();\n  });\n\n  it('should be defined', () => {\n    expect(scaleTime).toBeDefined();\n  });\n  it('set domain', () => {\n    expect(scaleTime({ domain }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleTime({ range: [1, 2] }).range()).toEqual(range);\n  });\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scaleTime({ domain, range: [0, 10], clamp: true });\n      expect(scale(new Date(2019, 11, 31))).toBe(0);\n    });\n    it('false', () => {\n      const scale = scaleTime({ domain, range: [0, 10], clamp: false });\n      expect(scale(new Date(2019, 11, 31))?.toFixed(2)).toBe('-1.11');\n    });\n  });\n  it('set (color) interpolate', () => {\n    const scale = scaleTime({\n      domain,\n      range: ['#ff0000', '#000000'],\n      interpolate: 'lab',\n    });\n    expect(scale(new Date(2020, 0, 5))).toBe('rgb(136, 28, 11)');\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleTime({\n        domain: unniceDomain,\n        nice: true,\n      });\n      expect(scale.domain()).toEqual(domain);\n    });\n    it('false', () => {\n      const scale = scaleTime({ domain: unniceDomain, nice: false });\n      expect(scale.domain()).toEqual(unniceDomain);\n    });\n    it('number', () => {\n      const scale = scaleTime({ domain: unniceDomain, nice: 5 });\n      expect(scale.domain()).toEqual([new Date(2020, 0, 1), new Date(2020, 0, 11)]);\n    });\n    it('time unit string', () => {\n      const scale = scaleTime({ domain: unniceDomain, nice: 'hour' });\n      expect(scale.domain()).toEqual(unniceDomain);\n    });\n    it('nice object', () => {\n      const scale = scaleTime({ domain: unniceDomain, nice: { interval: 'hour', step: 3 } });\n      expect(scale.domain()).toEqual([new Date(2020, 0, 1), new Date(2020, 0, 9, 21)]);\n    });\n    it('invalid nice object', () => {\n      const scale = scaleTime({ domain: unniceDomain, nice: { interval: 'hour', step: NaN } });\n      expect(scale.domain()).toEqual(unniceDomain);\n    });\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scaleTime({\n        domain,\n        range: [1, 5],\n        round: true,\n      });\n      expect(scale(new Date(2020, 0, 5))).toBe(3);\n    });\n    it('false', () => {\n      const scale = scaleTime({\n        domain,\n        range: [1, 5],\n        round: false,\n      });\n      expect(scale(new Date(2020, 0, 5))?.toFixed(2)).toBe('2.78');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/scaleUtc.test.ts",
    "content": "import TimezoneMock from 'timezone-mock';\nimport { scaleUtc } from '../src';\n\ndescribe('scaleUtc()', () => {\n  let domain: [Date, Date];\n  let unniceDomain: [Date, Date];\n\n  beforeAll(() => {\n    TimezoneMock.register('US/Pacific');\n    domain = [new Date(Date.UTC(2020, 0, 1)), new Date(Date.UTC(2020, 0, 10))];\n    unniceDomain = [new Date(Date.UTC(2020, 0, 1)), new Date(Date.UTC(2020, 0, 9, 20))];\n  });\n\n  afterAll(() => {\n    TimezoneMock.unregister();\n  });\n\n  it('should be defined', () => {\n    expect(scaleUtc).toBeDefined();\n  });\n  it('set domain', () => {\n    expect(scaleUtc({ domain }).domain()).toEqual(domain);\n  });\n  it('set range', () => {\n    const range = [1, 2];\n    expect(scaleUtc({ range: [1, 2] }).range()).toEqual(range);\n  });\n  describe('set clamp', () => {\n    it('true', () => {\n      const scale = scaleUtc({ domain, range: [0, 10], clamp: true });\n      expect(scale(new Date(Date.UTC(2019, 11, 31)))).toBe(0);\n    });\n    it('false', () => {\n      const scale = scaleUtc({ domain, range: [0, 10], clamp: false });\n      expect(scale(new Date(Date.UTC(2019, 11, 31)))?.toFixed(2)).toBe('-1.11');\n    });\n  });\n  it('set (color) interpolate', () => {\n    const scale = scaleUtc({\n      domain,\n      range: ['#ff0000', '#000000'],\n      interpolate: 'lab',\n    });\n    expect(scale(new Date(Date.UTC(2020, 0, 5)))).toBe('rgb(136, 28, 11)');\n  });\n  describe('set nice', () => {\n    it('true', () => {\n      const scale = scaleUtc({\n        domain: unniceDomain,\n        nice: true,\n      });\n      expect(scale.domain()).toEqual(domain);\n    });\n    it('false', () => {\n      const scale = scaleUtc({ domain: unniceDomain, nice: false });\n      expect(scale.domain()).toEqual(unniceDomain);\n    });\n    it('number', () => {\n      const scale = scaleUtc({ domain: unniceDomain, nice: 5 });\n      expect(scale.domain()).toEqual([\n        new Date(Date.UTC(2020, 0, 1)),\n        new Date(Date.UTC(2020, 0, 11)),\n      ]);\n    });\n    it('time unit string', () => {\n      const scale = scaleUtc({ domain: unniceDomain, nice: 'hour' });\n      expect(scale.domain()).toEqual(unniceDomain);\n    });\n    it('nice object', () => {\n      const scale = scaleUtc({ domain: unniceDomain, nice: { interval: 'hour', step: 3 } });\n      expect(scale.domain()).toEqual([\n        new Date(Date.UTC(2020, 0, 1)),\n        new Date(Date.UTC(2020, 0, 9, 21)),\n      ]);\n    });\n  });\n  describe('set round', () => {\n    it('true', () => {\n      const scale = scaleUtc({\n        domain,\n        range: [1, 5],\n        round: true,\n      });\n      expect(scale(new Date(Date.UTC(2020, 0, 5)))).toBe(3);\n    });\n    it('false', () => {\n      const scale = scaleUtc({\n        domain,\n        range: [1, 5],\n        round: false,\n      });\n      expect(scale(new Date(Date.UTC(2020, 0, 5)))?.toFixed(2)).toBe('2.78');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-scale/test/updateScale.test.ts",
    "content": "import TimezoneMock from 'timezone-mock';\nimport {\n  updateScale,\n  scaleLinear,\n  scaleLog,\n  scalePower,\n  scaleSqrt,\n  scaleSymlog,\n  scaleTime,\n  scaleUtc,\n  scaleQuantile,\n  scaleOrdinal,\n  scalePoint,\n  scaleBand,\n  scaleQuantize,\n  scaleThreshold,\n} from '../src';\n\ndescribe('updateScale', () => {\n  it('should be defined', () => {\n    expect(updateScale).toBeDefined();\n  });\n  it('should return a new copy of the scale', () => {\n    const scale = scaleLinear();\n    const nextScale = updateScale(scale);\n    expect(scale).not.toBe(nextScale);\n  });\n  it('linear', () => {\n    const scale = updateScale(scaleLinear(), { domain: [0, 10], range: [2, 4] });\n    expect(scale(5)).toBe(3);\n  });\n  it('log', () => {\n    const scale = updateScale(scaleLog(), {\n      base: 2,\n      domain: [2, 8],\n      range: [1, 3],\n    });\n    expect(scale(4)?.toFixed(2)).toBe('2.00');\n  });\n  it('pow', () => {\n    const scale = updateScale(scalePower(), { exponent: 2, domain: [1, 3], range: [2, 18] });\n    expect(scale(2)).toBe(8);\n  });\n  it('sqrt', () => {\n    const scale = updateScale(scaleSqrt(), { domain: [1, 9], range: [1, 3] });\n    expect(scale(4)).toBe(2);\n  });\n  it('symlog', () => {\n    const scale = updateScale(scaleSymlog(), { domain: [1, 9], range: [1, 3], constant: 2 });\n    expect(scale(4)?.toFixed(2)).toBe('2.07');\n  });\n  it('time', () => {\n    TimezoneMock.register('US/Pacific');\n    const scale = updateScale(scaleTime(), {\n      domain: [new Date(2020, 0, 1), new Date(2020, 0, 10)],\n      range: [1, 10],\n    });\n    expect(scale(new Date(2020, 0, 4))).toBe(4);\n    TimezoneMock.unregister();\n  });\n  it('utc', () => {\n    const scale = updateScale(scaleUtc(), {\n      domain: [new Date(Date.UTC(2020, 0, 1)), new Date(Date.UTC(2020, 0, 10))],\n      range: [1, 10],\n    });\n    expect(scale(new Date(Date.UTC(2020, 0, 4)))).toBe(4);\n  });\n  it('quantile', () => {\n    const scale = updateScale(scaleQuantile(), { domain: [1, 3, 5, 7], range: [0, 10] });\n    expect(scale(2)).toBe(0);\n  });\n  it('quantize', () => {\n    const scale = updateScale(scaleQuantize(), { domain: [1, 10], range: ['red', 'green'] });\n    expect(scale(2)).toBe('red');\n    expect(scale(6)).toBe('green');\n  });\n  it('threshold', () => {\n    const scale = updateScale(scaleThreshold(), {\n      domain: [0, 1] as number[],\n      range: ['red', 'white', 'green'],\n    });\n    expect(scale(-1)).toBe('red');\n    expect(scale(0)).toBe('white');\n    expect(scale(0.5)).toBe('white');\n    expect(scale(1)).toBe('green');\n    expect(scale(1000)).toBe('green');\n  });\n  it('ordinal', () => {\n    const scale = updateScale<string | undefined, 'pig' | 'cat'>(\n      scaleOrdinal<'pig' | 'cat', string | undefined>(),\n      {\n        domain: ['pig', 'cat'],\n        range: ['red', 'green'],\n      },\n    );\n    expect(scale('pig')).toBe('red');\n    expect(scale('cat')).toBe('green');\n  });\n  it('point', () => {\n    const scale = updateScale(scalePoint(), {\n      domain: ['a', 'b', 'c'],\n      range: [1.1, 3.5],\n      round: true,\n    });\n    expect(scale('a')).toBe(1);\n    expect(scale('b')).toBe(2);\n    expect(scale('c')).toBe(3);\n  });\n  it('band', () => {\n    const scale = updateScale(scaleBand(), {\n      domain: ['a', 'b', 'c'],\n      range: [1.1, 3.5],\n      round: false,\n    });\n    expect(scale('a')).toBe(1.1);\n    expect(scale('b')).toBe(1.9);\n    expect(scale('c')).toBe(2.7);\n  });\n  it('invalid type', () => {\n    // @ts-expect-error\n    expect(updateScale(scaleLinear(), { type: 'invalid' })).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/utils/coerceNumber.test.ts",
    "content": "import coerceNumber from '../../src/utils/coerceNumber';\n\ndescribe('coerceNumber(mayBeNumberLike)', () => {\n  it('coerces NumberLike to number', () => {\n    expect(coerceNumber({ valueOf: () => 1 })).toBe(1);\n    expect(coerceNumber(new Date(10))).toBe(10);\n  });\n  it('returns the same thing if not', () => {\n    expect(coerceNumber('x')).toBe('x');\n    expect(coerceNumber(2)).toBe(2);\n    expect(coerceNumber(0)).toBe(0);\n    expect(coerceNumber(null)).toBeNull();\n    expect(coerceNumber(undefined)).toBeUndefined();\n    expect(coerceNumber({ x: 1 })).toEqual({ x: 1 });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/utils/getTicks.test.ts",
    "content": "import getTicks from '../../src/utils/getTicks';\nimport { scaleLinear, scaleBand } from '../../src';\n\ndescribe('getTicks(scale)', () => {\n  it('linear', () => {\n    const scale = scaleLinear();\n    expect(getTicks(scale, 3)).toEqual([0, 0.5, 1]);\n    expect(getTicks(scale, 2)).toEqual([0, 0.5, 1]);\n    expect(getTicks(scale, 1)).toEqual([0, 1]);\n  });\n  it('band', () => {\n    const scale = scaleBand({\n      domain: ['a', 'b', 'c', 'd'],\n    });\n    expect(getTicks(scale, 4)).toEqual(['a', 'b', 'c', 'd']);\n    expect(getTicks(scale, 3)).toEqual(['a', 'b', 'c', 'd']);\n    expect(getTicks(scale, 2)).toEqual(['a', 'c']);\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/utils/inferScaleType.test.ts",
    "content": "import {\n  scaleLinear,\n  scaleLog,\n  scalePow,\n  scaleSqrt,\n  scaleSymlog,\n  scaleRadial,\n  scaleTime,\n  scaleUtc,\n  scaleQuantile,\n  scaleQuantize,\n  scaleThreshold,\n  scaleOrdinal,\n  scalePoint,\n  scaleBand,\n} from '@visx/vendor/d3-scale';\nimport TimezoneMock from 'timezone-mock';\nimport inferScaleType from '../../src/utils/inferScaleType';\n\ndescribe('inferScaleType(scale)', () => {\n  it('linear scale', () => {\n    expect(inferScaleType(scaleLinear())).toBe('linear');\n  });\n  it('log scale', () => {\n    expect(inferScaleType(scaleLog())).toBe('log');\n  });\n  it('pow scale', () => {\n    expect(inferScaleType(scalePow())).toBe('pow');\n  });\n  it('sqrt scale', () => {\n    expect(inferScaleType(scaleSqrt())).toBe('sqrt');\n  });\n  it('symlog scale', () => {\n    expect(inferScaleType(scaleSymlog())).toBe('symlog');\n  });\n  it('radial scale', () => {\n    expect(inferScaleType(scaleRadial())).toBe('radial');\n  });\n  describe('time scale', () => {\n    it('returns time when local time is not UTC', () => {\n      TimezoneMock.register('US/Pacific');\n      expect(inferScaleType(scaleTime())).toBe('time');\n      TimezoneMock.unregister();\n    });\n    it('returns utc when local time is UTC', () => {\n      TimezoneMock.register('UTC');\n      expect(inferScaleType(scaleTime())).toBe('utc');\n      TimezoneMock.unregister();\n    });\n  });\n  it('utc scale', () => {\n    expect(inferScaleType(scaleUtc())).toBe('utc');\n  });\n  it('quantile scale', () => {\n    expect(inferScaleType(scaleQuantile())).toBe('quantile');\n  });\n  it('quantize scale', () => {\n    expect(inferScaleType(scaleQuantize())).toBe('quantize');\n  });\n  it('threshold scale', () => {\n    expect(inferScaleType(scaleThreshold())).toBe('threshold');\n  });\n  it('ordinal scale', () => {\n    expect(inferScaleType(scaleOrdinal<string>())).toBe('ordinal');\n  });\n  it('point scale', () => {\n    expect(inferScaleType(scalePoint())).toBe('point');\n  });\n  it('band scale', () => {\n    expect(inferScaleType(scaleBand())).toBe('band');\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/utils/isUtcScale.test.ts",
    "content": "import { scaleUtc, scaleTime } from '@visx/vendor/d3-scale';\nimport TimezoneMock from 'timezone-mock';\nimport isUtcScale from '../../src/utils/isUtcScale';\n\ndescribe('isUtcScale(scale)', () => {\n  it('returns true for utc scale', () => {\n    expect(isUtcScale(scaleUtc())).toBe(true);\n  });\n  describe('for time scale', () => {\n    it('returns false when local time is not UTC', () => {\n      TimezoneMock.register('US/Pacific');\n      expect(isUtcScale(scaleTime())).toBe(false);\n      TimezoneMock.unregister();\n    });\n    it('returns true when local time is UTC', () => {\n      TimezoneMock.register('UTC');\n      expect(isUtcScale(scaleTime())).toBe(true);\n      TimezoneMock.unregister();\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/utils/scaleCanBeZeroed.test.ts",
    "content": "import scaleCanBeZeroed from '../../src/utils/scaleCanBeZeroed';\n\ndescribe('scaleCanBeZeroed(scaleConfig)', () => {\n  it('returns true for zero-able scales', () => {\n    const zeroAble = ['linear', 'pow', 'quantize', 'sqrt', 'symlog'] as const;\n    expect.assertions(zeroAble.length);\n    zeroAble.forEach((type) => expect(scaleCanBeZeroed({ type })).toBe(true));\n  });\n  it('returns false for non-zero-able scales', () => {\n    const notZeroAble = [\n      'log',\n      'radial',\n      'time',\n      'utc',\n      'quantile',\n      'threshold',\n      'ordinal',\n      'point',\n      'band',\n    ] as const;\n    expect.assertions(notZeroAble.length);\n    notZeroAble.forEach((type) => expect(scaleCanBeZeroed({ type })).toBe(false));\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/test/utils/toString.test.ts",
    "content": "import toString from '../../src/utils/toString';\n\ndescribe('toString(mayBeStringLike)', () => {\n  it('converts StringLike to string', () => {\n    expect(toString({ toString: () => 'haha' })).toBe('haha');\n    expect(toString('x')).toBe('x');\n    expect(toString(2)).toBe('2');\n    expect(toString(0)).toBe('0');\n    expect(toString({ x: 1 })).toBe('[object Object]');\n  });\n  it('returns the same thing if not', () => {\n    expect(toString(undefined)).toBeUndefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-scale/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-scale/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/scale',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-scale/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/scale': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-shape/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-shape/Readme.md",
    "content": "# @visx/shape\n\n<a title=\"@visx/shape npm downloads\" href=\"https://www.npmjs.com/package/@visx/shape\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/shape.svg?style=flat-square\" />\n</a>\n\nShapes are the core elements of `visx`. Most of what you see on the screen, like lines, bars, and\nareas are all made with shape primitives.\n\n## Installation\n\n```\nnpm install --save @visx/shape\n```\n"
  },
  {
    "path": "packages/visx-shape/package.json",
    "content": "{\n  \"name\": \"@visx/shape\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx shape\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"repository\": \"https://github.com/airbnb/visx\",\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@types/lodash\": \"^4.17.13\",\n    \"@types/react\": \"*\",\n    \"@visx/curve\": \"workspace:*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\",\n    \"lodash\": \"^4.17.21\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"devDependencies\": {\n    \"@types/d3-hierarchy\": \"^1.1.6\",\n    \"d3-hierarchy\": \"^1.1.8\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-shape/src/index.ts",
    "content": "// @visx/shape\nexport { default as Arc } from './shapes/Arc';\nexport { default as Pie } from './shapes/Pie';\nexport { default as Line } from './shapes/Line';\nexport { default as LinePath } from './shapes/LinePath';\nexport { default as LineRadial } from './shapes/LineRadial';\nexport { default as Area } from './shapes/Area';\nexport { default as AreaClosed } from './shapes/AreaClosed';\nexport { default as AreaStack } from './shapes/AreaStack';\nexport { default as Bar } from './shapes/Bar';\nexport { default as BarRounded } from './shapes/BarRounded';\nexport { default as BarGroup } from './shapes/BarGroup';\nexport { default as BarGroupHorizontal } from './shapes/BarGroupHorizontal';\nexport { default as BarStack } from './shapes/BarStack';\nexport { default as BarStackHorizontal } from './shapes/BarStackHorizontal';\nexport { default as Stack } from './shapes/Stack';\nexport { default as stackOffset, STACK_OFFSETS, STACK_OFFSET_NAMES } from './util/stackOffset';\nexport { default as stackOrder, STACK_ORDERS, STACK_ORDER_NAMES } from './util/stackOrder';\nexport { degreesToRadians } from './util/trigonometry';\nexport { getX, getY, getSource, getTarget, getFirstItem, getSecondItem } from './util/accessors';\nexport { default as getBandwidth } from './util/getBandwidth';\nexport {\n  default as LinkHorizontal,\n  pathHorizontalDiagonal,\n} from './shapes/link/diagonal/LinkHorizontal';\nexport { default as LinkVertical, pathVerticalDiagonal } from './shapes/link/diagonal/LinkVertical';\nexport { default as LinkRadial, pathRadialDiagonal } from './shapes/link/diagonal/LinkRadial';\nexport {\n  default as LinkHorizontalCurve,\n  pathHorizontalCurve,\n} from './shapes/link/curve/LinkHorizontalCurve';\nexport {\n  default as LinkVerticalCurve,\n  pathVerticalCurve,\n} from './shapes/link/curve/LinkVerticalCurve';\nexport { default as LinkRadialCurve, pathRadialCurve } from './shapes/link/curve/LinkRadialCurve';\nexport {\n  default as LinkHorizontalLine,\n  pathHorizontalLine,\n} from './shapes/link/line/LinkHorizontalLine';\nexport { default as LinkVerticalLine, pathVerticalLine } from './shapes/link/line/LinkVerticalLine';\nexport { default as LinkRadialLine, pathRadialLine } from './shapes/link/line/LinkRadialLine';\nexport {\n  default as LinkHorizontalStep,\n  pathHorizontalStep,\n} from './shapes/link/step/LinkHorizontalStep';\nexport { default as LinkVerticalStep, pathVerticalStep } from './shapes/link/step/LinkVerticalStep';\nexport { default as LinkRadialStep, pathRadialStep } from './shapes/link/step/LinkRadialStep';\nexport { default as Polygon, getPoints, getPoint } from './shapes/Polygon';\nexport { default as Circle } from './shapes/Circle';\nexport { default as SplitLinePath } from './shapes/SplitLinePath';\n\n// Export factory functions\nexport * from './util/D3ShapeFactories';\n\nexport type * from './types';\nexport type { StackOffset } from './util/stackOffset';\nexport type { StackOrder } from './util/stackOrder';\nexport type { ArcProps } from './shapes/Arc';\nexport type { AreaProps } from './shapes/Area';\nexport type { AreaClosedProps } from './shapes/AreaClosed';\nexport type { AreaStackProps } from './shapes/AreaStack';\nexport type { BarProps } from './shapes/Bar';\nexport type { BarGroupProps } from './shapes/BarGroup';\nexport type { BarGroupHorizontalProps } from './shapes/BarGroupHorizontal';\nexport type { BarRoundedProps } from './shapes/BarRounded';\nexport type { BarStackProps } from './shapes/BarStack';\nexport type { BarStackHorizontalProps } from './shapes/BarStackHorizontal';\nexport type { CircleProps } from './shapes/Circle';\nexport type { LineProps } from './shapes/Line';\nexport type { LinePathProps } from './shapes/LinePath';\nexport type { LineRadialProps } from './shapes/LineRadial';\nexport type { PieProps, ProvidedProps as PieProvidedProps } from './shapes/Pie';\nexport type { PolygonProps } from './shapes/Polygon';\nexport type { SplitLinePathProps } from './shapes/SplitLinePath';\nexport type { StackProps } from './shapes/Stack';\nexport type { LinkHorizontalCurveProps } from './shapes/link/curve/LinkHorizontalCurve';\nexport type { LinkRadialCurveProps } from './shapes/link/curve/LinkRadialCurve';\nexport type { LinkVerticalCurveProps } from './shapes/link/curve/LinkVerticalCurve';\nexport type { LinkHorizontalDiagonalProps } from './shapes/link/diagonal/LinkHorizontal';\nexport type { LinkHorizontalLineProps } from './shapes/link/line/LinkHorizontalLine';\nexport type { LinkRadialLineProps } from './shapes/link/line/LinkRadialLine';\nexport type { LinkVerticalLineProps } from './shapes/link/line/LinkVerticalLine';\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Arc.tsx",
    "content": "import type { ReactNode, Ref } from 'react';\nimport cx from 'classnames';\nimport type { Arc as ArcType } from '@visx/vendor/d3-shape';\nimport type { $TSFIXME, AddSVGProps, ArcPathConfig } from '../types';\nimport { arc } from '../util/D3ShapeFactories';\n\nexport type ArcProps<Datum> = {\n  /** className applied to path element. */\n  className?: string;\n  /** A Datum for which to generate an arc. */\n  data?: Datum;\n  /** Override render function which is passed the configured arc generator as input. */\n  children?: (args: { path: ArcType<$TSFIXME, Datum> }) => ReactNode;\n  /** React ref to the path element. */\n  innerRef?: Ref<SVGPathElement>;\n} & ArcPathConfig<Datum>;\n\nexport default function Arc<Datum>({\n  className,\n  data,\n  innerRadius,\n  outerRadius,\n  cornerRadius,\n  startAngle,\n  endAngle,\n  padAngle,\n  padRadius,\n  children,\n  innerRef,\n  ...restProps\n}: AddSVGProps<ArcProps<Datum>, SVGPathElement>) {\n  const path = arc({\n    innerRadius,\n    outerRadius,\n    cornerRadius,\n    startAngle,\n    endAngle,\n    padAngle,\n    padRadius,\n  });\n\n  if (children) return <>{children({ path })}</>;\n  if (\n    !data &&\n    (startAngle == null || endAngle == null || innerRadius == null || outerRadius == null)\n  ) {\n    console.warn(\n      '[@visx/shape/Arc]: expected data because one of startAngle, endAngle, innerRadius, outerRadius is undefined. Bailing.',\n    );\n    return null;\n  }\n\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-arc', className)}\n      d={path(data as Datum) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Area.tsx",
    "content": "import cx from 'classnames';\nimport type { AddSVGProps, BaseAreaProps } from '../types';\nimport { area } from '../util/D3ShapeFactories';\n\nexport type AreaProps<Datum> = BaseAreaProps<Datum>;\n\nexport default function Area<Datum>({\n  children,\n  x,\n  x0,\n  x1,\n  y,\n  y0,\n  y1,\n  data = [],\n  defined = () => true,\n  className,\n  curve,\n  innerRef,\n  ...restProps\n}: AddSVGProps<AreaProps<Datum>, SVGPathElement>) {\n  const path = area<Datum>({ x, x0, x1, y, y0, y1, defined, curve });\n  if (children) return <>{children({ path })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-area', className)}\n      d={path(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/AreaClosed.tsx",
    "content": "import cx from 'classnames';\nimport type { PositionScale, AddSVGProps, BaseAreaProps } from '../types';\nimport setNumOrAccessor from '../util/setNumberOrNumberAccessor';\nimport { area } from '../util/D3ShapeFactories';\n\nexport type AreaClosedProps<Datum> = BaseAreaProps<Datum> & {\n  yScale: PositionScale;\n};\n\nexport default function AreaClosed<Datum>({\n  x,\n  x0,\n  x1,\n  y,\n  y1,\n  y0,\n  yScale,\n  data = [],\n  defined = () => true,\n  className,\n  curve,\n  innerRef,\n  children,\n  ...restProps\n}: AddSVGProps<AreaClosedProps<Datum>, SVGPathElement>) {\n  const path = area<Datum>({ x, x0, x1, defined, curve });\n  if (y0 == null) {\n    /**\n     * by default set the baseline to the first element of the yRange\n     * @TODO take the minimum instead?\n     */\n    path.y0(yScale.range()[0]);\n  } else {\n    setNumOrAccessor(path.y0, y0);\n  }\n  if (y && !y1) setNumOrAccessor(path.y1, y);\n  if (y1 && !y) setNumOrAccessor(path.y1, y1);\n  if (children) return <>{children({ path })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-area-closed', className)}\n      d={path(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/AreaStack.tsx",
    "content": "import cx from 'classnames';\nimport type { StackProps } from './Stack';\nimport Stack from './Stack';\nimport type { AddSVGProps, StackKey } from '../types';\n\ntype PickProps =\n  | 'className'\n  | 'top'\n  | 'left'\n  | 'keys'\n  | 'data'\n  | 'curve'\n  | 'defined'\n  | 'x'\n  | 'x0'\n  | 'x1'\n  | 'y0'\n  | 'y1'\n  | 'value'\n  | 'order'\n  | 'offset'\n  | 'color'\n  | 'children';\n\nexport type AreaStackProps<Datum, Key> = Pick<StackProps<Datum, Key>, PickProps>;\n\nexport default function AreaStack<Datum, Key extends StackKey = StackKey>({\n  className,\n  top,\n  left,\n  keys,\n  data,\n  curve,\n  defined,\n  x,\n  x0,\n  x1,\n  y0,\n  y1,\n  value,\n  order,\n  offset,\n  color,\n  children,\n  ...restProps\n}: AddSVGProps<AreaStackProps<Datum, Key>, SVGPathElement>) {\n  return (\n    <Stack<Datum, Key>\n      className={className}\n      top={top}\n      left={left}\n      keys={keys}\n      data={data}\n      curve={curve}\n      defined={defined}\n      x={x}\n      x0={x0}\n      x1={x1}\n      y0={y0}\n      y1={y1}\n      value={value}\n      order={order}\n      offset={offset}\n      color={color}\n      {...restProps}\n    >\n      {children ||\n        (({ stacks, path }) =>\n          stacks.map((series, i) => (\n            <path\n              className={cx('visx-area-stack', className)}\n              key={`area-stack-${i}-${series.key || ''}`}\n              d={path(series) || ''}\n              fill={color?.(series.key, i)}\n              {...restProps}\n            />\n          )))}\n    </Stack>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Bar.tsx",
    "content": "import type { Ref } from 'react';\nimport cx from 'classnames';\nimport type { AddSVGProps } from '../types';\n\nexport type BarProps = {\n  /** className to apply to rect element. */\n  className?: string;\n  /** reference to rect element. */\n  innerRef?: Ref<SVGRectElement>;\n};\n\nexport default function Bar({\n  className,\n  innerRef,\n  ...restProps\n}: AddSVGProps<BarProps, SVGRectElement>) {\n  return <rect ref={innerRef} className={cx('visx-bar', className)} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/BarGroup.tsx",
    "content": "import type { ReactNode } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport Bar from './Bar';\nimport type {\n  PositionScale,\n  DatumObject,\n  AnyScaleBand,\n  AddSVGProps,\n  BaseBarGroupProps,\n  BarGroup as BarGroupType,\n  GroupKey,\n  Accessor,\n} from '../types';\nimport getBandwidth from '../util/getBandwidth';\n\nexport type BarGroupProps<\n  Datum extends DatumObject,\n  Key extends GroupKey = GroupKey,\n  X0Scale extends AnyScaleBand = AnyScaleBand,\n  X1Scale extends AnyScaleBand = AnyScaleBand,\n> = BaseBarGroupProps<Datum, Key> & {\n  /** Returns the value mapped to the x0 (group position) of a bar */\n  x0: Accessor<Datum, ScaleInput<X0Scale>>;\n  /** @visx/scale or d3-scale that takes an x0 value (position of group) and maps it to an x0 axis position of the group. */\n  x0Scale: X0Scale;\n  /** @visx/scale or d3-scale that takes a group key and maps it to an x axis position (within a group). */\n  x1Scale: X1Scale;\n  /** @visx/scale or d3-scale that takes an y value (Datum[key]) and maps it to a y axis position. */\n  yScale: PositionScale;\n  /** Total height of the y-axis. */\n  height: number;\n  /** Override render function which is passed the computed BarGroups. */\n  children?: (barGroups: BarGroupType<Key>[]) => ReactNode;\n};\n\n/**\n * Generates bar groups as an array of objects and renders `<rect />`s for each datum grouped by `key`. A general setup might look like this:\n *\n * ```js\n * const data = [{\n *  date: date1,\n *  key1: value,\n *  key2: value,\n *  key3: value\n * }, {\n *  date: date2,\n *  key1: value,\n *  key2: value,\n *  key3: value,\n * }];\n *\n * const x0 = d => d.date;\n * const keys = [key1, key2, key3];\n *\n * const x0Scale = scaleBand({\n *  domain: data.map(x0),\n *  padding: 0.2\n * });\n * const x1Scale = scaleBand({\n *  domain: keys,\n *  padding: 0.1\n * });\n * const yScale = scaleLinear({\n *   domain: [0, Math.max(...data.map(d => Math.max(...keys.map(key => d[key]))))]\n * });\n * const color = scaleOrdinal({\n *   domain: keys,\n *   range: [blue, green, purple]\n * });\n * ```\n *\n * Example: [https://airbnb.io/visx/bargroup](https://airbnb.io/visx/bargroup)\n */\nexport default function BarGroup<\n  Datum extends DatumObject,\n  Key extends GroupKey = GroupKey,\n  X0Scale extends AnyScaleBand = AnyScaleBand,\n  X1Scale extends AnyScaleBand = AnyScaleBand,\n>({\n  data,\n  className,\n  top,\n  left,\n  x0,\n  x0Scale,\n  x1Scale,\n  yScale,\n  color,\n  keys,\n  height,\n  children,\n  ...restProps\n}: AddSVGProps<BarGroupProps<Datum, Key, X0Scale, X1Scale>, SVGRectElement>) {\n  const barWidth = getBandwidth(x1Scale);\n\n  const barGroups: BarGroupType<Key>[] = data.map((group, i) => ({\n    index: i,\n    x0: x0Scale(x0(group))!,\n    bars: keys.map((key, j) => {\n      const value = group[key];\n      return {\n        index: j,\n        key,\n        value,\n        width: barWidth,\n        x: x1Scale(key) || 0,\n        y: yScale(value) || 0,\n        color: color(key, j),\n        height: height - (yScale(value) || 0),\n      };\n    }),\n  }));\n\n  if (children) return <>{children(barGroups)}</>;\n\n  return (\n    <Group className={cx('visx-bar-group', className)} top={top} left={left}>\n      {barGroups.map((barGroup) => (\n        <Group key={`bar-group-${barGroup.index}-${barGroup.x0}`} left={barGroup.x0}>\n          {barGroup.bars.map((bar) => (\n            <Bar\n              key={`bar-group-bar-${barGroup.index}-${bar.index}-${bar.value}-${bar.key}`}\n              x={bar.x}\n              y={bar.y}\n              width={bar.width}\n              height={bar.height}\n              fill={bar.color}\n              {...restProps}\n            />\n          ))}\n        </Group>\n      ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/BarGroupHorizontal.tsx",
    "content": "import type { ReactNode } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport Bar from './Bar';\nimport type {\n  PositionScale,\n  AnyScaleBand,\n  DatumObject,\n  AddSVGProps,\n  BarGroupHorizontal as BarGroupHorizontalType,\n  BaseBarGroupProps,\n  GroupKey,\n  Accessor,\n} from '../types';\nimport getBandwidth from '../util/getBandwidth';\n\nexport type BarGroupHorizontalProps<\n  Datum extends DatumObject,\n  Key extends GroupKey = GroupKey,\n  Y0Scale extends AnyScaleBand = AnyScaleBand,\n  Y1Scale extends AnyScaleBand = AnyScaleBand,\n> = BaseBarGroupProps<Datum, Key> & {\n  /** Returns the value (Datum[key]) mapped to the x of a bar */\n  x?: (barValue: number) => number;\n  /** Returns the value mapped to the y0 (position of group) of a bar */\n  y0: Accessor<Datum, ScaleInput<Y0Scale>>;\n  /** @visx/scale or d3-scale that takes a key value (Datum[key]) and maps it to an x axis position (width of bar). */\n  xScale: PositionScale;\n  /** @visx/scale or d3-scale that takes a y0 value (position of group) and maps it to a y axis position. */\n  y0Scale: Y0Scale;\n  /** @visx/scale or d3-scale that takes a group key and maps it to an y axis position (within a group). */\n  y1Scale: Y1Scale;\n  /** Total width of the x-axis. */\n  width: number;\n  /** Override render function which is passed the computed Ba/rGroups. */\n  children?: (barGroups: BarGroupHorizontalType<Key>[]) => ReactNode;\n};\n\nexport default function BarGroupHorizontal<\n  Datum extends DatumObject,\n  Key extends GroupKey = GroupKey,\n  Y0Scale extends AnyScaleBand = AnyScaleBand,\n  Y1Scale extends AnyScaleBand = AnyScaleBand,\n>({\n  data,\n  className,\n  top,\n  left,\n  x = (/** val */) => 0,\n  y0,\n  y0Scale,\n  y1Scale,\n  xScale,\n  color,\n  keys,\n  width,\n  children,\n  ...restProps\n}: AddSVGProps<BarGroupHorizontalProps<Datum, Key, Y0Scale, Y1Scale>, SVGRectElement>) {\n  const barHeight = getBandwidth(y1Scale);\n\n  const barGroups: BarGroupHorizontalType<Key>[] = data.map((group, i) => ({\n    index: i,\n    y0: y0Scale(y0(group)) || 0,\n    bars: keys.map((key, j) => {\n      const value = group[key];\n      return {\n        index: j,\n        key,\n        value,\n        height: barHeight,\n        x: x(value) || 0,\n        y: y1Scale(key) || 0,\n        color: color(key, j),\n        width: xScale(value) || 0,\n      };\n    }),\n  }));\n\n  if (children) return <>{children(barGroups)}</>;\n\n  return (\n    <Group className={cx('visx-bar-group-horizontal', className)} top={top} left={left}>\n      {barGroups.map((barGroup) => (\n        <Group key={`bar-group-${barGroup.index}-${barGroup.y0}`} top={barGroup.y0}>\n          {barGroup.bars.map((bar) => (\n            <Bar\n              key={`bar-group-bar-${barGroup.index}-${bar.index}-${bar.value}-${bar.key}`}\n              x={bar.x}\n              y={bar.y}\n              width={bar.width}\n              height={bar.height}\n              fill={bar.color}\n              {...restProps}\n            />\n          ))}\n        </Group>\n      ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/BarRounded.tsx",
    "content": "import type { ReactNode, Ref } from 'react';\nimport cx from 'classnames';\nimport type { AddSVGProps } from '../types';\n\nexport type BarRoundedProps = {\n  /** className to apply to path element. */\n  className?: string;\n  /** reference to path element. */\n  innerRef?: Ref<SVGPathElement>;\n  /** left position of the bar */\n  x: number;\n  /** top position of the bar */\n  y: number;\n  /** width of the bar starting from x */\n  width: number;\n  /** height of the bar starting from y */\n  height: number;\n  /** corner radius of the bar. clamped to center of the shorter side of the bar (Math.min(width,height) / 2) */\n  radius: number;\n  /** apply corner radius to top left corner, top right corner, bottom right corner, and bottom left corner */\n  all?: boolean;\n  /** apply corner radius to top left corner, and top right corner */\n  top?: boolean;\n  /** apply corner radius to bottom right corner, and bottom left corner */\n  bottom?: boolean;\n  /** apply corner radius to top left corner, and bottom left corner */\n  left?: boolean;\n  /** apply corner radius to top right corner, and bottom right corner */\n  right?: boolean;\n  /** apply corner radius to top left corner */\n  topLeft?: boolean;\n  /** apply corner radius to top right corner */\n  topRight?: boolean;\n  /** apply corner radius to bottom left corner */\n  bottomLeft?: boolean;\n  /** apply corner radius to bottom right */\n  bottomRight?: boolean;\n  /** Optional children override. */\n  children?: ({ path }: { path: string }) => ReactNode;\n};\n\n/** Hook that returns a BarRounded path. */\nexport function useBarRoundedPath({\n  all,\n  bottom,\n  bottomLeft,\n  bottomRight,\n  height,\n  left,\n  radius,\n  right,\n  top,\n  topLeft,\n  topRight,\n  width,\n  x,\n  y,\n}: Pick<\n  BarRoundedProps,\n  | 'all'\n  | 'top'\n  | 'bottom'\n  | 'left'\n  | 'right'\n  | 'x'\n  | 'y'\n  | 'width'\n  | 'height'\n  | 'radius'\n  | 'topLeft'\n  | 'topRight'\n  | 'bottomRight'\n  | 'bottomLeft'\n>) {\n  topRight = all || top || right || topRight;\n  bottomRight = all || bottom || right || bottomRight;\n  bottomLeft = all || bottom || left || bottomLeft;\n  topLeft = all || top || left || topLeft;\n\n  // clamp radius to center of shortest side of the rect\n  radius = Math.max(1, Math.min(radius, Math.min(width, height) / 2));\n\n  const diameter = 2 * radius;\n  const path = `M${x + radius},${y} h${width - diameter}\n ${topRight ? `a${radius},${radius} 0 0 1 ${radius},${radius}` : `h${radius}v${radius}`}\n v${height - diameter}\n ${bottomRight ? `a${radius},${radius} 0 0 1 ${-radius},${radius}` : `v${radius}h${-radius}`}\n h${diameter - width}\n ${bottomLeft ? `a${radius},${radius} 0 0 1 ${-radius},${-radius}` : `h${-radius}v${-radius}`}\n v${diameter - height}\n ${topLeft ? `a${radius},${radius} 0 0 1 ${radius},${-radius}` : `v${-radius}h${radius}`}\nz`\n    .split('\\n')\n    .join('');\n\n  return path;\n}\n\nexport default function BarRounded({\n  children,\n  className,\n  innerRef,\n  x,\n  y,\n  width,\n  height,\n  radius,\n  all = false,\n  top = false,\n  bottom = false,\n  left = false,\n  right = false,\n  topLeft = false,\n  topRight = false,\n  bottomLeft = false,\n  bottomRight = false,\n  ...restProps\n}: AddSVGProps<BarRoundedProps, SVGPathElement>) {\n  const path = useBarRoundedPath({\n    x,\n    y,\n    width,\n    height,\n    radius,\n    all,\n    top,\n    bottom,\n    left,\n    right,\n    topLeft,\n    topRight,\n    bottomLeft,\n    bottomRight,\n  });\n\n  if (children) return <>{children({ path })}</>;\n\n  return (\n    <path ref={innerRef} className={cx('visx-bar-rounded', className)} d={path} {...restProps} />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/BarStack.tsx",
    "content": "import cx from 'classnames';\nimport type { SeriesPoint } from '@visx/vendor/d3-shape';\nimport { stack as d3stack } from '@visx/vendor/d3-shape';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport type {\n  PositionScale,\n  AddSVGProps,\n  BarStack as BarStackType,\n  BaseBarStackProps,\n  StackKey,\n  Accessor,\n} from '../types';\nimport { getFirstItem, getSecondItem } from '../util/accessors';\nimport getBandwidth from '../util/getBandwidth';\nimport setNumOrAccessor from '../util/setNumberOrNumberAccessor';\nimport stackOrder from '../util/stackOrder';\nimport stackOffset from '../util/stackOffset';\nimport Bar from './Bar';\n\nexport type BarStackProps<\n  Datum,\n  Key extends StackKey = StackKey,\n  XScale extends PositionScale = PositionScale,\n  YScale extends PositionScale = PositionScale,\n> = BaseBarStackProps<Datum, Key, XScale, YScale> & {\n  /** Returns the value mapped to the x of a bar. */\n  x: Accessor<Datum, ScaleInput<XScale>>;\n  /** Returns the value mapped to the y0 of a bar. */\n  y0?: Accessor<SeriesPoint<Datum>, ScaleInput<YScale>>;\n  /** Returns the value mapped to the y1 of a bar. */\n  y1?: Accessor<SeriesPoint<Datum>, ScaleInput<YScale>>;\n};\n\nexport default function BarStack<\n  Datum,\n  Key extends StackKey = StackKey,\n  XScale extends PositionScale = PositionScale,\n  YScale extends PositionScale = PositionScale,\n>({\n  data,\n  className,\n  top,\n  left,\n  x,\n  y0 = getFirstItem,\n  y1 = getSecondItem,\n  xScale,\n  yScale,\n  color,\n  keys,\n  value,\n  order,\n  offset,\n  children,\n  ...restProps\n}: AddSVGProps<BarStackProps<Datum, Key, XScale, YScale>, SVGRectElement>) {\n  const stack = d3stack<Datum, Key>();\n  if (keys) stack.keys(keys);\n  if (value) setNumOrAccessor(stack.value, value);\n  if (order) stack.order(stackOrder(order));\n  if (offset) stack.offset(stackOffset(offset));\n\n  const stacks = stack(data);\n  const barWidth = getBandwidth(xScale);\n\n  const barStacks: BarStackType<Datum, Key>[] = stacks.map((barStack, i) => {\n    const { key } = barStack;\n    return {\n      index: i,\n      key,\n      bars: barStack.map((bar, j) => {\n        const barHeight = (yScale(y0(bar)) || 0) - (yScale(y1(bar)) || 0);\n        const barY = yScale(y1(bar));\n        const barX =\n          'bandwidth' in xScale\n            ? xScale(x(bar.data))\n            : Math.max((xScale(x(bar.data)) || 0) - barWidth / 2);\n\n        return {\n          bar,\n          key,\n          index: j,\n          height: barHeight,\n          width: barWidth,\n          x: barX || 0,\n          y: barY || 0,\n          color: color(barStack.key, j),\n        };\n      }),\n    };\n  });\n\n  if (children) return <>{children(barStacks)}</>;\n\n  return (\n    <Group className={cx('visx-bar-stack', className)} top={top} left={left}>\n      {barStacks.map((barStack) =>\n        barStack.bars.map((bar) => (\n          <Bar\n            key={`bar-stack-${barStack.index}-${bar.index}`}\n            x={bar.x}\n            y={bar.y}\n            height={bar.height}\n            width={bar.width}\n            fill={bar.color}\n            {...restProps}\n          />\n        )),\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/BarStackHorizontal.tsx",
    "content": "import cx from 'classnames';\nimport type { SeriesPoint } from '@visx/vendor/d3-shape';\nimport { stack as d3stack } from '@visx/vendor/d3-shape';\nimport { Group } from '@visx/group';\nimport type { ScaleInput } from '@visx/scale';\nimport type { AddSVGProps, PositionScale, BaseBarStackProps, StackKey, Accessor } from '../types';\nimport { getFirstItem, getSecondItem } from '../util/accessors';\nimport getBandwidth from '../util/getBandwidth';\nimport setNumOrAccessor from '../util/setNumberOrNumberAccessor';\nimport stackOrder from '../util/stackOrder';\nimport stackOffset from '../util/stackOffset';\nimport Bar from './Bar';\n\nexport type BarStackHorizontalProps<\n  Datum,\n  Key extends StackKey = StackKey,\n  XScale extends PositionScale = PositionScale,\n  YScale extends PositionScale = PositionScale,\n> = BaseBarStackProps<Datum, Key, XScale, YScale> & {\n  /** Returns the value mapped to the x0 of a bar. */\n  x0?: Accessor<SeriesPoint<Datum>, ScaleInput<XScale>>;\n  /** Returns the value mapped to the x1 of a bar. */\n  x1?: Accessor<SeriesPoint<Datum>, ScaleInput<XScale>>;\n  /** Returns the value mapped to the y of a bar. */\n  y: Accessor<Datum, ScaleInput<YScale>>;\n};\n\nexport default function BarStackHorizontal<\n  Datum,\n  Key extends StackKey = StackKey,\n  XScale extends PositionScale = PositionScale,\n  YScale extends PositionScale = PositionScale,\n>({\n  data,\n  className,\n  top,\n  left,\n  y,\n  x0 = getFirstItem,\n  x1 = getSecondItem,\n  xScale,\n  yScale,\n  color,\n  keys,\n  value,\n  order,\n  offset,\n  children,\n  ...restProps\n}: AddSVGProps<BarStackHorizontalProps<Datum, Key, XScale, YScale>, SVGRectElement>) {\n  const stack = d3stack<Datum, Key>();\n  if (keys) stack.keys(keys);\n  if (value) setNumOrAccessor(stack.value, value);\n  if (order) stack.order(stackOrder(order));\n  if (offset) stack.offset(stackOffset(offset));\n\n  const stacks = stack(data);\n  const barHeight = getBandwidth(yScale);\n\n  const barStacks = stacks.map((barStack, i) => {\n    const { key } = barStack;\n    return {\n      index: i,\n      key,\n      bars: barStack.map((bar, j) => {\n        const barWidth = (xScale(x1(bar)) || 0) - (xScale(x0(bar)) || 0);\n        const barX = xScale(x0(bar));\n        const barY =\n          'bandwidth' in yScale\n            ? yScale(y(bar.data))\n            : Math.max((yScale(y(bar.data)) || 0) - barWidth / 2);\n        return {\n          bar,\n          key,\n          index: j,\n          height: barHeight,\n          width: barWidth,\n          x: barX || 0,\n          y: barY || 0,\n          color: color(barStack.key, j),\n        };\n      }),\n    };\n  });\n\n  if (children) return <>{children(barStacks)}</>;\n\n  return (\n    <Group className={cx('visx-bar-stack-horizontal', className)} top={top} left={left}>\n      {barStacks.map((barStack) =>\n        barStack.bars.map((bar) => (\n          <Bar\n            key={`bar-stack-${barStack.index}-${bar.index}`}\n            x={bar.x}\n            y={bar.y}\n            height={bar.height}\n            width={bar.width}\n            fill={bar.color}\n            {...restProps}\n          />\n        )),\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Circle.tsx",
    "content": "import type { Ref } from 'react';\nimport cx from 'classnames';\nimport type { AddSVGProps } from '../types';\n\nexport type CircleProps = {\n  /** className to apply to circle element. */\n  className?: string;\n  /** reference to circle element. */\n  innerRef?: Ref<SVGCircleElement>;\n};\n\nexport default function Circle({\n  className,\n  innerRef,\n  ...restProps\n}: AddSVGProps<CircleProps, SVGCircleElement>) {\n  return <circle ref={innerRef} className={cx('visx-circle', className)} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Line.tsx",
    "content": "import type { Ref } from 'react';\nimport cx from 'classnames';\nimport type { AddSVGProps } from '../types';\n\ninterface Point {\n  x?: number;\n  y?: number;\n}\n\nexport type LineProps = {\n  /** className to apply to line element. */\n  className?: string;\n  /** reference to line element. */\n  innerRef?: Ref<SVGLineElement>;\n  /** fill color applied to line element. */\n  fill?: string;\n  /** Starting x,y point of the line. */\n  from?: Point;\n  /** Ending x,y point of the line. */\n  to?: Point;\n};\n\nexport default function Line({\n  from = { x: 0, y: 0 },\n  to = { x: 1, y: 1 },\n  fill = 'transparent',\n  className,\n  innerRef,\n  ...restProps\n}: AddSVGProps<LineProps, SVGLineElement>) {\n  const isRectilinear = from.x === to.x || from.y === to.y;\n  return (\n    <line\n      ref={innerRef}\n      className={cx('visx-line', className)}\n      x1={from.x}\n      y1={from.y}\n      x2={to.x}\n      y2={to.y}\n      fill={fill}\n      shapeRendering={isRectilinear ? 'crispEdges' : 'auto'}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/LinePath.tsx",
    "content": "import type { Ref, ReactNode } from 'react';\nimport cx from 'classnames';\nimport type { Line as LineType } from '@visx/vendor/d3-shape';\nimport type { AddSVGProps, LinePathConfig } from '../types';\nimport { line } from '../util/D3ShapeFactories';\n\nexport type LinePathProps<Datum> = {\n  /** Array of data for which to generate a line shape. */\n  data?: Datum[];\n  /** React RefObject passed to the path element. */\n  innerRef?: Ref<SVGPathElement>;\n  /** Override render function which is passed the configured path generator as input. */\n  children?: (args: { path: LineType<Datum> }) => ReactNode;\n  /** Fill color of the path element. */\n  fill?: string;\n  /** className applied to path element. */\n  className?: string;\n} & LinePathConfig<Datum>;\n\nexport default function LinePath<Datum>({\n  children,\n  data = [],\n  x,\n  y,\n  fill = 'transparent',\n  className,\n  curve,\n  innerRef,\n  defined = () => true,\n  ...restProps\n}: AddSVGProps<LinePathProps<Datum>, SVGPathElement>) {\n  const path = line<Datum>({ x, y, defined, curve });\n  if (children) return <>{children({ path })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-linepath', className)}\n      d={path(data) || ''}\n      fill={fill}\n      // without this a datum surrounded by nulls will not be visible\n      // https://github.com/d3/d3-shape#line_defined\n      strokeLinecap=\"round\"\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/LineRadial.tsx",
    "content": "import type { ReactNode } from 'react';\nimport cx from 'classnames';\nimport type { RadialLine } from '@visx/vendor/d3-shape';\nimport type { LinePathProps } from './LinePath';\nimport type { AddSVGProps, RadialLinePathConfig } from '../types';\nimport { radialLine } from '../util/D3ShapeFactories';\n\nexport type LineRadialProps<Datum> = Pick<\n  LinePathProps<Datum>,\n  'className' | 'data' | 'fill' | 'innerRef'\n> & {\n  /** Override render function which is passed the configured path generator as input. */\n  children?: (args: { path: RadialLine<Datum> }) => ReactNode;\n} & RadialLinePathConfig<Datum>;\n\nexport default function LineRadial<Datum>({\n  className,\n  angle,\n  radius,\n  defined,\n  curve,\n  data = [],\n  innerRef,\n  children,\n  fill = 'transparent',\n  ...restProps\n}: AddSVGProps<LineRadialProps<Datum>, SVGPathElement>) {\n  const path = radialLine<Datum>({\n    angle,\n    radius,\n    defined,\n    curve,\n  });\n  if (children) return <>{children({ path })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-line-radial', className)}\n      d={path(data) || ''}\n      fill={fill}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Pie.tsx",
    "content": "import type { ReactNode } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type {\n  Arc as ArcType,\n  PieArcDatum as PieArcDatumType,\n  Pie as PieType,\n} from '@visx/vendor/d3-shape';\nimport type { $TSFIXME, AddSVGProps, ArcPathConfig, PiePathConfig } from '../types';\nimport { arc as arcPath, pie as piePath } from '../util/D3ShapeFactories';\n\nexport type PieArcDatum<Datum> = PieArcDatumType<Datum>;\n\ntype StringAccessor<Datum> = (pieArcDatum: PieArcDatum<Datum>) => string;\n\nexport type ProvidedProps<Datum> = {\n  path: ArcType<$TSFIXME, PieArcDatum<Datum>>;\n  arcs: PieArcDatum<Datum>[];\n  pie: PieType<$TSFIXME, Datum>;\n};\n\nexport type PieProps<Datum> = {\n  /** className applied to path element. */\n  className?: string;\n  /** Top offset of rendered Pie. */\n  top?: number;\n  /** Left offset of rendered Pie. */\n  left?: number;\n  /** Array of data to generate a Pie for. */\n  data?: Datum[];\n  /** Optional render function invoked for each Datum to render something (e.g., a Label) at each pie centroid. */\n  centroid?: (xyCoords: [number, number], arc: PieArcDatum<Datum>) => ReactNode;\n  // These three fields are renamed\n  /** Invoked for each datum, returns the value for a given Pie segment/arc datum. */\n  pieValue?: PiePathConfig<Datum>['value'];\n  /** Comparator function to sort *arcs*, overridden by pieSortValues if defined. If pieSort and pieSortValues are null, arcs match input data order. */\n  pieSort?: PiePathConfig<Datum>['sort'];\n  /** Comparator function to sort arc *values*, overrides pieSort if defined. If pieSort and pieSortValues are null, arcs match input data order. */\n  pieSortValues?: PiePathConfig<Datum>['sortValues'];\n  /** Render function override which is passed the configured arc generator as input. */\n  children?: (provided: ProvidedProps<Datum>) => ReactNode;\n  /** Optional accessor function to return the fill string value of a given arc. */\n  fill?: string | StringAccessor<Datum>;\n} & Pick<PiePathConfig<Datum>, 'startAngle' | 'endAngle' | 'padAngle'> &\n  Pick<\n    ArcPathConfig<PieArcDatum<Datum>>,\n    'innerRadius' | 'outerRadius' | 'cornerRadius' | 'padRadius'\n  >;\n\nexport default function Pie<Datum>({\n  className,\n  top,\n  left,\n  data = [],\n  centroid,\n  innerRadius = 0,\n  outerRadius,\n  cornerRadius,\n  startAngle,\n  endAngle,\n  padAngle,\n  padRadius,\n  pieSort,\n  pieSortValues,\n  pieValue,\n  children,\n  fill = '',\n  ...restProps\n}: AddSVGProps<PieProps<Datum>, SVGPathElement>) {\n  const path = arcPath<PieArcDatum<Datum>>({\n    innerRadius,\n    outerRadius,\n    cornerRadius,\n    padRadius,\n  });\n\n  const pie = piePath<Datum>({\n    startAngle,\n    endAngle,\n    padAngle,\n    value: pieValue,\n    sort: pieSort,\n    sortValues: pieSortValues,\n  });\n\n  const arcs = pie(data);\n  if (children) return <>{children({ arcs, path, pie })}</>;\n\n  return (\n    <Group className=\"visx-pie-arcs-group\" top={top} left={left}>\n      {arcs.map((arc, i) => (\n        <g key={`pie-arc-${i}`}>\n          <path\n            className={cx('visx-pie-arc', className)}\n            d={path(arc) || ''}\n            fill={fill == null || typeof fill === 'string' ? fill : fill(arc)}\n            {...restProps}\n          />\n          {centroid?.(path.centroid(arc), arc)}\n        </g>\n      ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Polygon.tsx",
    "content": "import type { ReactNode, Ref } from 'react';\nimport cx from 'classnames';\nimport { degreesToRadians } from '../util/trigonometry';\nimport type { AddSVGProps } from '../types';\n\nconst DEFAULT_CENTER = { x: 0, y: 0 };\n\nexport const getPoint = ({\n  sides = 4,\n  size = 25,\n  center = DEFAULT_CENTER,\n  rotate = 0,\n  side,\n}: { side: number } & NonNullable<Pick<PolygonProps, 'sides' | 'size' | 'center' | 'rotate'>>) => {\n  const degrees = (360 / sides) * side - rotate;\n  const radians = degreesToRadians(degrees);\n\n  return {\n    x: center.x + size * Math.cos(radians),\n    y: center.y + size * Math.sin(radians),\n  };\n};\n\nexport const getPoints = ({\n  sides,\n  size,\n  center,\n  rotate,\n}: NonNullable<Pick<PolygonProps, 'sides' | 'size' | 'center' | 'rotate'>>) =>\n  new Array(sides).fill(0).map((_, side) =>\n    getPoint({\n      sides,\n      size,\n      center,\n      rotate,\n      side,\n    }),\n  );\n\nexport type PolygonProps = {\n  /** Number of polygon sides. */\n  sides?: number;\n  /** Size of the shape. */\n  size?: number;\n  /** Points to use to render the polygon. If this is defined, `sides`, `size`, `rotate`, and `center` are ignored. */\n  points?: [number, number][];\n  /** className to apply to polygon element. */\n  className?: string;\n  /** Rotation transform to apply to polygon. */\n  rotate?: number;\n  /** Render function override which is passed the generated polygon points. */\n  children?: (args: { points: [number, number][] }) => ReactNode;\n  /** Reference to polygon element. */\n  innerRef?: Ref<SVGPolygonElement>;\n  /** Polygon center position. */\n  center?: {\n    x: number;\n    y: number;\n  };\n};\n\nexport default function Polygon({\n  sides = 4,\n  size = 25,\n  center = DEFAULT_CENTER,\n  rotate = 0,\n  className,\n  children,\n  innerRef,\n  points,\n  ...restProps\n}: AddSVGProps<PolygonProps, SVGPolygonElement>) {\n  const pointsToRender: [number, number][] =\n    points ||\n    getPoints({\n      sides,\n      size,\n      center,\n      rotate,\n    }).map(({ x, y }) => [x, y]);\n\n  if (children) return <>{children({ points: pointsToRender })}</>;\n\n  return (\n    <polygon\n      ref={innerRef}\n      className={cx('visx-polygon', className)}\n      points={pointsToRender.join(' ')}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/SplitLinePath.tsx",
    "content": "import { useMemo, Fragment } from 'react';\nimport type { ReactNode, SVGProps } from 'react';\nimport type { GetLineSegmentsConfig } from '../util/getSplitLineSegments';\nimport getSplitLineSegments from '../util/getSplitLineSegments';\nimport { line } from '../util/D3ShapeFactories';\nimport type { LinePathConfig } from '../types';\nimport LinePath from './LinePath';\n\ninterface Point {\n  x: number;\n  y: number;\n}\n\nconst getX = (d: Point) => d.x || 0;\nconst getY = (d: Point) => d.y || 0;\n\nexport type SplitLinePathRenderer = (renderProps: {\n  index: number;\n  segment: { x: number; y: number }[];\n  styles?: Omit<SVGProps<SVGPathElement>, 'x' | 'y' | 'children'>;\n}) => ReactNode;\n\nexport type SplitLinePathProps<Datum> = {\n  /** Array of data segments, where each segment will be a separate path in the rendered line. */\n  segments: Datum[][];\n  /** Styles to apply to each segment. If fewer styles are specified than the number of segments, they will be re-used. */\n  styles: Omit<SVGProps<SVGPathElement>, 'x' | 'y' | 'children'>[];\n  /** Override render function which is passed the configured path generator as input. */\n  children?: SplitLinePathRenderer;\n  /** className applied to path element. */\n  className?: string;\n} & LinePathConfig<Datum> &\n  Pick<GetLineSegmentsConfig, 'segmentation' | 'sampleRate'>;\n\nexport default function SplitLinePath<Datum>({\n  children,\n  className,\n  curve,\n  defined,\n  segmentation,\n  sampleRate,\n  segments,\n  x,\n  y,\n  styles,\n}: SplitLinePathProps<Datum>) {\n  // Convert data in all segments to points.\n  const pointsInSegments = useMemo(() => {\n    const xFn = typeof x === 'number' || typeof x === 'undefined' ? () => x : x;\n    const yFn = typeof y === 'number' || typeof y === 'undefined' ? () => y : y;\n    return segments.map((s) => s.map((value, i) => ({ x: xFn(value, i, s), y: yFn(value, i, s) })));\n  }, [x, y, segments]);\n\n  const pathString = useMemo(() => {\n    const path = line<Datum>({ x, y, defined, curve });\n    return path(segments.flat()) || '';\n  }, [x, y, defined, curve, segments]);\n\n  const splitLineSegments = useMemo(\n    () =>\n      getSplitLineSegments({\n        path: pathString,\n        segmentation,\n        pointsInSegments,\n        sampleRate,\n      }),\n    [pathString, segmentation, pointsInSegments, sampleRate],\n  );\n\n  return (\n    <g>\n      {splitLineSegments.map((segment, index) =>\n        children ? (\n          <Fragment key={index}>\n            {children({ index, segment, styles: styles[index] || styles[index % styles.length] })}\n          </Fragment>\n        ) : (\n          <LinePath\n            key={index}\n            className={className}\n            data={segment}\n            x={getX}\n            y={getY}\n            {...(styles[index] || styles[index % styles.length])}\n          />\n        ),\n      )}\n    </g>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/Stack.tsx",
    "content": "import type { ReactNode } from 'react';\nimport cx from 'classnames';\nimport { Group } from '@visx/group';\nimport type {\n  Area as AreaType,\n  Stack as StackType,\n  SeriesPoint,\n  Series,\n} from '@visx/vendor/d3-shape';\nimport type {\n  $TSFIXME,\n  AddSVGProps,\n  AccessorForArrayItem,\n  StackKey,\n  BaseStackProps,\n  AreaPathConfig,\n} from '../types';\nimport { area, stack as stackPath } from '../util/D3ShapeFactories';\n\nexport type StackProps<Datum, Key> = BaseStackProps<Datum, Key> & {\n  /** Returns a color for a given stack key and index. */\n  color?: (key: Key, index: number) => string;\n  /** Override render function which is passed the configured arc generator as input. */\n  children?: (args: {\n    stacks: Series<Datum, Key>[];\n    path: AreaType<SeriesPoint<Datum>>;\n    stack: StackType<$TSFIXME, Datum, Key>;\n  }) => ReactNode;\n  /** Sets the x0 accessor function, and sets x1 to null. */\n  x?: AccessorForArrayItem<SeriesPoint<Datum>, number>;\n  /** Specifies the x0 accessor function which defaults to d => d[0]. */\n  x0?: AccessorForArrayItem<SeriesPoint<Datum>, number>;\n  /** Specifies the x1 accessor function which defaults to null. */\n  x1?: AccessorForArrayItem<SeriesPoint<Datum>, number>;\n  /** Specifies the y0 accessor function which defaults to d => 0. */\n  y0?: AccessorForArrayItem<SeriesPoint<Datum>, number>;\n  /** Specifies the y1 accessor function which defaults to d => d[1]. */\n  y1?: AccessorForArrayItem<SeriesPoint<Datum>, number>;\n} & Pick<AreaPathConfig<SeriesPoint<Datum>>, 'defined' | 'curve'>;\n\nexport default function Stack<Datum, Key extends StackKey = StackKey>({\n  className,\n  top,\n  left,\n  keys,\n  data,\n  curve,\n  defined,\n  x,\n  x0,\n  x1,\n  y0,\n  y1,\n  value,\n  order,\n  offset,\n  color,\n  children,\n  ...restProps\n}: AddSVGProps<StackProps<Datum, Key>, SVGPathElement>) {\n  const stack = stackPath<Datum, Key>({ keys, value, order, offset });\n  const path = area<SeriesPoint<Datum>>({\n    x,\n    x0,\n    x1,\n    y0,\n    y1,\n    curve,\n    defined,\n  });\n\n  const stacks = stack(data);\n\n  if (children) return <>{children({ stacks, path, stack })}</>;\n\n  return (\n    <Group top={top} left={left}>\n      {stacks.map((series, i) => (\n        <path\n          className={cx('visx-stack', className)}\n          key={`stack-${i}-${series.key || ''}`}\n          d={path(series) || ''}\n          fill={color?.(series.key, i)}\n          {...restProps}\n        />\n      ))}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/curve/LinkHorizontalCurve.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getY, getX, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathHorizontalCurve<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n  percent,\n}: Required<AccessorProps<Link, Node>> & { percent: number }) {\n  return (link: Link) => {\n    const sourceData = source(link);\n    const targetData = target(link);\n\n    const sx = x(sourceData);\n    const sy = y(sourceData);\n    const tx = x(targetData);\n    const ty = y(targetData);\n\n    const dx = tx - sx;\n    const dy = ty - sy;\n    const ix = percent * (dx + dy);\n    const iy = percent * (dy - dx);\n\n    const path = d3Path();\n    path.moveTo(sx, sy);\n    path.bezierCurveTo(sx + ix, sy + iy, tx + iy, ty - ix, tx, ty);\n\n    return path.toString();\n  };\n}\n\nexport type LinkHorizontalCurveProps<Link, Node> = AccessorProps<Link, Node> &\n  SharedLinkProps<Link> & {\n    percent?: number;\n  };\n\nexport default function LinkHorizontalCurve<Link, Node>({\n  className,\n  children,\n  data,\n  innerRef,\n  path,\n  percent = 0.2,\n  x = getY, // note this returns a y value\n  y = getX, // note this returns an x value\n  source = getSource,\n  target = getTarget,\n  ...restProps\n}: AddSVGProps<LinkHorizontalCurveProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathHorizontalCurve({ source, target, x, y, percent });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-horizontal-curve', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/curve/LinkRadialCurve.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathRadialCurve<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n  percent,\n}: Required<AccessorProps<Link, Node>> & { percent: number }) {\n  return (link: Link) => {\n    const sourceData = source(link);\n    const targetData = target(link);\n\n    const sa = x(sourceData) - Math.PI / 2;\n    const sr = y(sourceData);\n    const ta = x(targetData) - Math.PI / 2;\n    const tr = y(targetData);\n\n    const sc = Math.cos(sa);\n    const ss = Math.sin(sa);\n    const tc = Math.cos(ta);\n    const ts = Math.sin(ta);\n\n    const sx = sr * sc;\n    const sy = sr * ss;\n    const tx = tr * tc;\n    const ty = tr * ts;\n\n    const dx = tx - sx;\n    const dy = ty - sy;\n    const ix = percent * (dx + dy);\n    const iy = percent * (dy - dx);\n\n    const path = d3Path();\n    path.moveTo(sx, sy);\n    path.bezierCurveTo(sx + ix, sy + iy, tx + iy, ty - ix, tx, ty);\n\n    return path.toString();\n  };\n}\n\nexport type LinkRadialCurveProps<Link, Node> = {\n  percent?: number;\n} & AccessorProps<Link, Node> &\n  SharedLinkProps<Link>;\n\nexport default function LinkRadialCurve<Link, Node>({\n  className,\n  children,\n  data,\n  innerRef,\n  path,\n  percent = 0.2,\n  x = getX,\n  y = getY,\n  source = getSource,\n  target = getTarget,\n  ...restProps\n}: AddSVGProps<LinkRadialCurveProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathRadialCurve({ source, target, x, y, percent });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-radial-curve', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/curve/LinkVerticalCurve.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathVerticalCurve<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n  percent,\n}: Required<AccessorProps<Link, Node>> & { percent: number }) {\n  return (link: Link) => {\n    const sourceData = source(link);\n    const targetData = target(link);\n\n    const sx = x(sourceData);\n    const sy = y(sourceData);\n    const tx = x(targetData);\n    const ty = y(targetData);\n\n    const dx = tx - sx;\n    const dy = ty - sy;\n    const ix = percent * (dx + dy);\n    const iy = percent * (dy - dx);\n\n    const path = d3Path();\n    path.moveTo(sx, sy);\n    path.bezierCurveTo(sx + ix, sy + iy, tx + iy, ty - ix, tx, ty);\n\n    return path.toString();\n  };\n}\n\nexport type LinkVerticalCurveProps<Link, Node> = {\n  percent?: number;\n} & AccessorProps<Link, Node> &\n  SharedLinkProps<Link>;\n\nexport default function LinkVerticalCurve<Link, Node>({\n  className,\n  children,\n  data,\n  innerRef,\n  path,\n  percent = 0.2,\n  x = getX,\n  y = getY,\n  source = getSource,\n  target = getTarget,\n  ...restProps\n}: AddSVGProps<LinkVerticalCurveProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathVerticalCurve({ source, target, x, y, percent });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-vertical-curve', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/diagonal/LinkHorizontal.tsx",
    "content": "import cx from 'classnames';\nimport { linkHorizontal } from '@visx/vendor/d3-shape';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getY, getX, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathHorizontalDiagonal<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n}: Required<AccessorProps<Link, Node>>) {\n  return (data: Link) => {\n    const link = linkHorizontal<Link, Node>();\n    link.x(x);\n    link.y(y);\n    link.source(source);\n    link.target(target);\n    return link(data);\n  };\n}\n\nexport type LinkHorizontalDiagonalProps<Link, Node> = AccessorProps<Link, Node> &\n  SharedLinkProps<Link>;\n\nexport default function LinkHorizontalDiagonal<Link, Node>({\n  className,\n  children,\n  data,\n  innerRef,\n  path,\n  x = getY, // note this returns a y value\n  y = getX, // note this returns an x value\n  source = getSource,\n  target = getTarget,\n  ...restProps\n}: AddSVGProps<LinkHorizontalDiagonalProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathHorizontalDiagonal({ source, target, x, y });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-horizontal-diagonal', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/diagonal/LinkRadial.tsx",
    "content": "import cx from 'classnames';\nimport { linkRadial } from '@visx/vendor/d3-shape';\nimport type { SharedLinkProps, RadialAccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathRadialDiagonal<Link, Node>({\n  source,\n  target,\n  angle,\n  radius,\n}: Required<RadialAccessorProps<Link, Node>>) {\n  return (data: Link) => {\n    const link = linkRadial<Link, Node>();\n    link.angle(angle);\n    link.radius(radius);\n    link.source(source);\n    link.target(target);\n    return link(data);\n  };\n}\n\ntype LinkRadialDiagonalProps<Link, Node> = {\n  angle: (node: Node) => number;\n  radius: (node: Node) => number;\n} & RadialAccessorProps<Link, Node> &\n  SharedLinkProps<Link>;\n\nexport default function LinkRadialDiagonal<Link, Node>({\n  className,\n  children,\n  data,\n  innerRef,\n  path,\n  angle = getX,\n  radius = getY,\n  source = getSource,\n  target = getTarget,\n  ...restProps\n}: AddSVGProps<LinkRadialDiagonalProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathRadialDiagonal({ source, target, angle, radius });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-radial-diagonal', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/diagonal/LinkVertical.tsx",
    "content": "import cx from 'classnames';\nimport { linkVertical } from '@visx/vendor/d3-shape';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathVerticalDiagonal<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n}: Required<AccessorProps<Link, Node>>) {\n  return (data: Link) => {\n    const link = linkVertical<Link, Node>();\n    link.x(x);\n    link.y(y);\n    link.source(source);\n    link.target(target);\n    return link(data);\n  };\n}\n\ntype LinkVerticalDiagonalProps<Link, Node> = AccessorProps<Link, Node> & SharedLinkProps<Link>;\n\nexport default function LinkVerticalDiagonal<Link, Node>({\n  className,\n  children,\n  data,\n  innerRef,\n  path,\n  x = getX,\n  y = getY,\n  source = getSource,\n  target = getTarget,\n  ...restProps\n}: AddSVGProps<LinkVerticalDiagonalProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathVerticalDiagonal({ source, target, x, y });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-vertical-diagonal', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/line/LinkHorizontalLine.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getY, getX, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathHorizontalLine<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n}: Required<AccessorProps<Link, Node>>) {\n  return (data: Link) => {\n    const sourceData = source(data);\n    const targetData = target(data);\n\n    const sx = x(sourceData);\n    const sy = y(sourceData);\n    const tx = x(targetData);\n    const ty = y(targetData);\n\n    const path = d3Path();\n    path.moveTo(sx, sy);\n    path.lineTo(tx, ty);\n\n    return path.toString();\n  };\n}\n\nexport type LinkHorizontalLineProps<Link, Node> = AccessorProps<Link, Node> & SharedLinkProps<Link>;\n\nexport default function LinkHorizontalLine<Link, Node>({\n  className,\n  children,\n  innerRef,\n  data,\n  path,\n  x = getY, // note this returns a y value\n  y = getX, // note this returns a x value\n  source = getSource,\n  target = getTarget,\n  ...restProps\n}: AddSVGProps<LinkHorizontalLineProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathHorizontalLine({ source, target, x, y });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-horizontal-line', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/line/LinkRadialLine.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathRadialLine<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n}: Required<AccessorProps<Link, Node>>) {\n  return (data: Link) => {\n    const sourceData = source(data);\n    const targetData = target(data);\n\n    const sa = x(sourceData) - Math.PI / 2;\n    const sr = y(sourceData);\n    const ta = x(targetData) - Math.PI / 2;\n    const tr = y(targetData);\n\n    const sc = Math.cos(sa);\n    const ss = Math.sin(sa);\n    const tc = Math.cos(ta);\n    const ts = Math.sin(ta);\n\n    const path = d3Path();\n    path.moveTo(sr * sc, sr * ss);\n    path.lineTo(tr * tc, tr * ts);\n\n    return path.toString();\n  };\n}\n\nexport type LinkRadialLineProps<Link, Node> = AccessorProps<Link, Node> & SharedLinkProps<Link>;\n\nexport default function LinkRadialLine<Link, Node>({\n  className,\n  innerRef,\n  data,\n  path,\n  x = getX,\n  y = getY,\n  source = getSource,\n  target = getTarget,\n  children,\n  ...restProps\n}: AddSVGProps<LinkRadialLineProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathRadialLine({ source, target, x, y });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-radial-line', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/line/LinkVerticalLine.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathVerticalLine<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n}: Required<AccessorProps<Link, Node>>) {\n  return (data: Link) => {\n    const sourceData = source(data);\n    const targetData = target(data);\n\n    const sx = x(sourceData);\n    const sy = y(sourceData);\n    const tx = x(targetData);\n    const ty = y(targetData);\n\n    const path = d3Path();\n    path.moveTo(sx, sy);\n    path.lineTo(tx, ty);\n\n    return path.toString();\n  };\n}\n\nexport type LinkVerticalLineProps<Link, Node> = AccessorProps<Link, Node> & SharedLinkProps<Link>;\n\nexport default function LinkVerticalLine<Link, Node>({\n  className,\n  innerRef,\n  data,\n  path,\n  x = getX,\n  y = getY,\n  source = getSource,\n  target = getTarget,\n  children,\n  ...restProps\n}: AddSVGProps<LinkVerticalLineProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathVerticalLine({ source, target, x, y });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-vertical-line', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/step/LinkHorizontalStep.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathHorizontalStep<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n  percent,\n}: Required<AccessorProps<Link, Node>> & { percent: number }) {\n  return (link: Link) => {\n    const sourceData = source(link);\n    const targetData = target(link);\n\n    const sx = x(sourceData);\n    const sy = y(sourceData);\n    const tx = x(targetData);\n    const ty = y(targetData);\n\n    const path = d3Path();\n    path.moveTo(sx, sy);\n    path.lineTo(sx + (tx - sx) * percent, sy);\n    path.lineTo(sx + (tx - sx) * percent, ty);\n    path.lineTo(tx, ty);\n\n    return path.toString();\n  };\n}\n\ntype LinkHorizontalStepProps<Link, Node> = {\n  percent?: number;\n} & AccessorProps<Link, Node> &\n  SharedLinkProps<Link>;\n\nexport default function LinkHorizontalStep<Link, Node>({\n  className,\n  innerRef,\n  data,\n  path,\n  percent = 0.5,\n  x = getY, // note this returns a y value\n  y = getX, // note this returns a x value\n  source = getSource,\n  target = getTarget,\n  children,\n  ...restProps\n}: AddSVGProps<LinkHorizontalStepProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathHorizontalStep({ source, target, x, y, percent });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-horizontal-step', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/step/LinkRadialStep.tsx",
    "content": "import cx from 'classnames';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathRadialStep<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n}: Required<AccessorProps<Link, Node>>) {\n  return (link: Link) => {\n    const sourceData = source(link);\n    const targetData = target(link);\n\n    const sx = x(sourceData);\n    const sy = y(sourceData);\n    const tx = x(targetData);\n    const ty = y(targetData);\n\n    const sa = sx - Math.PI / 2;\n    const sr = sy;\n    const ta = tx - Math.PI / 2;\n    const tr = ty;\n\n    const sc = Math.cos(sa);\n    const ss = Math.sin(sa);\n    const tc = Math.cos(ta);\n    const ts = Math.sin(ta);\n    const sf = Math.abs(ta - sa) > Math.PI ? ta <= sa : ta > sa;\n\n    return `\n      M${sr * sc},${sr * ss}\n      A${sr},${sr},0,0,${sf ? 1 : 0},${sr * tc},${sr * ts}\n      L${tr * tc},${tr * ts}\n    `;\n  };\n}\n\ntype LinkRadialStepProps<Link, Node> = {\n  percent?: number;\n} & AccessorProps<Link, Node> &\n  SharedLinkProps<Link>;\n\nexport default function LinkRadialStep<Link, Node>({\n  className,\n  innerRef,\n  data,\n  path,\n  x = getX,\n  y = getY,\n  source = getSource,\n  target = getTarget,\n  children,\n  ...restProps\n}: AddSVGProps<LinkRadialStepProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathRadialStep({ source, target, x, y });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-radial-step', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/shapes/link/step/LinkVerticalStep.tsx",
    "content": "import cx from 'classnames';\nimport { path as d3Path } from '@visx/vendor/d3-path';\nimport type { SharedLinkProps, AccessorProps, AddSVGProps } from '../../../types';\nimport { getX, getY, getSource, getTarget } from '../../../util/accessors';\n\nexport function pathVerticalStep<Link, Node>({\n  source,\n  target,\n  x,\n  y,\n  percent,\n}: Required<AccessorProps<Link, Node>> & { percent: number }) {\n  return (link: Link) => {\n    const sourceData = source(link);\n    const targetData = target(link);\n\n    const sx = x(sourceData);\n    const sy = y(sourceData);\n    const tx = x(targetData);\n    const ty = y(targetData);\n\n    const path = d3Path();\n    path.moveTo(sx, sy);\n    path.lineTo(sx, sy + (ty - sy) * percent);\n    path.lineTo(tx, sy + (ty - sy) * percent);\n    path.lineTo(tx, ty);\n\n    return path.toString();\n  };\n}\n\ntype LinkVerticalStepProps<Link, Node> = {\n  percent?: number;\n} & AccessorProps<Link, Node> &\n  SharedLinkProps<Link>;\n\nexport default function LinkVerticalStep<Link, Node>({\n  className,\n  innerRef,\n  data,\n  path,\n  percent = 0.5,\n  x = getX,\n  y = getY,\n  source = getSource,\n  target = getTarget,\n  children,\n  ...restProps\n}: AddSVGProps<LinkVerticalStepProps<Link, Node>, SVGPathElement>) {\n  const pathGen = path || pathVerticalStep({ source, target, x, y, percent });\n  if (children) return <>{children({ path: pathGen })}</>;\n  return (\n    <path\n      ref={innerRef}\n      className={cx('visx-link visx-link-vertical-step', className)}\n      d={pathGen(data) || ''}\n      {...restProps}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-shape/src/types/D3ShapeConfig.ts",
    "content": "import type { CurveFactory, CurveFactoryLineOnly } from '@visx/vendor/d3-shape';\nimport type { Accessor, AccessorForArrayItem } from './accessor';\nimport type { STACK_OFFSETS } from '../util/stackOffset';\nimport type { STACK_ORDERS } from '../util/stackOrder';\n\nexport type ArcPathConfig<Datum> = {\n  /** Number or accessor function which returns a number, which defines the arc innerRadius. */\n  innerRadius?: number | Accessor<Datum, number>;\n  /** Number or accessor function which returns a number, which defines the arc outerRadius. */\n  outerRadius?: number | Accessor<Datum, number>;\n  /** Number or accessor function which returns a number, which defines the arc cornerRadius. */\n  cornerRadius?: number | Accessor<Datum, number>;\n  /** Number or accessor function which returns a number, which defines the arc startAngle. */\n  startAngle?: number | Accessor<Datum, number>;\n  /** Number or accessor function which returns a number, which defines the arc endAngle. */\n  endAngle?: number | Accessor<Datum, number>;\n  /** Number or accessor function which returns a number, which defines the arc padAngle. */\n  padAngle?: number | Accessor<Datum, number>;\n  /** Number or accessor function which returns a number, which defines the arc padRadius. */\n  padRadius?: number | Accessor<Datum, number>;\n};\n\nexport type AreaPathConfig<Datum> = {\n  /** The defined accessor for the shape. The final area shape includes all points for which this function returns true. By default all points are defined. */\n  defined?: AccessorForArrayItem<Datum, boolean>;\n  /** Sets the curve factory (from @visx/curve or d3-curve) for the area generator. Defaults to curveLinear. */\n  curve?: CurveFactory;\n  /** Sets the x0 accessor function, and sets x1 to null. */\n  x?: number | AccessorForArrayItem<Datum, number>;\n  /** Specifies the x0 accessor function which defaults to d => d[0]. */\n  x0?: number | AccessorForArrayItem<Datum, number>;\n  /** Specifies the x1 accessor function which defaults to null. */\n  x1?: number | AccessorForArrayItem<Datum, number>;\n  /** Sets the y0 accessor function, and sets y1 to null. */\n  y?: number | AccessorForArrayItem<Datum, number>;\n  /** Specifies the y0 accessor function which defaults to d => 0. */\n  y0?: number | AccessorForArrayItem<Datum, number>;\n  /** Specifies the y1 accessor function which defaults to d => d[1]. */\n  y1?: number | AccessorForArrayItem<Datum, number>;\n};\n\nexport type LinePathConfig<Datum> = {\n  /** The defined accessor for the shape. The final line shape includes all points for which this function returns true. By default all points are defined. */\n  defined?: AccessorForArrayItem<Datum, boolean>;\n  /** Sets the curve factory (from @visx/curve or d3-curve) for the line generator. Defaults to curveLinear. */\n  curve?: CurveFactory | CurveFactoryLineOnly;\n  /** Sets the x0 accessor function, and sets x1 to null. */\n  x?: number | AccessorForArrayItem<Datum, number>;\n  /** Sets the y0 accessor function, and sets y1 to null. */\n  y?: number | AccessorForArrayItem<Datum, number>;\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype AngleAccessor<Datum> = (this: any, data: Datum[], ...args: any[]) => number;\n\nexport type PiePathConfig<Datum> = {\n  /** Returns the start angle of the overall Pie shape (the first value starts at startAngle), with 0 at -y (12 o’clock) and positive angles proceeding clockwise. */\n  startAngle?: number | AngleAccessor<Datum>;\n  /** Returns the end angle of the overall Pie shape (the last value ends at endAngle), with 0 at -y (12 o’clock) and positive angles proceeding clockwise. */\n  endAngle?: number | AngleAccessor<Datum>;\n  /** Padding angle of the Pie shape, which sets a fixed linear distance separating adjacent arcs. */\n  padAngle?: number | AngleAccessor<Datum>;\n  /** Invoked for each datum, returns the value for a given Pie segment/arc datum. */\n  value?: Accessor<Datum, number>;\n  /** Comparator function to sort *arcs*, overridden by sortValues if defined. If sort and sortValues are null, arcs match input data order. */\n  sort?: null | ((a: Datum, b: Datum) => number);\n  /** Comparator function to sort arc *values*, overrides sort if defined. If sort and sortValues are null, arcs match input data order. */\n  sortValues?: null | ((a: number, b: number) => number);\n};\n\nexport type RadialLinePathConfig<Datum> = {\n  /** The defined accessor for the shape. The final radialLine shape includes all points for which this function returns true. By default all points are defined. */\n  defined?: AccessorForArrayItem<Datum, boolean>;\n  /** Sets the curve factory (from @visx/curve or d3-curve) for the radialLine generator. Defaults to curveLinear. */\n  curve?: CurveFactory | CurveFactoryLineOnly;\n  /** Returns the angle value in radians for a given Datum, with 0 at -y (12 o’clock). */\n  angle?: number | AccessorForArrayItem<Datum, number>;\n  /** Returns the radius value in radians for a given Datum, with 0 at the center. */\n  radius?: number | AccessorForArrayItem<Datum, number>;\n};\n\nexport type StackPathConfig<Datum, Key> = {\n  /** Array of keys corresponding to stack layers. */\n  keys?: Key[];\n  /** Sets the stack offset to the pre-defined d3 offset, see https://github.com/d3/d3-shape#stack_offset. */\n  offset?: keyof typeof STACK_OFFSETS;\n  /** Sets the stack order to the pre-defined d3 function, see https://github.com/d3/d3-shape#stack_order. */\n  order?: keyof typeof STACK_ORDERS;\n  /** Sets the value accessor for a Datum, which defaults to d[key]. */\n  value?: number | ((d: Datum, key: Key) => number);\n};\n"
  },
  {
    "path": "packages/visx-shape/src/types/accessor.ts",
    "content": "export type Accessor<Datum, Output> = (d: Datum) => Output;\n\nexport type AccessorWithIndex<Datum, Output> = (d: Datum, index: number) => Output;\n\nexport type AccessorForArrayItem<Datum, Output> = (\n  d: Datum,\n  index: number,\n  data: Datum[],\n) => Output;\n"
  },
  {
    "path": "packages/visx-shape/src/types/area.ts",
    "content": "import type { Area } from '@visx/vendor/d3-shape';\nimport type { ReactNode, Ref } from 'react';\nimport type { AreaPathConfig } from './D3ShapeConfig';\n\nexport type BaseAreaProps<Datum> = {\n  /** Override render function which is passed the configured area generator as input. */\n  children?: (args: { path: Area<Datum> }) => ReactNode;\n  /** Classname applied to path element. */\n  className?: string;\n  /** Array of data for which to generate an area shape. */\n  data?: Datum[];\n  /** React RefObject passed to the path element. */\n  innerRef?: Ref<SVGPathElement>;\n} & AreaPathConfig<Datum>;\n"
  },
  {
    "path": "packages/visx-shape/src/types/barGroup.ts",
    "content": "import type { DatumObject } from './base';\n\n/** Unique key for item in a group. */\nexport type GroupKey = string | number;\n\nexport interface BarGroupBar<Key> {\n  /** group key */\n  key: Key;\n  /** index of BarGroup (matches input Datum index). */\n  index: number;\n  /** group value (Datum[key]) */\n  value: number;\n  /** height of bar. */\n  height: number;\n  /** width of bar. */\n  width: number;\n  /** x position of bar. */\n  x: number;\n  /** y position of bar. */\n  y: number;\n  /** color of bar. */\n  color: string;\n}\n\ninterface BaseBarGroup<Key> {\n  /** index of BarGroup (matches input Datum index). */\n  index: number;\n  /** bars within group, one for each key. */\n  bars: BarGroupBar<Key>[];\n}\n\n/** One BarGroup is returned for each datum, which has multiple sub-bars (based on keys). */\nexport interface BarGroup<Key> extends BaseBarGroup<Key> {\n  /** x0 position of bar group */\n  x0: number;\n}\n\n/** One BarGroup is returned for each datum, which has multiple sub-bars (based on keys). */\nexport interface BarGroupHorizontal<Key> extends BaseBarGroup<Key> {\n  /** y0 position of bar group */\n  y0: number;\n}\n\nexport interface BaseBarGroupProps<Datum extends DatumObject, Key extends GroupKey = GroupKey> {\n  /** Array of data for which to generate grouped bars. */\n  data: Datum[];\n  /** Returns the desired color for a bar with a given key and index. */\n  color: (key: Key, index: number) => string;\n  /** Array of keys corresponding to stack layers. */\n  keys: Key[];\n  /** className applied to Bars. */\n  className?: string;\n  /** Top offset of rendered Bars. */\n  top?: number;\n  /** Left offset of rendered Bars. */\n  left?: number;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/types/barStack.ts",
    "content": "import type { ReactNode } from 'react';\nimport type { BarGroupBar } from './barGroup';\nimport type { BaseStackProps, StackKey } from './stack';\nimport type { PositionScale } from './base';\n\n/**\n * Each series point j in a stack chart corresponds to the jth element in the input data.\n * Each point is represented as an array [y0, y1] where y0 is the lower value (baseline) and y1 is the upper value (topline);\n * the difference between y0 and y1 corresponds to the computed value for this point.\n *\n * SeriesPoint is a [number, number] two-element Array with added data and index properties\n * related to the data element which formed the basis for theSeriesPoint.\n */\nexport interface SeriesPoint<Datum> extends Array<number> {\n  /**\n   * Corresponds to y0, the lower value (baseline).\n   */\n  0: number;\n  /**\n   * Corresponds to y1, the upper value (topline).\n   */\n  1: number;\n  /**\n   * The data element underlying the series point.\n   */\n  data: Datum;\n}\n\n/** One BarStack is returned for each datum, which has multiple sub-bars (based on keys). */\nexport interface BarStack<Datum, Key> {\n  index: number;\n  key: Key;\n  bars: (Omit<BarGroupBar<Key>, 'key' | 'value'> & {\n    /** Processed bar Datum with bar bounds and original datum. */\n    bar: SeriesPoint<Datum>;\n    /** stack key */\n    key: Key;\n  })[];\n}\n\nexport type BaseBarStackProps<\n  Datum,\n  Key extends StackKey = StackKey,\n  XScale extends PositionScale = PositionScale,\n  YScale extends PositionScale = PositionScale,\n> = BaseStackProps<Datum, Key> & {\n  /** @visx/scale or d3-scale that takes an x value and maps it to an x axis position. */\n  xScale: XScale;\n  /** @visx/scale or d3-scale that takes a y value and maps it to an y axis position. */\n  yScale: YScale;\n  /** Returns the desired color for a bar with a given key and index. */\n  color: (key: Key, index: number) => string;\n  /** Override render function which is passed the configured stack generator as input. */\n  children?: (stacks: BarStack<Datum, Key>[]) => ReactNode;\n};\n"
  },
  {
    "path": "packages/visx-shape/src/types/base.ts",
    "content": "import type { D3Scale, PickD3Scale } from '@visx/scale';\nimport type { ReactNode, SVGProps } from 'react';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type $TSFIXME = any;\n\nexport type DatumObject = Record<string | number, $TSFIXME>;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyScaleBand = PickD3Scale<'band', any, any>;\n\n/** A catch-all type for scales that returns number */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type PositionScale = D3Scale<number, any, any>;\n\n/**\n * Add fields from `SVGProps` for the specified SVG `Element`\n * to `Props` except fields that already exist in `Props`\n */\nexport type AddSVGProps<Props, Element extends SVGElement> = Props &\n  Omit<SVGProps<Element>, keyof Props>;\n\nexport type RenderProp<Input> = (args: Input) => ReactNode;\n"
  },
  {
    "path": "packages/visx-shape/src/types/index.ts",
    "content": "export type * from './base';\nexport type * from './accessor';\nexport type * from './area';\nexport type * from './barGroup';\nexport type * from './barStack';\nexport type * from './D3ShapeConfig';\nexport type * from './link';\nexport type * from './stack';\n"
  },
  {
    "path": "packages/visx-shape/src/types/link.ts",
    "content": "import type { ReactNode, Ref } from 'react';\n\nexport type AccessorProps<Link, Node> = {\n  /** Given a node, returns its x coordinate. */\n  x?: (node: Node) => number;\n  /** Given a node, returns its y coordinate. */\n  y?: (node: Node) => number;\n  /** Given a link, returns the source node. */\n  source?: (link: Link) => Node;\n  /** Given a link, returns the target node. */\n  target?: (link: Link) => Node;\n};\n\nexport type RadialAccessorProps<Link, Node> = Pick<\n  AccessorProps<Link, Node>,\n  'source' | 'target'\n> & {\n  /** Given a node, returns its x coordinate. */\n  angle?: (node: Node) => number;\n  /** Given a node, returns its y coordinate. */\n  radius?: (node: Node) => number;\n};\n\ntype PathType<Link> = (link: Link) => string | null;\n\nexport type SharedLinkProps<Link> = {\n  /** className applied to path element. */\n  className?: string;\n  /** React ref to the path element. */\n  innerRef?: Ref<SVGPathElement>;\n  /** Path generator, given a link returns a path d attribute string */\n  path?: PathType<Link>;\n  /** Render function override which is passed the configured path generator as input. */\n  children?: (args: { path: PathType<Link> }) => ReactNode;\n  /** Datum for which to render a link. */\n  data: Link;\n};\n"
  },
  {
    "path": "packages/visx-shape/src/types/stack.ts",
    "content": "import type { StackPathConfig } from './D3ShapeConfig';\n\n/** Unique key for item in a stack. */\nexport type StackKey = string | number;\n\nexport type BaseStackProps<Datum, Key> = {\n  /** Array of data for which generates a stack. */\n  data: Datum[];\n  /** className applied to path element. */\n  className?: string;\n  /** Top offset of rendered Stack. */\n  top?: number;\n  /** Left offset of rendered Stack. */\n  left?: number;\n} & StackPathConfig<Datum, Key>;\n"
  },
  {
    "path": "packages/visx-shape/src/util/D3ShapeFactories.ts",
    "content": "import {\n  arc as d3Arc,\n  area as d3Area,\n  line as d3Line,\n  pie as d3Pie,\n  radialLine as d3RadialLine,\n  stack as d3Stack,\n} from '@visx/vendor/d3-shape';\nimport setNumberOrNumberAccessor from './setNumberOrNumberAccessor';\nimport type {\n  ArcPathConfig,\n  AreaPathConfig,\n  LinePathConfig,\n  PiePathConfig,\n  RadialLinePathConfig,\n  StackPathConfig,\n} from '../types';\nimport stackOrder from './stackOrder';\nimport stackOffset from './stackOffset';\n\nexport function arc<Datum>({\n  innerRadius,\n  outerRadius,\n  cornerRadius,\n  startAngle,\n  endAngle,\n  padAngle,\n  padRadius,\n}: ArcPathConfig<Datum> = {}) {\n  const path = d3Arc<Datum>();\n  if (innerRadius != null) setNumberOrNumberAccessor(path.innerRadius, innerRadius);\n  if (outerRadius != null) setNumberOrNumberAccessor(path.outerRadius, outerRadius);\n  if (cornerRadius != null) setNumberOrNumberAccessor(path.cornerRadius, cornerRadius);\n  if (startAngle != null) setNumberOrNumberAccessor(path.startAngle, startAngle);\n  if (endAngle != null) setNumberOrNumberAccessor(path.endAngle, endAngle);\n  if (padAngle != null) setNumberOrNumberAccessor(path.padAngle, padAngle);\n  if (padRadius != null) setNumberOrNumberAccessor(path.padRadius, padRadius);\n\n  return path;\n}\n\nexport function area<Datum>({ x, x0, x1, y, y0, y1, defined, curve }: AreaPathConfig<Datum> = {}) {\n  const path = d3Area<Datum>();\n  if (x) setNumberOrNumberAccessor(path.x, x);\n  if (x0) setNumberOrNumberAccessor(path.x0, x0);\n  if (x1) setNumberOrNumberAccessor(path.x1, x1);\n  if (y) setNumberOrNumberAccessor(path.y, y);\n  if (y0) setNumberOrNumberAccessor(path.y0, y0);\n  if (y1) setNumberOrNumberAccessor(path.y1, y1);\n  if (defined) path.defined(defined);\n  if (curve) path.curve(curve);\n\n  return path;\n}\n\nexport function line<Datum>({ x, y, defined, curve }: LinePathConfig<Datum> = {}) {\n  const path = d3Line<Datum>();\n  if (x) setNumberOrNumberAccessor(path.x, x);\n  if (y) setNumberOrNumberAccessor(path.y, y);\n  if (defined) path.defined(defined);\n  if (curve) path.curve(curve);\n\n  return path;\n}\n\nexport function pie<Datum>({\n  startAngle,\n  endAngle,\n  padAngle,\n  value,\n  sort,\n  sortValues,\n}: PiePathConfig<Datum> = {}) {\n  const path = d3Pie<Datum>();\n\n  // In d3-shape v3+, sortValues defaults to descending sort.\n  // To maintain visx's behavior of preserving input order by default,\n  // we explicitly set sortValues to null when neither sort nor sortValues is provided.\n  // Note: d3's pie generator clears sortValues when sort is set, and vice versa.\n  if (sortValues !== undefined) {\n    path.sortValues(sortValues);\n  } else if (sort === undefined) {\n    // Neither provided - disable sorting to preserve input order\n    path.sortValues(null);\n  } else if (sort === null) {\n    // explicit null: clear comparator\n    path.sort(null);\n  } else {\n    // here sort is narrowed to a comparator function\n    path.sort(sort);\n  }\n\n  if (value != null) path.value(value);\n\n  if (padAngle != null) setNumberOrNumberAccessor(path.padAngle, padAngle);\n  if (startAngle != null) setNumberOrNumberAccessor(path.startAngle, startAngle);\n  if (endAngle != null) setNumberOrNumberAccessor(path.endAngle, endAngle);\n\n  return path;\n}\n\nexport function radialLine<Datum>({\n  angle,\n  radius,\n  defined,\n  curve,\n}: RadialLinePathConfig<Datum> = {}) {\n  const path = d3RadialLine<Datum>();\n  if (angle) setNumberOrNumberAccessor(path.angle, angle);\n  if (radius) setNumberOrNumberAccessor(path.radius, radius);\n  if (defined) path.defined(defined);\n  if (curve) path.curve(curve);\n\n  return path;\n}\n\nexport function stack<Datum, Key>({ keys, value, order, offset }: StackPathConfig<Datum, Key>) {\n  const path = d3Stack<Datum, Key>();\n  if (keys) path.keys(keys);\n  if (value) setNumberOrNumberAccessor(path.value, value);\n  if (order) path.order(stackOrder(order));\n  if (offset) path.offset(stackOffset(offset));\n\n  return path;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/accessors.ts",
    "content": "import type { $TSFIXME } from '../types';\n\nexport function getX(l: any) {\n  return typeof l?.x === 'number' ? l?.x : 0;\n}\n\nexport function getY(l: any) {\n  return typeof l?.y === 'number' ? l?.y : 0;\n}\n\nexport function getSource(l: $TSFIXME) {\n  return l?.source;\n}\n\nexport function getTarget(l: $TSFIXME) {\n  return l?.target;\n}\n\nexport function getFirstItem(d: $TSFIXME[]) {\n  return d?.[0];\n}\n\nexport function getSecondItem(d: $TSFIXME[]) {\n  return d?.[1];\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/getBandwidth.ts",
    "content": "import type { AnyD3Scale } from '@visx/scale';\n\nexport default function getBandwidth(scale: AnyD3Scale) {\n  if ('bandwidth' in scale) {\n    return scale.bandwidth();\n  }\n\n  const range = scale.range();\n  const domain = scale.domain();\n  return Math.abs(range[range.length - 1] - range[0]) / domain.length;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/getOrCreateMeasurementElement.ts",
    "content": "const SVG_NAMESPACE_URL = 'http://www.w3.org/2000/svg';\n\nexport default function getOrCreateMeasurementElement(elementId: string) {\n  let pathElement = document.getElementById(elementId) as SVGPathElement | null;\n\n  // create a single path element if not done already\n  if (!pathElement) {\n    const svg = document.createElementNS(SVG_NAMESPACE_URL, 'svg');\n\n    // not visible\n    svg.setAttribute('aria-hidden', 'true');\n    svg.style.opacity = '0';\n    svg.style.width = '0';\n    svg.style.height = '0';\n    // off screen\n    svg.style.position = 'absolute';\n    svg.style.top = '-100%';\n    svg.style.left = '-100%';\n    // no mouse events\n    svg.style.pointerEvents = 'none';\n    pathElement = document.createElementNS(SVG_NAMESPACE_URL, 'path');\n    pathElement.setAttribute('id', elementId);\n    svg.appendChild(pathElement);\n    document.body.appendChild(svg);\n  }\n\n  return pathElement;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/getSplitLineSegments.ts",
    "content": "import getOrCreateMeasurementElement from './getOrCreateMeasurementElement';\n\nconst MEASUREMENT_ELEMENT_ID = '__visx_splitpath_svg_path_measurement_id';\n\ninterface PointInSegment {\n  x: number | undefined;\n  y: number | undefined;\n}\n\n/** Different algorithms to segment the line */\nexport type LineSegmentation = 'x' | 'y' | 'length';\n\ntype LineSegments = { x: number; y: number }[][];\n\nconst TRUE = () => true;\n\nexport interface GetLineSegmentsConfig {\n  /** Full path `d` attribute to be broken up into `n` segments. */\n  path: string;\n  /** Array of length `n`, where `n` is the number of segments. */\n  pointsInSegments: PointInSegment[][];\n  /**\n   * How to segment the line\n   * - `x`: Split based on x-position,\n   *  assuming x values increase only (`segment[i].x > segment[i-1].x`)\n   *  or decrease only (`segment[i].x < segment[i-1].x`).\n   * - `y`: Split based on y-position,\n   *  assuming y values increase only (`segment[i].y > segment[i-1].y`)\n   *  or decrease only (`segment[i].y < segment[i-1].y`).\n   * - `length`: Assuming the path length between consecutive points are equal.\n   *\n   * Default is `x`.\n   */\n  segmentation: LineSegmentation;\n  /**\n   * The `path` will be sampled every `sampleRate` pixel to generate the returned points.\n   * Default is `1` pixel.\n   */\n  sampleRate?: number;\n}\n\nexport default function getSplitLineSegments({\n  path,\n  pointsInSegments,\n  segmentation = 'x',\n  sampleRate = 1,\n}: GetLineSegmentsConfig): LineSegments {\n  try {\n    const pathElement = getOrCreateMeasurementElement(MEASUREMENT_ELEMENT_ID);\n    pathElement.setAttribute('d', path);\n    const totalLength = pathElement.getTotalLength();\n\n    const numSegments = pointsInSegments.length;\n    const lineSegments: LineSegments = pointsInSegments.map(() => []);\n\n    if (segmentation === 'x' || segmentation === 'y') {\n      const segmentStarts = pointsInSegments.map(\n        (points) => points.find((p) => typeof p[segmentation] === 'number')?.[segmentation],\n      );\n\n      const first = pathElement.getPointAtLength(0);\n      const last = pathElement.getPointAtLength(totalLength);\n      const isIncreasing = last[segmentation] > first[segmentation];\n      const isBeyondSegmentStart = isIncreasing\n        ? segmentStarts.map((start) =>\n            typeof start === 'undefined' ? TRUE : (xOrY: number) => xOrY >= start,\n          )\n        : segmentStarts.map((start) =>\n            typeof start === 'undefined' ? TRUE : (xOrY: number) => xOrY <= start,\n          );\n\n      let currentSegment = 0;\n      for (let distance = 0; distance <= totalLength; distance += sampleRate) {\n        const sample = pathElement.getPointAtLength(distance);\n        const position = sample[segmentation];\n        // find the current segment to which this sample belongs\n        while (\n          currentSegment < numSegments - 1 &&\n          isBeyondSegmentStart[currentSegment + 1](position)\n        ) {\n          currentSegment += 1;\n        }\n        // add sample to segment\n        lineSegments[currentSegment].push(sample);\n      }\n    } else {\n      // segmentation === \"length\"\n      const numPointsInSegment = pointsInSegments.map((points) => points.length);\n      const numPoints = numPointsInSegment.reduce((sum, curr) => sum + curr, 0);\n      const lengthBetweenPoints = totalLength / Math.max(1, numPoints - 1);\n\n      const segmentStarts = numPointsInSegment.slice(0, numSegments - 1);\n      segmentStarts.unshift(0);\n      for (let i = 2; i < numSegments; i += 1) {\n        segmentStarts[i] += segmentStarts[i - 1];\n      }\n      for (let i = 0; i < numSegments; i += 1) {\n        segmentStarts[i] *= lengthBetweenPoints;\n      }\n\n      let currentSegment = 0;\n      for (let distance = 0; distance <= totalLength; distance += sampleRate) {\n        const sample = pathElement.getPointAtLength(distance);\n        // find the current segment to which this sample belongs\n        while (currentSegment < numSegments - 1 && distance >= segmentStarts[currentSegment + 1]) {\n          currentSegment += 1;\n        }\n        // add sample to segment\n        lineSegments[currentSegment].push(sample);\n      }\n    }\n\n    return lineSegments;\n  } catch (e) {\n    console.warn(e);\n    return [];\n  }\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/setNumberOrNumberAccessor.ts",
    "content": "/**\n * This is a workaround for TypeScript not inferring the correct\n * method overload/signature for some d3 shape methods.\n */\nexport default function setNumberOrNumberAccessor<NumAccessor>(\n  func: (d: number | NumAccessor) => void,\n  value: number | NumAccessor,\n) {\n  if (typeof value === 'number') func(value);\n  else func(value);\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/stackOffset.ts",
    "content": "import {\n  stackOffsetExpand,\n  stackOffsetDiverging,\n  stackOffsetNone,\n  stackOffsetSilhouette,\n  stackOffsetWiggle,\n} from '@visx/vendor/d3-shape';\n\nexport const STACK_OFFSETS = {\n  expand: stackOffsetExpand,\n  diverging: stackOffsetDiverging,\n  none: stackOffsetNone,\n  silhouette: stackOffsetSilhouette,\n  wiggle: stackOffsetWiggle,\n} as const;\n\nexport type StackOffset = keyof typeof STACK_OFFSETS;\n\nexport const STACK_OFFSET_NAMES = Object.keys(STACK_OFFSETS) as StackOffset[];\n\nexport default function stackOffset(offset?: keyof typeof STACK_OFFSETS) {\n  return (offset && STACK_OFFSETS[offset]) || STACK_OFFSETS.none;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/stackOrder.ts",
    "content": "import {\n  stackOrderAscending,\n  stackOrderDescending,\n  stackOrderInsideOut,\n  stackOrderNone,\n  stackOrderReverse,\n} from '@visx/vendor/d3-shape';\n\nexport const STACK_ORDERS = {\n  ascending: stackOrderAscending,\n  descending: stackOrderDescending,\n  insideout: stackOrderInsideOut,\n  none: stackOrderNone,\n  reverse: stackOrderReverse,\n} as const;\n\nexport type StackOrder = keyof typeof STACK_ORDERS;\n\nexport const STACK_ORDER_NAMES = Object.keys(STACK_ORDERS) as StackOrder[];\n\nexport default function stackOrder(order?: keyof typeof STACK_ORDERS) {\n  return (order && STACK_ORDERS[order]) || STACK_ORDERS.none;\n}\n"
  },
  {
    "path": "packages/visx-shape/src/util/trigonometry.ts",
    "content": "export const degreesToRadians = (degrees: number) => (Math.PI / 180) * degrees;\n"
  },
  {
    "path": "packages/visx-shape/test/Arc.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport { Arc } from '../src';\nimport type { ArcProps } from '../src/shapes/Arc';\nimport '@testing-library/jest-dom';\n\ninterface Datum {\n  data: number;\n  value: number;\n  index: number;\n  startAngle: number;\n  endAngle: number;\n  padAngle: number;\n}\n\nconst data: Datum = {\n  data: 1,\n  value: 1,\n  index: 6,\n  startAngle: 6.050474740247008,\n  endAngle: 6.166830023713296,\n  padAngle: 0,\n};\n\nconst ArcChildren = ({ children, ...restProps }: Partial<ArcProps<Datum>>) =>\n  render(\n    <Arc data={data} {...restProps}>\n      {children}\n    </Arc>,\n  );\n\ndescribe('<Arc />', () => {\n  it('should be defined', () => {\n    expect(Arc).toBeDefined();\n  });\n\n  it('should render a path that has the .visx-arcs-group class', () => {\n    const { container } = render(\n      <svg>\n        <Arc data={data} />\n      </svg>,\n    );\n    const PathElement = container.querySelector('path');\n    expect(PathElement).toBeInTheDocument();\n    expect(PathElement).toHaveClass('visx-arc');\n  });\n\n  it('should warn and render null when none of data, radii, and angles are passed', () => {\n    const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n    const { container } = render(\n      <svg>\n        <Arc data={null} />\n      </svg>,\n    );\n    expect(container.querySelector('path')).not.toBeInTheDocument();\n    expect(warnSpy).toHaveBeenCalledTimes(1);\n    warnSpy.mockRestore();\n  });\n\n  it('should render a path without data when radii + angles are defined', () => {\n    const { container } = render(\n      <svg>\n        <Arc data={{ startAngle: 0, endAngle: 6, innerRadius: 5, outerRadius: 10 }} />\n      </svg>,\n    );\n    expect(container.querySelector('path')).toBeInTheDocument();\n  });\n\n  it('should take a children as function prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn });\n    expect(fn).toHaveBeenCalled();\n  });\n\n  it('should call children function with { path }', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn });\n    const args = fn.mock.calls[0][0];\n    const keys = Object.keys(args);\n    expect(keys).toContain('path');\n  });\n\n  it('should take an innerRadius number prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, innerRadius: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.innerRadius()()).toBe(42);\n  });\n\n  it('should take an innerRadius fn prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, innerRadius: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.innerRadius()()).toBe(42);\n  });\n\n  it('should take an outerRadius number prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, outerRadius: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.outerRadius()()).toBe(42);\n  });\n\n  it('should take an outerRadius fn prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, outerRadius: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.outerRadius()()).toBe(42);\n  });\n\n  it('should take a cornerRadius number prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, cornerRadius: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.cornerRadius()()).toBe(42);\n  });\n\n  it('should take a cornerRadius fn prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, cornerRadius: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.cornerRadius()()).toBe(42);\n  });\n\n  it('should take a startAngle number prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, startAngle: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.startAngle()()).toBe(42);\n  });\n\n  it('should take a startAngle 0 prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, startAngle: 0 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.startAngle()()).toBe(0);\n  });\n\n  it('should take a startAngle fn prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, startAngle: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.startAngle()()).toBe(42);\n  });\n\n  it('should take a endAngle number prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, endAngle: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.endAngle()()).toBe(42);\n  });\n\n  it('should take a endAngle 0 prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, endAngle: 0 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.endAngle()()).toBe(0);\n  });\n\n  it('should take a endAngle fn prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, endAngle: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.endAngle()()).toBe(42);\n  });\n\n  it('should take a padAngle number prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, padAngle: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.padAngle()()).toBe(42);\n  });\n\n  it('should take a padAngle 0 prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, padAngle: 0 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.padAngle()()).toBe(0);\n  });\n\n  it('should take a padAngle fn prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, padAngle: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.padAngle()()).toBe(42);\n  });\n\n  it('should take a padRadius number prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, padRadius: 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.padRadius()()).toBe(42);\n  });\n\n  it('should take a padRadius 0 prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, padRadius: 0 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.padRadius()()).toBe(0);\n  });\n\n  it('should take a padRadius fn prop', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn, padRadius: () => 42 });\n    const args = fn.mock.calls[0][0];\n    expect(args.path.padRadius()()).toBe(42);\n  });\n\n  it('calling path with data returns a string', () => {\n    const fn = vi.fn();\n    ArcChildren({ children: fn });\n    const args = fn.mock.calls[0][0];\n    expect(typeof args.path(data)).toBe('string');\n  });\n\n  it('should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n\n    const { container } = render(\n      <svg>\n        <Arc data={data} innerRef={fakeRef} />\n      </svg>,\n    );\n    const PathElement = container.querySelector('path');\n    expect(fakeRef.current).toContainElement(PathElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/Area.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Area } from '../src';\n\ninterface Datum {\n  x: Date;\n  y: number;\n}\n\nconst fakeData: Datum[] = [\n  { x: new Date('2017-01-01'), y: 5 },\n  { x: new Date('2017-01-02'), y: 5 },\n  { x: new Date('2017-01-03'), y: 5 },\n];\n\nconst xScale = () => 50;\nconst yScale = () => 50;\nyScale.range = () => [100, 0];\n\nconst x = () => xScale();\nconst y = () => yScale();\n\ndescribe('<Area />', () => {\n  test('should be defined', () => {\n    const { container } = render(\n      <svg>\n        <Area data={fakeData} x={x} y={y} />\n      </svg>,\n    );\n    expect(container.querySelector('path')).toBeInTheDocument();\n  });\n\n  test('should have the .visx-area class', () => {\n    const { container } = render(\n      <svg>\n        <Area data={fakeData} x={x} y={y} />\n      </svg>,\n    );\n    expect(container.querySelector('path')).toHaveClass('visx-area');\n  });\n\n  test('should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n    const { container } = render(\n      <svg>\n        <Area data={fakeData} x={x} y={y} innerRef={fakeRef} />\n      </svg>,\n    );\n    const pathElement = container.querySelector('path');\n    expect(fakeRef.current).toBe(pathElement);\n  });\n\n  test('should handle children as function prop', () => {\n    const childrenFn = vi.fn(() => null);\n    render(\n      <svg>\n        <Area data={fakeData} x={x} y={y}>\n          {childrenFn}\n        </Area>\n      </svg>,\n    );\n\n    expect(childrenFn).toHaveBeenCalled();\n    const args = childrenFn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('should handle x and y props correctly', () => {\n    const childrenFn = vi.fn((_: { path: any }) => null);\n    const args = [fakeData[0], 0, fakeData] as const;\n\n    // Test number props\n    render(\n      <svg>\n        <Area data={fakeData} x={42} y={42}>\n          {childrenFn}\n        </Area>\n      </svg>,\n    );\n\n    const [{ path }] = childrenFn.mock.calls[0];\n    expect(path.x()(...args)).toBe(42);\n    expect(path.y()(...args)).toBe(42);\n\n    childrenFn.mockClear();\n\n    // Test function props\n    render(\n      <svg>\n        <Area data={fakeData} x={() => 42} y={() => 42}>\n          {childrenFn}\n        </Area>\n      </svg>,\n    );\n\n    const [{ path: path2 }] = childrenFn.mock.calls[0];\n\n    expect(path2.x()(...args)).toBe(42);\n    expect(path2.x0()(...args)).toBe(42);\n    expect(path2.x1()).toBeNull();\n    expect(path2.y()(...args)).toBe(42);\n    expect(path2.y0()(...args)).toBe(42);\n    expect(path2.y1()).toBeNull();\n  });\n\n  test('should handle default defined prop and generate path string', () => {\n    const childrenFn = vi.fn((_: { path: any }) => null);\n    const args = [fakeData[0], 0, fakeData] as const;\n    render(\n      <svg>\n        <Area data={fakeData} x={x} y={y}>\n          {childrenFn}\n        </Area>\n      </svg>,\n    );\n\n    const [{ path }] = childrenFn.mock.calls[0];\n    expect(path.defined()(...args)).toBe(true);\n    expect(typeof path(fakeData)).toBe('string');\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/AreaClosed.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { AreaClosed } from '../src';\n\ninterface Datum {\n  x: Date;\n  y: number;\n}\n\nconst data: Datum[] = [\n  { x: new Date('2017-01-01'), y: 5 },\n  { x: new Date('2017-01-02'), y: 5 },\n  { x: new Date('2017-01-03'), y: 5 },\n];\n\nconst yScale = scaleLinear({ domain: [0, 100], range: [100, 0] });\n\nconst x = () => 50;\nconst y = () => 50;\n\ndescribe('<AreaClosed />', () => {\n  test('it should be defined', () => {\n    expect(AreaClosed).toBeDefined();\n  });\n\n  test('it should have the .visx-area-closed class', () => {\n    const { container } = render(\n      <svg>\n        <AreaClosed data={data} yScale={yScale} x={x} y1={y} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path).toHaveClass('visx-area-closed');\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n    const { container } = render(\n      <svg>\n        <AreaClosed data={data} yScale={yScale} x={x} y1={y} innerRef={fakeRef} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(fakeRef.current).toBe(path);\n  });\n\n  test('it should handle children function prop', () => {\n    const childrenFn = vi.fn((_) => null);\n    render(\n      <svg>\n        <AreaClosed data={data} yScale={yScale} x={x} y1={y}>\n          {childrenFn}\n        </AreaClosed>\n      </svg>,\n    );\n\n    expect(childrenFn).toHaveBeenCalled();\n    const args = childrenFn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('it should generate correct path data', () => {\n    const { container } = render(\n      <svg>\n        <AreaClosed data={data} yScale={yScale} x={x} y1={y} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path).toHaveAttribute('d');\n    expect(typeof path?.getAttribute('d')).toBe('string');\n  });\n\n  test('it should handle number and function props', () => {\n    const childrenFn = vi.fn((_: { path: any }) => null);\n    const args = [data[0], 0, data] as const;\n    // Test with number prop\n    render(\n      <svg>\n        <AreaClosed data={data} yScale={yScale} x={42} y1={42}>\n          {childrenFn}\n        </AreaClosed>\n      </svg>,\n    );\n\n    const { path } = childrenFn.mock.calls[0][0];\n    expect(path.x()(...args)).toBe(42);\n    expect(path.y0()(...args)).toBe(yScale.range()[0]);\n    expect(path.y1()?.(...args)).toBe(42);\n\n    // Test with function prop\n    childrenFn.mockClear();\n    render(\n      <svg>\n        <AreaClosed data={data} yScale={yScale} x={() => 42} y1={() => 42}>\n          {childrenFn}\n        </AreaClosed>\n      </svg>,\n    );\n\n    const [{ path: path2 }] = childrenFn.mock.calls[0];\n    expect(path2.x()(...args)).toBe(42);\n    expect(path2.y0()(...args)).toBe(yScale.range()[0]);\n    expect(path2.y1()?.(...args)).toBe(42);\n    expect(path2.defined()(...args)).toBe(true);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/AreaStack.test.tsx",
    "content": "import { AreaStack } from '../src';\n\ndescribe('<AreaStack />', () => {\n  test('it should be defined', () => {\n    expect(AreaStack).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/Bar.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { Bar } from '../src';\n\ndescribe('<Bar />', () => {\n  test('it should be defined', () => {\n    expect(Bar).toBeDefined();\n  });\n\n  test('it should have the .visx-bar class', () => {\n    const { container } = render(\n      <svg>\n        <Bar className=\"test\" />\n      </svg>,\n    );\n    const rect = container.querySelector('rect');\n    expect(rect).toHaveClass('visx-bar', 'test');\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGRectElement>();\n    const { container } = render(\n      <svg>\n        <Bar innerRef={fakeRef} />\n      </svg>,\n    );\n    const rectElement = container.querySelector('rect');\n    expect(fakeRef.current).toBe(rectElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/BarGroup.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { scaleBand, scaleLinear } from '@visx/scale';\nimport { BarGroup } from '../src';\n\nconst data = [\n  {\n    date: new Date(),\n    'New York': '63.4',\n    'San Francisco': '62.7',\n    Austin: '72.2',\n  },\n  {\n    date: new Date(),\n    'New York': '58.0',\n    'San Francisco': '59.9',\n    Austin: '67.7',\n  },\n];\n\nconst defaultProps = {\n  data,\n  x0: () => 5,\n  x0Scale: scaleBand({ domain: [5, 15], range: [0, 100] }),\n  x1Scale: scaleBand({ domain: [0, 100], range: [0, 100] }),\n  yScale: scaleLinear({ domain: [0, 100], range: [0, 100] }),\n  color: () => 'skyblue',\n  keys: ['New York', 'San Francisco', 'Austin'],\n  height: 1,\n};\n\ndescribe('<BarGroup />', () => {\n  const renderWithSvg = (ui: React.ReactElement) => render(<svg>{ui}</svg>);\n\n  test('it should be defined', () => {\n    expect(BarGroup).toBeDefined();\n  });\n\n  test('it should have className .visx-bar-group', () => {\n    const { container } = renderWithSvg(<BarGroup {...defaultProps} />);\n    expect(container.querySelector('.visx-bar-group')).toBeInTheDocument();\n  });\n\n  test('it should set className prop', () => {\n    const { container } = renderWithSvg(<BarGroup {...defaultProps} className=\"test\" />);\n    const element = container.querySelector('g.visx-bar-group');\n    expect(element).toHaveClass('test');\n  });\n\n  test('it should set top & left props', () => {\n    const { container } = renderWithSvg(<BarGroup {...defaultProps} top={2} left={3} />);\n    const element = container.querySelector('g.visx-bar-group');\n    expect(element).toHaveAttribute('transform', 'translate(3, 2)');\n  });\n\n  test('it should take a children as function prop', () => {\n    const children = vi.fn(() => null);\n    renderWithSvg(<BarGroup {...defaultProps}>{children}</BarGroup>);\n    expect(children).toHaveBeenCalled();\n  });\n\n  test('it should call children function with [barGroups]', () => {\n    const children = vi.fn(() => null);\n    renderWithSvg(<BarGroup {...defaultProps}>{children}</BarGroup>);\n    const args = children.mock.calls[0][0];\n    expect(args.length).toBeGreaterThan(0);\n  });\n\n  test('it should create barGroup with shape { index, x0, bars }', () => {\n    const children = vi.fn(() => null);\n    renderWithSvg(<BarGroup {...defaultProps}>{children}</BarGroup>);\n    const [barGroups] = children.mock.calls[0];\n    const group = barGroups[0];\n\n    expect(Object.keys(group)).toEqual(['index', 'x0', 'bars']);\n    expect(group.index).toBe(0);\n    expect(typeof group.index).toBe('number');\n    expect(typeof group.x0).toBe('number');\n    expect(group.bars).toHaveLength(defaultProps.keys.length);\n    expect(Object.keys(group.bars[0])).toEqual([\n      'index',\n      'key',\n      'value',\n      'width',\n      'x',\n      'y',\n      'color',\n      'height',\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/BarGroupHorizontal.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { scaleBand, scaleLinear } from '@visx/scale';\nimport { BarGroupHorizontal } from '../src';\nimport type { BarGroupHorizontal as BarGroupHorizontalType } from '../src/types';\n\ninterface Datum {\n  date: Date;\n  'New York': string;\n  'San Francisco': string;\n  Austin: string;\n}\n\nconst data: Datum[] = [\n  {\n    date: new Date(),\n    'New York': '63.4',\n    'San Francisco': '62.7',\n    Austin: '72.2',\n  },\n  {\n    date: new Date(),\n    'New York': '58.0',\n    'San Francisco': '59.9',\n    Austin: '67.7',\n  },\n];\n\nconst defaultProps = {\n  data,\n  y0: () => 5,\n  y0Scale: scaleBand({ domain: [0, 100], range: [0, 100] }),\n  y1Scale: scaleBand({ domain: [0, 100], range: [0, 100] }),\n  xScale: scaleLinear({ domain: [0, 100], range: [0, 100] }),\n  color: () => 'violet',\n  keys: ['New York', 'San Francisco', 'Austin'],\n  width: 1,\n};\n\ndescribe('<BarGroupHorizontal />', () => {\n  // Suppress expected console warnings about lowercase SVG elements\n  beforeAll(() => {\n    // eslint-disable-next-line\n    vi.spyOn(console, 'error').mockImplementation(() => { });\n  });\n\n  afterAll(() => {\n    vi.restoreAllMocks();\n  });\n\n  test('it should be defined', () => {\n    expect(BarGroupHorizontal).toBeDefined();\n  });\n\n  test('it should have className .visx-bar-group-horizontal', () => {\n    const { container } = render(<BarGroupHorizontal {...defaultProps} />);\n    const element = container.querySelector('.visx-bar-group-horizontal');\n    expect(element).toBeInTheDocument();\n  });\n\n  test('it should set className prop', () => {\n    const { container } = render(<BarGroupHorizontal {...defaultProps} className=\"test\" />);\n    const element = container.querySelector('.visx-bar-group-horizontal.test');\n    expect(element).toBeInTheDocument();\n  });\n\n  test('it should set top & left props', () => {\n    const { container } = render(<BarGroupHorizontal {...defaultProps} top={2} left={3} />);\n    const group = container.querySelector('g');\n    expect(group).toHaveAttribute('transform', 'translate(3, 2)');\n  });\n\n  test('it should take a children as function prop', () => {\n    const children = vi.fn(() => null);\n    render(<BarGroupHorizontal {...defaultProps}>{children}</BarGroupHorizontal>);\n    expect(children).toHaveBeenCalled();\n  });\n\n  test('it should call children function with [barGroups]', () => {\n    // eslint-disable-next-line\n    const children = vi.fn(({ }) => null);\n    render(<BarGroupHorizontal {...defaultProps}>{children}</BarGroupHorizontal>);\n    const args = children.mock.calls[0][0] as BarGroupHorizontalType<'New York'>[];\n    expect(args.length > 0).toBe(true);\n  });\n\n  test('it should create barGroup with shape { index, x0, bars }', () => {\n    // eslint-disable-next-line\n    const children = vi.fn(({ }) => null);\n    render(<BarGroupHorizontal {...defaultProps}>{children}</BarGroupHorizontal>);\n    const args = children.mock.calls[0][0] as BarGroupHorizontalType<'New York'>[];\n    const barGroups = args;\n    const group = barGroups[0];\n\n    expect(Object.keys(group)).toEqual(['index', 'y0', 'bars']);\n    expect(group.index).toBe(0);\n    expect(typeof group.index).toBe('number');\n    expect(typeof group.y0).toBe('number');\n    expect(group.bars).toHaveLength(defaultProps.keys.length);\n    expect(Object.keys(group.bars[0])).toEqual([\n      'index',\n      'key',\n      'value',\n      'height',\n      'x',\n      'y',\n      'color',\n      'width',\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/BarRounded.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { BarRounded } from '../src';\nimport { useBarRoundedPath } from '../src/shapes/BarRounded';\n\nconst testProps = { x: 0, y: 0, width: 10, height: 20, radius: 2 };\n\ndescribe('<BarRounded />', () => {\n  it('should be defined', () => {\n    expect(BarRounded).toBeDefined();\n  });\n\n  it('should have the .visx-bar-rounded class', () => {\n    const { container } = render(\n      <svg>\n        <BarRounded {...testProps} className=\"test\" />\n      </svg>,\n    );\n    expect(container.querySelector('path')).toHaveClass('visx-bar-rounded', 'test');\n  });\n\n  it('should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n    const { container } = render(\n      <svg>\n        <BarRounded innerRef={fakeRef} {...testProps} />\n      </svg>,\n    );\n    const pathElement = container.querySelector('path');\n    expect(fakeRef.current).toBe(pathElement);\n  });\n\n  it('should support hooks with useBarRoundedPath', () => {\n    const path = useBarRoundedPath({ ...testProps, all: true });\n    expect(path).toBe(\n      'M2,0 h6 a2,2 0 0 1 2,2 v16 a2,2 0 0 1 -2,2 h-6 a2,2 0 0 1 -2,-2 v-16 a2,2 0 0 1 2,-2z',\n    );\n  });\n\n  it('should generate correct paths for different corner configurations', () => {\n    const cases = [\n      {\n        props: { topLeft: true },\n        expected: 'M2,0 h6 h2v2 v16 v2h-2 h-6 h-2v-2 v-16 a2,2 0 0 1 2,-2z',\n      },\n      {\n        props: { topRight: true },\n        expected: 'M2,0 h6 a2,2 0 0 1 2,2 v16 v2h-2 h-6 h-2v-2 v-16 v-2h2z',\n      },\n      {\n        props: { bottomLeft: true },\n        expected: 'M2,0 h6 h2v2 v16 v2h-2 h-6 a2,2 0 0 1 -2,-2 v-16 v-2h2z',\n      },\n      {\n        props: { bottomRight: true },\n        expected: 'M2,0 h6 h2v2 v16 a2,2 0 0 1 -2,2 h-6 h-2v-2 v-16 v-2h2z',\n      },\n      {\n        props: { top: true },\n        expected: 'M2,0 h6 a2,2 0 0 1 2,2 v16 v2h-2 h-6 h-2v-2 v-16 a2,2 0 0 1 2,-2z',\n      },\n      {\n        props: { bottom: true },\n        expected: 'M2,0 h6 h2v2 v16 a2,2 0 0 1 -2,2 h-6 a2,2 0 0 1 -2,-2 v-16 v-2h2z',\n      },\n      {\n        props: { left: true },\n        expected: 'M2,0 h6 h2v2 v16 v2h-2 h-6 a2,2 0 0 1 -2,-2 v-16 a2,2 0 0 1 2,-2z',\n      },\n      {\n        props: { right: true },\n        expected: 'M2,0 h6 a2,2 0 0 1 2,2 v16 a2,2 0 0 1 -2,2 h-6 h-2v-2 v-16 v-2h2z',\n      },\n      {\n        props: { all: true },\n        expected:\n          'M2,0 h6 a2,2 0 0 1 2,2 v16 a2,2 0 0 1 -2,2 h-6 a2,2 0 0 1 -2,-2 v-16 a2,2 0 0 1 2,-2z',\n      },\n    ];\n\n    cases.forEach(({ props, expected }) => {\n      const { container } = render(\n        <svg>\n          <BarRounded {...testProps} {...props} />\n        </svg>,\n      );\n      expect(container.querySelector('path')).toHaveAttribute('d', expected);\n    });\n  });\n\n  it('should clamp radius to the center of the shortest side of the rect', () => {\n    const { container } = render(\n      <svg>\n        <BarRounded {...testProps} topLeft width={4} radius={400} />\n      </svg>,\n    );\n    const r = Math.min(4, testProps.height) / 2;\n    expect(container.querySelector('path')).toHaveAttribute(\n      'd',\n      `M2,0 h0 h2v2 v16 v2h-2 h0 h-2v-2 v-16 a${r},${r} 0 0 1 ${r},-${r}z`,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/BarStack.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleBand } from '@visx/scale';\nimport { BarStack } from '../src';\n\nconst scale = scaleBand({\n  domain: [0, 100],\n  range: [0, 100],\n});\n\ndescribe('<BarStack />', () => {\n  test('it should be defined', () => {\n    expect(BarStack).toBeDefined();\n  });\n\n  test('it should have className .visx-bar-stack', () => {\n    const { container } = render(\n      <svg>\n        <BarStack\n          data={[]}\n          top={2}\n          left={3}\n          x={(d) => d}\n          xScale={scale}\n          yScale={scale}\n          color={(d) => d}\n          keys={[]}\n        />\n      </svg>,\n    );\n\n    expect(container.querySelector('.visx-bar-stack')).toBeInTheDocument();\n  });\n\n  test('it should set className prop', () => {\n    const { container } = render(\n      <svg>\n        <BarStack\n          className=\"test\"\n          data={[]}\n          top={2}\n          left={3}\n          x={(d) => d}\n          xScale={scale}\n          yScale={scale}\n          color={(d) => d}\n          keys={[]}\n        />\n      </svg>,\n    );\n\n    const element = container.querySelector('.visx-bar-stack');\n    expect(element).toHaveClass('visx-bar-stack');\n    expect(element).toHaveClass('test');\n  });\n\n  test('it should set top & left props', () => {\n    const { container } = render(\n      <svg>\n        <BarStack\n          className=\"test\"\n          data={[]}\n          top={2}\n          left={3}\n          x={(d) => d}\n          xScale={scale}\n          yScale={scale}\n          color={(d) => d}\n          keys={[]}\n        />\n      </svg>,\n    );\n\n    const element = container.querySelector('.visx-bar-stack');\n    expect(element).toHaveAttribute('transform', 'translate(3, 2)');\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/BarStackHorizontal.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleBand } from '@visx/scale';\nimport { BarStackHorizontal } from '../src';\n\nconst scale = scaleBand({\n  domain: [0, 100],\n  range: [0, 100],\n  paddingInner: 5,\n  paddingOuter: 5,\n});\n\ndescribe('<BarStackHorizontal />', () => {\n  test('it should be defined', () => {\n    expect(BarStackHorizontal).toBeDefined();\n  });\n\n  test('it should have className .visx-bar-stack-horizontal', () => {\n    const { container } = render(\n      <svg>\n        <BarStackHorizontal\n          data={[]}\n          top={2}\n          left={3}\n          y={(d) => d}\n          xScale={scale}\n          yScale={scale}\n          color={(d) => d}\n          keys={[]}\n        />\n      </svg>,\n    );\n\n    const element = container.querySelector('.visx-bar-stack-horizontal');\n    expect(element).toBeInTheDocument();\n  });\n\n  test('it should set className prop', () => {\n    const { container } = render(\n      <svg>\n        <BarStackHorizontal\n          className=\"test\"\n          data={[]}\n          top={2}\n          left={3}\n          y={(d) => d}\n          xScale={scale}\n          yScale={scale}\n          color={(d) => d}\n          keys={[]}\n        />\n      </svg>,\n    );\n\n    const element = container.querySelector('.visx-bar-stack-horizontal');\n    expect(element).toBeInTheDocument();\n    expect(element).toHaveClass('visx-bar-stack-horizontal', 'test');\n  });\n\n  test('it should set top & left props', () => {\n    const { container } = render(\n      <svg>\n        <BarStackHorizontal\n          className=\"test\"\n          data={[]}\n          top={2}\n          left={3}\n          y={(d) => d}\n          xScale={scale}\n          yScale={scale}\n          color={(d) => d}\n          keys={[]}\n        />\n      </svg>,\n    );\n\n    const element = container.querySelector('.visx-bar-stack-horizontal');\n    expect(element).toBeInTheDocument();\n    expect(element).toHaveAttribute('transform', 'translate(3, 2)');\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/Circle.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { Circle } from '../src';\n\ndescribe('<Circle />', () => {\n  test('it should be defined', () => {\n    expect(Circle).toBeDefined();\n  });\n\n  test('it should have the .visx-circle class', () => {\n    const { container } = render(\n      <svg>\n        <Circle className=\"test\" />\n      </svg>,\n    );\n    const circle = container.querySelector('circle');\n    expect(circle).toHaveClass('visx-circle', 'test');\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGCircleElement>();\n    const { container } = render(\n      <svg>\n        <Circle innerRef={fakeRef} />\n      </svg>,\n    );\n    const circle = container.querySelector('circle');\n    expect(fakeRef.current).toBe(circle);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/Line.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Line } from '../src';\n\ndescribe('<Line />', () => {\n  test('it should be defined', () => {\n    expect(Line).toBeDefined();\n  });\n\n  test('it should contain a <line />', () => {\n    const { container } = render(\n      <svg>\n        <Line />\n      </svg>,\n    );\n    expect(container.querySelector('line')).toBeInTheDocument();\n  });\n\n  test('it should have the .visx-line class', () => {\n    const { container } = render(\n      <svg>\n        <Line />\n      </svg>,\n    );\n    expect(container.querySelector('line')).toHaveClass('visx-line');\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGLineElement>();\n    const { container } = render(\n      <svg>\n        <Line innerRef={fakeRef} />\n      </svg>,\n    );\n    const lineElement = container.querySelector('line');\n    expect(fakeRef.current).toBe(lineElement);\n  });\n\n  test('it should set shapeRendering to auto if not rectilinear', () => {\n    const { container } = render(\n      <svg>\n        <Line\n          to={{\n            x: 50,\n            y: 100,\n          }}\n        />\n      </svg>,\n    );\n    expect(container.querySelector('line')).toHaveAttribute('shape-rendering', 'auto');\n  });\n\n  test('it should set shapeRendering to crispEdges if rectilinear', () => {\n    const { container } = render(\n      <svg>\n        <Line\n          to={{\n            x: 0,\n            y: 100,\n          }}\n        />\n      </svg>,\n    );\n    expect(container.querySelector('line')).toHaveAttribute('shape-rendering', 'crispEdges');\n\n    const { container: container2 } = render(\n      <svg>\n        <Line\n          to={{\n            x: 100,\n            y: 0,\n          }}\n        />\n      </svg>,\n    );\n    expect(container2.querySelector('line')).toHaveAttribute('shape-rendering', 'crispEdges');\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/LinePath.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { LinePath } from '../src';\n\ninterface Datum {\n  x: number;\n  y: number;\n}\n\nconst linePathProps = {\n  data: [\n    { x: 0, y: 0 },\n    { x: 1, y: 1 },\n  ],\n  x: (d: Datum) => d.x,\n  y: (d: Datum) => d.y,\n};\n\ndescribe('<LinePath />', () => {\n  it('should be defined', () => {\n    expect(LinePath).toBeDefined();\n  });\n\n  it('should have the .visx-linepath class', () => {\n    const { container } = render(\n      <svg>\n        <LinePath {...linePathProps} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path).toHaveClass('visx-linepath');\n  });\n\n  it('should default to strokeLinecap=\"round\" for superior missing data rendering', () => {\n    const { container } = render(\n      <svg>\n        <LinePath {...linePathProps} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path).toHaveAttribute('stroke-linecap', 'round');\n  });\n\n  it('should render path element', () => {\n    const { container } = render(\n      <svg>\n        <LinePath {...linePathProps} />\n      </svg>,\n    );\n    const paths = container.querySelectorAll('path');\n    expect(paths.length).toBeGreaterThan(0);\n  });\n\n  it('should take a children as function prop', () => {\n    const fn = vi.fn(() => null);\n    render(\n      <svg>\n        <LinePath>{fn}</LinePath>\n      </svg>,\n    );\n    expect(fn).toHaveBeenCalled();\n  });\n\n  it('should call children function with { path }', () => {\n    const fn = vi.fn((_) => null);\n    render(\n      <svg>\n        <LinePath>{fn}</LinePath>\n      </svg>,\n    );\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  it('should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n    const { container } = render(\n      <svg>\n        <LinePath data={linePathProps.data} innerRef={fakeRef} />\n      </svg>,\n    );\n    const pathElement = container.querySelector('path');\n    expect(fakeRef.current).toBe(pathElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/LineRadial.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { LineRadial } from '../src';\n\ninterface Datum {\n  x: number;\n  y: number;\n}\n\nconst mockProps = {\n  data: [\n    { x: 0, y: 0 },\n    { x: 1, y: 1 },\n  ],\n  angle: (d: Datum) => d.x,\n  radius: (d: Datum) => d.y,\n};\n\ndescribe('<LineRadial />', () => {\n  test('it should be defined', () => {\n    expect(LineRadial).toBeDefined();\n  });\n\n  test('it should have the .visx-line-radial class', () => {\n    const { container } = render(\n      <svg>\n        <LineRadial {...mockProps} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path).toHaveClass('visx-line-radial');\n  });\n\n  test('it should contain paths', () => {\n    const { container } = render(\n      <svg>\n        <LineRadial {...mockProps} />\n      </svg>,\n    );\n    const paths = container.querySelectorAll('path');\n    expect(paths.length).toBeGreaterThan(0);\n  });\n\n  test('it should take a children as function prop', () => {\n    const fn = vi.fn(() => <g />);\n    render(\n      <svg>\n        <LineRadial {...mockProps}>{fn}</LineRadial>\n      </svg>,\n    );\n    expect(fn).toHaveBeenCalled();\n  });\n\n  test('it should call children function with { path }', () => {\n    const fn = vi.fn(() => <g />);\n    render(\n      <svg>\n        <LineRadial {...mockProps}>{fn}</LineRadial>\n      </svg>,\n    );\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n    const { container } = render(\n      <svg>\n        <LineRadial innerRef={fakeRef} {...mockProps} />\n      </svg>,\n    );\n    const pathElement = container.querySelector('path');\n    expect(fakeRef.current).toBe(pathElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/LinkHorizontal.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { hierarchy } from 'd3-hierarchy';\nimport { LinkHorizontal } from '../src';\n\nconst mockHierarchy = hierarchy({\n  name: 'Eve',\n  children: [\n    { name: 'Cain' },\n    {\n      name: 'Seth',\n      children: [{ name: 'Enos' }, { name: 'Noam' }],\n    },\n  ],\n});\n\nconst link = mockHierarchy.links()[0];\n\ndescribe('<LinkHorizontal />', () => {\n  test('it should be defined', () => {\n    expect(LinkHorizontal).toBeDefined();\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n    const { container } = render(\n      <svg>\n        <LinkHorizontal innerRef={fakeRef} data={link} />\n      </svg>,\n    );\n    const PathElement = container.querySelector('path');\n    expect(fakeRef.current).toContainElement(PathElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/LinkRadial.test.tsx",
    "content": "import { LinkRadial } from '../src';\n\ndescribe('<LinkRadial />', () => {\n  test('it should be defined', () => {\n    expect(LinkRadial).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/LinkVertical.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { hierarchy } from 'd3-hierarchy';\nimport { LinkVertical } from '../src';\n\nconst mockHierarchy = hierarchy({\n  name: 'Eve',\n  children: [\n    { name: 'Cain' },\n    {\n      name: 'Seth',\n      children: [{ name: 'Enos' }, { name: 'Noam' }],\n    },\n  ],\n});\nconst link = mockHierarchy.links()[0];\n\ndescribe('<LinkVertical />', () => {\n  test('it should be defined', () => {\n    expect(LinkVertical).toBeDefined();\n  });\n\n  test('it should expose its ref via an innerRef prop', () => {\n    const fakeRef = React.createRef<SVGPathElement>();\n\n    const { container } = render(\n      <svg>\n        <LinkVertical data={link} innerRef={fakeRef} />\n      </svg>,\n    );\n    const PathElement = container.querySelector('path');\n    expect(fakeRef.current).toContainElement(PathElement);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/Pie.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Pie } from '../src';\nimport { addMock, removeMock } from './svgMock';\nimport type { PieArcDatum, ProvidedProps } from '../src/shapes/Pie';\n\ninterface Datum {\n  date: string;\n  'Google Chrome': string;\n  'Internet Explorer': string;\n  Firefox: string;\n  Safari: string;\n  'Microsoft Edge': string;\n  Opera: string;\n  Mozilla: string;\n  'Other/Unknown': string;\n  color: string;\n}\n\nconst browserUsage: Datum[] = [\n  {\n    date: '2015 Jun 15',\n    'Google Chrome': '48.09',\n    'Internet Explorer': '24.14',\n    Firefox: '18.82',\n    Safari: '7.46',\n    'Microsoft Edge': '0.03',\n    Opera: '1.32',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n    color: 'blue',\n  },\n  {\n    date: '2015 Jun 16',\n    'Google Chrome': '48',\n    'Internet Explorer': '24.19',\n    Firefox: '18.96',\n    Safari: '7.36',\n    'Microsoft Edge': '0.03',\n    Opera: '1.32',\n    Mozilla: '0.12',\n    'Other/Unknown': '0.01',\n    color: 'red',\n  },\n];\n\ndescribe('<Pie />', () => {\n  beforeAll(() => {\n    // eslint-disable-next-line\n    vi.spyOn(console, 'error').mockImplementation(() => { });\n    addMock();\n  });\n\n  afterAll(() => {\n    vi.restoreAllMocks();\n    removeMock();\n  });\n\n  test('it should be defined', () => {\n    expect(Pie).toBeDefined();\n  });\n\n  test('it should not break on sort callbacks', () => {\n    expect(() =>\n      render(\n        <svg>\n          <Pie data={browserUsage} pieSort={() => 0} pieSortValues={() => 0} />\n        </svg>,\n      ),\n    ).not.toThrow();\n  });\n\n  test('it should accept null sort callbacks', () => {\n    expect.assertions(3);\n\n    const { container } = render(\n      <svg>\n        <Pie data={browserUsage} pieSort={null} pieSortValues={null} />\n      </svg>,\n    );\n    expect(container).toBeInTheDocument();\n\n    const A = 1;\n    const B = 20;\n    // eslint-disable-next-line\n    const childrenFn = vi.fn(({ }) => null);\n\n    render(\n      <svg>\n        <Pie data={[A, B]} pieSortValues={null}>\n          {childrenFn}\n        </Pie>\n      </svg>,\n    );\n\n    const args = childrenFn.mock.calls[0][0] as ProvidedProps<Datum>;\n    expect(args.arcs[0]).toMatchObject({ value: A, index: 0 });\n    expect(args.arcs[1]).toMatchObject({ value: B, index: 1 });\n  });\n\n  test('it should render pie chart with correct structure', () => {\n    const { container } = render(\n      <svg>\n        <Pie data={browserUsage} />\n      </svg>,\n    );\n    const group = container.querySelector('.visx-pie-arcs-group');\n    expect(group).toBeInTheDocument();\n    const paths = container.querySelectorAll('path');\n    expect(paths).toHaveLength(browserUsage.length);\n  });\n\n  test('it should handle children render prop correctly', () => {\n    // eslint-disable-next-line\n    const childrenFn = vi.fn(({ }) => null);\n    render(\n      <svg>\n        <Pie data={browserUsage}>{childrenFn}</Pie>\n      </svg>,\n    );\n\n    expect(childrenFn).toHaveBeenCalled();\n    const args = childrenFn.mock.calls[0][0];\n    expect(args).toHaveProperty('path');\n    expect(args).toHaveProperty('arcs');\n    expect(args).toHaveProperty('pie');\n  });\n\n  test('it should accept a custom fill function', () => {\n    const { container } = render(\n      <svg>\n        <Pie data={browserUsage} fill={(datum: PieArcDatum<Datum>) => datum.data.color} />\n      </svg>,\n    );\n\n    const paths = container.querySelectorAll('path');\n    expect(paths[0]).toHaveAttribute('fill', 'blue');\n    expect(paths[1]).toHaveAttribute('fill', 'red');\n  });\n\n  test('it should accept a constant string fill value', () => {\n    const { container } = render(\n      <svg>\n        <Pie data={browserUsage} fill=\"purple\" />\n      </svg>,\n    );\n\n    const paths = container.querySelectorAll('path');\n    expect(paths[0]).toHaveAttribute('fill', 'purple');\n    expect(paths[1]).toHaveAttribute('fill', 'purple');\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/Polygon.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render, fireEvent } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Polygon } from '../src';\n\ndescribe('<Polygon />', () => {\n  const renderInSvg = (ui: React.ReactElement) => render(<svg>{ui}</svg>);\n\n  it('should be defined', () => {\n    expect(Polygon).toBeDefined();\n  });\n\n  it('should render an octagon', () => {\n    const { container } = renderInSvg(<Polygon sides={8} size={25} />);\n    const polygon = container.querySelector('polygon');\n    expect(polygon).toBeInTheDocument();\n    const points = polygon?.getAttribute('points')?.split(' ');\n    expect(points).toHaveLength(8);\n  });\n\n  it('should add classname', () => {\n    const { container } = renderInSvg(<Polygon sides={6} size={25} className=\"a-polygon\" />);\n    const polygon = container.querySelector('polygon');\n    expect(polygon).toBeInTheDocument();\n    expect(polygon).toHaveClass('visx-polygon');\n    expect(polygon).toHaveClass('a-polygon');\n  });\n\n  it('should add onClick handler', () => {\n    const fn = vi.fn();\n    const { container } = renderInSvg(\n      <Polygon sides={6} size={25} className=\"a-polygon\" onClick={fn} />,\n    );\n    const polygon = container.querySelector('polygon');\n    expect(polygon).toBeInTheDocument();\n    fireEvent.click(polygon as Element);\n    expect(fn).toHaveBeenCalled();\n  });\n\n  it('should render children function', () => {\n    const fn = vi.fn(() => <g data-testid=\"child\" />);\n    const { getByTestId } = renderInSvg(\n      <Polygon sides={8} size={25}>\n        {fn}\n      </Polygon>,\n    );\n    expect(fn).toHaveBeenCalled();\n    expect(getByTestId('child')).toBeInTheDocument();\n  });\n\n  it('should pass points to children function', () => {\n    const fn = vi.fn(() => null);\n    renderInSvg(\n      <Polygon sides={8} size={25}>\n        {fn}\n      </Polygon>,\n    );\n    const args = fn.mock.calls[0][0];\n    expect(args).toHaveProperty('points');\n    expect(args.points).toHaveLength(8);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/Stack.test.tsx",
    "content": "import { Stack } from '../src';\n\ndescribe('<Stack />', () => {\n  test('it should be defined', () => {\n    expect(Stack).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/stackOffset.test.ts",
    "content": "import { stackOffset, STACK_OFFSETS, STACK_OFFSET_NAMES } from '../src';\n\ndescribe('STACK_OFFSETS', () => {\n  test('it should be defined', () => {\n    expect(STACK_OFFSETS).toBeDefined();\n  });\n\n  test(\"it's keys should match STACK_OFFSET_NAMES\", () => {\n    expect(Object.keys(STACK_OFFSETS)).toEqual(STACK_OFFSET_NAMES);\n  });\n});\n\ndescribe('stackOffset()', () => {\n  test('it should default to d3.stackOffsetNone', () => {\n    // @ts-expect-error allow invalid input\n    const offset = stackOffset('x');\n    expect(offset).toEqual(STACK_OFFSETS.none);\n  });\n\n  test('it should return corresponding offset for given offset name', () => {\n    const offset = stackOffset('expand');\n    expect(offset).toEqual(STACK_OFFSETS.expand);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/stackOrder.test.ts",
    "content": "import { stackOrder, STACK_ORDERS, STACK_ORDER_NAMES } from '../src';\n\ndescribe('STACK_ORDERS', () => {\n  test('it should be defined', () => {\n    expect(STACK_ORDERS).toBeDefined();\n  });\n\n  test(\"it's keys should match STACK_ORDER_NAMES\", () => {\n    expect(Object.keys(STACK_ORDERS)).toEqual(STACK_ORDER_NAMES);\n  });\n});\n\ndescribe('stackOrders()', () => {\n  test('it should default to d3.stackOrderNone', () => {\n    // @ts-expect-error allow invalid input\n    const offset = stackOrder('x');\n    expect(offset).toEqual(STACK_ORDERS.none);\n  });\n\n  test('it should return corresponding order for given order name', () => {\n    const offset = stackOrder('ascending');\n    expect(offset).toEqual(STACK_ORDERS.ascending);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/svgMock.ts",
    "content": "// @ts-expect-error\nlet originalFn: typeof SVGElement.prototype.getComputedTextLength;\n\n/**\n * JSDom does not implement getComputedTextLength()\n * so this function add mock implementation for testing.\n */\nexport function addMock() {\n  // @ts-expect-error\n  originalFn = SVGElement.prototype.getComputedTextLength;\n\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = function getComputedTextLength() {\n    // Make every character 10px wide\n    return (this.textContent?.length ?? 0) * 10;\n  };\n}\n\n/**\n * Remove mock from addMock()\n */\nexport function removeMock() {\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = originalFn;\n}\n"
  },
  {
    "path": "packages/visx-shape/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-shape/test/utils/D3ShapeFactories.test.ts",
    "content": "import { curveBasis, stackOrderDescending, stackOffsetExpand } from '@visx/vendor/d3-shape';\nimport { arc, area, pie, line, radialLine, stack } from '../../src/util/D3ShapeFactories';\n\ndescribe('D3ShapeFactories', () => {\n  describe('arc()', () => {\n    it('innerRadius', () => {\n      expect(arc({ innerRadius: 1 }).innerRadius()({})).toBe(1);\n    });\n    it('outerRadius', () => {\n      expect(arc({ outerRadius: 1 }).outerRadius()({})).toBe(1);\n    });\n    it('cornerRadius', () => {\n      expect(arc({ cornerRadius: 1 }).cornerRadius()({})).toBe(1);\n    });\n    it('startAngle', () => {\n      expect(arc({ startAngle: 1 }).startAngle()({})).toBe(1);\n    });\n    it('endAngle', () => {\n      expect(arc({ endAngle: 1 }).endAngle()({})).toBe(1);\n    });\n    it('padAngle', () => {\n      expect(arc({ padAngle: 1 }).padAngle()({})).toBe(1);\n    });\n    it('padRadius', () => {\n      expect(arc({ padRadius: 1 }).padRadius()!({})).toBe(1);\n    });\n  });\n\n  describe('area()', () => {\n    it('x', () => {\n      expect(area({ x: 1 }).x()({}, 0, [])).toBe(1);\n    });\n    it('x0', () => {\n      expect(area({ x0: 1 }).x0()({}, 0, [])).toBe(1);\n    });\n    it('x1', () => {\n      expect(area({ x1: 1 }).x1()!({}, 0, [])).toBe(1);\n    });\n    it('y', () => {\n      expect(area({ y: 1 }).y()({}, 0, [])).toBe(1);\n    });\n    it('y0', () => {\n      expect(area({ y0: 1 }).y0()({}, 0, [])).toBe(1);\n    });\n    it('y1', () => {\n      expect(area({ y1: 1 }).y1()!({}, 0, [])).toBe(1);\n    });\n    it('defined', () => {\n      expect(area({ defined: () => true }).defined()({}, 0, [])).toBe(true);\n    });\n    it('curve', () => {\n      expect(area({ curve: curveBasis }).curve()).toEqual(curveBasis);\n    });\n  });\n\n  describe('line()', () => {\n    it('x', () => {\n      expect(line({ x: 1 }).x()({}, 0, [])).toBe(1);\n    });\n    it('y', () => {\n      expect(line({ y: 1 }).y()({}, 0, [])).toBe(1);\n    });\n    it('defined', () => {\n      expect(line({ defined: () => true }).defined()({}, 0, [])).toBe(true);\n    });\n    it('curve', () => {\n      expect(line({ curve: curveBasis }).curve()).toEqual(curveBasis);\n    });\n  });\n\n  describe('pie()', () => {\n    it('startAngle', () => {\n      expect(pie({ startAngle: 1 }).startAngle()([])).toBe(1);\n    });\n    it('endAngle', () => {\n      expect(pie({ endAngle: 1 }).endAngle()([])).toBe(1);\n    });\n    it('padAngle', () => {\n      expect(pie({ padAngle: 1 }).padAngle()([])).toBe(1);\n    });\n    it('value', () => {\n      expect(pie({ value: () => 1 }).value()({}, 1, [])).toBe(1);\n    });\n    it('sort', () => {\n      expect(pie({ sort: () => 1 }).sort()!({}, {})).toBe(1);\n    });\n    it('sortValues', () => {\n      expect(pie({ sortValues: () => 1 }).sortValues()!(2, 1)).toBe(1);\n    });\n  });\n\n  describe('radialLine()', () => {\n    it('angle', () => {\n      expect(radialLine({ angle: 1 }).angle()({}, 1, [])).toBe(1);\n    });\n    it('radius', () => {\n      expect(radialLine({ radius: 1 }).radius()({}, 1, [])).toBe(1);\n    });\n    it('defined', () => {\n      expect(radialLine({ defined: () => true }).defined()({}, 0, [])).toBe(true);\n    });\n    it('curve', () => {\n      expect(radialLine({ curve: curveBasis }).curve()).toEqual(curveBasis);\n    });\n  });\n\n  describe('stack()', () => {\n    it('keys', () => {\n      expect(stack({ keys: ['a', 'b', 'c'] }).keys()([])).toEqual(['a', 'b', 'c']);\n    });\n    it('value', () => {\n      expect(stack({ value: () => 1 }).value()({}, '', 1, [])).toBe(1);\n    });\n    it('order', () => {\n      expect(stack({ order: 'descending' }).order()).toEqual(stackOrderDescending);\n    });\n    it('offset', () => {\n      expect(stack({ offset: 'expand' }).offset()).toEqual(stackOffsetExpand);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/test/utils/getBandwidth.test.ts",
    "content": "import { scaleBand, scalePoint, scaleOrdinal } from '@visx/scale';\nimport getBandwidth from '../../src/util/getBandwidth';\n\ndescribe('getBandwidth()', () => {\n  it('returns bandwidth for scales that natively supports', () => {\n    const scale1 = scaleBand({ domain: ['bacon', 'egg'], range: [0, 100] });\n    expect(getBandwidth(scale1)).toBe(50);\n    const scale2 = scalePoint({ domain: ['bacon', 'egg'], range: [0, 100] });\n    expect(getBandwidth(scale2)).toBe(0);\n  });\n  it('otherwise compute band from domain and range', () => {\n    const scale = scaleOrdinal({ domain: ['bacon', 'egg'], range: [0, 100] });\n    expect(getBandwidth(scale)).toBe(50);\n  });\n});\n"
  },
  {
    "path": "packages/visx-shape/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-curve\"\n    },\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-shape/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/shape',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-shape/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/shape': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-stats/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-stats/Readme.md",
    "content": "# @visx/stats\n\n<a title=\"@visx/stats npm downloads\" href=\"https://www.npmjs.com/package/@visx/stats\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/stats.svg?style=flat-square\" />\n</a>\n\nThe package provides `react` components for visualizing distributions, such as Box Plots and Violin\nPlots\n\n## Installation\n\n```\nnpm install --save @visx/stats\n```\n"
  },
  {
    "path": "packages/visx-stats/package.json",
    "content": "{\n  \"name\": \"@visx/stats\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx stats box violin\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@conglei\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-stats/src/BoxPlot.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport classnames from 'classnames';\nimport { Group } from '@visx/group';\nimport type { PickD3Scale, ContinuousDomainScaleType } from '@visx/scale';\nimport type { SharedProps, ChildRenderProps, LineCoords } from './types';\n\nfunction verticalToHorizontal({ x1, x2, y1, y2 }: LineCoords) {\n  return {\n    x1: y1,\n    x2: y2,\n    y1: x1,\n    y2: x2,\n  };\n}\n\nexport type BoxPlotProps = SharedProps & {\n  /** Scale for converting input values to pixel offsets. */\n  valueScale: PickD3Scale<ContinuousDomainScaleType, number>;\n  /** Maximum BoxPlot value. */\n  max?: number;\n  /** Minimum BoxPlot value. */\n  min?: number;\n  /** First quartile BoxPlot value. */\n  firstQuartile?: number;\n  /** Third quartile BoxPlot value. */\n  thirdQuartile?: number;\n  /** Median BoxPlot value. */\n  median?: number;\n  /** Width of the BoxPlot. */\n  boxWidth?: number;\n  /** Fill color to apply to outlier circles and BoxPlot rect. */\n  fill?: string;\n  /** Fill color opacity to apply to outlier circles and BoxPlot rect. */\n  fillOpacity?: number | string;\n  /** Stroke color to apply to outlier circles, BoxPlot rect, and min/median/max lines. */\n  stroke?: string;\n  /** Stroke width to apply to outlier circles, BoxPlot rect, and min/median/max lines. */\n  strokeWidth?: number | string;\n  /** Rx to apply to BoxPlot rect. */\n  rx?: number;\n  /** Ry to apply to BoxPlot rect. */\n  ry?: number;\n  /** Array of outlier values to be rendered. */\n  outliers?: number[];\n  /** Props to pass to the median glyph line. */\n  medianProps?: SVGProps<SVGLineElement>;\n  /** Props to pass to the maximum glyph line. */\n  maxProps?: SVGProps<SVGLineElement>;\n  /** Props to pass to the minimum glyph line. */\n  minProps?: SVGProps<SVGLineElement>;\n  /** Props to pass to the box glyph rect. */\n  boxProps?: SVGProps<SVGRectElement>;\n  /** Props to pass to the outlier glyph circles. */\n  outlierProps?: SVGProps<SVGCircleElement>;\n  /** Whether to render a container rect element (e.g., to capture mouse events). */\n  container?: boolean;\n  /** Props to pass to the container glyph rect if rendered. */\n  containerProps?: SVGProps<SVGRectElement>;\n  /** Override render function to fully control the rendering of the BoxPlot glyph. */\n  children?: (childRenderProps: ChildRenderProps) => ReactNode;\n};\n\nexport default function BoxPlot({\n  left = 0,\n  top = 0,\n  className,\n  max,\n  min,\n  firstQuartile,\n  thirdQuartile,\n  median,\n  boxWidth = 10,\n  fill,\n  fillOpacity,\n  stroke,\n  strokeWidth,\n  rx = 2,\n  ry = 2,\n  valueScale,\n  outliers = [],\n  horizontal,\n  medianProps = {},\n  maxProps = {},\n  minProps = {},\n  boxProps = {},\n  outlierProps = {},\n  container = false,\n  containerProps = {},\n  children,\n}: BoxPlotProps) {\n  const offset = horizontal ? top : left;\n  const center = offset + (boxWidth || 0) / 2;\n  const valueRange = valueScale.range();\n\n  const minValue = valueScale(min ?? 0);\n  const firstQuartileValue = valueScale(firstQuartile ?? 0);\n  const medianValue = valueScale(median ?? 0);\n  const thirdQuartileValue = valueScale(thirdQuartile ?? 0);\n  const maxValue = valueScale(max ?? 0);\n\n  const boxplot: ChildRenderProps = {\n    valueRange,\n    center,\n    offset,\n    boxWidth,\n    max: {\n      x1: center - (boxWidth || 0) / 4,\n      x2: center + (boxWidth || 0) / 4,\n      y1: maxValue,\n      y2: maxValue,\n    },\n    maxToThird: {\n      x1: center,\n      x2: center,\n      y1: maxValue,\n      y2: thirdQuartileValue,\n    },\n    median: {\n      x1: offset,\n      x2: offset + (boxWidth || 0),\n      y1: medianValue,\n      y2: medianValue,\n    },\n    minToFirst: {\n      x1: center,\n      x2: center,\n      y1: firstQuartileValue,\n      y2: minValue,\n    },\n    min: {\n      x1: center - (boxWidth || 0) / 4,\n      x2: center + (boxWidth || 0) / 4,\n      y1: minValue,\n      y2: minValue,\n    },\n    box: {\n      x1: offset,\n      x2: boxWidth || 0,\n      y1: thirdQuartileValue,\n      y2: Math.abs(thirdQuartileValue - firstQuartileValue),\n    },\n    container: {\n      x1: offset,\n      x2: boxWidth || 0,\n      y1: Math.min(...valueRange),\n      y2: Math.abs(valueRange[0] - valueRange[1]),\n    },\n  };\n\n  if (horizontal) {\n    boxplot.max = verticalToHorizontal(boxplot.max);\n    boxplot.maxToThird = verticalToHorizontal(boxplot.maxToThird);\n    boxplot.box.y1 = firstQuartileValue;\n    boxplot.box = verticalToHorizontal(boxplot.box);\n    boxplot.median = verticalToHorizontal(boxplot.median);\n    boxplot.minToFirst = verticalToHorizontal(boxplot.minToFirst);\n    boxplot.min = verticalToHorizontal(boxplot.min);\n    boxplot.container = verticalToHorizontal(boxplot.container);\n    boxplot.container.y1 = Math.min(...valueRange);\n  }\n\n  if (children) return <>{children(boxplot)}</>;\n\n  return (\n    <Group className={classnames('visx-boxplot', className)}>\n      {outliers.map((d, i) => {\n        const cx = horizontal ? valueScale(d) : center;\n        const cy = horizontal ? center : valueScale(d);\n        return (\n          <circle\n            key={`visx-boxplot-outlier-${i}`}\n            className=\"visx-boxplot-outlier\"\n            cx={cx}\n            cy={cy}\n            r={4}\n            stroke={stroke}\n            strokeWidth={strokeWidth}\n            fill={fill}\n            fillOpacity={fillOpacity}\n            {...outlierProps}\n          />\n        );\n      })}\n      <line\n        className=\"visx-boxplot-max\"\n        x1={boxplot.max.x1}\n        y1={boxplot.max.y1}\n        x2={boxplot.max.x2}\n        y2={boxplot.max.y2}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        {...maxProps}\n      />\n      <line\n        className=\"visx-boxplot-max-to-third\"\n        x1={boxplot.maxToThird.x1}\n        y1={boxplot.maxToThird.y1}\n        x2={boxplot.maxToThird.x2}\n        y2={boxplot.maxToThird.y2}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n      />\n      <rect\n        className=\"visx-boxplot-box\"\n        x={boxplot.box.x1}\n        y={boxplot.box.y1}\n        width={boxplot.box.x2}\n        height={boxplot.box.y2}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        fill={fill}\n        fillOpacity={fillOpacity}\n        rx={rx}\n        ry={ry}\n        {...boxProps}\n      />\n      <line\n        className=\"visx-boxplot-median\"\n        x1={boxplot.median.x1}\n        y1={boxplot.median.y1}\n        x2={boxplot.median.x2}\n        y2={boxplot.median.y2}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        {...medianProps}\n      />\n      <line\n        className=\"visx-boxplot-min-to-first\"\n        x1={boxplot.minToFirst.x1}\n        y1={boxplot.minToFirst.y1}\n        x2={boxplot.minToFirst.x2}\n        y2={boxplot.minToFirst.y2}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n      />\n      <line\n        className=\"visx-boxplot-min\"\n        x1={boxplot.min.x1}\n        y1={boxplot.min.y1}\n        x2={boxplot.min.x2}\n        y2={boxplot.min.y2}\n        stroke={stroke}\n        strokeWidth={strokeWidth}\n        {...minProps}\n      />\n      {container && (\n        <rect\n          x={boxplot.container.x1}\n          y={boxplot.container.y1}\n          width={boxplot.container.x2}\n          height={boxplot.container.y2}\n          fillOpacity=\"0\"\n          {...containerProps}\n        />\n      )}\n    </Group>\n  );\n}\n"
  },
  {
    "path": "packages/visx-stats/src/ViolinPlot.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\nimport type { PickD3Scale, ContinuousDomainScaleType } from '@visx/scale';\nimport { scaleLinear } from '@visx/scale';\nimport { line, curveCardinal } from '@visx/vendor/d3-shape';\nimport type { SharedProps } from './types';\n\nexport type ViolinPlotProps<Datum extends object> = SharedProps & {\n  /** Scale for converting values to pixel offsets. */\n  valueScale: PickD3Scale<ContinuousDomainScaleType, number>;\n  /** Data used to draw the violin plot glyph. Violin plot values and counts should be able to be derived from data. */\n  data: Datum[];\n  /** Given an datum, returns the count for it. */\n  count?: (d: Datum) => number;\n  /** Given an datum, returns the value for it. */\n  value?: (d: Datum) => number;\n  /** Width of the violin plot glyph. */\n  width?: number;\n  /** Override render function to fully control the rendering of the ViolinPlot glyph. */\n  children?: (providedProps: { path: string }) => ReactNode;\n};\n\nconst defaultCountAccessor = (d: { count?: unknown }) =>\n  typeof d.count === 'number' ? d.count : 0;\nconst defaultValueAccessor = (d: { value?: unknown }) =>\n  typeof d.value === 'number' ? d.value : 0;\n\nexport default function ViolinPlot<Datum extends object>({\n  left = 0,\n  top = 0,\n  className,\n  data,\n  width = 10,\n  count = defaultCountAccessor,\n  value = defaultValueAccessor,\n  valueScale,\n  horizontal,\n  children,\n  ...restProps\n}: ViolinPlotProps<Datum> & Omit<SVGProps<SVGPathElement>, keyof ViolinPlotProps<Datum>>) {\n  const center = (horizontal ? top : left) + width / 2;\n  const binCounts = data.map((bin) => count(bin));\n  const widthScale = scaleLinear<number>({\n    range: [0, width / 2],\n    round: true,\n    domain: [0, Math.max(...binCounts)],\n  });\n\n  let path = '';\n\n  if (horizontal) {\n    const topCurve = line<Datum>()\n      .x((d) => valueScale(value(d)) ?? 0)\n      .y((d) => center - (widthScale(count(d)) ?? 0))\n      .curve(curveCardinal);\n\n    const bottomCurve = line<Datum>()\n      .x((d) => valueScale(value(d)) ?? 0)\n      .y((d) => center + (widthScale(count(d)) ?? 0))\n      .curve(curveCardinal);\n\n    const topCurvePath = topCurve(data) || '';\n    const bottomCurvePath = bottomCurve([...data].reverse()) || '';\n    path = `${topCurvePath} ${bottomCurvePath.replace('M', 'L')} Z`;\n  } else {\n    const rightCurve = line<Datum>()\n      .x((d) => center + (widthScale(count(d)) ?? 0))\n      .y((d) => valueScale(value(d)) ?? 0)\n      .curve(curveCardinal);\n\n    const leftCurve = line<Datum>()\n      .x((d) => center - (widthScale(count(d)) ?? 0))\n      .y((d) => valueScale(value(d)) ?? 0)\n      .curve(curveCardinal);\n\n    const rightCurvePath = rightCurve(data) || '';\n    const leftCurvePath = leftCurve([...data].reverse()) || '';\n    path = `${rightCurvePath} ${leftCurvePath.replace('M', 'L')} Z`;\n  }\n  if (children) return <>{children({ path })}</>;\n  return <path className={cx('visx-violin', className)} d={path} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-stats/src/index.ts",
    "content": "// @visx/stats\nexport { default as BoxPlot } from './BoxPlot';\nexport { default as ViolinPlot } from './ViolinPlot';\nexport { default as computeStats } from './util/computeStats';\n\nexport type * from './types';\nexport type { BoxPlotProps } from './BoxPlot';\nexport type { ViolinPlotProps } from './ViolinPlot';\n"
  },
  {
    "path": "packages/visx-stats/src/types.ts",
    "content": "export interface BoxPlot {\n  min?: number;\n  firstQuartile?: number;\n  median?: number;\n  thirdQuartile?: number;\n  max?: number;\n  outliers: number[];\n}\n\nexport interface BinDatum {\n  value: number;\n  count: number;\n}\n\nexport interface LineCoords {\n  x1: number;\n  x2: number;\n  y1: number;\n  y2: number;\n}\n\nexport type ChildRenderProps = {\n  /** Output value range of the provided scale. */\n  valueRange: number[] | [number, number];\n  /** Center (top if horizontal=true, else left) of single boxplot. */\n  center: number;\n  /** Top offset if horizontal=true, else left offset. */\n  offset: number;\n  /** Specified width of BoxPlot */\n  boxWidth?: number;\n  /** Computed coordinates of the maximum line. */\n  max: LineCoords;\n  /** Computed coordinates of the line from maximum to third quartile. */\n  maxToThird: LineCoords;\n  /** Computed coordinates of the median line. */\n  median: LineCoords;\n  /** Computed coordinates of the line from first quartile to minimum. */\n  minToFirst: LineCoords;\n  /** Computed coordinates of the minimum line. */\n  min: LineCoords;\n  /** Computed coordinates of the boxplot box (i.e., not whiskers) rect. */\n  box: LineCoords;\n  /** Computed coordinates of the entire glyph container rect. */\n  container: LineCoords;\n};\n\nexport type SharedProps = {\n  /** Left pixel offset of the glyph. */\n  left?: number;\n  /** Top pixel offset of the glyph. */\n  top?: number;\n  /** Classname to apply to parent group element. */\n  className?: string;\n  /** Whether the glyph should be rendered horizontally instead of vertically. */\n  horizontal?: boolean;\n};\n"
  },
  {
    "path": "packages/visx-stats/src/util/computeStats.ts",
    "content": "import type { BoxPlot, BinDatum } from '../types';\n\nfunction calcMedian(dataSet: number[]) {\n  const half = Math.floor(dataSet.length / 2);\n  if (dataSet.length % 2) return dataSet[half];\n  return (dataSet[half - 1] + dataSet[half]) / 2;\n}\n\nexport default function computeStats(numericalArray: number[]) {\n  const points = [...numericalArray].sort((a, b) => a - b);\n  const sampleSize = points.length;\n\n  const median = calcMedian(points);\n\n  // calculate median of first half i.e. firstQuartile\n  const lowerHalfLength = Math.floor(sampleSize / 2);\n  const lowerHalf = points.slice(0, lowerHalfLength);\n  const firstQuartile = calcMedian(lowerHalf);\n\n  // calculate median of first half i.e. secondQuartile\n  const upperHalfLength = Math.ceil(sampleSize / 2);\n  const upperHalf = points.slice(upperHalfLength);\n  const thirdQuartile = calcMedian(upperHalf);\n  const IQR = thirdQuartile - firstQuartile;\n\n  let min = firstQuartile - 1.5 * IQR;\n  let max = thirdQuartile + 1.5 * IQR;\n\n  const outliers = points.filter((p) => p < min || p > max);\n  if (outliers.length === 0) {\n    min = Math.min(...points);\n    max = Math.max(...points);\n  }\n  const binWidth = 2 * IQR * (sampleSize - outliers.length) ** (-1 / 3);\n  const binCount = Math.round((max - min) / binWidth);\n  const actualBinWidth = (max - min) / binCount;\n\n  const bins = new Array(binCount + 2).fill(0);\n  const values = new Array(binCount + 2).fill(min);\n\n  for (let i = 1; i <= binCount; i += 1) {\n    values[i] += actualBinWidth * (i - 0.5);\n  }\n\n  values[values.length - 1] = max;\n\n  points\n    .filter((p) => p >= min && p <= max)\n    .forEach((p) => {\n      bins[Math.floor((p - min) / actualBinWidth) + 1] += 1;\n    });\n\n  const binData: BinDatum[] = values.map((v, i) => ({\n    value: v,\n    count: bins[i],\n  }));\n\n  const boxPlot: BoxPlot = {\n    min,\n    firstQuartile,\n    median,\n    thirdQuartile,\n    max,\n    outliers,\n  };\n\n  return {\n    boxPlot,\n    binData,\n  };\n}\n"
  },
  {
    "path": "packages/visx-stats/test/BoxPlot.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { BoxPlot, computeStats } from '../src';\n\nconst data = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 1];\nconst { boxPlot: boxPlotData } = computeStats(data);\nconst { min, firstQuartile, median, thirdQuartile, max, outliers } = boxPlotData;\n\nconst valueScale = scaleLinear<number>({\n  range: [10, 0],\n  round: true,\n  domain: [0, 10],\n});\n\ndescribe('<BoxPlot />', () => {\n  const renderBoxPlot = () =>\n    render(\n      <svg width={100} height={100}>\n        <BoxPlot\n          min={min}\n          max={max}\n          left={0}\n          firstQuartile={firstQuartile}\n          thirdQuartile={thirdQuartile}\n          median={median}\n          boxWidth={100}\n          valueScale={valueScale}\n          outliers={outliers}\n        />\n      </svg>,\n    );\n\n  test('it should be defined', () => {\n    expect(BoxPlot).toBeDefined();\n  });\n\n  test('it should have className .visx-boxplot', () => {\n    const { container } = renderBoxPlot();\n    const boxPlotGroup = container.querySelector('.visx-boxplot');\n    expect(boxPlotGroup).toBeInTheDocument();\n  });\n\n  test('it should render 5 lines and one rectangle', () => {\n    const { container } = renderBoxPlot();\n    const boxPlotGroup = container.querySelector('.visx-boxplot');\n    expect(boxPlotGroup?.querySelectorAll('line')).toHaveLength(5);\n    expect(boxPlotGroup?.querySelectorAll('rect')).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-stats/test/ViolinPlot.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport { ViolinPlot, computeStats } from '../src';\n\nconst data = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 1];\nconst { binData } = computeStats(data);\n\nconst valueScale = scaleLinear({\n  range: [10, 0],\n  round: true,\n  domain: [0, 10],\n});\n\ndescribe('<ViolinPlot />', () => {\n  test('it should be defined', () => {\n    expect(ViolinPlot).toBeDefined();\n  });\n\n  test('it should have className .visx-violin', () => {\n    const { container } = render(\n      <svg>\n        <ViolinPlot data={binData} left={3} width={100} valueScale={valueScale} />\n      </svg>,\n    );\n    expect(container.querySelector('.visx-violin')).toBeInTheDocument();\n  });\n\n  test('it should render one path element', () => {\n    const { container } = render(\n      <svg width={100} height={100}>\n        <ViolinPlot data={binData} left={3} width={100} valueScale={valueScale} />\n      </svg>,\n    );\n    const paths = container.getElementsByTagName('path');\n    expect(paths).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-stats/test/computeStats.test.ts",
    "content": "import { computeStats } from '../src';\n\nconst data = [1, 2, 3, 4, 5, 6, 6, 7, 8, 9, 1];\nconst edgeCaseData = [10000, 2400, 10000, 10000];\n\ndescribe('computeStats', () => {\n  test('it should be defined', () => {\n    expect(computeStats).toBeDefined();\n  });\n\n  test('it should have boxPlot and binData', () => {\n    const stats = computeStats(data);\n    expect(stats.boxPlot).toBeDefined();\n    expect(stats.binData).toBeDefined();\n  });\n\n  test('it should have boxPlot and binData when first and third quartile are equal', () => {\n    const stats = computeStats(edgeCaseData);\n    expect(stats.boxPlot).toBeDefined();\n    expect(stats.binData).toBeDefined();\n  });\n\n  test('min/max should match the dataset when there are no outliers', () => {\n    const stats = computeStats(edgeCaseData);\n    expect(stats.boxPlot.min).toBe(Math.min(...edgeCaseData));\n    expect(stats.boxPlot.max).toBe(Math.max(...edgeCaseData));\n  });\n});\n"
  },
  {
    "path": "packages/visx-stats/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-stats/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-vendor\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-stats/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/stats',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-stats/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/stats': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-text/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-text/Readme.md",
    "content": "# @visx/text\n\n<a title=\"@visx/text npm downloads\" href=\"https://www.npmjs.com/package/@visx/text\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/text.svg?style=flat-square\" />\n</a>\n\nThe `@visx/text` provides a better SVG `<Text>` component with the following features\n\n- Word-wrapping (when `width` prop is defined)\n- Vertical alignment (`verticalAnchor` prop)\n- Rotation (`angle` prop)\n- Scale-to-fit text (`scaleToFit` prop)\n\n## Example\n\nSimple demo to show off a useful feature. Since svg `<text>` itself does not support\n`verticalAnchor`, normally text rendered at `0,0` would be outside the viewport and thus not\nvisible. By using `<Text>` with the `verticalAnchor=\"start\"` prop, the text will now be visible as\nyou'd expect.\n\n```jsx\nimport React from 'react';\n// note: react@18 syntax\nimport { createRoot } from 'react-dom/client';\nimport { Text } from '@visx/text';\n\nconst App = () => (\n  <svg>\n    <Text verticalAnchor=\"start\">Hello world</Text>\n  </svg>\n);\n\nconst root = createRoot(document.getElementById('root'));\n\nroot.render(<App />);\n```\n\n## Installation\n\n```\nnpm install --save @visx/text\n```\n"
  },
  {
    "path": "packages/visx-text/package.json",
    "content": "{\n  \"name\": \"@visx/text\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx text\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualization\",\n    \"chart\"\n  ],\n  \"author\": \"@techniq\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/lodash\": \"^4.17.13\",\n    \"@types/react\": \"*\",\n    \"classnames\": \"^2.3.1\",\n    \"lodash\": \"^4.17.21\",\n    \"reduce-css-calc\": \"^1.3.0\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-text/src/Text.tsx",
    "content": "import useText from './hooks/useText';\nimport type { TextProps as TxtProps } from './types';\n\nexport type TextProps = TxtProps;\n\nconst SVG_STYLE = { overflow: 'visible' };\n\nexport default function Text(props: TextProps) {\n  const {\n    dx = 0,\n    dy = 0,\n    textAnchor = 'start',\n    innerRef,\n    innerTextRef,\n    verticalAnchor,\n    angle,\n    lineHeight = '1em',\n    // eslint-disable-next-line @typescript-eslint/no-unused-vars\n    scaleToFit = false,\n    capHeight,\n    width,\n    ...textProps\n  } = props;\n\n  const { x = 0, fontSize } = textProps;\n  const { wordsByLines, startDy, transform } = useText(props);\n\n  return (\n    <svg ref={innerRef} x={dx} y={dy} fontSize={fontSize} style={SVG_STYLE}>\n      {wordsByLines.length > 0 ? (\n        <text ref={innerTextRef} transform={transform} {...textProps} textAnchor={textAnchor}>\n          {wordsByLines.map((line, index) => (\n            <tspan key={index} x={x} dy={index === 0 ? startDy : lineHeight}>\n              {line.words.join(' ')}\n            </tspan>\n          ))}\n        </text>\n      ) : null}\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-text/src/hooks/useText.ts",
    "content": "import { useMemo } from 'react';\nimport reduceCSSCalc from 'reduce-css-calc';\nimport type { TextProps, WordsWithWidth } from '../types';\nimport getStringWidth from '../util/getStringWidth';\n\nfunction isNumber(val: unknown): val is number {\n  return typeof val === 'number';\n}\n\nfunction isXOrYInValid(xOrY: string | number | undefined) {\n  return (\n    // number that is not NaN or Infinity\n    (typeof xOrY === 'number' && Number.isFinite(xOrY)) ||\n    // for percentage\n    typeof xOrY === 'string'\n  );\n}\n\nexport default function useText(props: TextProps): {\n  wordsByLines: WordsWithWidth[];\n  startDy: string;\n  transform: string;\n} {\n  const {\n    verticalAnchor = 'end',\n    scaleToFit = false,\n    angle,\n    width,\n    lineHeight = '1em',\n    capHeight = '0.71em', // Magic number from d3\n    children,\n    style,\n    ...textProps\n  } = props;\n\n  const { x = 0, y = 0 } = textProps;\n  const isXOrYNotValid = !isXOrYInValid(x) || !isXOrYInValid(y);\n\n  const { wordsWithWidth, spaceWidth } = useMemo(() => {\n    const words: string[] = children == null ? [] : children.toString().split(/(?:(?!\\u00A0+)\\s+)/);\n    return {\n      wordsWithWidth: words.map((word) => ({\n        word,\n        wordWidth: getStringWidth(word, style) || 0,\n      })),\n      spaceWidth: getStringWidth('\\u00A0', style) || 0,\n    };\n  }, [children, style]);\n\n  const wordsByLines = useMemo(() => {\n    if (isXOrYNotValid) {\n      return [];\n    }\n\n    // Only perform calculations if using features that require them (multiline, scaleToFit)\n    if (width || scaleToFit) {\n      return wordsWithWidth.reduce((result: WordsWithWidth[], { word, wordWidth }) => {\n        const currentLine = result[result.length - 1];\n\n        if (\n          currentLine &&\n          (width == null || scaleToFit || (currentLine.width || 0) + wordWidth + spaceWidth < width)\n        ) {\n          // Word can be added to an existing line\n          currentLine.words.push(word);\n          currentLine.width = currentLine.width || 0;\n          currentLine.width += wordWidth + spaceWidth;\n        } else {\n          // Add first word to line or word is too long to scaleToFit on existing line\n          const newLine = { words: [word], width: wordWidth };\n          result.push(newLine);\n        }\n\n        return result;\n      }, []);\n    }\n\n    return [\n      {\n        words: children == null ? [] : children.toString().split(/(?:(?!\\u00A0+)\\s+)/),\n      },\n    ];\n  }, [isXOrYNotValid, width, scaleToFit, children, wordsWithWidth, spaceWidth]);\n\n  const startDy = useMemo(() => {\n    const startDyStr = isXOrYNotValid\n      ? ''\n      : verticalAnchor === 'start'\n      ? reduceCSSCalc(`calc(${capHeight})`)\n      : verticalAnchor === 'middle'\n      ? reduceCSSCalc(\n          `calc(${(wordsByLines.length - 1) / 2} * -${lineHeight} + (${capHeight} / 2))`,\n        )\n      : reduceCSSCalc(`calc(${wordsByLines.length - 1} * -${lineHeight})`);\n\n    return startDyStr;\n  }, [isXOrYNotValid, verticalAnchor, capHeight, wordsByLines.length, lineHeight]);\n\n  const transform = useMemo(() => {\n    const transforms: string[] = [];\n    if (isXOrYNotValid) {\n      return '';\n    }\n\n    if (isNumber(x) && isNumber(y) && isNumber(width) && scaleToFit && wordsByLines.length > 0) {\n      const lineWidth = wordsByLines[0].width || 1;\n      const sx = scaleToFit === 'shrink-only' ? Math.min(width / lineWidth, 1) : width / lineWidth;\n      const sy = sx;\n      const originX = x - sx * x;\n      const originY = y - sy * y;\n      transforms.push(`matrix(${sx}, 0, 0, ${sy}, ${originX}, ${originY})`);\n    }\n    if (angle) {\n      transforms.push(`rotate(${angle}, ${x}, ${y})`);\n    }\n\n    return transforms.length > 0 ? transforms.join(' ') : '';\n  }, [isXOrYNotValid, x, y, width, scaleToFit, wordsByLines, angle]);\n\n  return { wordsByLines, startDy, transform };\n}\n"
  },
  {
    "path": "packages/visx-text/src/index.ts",
    "content": "// @visx/text\nexport { default as Text } from './Text';\nexport { default as getStringWidth } from './util/getStringWidth';\nexport { default as useText } from './hooks/useText';\nexport type * from './types';\n"
  },
  {
    "path": "packages/visx-text/src/types.ts",
    "content": "import type { CSSProperties, Ref, SVGAttributes } from 'react';\n\ntype SVGTSpanProps = SVGAttributes<SVGTSpanElement>;\ntype SVGTextProps = SVGAttributes<SVGTextElement>;\n\ntype OwnProps = {\n  /** className to apply to the SVGText element. */\n  className?: string;\n  /** Whether to scale the fontSize to accommodate the specified width.  */\n  scaleToFit?: boolean | 'shrink-only';\n  /** Rotational angle of the text. */\n  angle?: number;\n  /** Horizontal text anchor. */\n  textAnchor?: 'start' | 'middle' | 'end' | 'inherit';\n  /** Vertical text anchor. */\n  verticalAnchor?: 'start' | 'middle' | 'end';\n  /** Styles to be applied to the text (and used in computation of its size). */\n  style?: CSSProperties;\n  /** Ref passed to the Text SVG element. */\n  innerRef?: Ref<SVGSVGElement>;\n  /** Ref passed to the Text text element */\n  innerTextRef?: Ref<SVGTextElement>;\n  /** x position of the text. */\n  x?: string | number;\n  /** y position of the text. */\n  y?: string | number;\n  /** dx offset of the text. */\n  dx?: string | number;\n  /** dy offset of the text. */\n  dy?: string | number;\n  /** Desired \"line height\" of the text, implemented as y offsets. */\n  lineHeight?: SVGTSpanProps['dy'];\n  /** Cap height of the text. */\n  capHeight?: SVGTSpanProps['capHeight'];\n  /** Font size of text. */\n  fontSize?: string | number;\n  /** Font family of text. */\n  fontFamily?: string;\n  /** Fill color of text. */\n  fill?: string;\n  /** Maximum width to occupy (approximate as words are not split). */\n  width?: number;\n  /** String (or number coercible to one) to be styled and positioned. */\n  children?: string | number;\n};\n\nexport type TextProps = OwnProps & Omit<SVGTextProps, keyof OwnProps>;\n\nexport type compareFunction<T> = (prev: T | undefined, next: T) => boolean;\n\nexport interface WordsWithWidth {\n  words: string[];\n  width?: number;\n}\n"
  },
  {
    "path": "packages/visx-text/src/util/getStringWidth.ts",
    "content": "import memoize from 'lodash/memoize';\n\nconst MEASUREMENT_ELEMENT_ID = '__react_svg_text_measurement_id';\n\nfunction getStringWidth(str: string, style?: object) {\n  try {\n    // Calculate length of each word to be used to determine number of words per line\n    let textEl = document.getElementById(MEASUREMENT_ELEMENT_ID) as SVGTextElement | null;\n    if (!textEl) {\n      const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n      svg.setAttribute('aria-hidden', 'true');\n      svg.style.width = '0';\n      svg.style.height = '0';\n      svg.style.position = 'absolute';\n      svg.style.top = '-100%';\n      svg.style.left = '-100%';\n      textEl = document.createElementNS('http://www.w3.org/2000/svg', 'text');\n      textEl.setAttribute('id', MEASUREMENT_ELEMENT_ID);\n      svg.appendChild(textEl);\n      document.body.appendChild(svg);\n    }\n\n    Object.assign(textEl.style, style);\n    textEl.textContent = str;\n    return textEl.getComputedTextLength();\n  } catch (e) {\n    console.warn(e);\n    return null;\n  }\n}\n\nexport default memoize(getStringWidth, (str, style) => `${str}_${JSON.stringify(style)}`);\n"
  },
  {
    "path": "packages/visx-text/test/Text.test.tsx",
    "content": "import React from 'react';\nimport { render, renderHook } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Text, getStringWidth, useText } from '../src';\nimport { addMock, removeMock } from './svgMock';\n\ndescribe('getStringWidth()', () => {\n  it('should be defined', () => {\n    expect(getStringWidth).toBeDefined();\n  });\n});\n\ndescribe('<Text />', () => {\n  beforeEach(addMock);\n  afterEach(removeMock);\n\n  it('should be defined', () => {\n    expect(Text).toBeDefined();\n  });\n\n  it('Does not wrap long text if enough width', () => {\n    const {\n      result: {\n        current: { wordsByLines },\n      },\n    } = renderHook(() =>\n      useText({\n        width: 300,\n        style: { fontFamily: 'Courier' },\n        children: 'This is really long text',\n      }),\n    );\n\n    expect(wordsByLines).toHaveLength(1);\n  });\n\n  it('Wraps text if not enough width', () => {\n    const {\n      result: {\n        current: { wordsByLines },\n      },\n    } = renderHook(() =>\n      useText({\n        width: 200,\n        style: { fontFamily: 'Courier' },\n        children: 'This is really long text',\n      }),\n    );\n\n    expect(wordsByLines).toHaveLength(2);\n  });\n\n  it('Does not wrap text if there is enough width', () => {\n    const {\n      result: {\n        current: { wordsByLines },\n      },\n    } = renderHook(() =>\n      useText({\n        width: 300,\n        style: { fontSize: '2em', fontFamily: 'Courier' },\n        children: 'This is really long text',\n      }),\n    );\n\n    expect(wordsByLines).toHaveLength(1);\n  });\n\n  it('Does not perform word length calculation if width or scaleToFit props not set', () => {\n    const {\n      result: {\n        current: { wordsByLines },\n      },\n    } = renderHook(() =>\n      useText({\n        children: 'This is really long text',\n      }),\n    );\n\n    expect(wordsByLines).toHaveLength(1);\n    expect(wordsByLines[0].width).toBeUndefined();\n  });\n\n  it('Render 0 success when specify the width', () => {\n    const { container } = render(\n      <Text x={0} y={0} width={30}>\n        0\n      </Text>,\n    );\n\n    const text = container.querySelector('tspan');\n    expect(text?.textContent).toBe('0');\n  });\n\n  it('Render 0 success when not specify the width', () => {\n    const { container } = render(\n      <Text x={0} y={0}>\n        0\n      </Text>,\n    );\n    const text = container.querySelector('tspan');\n    expect(text?.textContent).toBe('0');\n  });\n\n  it('Render text when x or y is a percentage', () => {\n    const { container } = render(\n      <Text x=\"50%\" y=\"50%\">\n        anything\n      </Text>,\n    );\n    const text = container.querySelector('tspan');\n    expect(text?.textContent).toBe('anything');\n  });\n\n  it(\"Don't Render text when x or y is NaN\", () => {\n    const { container } = render(\n      <Text x={NaN} y={10}>\n        anything\n      </Text>,\n    );\n    const text = container.querySelector('tspan');\n    expect(text).toBeNull();\n  });\n\n  it('Render text when children 0 is a number', () => {\n    const num = 0;\n    const { container } = render(\n      <Text x={0} y={0}>\n        {num}\n      </Text>,\n    );\n\n    const text = container.querySelector('tspan');\n    expect(text?.textContent).toBe('0');\n  });\n\n  it('Applies transform if scaleToFit is set', () => {\n    const {\n      result: {\n        current: { transform },\n      },\n    } = renderHook(() =>\n      useText({\n        width: 300,\n        scaleToFit: true,\n        style: { fontFamily: 'Courier' },\n        children: 'This is really long text',\n      }),\n    );\n    expect(transform).toBe('matrix(1.25, 0, 0, 1.25, 0, 0)');\n  });\n\n  it(\"Does not scale above 1 when scaleToFit is set to 'shrink-only'\", () => {\n    const {\n      result: {\n        current: { transform },\n      },\n    } = renderHook(() =>\n      useText({\n        width: 300,\n        scaleToFit: 'shrink-only',\n        style: { fontFamily: 'Courier' },\n        children: 'This is really long text',\n      }),\n    );\n    expect(transform).toBe('matrix(1, 0, 0, 1, 0, 0)');\n  });\n\n  it(\"Shrinks long text when scaleToFit is set to 'shrink-only'\", () => {\n    const {\n      result: {\n        current: { transform },\n      },\n    } = renderHook(() =>\n      useText({\n        width: 30,\n        scaleToFit: 'shrink-only',\n        style: { fontFamily: 'Courier' },\n        children: 'This is really long text',\n      }),\n    );\n    expect(transform).toBe('matrix(0.125, 0, 0, 0.125, 0, 0)');\n  });\n\n  it('Applies transform if angle is given', () => {\n    const { container } = render(\n      <Text width={300} angle={45} style={{ fontFamily: 'Courier' }}>\n        This is really long text\n      </Text>,\n    );\n\n    const text = container.querySelector('text');\n    expect(text).toHaveAttribute('transform', 'rotate(45, 0, 0)');\n  });\n\n  it('Offsets vertically if verticalAnchor is given', () => {\n    let { container } = render(\n      <Text width={200} style={{ fontFamily: 'Courier' }}>\n        This is really long text\n      </Text>,\n    );\n    const getVerticalOffset = (c: HTMLElement) => c?.querySelector('tspan')?.getAttribute('dy');\n\n    expect(getVerticalOffset(container)).toBe('-1em');\n\n    ({ container } = render(\n      <Text width={200} verticalAnchor=\"middle\" style={{ fontFamily: 'Courier' }}>\n        This is really long text\n      </Text>,\n    ));\n    expect(getVerticalOffset(container)).toBe('-0.145em');\n\n    ({ container } = render(\n      <Text width={200} verticalAnchor=\"start\" style={{ fontFamily: 'Courier' }}>\n        This is really long text\n      </Text>,\n    ));\n    expect(getVerticalOffset(container)).toBe('0.71em');\n  });\n});\n"
  },
  {
    "path": "packages/visx-text/test/svgMock.ts",
    "content": "// @ts-expect-error\nlet originalFn: typeof SVGElement.prototype.getComputedTextLength;\n\n/**\n * JSDom does not implement getComputedTextLength()\n * so this function add mock implementation for testing.\n */\nexport function addMock() {\n  // @ts-expect-error\n  originalFn = SVGElement.prototype.getComputedTextLength;\n\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = function getComputedTextLength() {\n    // Make every character 10px wide\n    return (this.textContent?.length ?? 0) * 10;\n  };\n}\n\n/**\n * Remove mock from addMock()\n */\nexport function removeMock() {\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = originalFn;\n}\n"
  },
  {
    "path": "packages/visx-text/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-text/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-text/types/reduce-css-calc/index.d.ts",
    "content": "declare module 'reduce-css-calc' {\n    export default function(_: any): string;\n}"
  },
  {
    "path": "packages/visx-text/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/text',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-text/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/text': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-threshold/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-threshold/Readme.md",
    "content": "# @visx/threshold\n\n<a title=\"@visx/threshold npm downloads\" href=\"https://www.npmjs.com/package/@visx/threshold\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/threshold.svg?style=flat-square\" />\n</a>\n\n`@visx/threshold` allows for creation of Difference Charts in `react`, which highlight the delta\nbetween two line series.\n\n## Installation\n\n```\nnpm install --save @visx/threshold\n```\n"
  },
  {
    "path": "packages/visx-threshold/package.json",
    "content": "{\n  \"name\": \"@visx/threshold\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx threshold\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": \"https://github.com/airbnb/visx\",\n  \"scripts\": {\n    \"docs\": \"cd ./docs && ../../../node_modules/.bin/react-docgen --exclude index.js ../src/  | ../../../scripts/buildDocs.sh\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/clip-path\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-threshold/src/Threshold.tsx",
    "content": "import type { SVGProps } from 'react';\nimport cx from 'classnames';\nimport { Area } from '@visx/shape';\nimport type { AreaProps as AreaOwnProps } from '@visx/shape';\nimport { ClipPath } from '@visx/clip-path';\n\ntype AreaProps<Datum> = AreaOwnProps<Datum> &\n  Omit<SVGProps<SVGPathElement>, keyof AreaOwnProps<Datum>>;\n\ntype NumberAccessor<Datum> = (datum: Datum, index: number, data: Datum[]) => number;\n\nexport type ThresholdProps<Datum> = {\n  /** className applied to container g element. */\n  className?: string;\n  /** Sets the curve factory (from @visx/curve or d3-curve) for the area generator. Defaults to curveLinear. */\n  curve?: AreaProps<Datum>['curve'];\n  /** Specifies a constant value, or an accessor called per datum, above which the *upper area* is clipped. */\n  clipAboveTo: NumberAccessor<Datum> | number;\n  /** Specifies a constant value, or an accessor called per datum, below which the *lower area* is clipped. */\n  clipBelowTo: NumberAccessor<Datum> | number;\n  /** id for this threshold. If not set, multiple Threshold's on a page may conflict and interfere with each other. */\n  id: string;\n  /** Array of data for which to generate a threshold area shape. */\n  data: Datum[];\n  /**\n   * The defined accessor for the shape. The final area shape includes all points for which this\n   * function returns true. By default all points are defined.\n   */\n  defined?: (datum: Datum, index: number, data: Datum[]) => boolean;\n  /**\n   * For the Area shape, specifies the x accessor function for a datum, which defaults to `d => d[0]`.\n   * Alternatively this may be a constant x value.\n   */\n  x: NumberAccessor<Datum> | number;\n  /**\n   * For the Area shape, specifies the accessor function (or constant value) which generates\n   * the \"lower\" area bound to which \"belowAreaProps\" and \"clipBelow\" props apply. Defaults to `d => 0`.\n   */\n  y0: NumberAccessor<Datum> | number;\n  /**\n   * For the Area shape, specifies the accessor function (or constant value) which generates\n   * the \"upper\" area bound to which \"aboveAreaProps\" and \"clipAbove\" props apply. Defaults to `d => d[1]`.\n   */\n  y1: NumberAccessor<Datum> | number;\n  /** Additional props passed to the \"above\" Area shape. */\n  aboveAreaProps?: AreaProps<Datum>;\n  /** Additional props passed to the \"below\" Area shape. */\n  belowAreaProps?: AreaProps<Datum>;\n};\n\nexport default function Threshold<Datum>({\n  className,\n  curve,\n  clipAboveTo,\n  clipBelowTo,\n  data,\n  defined,\n  x,\n  y0,\n  y1,\n  aboveAreaProps,\n  belowAreaProps,\n  id = '',\n}: ThresholdProps<Datum>) {\n  return (\n    <g className={cx('visx-threshold', className)}>\n      <Area<Datum> curve={curve} data={data} x={x} y1={y1} defined={defined}>\n        {({ path }) => {\n          // TS cannot infer the correct method overload\n          let belowPath = null;\n          let abovePath = null;\n          if (typeof clipBelowTo === 'number') belowPath = path.y0(clipBelowTo)(data);\n          else belowPath = path.y0(clipBelowTo)(data);\n          if (typeof clipAboveTo === 'number') abovePath = path.y0(clipAboveTo)(data);\n          else abovePath = path.y0(clipAboveTo)(data);\n\n          return (\n            <g>\n              <ClipPath id={`threshold-clip-below-${id}`}>\n                <path d={belowPath || ''} />\n              </ClipPath>\n              <ClipPath id={`threshold-clip-above-${id}`}>\n                <path d={abovePath || ''} />\n              </ClipPath>\n            </g>\n          );\n        }}\n      </Area>\n      <Area<Datum>\n        curve={curve}\n        data={data}\n        defined={defined}\n        x={x}\n        y0={y0}\n        y1={y1}\n        strokeWidth={0}\n        clipPath={`url(#threshold-clip-below-${id})`}\n        {...belowAreaProps}\n      />\n      <Area<Datum>\n        curve={curve}\n        data={data}\n        defined={defined}\n        x={x}\n        y0={y0}\n        y1={y1}\n        strokeWidth={0}\n        clipPath={`url(#threshold-clip-above-${id})`}\n        {...aboveAreaProps}\n      />\n    </g>\n  );\n}\n"
  },
  {
    "path": "packages/visx-threshold/src/index.ts",
    "content": "// @visx/threshold\nexport { default as Threshold } from './Threshold';\n"
  },
  {
    "path": "packages/visx-threshold/test/Threshold.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Threshold } from '../src';\n\nconst data = [\n  { x: 1, y0: 6, y1: 10 },\n  { x: 2, y0: 7, y1: 11 },\n];\n\ndescribe('<Threshold />', () => {\n  it('should be defined', () => {\n    expect(Threshold).toBeDefined();\n  });\n\n  it('should render the path', () => {\n    const { container } = render(\n      <svg>\n        <Threshold\n          id={`${Math.random()}`}\n          data={data}\n          x={(d) => d.x}\n          y0={(d) => d.y0}\n          y1={(d) => d.y1}\n          clipAboveTo={0}\n          clipBelowTo={100}\n          belowAreaProps={{\n            fill: 'violet',\n            fillOpacity: 0.4,\n          }}\n          aboveAreaProps={{\n            fill: 'green',\n            fillOpacity: 0.4,\n          }}\n        />\n      </svg>,\n    );\n\n    expect(container.querySelector('g.visx-threshold')).toBeInTheDocument();\n    expect(container.querySelectorAll('path')).toHaveLength(4);\n  });\n\n  it('supports accessors for clipping', () => {\n    const { container } = render(\n      <svg>\n        <Threshold\n          id={`${Math.random()}`}\n          data={data}\n          x={(d) => d.x}\n          y0={(d) => d.y0}\n          y1={(d) => d.y1}\n          clipAboveTo={() => 0}\n          clipBelowTo={() => 100}\n          belowAreaProps={{\n            fill: 'violet',\n            fillOpacity: 0.4,\n          }}\n          aboveAreaProps={{\n            fill: 'green',\n            fillOpacity: 0.4,\n          }}\n        />\n      </svg>,\n    );\n\n    expect(container.querySelector('g.visx-threshold')).toBeInTheDocument();\n    expect(container.querySelectorAll('path')).toHaveLength(4);\n  });\n});\n"
  },
  {
    "path": "packages/visx-threshold/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-threshold/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-clip-path\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-threshold/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/threshold',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-threshold/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/threshold': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-tooltip/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-tooltip/Readme.md",
    "content": "# @visx/tooltip\n\n<a title=\"@visx/tooltip npm downloads\" href=\"https://www.npmjs.com/package/@visx/tooltip\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/tooltip.svg?style=flat-square\" />\n</a>\n\nThe `@visx/tooltip` package provides utilities for making it easy to add `Tooltip`s to a\nvisualization and includes hooks, higher-order component (HOC) enhancers, and Tooltip components.\n\n### Installation\n\n```\nnpm install --save @visx/tooltip\n```\n\n### Hooks and Enhancers\n\nThis package provides two ways to add tooltip **state** logic to your chart components:\n\n- a hook: `useTooltip()`\n- a higher order component (HOC): `withTooltip()`\n\nThe `useTooltip` hook is the recommended way to add tooltip state logic to your components, but can\nonly be used in functional components. The `withTooltip` HOC can be used with both functional and\nclass components, and is the recommended way to add tooltip state logic to class components.\n\nBoth `useTooltip` and `withTooltip` expose the same values and functions for use in your component:\n\n| Name          | Type   | Description                                                                                                                                           |\n| :------------ | :----- | :---------------------------------------------------------------------------------------------------------------------------------------------------- |\n| showTooltip   | func   | Call this function with the signature `func({ tooltipData, tooltipLeft, tooltipTop })` to set the tooltip state to the specified values.              |\n| hideTooltip   | func   | Call this function to close a tooltip, i.e., set the `showTooltip` state to `false`.                                                                  |\n| tooltipOpen   | bool   | Whether the tooltip state is open or closed                                                                                                           |\n| tooltipLeft   | number | The `tooltipLeft` position passed to the `showTooltip` func, intended to be used for tooltip positioning                                              |\n| tooltipTop    | number | The `tooltipTop` position passed to the `showTooltip` func, intended to be used for tooltip positioning                                               |\n| tooltipData   | any    | The `tooltipData` value passed to the `showTooltip` func, intended to be used for any data that your tooltip might need to render                     |\n| updateTooltip | func   | Call this function with the signature `func({ tooltipOpen, tooltipLeft, tooltipTop, tooltipData })` to set the tooltip state to the specified values. |\n\nIn the case of `useTooltip`, these will be returned from the `useTooltip()` call in your component.\nIn the case of `withTooltip`, they will be passed as props to your wrapped component. Refer to the\n[Examples](#examples) section for a basic demo of each approach.\n\n#### useTooltip()\n\nIf you would like to add tooltip state logic to a functional component, you may use the\n`useTooltip()` hook which will return an object with several properties that you can use to manage\nthe tooltip state of your component. **For correct tooltip positioning, it is important to wrap your\ncomponent in an element (e.g., `div`) with `relative` positioning**. This is handled for you by the\n`withTooltip` HOC, but not with the `useTooltip()` hook.\n\n#### withTooltip(BaseComponent [, containerProps [, renderContainer]])\n\nIf you would like to add tooltip state logic to a class component, you may wrap it in\n`withTooltip(BaseComponent [, containerProps [, renderContainer])`.\n\nThe HOC will wrap your component in a `div` with `relative` positioning by default and handle state\nfor tooltip positioning, visibility, and content by injecting the following props into your\n`BaseComponent`:\n\nYou may override the container by specifying `containerProps` as the second argument to\n`withTooltip`, or by specifying `renderContainer` as the third argument to `withTooltip`.\n\n### Components\n\nTooltip **components** render tooltip **state** and can be used in conjunction with `useTooltip` and\n`withTooltip` above.\n\n> Note: Because Tooltip and TooltipWithBounds components are rendered within `<div>` elements, they\n> **cannot** be inserted within any VisX charts (`<svg>` elements). Instead, place them anywhere\n> outside of your rendered charts.\n\n#### Tooltip\n\nThis is a simple Tooltip container component meant to be used to actually render a Tooltip. It\naccepts the following props, and will spread any additional props on the tooltip container div\n(i.e., ...restProps):\n\n| Name      | Type             | Default | Description                                                                   |\n| :-------- | :--------------- | :------ | :---------------------------------------------------------------------------- |\n| left      | number or string | --      | Sets style.left of the tooltip container                                      |\n| top       | number or string | --      | Sets style.top of the tooltip container                                       |\n| className | string           | --      | Adds a class (in addition to `visx-tooltip-portal`) to the tooltip container  |\n| style     | object           | --      | Sets / overrides any styles on the tooltip container (including top and left) |\n| children  | node             | --      | Sets the children of the tooltip, i.e., the actual content                    |\n| unstyled  | bool             | true    | Whether the tooltip should use styles from the style prop or not              |\n\n#### TooltipWithBounds\n\nThis tooltip component is exactly the same as `Tooltip` above, but it is aware of its boundaries\nmeaning that it will flip left/right and bottom/top based on whether it would overflow its parent's\nboundaries. It accepts the following props, and will spread any additional props on the Tooltip\ncomponent (i.e., ...restProps):\n\n| Name       | Type   | Default | Description                                                                                                                                                                      |\n| :--------- | :----- | :------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |\n| left       | number | --      | The horizontal position of the cursor, tooltip will be place to the left or right of this coordinate depending on the width of the tooltip and the size of the parent container. |\n| top        | number | --      | The vertical position of the cursor, tooltip will be place to the bottom or top of this coordinate depending on the height of the tooltip and the size of the parent container.  |\n| offsetLeft | number | 10      | Horizontal offset of the tooltip from the passed `left` value, functions as a horizontal padding.                                                                                |\n| offsetTop  | number | 10      | Vertical offset of the tooltip from the passed `top` value, functions as a vertical padding.                                                                                     |\n| style      | object | --      | Sets / overrides any styles on the tooltip container (including top and left)                                                                                                    |\n| children   | node   | --      | Sets the children of the tooltip, i.e., the actual content                                                                                                                       |\n| unstyled   | bool   | true    | Whether the tooltip should use styles from the style prop or not                                                                                                                 |\n\nNote that this component is positioned using a `transform`, so overriding `left` and `top` via\nstyles may have no effect.\n\n#### useTooltipInPortal\n\n##### ⚠️ `ResizeObserver` dependency\n\nThis hook relies on `ResizeObserver`s. If you need a polyfill, you can either polute the `window`\nobject or inject it cleanly using the `polyfill` config option below.\n\n`useTooltipInPortal` is a hook which gives you a `TooltipInPortal` component for rendering `Tooltip`\nor `TooltipWithBounds` in a `Portal`, outside of your component DOM tree which can be useful in many\ncircumstances (see below for more on `Portal`s).\n\n##### API\n\n```ts\n\ntype Options = {\n  /** whether TooltipWithBounds should be used to auto-detect (page) boundaries and reposition itself. */\n  detectBounds?: boolean;\n  /** Debounce resize or scroll events in milliseconds (needed for positioning) **/\n  debounce?: number | { scroll: number; resize: number }\n  /** React to nested scroll changes, don't use this if you know your view is static */\n  scroll?: boolean\n  /** You can optionally inject a resize-observer polyfill */\n  polyfill?: { new (cb: ResizeObserverCallback): ResizeObserver }\n  /** Optional z-index to set on the Portal div */\n  zIndex?: number | string;\n}\n\nuseTooltipInPortal(\n  options: Options = { debounce: 0, scroll: true, detectBounds: true }\n): {\n  /** Set `ref={containerRef}` on the element corresponding to the coordinate system that `left/top` (passed to `TooltipInPortal`) are relative to. */\n  containerRef: React.MutableRefObject<HTMLElement | SVGElement>;\n  /** Access to the container's bounding box if useful to you. This will be empty on first render. */\n  containterBounds: RectReadOnly;\n  /** React.FunctionComponent<TooltipProps> with the same API as Tooltip, which will be rendered in a Portal. */\n  TooltipInPortal ({ top: containerTop, left: containerLeft, ...tooltipProps }: TooltipProps) => ReactNode;\n\n\ninterface RectReadOnly {\n  readonly x: number\n  readonly y: number\n  readonly width: number\n  readonly height: number\n  readonly top: number\n  readonly right: number\n  readonly bottom: number\n  readonly left: number\n}\n\n```\n\n#### Portal\n\n`Portal` is a component which simply renders its children inside a `div` element appended to\n`document.body` created by `ReactDOM`. A `Portal` can be an effective strategy for solving the\n[`z-index` stacking context problem](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Positioning/Understanding_z_index/The_stacking_context)\nfor `Tooltip`s.\n\nFor example, if your chart is rendered inside a stacking context with a lower `z-index` than a\nsurrounding container, it may get clipped by that container even if you specify a higher `z-index`.\nThis is solvable with a `Portal` because the separate container will not be subject to the stacking\ncontext of your chart.\n\nTo use a `Portal`, simply pass your `Tooltip` as a child: `<Portal><Tooltip {...} /></Portal>`. You\nwill also need to correct the `left` and `top` positions to be in _page coordinates_, not the\ncoordinates of your container which you would use when _not_ using a `Portal`. If reacting to a\nmouse event, you can use `event.pageX/Y`. Alternatively, if you have container coordinates, you can\nconvert them to page coordinates using the following (note: `useTooltipInPortal` handles this\nfor you):\n\n```js\nconst pageX = containerX + containerBoundingBox.left + window.scrollLeft;\nconst pageY = containerY + containerBoundingBox.top + window.scrollTop;\n```\n\n### Examples\n\n#### useTooltip and useTooltipInPortal For Functional Components\n\n```jsx\nimport { useTooltip, useTooltipInPortal, TooltipWithBounds } from '@visx/tooltip';\nimport { localPoint } from '@visx/event';\n\nconst ChartWithTooltip = () => {\n  const {\n    tooltipData,\n    tooltipLeft,\n    tooltipTop,\n    tooltipOpen,\n    showTooltip,\n    hideTooltip,\n  } = useTooltip();\n\n  // If you don't want to use a Portal, simply replace `TooltipInPortal` below with\n  // `Tooltip` or `TooltipWithBounds` and remove `containerRef`\n  const { containerRef, TooltipInPortal } = useTooltipInPortal({\n    // use TooltipWithBounds\n    detectBounds: true,\n    // when tooltip containers are scrolled, this will correctly update the Tooltip position\n    scroll: true,\n  })\n\n  const handleMouseOver = (event, datum) => {\n    const coords = localPoint(event.target.ownerSVGElement, event);\n    showTooltip({\n      tooltipLeft: coords.x,\n      tooltipTop: coords.y,\n      tooltipData: datum\n    });\n  };\n\n  return (\n    // Set `ref={containerRef}` on the element corresponding to the coordinate system that\n    // `left/top` (passed to `TooltipInPortal`) are relative to.\n    <>\n      <svg ref={containerRef} width={...} height={...}>\n        // Chart here...\n        <SomeChartElement\n          onMouseOver={handleMouseOver}\n          onMouseOut={hideTooltip}\n        />\n      </svg>\n\n      {tooltipOpen && (\n        <TooltipInPortal\n          // set this to random so it correctly updates with parent bounds\n          key={Math.random()}\n          top={tooltipTop}\n          left={tooltipLeft}\n        >\n          Data value <strong>{tooltipData}</strong>\n        </TooltipInPortal>\n      )}\n    </>\n  )\n};\n\nrender(<ChartWithTooltip />, document.getElementById(\"root\"));\n```\n\n#### withTooltip For Class Components\n\n```js\nimport { withTooltip, TooltipWithBounds } from '@visx/tooltip';\nimport { localPoint } from '@visx/event';\n\nclass Chart extends React.Component {\n  handleMouseOver = (event, datum) => {\n    const coords = localPoint(event.target.ownerSVGElement, event);\n    this.props.showTooltip({\n      tooltipLeft: coords.x,\n      tooltipTop: coords.y,\n      tooltipData: datum\n    });\n  };\n\n  render() {\n    const {\n      tooltipData,\n      tooltipLeft,\n      tooltipTop,\n      tooltipOpen,\n      hideTooltip\n    } = this.props;\n\n    return (\n      // note React.Fragment is only available in >= react@16.2\n      <React.Fragment>\n        <svg width={...} height={...}>\n          // Chart here...\n          <SomeChartElement onMouseOver={this.handleMouseOver} onMouseOut={hideTooltip} />\n        </svg>\n\n        {tooltipOpen && (\n          <TooltipWithBounds\n            // set this to random so it correctly updates with parent bounds\n            key={Math.random()}\n            top={tooltipTop}\n            left={tooltipLeft}\n          >\n            Data value <strong>{tooltipData}</strong>\n          </TooltipWithBounds>\n        )}\n      </React.Fragment>\n    );\n  }\n}\n\nconst ChartWithTooltip = withTooltip(Chart);\n\nrender(<ChartWithTooltip />, document.getElementById(\"root\"));\n```\n\nExample codesandbox [here](https://codesandbox.io/s/kw02m019mr).\n"
  },
  {
    "path": "packages/visx-tooltip/package.json",
    "content": "{\n  \"name\": \"@visx/tooltip\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx tooltip\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@visx/bounds\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\",\n    \"react-use-measure\": \"^2.0.4\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\",\n    \"react-dom\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"devDependencies\": {\n    \"@juggle/resize-observer\": \"^3.3.1\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-tooltip/src/Portal.tsx",
    "content": "import { PureComponent } from 'react';\nimport type { ReactNode } from 'react';\nimport ReactDOM from 'react-dom';\n\nexport type PortalProps = {\n  /** Optional z-index to set on the Portal. */\n  zIndex?: number | string;\n  /** Content to render in the Portal. */\n  children: NonNullable<ReactNode>;\n};\n\n/** Render within a portal using a declarative component API. */\nexport default class Portal extends PureComponent<PortalProps> {\n  private node?: HTMLDivElement;\n\n  componentWillUnmount() {\n    if (this.node && document.body) {\n      document.body.removeChild(this.node);\n      delete this.node;\n    }\n  }\n\n  render() {\n    // SSR check\n    if (!this.node && typeof document !== 'undefined') {\n      this.node = document.createElement('div');\n      if (this.props.zIndex != null) this.node.style.zIndex = `${this.props.zIndex}`;\n      document.body.append(this.node);\n    }\n\n    if (!this.node) {\n      return null;\n    }\n\n    return ReactDOM.createPortal(this.props.children, this.node);\n  }\n}\n"
  },
  {
    "path": "packages/visx-tooltip/src/context/TooltipPositionContext.tsx",
    "content": "import { createContext, useContext } from 'react';\n\nexport type TooltipPositionContextType = {\n  isFlippedVertically: boolean;\n  isFlippedHorizontally: boolean;\n};\n\nconst TooltipPositionContext = createContext<TooltipPositionContextType>({\n  isFlippedVertically: false,\n  isFlippedHorizontally: false,\n});\n\nexport const TooltipPositionProvider = TooltipPositionContext.Provider;\nexport const TooltipPositionConsumer = TooltipPositionContext.Consumer;\n\nexport const useTooltipPosition = () => useContext(TooltipPositionContext);\n"
  },
  {
    "path": "packages/visx-tooltip/src/enhancers/withTooltip.tsx",
    "content": "import type { ReactElement, FunctionComponent, HTMLProps, ComponentType } from 'react';\n\nimport type { UseTooltipParams } from '../hooks/useTooltip';\nimport useTooltip from '../hooks/useTooltip';\n\nexport type WithTooltipProvidedProps<TooltipData> = UseTooltipParams<TooltipData>;\ntype WithTooltipContainerProps = HTMLProps<HTMLDivElement>;\ntype RenderTooltipContainer = (\n  children: ReactElement,\n  containerProps?: WithTooltipContainerProps,\n) => ReactElement;\n\nexport default function withTooltip<BaseComponentProps = {}, TooltipData = {}>(\n  BaseComponent: ComponentType<BaseComponentProps & WithTooltipProvidedProps<TooltipData>>,\n  containerProps: WithTooltipContainerProps = {\n    style: {\n      position: 'relative',\n      width: 'inherit',\n      height: 'inherit',\n    } as const,\n  },\n  renderContainer: RenderTooltipContainer = (children, props) => <div {...props}>{children}</div>,\n) {\n  const WrappedComponent: FunctionComponent<BaseComponentProps> = (props) => {\n    const tooltipProps = useTooltip<TooltipData>();\n\n    return renderContainer(<BaseComponent {...tooltipProps} {...props} />, containerProps);\n  };\n\n  return WrappedComponent;\n}\n"
  },
  {
    "path": "packages/visx-tooltip/src/hooks/useTooltip.ts",
    "content": "import { useState, useCallback } from 'react';\n\nexport type UseTooltipParams<TooltipData> = {\n  /** Whether the tooltip is currently open/visible. */\n  tooltipOpen: boolean;\n  /** The left position (in pixels) of the tooltip. */\n  tooltipLeft?: number;\n  /** The top position (in pixels) of the tooltip. */\n  tooltipTop?: number;\n  /** The data associated with the tooltip. */\n  tooltipData?: TooltipData;\n  /** Function to update tooltip state. */\n  updateTooltip: (args: UpdateTooltipArgs<TooltipData>) => void;\n  /** Function to show the tooltip with the specified position and data. */\n  showTooltip: (args: ShowTooltipArgs<TooltipData>) => void;\n  /** Function to hide the tooltip. */\n  hideTooltip: () => void;\n};\ntype UseTooltipState<TooltipData> = Pick<\n  UseTooltipParams<TooltipData>,\n  'tooltipOpen' | 'tooltipLeft' | 'tooltipTop' | 'tooltipData'\n>;\ntype ValueOrFunc<T> = T | ((t: T) => T);\ntype ShowTooltipArgs<TooltipData> = ValueOrFunc<Omit<UseTooltipState<TooltipData>, 'tooltipOpen'>>;\ntype UpdateTooltipArgs<TooltipData> = ValueOrFunc<UseTooltipState<TooltipData>>;\n\nexport default function useTooltip<TooltipData = {}>(\n  /** Optional initial TooltipState. */\n  initialTooltipState?: Partial<UseTooltipParams<TooltipData>>,\n): UseTooltipParams<TooltipData> {\n  const [tooltipState, setTooltipState] = useState<UseTooltipState<TooltipData>>({\n    tooltipOpen: false,\n    ...initialTooltipState,\n  });\n\n  const showTooltip = useCallback(\n    (showArgs: ShowTooltipArgs<TooltipData>) =>\n      setTooltipState(\n        typeof showArgs === 'function'\n          ? ({ tooltipOpen, ...show }) => ({ ...showArgs(show), tooltipOpen: true })\n          : {\n              tooltipOpen: true,\n              tooltipLeft: showArgs.tooltipLeft,\n              tooltipTop: showArgs.tooltipTop,\n              tooltipData: showArgs.tooltipData,\n            },\n      ),\n    [setTooltipState],\n  );\n\n  const hideTooltip = useCallback(\n    () =>\n      setTooltipState({\n        tooltipOpen: false,\n        tooltipLeft: undefined,\n        tooltipTop: undefined,\n        tooltipData: undefined,\n      }),\n    [setTooltipState],\n  );\n\n  return {\n    tooltipOpen: tooltipState.tooltipOpen,\n    tooltipLeft: tooltipState.tooltipLeft,\n    tooltipTop: tooltipState.tooltipTop,\n    tooltipData: tooltipState.tooltipData,\n    updateTooltip: setTooltipState,\n    showTooltip,\n    hideTooltip,\n  };\n}\n"
  },
  {
    "path": "packages/visx-tooltip/src/hooks/useTooltipInPortal.tsx",
    "content": "import { useEffect, useMemo, useState } from 'react';\nimport type { FC } from 'react';\nimport type { RectReadOnly, Options as BaseUseMeasureOptions } from 'react-use-measure';\nimport useMeasure from 'react-use-measure';\n\nimport type { PortalProps } from '../Portal';\nimport Portal from '../Portal';\nimport type { TooltipProps } from '../tooltips/Tooltip';\nimport Tooltip from '../tooltips/Tooltip';\nimport TooltipWithBounds from '../tooltips/TooltipWithBounds';\n\nexport type TooltipInPortalProps = TooltipProps &\n  Pick<UseTooltipPortalOptions, 'detectBounds' | 'zIndex'>;\n\nexport type UseTooltipInPortal = {\n  /** Ref callback to be attached to the container element for boundary detection. */\n  containerRef: (element: HTMLElement | SVGElement | null) => void;\n  /** The bounding box of the container element. */\n  containerBounds: RectReadOnly;\n  /** Function to force a refresh of the container bounds. */\n  forceRefreshBounds: () => void;\n  /** Component to render the tooltip in a portal. */\n  TooltipInPortal: FC<TooltipInPortalProps>;\n};\n\nexport type UseTooltipPortalOptions = Pick<PortalProps, 'zIndex'> & {\n  /** whether TooltipWithBounds should be used to auto-detect (page) boundaries and reposition itself. */\n  detectBounds?: boolean;\n  /** Debounce resize or scroll events in milliseconds (needed for positioning) */\n  debounce?: number | { scroll: number; resize: number };\n  /** React to nested scroll changes, don't use this if you know your view is static */\n  scroll?: boolean;\n  /** You can optionally inject a ResizeObserver polyfill. */\n  polyfill?: BaseUseMeasureOptions['polyfill'];\n};\n\n/**\n * Hook that handles rendering of a Tooltip or TooltipWithBounds in a Portal.\n * Handles conversion of container coordinates to page coordinates using the container bounds.\n */\nexport default function useTooltipInPortal({\n  detectBounds: detectBoundsOption = true,\n  zIndex: zIndexOption,\n  ...useMeasureOptions\n}: UseTooltipPortalOptions | undefined = {}): UseTooltipInPortal {\n  const [containerRef, containerBounds, forceRefreshBounds] = useMeasure(useMeasureOptions);\n  const [isSsr, setIsSsr] = useState(false);\n\n  useEffect(() => {\n    setIsSsr(false);\n  }, []);\n\n  const TooltipInPortal = useMemo(\n    () =>\n      function ({\n        left: containerLeft = 0,\n        top: containerTop = 0,\n        detectBounds: detectBoundsProp, // allow override at component-level\n        zIndex: zIndexProp, // allow override at the component-level\n        ...tooltipProps\n      }: TooltipInPortalProps) {\n        const detectBounds = detectBoundsProp == null ? detectBoundsOption : detectBoundsProp;\n        const zIndex = zIndexProp == null ? zIndexOption : zIndexProp;\n        const TooltipComponent = detectBounds ? TooltipWithBounds : Tooltip;\n        // convert container coordinates to page coordinates\n        const scrollX = isSsr ? 0 : window.scrollX;\n        const scrollY = isSsr ? 0 : window.scrollY;\n        const portalLeft = containerLeft + (containerBounds.left || 0) + scrollX;\n        const portalTop = containerTop + (containerBounds.top || 0) + scrollY;\n\n        return (\n          <Portal zIndex={zIndex}>\n            <TooltipComponent left={portalLeft} top={portalTop} {...tooltipProps} />\n          </Portal>\n        );\n      },\n    [detectBoundsOption, zIndexOption, containerBounds.left, containerBounds.top, isSsr],\n  );\n\n  return {\n    containerRef,\n    containerBounds,\n    forceRefreshBounds,\n    TooltipInPortal,\n  };\n}\n"
  },
  {
    "path": "packages/visx-tooltip/src/index.ts",
    "content": "// @visx/tooltip\nexport { default as withTooltip } from './enhancers/withTooltip';\nexport { default as useTooltip } from './hooks/useTooltip';\nexport { default as useTooltipInPortal } from './hooks/useTooltipInPortal';\nexport { useTooltipPosition, TooltipPositionConsumer } from './context/TooltipPositionContext';\nexport { default as Tooltip, defaultStyles } from './tooltips/Tooltip';\nexport { default as TooltipWithBounds } from './tooltips/TooltipWithBounds';\nexport { default as Portal } from './Portal';\n\nexport type { TooltipPositionContextType } from './context/TooltipPositionContext';\nexport type { WithTooltipProvidedProps } from './enhancers/withTooltip';\nexport type { UseTooltipParams } from './hooks/useTooltip';\nexport type {\n  TooltipInPortalProps,\n  UseTooltipInPortal,\n  UseTooltipPortalOptions,\n} from './hooks/useTooltipInPortal';\nexport type { PortalProps } from './Portal';\nexport type { TooltipProps } from './tooltips/Tooltip';\nexport type { TooltipWithBoundsProps } from './tooltips/TooltipWithBounds';\n"
  },
  {
    "path": "packages/visx-tooltip/src/tooltips/Tooltip.tsx",
    "content": "import { forwardRef } from 'react';\nimport type { ReactNode, CSSProperties, HTMLAttributes } from 'react';\nimport cx from 'classnames';\n\nexport type TooltipProps = {\n  /** Tooltip content. */\n  children?: ReactNode;\n  /** Optional className to apply to the Tooltip in addition to `visx-tooltip`. */\n  className?: string;\n  /** The `left` position of the Tooltip. */\n  left?: number;\n  /** Offset the `left` position of the Tooltip by this margin. */\n  offsetLeft?: number;\n  /** Offset the `top` position of the Tooltip by this margin. */\n  offsetTop?: number;\n  /** Styles to apply, unless `unstyled=true`. */\n  style?: CSSProperties;\n  /** The `top` position of the Tooltip. */\n  top?: number;\n  /**\n   * Applies position: 'absolute' for tooltips to correctly position themselves\n   * when `unstyled=true`. In a future major release this will be the default behavior.\n   */\n  applyPositionStyle?: boolean;\n  /**\n   * Whether to omit applying any style, except `left` / `top`.\n   * In most cases if this is `true` a developer must do one of the following\n   * for positioning to work correctly:\n   * - set `applyPositionStyle=true`\n   * - create a CSS selector like: `.visx-tooltip { position: 'absolute' }`\n   */\n  unstyled?: boolean;\n};\n\nexport const defaultStyles: CSSProperties = {\n  position: 'absolute',\n  backgroundColor: 'white',\n  color: '#666666',\n  padding: '0.3rem 0.5rem',\n  borderRadius: '3px',\n  fontSize: '14px',\n  boxShadow: '0 1px 2px rgba(33,33,33,0.2)',\n  lineHeight: '1em',\n  pointerEvents: 'none',\n};\n\nconst Tooltip = forwardRef<HTMLDivElement, TooltipProps & HTMLAttributes<HTMLDivElement>>(\n  (\n    {\n      className,\n      top,\n      left,\n      offsetLeft = 10,\n      offsetTop = 10,\n      style = defaultStyles,\n      children,\n      unstyled = false,\n      applyPositionStyle = false,\n      ...restProps\n    },\n    ref,\n  ) => (\n    <div\n      ref={ref}\n      className={cx('visx-tooltip', className)}\n      style={{\n        top: top == null || offsetTop == null ? top : top + offsetTop,\n        left: left == null || offsetLeft == null ? left : left + offsetLeft,\n        ...(applyPositionStyle && { position: 'absolute' }),\n        ...(!unstyled && style),\n      }}\n      {...restProps}\n    >\n      {children}\n    </div>\n  ),\n);\n\nTooltip.displayName = 'Tooltip';\nexport default Tooltip;\n"
  },
  {
    "path": "packages/visx-tooltip/src/tooltips/TooltipWithBounds.tsx",
    "content": "import type { HTMLAttributes, Ref, CSSProperties } from 'react';\nimport type { WithBoundingRectsProps } from '@visx/bounds';\nimport { withBoundingRects } from '@visx/bounds';\n\nimport type { TooltipProps } from './Tooltip';\nimport Tooltip, { defaultStyles } from './Tooltip';\nimport { TooltipPositionProvider } from '../context/TooltipPositionContext';\n\nexport type TooltipWithBoundsProps = TooltipProps &\n  HTMLAttributes<HTMLDivElement> &\n  WithBoundingRectsProps & { nodeRef?: Ref<HTMLDivElement> };\n\nfunction TooltipWithBounds({\n  children,\n  getRects,\n  left: initialLeft = 0,\n  offsetLeft = 10,\n  offsetTop = 10,\n  parentRect: parentBounds,\n  rect: ownBounds,\n  style = defaultStyles,\n  top: initialTop = 0,\n  unstyled = false,\n  nodeRef,\n  ...otherProps\n}: TooltipWithBoundsProps) {\n  let transform: CSSProperties['transform'];\n  let placeTooltipLeft = false;\n  let placeTooltipUp = false;\n\n  if (ownBounds && parentBounds) {\n    let left = initialLeft;\n    let top = initialTop;\n\n    if (parentBounds.width) {\n      const rightPlacementClippedPx = left + offsetLeft + ownBounds.width - parentBounds.width;\n      const leftPlacementClippedPx = ownBounds.width - left - offsetLeft;\n      placeTooltipLeft =\n        rightPlacementClippedPx > 0 && rightPlacementClippedPx > leftPlacementClippedPx;\n    } else {\n      const rightPlacementClippedPx = left + offsetLeft + ownBounds.width - window.innerWidth;\n      const leftPlacementClippedPx = ownBounds.width - left - offsetLeft;\n      placeTooltipLeft =\n        rightPlacementClippedPx > 0 && rightPlacementClippedPx > leftPlacementClippedPx;\n    }\n\n    if (parentBounds.height) {\n      const bottomPlacementClippedPx = top + offsetTop + ownBounds.height - parentBounds.height;\n      const topPlacementClippedPx = ownBounds.height - top - offsetTop;\n      placeTooltipUp =\n        bottomPlacementClippedPx > 0 && bottomPlacementClippedPx > topPlacementClippedPx;\n    } else {\n      placeTooltipUp = top + offsetTop + ownBounds.height > window.innerHeight;\n    }\n\n    left = placeTooltipLeft ? left - ownBounds.width - offsetLeft : left + offsetLeft;\n    top = placeTooltipUp ? top - ownBounds.height - offsetTop : top + offsetTop;\n\n    left = Math.round(left);\n    top = Math.round(top);\n\n    transform = `translate(${left}px, ${top}px)`;\n  }\n\n  return (\n    <Tooltip\n      ref={nodeRef}\n      style={{\n        left: 0,\n        top: 0,\n        transform,\n        ...(!unstyled && style),\n      }}\n      {...otherProps}\n    >\n      <TooltipPositionProvider\n        value={{ isFlippedVertically: !placeTooltipUp, isFlippedHorizontally: !placeTooltipLeft }}\n      >\n        {children}\n      </TooltipPositionProvider>\n    </Tooltip>\n  );\n}\n\nexport default withBoundingRects(TooltipWithBounds);\n"
  },
  {
    "path": "packages/visx-tooltip/test/Portal.test.tsx",
    "content": "import { Portal } from '../src';\n\ndescribe('Portal', () => {\n  test('it should be defined', () => {\n    expect(Portal).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-tooltip/test/Tooltip.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport { Tooltip, defaultStyles } from '../src';\n\ndescribe('<Tooltip />', () => {\n  test('it should be defined', () => {\n    expect(Tooltip).toBeDefined();\n  });\n\n  it('should render with the default styles', () => {\n    const { container } = render(<Tooltip>Hello</Tooltip>);\n    const tooltip = container.firstChild as HTMLElement;\n    const computedStyle = window.getComputedStyle(tooltip);\n\n    Object.entries(defaultStyles).forEach(([key, value]) => {\n      // colors will be converted to rgb\n      if (key === 'backgroundColor' || key === 'color') {\n        expect(typeof computedStyle[key as any]).toBe('string');\n      } else {\n        // For other styles, compare directly\n        expect(tooltip.style[key as any]).toBe(value);\n      }\n    });\n  });\n\n  it('should render with no default styles', () => {\n    const { container } = render(<Tooltip unstyled>Hello</Tooltip>);\n    const tooltip = container.firstChild as HTMLElement;\n\n    Object.keys(defaultStyles).forEach((key) => {\n      expect(tooltip.style[key as any]).toBe('');\n    });\n  });\n\n  it('should overwrite default styles when given the style prop', () => {\n    const newStyles: React.CSSProperties = {\n      position: 'relative',\n      backgroundColor: 'green',\n      color: 'red',\n      padding: '0.8rem',\n      borderRadius: '13px',\n      fontSize: '17px',\n      boxShadow: '0 2px 3px rgba(133,133,133,0.5)',\n      lineHeight: '2em',\n    };\n\n    const { container } = render(<Tooltip style={newStyles} />);\n    const tooltip = container.firstChild as HTMLElement;\n\n    Object.entries(newStyles).forEach(([key, value]) => {\n      expect(tooltip.style[key as any]).toBe(value);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-tooltip/test/TooltipWithBounds.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { defaultStyles, TooltipWithBounds } from '../src';\n\ndescribe('<TooltipWithBounds />', () => {\n  test('it should be defined', () => {\n    expect(TooltipWithBounds).toBeDefined();\n  });\n\n  it('should render with default styles by default', () => {\n    const { getByText } = render(<TooltipWithBounds>Hello</TooltipWithBounds>);\n    const tooltip = getByText('Hello');\n\n    expect(tooltip).toBeInTheDocument();\n    expect(tooltip).toHaveClass('visx-tooltip');\n\n    const computedStyle = window.getComputedStyle(tooltip);\n\n    // Check that default styles are applied\n    Object.entries(defaultStyles).forEach(([key, value]) => {\n      // colors will be converted to rgb\n      if (key === 'backgroundColor' || key === 'color') {\n        expect(typeof computedStyle[key as keyof CSSStyleDeclaration]).toBe('string');\n      } else {\n        // For other styles, compare directly\n        expect(tooltip.style[key as keyof CSSStyleDeclaration]).toBe(value);\n      }\n    });\n  });\n\n  it('should render without default styles if unstyled is set to true', () => {\n    const { getByText } = render(<TooltipWithBounds unstyled>Hello</TooltipWithBounds>);\n    const tooltip = getByText('Hello');\n\n    expect(tooltip).toBeInTheDocument();\n    expect(tooltip).toHaveClass('visx-tooltip');\n\n    // Verify only positioning styles are applied\n    expect(tooltip).toHaveStyle({\n      top: '0px',\n      left: '0px',\n      transform: 'translate(10px, 10px)',\n    });\n\n    // Verify default styles are not applied\n    expect(tooltip).not.toHaveStyle({\n      backgroundColor: 'white',\n      color: '#666666',\n      padding: '.3rem .5rem',\n      borderRadius: '3px',\n      fontSize: '14px',\n      boxShadow: '0 1px 2px rgba(33,33,33,0.2)',\n      pointerEvents: 'none',\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-tooltip/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-tooltip/test/useTooltip.test.tsx",
    "content": "import { useTooltip } from '../src';\n\ndescribe('useTooltip()', () => {\n  test('it should be defined', () => {\n    expect(useTooltip).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-tooltip/test/useTooltipInPortal.test.tsx",
    "content": "import React from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom'; // Add jest-dom matchers\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { useTooltipInPortal } from '../src';\nimport type { UseTooltipPortalOptions } from '../src/hooks/useTooltipInPortal';\n\ninterface TooltipWithZIndexProps {\n  zIndexOption?: UseTooltipPortalOptions['zIndex'];\n  zIndexProp?: UseTooltipPortalOptions['zIndex'];\n}\n\nconst TooltipWithZIndex = ({ zIndexOption, zIndexProp }: TooltipWithZIndexProps) => {\n  const { TooltipInPortal } = useTooltipInPortal({\n    polyfill: ResizeObserver,\n    zIndex: zIndexOption,\n  });\n  return (\n    <TooltipInPortal zIndex={zIndexProp} data-testid=\"tooltip-portal\">\n      Hello\n    </TooltipInPortal>\n  );\n};\n\ndescribe('useTooltipInPortal()', () => {\n  test('it should be defined', () => {\n    expect(useTooltipInPortal).toBeDefined();\n  });\n\n  it('should pass zIndex prop from options to Portal', async () => {\n    const { baseElement } = render(<TooltipWithZIndex zIndexOption={1} />);\n\n    await waitFor(\n      () => {\n        const portalDiv = baseElement.querySelector('[style*=\"z-index: 1\"]');\n        expect(portalDiv).toBeInTheDocument();\n      },\n      {\n        timeout: 1000,\n        interval: 100,\n      },\n    );\n  });\n\n  it('should pass zIndex prop from component to Portal', async () => {\n    const { baseElement } = render(\n      <TooltipWithZIndex zIndexOption={1} zIndexProp=\"var(--tooltip-zindex)\" />,\n    );\n\n    await waitFor(\n      () => {\n        const portalDiv = baseElement.querySelector('[data-testid=\"tooltip-portal\"]');\n        expect(portalDiv).toBeInTheDocument();\n      },\n      {\n        timeout: 1000,\n        interval: 100,\n      },\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-tooltip/test/withTooltip.test.tsx",
    "content": "import React from 'react';\nimport { render, cleanup } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { withTooltip } from '../src';\n\nconst DummyComponent = () => null;\n\nconst DummyComponentWithDefaultTooltip = withTooltip(DummyComponent);\nconst DummyComponentWithCustomContainerPropsTooltip = withTooltip(DummyComponent, {\n  style: { position: 'static' },\n});\nconst DummyComponentWithNoContainerTooltip = withTooltip(\n  DummyComponent,\n  undefined,\n  (children) => children,\n);\n\ndescribe('withTooltip()', () => {\n  afterEach(cleanup);\n\n  test('it should be defined', () => {\n    expect(withTooltip).toBeDefined();\n  });\n\n  test('it should render a default container', () => {\n    const { container } = render(<DummyComponentWithDefaultTooltip />);\n    const div = container.querySelector('div');\n\n    expect(div).toBeInTheDocument();\n    expect(div).toHaveStyle({\n      position: 'relative',\n      width: 'inherit',\n      height: 'inherit',\n    });\n  });\n\n  test('it should pass custom props to the container', () => {\n    const { container } = render(<DummyComponentWithCustomContainerPropsTooltip />);\n    const div = container.querySelector('div');\n\n    expect(div).toBeInTheDocument();\n    expect(div).toHaveStyle({\n      position: 'static',\n    });\n  });\n\n  test('it should render with a custom container', () => {\n    const { container } = render(<DummyComponentWithNoContainerTooltip />);\n    const div = container.querySelector('div');\n\n    expect(div).not.toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-tooltip/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-bounds\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-tooltip/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/tooltip',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-tooltip/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/tooltip': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-vendor/.eslintrc.js",
    "content": "module.exports = {\n  ignorePatterns: ['/*.js', 'lib/', 'esm/', 'vendor-cjs/'],\n};\n"
  },
  {
    "path": "packages/visx-vendor/.gitignore",
    "content": "# the following are built and should not be checked in\n/lib\n/esm\n/vendor-cjs\n\n# root index and type files\n/d3-*.js\n/internmap.js\n/*.d.ts\n\n# yarn files (monorepo uses root lockfile)\n/.yarn\n/yarn.lock"
  },
  {
    "path": "packages/visx-vendor/Readme.md",
    "content": "# @visx/vendor\n\nThis package consists of vendored packages for other `visx` packages. It is meant to enable dual\nsupport for export of CommonJS and ESM formats by _re-exporting_ some `visx` dependencies, and even\nsome transitive dependencies, which are ESM-only.\n\nThis package is heavily based off of\n[`victory-vendor`](https://github.com/FormidableLabs/victory/tree/main/packages/victory-vendor)\nwhich aims to solve the same problem.\n\n## Vendored packages\n\nAll vendored packages are listed as `dependencies` in the `package.json` of this package (note that\nthe `installConfig.hoistingLimits` option is set for this package to guarantee version specificity\nin this large monorepo where we may have mixed versions of `d3` packages). For each (non-types)\npackage `<pkg>`, we generate the following:\n\n- an ESM version of the package in `esm/<pkg>.js`\n- a CJS version of the package in `lib/<pkg>.js`\n  - this points to the fully-transpiled version of the package in\n    `vendor-cjs/vendor-<pkg>/src/index.js`\n  - `vendor-cjs/vendor-<pkg>/LICENSE` contains the upstream license of the vendored package\n  - other ESM-only packages (e.g., `<pkg2>`) that are referenced by `<pkg>` are updated to point to\n    `vendor-cjs/vendor-<pkg2>/src/index.js`\n- TypeScript types from `@types/<pkg>` as root `<pkg>.d.ts` files (when available as specified in\n  the `package.json` `dependencies`)\n- a root `<pkg>.js` file (pointing to the CJS version of the lib) for tooling that doesn't yet\n  support `package.json:exports`\n  ([conditional exports](https://nodejs.org/api/packages.html#conditional-exports))\n\n## How it works\n\nWe provide two alternate paths and behaviors -- for ESM and CommonJS\n\n### ESM\n\nWhen you use a module `import` syntax like the following, it will resolve to a re-exported version\nof `node_modules/d3-interpolate`, the unmodified ESM library from D3.\n\n```ts\nimport { interpolate } from '@visx/vendor/d3-interpolate';\n```\n\n### CommonJS\n\nIf you use a CJS `require` syntax like the following, it will resolve to an alternate path that\ncontains the **transpiled** version of the underlying `d3-*` (or other) library to be found at\n`@visx/vendor/vendor-cjs/d3-interpolate/**/*.js`.\n\n```ts\nconst { interpolate } = require('@visx/vendor/d3-interpolate');\n```\n\nSuch transpiled versions have _internally consistent_ import references to other other\n`@visx/vendor/vendor-cjs/<pkg-name>` paths that need to be transpiled.\n\n### Root index files & types\n\nFor tooling that doesn't yet support `package.json:exports`\n([conditional exports](https://nodejs.org/api/packages.html#conditional-exports)), we include root\nindex files for all vendored packages, e.g., `@visx/vendor/d3-array.js`.\n\nType declaration files are also included in the root, e.g., `@types/d3-array` is exported as\n`@visx/vendor/d3-array.d.ts`.\n"
  },
  {
    "path": "packages/visx-vendor/package.json",
    "content": "{\n  \"name\": \"@visx/vendor\",\n  \"version\": \"4.0.0-alpha.0\",\n  \"description\": \"vendored packages for visx\",\n  \"sideEffects\": false,\n  \"installConfig\": {\n    \"hoistingLimits\": \"workspaces\"\n  },\n  \"repository\": \"https://github.com/airbnb/visx\",\n  \"keywords\": [\n    \"visx\",\n    \"data\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@williaster\",\n  \"license\": \"MIT and ISC\",\n  \"dependencies\": {\n    \"@types/d3-array\": \"3.0.3\",\n    \"@types/d3-color\": \"3.1.0\",\n    \"@types/d3-delaunay\": \"6.0.1\",\n    \"@types/d3-format\": \"3.0.1\",\n    \"@types/d3-geo\": \"3.1.0\",\n    \"@types/d3-interpolate\": \"3.0.1\",\n    \"@types/d3-path\": \"3.1.1\",\n    \"@types/d3-scale\": \"4.0.2\",\n    \"@types/d3-shape\": \"3.1.7\",\n    \"@types/d3-time\": \"3.0.0\",\n    \"@types/d3-time-format\": \"2.1.0\",\n    \"d3-array\": \"3.2.1\",\n    \"d3-color\": \"3.1.0\",\n    \"d3-delaunay\": \"6.0.2\",\n    \"d3-format\": \"3.1.0\",\n    \"d3-geo\": \"3.1.0\",\n    \"d3-interpolate\": \"3.0.1\",\n    \"d3-path\": \"3.1.0\",\n    \"d3-scale\": \"4.0.2\",\n    \"d3-shape\": \"3.2.0\",\n    \"d3-time\": \"3.1.0\",\n    \"d3-time-format\": \"4.1.0\",\n    \"internmap\": \"2.0.3\"\n  },\n  \"devDependencies\": {\n    \"@babel/core\": \"^7.26.0\",\n    \"@babel/plugin-transform-modules-commonjs\": \"^7.22.5\",\n    \"@types/rimraf\": \"^3.0.2\",\n    \"babel-plugin-module-resolver\": \"^5.0.0\",\n    \"chalk\": \"4.1.0\",\n    \"compare-versions\": \"^5.0.0\",\n    \"rimraf\": \"^3.0.2\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"exports\": {\n    \"./package.json\": \"./package.json\",\n    \"./d3-*\": {\n      \"types\": \"./d3-*.d.ts\",\n      \"import\": \"./esm/d3-*.js\",\n      \"require\": \"./lib/d3-*.js\"\n    },\n    \"./internmap\": {\n      \"import\": \"./esm/internmap.js\",\n      \"require\": \"./lib/internmap.js\"\n    }\n  },\n  \"files\": [\n    \"lib/\",\n    \"esm/\",\n    \"vendor-cjs/\",\n    \"./d3-*\",\n    \"./internmap.js\"\n  ]\n}\n"
  },
  {
    "path": "packages/visx-vendor/scripts/buildVendor/babel.config.js",
    "content": "/**\n * This file handles the logic of transpiling ESM-only modules, ensuring that\n * any references to _other_ ESM-only modules also points to our vendored libs.\n */\n// eslint-disable-next-line no-undef\nconst path = require('path');\n\n// eslint-disable-next-line no-undef\nmodule.exports = {\n  plugins: [\n    [\n      '@babel/transform-modules-commonjs',\n      {\n        strict: false,\n        allowTopLevelThis: true,\n      },\n    ],\n    [\n      'module-resolver',\n      {\n        /**\n         * Converts all imports for _other_ ESM-only dependencies to the relative\n         * path in our vendor package. Example input and output for a `d3-scale` file\n         * importing from `d3-time-format`.\n         *\n         * sourcePath: 'd3-time-format'\n         * currentFile: '/some/path/visx/node_modules/d3-scale/src/time.js'\n         * relativePath: '../../d3-time-format/src/index.js'\n         */\n        resolvePath(sourcePath, currentFile) {\n          // extract the pkg name and detect if there is a deep import path\n          const packagePattern = /^(?<pkg>([^/]+))(?<path>.*)/;\n          const match = packagePattern.exec(sourcePath);\n\n          if (match) {\n            const pkgName = match.groups.pkg;\n\n            // this is the easies way to pass this map to this file :melt:\n            const vendorPkgMap = JSON.parse(process.env.VENDOR_PKG_MAP || '{}');\n\n            // if this pkg is one we vendor\n            if (pkgName in vendorPkgMap) {\n              // Throw if there is a path component like \"d3-<whatever>/path/to.js\"\n              if (match.groups.path) {\n                throw new Error(`Unable to process ${sourcePath} import in ${currentFile}`);\n              }\n              const sourcePkg = vendorPkgMap[pkgName];\n\n              // convert from node_modules to the target vendored path, e.g.,\n              //    /path/visx/node_modules/d3-array/src/difference.js\n              //    /path/visx/packages/visx-vendor/lib/d3-array/src/difference.js\n              const currentFileVendoredFilename = currentFile.replace(\n                process.env.ROOT_NODE_MODULES_PATH,\n                process.env.VENDOR_CJS_PATH,\n              );\n\n              // now create a *relative* path from the current vendor file to the\n              // vendored source file being imported in the current file, e.g., the path from\n              //    /path/visx/packages/visx-vendor/lib/d3-array/src/difference.js\n              // to\n              //    /path/visx/packages/visx-vendor/lib/d3-XXX/src/index.js\n              const relativePath = path.relative(\n                path.dirname(currentFileVendoredFilename),\n                sourcePkg.vendorIndexFileName,\n              );\n\n              return relativePath;\n            }\n          }\n\n          return sourcePath;\n        },\n      },\n    ],\n  ],\n};\n"
  },
  {
    "path": "packages/visx-vendor/scripts/buildVendor/index.ts",
    "content": "/* eslint import/no-extraneous-dependencies: 'off' */\nimport chalk from 'chalk';\nimport childProcess from 'child_process';\nimport fs, { promises as fsPromises } from 'fs';\nimport path from 'path';\nimport util from 'util';\nimport baseRimraf from 'rimraf';\n\nimport {\n  parsedVendorPkgsMap,\n  getESMContent,\n  getCJSContent,\n  BABEL_CONFIG_FILE,\n  ESM_PATH,\n  CJS_PATH,\n  VENDOR_CJS_PATH,\n  NODE_MODULES_PATH,\n  getTSContent,\n  TS_GLOB,\n  INDEX_GLOB,\n  getIndexContent,\n} from './utils';\n\nconst exec = util.promisify(childProcess.exec);\nconst rimraf = util.promisify(baseRimraf);\n\n/**\n * Handles building the entire package. Assumes all vendored packages are included\n * in the package.json and yarn installed in `./packages/visx-vendor/node_modules`\n * (i.e., they are not hoisted to the root, this helps guarantee specificity of\n * vendored packages).\n */\nasync function build() {\n  // print out packages to be vendored\n  console.log(\n    chalk.green(\n      `👀 Vendoring the following packages\\n  --${Object.values(parsedVendorPkgsMap)\n        .map((pkg) => pkg.packageName)\n        .sort()\n        .join('\\n  --')}`,\n    ),\n  );\n\n  // validate that we can resolve all packages in (the root) node modules\n  // they are aliased so they are guaranteed to be in the root\n  Object.values(parsedVendorPkgsMap).forEach((pkg) => {\n    const exists = fs.existsSync(pkg.nodeModulesPath);\n    if (!exists) {\n      throw new Error(`Module note found: ${pkg.packageName} (looked for: ${pkg.nodeModulesPath})`);\n    }\n  });\n  console.log(chalk.green('✅ Verified all packages are installed.'));\n\n  // clean output directories\n  const dirs = [ESM_PATH, CJS_PATH, VENDOR_CJS_PATH];\n  const dirsAndFiles = [...dirs, TS_GLOB, INDEX_GLOB];\n\n  console.log(chalk.green('🧹 Cleaning old vendor directories.'));\n  await Promise.all(dirsAndFiles.map((glob) => rimraf(glob)));\n\n  console.log(chalk.green('📁 Creating empty vendor directories.'));\n  await Promise.all(dirs.map((libPath) => fsPromises.mkdir(libPath, { recursive: true })));\n\n  // transpile vendor packages to CJS\n  console.log(chalk.green('🪄  Transpiling vendor sources to CJS'));\n\n  // transpile the src/ of non-type files\n  const transpileGlob = Object.values(parsedVendorPkgsMap)\n    .filter((pkg) => !pkg.isTypeFile)\n    .map((pkg) => `\"${pkg.nodeModulesPath}/src/**/*.js\"`)\n    .join(',');\n\n  const { stdout, stderr } = await exec(\n    `babel \\\n      --config-file ${BABEL_CONFIG_FILE} \\\n      --only ${transpileGlob} \\\n      --out-dir ${VENDOR_CJS_PATH} \\\n      ${NODE_MODULES_PATH}`,\n  );\n\n  if (stdout) {\n    console.log(chalk.greenBright(`  ${stdout}`));\n  }\n  if (stderr) {\n    console.log(chalk.redBright(`  ${stderr}`));\n  }\n\n  // write esm + cjs files, and copy licenses\n  console.log(chalk.green('🏗️ Generating esm, cjs, and type files, and copying licenses.'));\n  await Promise.all(\n    Object.values(parsedVendorPkgsMap).map(async (pkg) => {\n      console.log(chalk.green(`  -${pkg.packageName}`));\n\n      if (pkg.isTypeFile) {\n        if (!pkg.tsFileName) {\n          throw new Error(`Missing tsFileName for ${pkg.packageName}`);\n        }\n        await Promise.all([fsPromises.writeFile(pkg.tsFileName, getTSContent(pkg))]);\n      } else {\n        // paths\n        const libVendorPath = pkg.vendorPath;\n        const pkgJsonPath = path.join(pkg.nodeModulesPath, 'package.json');\n        const srcLicensePath = path.join(pkg.nodeModulesPath, 'LICENSE');\n        const vendorLicensePath = path.join(libVendorPath, 'LICENSE');\n\n        const parsedPkgJson = await fsPromises\n          .readFile(pkgJsonPath)\n          .then((buf) => JSON.parse(buf.toString()));\n\n        await Promise.all([\n          // write ESM version\n          fsPromises.writeFile(pkg.esmFileName, getESMContent(parsedPkgJson, pkg)),\n\n          // write CJS version\n          fsPromises.writeFile(pkg.cjsFileName, getCJSContent(parsedPkgJson, pkg)),\n\n          // write index file\n          fsPromises.writeFile(pkg.indexFileName, getIndexContent(parsedPkgJson, pkg)),\n\n          // copy licenses\n          fsPromises.copyFile(srcLicensePath, vendorLicensePath),\n        ]);\n      }\n    }),\n  );\n\n  console.log(chalk.green('✅ Completed successfully'));\n}\n\n// run build\nbuild().catch((error) => {\n  console.error(chalk.red(error.message));\n  process.exitCode = 1;\n});\n"
  },
  {
    "path": "packages/visx-vendor/scripts/buildVendor/utils.ts",
    "content": "import path from 'path';\n\nimport packageJson from '../../package.json';\n\n// types\n/** Parsed representation of a vendored package */\nexport type VendoredPkg = {\n  /** Name of the package, e.g., d3-array. */\n  packageName: string;\n  /** Whether this package is a types file. */\n  isTypeFile: boolean;\n  /** Fully-resolved path to transpiled vendor source in @visx/vendor. */\n  vendorPath: string;\n  /** Fully-resolved vendor path with src/index.js */\n  vendorIndexFileName: string;\n  /** Fully-resolved path of the vendored CJS package. */\n  cjsFileName: string;\n  /** Fully-resolved path of the vendored ESM package. */\n  esmFileName: string;\n  /** Fully-resolved path of the vendored TS package (for @types packages). */\n  tsFileName?: string;\n  /**\n   * Fully-resolved path of the vendored root file, e.g,. @visx/vendor/d3-array.js.\n   * Used for infra that doesn't support package.json `exports` field.\n   */\n  indexFileName: string;\n  /** Fully-resolved path to the @visx/vendor/node_modules/<pkg> directory. */\n  nodeModulesPath: string;\n};\n\n/** Minimal representation of a package.json */\ntype PackageJson = {\n  name: string;\n  repository: { url: string };\n};\n\n// constants\nexport const DIRNAME = __dirname; // eslint-disable-line no-undef\nexport const ESM_DIR = 'esm/';\nexport const CJS_DIR = 'lib/';\nexport const VENDOR_CJS_DIR = 'vendor-cjs/';\nconst ROOT_PATH = path.resolve(DIRNAME, '../../');\nexport const TS_GLOB = path.resolve(ROOT_PATH, '*.d.ts');\nexport const INDEX_GLOB = path.resolve(ROOT_PATH, '*.js');\n\nexport const ESM_PATH = path.resolve(DIRNAME, `../../${ESM_DIR}`);\nexport const CJS_PATH = path.resolve(DIRNAME, `../../${CJS_DIR}`);\nexport const VENDOR_CJS_PATH = path.resolve(DIRNAME, `../../${VENDOR_CJS_DIR}`);\nexport const BABEL_CONFIG_FILE = path.resolve(DIRNAME, './babel.config.js');\nexport const NODE_MODULES_PATH = path.resolve(DIRNAME, '../../node_modules/');\n\n// vendor package metadata\nconst parseVendorPkgs = (pkgJsonDeps: {\n  [dep: string]: string;\n}): { [pkg: string]: VendoredPkg } => {\n  const pkgDependencies = Object.keys(pkgJsonDeps);\n\n  const result = pkgDependencies.reduce<{ [pkg: string]: VendoredPkg }>((all, packageName) => {\n    const isTypeFile = packageName.startsWith('@types/');\n    const pkg: VendoredPkg = {\n      packageName,\n      isTypeFile,\n      tsFileName: isTypeFile\n        ? `${ROOT_PATH}/${packageName.replace('@types/', '')}.d.ts`\n        : undefined,\n      esmFileName: `${ESM_PATH}/${packageName}.js`,\n      cjsFileName: `${CJS_PATH}/${packageName}.js`,\n      indexFileName: `${ROOT_PATH}/${packageName}.js`,\n      vendorIndexFileName: `${VENDOR_CJS_PATH}/${packageName}/src/index.js`,\n      vendorPath: `${VENDOR_CJS_PATH}/${packageName}`,\n      nodeModulesPath: `${NODE_MODULES_PATH}/${packageName}`,\n    };\n\n    all[packageName] = pkg;\n    return all;\n  }, {});\n\n  return result;\n};\n\nexport const parsedVendorPkgsMap = parseVendorPkgs(packageJson.dependencies);\n\nconst getLicenseUrl = (pkgJson: PackageJson) =>\n  `${pkgJson.repository.url.replace(/\\.git$/, '')}/blob/main/LICENSE`;\n\n/** Generates the content of the vendored ESM package. */\nexport function getESMContent(pkgJson: PackageJson, pkg: VendoredPkg) {\n  return `/**\n * \\`@visx/vendor/${pkg.packageName}\\` (ESM)\n * See upstream license: ${getLicenseUrl(pkgJson)}\n *\n * This ESM package re-exports the underlying installed dependencies of \n * \\`node_modules/${pkg.packageName}\\`\n */\nexport * from '${pkg.packageName}';`;\n}\n\n/** Generates the content of the vendored CJS package. */\nexport function getCJSContent(pkgJson: PackageJson, pkg: VendoredPkg) {\n  return `/**\n * \\`@visx/vendor/${pkg.packageName}\\` (CommonJS)\n * See upstream license: ${getLicenseUrl(pkgJson)}\n *\n * This CJS package exports transpiled vendor files in \\`${VENDOR_CJS_DIR}${pkg.packageName}\\`\n */\nmodule.exports = require('../${VENDOR_CJS_DIR}${pkg.packageName}/src/index.js');`;\n}\n\n/** Generates the content of the root index file which points to CJS. */\nexport function getIndexContent(pkgJson: PackageJson, pkg: VendoredPkg) {\n  return `/**\n * \\`@visx/vendor/${pkg.packageName}\\` (CommonJS)\n * See upstream license: ${getLicenseUrl(pkgJson)}\n *\n * This file only exists for tooling that doesn't work yet with package.json:exports\n * by proxying through the CommonJS version.\n */\nmodule.exports = require('./${VENDOR_CJS_DIR}${pkg.packageName}/src/index.js');`;\n}\n\n/** Generates the content of the vendored TS types. */\nexport function getTSContent(pkg: VendoredPkg) {\n  return `/** \\`@visx/vendor/${pkg.packageName.replace('@types/', '')}\\` (TypeScript) \n *\n * Re-exports the types from \\`${pkg.packageName}\\` \n */\nexport * from '${pkg.packageName.replace('@types/', '')}';`;\n}\n\n// note: this is how we pass these dynamic variables into the\n// babel config. it's not great but babel config files can't easily\n// import from TS module files like this\nprocess.env.VENDOR_CJS_PATH = VENDOR_CJS_PATH;\nprocess.env.NODE_MODULES_PATH = NODE_MODULES_PATH;\nprocess.env.VENDOR_PKG_MAP = JSON.stringify(parsedVendorPkgsMap);\n"
  },
  {
    "path": "packages/visx-vendor/scripts/flagVendorRequirements.ts",
    "content": "/* eslint import/no-extraneous-dependencies: 'off' */\nimport { compareVersions } from 'compare-versions';\nimport chalk from 'chalk';\nimport childProcess from 'child_process';\nimport util from 'util';\n\nconst exec = util.promisify(childProcess.exec);\n\n// based off of package.json history of packages in https://github.com/d3\n// it is not 100% comprehensive but includes all packages that might make\n// their way into visx\nconst ESM_ONLY_MAP = {\n  'd3-array': '3.0.0',\n  'd3-chord': '3.0.0',\n  'd3-color': '3.0.0',\n  'd3-contour': '3.0.0',\n  'd3-delaunay': '6.0.0',\n  'd3-force': '3.0.0',\n  'd3-format': '3.0.0',\n  'd3-geo': '3.0.0',\n  'd3-geo-projection': '4.0.0',\n  'd3-hierarchy': '3.0.0',\n  'd3-interpolate': '3.0.0',\n  'd3-path': '3.0.0',\n  'd3-polygon': '3.0.0',\n  'd3-quadtree': '3.0.0',\n  'd3-random': '3.0.0',\n  'd3-scale': '4.0.0',\n  'd3-scale-chromatic': '3.0.0',\n  'd3-shape': '3.0.0',\n  'd3-time': '3.0.0',\n  'd3-time-format': '4.0.0',\n  'd3-voronoi': '3.0.0',\n  internmap: '2.0.0',\n\n  // unlikely to ever be in visx\n  'd3-axis': '3.0.0',\n  'd3-brush': '3.0.0',\n  'd3-drag': '3.0.0',\n  'd3-ease': '3.0.0',\n  'd3-fetch': '3.0.0',\n  'd3-zoom': '3.0.0',\n\n  // non-esm-only, here for completeness\n  'd3-geo-polygon': '',\n  'd3-hexbin': '',\n  'd3-sankey': '',\n  'd3-tile': '',\n};\n\n/**\n * For each package in esmOnlyMap with a specified version, this identifies\n * installed versions using `yarn why`. If any installed versions are ESM-only,\n * it will eventually throw an error with the flagged versions.\n */\nasync function flagVendorRequirements(esmOnlyMap: { [pkg: string]: string }) {\n  const flaggedPackages: { [pkg: string]: string[] } = {};\n\n  await Promise.all(\n    // .map() does nothing, but is an easy way to await all calls\n    Object.entries(esmOnlyMap).map(async ([pkg, esmOnlyVersion]) => {\n      if (!esmOnlyVersion) return;\n\n      // find versions of this package in the tree\n      const command = `yarn why ${pkg} --recursive`;\n\n      const { stdout, stderr } = await exec(command);\n\n      if (stdout) {\n        // match instances of this package, pulling out vendor and version groups\n        // e.g., for `d3-array` match all of these\n        //   d3-chord#d3-array@1.2.4\n        //   @visx/vendor#d3-array@3.2.4\n        //   @visx/vendor#vendor-d3-time#d3-array@3.2.1\n        const pkgVersionRegex = new RegExp(\n          `(?<vendor>(@visx/vendor#.*))?${pkg}@(?<version>([0-9.]+))`,\n          'g',\n        );\n        const esmOnlyMatches = new Set<string>();\n\n        // find all matches/installed versions\n        // eslint-disable-next-line no-constant-condition\n        while (true) {\n          const match = pkgVersionRegex.exec(stdout);\n          const seenVersion = match?.groups?.version;\n          const isVendorDependency = match?.groups?.vendor;\n\n          // if there's a match check if it's esm-only\n          if (seenVersion) {\n            // if seen is >= esmOnly, this returns 0 or 1 (not -1)\n            const isEsmOnly = compareVersions(seenVersion, esmOnlyVersion) >= 0;\n\n            if (isEsmOnly && !esmOnlyMatches.has(seenVersion)) {\n              if (isVendorDependency) {\n                console.info(`VENDORED ${pkg}@${seenVersion} is ESM-only (≥ ${esmOnlyVersion})`);\n              } else {\n                console.info(`${pkg}@${seenVersion} is ESM-only (≥ ${esmOnlyVersion})`, match);\n                esmOnlyMatches.add(seenVersion);\n              }\n            }\n          } else {\n            break;\n          }\n        }\n\n        if (esmOnlyMatches.size > 0) {\n          flaggedPackages[pkg] = [...esmOnlyMatches].sort(compareVersions);\n        }\n      }\n      if (stderr) {\n        // pass (yarn why complains about invalid peer deps, etc)\n      }\n    }),\n  );\n\n  if (Object.keys(flaggedPackages).length > 0) {\n    console.error(\n      chalk.red(\n        'The following ESM-only should be vendored',\n        JSON.stringify(flaggedPackages, null, 2),\n      ),\n    );\n    process.exitCode = 1;\n  } else {\n    console.log(chalk.green('No (non-vendored) ESM-only packages detected ✨'));\n  }\n}\n\nflagVendorRequirements(ESM_ONLY_MAP).catch((error) => {\n  console.error(chalk.red(error.message));\n  process.exitCode = 1;\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/.eslintrc",
    "content": "{\n  \"rules\": {\n    \"@typescript-eslint/no-unused-vars\": \"off\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-array.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  Adder,\n  Bin,\n  Bisector,\n  bin,\n  bisect,\n  bisectCenter,\n  bisectLeft,\n  bisectRight,\n  bisector,\n  count,\n} from '@visx/vendor/d3-array';\n\ndescribe('d3-array', () => {\n  it('exports valid functions', () => {\n    expect(bisect).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-color.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  color,\n  cubehelix,\n  lab,\n  gray,\n  hcl,\n  HCLColor,\n  LabColor,\n  lch,\n  RGBColor,\n} from '@visx/vendor/d3-color';\n\ndescribe('d3-color', () => {\n  it('exports valid functions', () => {\n    expect(color).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-format.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  format,\n  formatDefaultLocale,\n  formatLocale,\n  formatPrefix,\n  formatSpecifier,\n  FormatSpecifierObject,\n} from '@visx/vendor/d3-format';\n\ndescribe('d3-format', () => {\n  it('exports valid functions', () => {\n    expect(format).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-geo.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  ExtendedFeature,\n  ExtendedFeatureCollection,\n  ExtendedGeometryCollection,\n  GeoCircleGenerator,\n  GeoConicProjection,\n  GeoContext,\n  GeoGeometryObjects,\n  GeoGraticuleGenerator,\n  GeoIdentityTransform,\n  GeoPath,\n  GeoPermissibleObjects,\n  GeoProjection,\n  GeoRawProjection,\n  GeoRotation,\n  GeoSphere,\n  GeoStreamWrapper,\n  GeoStream,\n  GeoTransformPrototype,\n  geoAlbers,\n  geoAlbersUsa,\n  geoArea,\n  geoAzimuthalEqualArea,\n  geoAzimuthalEqualAreaRaw,\n  geoAzimuthalEquidistant,\n  geoAzimuthalEquidistantRaw,\n  geoBounds,\n} from '@visx/vendor/d3-geo';\n\ndescribe('d3-geo', () => {\n  it('exports valid functions', () => {\n    expect(geoBounds).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-interpolate.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  interpolate,\n  NumberArray,\n} from '@visx/vendor/d3-interpolate';\n\ndescribe('d3-interpolate', () => {\n  it('exports valid functions', () => {\n    expect(interpolate).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-scale.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  InterpolatorFactory,\n  NumberValue,\n  ScaleBand,\n  ScaleContinuousNumeric,\n  ScaleDiverging,\n  ScaleIdentity,\n  ScaleLinear,\n  ScaleLogarithmic,\n  ScaleOrdinal,\n  ScalePoint,\n  ScalePower,\n  ScaleQuantile,\n  ScaleQuantize,\n  ScaleRadial,\n  ScaleSequential,\n  ScaleSequentialBase,\n  ScaleSequentialQuantile,\n  ScaleSymLog,\n  ScaleThreshold,\n  ScaleTime,\n  UnknownReturnType,\n  scaleBand,\n  scaleDiverging,\n  scaleDivergingLog,\n  scaleDivergingPow,\n  scaleDivergingSqrt,\n  scaleDivergingSymlog,\n  scaleIdentity,\n  scaleImplicit,\n  scaleLinear,\n  scaleLog,\n  scaleOrdinal,\n  scalePoint,\n  scalePow,\n  scaleQuantile,\n  scaleQuantize,\n  scaleRadial,\n  scaleSequential,\n  scaleSequentialLog,\n  scaleSequentialPow,\n  scaleSequentialQuantile,\n  scaleSequentialSqrt,\n  scaleSequentialSymlog,\n  scaleSqrt,\n  scaleSymlog,\n  scaleThreshold,\n  scaleTime,\n  scaleUtc,\n  tickFormat,\n} from '@visx/vendor/d3-scale';\n\ndescribe('d3-scale', () => {\n  it('exports valid functions', () => {\n    expect(scaleLinear).toBeInstanceOf(Function);\n    expect(scaleBand).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-time-format.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  timeFormat,\n  timeParse,\n  timeFormatLocale,\n  TimeLocaleObject,\n  utcFormat,\n  isoFormat,\n} from '@visx/vendor/d3-time-format';\n\ndescribe('d3-time-format', () => {\n  it('exports valid functions', () => {\n    expect(timeParse).toBeInstanceOf(Function);\n    expect(timeFormat).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/d3-time.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport {\n  // @ts-expect-error Make sure invalid imports fail:\n  INVALID_TYPE,\n  CountableTimeInterval,\n  TimeInterval,\n  timeDay,\n  timeInterval,\n} from '@visx/vendor/d3-time';\n\ndescribe('d3-time', () => {\n  it('exports valid functions', () => {\n    expect(timeDay).toBeInstanceOf(Function);\n    expect(timeInterval).toBeInstanceOf(Function);\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/test/internmap.test.ts",
    "content": "/* This test verifies that these modules and types are exported correctly */\nimport { InternSet, InternMap } from '@visx/vendor/internmap';\n\ndescribe('internmap', () => {\n  it('exports valid classes', () => {\n    expect(InternSet).toBeDefined();\n    expect(InternMap).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-vendor/tsconfig.json",
    "content": "{\n  \"extends\": \"../../tsconfig.options.json\",\n  \"compilerOptions\": {\n    \"noUnusedLocals\": false\n  },\n  \"references\": [],\n  \"include\": []\n}"
  },
  {
    "path": "packages/visx-vendor/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/vendor',\n    globals: true,\n    environment: 'node',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      // vendor package re-exports d3 modules, coverage not applicable\n      include: ['packages/visx-vendor/vendor-cjs/**/*.js'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  // No alias needed - let Node's module resolution use package.json exports\n});\n"
  },
  {
    "path": "packages/visx-visx/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-visx/Readme.md",
    "content": "# @visx/visx\n\n<a title=\"@visx/visx npm downloads\" href=\"https://www.npmjs.com/package/@visx/visx\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/visx.svg?style=flat-square\" />\n</a>\n\nThe one stop install for all `visx` packages.\n\n## Installation\n\n```\nnpm install --save @visx/visx\n```\n"
  },
  {
    "path": "packages/visx-visx/package.json",
    "content": "{\n  \"name\": \"@visx/visx\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"One stop install for all visx packages\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@visx/annotation\": \"workspace:*\",\n    \"@visx/axis\": \"workspace:*\",\n    \"@visx/bounds\": \"workspace:*\",\n    \"@visx/brush\": \"workspace:*\",\n    \"@visx/clip-path\": \"workspace:*\",\n    \"@visx/curve\": \"workspace:*\",\n    \"@visx/delaunay\": \"workspace:*\",\n    \"@visx/drag\": \"workspace:*\",\n    \"@visx/event\": \"workspace:*\",\n    \"@visx/geo\": \"workspace:*\",\n    \"@visx/glyph\": \"workspace:*\",\n    \"@visx/gradient\": \"workspace:*\",\n    \"@visx/grid\": \"workspace:*\",\n    \"@visx/group\": \"workspace:*\",\n    \"@visx/heatmap\": \"workspace:*\",\n    \"@visx/hierarchy\": \"workspace:*\",\n    \"@visx/legend\": \"workspace:*\",\n    \"@visx/marker\": \"workspace:*\",\n    \"@visx/mock-data\": \"workspace:*\",\n    \"@visx/network\": \"workspace:*\",\n    \"@visx/pattern\": \"workspace:*\",\n    \"@visx/point\": \"workspace:*\",\n    \"@visx/responsive\": \"workspace:*\",\n    \"@visx/sankey\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"@visx/text\": \"workspace:*\",\n    \"@visx/threshold\": \"workspace:*\",\n    \"@visx/tooltip\": \"workspace:*\",\n    \"@visx/voronoi\": \"workspace:*\",\n    \"@visx/wordcloud\": \"workspace:*\",\n    \"@visx/xychart\": \"workspace:*\",\n    \"@visx/zoom\": \"workspace:*\"\n  },\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-visx/src/index.ts",
    "content": "// @visx/visx\nimport * as Annotation from '@visx/annotation';\nimport * as Axis from '@visx/axis';\nimport * as Bounds from '@visx/bounds';\nimport * as Brush from '@visx/brush';\nimport * as ClipPath from '@visx/clip-path';\nimport * as Curve from '@visx/curve';\nimport * as Drag from '@visx/drag';\nimport * as Event from '@visx/event';\nimport * as Geo from '@visx/geo';\nimport * as Glyph from '@visx/glyph';\nimport * as Gradient from '@visx/gradient';\nimport * as Grid from '@visx/grid';\nimport * as Group from '@visx/group';\nimport * as Heatmap from '@visx/heatmap';\nimport * as Hierarchy from '@visx/hierarchy';\nimport * as Legend from '@visx/legend';\nimport * as Marker from '@visx/marker';\nimport * as MockData from '@visx/mock-data';\nimport * as Network from '@visx/network';\nimport * as Pattern from '@visx/pattern';\nimport * as Point from '@visx/point';\nimport * as Responsive from '@visx/responsive';\nimport * as Scale from '@visx/scale';\nimport * as Shape from '@visx/shape';\nimport * as Text from '@visx/text';\nimport * as Threshold from '@visx/threshold';\nimport * as Tooltip from '@visx/tooltip';\nimport * as Voronoi from '@visx/voronoi';\nimport * as Wordcloud from '@visx/wordcloud';\nimport * as XYChart from '@visx/xychart';\nimport * as Zoom from '@visx/zoom';\n\nexport {\n  Annotation,\n  Axis,\n  Bounds,\n  Brush,\n  ClipPath,\n  Curve,\n  Drag,\n  Event,\n  Geo,\n  Glyph,\n  Gradient,\n  Grid,\n  Group,\n  Heatmap,\n  Hierarchy,\n  Legend,\n  Marker,\n  MockData,\n  Network,\n  Pattern,\n  Point,\n  Responsive,\n  Scale,\n  Shape,\n  Text,\n  Threshold,\n  Tooltip,\n  Voronoi,\n  Wordcloud,\n  XYChart,\n  Zoom,\n};\n"
  },
  {
    "path": "packages/visx-visx/test/index.test.ts",
    "content": "import * as visx from '../src';\n\ndescribe('visx', () => {\n  it('should be defined', () => {\n    expect(visx).toBeDefined();\n  });\n\n  it('should export @visx/annotation', () => {\n    expect(visx.Annotation.Annotation).toBeDefined();\n  });\n\n  it('should export @visx/axis', () => {\n    expect(visx.Axis.Axis).toBeDefined();\n  });\n\n  it('should export @visx/bounds', () => {\n    expect(visx.Bounds.withBoundingRects).toBeDefined();\n  });\n\n  it('should export @visx/clip-path', () => {\n    expect(visx.ClipPath.ClipPath).toBeDefined();\n  });\n\n  it('should export @visx/curve', () => {\n    expect(visx.Curve.curveBasis).toBeDefined();\n  });\n\n  it('should export @visx/drag', () => {\n    expect(visx.Drag.Drag).toBeDefined();\n  });\n\n  it('should export @visx/event', () => {\n    expect(visx.Event.localPoint).toBeDefined();\n  });\n\n  it('should export @visx/geo', () => {\n    expect(visx.Geo.Albers).toBeDefined();\n  });\n\n  it('should export @visx/glyph', () => {\n    expect(visx.Glyph.Glyph).toBeDefined();\n  });\n\n  it('should export @visx/gradient', () => {\n    expect(visx.Gradient.LinearGradient).toBeDefined();\n  });\n\n  it('should export @visx/grid', () => {\n    expect(visx.Grid.Grid).toBeDefined();\n  });\n\n  it('should export @visx/group', () => {\n    expect(visx.Group.Group).toBeDefined();\n  });\n\n  it('should export @visx/heatmap', () => {\n    expect(visx.Heatmap.HeatmapRect).toBeDefined();\n  });\n\n  it('should export @visx/hierarchy', () => {\n    expect(visx.Hierarchy.Tree).toBeDefined();\n  });\n\n  it('should export @visx/legend', () => {\n    expect(visx.Legend.Legend).toBeDefined();\n  });\n\n  it('should export @visx/marker', () => {\n    expect(visx.Marker.Marker).toBeDefined();\n  });\n\n  it('should export @visx/mock-data', () => {\n    expect(visx.MockData.genDateValue).toBeDefined();\n  });\n\n  it('should export @visx/network', () => {\n    expect(visx.Network.Graph).toBeDefined();\n  });\n\n  it('should export @visx/pattern', () => {\n    expect(visx.Pattern.Pattern).toBeDefined();\n  });\n\n  it('should export @visx/point', () => {\n    expect(visx.Point.Point).toBeDefined();\n  });\n\n  it('should export @visx/responsive', () => {\n    expect(visx.Responsive.withParentSize).toBeDefined();\n  });\n\n  it('should export @visx/scale', () => {\n    expect(visx.Scale.scaleBand).toBeDefined();\n  });\n\n  it('should export @visx/shape', () => {\n    expect(visx.Shape.Bar).toBeDefined();\n  });\n\n  it('should export @visx/text', () => {\n    expect(visx.Text.Text).toBeDefined();\n  });\n\n  it('should export @visx/tooltip', () => {\n    expect(visx.Tooltip.Tooltip).toBeDefined();\n  });\n\n  it('should export @visx/voronoi', () => {\n    expect(visx.Voronoi.voronoi).toBeDefined();\n  });\n\n  it('should export @visx/xychart', () => {\n    expect(visx.XYChart.XYChart).toBeDefined();\n  });\n\n  it('should export @visx/zoom', () => {\n    expect(visx.Zoom.Zoom).toBeDefined();\n  });\n\n  it('should export @visx/wordcloud', () => {\n    expect(visx.Wordcloud.Wordcloud).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-visx/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-annotation\"\n    },\n    {\n      \"path\": \"../visx-axis\"\n    },\n    {\n      \"path\": \"../visx-bounds\"\n    },\n    {\n      \"path\": \"../visx-brush\"\n    },\n    {\n      \"path\": \"../visx-clip-path\"\n    },\n    {\n      \"path\": \"../visx-curve\"\n    },\n    {\n      \"path\": \"../visx-delaunay\"\n    },\n    {\n      \"path\": \"../visx-drag\"\n    },\n    {\n      \"path\": \"../visx-event\"\n    },\n    {\n      \"path\": \"../visx-geo\"\n    },\n    {\n      \"path\": \"../visx-glyph\"\n    },\n    {\n      \"path\": \"../visx-gradient\"\n    },\n    {\n      \"path\": \"../visx-grid\"\n    },\n    {\n      \"path\": \"../visx-group\"\n    },\n    {\n      \"path\": \"../visx-heatmap\"\n    },\n    {\n      \"path\": \"../visx-hierarchy\"\n    },\n    {\n      \"path\": \"../visx-legend\"\n    },\n    {\n      \"path\": \"../visx-marker\"\n    },\n    {\n      \"path\": \"../visx-mock-data\"\n    },\n    {\n      \"path\": \"../visx-network\"\n    },\n    {\n      \"path\": \"../visx-pattern\"\n    },\n    {\n      \"path\": \"../visx-point\"\n    },\n    {\n      \"path\": \"../visx-responsive\"\n    },\n    {\n      \"path\": \"../visx-sankey\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    },\n    {\n      \"path\": \"../visx-text\"\n    },\n    {\n      \"path\": \"../visx-threshold\"\n    },\n    {\n      \"path\": \"../visx-tooltip\"\n    },\n    {\n      \"path\": \"../visx-voronoi\"\n    },\n    {\n      \"path\": \"../visx-wordcloud\"\n    },\n    {\n      \"path\": \"../visx-xychart\"\n    },\n    {\n      \"path\": \"../visx-zoom\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-visx/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: 'visx',\n    globals: true,\n    environment: 'node',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-visx/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      visx: path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-voronoi/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-voronoi/Readme.md",
    "content": "# @visx/voronoi\n\n<a title=\"@visx/voronoi npm downloads\" href=\"https://www.npmjs.com/package/@visx/voronoi\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/voronoi.svg?style=flat-square\" />\n</a>\n\n## Overview\n\nA Voronoi diagram partitions a two-dimensional plane into regions based on a set of input points.\nEach unique input point maps to a corresponding region, where each region represents _all points\nthat are closer to the input point than to any other input point_.\n\nNot only are Voronoi diagrams 😍, but they can be used to\n[improve the interactive experience of a visualization](https://www.visualcinnamon.com/2015/07/voronoi.html).\nThis is most often accomplished by overlaying an invisible voronoi grid on top of the visualization\nto increase the target area of interaction sites such as points on a scatter plot.\n\nThe `@visx/voronoi` package provides a wrapper around the existing\n[d3-voronoi](https://github.com/d3/d3-voronoi) package with some `react`-specific utilities.\n\n## Installation\n\n```\nnpm install --save @visx/voronoi\n```\n\n## Usage\n\nThe `@visx/voronoi` package exports a wrapped version of the d3 `voronoi` layout for flexible usage,\nas well as a `<VoronoiPolygon />` component for rendering Voronoi regions.\n\n```js\nimport { voronoi, VoronoiPolygon } from '@visx/voronoi';\n\nconst points = Array(n).fill(null).map(() => ({\n  x: Math.random() * innerWidth,\n  y: Math.random() * innerHeight,\n}));\n\n// width + height set an extent on the voronoi\n// x + y set relevant accessors depending on the shape of your data\nconst voronoiLayout = voronoi({\n  x: d => d.x,\n  y: d => d.y,\n  width,\n  height,\n});\n\nconst voronoiDiagram = voronoiLayout(data);\nconst polygons = voronoiDiagram.polygons(); // equivalent to voronoiLayout.polygons(points)\n\nreturn (\n  <svg>\n    <Group>\n      {polygons.map((polygon) => (\n        <VoronoiPolygon key={...} polygon={polygon} />\n      ))}\n      {points.map(({ x, y }) => (\n        <circle key={...} cx={x} cy={y} />\n      )}\n    </Group>\n  </svg>\n)\n```\n\nFor more advanced usage with events, see [this example](https://airbnb.io/visx/voronoi). Additional\ninformation about the voronoi layout + diagram can be found in the\n[d3-voronoi documentation](https://github.com/d3/d3-voronoi).\n"
  },
  {
    "path": "packages/visx-voronoi/package.json",
    "content": "{\n  \"name\": \"@visx/voronoi\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx voronoi\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"Chris Williams @williaster\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"dependencies\": {\n    \"@types/d3-voronoi\": \"^1.1.9\",\n    \"@types/react\": \"*\",\n    \"classnames\": \"^2.3.1\",\n    \"d3-voronoi\": \"^1.1.2\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-voronoi/src/components/VoronoiPolygon.tsx",
    "content": "import type { ReactNode, SVGProps } from 'react';\nimport cx from 'classnames';\n\nexport type VoronoiPolygonProps = {\n  /** Override render function which is provided polygon and generated path. */\n  children?: ({ path, polygon }: { path: string; polygon: [number, number][] }) => ReactNode;\n  /** className to apply to path element. */\n  className?: string;\n  /** Array of coordinate arrays for the polygon (e.g., [[x,y], [x1,y1], ...]), used to generate polygon path. */\n  polygon?: [number, number][];\n};\n\nexport default function VoronoiPolygon({\n  polygon,\n  className,\n  children,\n  ...restProps\n}: VoronoiPolygonProps & Omit<SVGProps<SVGPathElement>, keyof VoronoiPolygonProps>) {\n  if (!polygon) return null;\n  const path = `M${polygon.join('L')}Z`;\n  if (children) return <>{children({ path, polygon })}</>;\n\n  return <path className={cx('visx-voronoi-polygon', className)} d={path} {...restProps} />;\n}\n"
  },
  {
    "path": "packages/visx-voronoi/src/index.ts",
    "content": "// @visx/voronoi\nexport { default as voronoi } from './voronoi';\nexport { default as VoronoiPolygon } from './components/VoronoiPolygon';\n\nexport type { VoronoiPolygonProps } from './components/VoronoiPolygon';\n"
  },
  {
    "path": "packages/visx-voronoi/src/voronoi.ts",
    "content": "import { voronoi as d3Voronoi } from 'd3-voronoi';\n\nconst CLIP_PADDING = 1;\n\ninterface Config<Datum> {\n  /** The total width of the voronoi layout. */\n  width?: number;\n  /** The total width of the voronoi layout. */\n  height?: number;\n  /** Set the x-value accessor function for the voronoi layout. */\n  x?: (d: Datum) => number;\n  /** Set the y-value accessor function for the voronoi layout. */\n  y?: (d: Datum) => number;\n}\n\n/**\n * Returns a configured d3 voronoi `layout`. calling `layout(data)` returns a voronoi *diagram*.\n * Alternatively call `layout.polygons(data)`, `layout.triangles(data)`, `layout.links(data)`\n */\nexport default function voronoi<Datum>({ width = 0, height = 0, x, y }: Config<Datum>) {\n  const voronoiGenerator = d3Voronoi<Datum>();\n\n  if (x) voronoiGenerator.x(x);\n  if (y) voronoiGenerator.y(y);\n\n  voronoiGenerator.extent([\n    [-CLIP_PADDING, -CLIP_PADDING],\n    [width + CLIP_PADDING, height + CLIP_PADDING],\n  ]);\n\n  return voronoiGenerator;\n}\n"
  },
  {
    "path": "packages/visx-voronoi/test/VoronoiPolygon.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { VoronoiPolygon } from '../src';\n\ndescribe('<VoronoiPolygon />', () => {\n  const polygon: [number, number][] = new Array(3).fill(null).map((_, i) => [i, i]);\n\n  const props = { polygon };\n\n  test('it should be defined', () => {\n    expect(VoronoiPolygon).toBeDefined();\n  });\n\n  test('it should not render without a polygon', () => {\n    const { container } = render(\n      <svg>\n        <VoronoiPolygon />\n      </svg>,\n    );\n    expect(container.querySelector('path')).not.toBeInTheDocument();\n  });\n\n  test('it should render a path', () => {\n    const { container } = render(\n      <svg>\n        <VoronoiPolygon {...props} />\n      </svg>,\n    );\n    expect(container.querySelector('path')).toBeInTheDocument();\n  });\n\n  test('it should set a d attribute based on the polygon prop', () => {\n    const { container } = render(\n      <svg>\n        <VoronoiPolygon {...props} />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path?.getAttribute('d')).toBe('M0,0L1,1L2,2Z');\n  });\n\n  test('it should add extra (non-func) props to the path element', () => {\n    const { container } = render(\n      <svg>\n        <VoronoiPolygon {...props} fill=\"orange\" />\n      </svg>,\n    );\n    const path = container.querySelector('path');\n    expect(path?.getAttribute('fill')).toBe('orange');\n  });\n});\n"
  },
  {
    "path": "packages/visx-voronoi/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-voronoi/test/voronoi.test.ts",
    "content": "import { voronoi } from '../src';\n\nconst x = () => 123;\nconst y = () => 123;\n\ndescribe('voronoi', () => {\n  test('it should be defined', () => {\n    expect(voronoi).toBeDefined();\n  });\n\n  test('x param should set voronoi x', () => {\n    const v = voronoi({ x });\n    expect(v.x()).toEqual(x);\n  });\n\n  test('y param should set voronoi y', () => {\n    const v = voronoi({ y });\n    expect(v.y()).toEqual(y);\n  });\n\n  test('width and height params should define extent', () => {\n    const width = 17;\n    const height = 99;\n    const v = voronoi({ width, height });\n    const extent = v.extent();\n    const endCoord = extent![1];\n    expect(endCoord[0]).toEqual(width + 1);\n    expect(endCoord[1]).toEqual(height + 1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-voronoi/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": []\n}"
  },
  {
    "path": "packages/visx-voronoi/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/voronoi',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-voronoi/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/voronoi': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-wordcloud/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-wordcloud/Readme.md",
    "content": "# `@visx/wordcloud`\n\n<a title=\"@visx/wordcloud npm downloads\" href=\"https://www.npmjs.com/package/@visx/wordcloud\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/wordcloud.svg?style=flat-square\" />\n</a>\n\nWord clouds are visual representations of text data in which each word's value is indicated by its\nfont size or color.\n\n## Installation\n\n```\nnpm install --save @visx/wordcloud\n```\n"
  },
  {
    "path": "packages/visx-wordcloud/package.json",
    "content": "{\n  \"name\": \"@visx/wordcloud\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx wordcloud\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\",\n    \"svg\"\n  ],\n  \"author\": \"Cezar Craciun @_cezarcraciun\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@visx/group\": \"workspace:*\",\n    \"d3-cloud\": \"^1.2.7\"\n  },\n  \"publishConfig\": {\n    \"access\": \"public\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-wordcloud/src/Wordcloud.tsx",
    "content": "import type { ReactNode } from 'react';\nimport { Group } from '@visx/group';\nimport type { BaseDatum, CloudWord, WordcloudConfig } from './types';\nimport useWordcloud from './useWordcloud';\n\nexport interface WordcloudProps<Datum extends BaseDatum> extends WordcloudConfig<Datum> {\n  children: (words: CloudWord[]) => ReactNode;\n}\n\nexport default function Wordcloud<Datum extends BaseDatum>(props: WordcloudProps<Datum>) {\n  const { children, ...wordcloudConfig } = props;\n  const { width, height } = wordcloudConfig;\n  const words = useWordcloud(wordcloudConfig);\n\n  if (width === 0 || height === 0) return null;\n\n  return (\n    <svg width={width} height={height}>\n      <Group left={width / 2} top={height / 2}>\n        {children(words)}\n      </Group>\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-wordcloud/src/d3-cloud.d.ts",
    "content": "declare module 'd3-cloud'"
  },
  {
    "path": "packages/visx-wordcloud/src/index.ts",
    "content": "// @visx/wordcloud\nexport { default as Wordcloud } from './Wordcloud';\nexport { default as useWordcloud } from './useWordcloud';\n"
  },
  {
    "path": "packages/visx-wordcloud/src/types.ts",
    "content": "export interface BaseDatum {\n  text: string;\n}\n\nexport interface WordcloudConfig<Datum extends BaseDatum> {\n  /**\n   * Width of the wordcloud layout.\n   */\n  width: number;\n  /**\n   * Height of the wordcloud layout.\n   */\n  height: number;\n  /**\n   * Sets the words array.\n   */\n  words: Datum[];\n  /**\n   * Sets the padding accessor function, which indicates the numerical padding for each word.\n   *\n   * @default 1\n   */\n  padding?: number | ((datum: Datum, index: number) => number);\n  /**\n   * Sets the font accessor function, which indicates the font face for each word.\n   *\n   * @default serif\n   */\n  font?: string | ((datum: Datum, index: number) => string);\n  /**\n   * Sets the fontSize accessor function, which indicates the numerical font size for each word.\n   *\n   * @default function(datum) { return Math.sqrt(datum.value); }\n   */\n  fontSize?: number | ((datum: Datum, index: number) => number);\n  /**\n   * Sets the fontStyle accessor function, which indicates the font style for each word.\n   *\n   * @default normal\n   */\n  fontStyle?: string | ((datum: Datum, index: number) => string);\n  /**\n   * Sets the fontWeight accessor function, which indicates the font weight for each word.\n   *\n   * @default normal\n   */\n  fontWeight?: string | number | ((datum: Datum, index: number) => string | number);\n  /**\n   * Sets the rotate accessor function, which indicates the rotation angle (in degrees) for each word.\n   *\n   * @default function() { return (~~(Math.random() * 6) -3) * 30; }\n   */\n  rotate?: number | ((datum: Datum, index: number) => number);\n  /**\n   * Sets the current type of spiral used for positioning words.\n   * This can either be one of the two built-in spirals, \"archimedean\" and \"rectangular\", or an arbitrary spiral generator can be used.\n   *\n   * @default archimedean\n   */\n  spiral?:\n    | 'archimedean'\n    | 'rectangular'\n    | ((size: [number, number]) => (t: number) => [number, number]);\n  /**\n   * Sets the internal random number generator, used for selecting the initial position of each word,\n   * and the clockwise/counterclockwise direction of the spiral for each word. Random function should return a number in the range [0, 1).\n   * When the returned value is a fixed value, the layout coordinates of each word will be the same every time the word cloud of the same data is rendered.\n   * By default, the browser's built-in 'Math.random' is used, which means that each rendering will change the position of the word.\n   *\n   * @default Math.random\n   */\n  random?: () => number;\n}\n\n/**\n * below are taken from @types/d3-cloud\n * they are copied below because TS@^4.8 is incompatible with its @d3/types dep.\n */\nexport interface CloudWord {\n  text?: string | undefined;\n  font?: string | undefined;\n  style?: string | undefined;\n  weight?: string | number | undefined;\n  rotate?: number | undefined;\n  size?: number | undefined;\n  padding?: number | undefined;\n  x?: number | undefined;\n  y?: number | undefined;\n}\n\nexport interface Cloud<T extends CloudWord> {\n  start(): Cloud<T>;\n  stop(): Cloud<T>;\n\n  timeInterval(): number;\n  timeInterval(interval: number): Cloud<T>;\n\n  words(): T[];\n  words(words: T[]): Cloud<T>;\n\n  size(): [number, number];\n  size(size: [number, number]): Cloud<T>;\n\n  font(): (datum: T, index: number) => string;\n  font(font: string | ((datum: T, index: number) => string)): Cloud<T>;\n\n  fontStyle(): (datum: T, index: number) => string;\n  fontStyle(style: string | ((datum: T, index: number) => string)): Cloud<T>;\n\n  fontWeight(): (datum: T, index: number) => string | number;\n  fontWeight(weight: string | number | ((datum: T, index: number) => string | number)): Cloud<T>;\n\n  rotate(): (datum: T, index: number) => number;\n  rotate(rotate: number | ((datum: T, index: number) => number)): Cloud<T>;\n\n  text(): (datum: T, index: number) => string;\n  text(text: string | ((datum: T, index: number) => string)): Cloud<T>;\n\n  spiral(): (size: [number, number]) => (t: number) => [number, number];\n  spiral(name: string | ((size: [number, number]) => (t: number) => [number, number])): Cloud<T>;\n\n  fontSize(): (datum: T, index: number) => number;\n  fontSize(size: number | ((datum: T, index: number) => number)): Cloud<T>;\n\n  padding(): (datum: T, index: number) => number;\n  padding(padding: number | ((datum: T, index: number) => number)): Cloud<T>;\n\n  /**\n   * If specified, sets the internal random number generator,used for selecting the initial position of each word,\n   * and the clockwise/counterclockwise direction of the spiral for each word.\n   *\n   * @param randomFunction should return a number in the range [0, 1).The default is Math.random.\n   */\n  random(): Cloud<T>;\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  random(randomFunction: () => number): Cloud<T>;\n\n  /**\n   * If specified, sets the canvas generator function, which is used internally to draw text.\n   * When using Node.js, you will almost definitely override the default, e.g. using the canvas module.\n   * @param canvasGenerator should return a HTMLCanvasElement.The default is:  ()=>{document.createElement(\"canvas\");}\n   */\n  canvas(): Cloud<T>;\n  // eslint-disable-next-line @typescript-eslint/unified-signatures\n  canvas(canvasGenerator: () => HTMLCanvasElement): Cloud<T>;\n\n  on(type: 'word', listener: (word: T) => void): Cloud<T>;\n  on(type: 'end', listener: (tags: T[], bounds: Array<{ x: number; y: number }>) => void): Cloud<T>;\n  on(type: string, listener: (...args: any[]) => void): Cloud<T>;\n\n  on(type: 'word'): (word: T) => void;\n  on(type: 'end'): (tags: T[], bounds: Array<{ x: number; y: number }>) => void;\n  on(type: string): (...args: any[]) => void;\n}\n"
  },
  {
    "path": "packages/visx-wordcloud/src/useWordcloud.ts",
    "content": "import { useEffect, useState } from 'react';\nimport d3Cloud from 'd3-cloud';\nimport type { BaseDatum, Cloud, CloudWord, WordcloudConfig } from './types';\n\nexport default function useWordcloud<Datum extends BaseDatum>({\n  width,\n  height,\n  font,\n  fontSize,\n  fontStyle,\n  fontWeight,\n  padding,\n  random,\n  rotate,\n  spiral,\n  words,\n}: WordcloudConfig<Datum>) {\n  const [cloudWords, setCloudWords] = useState<CloudWord[]>([]);\n\n  useEffect(() => {\n    if (width === 0 || height === 0) {\n      return;\n    }\n\n    const layout = d3Cloud() as Cloud<Datum>;\n\n    layout.size([width, height]);\n    layout.words(words);\n    if (typeof random !== 'undefined') layout.random(random);\n    if (typeof font !== 'undefined') layout.font(font);\n    if (typeof padding !== 'undefined') layout.padding(padding);\n    if (typeof fontSize !== 'undefined') layout.fontSize(fontSize);\n    if (typeof fontStyle !== 'undefined') layout.fontStyle(fontStyle);\n    if (typeof fontWeight !== 'undefined') layout.fontWeight(fontWeight);\n    if (typeof rotate !== 'undefined') layout.rotate(rotate);\n    if (typeof spiral !== 'undefined') layout.spiral(spiral);\n\n    layout.on('end', setCloudWords);\n    layout.start();\n\n    return function cleanup() {\n      layout.stop();\n    };\n  }, [\n    width,\n    height,\n    font,\n    fontSize,\n    fontStyle,\n    fontWeight,\n    padding,\n    random,\n    rotate,\n    spiral,\n    words,\n  ]);\n\n  return cloudWords;\n}\n"
  },
  {
    "path": "packages/visx-wordcloud/test/Wordcloud.test.tsx",
    "content": "import { vi } from 'vitest';\nimport { render } from '@testing-library/react';\nimport React from 'react';\nimport { Wordcloud } from '../src';\nimport type { WordcloudConfig } from '../src/types';\n\nconst mocked3Cloud = {\n  size: vi.fn(),\n  words: vi.fn(),\n  random: vi.fn(),\n  font: vi.fn(),\n  padding: vi.fn(),\n  fontSize: vi.fn(),\n  fontStyle: vi.fn(),\n  fontWeight: vi.fn(),\n  rotate: vi.fn(),\n  spiral: vi.fn(),\n  on: vi.fn(),\n  start: vi.fn(),\n  stop: vi.fn(),\n};\n\nvi.mock('d3-cloud', () => ({ default: () => mocked3Cloud }));\n\ndescribe('<Wordcloud />', () => {\n  afterEach(() => {\n    for (const mockFn of Object.values(mocked3Cloud)) {\n      mockFn.mockReset();\n    }\n  });\n  test('it returns early if width or height is zero', () => {\n    const childrenSpy = vi.fn();\n\n    const { rerender } = render(\n      <Wordcloud width={100} height={0} words={[{ text: 'bla', value: 1 }]}>\n        {childrenSpy}\n      </Wordcloud>,\n    );\n\n    expect(childrenSpy).not.toHaveBeenCalled();\n\n    rerender(\n      <Wordcloud width={0} height={200} words={[{ text: 'bla', value: 1 }]}>\n        {childrenSpy}\n      </Wordcloud>,\n    );\n    expect(childrenSpy).not.toHaveBeenCalled();\n  });\n\n  test('it passes d3 cloud words to the children render function', () => {\n    const mockWord = { text: 'myMockedWord' };\n    mocked3Cloud.on.mockImplementation(\n      (_: unknown, setWords: (words: { text: string }[]) => void) => setWords([mockWord]),\n    );\n    const childrenSpy = vi.fn();\n\n    render(\n      <Wordcloud width={100} height={100} words={[{ text: 'bla', value: 1 }]}>\n        {childrenSpy}\n      </Wordcloud>,\n    );\n\n    expect(childrenSpy).toHaveBeenLastCalledWith([mockWord]);\n  });\n\n  test('it sets the config on the d3 cloud', () => {\n    const wordcloudConfig: WordcloudConfig<{ text: string }> = {\n      font: 'Impact',\n      fontSize: 14,\n      fontStyle: 'normal',\n      fontWeight: 'bold',\n      height: 200,\n      width: 300,\n      padding: 4,\n      random: () => 0.5,\n      rotate: 0,\n      spiral: 'archimedean',\n      words: [{ text: 'myMockedWord' }],\n    };\n\n    render(<Wordcloud {...wordcloudConfig}>{vi.fn()}</Wordcloud>);\n\n    expect(mocked3Cloud.size).toHaveBeenCalledWith([wordcloudConfig.width, wordcloudConfig.height]);\n    expect(mocked3Cloud.font).toHaveBeenCalledWith(wordcloudConfig.font);\n    expect(mocked3Cloud.fontSize).toHaveBeenCalledWith(wordcloudConfig.fontSize);\n    expect(mocked3Cloud.fontStyle).toHaveBeenCalledWith(wordcloudConfig.fontStyle);\n    expect(mocked3Cloud.fontWeight).toHaveBeenCalledWith(wordcloudConfig.fontWeight);\n    expect(mocked3Cloud.padding).toHaveBeenCalledWith(wordcloudConfig.padding);\n    expect(mocked3Cloud.random).toHaveBeenCalledWith(wordcloudConfig.random);\n    expect(mocked3Cloud.rotate).toHaveBeenCalledWith(wordcloudConfig.rotate);\n    expect(mocked3Cloud.spiral).toHaveBeenCalledWith(wordcloudConfig.spiral);\n    expect(mocked3Cloud.words).toHaveBeenCalledWith(wordcloudConfig.words);\n  });\n});\n"
  },
  {
    "path": "packages/visx-wordcloud/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-wordcloud/test/useWordcloud.test.ts",
    "content": "import { useWordcloud } from '../src';\n\ndescribe('useWordcloud', () => {\n  test('it should be defined', () => {\n    expect(useWordcloud).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-wordcloud/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-group\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-wordcloud/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/wordcloud',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-wordcloud/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/wordcloud': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-xychart/README.md",
    "content": "# @visx/xychart\n\n<a title=\"@visx/xychart npm downloads\" href=\"https://www.npmjs.com/package/@visx/xychart\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/xychart.svg?style=flat-square\" />\n</a>\n\nIn contrast to other `visx` packages which are low-level, this package seeks to abstract some of the\ncomplexity of common visualization engineering, and exposes a **high-level** x,y (cartesian\ncoordinate) chart API. However, it is implemented using modularized `React.context` layers for\ntheme, canvas dimensions, x/y/color scales, data, events, and tooltips which allows for more\nexpressivity and advanced use cases.\n\nOut of the box it supports the following:\n\n- \\* many common `<*Series />` types (animated or not) such as lines, bars, etc.\n- \\* `<Axis />` (animated or not)\n- \\* `<Grid />` (animated or not)\n- \\* `<Annotation />` (animated or not)\n- \\* `<Tooltip />`\n- \\* `theme`ing\n\nThe following illustrates basic usage to create an animated line chart with a bottom `Axis`, `Grid`,\nand `Tooltip`:\n\n```tsx\nimport {\n  AnimatedAxis, // any of these can be non-animated equivalents\n  AnimatedGrid,\n  AnimatedLineSeries,\n  XYChart,\n  Tooltip,\n} from '@visx/xychart';\n\nconst data1 = [\n  { x: '2020-01-01', y: 50 },\n  { x: '2020-01-02', y: 10 },\n  { x: '2020-01-03', y: 20 },\n];\n\nconst data2 = [\n  { x: '2020-01-01', y: 30 },\n  { x: '2020-01-02', y: 40 },\n  { x: '2020-01-03', y: 80 },\n];\n\nconst accessors = {\n  xAccessor: (d) => d.x,\n  yAccessor: (d) => d.y,\n};\n\nconst render = () => (\n  <XYChart height={300} xScale={{ type: 'band' }} yScale={{ type: 'linear' }}>\n    <AnimatedAxis orientation=\"bottom\" />\n    <AnimatedGrid columns={false} numTicks={4} />\n    <AnimatedLineSeries dataKey=\"Line 1\" data={data1} {...accessors} />\n    <AnimatedLineSeries dataKey=\"Line 2\" data={data2} {...accessors} />\n    <Tooltip\n      snapTooltipToDatumX\n      snapTooltipToDatumY\n      showVerticalCrosshair\n      showSeriesGlyphs\n      renderTooltip={({ tooltipData, colorScale }) => (\n        <div>\n          <div style={{ color: colorScale(tooltipData.nearestDatum.key) }}>\n            {tooltipData.nearestDatum.key}\n          </div>\n          {accessors.xAccessor(tooltipData.nearestDatum.datum)}\n          {', '}\n          {accessors.yAccessor(tooltipData.nearestDatum.datum)}\n        </div>\n      )}\n    />\n  </XYChart>\n);\n```\n\nSee sections below for more detailed guidance and advanced usage, or explore the comprehensive API\nbelow.\n\n<hr />\n\n## Basic usage\n\n<details>\n  <summary>Installation</summary>\n\n```\nnpm install --save @visx/xychart react-spring\n```\n\nNote: `react-spring` is a required `peerDependency` for importing `Animated*` components.\n\n</details>\n\n<details>\n  <summary>Series types</summary>\n\nThe following `Series` types are currently supported and we are happy to review or consider\nadditional Series types in the future.\n\n| Component name        | Description                                                                                      | Usage                                                |\n| --------------------- | ------------------------------------------------------------------------------------------------ | ---------------------------------------------------- | --- |\n| (Animated)AreaSeries  | Connect data points with a `<path />`, with a color fill to the zero baseline                    | `<AreaSeries />`                                     |\n| (Animated)BarSeries   | Render a `<rect />` for each data point                                                          | `<BarSeries />`                                      |\n| (Animated)BarGroup    | Group multiple child `<BarSeries />` values together                                             | `<BarGroup><BarSeries /><BarSeries />...</BarGroup>` |\n| (Animated)BarStack    | Stack multiple child `<BarSeries />` values together                                             | `<BarStack><BarSeries /><BarSeries />...</BarStack>` |     |\n| (Animated)GlyphSeries | Render a `Glyph` (any shape, defaults to `<circle />`) for each data point, e.g., a scatter plot | `<GlyphSeries renderGlyph={() => ...} />`            |\n| (Animated)LineSeries  | Connect data points with a `<path>`                                                              | `<GlyphSeries />`                                    |\n\nAll `Series` have animated and non-animated variants to give you more control over your bundle size,\nsupport missing (`null`) data, and can be rendered vertically or horizontally.\n\n</details>\n\n<details>\n  <summary>Theming</summary>\n\nDefault `lightTheme` and `darkTheme` themes are exported from `@visx/xychart` and the utility\n`buildChartTheme` is exported to support easy creation of custom themes.\n\n```ts\nimport { buildChartTheme, XYChart } from '@visx/xychart';\nimport { TextProps as SVGTextProps } from '@visx/text/lib/Text'; // just for types\n\nconst customTheme = buildChartTheme({\n  // colors\n  backgroundColor: string, // used by Tooltip, Annotation\n  colors: string[], // categorical colors, mapped to series via `dataKey`s\n\n  // labels\n  svgLabelBig?: SVGTextProps,\n  svgLabelSmall?: SVGTextProps,\n  htmlLabel?: HTMLTextStyles,\n\n  // lines\n  xAxisLineStyles?: LineStyles,\n  yAxisLineStyles?: LineStyles,\n  xTickLineStyles?: LineStyles,\n  yTickLineStyles?: LineStyles,\n  tickLength: number,\n\n  // grid\n  gridColor: string,\n  gridColorDark: string, // used for axis baseline if x/yxAxisLineStyles not set\n  gridStyles?: CSSProperties,\n});\n\n() => <XYChart theme={customTheme} />\n```\n\n</details>\n\n<details>\n  <summary>Tooltips</summary>\n\n`@visx/tooltip` `Tooltip`s are integrated into `@visx/xychart`, and should be rendered as a child of\n`XYChart` (or a child where `TooltipContext` is provided).\n\n**`Tooltip` positioning** is handled by the `Tooltip` itself, based on `TooltipContext`. `Tooltip`\nis rendered inside a `Portal`, avoiding clipping by parent DOM elements with higher z-index\ncontexts. See the API below for a full list of `props` to support additional behavior, such as\nsnapping to data point positions and rendering cross-hairs.\n\n**`Tooltip` content** is controlled by the specified `prop.renderTooltip` which has access to:\n\n- `tooltipData.nearestDatum` – the globally closest `Datum`, **across all** `Series`'s `dataKey`s\n- `tooltipData.datumByKey` – the closest `Datum` **for each** `Series`'s `dataKey`; this enables\n  \"shared tooltips\" where you can render the nearest data point for each `Series`.\n- a shared `colorScale` which maps `Series`'s `dataKey`s to `theme` colors\n\n</details>\n\n<details>\n  <summary>Event handlers</summary>\n\nThe following `PointerEvent`s (handling both `MouseEvent`s and `TouchEvent`s) are currently\nsupported. They may be set on individual `Series` components (e.g.,\n`<BarSeries onPointerMove={() => ...} />`), or at the chart level (e.g.,\n`<XYChart onPointerMove={() => {}} />`) in which case they are invoked once for _every_ `*Series`.\nTo **disable** event emitting for any `Series` set `<*Series enableEvents=false />`. The\n`onFocus/onBlur` handlers enable you to make your chart events and `Tooltip`s accessible via\nkeyboard interaction. Note that the current implementation requires your target browser to support\nthe `SVG 2.0` spec for `tabIndex` on `SVG` elements.\n\nBelow, `HandlerParms` has the following type signature:\n\n```ts\ntype EventHandlerParams<Datum> = {\n  datum: Datum; // nearest Datum to event, for Series with `dataKey=key`\n  distanceX: number; // x distance between event and Datum, in px\n  distanceY;: number; // y distance between event and Datum, in px\n  event: React.PointerEvent | React.FocusEvent; // the event\n  index: number; // index of Datum in Series `data` array\n  key: string; // `dataKey` of Series to which `Datum` belongs\n  svgPoint: { x: number; y: number }; // event position in svg-coordinates\n};\n```\n\n| Prop name       | Signature                                     | `XYChart` support | `*Series` support |\n| --------------- | --------------------------------------------- | ----------------- | ----------------- |\n| `onPointerMove` | `(params: EventHandlerParams<Datum>) => void` | ✅                | ✅                |\n| `onPointerOut`  | `(event: React.PointerEvent) => void`         | ✅                | ✅                |\n| `onPointerUp`   | `(params: EventHandlerParams<Datum>) => void` | ✅                | ✅                |\n| `onPointerDown` | `(params: EventHandlerParams<Datum>) => void` | ✅                | ✅                |\n| `onFocus`       | `(params: EventHandlerParams<Datum>) => void` | ❌                | ✅                |\n| `onBlur`        | `(event: React.TouchEvent) => void`           | ❌                | ✅                |\n\n</details>\n\n<details>\n  <summary>Annotations</summary>\n\nComposable `@visx/annotations` annotations are integrated into `@visx/xychart` and use its theme and\ndimension context. These components allow for annotation of individual points using\n`AnnotationCircleSubject`, or x- or y-thresholds using `AnnotationLineSubject`.\n\n[CodeSandbox](https://codesandbox.io/s/annotations-8npmf?file=/Example.tsx)\n\n```tsx\nimport React from 'react';\nimport {\n  Annotation,\n  AnnotationLabel,\n  AnnotationConnector,\n  AnnotationCircleSubject,\n  Grid,\n  LineSeries,\n  XYChart,\n} from '@visx/xychart';\n\nconst data = [\n  { x: '2020-01-01', y: 50 },\n  { x: '2020-01-02', y: 10 },\n  { x: '2020-01-03', y: 20 },\n  { x: '2020-01-04', y: 5 },\n];\n\nconst labelXOffset = -40;\nconst labelYOffset = -50;\nconst chartConfig = {\n  xScale: { type: 'band' },\n  yScale: { type: 'linear' },\n  height: 300,\n  margin: { top: 10, right: 10, bottom: 10, left: 10 },\n};\n\nexport default () => (\n  <XYChart {...chartConfig}>\n    <Grid numTicks={3} />\n    <LineSeries dataKey=\"line\" data={data} xAccessor={d => d.x} yAccessor={d => d.y} />\n    <Annotation\n      dataKey=\"line\" // use this Series's accessor functions, alternatively specify x/yAccessor here\n      datum={data[2]}\n      dx={labelXOffset}\n      dy={labelYOffset}\n    >\n      {/** Text label */}\n      <AnnotationLabel\n        title=\"Title\"\n        subtitle=\"Subtitle deets\"\n        showAnchorLine={false}\n        backgroundFill=\"rgba(0,150,150,0.1)\"\n      />\n      {/** Draw circle around point */}\n      <AnnotationCircleSubject />\n      {/** Connect label to CircleSubject */}\n      <AnnotationConnector />\n    </AnimatedAnnotation>\n  </XYChart>\n);\n```\n\n</details>\n\n<hr />\n\n##### ⚠️ `ResizeObserver` dependency\n\nResponsive `XYChart`s, `Tooltip`, and `AnnotationLabel` components rely on\n[`ResizeObserver`](https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver)s. If your\nbrowser target needs a polyfill, you can either pollute the `window` object or inject it cleanly\nusing the `resizeObserverPolyfill` prop for these components. A polyfill passed to `XYChart` will be\naccessible to child `Tooltip` and `AnnotationLabel` components.\n\n<details>\n  <summary>Examples ✅ ❌</summary>\n\n❌ `Error: This browser does not support ResizeObserver out of the box`\n\n```tsx\n// no polyfill, no browser support\n() => <XYChart {...} />\n() => <XYChart {...}><Tooltip /></XYChart>\n\n```\n\n✅ No errors\n\n```tsx\n// no polyfill, target browser supports ResizeObserver\n() => <XYChart {...} />\n() => <XYChart {...}><Tooltip /></XYChart>\n\n// import the polyfill in the needed module, or set it on `window` object\nimport ResizeObserver from 'resize-observer-polyfill';\n() => <XYChart {...}><Tooltip /></XYChart> // 😎\n\n// cleanly pass polyfill to component that needs it\nimport ResizeObserver from 'resize-observer-polyfill';\n() => (\n  <XYChart resizeObserverPolyfill={ResizeObserver} {...}>\n    <Tooltip />\n  </XYChart>\n)\n```\n\n  </details>\n\n<hr />\n\n## Advanced usage\n\n<details>\n  <summary>Examples</summary>\n\n`XYChart` is implemented using modularized `React.context` layers for scales, canvas dimensions,\ndata, events, and tooltips which enables more advanced usage than many other chart-level\nabstractions.\n\nBy default `XYChart` renders all context providers if a given context is not available, but you can\nshare context across multiple `XYChart`s to implement functionality such as linked tooltips, shared\nthemes, or shared data.\n\n- [`ThemeProvider` + custom theme chart background example](https://codesandbox.io/s/themeprovider-sbdvz?file=/Example.tsx)\n- [`DataProvider/EventEmitterProvider` example of linked tooltips / small multiples](https://codesandbox.io/s/linked-tooltips-7s0jz?file=/Example.tsx)\n- [`TooltipProvider` example of programmatic + keyboard tooltip triggering](https://codesandbox.io/s/programmatic-tooltips-hh7ly?file=/Example.tsx)\n\n</details>\n\n<details>\n  <summary>DataContext</summary>\n\nThis context provides chart canvas dimensions (`width`, `height`, and `margin`), x/y/color scales,\nand a data registry. The data registry includes data from all child `*Series`, and x/y/color scales\nare updated accordingly accounting for canvas dimensions.\n\n</details>\n\n<details>\n  <summary>ThemeContext</summary>\n\nThis context provides an `XYChart` theme, its used by all visual elements that compose a chart, and\ncan be used to render custom visual elements that are on theme.\n\n</details>\n\n<details>\n  <summary>EventEmitterContext</summary>\n\nThis context provides an event publishing / subscription object which can be used via the\n`useEventEmitter` hook. `Series` and `XYChart` events, including tooltip updates, are emitted and\nhandled with through this context.\n\n[CodeSandbox](https://codesandbox.io/s/eventemitterprovider-w8jhl?file=/Example.tsx)\n\n```tsx\nimport React, { useState } from 'react';\nimport { useEventEmitter, EventEmitterProvider } from '@visx/xychart';\n\nconst eventSourceId = 'optional-source-id-filter';\n\nconst EmitEvent = () => {\n  const emit = useEventEmitter();\n  return (\n    <button onPointerUp={(event) => emit('pointerup', event, eventSourceId)}>emit event</button>\n  );\n};\n\nconst SubscribeToEvent = () => {\n  const [clickCount, setClickCount] = useState(0);\n  const allowedEventSources = [eventSourceId];\n  useEventEmitter('pointerup', () => setClickCount(clickCount + 1), allowedEventSources);\n\n  return <div>Emitted {clickCount} events</div>;\n};\n\nexport default function Example() {\n  return (\n    <EventEmitterProvider>\n      <EmitEvent />\n      <SubscribeToEvent />\n    </EventEmitterProvider>\n  );\n}\n```\n\n</details>\n\n<details>\n  <summary>TooltipContext</summary>\n\nThis context provides access to `@visx/tooltip`s `useTooltip` state, including whether the tooltip\nis visible (`tooltipOpen`), tooltlip position (`tooltipLeft`, `tooltipTop`),\n`tooltipData: { nearestDatum, datumByKey }` described above, and functions to update context\n(`hideTooltip`, `showTooltip`, and `updateTooltip`).\n\n</details>\n\n<hr />\n"
  },
  {
    "path": "packages/visx-xychart/package.json",
    "content": "{\n  \"name\": \"@visx/xychart\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"Composable cartesian coordinate chart built with visx primitives\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"contributors\": [\n    {\n      \"name\": \"Chris Williams\",\n      \"url\": \"https://github.com/williaster\"\n    }\n  ],\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"@react-spring/web\": \"^9.7.5 || ^10.0.0\",\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/lodash\": \"^4.17.13\",\n    \"@types/react\": \"*\",\n    \"@visx/annotation\": \"workspace:*\",\n    \"@visx/axis\": \"workspace:*\",\n    \"@visx/event\": \"workspace:*\",\n    \"@visx/glyph\": \"workspace:*\",\n    \"@visx/grid\": \"workspace:*\",\n    \"@visx/react-spring\": \"workspace:*\",\n    \"@visx/responsive\": \"workspace:*\",\n    \"@visx/scale\": \"workspace:*\",\n    \"@visx/shape\": \"workspace:*\",\n    \"@visx/text\": \"workspace:*\",\n    \"@visx/tooltip\": \"workspace:*\",\n    \"@visx/vendor\": \"workspace:*\",\n    \"@visx/voronoi\": \"workspace:*\",\n    \"classnames\": \"^2.3.1\",\n    \"d3-interpolate-path\": \"2.2.1\",\n    \"lodash\": \"^4.17.21\",\n    \"mitt\": \"^2.1.0\"\n  },\n  \"devDependencies\": {\n    \"@juggle/resize-observer\": \"^3.3.1\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/classes/DataRegistry.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { DataRegistryEntry } from '../types/data';\n\n/** A class for holding data entries */\nexport default class DataRegistry<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> {\n  private registry: { [key: string]: DataRegistryEntry<XScale, YScale, Datum> } = {};\n\n  private registryKeys: string[] = [];\n\n  /** Add one or more entries to the registry. */\n  public registerData(\n    entryOrEntries:\n      | DataRegistryEntry<XScale, YScale, Datum>\n      | DataRegistryEntry<XScale, YScale, Datum>[],\n  ) {\n    const entries = Array.isArray(entryOrEntries) ? entryOrEntries : [entryOrEntries];\n    entries.forEach((currEntry) => {\n      this.registry[currEntry.key] = currEntry;\n      this.registryKeys = Object.keys(this.registry);\n    });\n  }\n\n  /** Remove one or more entries to the registry. */\n  public unregisterData(keyOrKeys: string | string[]) {\n    const keys = Array.isArray(keyOrKeys) ? keyOrKeys : [keyOrKeys];\n    keys.forEach((currKey) => {\n      delete this.registry[currKey];\n      this.registryKeys = Object.keys(this.registry);\n    });\n  }\n\n  /** Returns all data registry entries. This value is not constant between calls. */\n  public entries() {\n    return Object.values(this.registry);\n  }\n\n  /** Returns a specific entity from the registry, if it exists. */\n  public get(key: string) {\n    return this.registry[key];\n  }\n\n  /**\n   * Returns the current registry keys.\n   * This value is constant between calls if the keys themselves have not changed.\n   */\n  public keys() {\n    return this.registryKeys;\n  }\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/Tooltip.tsx",
    "content": "import { useCallback, useContext, useEffect, useRef } from 'react';\nimport type { CSSProperties, SVGProps, ReactNode } from 'react';\nimport { useTooltipInPortal, defaultStyles } from '@visx/tooltip';\nimport type { TooltipProps as BaseTooltipProps, UseTooltipPortalOptions } from '@visx/tooltip';\nimport type { PickD3Scale } from '@visx/scale';\n\nimport TooltipContext from '../context/TooltipContext';\nimport DataContext from '../context/DataContext';\nimport getScaleBandwidth from '../utils/getScaleBandwidth';\nimport isValidNumber from '../typeguards/isValidNumber';\nimport type { GlyphProps as RenderGlyphProps, TooltipContextType } from '../types';\n\n/** fontSize + lineHeight from default styles break precise location of crosshair, etc. */\nconst TOOLTIP_NO_STYLE: CSSProperties = {\n  position: 'absolute',\n  pointerEvents: 'none',\n  fontSize: 0,\n  lineHeight: 0,\n};\n\nexport type RenderTooltipParams<Datum extends object> = TooltipContextType<Datum> & {\n  colorScale?: PickD3Scale<'ordinal', string, string>;\n};\n\nexport interface RenderTooltipGlyphProps<Datum extends object> extends RenderGlyphProps<Datum> {\n  glyphStyle?: SVGProps<SVGCircleElement>;\n  isNearestDatum: boolean;\n}\n\nexport type TooltipProps<Datum extends object> = {\n  /**\n   * When TooltipContext.tooltipOpen=true, this function is invoked and if the\n   * return value is non-null, its content is rendered inside the tooltip container.\n   * Content will be rendered in an HTML parent.\n   */\n  renderTooltip: (params: RenderTooltipParams<Datum>) => ReactNode;\n  /** Function which handles rendering glyphs. */\n  renderGlyph?: (params: RenderTooltipGlyphProps<Datum>) => ReactNode;\n  /** Whether to snap tooltip + crosshair x-coord to the nearest Datum x-coord instead of the event x-coord. */\n  snapTooltipToDatumX?: boolean;\n  /** Whether to snap tooltip + crosshair y-coord to the nearest Datum y-coord instead of the event y-coord. */\n  snapTooltipToDatumY?: boolean;\n  /** Whether to show a vertical line at tooltip position. */\n  showVerticalCrosshair?: boolean;\n  /** Whether to show a horizontal line at tooltip position. */\n  showHorizontalCrosshair?: boolean;\n  /** Whether to show a glyph at the tooltip position for the (single) nearest Datum. */\n  showDatumGlyph?: boolean;\n  /** Whether to show a glyph for the nearest Datum in each series. */\n  showSeriesGlyphs?: boolean;\n  /** Optional styles for the vertical crosshair, if visible. */\n  verticalCrosshairStyle?: SVGProps<SVGLineElement>;\n  /** Optional styles for the vertical crosshair, if visible. */\n  horizontalCrosshairStyle?: SVGProps<SVGLineElement>;\n  /** Optional styles for the point, if visible. */\n  glyphStyle?: SVGProps<SVGCircleElement>;\n  /**\n   * Tooltip depends on ResizeObserver, which may be polyfilled globally,\n   * passed to XYChart, or injected into this component.\n   */\n  resizeObserverPolyfill?: UseTooltipPortalOptions['polyfill'];\n} & Omit<BaseTooltipProps, 'left' | 'top' | 'children'> &\n  Pick<UseTooltipPortalOptions, 'debounce' | 'detectBounds' | 'scroll' | 'zIndex'>;\n\nconst INVISIBLE_STYLES: CSSProperties = {\n  position: 'absolute',\n  left: 0,\n  top: 0,\n  opacity: 0,\n  width: 0,\n  height: 0,\n  pointerEvents: 'none',\n};\n\nfunction DefaultGlyph<Datum extends object>({\n  x,\n  y,\n  size,\n  color,\n  glyphStyle,\n}: Omit<RenderTooltipGlyphProps<Datum>, 'key'>) {\n  const { theme } = useContext(DataContext) || {};\n\n  return (\n    <circle\n      cx={x}\n      cy={y}\n      r={size}\n      fill={color}\n      stroke={theme?.backgroundColor}\n      strokeWidth={1.5}\n      paintOrder=\"fill\"\n      {...glyphStyle}\n    />\n  );\n}\n\nfunction defaultRenderGlyph<Datum extends object>({\n  key,\n  ...props\n}: RenderTooltipGlyphProps<Datum>) {\n  return <DefaultGlyph {...props} />;\n}\n\nfunction TooltipInner<Datum extends object>({\n  debounce,\n  detectBounds,\n  horizontalCrosshairStyle,\n  glyphStyle,\n  renderTooltip,\n  renderGlyph = defaultRenderGlyph,\n  resizeObserverPolyfill: resizeObserverPolyfillProp,\n  scroll = true,\n  showDatumGlyph = false,\n  showHorizontalCrosshair = false,\n  showSeriesGlyphs = false,\n  showVerticalCrosshair = false,\n  snapTooltipToDatumX = false,\n  snapTooltipToDatumY = false,\n  verticalCrosshairStyle,\n  zIndex,\n  ...tooltipProps\n}: TooltipProps<Datum>) {\n  const {\n    colorScale,\n    theme,\n    innerHeight,\n    innerWidth,\n    margin,\n    xScale,\n    yScale,\n    dataRegistry,\n    resizeObserverPolyfill,\n  } = useContext(DataContext) || {};\n  const tooltipContext = useContext(TooltipContext) as TooltipContextType<Datum>;\n  const { containerRef, TooltipInPortal, forceRefreshBounds } = useTooltipInPortal({\n    debounce,\n    detectBounds,\n    polyfill: resizeObserverPolyfill || resizeObserverPolyfillProp,\n    scroll,\n    zIndex,\n  });\n\n  // To correctly position itself in a Portal, the tooltip must know its container bounds\n  // this is done by rendering an invisible node whose ref can be used to find its parentElement\n  const setContainerRef = useCallback(\n    (ownRef: HTMLElement | SVGElement | null) => {\n      containerRef(ownRef?.parentElement ?? null);\n    },\n    [containerRef],\n  );\n\n  const tooltipContent = tooltipContext?.tooltipOpen\n    ? renderTooltip({ ...tooltipContext, colorScale })\n    : null;\n\n  const showTooltip = tooltipContext?.tooltipOpen && tooltipContent != null;\n\n  // useTooltipInPortal is powered by react-use-measure and will update portal positions upon\n  // resize and page scroll. however it **cannot** detect when a chart container moves on a\n  // page due to animation or drag-and-drop, etc.\n  // therefore we force refresh the bounds any time we transition from a hidden tooltip to\n  // one that is visible.\n  const lastShowTooltip = useRef(false);\n  useEffect(() => {\n    if (showTooltip && !lastShowTooltip.current) {\n      forceRefreshBounds();\n    }\n    lastShowTooltip.current = showTooltip;\n  }, [showTooltip, forceRefreshBounds]);\n\n  let tooltipLeft = tooltipContext?.tooltipLeft;\n  let tooltipTop = tooltipContext?.tooltipTop;\n\n  const xScaleBandwidth = xScale ? getScaleBandwidth(xScale) : 0;\n  const yScaleBandwidth = yScale ? getScaleBandwidth(yScale) : 0;\n\n  const getDatumLeftTop = useCallback(\n    (key: string, datum: Datum) => {\n      const entry = dataRegistry?.get(key);\n      const xAccessor = entry?.xAccessor;\n      const yAccessor = entry?.yAccessor;\n      const left =\n        xScale && xAccessor ? Number(xScale(xAccessor(datum))) + xScaleBandwidth / 2 : undefined;\n      const top =\n        yScale && yAccessor ? Number(yScale(yAccessor(datum))) + yScaleBandwidth / 2 : undefined;\n      return { left, top };\n    },\n    [dataRegistry, xScaleBandwidth, yScaleBandwidth, xScale, yScale],\n  );\n\n  const nearestDatum = tooltipContext?.tooltipData?.nearestDatum;\n  const nearestDatumKey = nearestDatum?.key ?? '';\n\n  // snap x- or y-coord to the actual data point (not event coordinates)\n  if (showTooltip && nearestDatum && (snapTooltipToDatumX || snapTooltipToDatumY)) {\n    const { left, top } = getDatumLeftTop(nearestDatumKey, nearestDatum.datum);\n    tooltipLeft = snapTooltipToDatumX && isValidNumber(left) ? left : tooltipLeft;\n    tooltipTop = snapTooltipToDatumY && isValidNumber(top) ? top : tooltipTop;\n  }\n\n  // collect positions + styles for glyphs; glyphs always snap to Datum, not event coords\n  const glyphProps: RenderTooltipGlyphProps<Datum>[] = [];\n\n  if (showTooltip && (showDatumGlyph || showSeriesGlyphs)) {\n    const size = Number(glyphStyle?.radius ?? 4);\n\n    if (showSeriesGlyphs) {\n      Object.values(tooltipContext?.tooltipData?.datumByKey ?? {}).forEach(\n        ({ key, datum, index }) => {\n          const color = colorScale?.(key) ?? theme?.htmlLabel?.color ?? '#222';\n          const { left, top } = getDatumLeftTop(key, datum);\n\n          // don't show glyphs if coords are unavailable\n          if (!isValidNumber(left) || !isValidNumber(top)) return;\n\n          glyphProps.push({\n            key,\n            color,\n            datum,\n            index,\n            size,\n            x: left,\n            y: top,\n            glyphStyle,\n            isNearestDatum: nearestDatum ? nearestDatum.key === key : false,\n          });\n        },\n      );\n    } else if (nearestDatum) {\n      const { left, top } = getDatumLeftTop(nearestDatumKey, nearestDatum.datum);\n      // don't show glyphs if coords are unavailable\n      if (isValidNumber(left) && isValidNumber(top)) {\n        const color =\n          (nearestDatumKey && colorScale?.(nearestDatumKey)) ??\n          // @ts-expect-error\n          null ??\n          theme?.gridStyles?.stroke ??\n          theme?.htmlLabel?.color ??\n          '#222';\n        glyphProps.push({\n          key: nearestDatumKey,\n          color,\n          datum: nearestDatum.datum,\n          index: nearestDatum.index,\n          size,\n          x: left,\n          y: top,\n          glyphStyle,\n          isNearestDatum: true,\n        });\n      }\n    }\n  }\n\n  return (\n    // Tooltip can be rendered as a child of SVG or HTML since its output is rendered in a Portal.\n    // So use svg element to find container ref because it's a valid child of SVG and HTML parents.\n    <>\n      <svg ref={setContainerRef} style={INVISIBLE_STYLES} />\n      {showTooltip && (\n        <>\n          {/** To correctly position crosshair / glyphs in a Portal, we leverage the logic in TooltipInPortal */}\n          {showVerticalCrosshair && (\n            <TooltipInPortal\n              className=\"visx-crosshair visx-crosshair-vertical\"\n              left={tooltipLeft}\n              top={margin?.top}\n              offsetLeft={0}\n              offsetTop={0}\n              detectBounds={false}\n              style={TOOLTIP_NO_STYLE}\n            >\n              <svg width=\"1\" height={innerHeight} overflow=\"visible\">\n                <line\n                  x1={0}\n                  x2={0}\n                  y1={0}\n                  y2={innerHeight}\n                  strokeWidth={1.5}\n                  stroke={theme?.gridStyles?.stroke ?? theme?.htmlLabel?.color ?? '#222'}\n                  {...verticalCrosshairStyle}\n                />\n              </svg>\n            </TooltipInPortal>\n          )}\n          {showHorizontalCrosshair && (\n            <TooltipInPortal\n              className=\"visx-crosshair visx-crosshair-horizontal\"\n              left={margin?.left}\n              top={tooltipTop}\n              offsetLeft={0}\n              offsetTop={0}\n              detectBounds={false}\n              style={TOOLTIP_NO_STYLE}\n            >\n              <svg width={innerWidth} height=\"1\" overflow=\"visible\">\n                <line\n                  x1={0}\n                  x2={innerWidth}\n                  y1={0}\n                  y2={0}\n                  strokeWidth={1.5}\n                  stroke={theme?.gridStyles?.stroke ?? theme?.htmlLabel?.color ?? '#222'}\n                  {...horizontalCrosshairStyle}\n                />\n              </svg>\n            </TooltipInPortal>\n          )}\n          {glyphProps.map(({ key, x, y, ...props }) => (\n            // We render glyps in a portal so that they can overflow the container if necessary\n            <TooltipInPortal\n              key={key}\n              className=\"visx-tooltip-glyph\"\n              left={x}\n              top={y}\n              offsetLeft={0}\n              offsetTop={0}\n              detectBounds={false}\n              style={TOOLTIP_NO_STYLE}\n            >\n              <svg overflow=\"visible\">{renderGlyph({ key, x: 0, y: 0, ...props })}</svg>\n            </TooltipInPortal>\n          ))}\n          <TooltipInPortal\n            left={tooltipLeft}\n            top={tooltipTop}\n            style={{\n              ...defaultStyles,\n              background: theme?.backgroundColor ?? 'white',\n              boxShadow: `0 1px 2px \n                ${theme?.htmlLabel?.color ? `${theme?.htmlLabel?.color}55` : '#22222255'}`,\n              ...theme?.htmlLabel,\n            }}\n            {...tooltipProps}\n          >\n            {tooltipContent}\n          </TooltipInPortal>\n        </>\n      )}\n    </>\n  );\n}\n\n/**\n * This is a wrapper component which bails early if tooltip is not visible.\n * If scroll detection is enabled in UseTooltipPortalOptions, this avoids re-rendering\n * the component on every scroll. If many charts with Tooltips are rendered on a page,\n * this also avoids creating many resize observers / hitting browser limits.\n */\nexport default function Tooltip<Datum extends object>(props: TooltipProps<Datum>) {\n  const tooltipContext = useContext(TooltipContext) as TooltipContextType<Datum>;\n\n  if (!tooltipContext?.tooltipOpen) return null;\n\n  return <TooltipInner {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/XYChart.tsx",
    "content": "/* eslint jsx-a11y/mouse-events-have-key-events: 'off', @typescript-eslint/no-explicit-any: 'off' */\nimport { useContext, useEffect } from 'react';\nimport type { ReactNode, PointerEvent } from 'react';\nimport { ParentSize } from '@visx/responsive';\nimport type { ResizeObserverPolyfill } from '@visx/responsive';\nimport type { AxisScaleOutput } from '@visx/axis';\nimport type { ScaleConfig } from '@visx/scale';\n\nimport DataContext from '../context/DataContext';\nimport type { Margin, EventHandlerParams } from '../types';\nimport useEventEmitter from '../hooks/useEventEmitter';\nimport EventEmitterProvider from '../providers/EventEmitterProvider';\nimport TooltipContext from '../context/TooltipContext';\nimport TooltipProvider from '../providers/TooltipProvider';\nimport type { DataProviderProps } from '../providers/DataProvider';\nimport DataProvider from '../providers/DataProvider';\nimport useEventEmitters from '../hooks/useEventEmitters';\nimport { XYCHART_EVENT_SOURCE } from '../constants';\nimport useEventHandlers, {\n  POINTER_EVENTS_ALL,\n  POINTER_EVENTS_NEAREST,\n} from '../hooks/useEventHandlers';\n\nconst DEFAULT_MARGIN = { top: 50, right: 50, bottom: 50, left: 50 };\n\nexport type XYChartProps<\n  XScaleConfig extends ScaleConfig<AxisScaleOutput, any, any>,\n  YScaleConfig extends ScaleConfig<AxisScaleOutput, any, any>,\n  Datum extends object,\n> = {\n  /** aria-label for the chart svg element. */\n  accessibilityLabel?: string;\n  /** Whether to capture and dispatch pointer events to EventEmitter context (which e.g., Series subscribe to). */\n  captureEvents?: boolean;\n  /** Total width of the desired chart svg, including margin. */\n  width?: number;\n  /** Total height of the desired chart svg, including margin. */\n  height?: number;\n  /** Margin to apply around the outside. */\n  margin?: Margin;\n  /** XYChart children (Series, Tooltip, etc.). */\n  children: ReactNode;\n  /** If DataContext is not available, XYChart will wrap itself in a DataProvider and set this as the theme. */\n  theme?: DataProviderProps<XScaleConfig, YScaleConfig>['theme'];\n  /** If DataContext is not available, XYChart will wrap itself in a DataProvider and set this as the xScale config. */\n  xScale?: DataProviderProps<XScaleConfig, YScaleConfig>['xScale'];\n  /** If DataContext is not available, XYChart will wrap itself in a DataProvider and set this as the yScale config. */\n  yScale?: DataProviderProps<XScaleConfig, YScaleConfig>['yScale'];\n  /* If DataContext is not available, XYChart will wrap itself in a DataProvider and set this as horizontal. Determines whether Series will be plotted horizontally (e.g., horizontal bars). By default this will try to be inferred based on scale types. */\n  horizontal?: boolean | 'auto';\n  /** Callback invoked for onPointerMove events for the nearest Datum to the PointerEvent _for each Series with pointerEvents={true}_. */\n  onPointerMove?: ({\n    datum,\n    distanceX,\n    distanceY,\n    event,\n    index,\n    key,\n    svgPoint,\n  }: EventHandlerParams<Datum>) => void;\n  /** Callback invoked for onPointerOut events for the nearest Datum to the PointerEvent _for each Series with pointerEvents={true}_. */\n  onPointerOut?: (\n    /** The PointerEvent. */\n    event: PointerEvent,\n  ) => void;\n  /** Callback invoked for onPointerUp events for the nearest Datum to the PointerEvent _for each Series with pointerEvents={true}_. */\n  onPointerUp?: ({\n    datum,\n    distanceX,\n    distanceY,\n    event,\n    index,\n    key,\n    svgPoint,\n  }: EventHandlerParams<Datum>) => void;\n  /** Callback invoked for onPointerDown events for the nearest Datum to the PointerEvent _for each Series with pointerEvents={true}_. */\n  onPointerDown?: ({\n    datum,\n    distanceX,\n    distanceY,\n    event,\n    index,\n    key,\n    svgPoint,\n  }: EventHandlerParams<Datum>) => void;\n\n  /** Whether to invoke PointerEvent handlers for all dataKeys, or the nearest dataKey. */\n  pointerEventsDataKey?: 'all' | 'nearest';\n  /**\n   * Responsive charts, <Tooltip />, and <AnnotationLabel /> depend on ResizeObserver\n   * which may be polyfilled globally, passed to individual components or injected once\n   * into this component.\n   */\n  resizeObserverPolyfill?: ResizeObserverPolyfill;\n};\n\nconst allowedEventSources = [XYCHART_EVENT_SOURCE];\n\nexport default function XYChart<\n  XScaleConfig extends ScaleConfig<AxisScaleOutput, any, any>,\n  YScaleConfig extends ScaleConfig<AxisScaleOutput, any, any>,\n  Datum extends object,\n>(props: XYChartProps<XScaleConfig, YScaleConfig, Datum>) {\n  const {\n    accessibilityLabel = 'XYChart',\n    captureEvents = true,\n    children,\n    height,\n    horizontal,\n    margin = DEFAULT_MARGIN,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    pointerEventsDataKey = 'nearest',\n    theme,\n    width,\n    xScale,\n    yScale,\n    // pass prop to context so it can be used anywhere\n    resizeObserverPolyfill: resizeObserverPolyfillProp,\n  } = props;\n  const { setDimensions, resizeObserverPolyfill } = useContext(DataContext);\n  const tooltipContext = useContext(TooltipContext);\n  const emit = useEventEmitter();\n\n  // update dimensions in context\n  useEffect(() => {\n    if (setDimensions && width != null && height != null && width > 0 && height > 0) {\n      setDimensions({ width, height, margin });\n    }\n  }, [setDimensions, width, height, margin]);\n\n  const eventEmitters = useEventEmitters({ source: XYCHART_EVENT_SOURCE });\n  useEventHandlers({\n    dataKey: pointerEventsDataKey === 'nearest' ? POINTER_EVENTS_NEAREST : POINTER_EVENTS_ALL,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    allowedSources: allowedEventSources,\n  });\n\n  // if Context or dimensions are not available, wrap self in the needed providers\n  if (!setDimensions) {\n    if (!xScale || !yScale) {\n      console.warn(\n        '[@visx/xychart] XYChart: When no DataProvider is available in context, you must pass xScale & yScale config to XYChart.',\n      );\n      return null;\n    }\n    return (\n      <DataProvider\n        xScale={xScale}\n        yScale={yScale}\n        theme={theme}\n        initialDimensions={{ width, height, margin }}\n        horizontal={horizontal}\n        resizeObserverPolyfill={resizeObserverPolyfillProp}\n      >\n        <XYChart {...props} />\n      </DataProvider>\n    );\n  }\n  if (width == null || height == null) {\n    return (\n      <ParentSize resizeObserverPolyfill={resizeObserverPolyfill}>\n        {(dims) => (\n          <XYChart\n            {...props}\n            width={props.width == null ? dims.width : props.width}\n            height={props.height == null ? dims.height : props.height}\n          />\n        )}\n      </ParentSize>\n    );\n  }\n\n  if (tooltipContext == null) {\n    return (\n      <TooltipProvider>\n        <XYChart {...props} />\n      </TooltipProvider>\n    );\n  }\n\n  // EventEmitterProvider should be the last wrapper so we do not duplicate handlers\n  if (emit == null) {\n    return (\n      <EventEmitterProvider>\n        <XYChart {...props} />\n      </EventEmitterProvider>\n    );\n  }\n\n  if (width <= 0 || height <= 0) {\n    if (process.env.NODE_ENV === 'development') {\n      console.info('XYChart has a zero width or height, bailing', { width, height });\n    }\n    return null;\n  }\n\n  return (\n    <svg width={width} height={height} aria-label={accessibilityLabel}>\n      {children}\n      {captureEvents && (\n        <rect\n          x={margin.left}\n          y={margin.top}\n          width={width - margin.left - margin.right}\n          height={height - margin.top - margin.bottom}\n          fill=\"transparent\"\n          {...eventEmitters}\n        />\n      )}\n    </svg>\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/annotation/AnimatedAnnotation.tsx",
    "content": "import { useCallback, useEffect, useRef } from 'react';\nimport type { FC } from 'react';\nimport { useSpring, animated, to } from '@react-spring/web';\nimport {\n  Annotation as VisxAnnotation,\n  EditableAnnotation as VisxEditableAnnotation,\n} from '@visx/annotation';\nimport type {\n  AnnotationProps as VisxAnnotationProps,\n  EditableAnnotationProps,\n  EditableAnnotationProps as VisxEditableAnnotationProps,\n} from '@visx/annotation';\nimport type { AxisScale } from '@visx/axis';\nimport type { BaseAnnotationProps } from './private/BaseAnnotation';\nimport BaseAnnotation from './private/BaseAnnotation';\n\nexport type AnnotationProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = { editable?: boolean } & Omit<\n  BaseAnnotationProps<XScale, YScale, Datum>,\n  'AnnotationComponent'\n>;\n\nfunction BaseAnimatedAnnotation({\n  x = 0,\n  y = 0,\n  AnnotationComponent,\n  ...props\n}: {\n  AnnotationComponent: FC<VisxAnnotationProps> | FC<VisxEditableAnnotationProps>;\n} & VisxAnnotationProps &\n  EditableAnnotationProps) {\n  const lastXY = useRef({ x, y });\n\n  // in order to keep x/y/dx/dy accurate in AnnotationComponent, animate the delta\n  // between positions, to an x + y transform of zero from the previous value\n  const animatedXY = useSpring({\n    from: { x: lastXY.current.x - x, y: lastXY.current.y - y },\n    to: { x: 0, y: 0 },\n    reset: true,\n  });\n\n  useEffect(() => {\n    lastXY.current = { x, y };\n  }, [x, y]);\n\n  return (\n    <animated.g // for perf animate a group element not the Annotation itself\n      transform={to([animatedXY.x, animatedXY.y], (xVal, yVal) => `translate(${xVal}, ${yVal})`)}\n    >\n      <AnnotationComponent x={x} y={y} {...props} />\n    </animated.g>\n  );\n}\n\nexport default function AnimatedAnnotation<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({ editable, ...props }: AnnotationProps<XScale, YScale, Datum>) {\n  const AnnotationComponent: BaseAnnotationProps<XScale, YScale, Datum>['AnnotationComponent'] =\n    useCallback(\n      (annotationProps: VisxAnnotationProps & VisxEditableAnnotationProps) => (\n        <BaseAnimatedAnnotation\n          AnnotationComponent={editable ? VisxEditableAnnotation : VisxAnnotation}\n          {...annotationProps}\n        />\n      ),\n      [editable],\n    );\n  return <BaseAnnotation AnnotationComponent={AnnotationComponent} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/annotation/Annotation.tsx",
    "content": "import {\n  Annotation as VisxAnnotation,\n  EditableAnnotation as VisxEditableAnnotation,\n} from '@visx/annotation';\nimport type { AxisScale } from '@visx/axis';\nimport type { BaseAnnotationProps } from './private/BaseAnnotation';\nimport BaseAnnotation from './private/BaseAnnotation';\n\nexport type AnnotationProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = { editable?: boolean } & Omit<\n  BaseAnnotationProps<XScale, YScale, Datum>,\n  'AnnotationComponent'\n>;\n\nexport default function Annotation<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({ editable, ...props }: AnnotationProps<XScale, YScale, Datum>) {\n  return (\n    <BaseAnnotation\n      AnnotationComponent={editable ? VisxEditableAnnotation : VisxAnnotation}\n      {...props}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/annotation/AnnotationCircleSubject.tsx",
    "content": "import { useContext } from 'react';\nimport { CircleSubject as BaseCircleSubject } from '@visx/annotation';\nimport type { CircleSubjectProps } from '@visx/annotation';\nimport DataContext from '../../context/DataContext';\n\nexport type AnnotationSubjectCircleProps = CircleSubjectProps;\n\n/** AnnotationSubjectCircle which provides color from theme. */\nexport default function AnnotationCircleSubject(props: AnnotationSubjectCircleProps) {\n  const { theme } = useContext(DataContext);\n  return <BaseCircleSubject stroke={theme?.axisStyles.x.bottom.axisLine.stroke} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/annotation/AnnotationConnector.tsx",
    "content": "import { useContext } from 'react';\nimport { Connector as BaseConnector } from '@visx/annotation';\nimport type { ConnectorProps as BaseConnectorProps } from '@visx/annotation';\nimport DataContext from '../../context/DataContext';\n\nexport type AnnotationConnectorProps = BaseConnectorProps;\n\n/** AnnotationConnector which provides color from theme. */\nexport default function AnnotationConnector(props: AnnotationConnectorProps) {\n  const { theme } = useContext(DataContext);\n  return <BaseConnector stroke={theme?.axisStyles.x.bottom.axisLine.stroke} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/annotation/AnnotationLabel.tsx",
    "content": "import { useContext } from 'react';\nimport { Label as BaseLabel } from '@visx/annotation';\nimport type { LabelProps as BaseLabelProps } from '@visx/annotation';\nimport DataContext from '../../context/DataContext';\n\nexport type AnnotationLabelProps = BaseLabelProps;\n\nconst defaultBackgroundProps = { fillOpacity: 0.7 };\n\n/** AnnotationLabel which provides text styles from theme. */\nexport default function AnnotationLabel(props: AnnotationLabelProps) {\n  const { theme, resizeObserverPolyfill } = useContext(DataContext);\n  const titleProps = theme?.svgLabelBig;\n  const subtitleProps = theme?.svgLabelSmall;\n  return (\n    <BaseLabel\n      anchorLineStroke={theme?.axisStyles.x.bottom.axisLine.stroke}\n      backgroundFill={theme?.backgroundColor}\n      backgroundProps={defaultBackgroundProps}\n      showAnchorLine\n      subtitleFontSize={subtitleProps?.fontSize}\n      subtitleFontWeight={subtitleProps?.fontWeight}\n      subtitleProps={subtitleProps}\n      titleFontSize={titleProps?.fontSize}\n      titleFontWeight={titleProps?.fontWeight}\n      titleProps={titleProps}\n      resizeObserverPolyfill={resizeObserverPolyfill}\n      {...props}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/annotation/AnnotationLineSubject.tsx",
    "content": "import { useContext } from 'react';\nimport type { SVGProps } from 'react';\nimport { LineSubject as BaseLineSubject } from '@visx/annotation';\nimport type { LineSubjectProps } from '@visx/annotation';\nimport DataContext from '../../context/DataContext';\n\nexport type AnnotationLineSubjectProps = Omit<LineSubjectProps, 'min' | 'max'> & {\n  min?: number;\n  max?: number;\n};\n\n/** AnnotationLineSubject which provides color and dimensions from context. */\nexport default function AnnotationLineSubject({\n  min,\n  max,\n  ...props\n}: AnnotationLineSubjectProps & Omit<SVGProps<SVGLineElement>, keyof AnnotationLineSubjectProps>) {\n  const { theme, margin, innerHeight = 0, innerWidth = 0 } = useContext(DataContext);\n  return (\n    <BaseLineSubject\n      stroke={theme?.axisStyles.x.bottom.axisLine.stroke}\n      min={min ?? (props.orientation === 'horizontal' ? margin?.left : margin?.top) ?? 0}\n      max={\n        max ??\n        (props.orientation === 'horizontal'\n          ? (margin?.left ?? 0) + innerWidth\n          : (margin?.top ?? 0) + innerHeight)\n      }\n      {...props}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/annotation/private/BaseAnnotation.tsx",
    "content": "import { useContext, useMemo } from 'react';\nimport type { FC } from 'react';\nimport type { AnnotationProps, EditableAnnotationProps } from '@visx/annotation';\nimport type { ScaleInput } from '@visx/scale';\nimport { coerceNumber } from '@visx/scale';\nimport type { AxisScale } from '@visx/axis';\nimport DataContext from '../../../context/DataContext';\nimport getScaleBandwidth from '../../../utils/getScaleBandwidth';\nimport isValidNumber from '../../../typeguards/isValidNumber';\n\nexport type BaseAnnotationProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = Pick<\n  EditableAnnotationProps,\n  | 'canEditLabel'\n  | 'canEditSubject'\n  | 'children'\n  | 'dx'\n  | 'dy'\n  | 'onDragEnd'\n  | 'onDragMove'\n  | 'onDragStart'\n> & {\n  /** Annotation component to render. */\n  AnnotationComponent: FC<AnnotationProps> | FC<EditableAnnotationProps>;\n  /** Key for series to which datum belongs (used for x/yAccessors). Alternatively xAccessor + yAccessor may be specified. */\n  dataKey?: string;\n  /** Datum to annotate, used for Annotation positioning. */\n  datum: Datum;\n  /** If dataKey is not specified, you must specify an xAccessor for datum. */\n  xAccessor?: (d: Datum) => ScaleInput<XScale>;\n  /** If dataKey is not specified, you must specify an yAccessor for datum. */\n  yAccessor?: (d: Datum) => ScaleInput<YScale>;\n};\n\n// used for auto-positioning\nconst minimumLabelDimension = 16;\n\nexport default function BaseAnnotation<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  AnnotationComponent,\n  children,\n  datum,\n  dataKey,\n  xAccessor: propsXAccessor,\n  yAccessor: propsYAccessor,\n  dx: propsDx = 0,\n  dy: propsDy = 0,\n  ...annotationProps\n}: BaseAnnotationProps<XScale, YScale, Datum>) {\n  const { innerHeight, innerWidth, margin, xScale, yScale, dataRegistry } =\n    useContext(DataContext) || {};\n\n  const xBandWidth = useMemo(() => (xScale ? getScaleBandwidth(xScale) : 0), [xScale]);\n  const yBandWidth = useMemo(() => (yScale ? getScaleBandwidth(yScale) : 0), [yScale]);\n\n  if ((!propsXAccessor || !propsYAccessor) && !dataKey) {\n    console.warn('[@visx/xychart/BaseAnnotation]: dataKey or x/yAccessors must be specified.');\n    return null;\n  }\n\n  const registryEntry =\n    (propsXAccessor && propsYAccessor) || dataKey == null ? null : dataRegistry?.get(dataKey);\n  const xAccessor = propsXAccessor || registryEntry?.xAccessor;\n  const yAccessor = propsYAccessor || registryEntry?.yAccessor;\n\n  if (!xScale || !yScale || !innerWidth || !innerHeight || !xAccessor || !yAccessor || !margin) {\n    return null;\n  }\n\n  const x = (coerceNumber(xScale(xAccessor(datum))) ?? NaN) + xBandWidth / 2;\n  const y = (coerceNumber(yScale(yAccessor(datum))) ?? NaN) + yBandWidth / 2;\n  const dx = x + propsDx + minimumLabelDimension > margin.left + innerWidth ? -propsDx : propsDx;\n  const dy = y + propsDy + minimumLabelDimension > margin.top + innerHeight ? -propsDy : propsDy;\n\n  return isValidNumber(x) && isValidNumber(y) ? (\n    <AnnotationComponent\n      width={innerWidth}\n      height={innerHeight}\n      {...annotationProps}\n      x={x}\n      y={y}\n      dx={dx}\n      dy={dy}\n    >\n      {children}\n    </AnnotationComponent>\n  ) : null;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/axis/AnimatedAxis.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { AnimatedAxis as VxAnimatedAxis } from '@visx/react-spring';\nimport type { AnimationTrajectory } from '@visx/react-spring';\nimport type { BaseAxisProps } from './BaseAxis';\nimport BaseAxis from './BaseAxis';\n\nexport type AnimatedAxisProps<Scale extends AxisScale> = Omit<\n  BaseAxisProps<Scale>,\n  'AxisComponent'\n> & {\n  /** Animation trjectory of axis ticks. */\n  animationTrajectory?: AnimationTrajectory;\n};\n\nexport default function AnimatedAxis<Scale extends AxisScale>(props: AnimatedAxisProps<Scale>) {\n  return <BaseAxis<Scale> AxisComponent={VxAnimatedAxis} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/axis/Axis.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { Axis as VisxAxis } from '@visx/axis';\nimport type { BaseAxisProps } from './BaseAxis';\nimport BaseAxis from './BaseAxis';\n\nexport type AxisProps<Scale extends AxisScale = AxisScale> = Omit<\n  BaseAxisProps<Scale>,\n  'AxisComponent'\n>;\n\nexport default function Axis<Scale extends AxisScale = AxisScale>(props: AxisProps<Scale>) {\n  return <BaseAxis<Scale> AxisComponent={VisxAxis} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/axis/BaseAxis.tsx",
    "content": "import { useMemo, useContext } from 'react';\nimport type { FC } from 'react';\nimport type { AxisScale, TickLabelProps, AxisProps as VxAxisProps } from '@visx/axis';\nimport type { ScaleInput } from '@visx/scale';\nimport DataContext from '../../context/DataContext';\n\nexport type BaseAxisProps<Scale extends AxisScale> = Omit<\n  VxAxisProps<Scale>,\n  'scale' | 'orientation'\n> & {\n  /** Required axis orientation. */\n  orientation: NonNullable<VxAxisProps<Scale>['orientation']>;\n} & {\n  /** Rendered component which is passed VxAxisProps by BaseAxis after processing. */\n  AxisComponent: FC<VxAxisProps<Scale>>;\n};\n\n/**\n * Component which handles all xychart-specific logic for axes,\n * and passes processed props to a specified Axis / AnimatedAxis component.\n */\nexport default function BaseAxis<Scale extends AxisScale>({\n  AxisComponent,\n  ...props\n}: BaseAxisProps<Scale>) {\n  const { theme, xScale, yScale, margin, width, height } = useContext(DataContext);\n  const { orientation } = props;\n\n  const axisStyles = useMemo(\n    () =>\n      orientation === 'left' || orientation === 'right'\n        ? theme?.axisStyles?.y?.[orientation]\n        : theme?.axisStyles?.x?.[orientation],\n    [theme, orientation],\n  );\n\n  const maybeTickLabelProps = props.tickLabelProps;\n  const tickLabelProps = useMemo<TickLabelProps<ScaleInput<Scale>> | undefined>(\n    () =>\n      maybeTickLabelProps || axisStyles // construct from props + theme if possible\n        ? (value, index, values) =>\n            // by default, wrap vertical-axis tick labels within the allotted margin space\n            // this does not currently account for axis label\n            ({\n              ...axisStyles?.tickLabel,\n              width:\n                orientation === 'left' || orientation === 'right'\n                  ? margin?.[orientation]\n                  : undefined,\n              ...(typeof maybeTickLabelProps === 'function'\n                ? maybeTickLabelProps(value, index, values)\n                : maybeTickLabelProps),\n            })\n        : undefined,\n    [maybeTickLabelProps, axisStyles, orientation, margin],\n  );\n\n  const topOffset =\n    orientation === 'bottom'\n      ? (height ?? 0) - (margin?.bottom ?? 0)\n      : orientation === 'top'\n      ? margin?.top ?? 0\n      : 0;\n  const leftOffset =\n    orientation === 'left'\n      ? margin?.left ?? 0\n      : orientation === 'right'\n      ? (width ?? 0) - (margin?.right ?? 0)\n      : 0;\n\n  const scale = (orientation === 'left' || orientation === 'right' ? yScale : xScale) as\n    | Scale\n    | undefined;\n\n  return scale ? (\n    <AxisComponent\n      top={topOffset}\n      left={leftOffset}\n      labelProps={axisStyles?.axisLabel}\n      stroke={axisStyles?.axisLine?.stroke}\n      strokeWidth={axisStyles?.axisLine?.strokeWidth}\n      tickLength={axisStyles?.tickLength}\n      tickStroke={axisStyles?.tickLine?.stroke}\n      {...props}\n      tickLabelProps={tickLabelProps}\n      scale={scale}\n    />\n  ) : null;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/grid/AnimatedGrid.tsx",
    "content": "/* eslint-disable react/no-unstable-nested-components */\nimport { useMemo } from 'react';\nimport { AnimatedGridRows, AnimatedGridColumns } from '@visx/react-spring';\nimport type { AnimationTrajectory } from '@visx/react-spring';\nimport type { GridRowsProps, GridColumnsProps } from '@visx/grid';\nimport type { AxisScale } from '@visx/axis';\nimport type { BaseGridProps } from './BaseGrid';\nimport BaseGrid from './BaseGrid';\n\nexport type AnimatedGridProps = Omit<\n  BaseGridProps,\n  'GridRowsComponent' | 'GridColumnsComponent'\n> & {\n  /** Animation trajectory of grid lines. */\n  animationTrajectory?: AnimationTrajectory;\n};\n\nexport default function AnimatedGrid({ animationTrajectory, ...props }: AnimatedGridProps) {\n  const RowsComponent = useMemo(\n    () =>\n      function RowsFC(rowProps: GridRowsProps<AxisScale>) {\n        return <AnimatedGridRows {...rowProps} animationTrajectory={animationTrajectory} />;\n      },\n    [animationTrajectory],\n  );\n  const ColumnsComponent = useMemo(\n    () =>\n      function ColumnsFC(rowProps: GridColumnsProps<AxisScale>) {\n        return <AnimatedGridColumns {...rowProps} animationTrajectory={animationTrajectory} />;\n      },\n    [animationTrajectory],\n  );\n  return (\n    <BaseGrid\n      GridRowsComponent={RowsComponent}\n      GridColumnsComponent={ColumnsComponent}\n      {...props}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/grid/BaseGrid.tsx",
    "content": "import { useContext } from 'react';\nimport type { FC } from 'react';\nimport type { CommonGridProps, AllGridRowsProps, GridColumnsProps } from '@visx/grid';\nimport type { AxisScale } from '@visx/axis';\nimport DataContext from '../../context/DataContext';\n\nexport type BaseGridProps = {\n  /** Whether to render GridRows. */\n  rows?: boolean;\n  /** Whether to render GridColumns. */\n  columns?: boolean;\n  /** Rendered GridRows component which is passed GridRowProps by BaseGrid. */\n  GridRowsComponent: FC<AllGridRowsProps<AxisScale>>;\n  /** Rendered GridColumns component which is passed GridColumnsProps by BaseGrid. */\n  GridColumnsComponent: FC<GridColumnsProps<AxisScale>>;\n} & CommonGridProps;\n\n/** Component that handles all  */\nexport default function BaseGrid({\n  rows = true,\n  columns = true,\n  GridRowsComponent,\n  GridColumnsComponent,\n  ...props\n}: BaseGridProps) {\n  const {\n    theme,\n    xScale: columnsScale,\n    yScale: rowsScale,\n    margin,\n    innerWidth,\n    innerHeight,\n  } = useContext(DataContext);\n\n  const gridLineStyles = theme?.gridStyles;\n\n  return (\n    <>\n      {rows && rowsScale && innerWidth != null && (\n        <GridRowsComponent\n          left={margin?.left}\n          lineStyle={gridLineStyles}\n          width={innerWidth}\n          scale={rowsScale}\n          {...props}\n        />\n      )}\n      {columns && columnsScale && innerHeight != null && (\n        <GridColumnsComponent\n          top={margin?.top}\n          lineStyle={gridLineStyles}\n          height={innerHeight}\n          scale={columnsScale}\n          {...props}\n        />\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/grid/Grid.tsx",
    "content": "import { GridRows, GridColumns } from '@visx/grid';\nimport type { BaseGridProps } from './BaseGrid';\nimport BaseGrid from './BaseGrid';\n\nexport type GridProps = Omit<BaseGridProps, 'GridRowsComponent' | 'GridColumnsComponent'>;\n\nexport default function Grid(props: GridProps) {\n  return <BaseGrid GridRowsComponent={GridRows} GridColumnsComponent={GridColumns} {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AnimatedAreaSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport AnimatedPath from './private/AnimatedPath';\nimport type { BaseAreaSeriesProps } from './private/BaseAreaSeries';\nimport BaseAreaSeries from './private/BaseAreaSeries';\n\nexport default function AnimatedAreaSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: Omit<BaseAreaSeriesProps<XScale, YScale, Datum>, 'PathComponent'>) {\n  return <BaseAreaSeries<XScale, YScale, Datum> {...props} PathComponent={AnimatedPath} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AnimatedAreaStack.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { BaseAreaStackProps } from './private/BaseAreaStack';\nimport BaseAreaStack from './private/BaseAreaStack';\nimport AnimatedPath from './private/AnimatedPath';\n\nexport default function AnimatedAreaStack<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: Omit<BaseAreaStackProps<XScale, YScale, Datum>, 'PathComponent'>) {\n  return <BaseAreaStack<XScale, YScale, Datum> {...props} PathComponent={AnimatedPath} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AnimatedBarGroup.tsx",
    "content": "import type { PositionScale } from '@visx/shape';\nimport type { BaseBarGroupProps } from './private/BaseBarGroup';\nimport BaseBarGroup from './private/BaseBarGroup';\nimport AnimatedBars from './private/AnimatedBars';\n\nexport default function AnimatedBarGroup<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n>(props: Omit<BaseBarGroupProps<XScale, YScale, Datum>, 'BarsComponent'>) {\n  return <BaseBarGroup<XScale, YScale, Datum> {...props} BarsComponent={AnimatedBars} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AnimatedBarSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { BaseBarSeriesProps } from './private/BaseBarSeries';\nimport BaseBarSeries from './private/BaseBarSeries';\nimport AnimatedBars from './private/AnimatedBars';\n\nexport default function AnimatedBarSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({ colorAccessor, ...props }: Omit<BaseBarSeriesProps<XScale, YScale, Datum>, 'BarsComponent'>) {\n  return (\n    <BaseBarSeries<XScale, YScale, Datum>\n      {...props}\n      colorAccessor={colorAccessor as BaseBarSeriesProps<XScale, YScale, object>['colorAccessor']}\n      BarsComponent={AnimatedBars}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AnimatedBarStack.tsx",
    "content": "import type { PositionScale } from '@visx/shape';\nimport type { BaseBarStackProps } from './private/BaseBarStack';\nimport BaseBarStack from './private/BaseBarStack';\nimport AnimatedBars from './private/AnimatedBars';\n\nexport default function AnimatedBarStack<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n>(props: Omit<BaseBarStackProps<XScale, YScale, Datum>, 'BarsComponent'>) {\n  return <BaseBarStack<XScale, YScale, Datum> {...props} BarsComponent={AnimatedBars} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AnimatedGlyphSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { useCallback } from 'react';\nimport type { FC } from 'react';\nimport type { GlyphProps, GlyphsProps } from '../../types';\nimport AnimatedGlyphs from './private/AnimatedGlyphs';\nimport type { BaseGlyphSeriesProps } from './private/BaseGlyphSeries';\nimport BaseGlyphSeries from './private/BaseGlyphSeries';\nimport defaultRenderGlyph from './private/defaultRenderGlyph';\n\nexport default function AnimatedGlyphSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  renderGlyph = defaultRenderGlyph,\n  ...props\n}: Omit<BaseGlyphSeriesProps<XScale, YScale, Datum>, 'renderGlyphs'> & {\n  renderGlyph?: FC<GlyphProps<Datum>>;\n}) {\n  const renderGlyphs = useCallback(\n    (glyphsProps: GlyphsProps<XScale, YScale, Datum>) => (\n      <AnimatedGlyphs {...glyphsProps} renderGlyph={renderGlyph} />\n    ),\n    [renderGlyph],\n  );\n\n  return <BaseGlyphSeries<XScale, YScale, Datum> {...props} renderGlyphs={renderGlyphs} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AnimatedLineSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { BaseLineSeriesProps } from './private/BaseLineSeries';\nimport BaseLineSeries from './private/BaseLineSeries';\nimport AnimatedPath from './private/AnimatedPath';\n\nexport default function AnimatedLineSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: Omit<BaseLineSeriesProps<XScale, YScale, Datum>, 'PathComponent'>) {\n  return <BaseLineSeries<XScale, YScale, Datum> {...props} PathComponent={AnimatedPath} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AreaSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { BaseAreaSeriesProps } from './private/BaseAreaSeries';\nimport BaseAreaSeries from './private/BaseAreaSeries';\n\nexport default function AreaSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: Omit<BaseAreaSeriesProps<XScale, YScale, Datum>, 'PathComponent'>) {\n  return <BaseAreaSeries<XScale, YScale, Datum> {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/AreaStack.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { BaseAreaStackProps } from './private/BaseAreaStack';\nimport BaseAreaStack from './private/BaseAreaStack';\n\nexport default function AreaStack<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: Omit<BaseAreaStackProps<XScale, YScale, Datum>, 'PathComponent'>) {\n  return <BaseAreaStack<XScale, YScale, Datum> {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/BarGroup.tsx",
    "content": "import type { PositionScale } from '@visx/shape';\nimport type { BaseBarGroupProps } from './private/BaseBarGroup';\nimport BaseBarGroup from './private/BaseBarGroup';\nimport Bars from './private/Bars';\n\nexport default function BarGroup<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n>(props: Omit<BaseBarGroupProps<XScale, YScale, Datum>, 'BarsComponent'>) {\n  return <BaseBarGroup<XScale, YScale, Datum> {...props} BarsComponent={Bars} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/BarSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { BaseBarSeriesProps } from './private/BaseBarSeries';\nimport BaseBarSeries from './private/BaseBarSeries';\nimport Bars from './private/Bars';\n\nfunction BarSeries<XScale extends AxisScale, YScale extends AxisScale, Datum extends object>({\n  colorAccessor,\n  ...props\n}: Omit<BaseBarSeriesProps<XScale, YScale, Datum>, 'BarsComponent'>) {\n  return (\n    <BaseBarSeries<XScale, YScale, Datum>\n      {...props}\n      colorAccessor={colorAccessor}\n      BarsComponent={Bars}\n    />\n  );\n}\n\nexport default BarSeries;\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/BarStack.tsx",
    "content": "import type { PositionScale } from '@visx/shape';\nimport type { BaseBarStackProps } from './private/BaseBarStack';\nimport BaseBarStack from './private/BaseBarStack';\nimport Bars from './private/Bars';\n\nexport default function BarStack<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n>(props: Omit<BaseBarStackProps<XScale, YScale, Datum>, 'BarsComponent'>) {\n  return <BaseBarStack<XScale, YScale, Datum> {...props} BarsComponent={Bars} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/GlyphSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { Fragment, useCallback } from 'react';\nimport type { FC, ReactNode } from 'react';\nimport type { GlyphProps, GlyphsProps } from '../../types';\nimport type { BaseGlyphSeriesProps } from './private/BaseGlyphSeries';\nimport BaseGlyphSeries from './private/BaseGlyphSeries';\nimport defaultRenderGlyph from './private/defaultRenderGlyph';\n\nexport default function GlyphSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  renderGlyph = defaultRenderGlyph,\n  ...props\n}: Omit<BaseGlyphSeriesProps<XScale, YScale, Datum>, 'renderGlyphs'> & {\n  renderGlyph?: FC<GlyphProps<Datum>>;\n}) {\n  const renderGlyphs = useCallback(\n    ({\n      glyphs,\n      onPointerMove,\n      onPointerOut,\n      onPointerUp,\n      onFocus,\n      onBlur,\n    }: GlyphsProps<XScale, YScale, Datum>) =>\n      glyphs.map((glyph) => (\n        <Fragment key={glyph.key}>\n          {\n            renderGlyph({\n              ...glyph,\n              onPointerMove,\n              onPointerOut,\n              onPointerUp,\n              onFocus,\n              onBlur,\n            }) as ReactNode\n          }\n        </Fragment>\n      )),\n    [renderGlyph],\n  );\n  return <BaseGlyphSeries<XScale, YScale, Datum> {...props} renderGlyphs={renderGlyphs} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/LineSeries.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { BaseLineSeriesProps } from './private/BaseLineSeries';\nimport BaseLineSeries from './private/BaseLineSeries';\n\nexport default function LineSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: Omit<BaseLineSeriesProps<XScale, YScale, Datum>, 'PathComponent'>) {\n  return <BaseLineSeries<XScale, YScale, Datum> {...props} />;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/AnimatedBars.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { BarRounded } from '@visx/shape';\nimport { useMemo } from 'react';\nimport { animated, useTransition } from '@react-spring/web';\nimport type { Bar, BarsProps } from '../../../types';\nimport { cleanColor, colorHasUrl } from '../../../utils/cleanColorString';\nimport getScaleBaseline from '../../../utils/getScaleBaseline';\nimport AnimatedPath from './AnimatedPath';\n\nfunction enterUpdate({ x, y, width, height, fill }: Bar) {\n  return {\n    x,\n    y,\n    width,\n    height,\n    fill: cleanColor(fill),\n    opacity: 1,\n  };\n}\n\ntype BarTransitionConfig<Scale extends AxisScale> = {\n  scale: Scale;\n  horizontal?: boolean;\n};\n\nfunction useBarTransitionConfig<Scale extends AxisScale>({\n  scale,\n  horizontal,\n}: BarTransitionConfig<Scale>) {\n  const shouldAnimateX = !!horizontal;\n  return useMemo(() => {\n    const scaleBaseline = getScaleBaseline(scale);\n\n    function fromLeave({ x, y, width, height, fill }: Bar) {\n      return {\n        x: shouldAnimateX ? scaleBaseline ?? 0 : x,\n        y: shouldAnimateX ? y : scaleBaseline ?? 0,\n        width: shouldAnimateX ? 0 : width,\n        height: shouldAnimateX ? height : 0,\n        fill: cleanColor(fill),\n        opacity: 0,\n      };\n    }\n\n    return {\n      unique: true,\n      from: fromLeave,\n      leave: fromLeave,\n      enter: enterUpdate,\n      update: enterUpdate,\n      keys: (bar: Bar) => bar.key,\n    };\n  }, [scale, shouldAnimateX]);\n}\n\nfunction AnimatedBarsRounded<XScale extends AxisScale, YScale extends AxisScale>({\n  bars,\n  xScale,\n  yScale,\n  horizontal,\n  radius,\n  radiusAll,\n  radiusTop,\n  radiusRight,\n  radiusBottom,\n  radiusLeft,\n  ...pathProps\n}: BarsProps<XScale, YScale> & { radius: number }) {\n  return (\n    // eslint-disable-next-line react/jsx-no-useless-fragment\n    <>\n      {bars.map(({ key, fill, x, y, width, height }) => (\n        <BarRounded\n          key={key}\n          x={x}\n          y={y}\n          width={width}\n          height={height}\n          radius={radius}\n          all={radiusAll}\n          top={radiusTop}\n          right={radiusRight}\n          bottom={radiusBottom}\n          left={radiusLeft}\n        >\n          {({ path }) => (\n            <AnimatedPath\n              className=\"visx-bar visx-bar-rounded\"\n              d={path}\n              fill={fill}\n              {...pathProps}\n            />\n          )}\n        </BarRounded>\n      ))}\n    </>\n  );\n}\n\nfunction AnimatedBarsUnrounded<XScale extends AxisScale, YScale extends AxisScale>({\n  bars,\n  xScale,\n  yScale,\n  horizontal,\n  radius,\n  radiusAll,\n  radiusTop,\n  radiusRight,\n  radiusBottom,\n  radiusLeft,\n  ...rectProps\n}: BarsProps<XScale, YScale>) {\n  const animatedBars = useTransition(bars, {\n    ...useBarTransitionConfig({ horizontal, scale: horizontal ? xScale : yScale }),\n  });\n  const isFocusable = Boolean(rectProps.onFocus || rectProps.onBlur);\n\n  return (\n    <>\n      {animatedBars(\n        (\n          // @ts-expect-error x/y aren't in react-spring types (which are HTML CSS properties)\n          { x, y, width, height, fill, opacity },\n          item,\n          { key },\n        ) =>\n          item == null || key == null ? null : (\n            <animated.rect\n              key={key}\n              tabIndex={isFocusable ? 0 : undefined}\n              className=\"visx-bar\"\n              x={x}\n              y={y}\n              width={width}\n              height={height}\n              // use the item's fill directly if it's not animate-able\n              fill={colorHasUrl(item.fill) ? item.fill : fill}\n              opacity={opacity}\n              {...rectProps}\n            />\n          ),\n      )}\n    </>\n  );\n}\n\n/** Wrapper component which renders a Bars component depending on whether it needs rounded corners. */\nexport default function AnimatedBars<XScale extends AxisScale, YScale extends AxisScale>(\n  props: BarsProps<XScale, YScale>,\n) {\n  return props.radius == null ? (\n    <AnimatedBarsUnrounded {...props} />\n  ) : (\n    <AnimatedBarsRounded {...props} radius={props.radius} />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/AnimatedGlyphs.tsx",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { useMemo } from 'react';\nimport type { ReactNode, FC } from 'react';\nimport { useTransition, animated, to } from '@react-spring/web';\nimport getScaleBaseline from '../../../utils/getScaleBaseline';\nimport type { GlyphProps, GlyphsProps } from '../../../types';\nimport { cleanColor, colorHasUrl } from '../../../utils/cleanColorString';\n\n/** Memoized useTransition config */\nexport function useAnimatedGlyphsConfig<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({ xScale, yScale, horizontal }: { xScale: XScale; yScale: YScale; horizontal?: boolean }) {\n  type Props = GlyphProps<Datum>;\n  const xScaleBaseline = getScaleBaseline(xScale);\n  const yScaleBaseline = getScaleBaseline(yScale);\n  return useMemo(\n    () => ({\n      unique: true,\n      from: ({ x, y, color }: Props) => ({\n        x: horizontal ? xScaleBaseline : x,\n        y: horizontal ? y : yScaleBaseline,\n        color: cleanColor(color),\n        opacity: 0,\n      }),\n      leave: ({ x, y, color }: Props) => ({\n        x: horizontal ? xScaleBaseline : x,\n        y: horizontal ? y : yScaleBaseline,\n        color: cleanColor(color),\n        opacity: 0,\n      }),\n      enter: ({ x, y, color }: Props) => ({ x, y, color: cleanColor(color), opacity: 1 }),\n      update: ({ x, y, color }: Props) => ({ x, y, color: cleanColor(color), opacity: 1 }),\n      keys: (glyph: Props) => glyph.key,\n    }),\n    [xScaleBaseline, yScaleBaseline, horizontal],\n  );\n}\n\nexport default function AnimatedGlyphs<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  renderGlyph,\n  glyphs,\n  horizontal,\n  xScale,\n  yScale,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n}: {\n  // unanimated Glyph component\n  renderGlyph: FC<GlyphProps<Datum>>;\n} & GlyphsProps<XScale, YScale, Datum>) {\n  const animatedGlyphs = useTransition(glyphs, {\n    ...useAnimatedGlyphsConfig({ xScale, yScale, horizontal }),\n  });\n\n  return (\n    <>\n      {/** @ts-expect-error x/y aren't in react-spring's CSSProperties */}\n      {animatedGlyphs(({ x, y, color, opacity }, item, { key }) => (\n        <animated.g\n          key={key}\n          transform={to([x, y], (xVal, yVal) => `translate(${xVal}, ${yVal})`)}\n          color={color}\n          opacity={opacity}\n        >\n          {\n            renderGlyph({\n              key,\n              datum: item.datum,\n              index: item.index,\n              x: 0,\n              y: 0,\n              size: item.size,\n              // currentColor doesn't work with url-based colors (pattern, gradient)\n              // otherwise currentColor allows us to animate the color of the <g /> element\n              color: colorHasUrl(item.color) ? item.color : 'currentColor',\n              onBlur,\n              onFocus,\n              onPointerMove,\n              onPointerOut,\n              onPointerUp,\n            }) as ReactNode\n          }\n        </animated.g>\n      ))}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/AnimatedPath.tsx",
    "content": "import { memo, useCallback, useRef } from 'react';\nimport type { SVGProps } from 'react';\nimport { animated, useSpring } from '@react-spring/web';\n// @ts-expect-error no types\nimport { interpolatePath } from 'd3-interpolate-path';\nimport debounce from 'lodash/debounce';\n\nfunction AnimatedPath({\n  d,\n  stroke = 'transparent',\n  fill = 'transparent',\n  ...lineProps\n}: Omit<SVGProps<SVGPathElement>, 'ref'>) {\n  const previousD = useRef(d);\n  // updating d in quick succession will ruin the animation because startD === endD.\n  // debounce it slightly\n  // eslint-disable-next-line react-hooks/exhaustive-deps\n  const setPreviousD = useCallback(\n    debounce((dValue?: string) => {\n      previousD.current = dValue;\n    }, 50),\n    [], // create once\n  );\n\n  // react-spring cannot interpolate paths which have a differing number of points\n  // flubber is the \"best\" at interpolating but assumes closed paths\n  // d3-interpolate-path is better at interpolating extra/fewer points so we use that\n  const interpolator = interpolatePath(previousD.current, d);\n  setPreviousD(d);\n\n  const { t } = useSpring({\n    from: { t: 0 },\n    to: { t: 1 },\n    reset: true,\n    delay: 0,\n  });\n  const tweened = useSpring({ stroke, fill });\n  return (\n    <animated.path\n      className=\"visx-path\"\n      d={t.to(interpolator)}\n      stroke={tweened.stroke}\n      fill={tweened.fill}\n      {...lineProps}\n    />\n  );\n}\n\nexport default memo(AnimatedPath);\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/Bars.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { AxisScale } from '@visx/axis';\nimport { BarRounded } from '@visx/shape';\nimport type { BarsProps } from '../../../types';\n\nexport default function Bars({\n  bars,\n  horizontal,\n  xScale,\n  yScale,\n  radius,\n  radiusAll,\n  radiusTop,\n  radiusRight,\n  radiusBottom,\n  radiusLeft,\n  ...restProps\n}: BarsProps<AxisScale, AxisScale>) {\n  const isFocusable = Boolean(restProps.onFocus || restProps.onBlur);\n  return (\n    <>\n      {bars.map(({ key, ...barProps }) =>\n        radius == null ? (\n          <rect\n            key={key}\n            className=\"visx-bar\"\n            tabIndex={isFocusable ? 0 : undefined}\n            {...barProps}\n            {...restProps}\n          />\n        ) : (\n          <BarRounded\n            key={key}\n            className=\"visx-bar\"\n            tabIndex={isFocusable ? 0 : undefined}\n            radius={radius}\n            all={radiusAll}\n            top={radiusTop}\n            right={radiusRight}\n            bottom={radiusBottom}\n            left={radiusLeft}\n            {...barProps}\n            {...restProps}\n          />\n        ),\n      )}\n    </>\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/BaseAreaSeries.tsx",
    "content": "import { Fragment, useContext, useCallback, useMemo, useEffect } from 'react';\nimport type { FC, SVGProps } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport type { AreaProps, LinePathProps } from '@visx/shape';\nimport { Area, LinePath } from '@visx/shape';\nimport DataContext from '../../../context/DataContext';\nimport type { DataContextType, GlyphsProps, SeriesProps } from '../../../types';\nimport getScaledValueFactory from '../../../utils/getScaledValueFactory';\nimport getScaleBaseline from '../../../utils/getScaleBaseline';\nimport isValidNumber from '../../../typeguards/isValidNumber';\nimport { AREASERIES_EVENT_SOURCE, XYCHART_EVENT_SOURCE } from '../../../constants';\nimport { BaseGlyphSeries } from './BaseGlyphSeries';\nimport defaultRenderGlyph from './defaultRenderGlyph';\nimport useSeriesEvents from '../../../hooks/useSeriesEvents';\n\nexport type BaseAreaSeriesProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = SeriesProps<XScale, YScale, Datum> & {\n  /** Optional accessor to override the baseline value of Area shapes per datum (useful to generate band shapes) when chart is rendered horizontally (vertical line). Defaults to the scale zero value, not compatible with AreaStack. */\n  x0Accessor?: SeriesProps<XScale, YScale, Datum>['xAccessor'];\n  /** Optional accessor to override the baseline value of Area shapes per datum (useful to generate band shapes). Defaults to the scale zero value, not compatible with AreaStack. */\n  y0Accessor?: SeriesProps<XScale, YScale, Datum>['yAccessor'];\n  /** Whether to render a Line along value of the Area shape (area is fill only). */\n  renderLine?: boolean;\n  /** Sets the curve factory (from @visx/curve or d3-curve) for the line generator. Defaults to curveLinear. */\n  curve?: AreaProps<Datum>['curve'];\n  /** Props to be passed to the Line, if rendered. */\n  lineProps?: Omit<\n    LinePathProps<Datum> & SVGProps<SVGPathElement>,\n    'data' | 'x' | 'y' | 'children' | 'defined'\n  >;\n  /** Rendered component which is passed path props by BaseAreaSeries after processing. */\n  PathComponent?: FC<Omit<SVGProps<SVGPathElement>, 'ref'>> | 'path';\n} & Omit<SVGProps<SVGPathElement>, 'x' | 'y' | 'x0' | 'x1' | 'y0' | 'y1' | 'ref'>;\n\nfunction BaseAreaSeries<XScale extends AxisScale, YScale extends AxisScale, Datum extends object>({\n  PathComponent = 'path',\n  curve,\n  data,\n  dataKey,\n  lineProps,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  enableEvents = true,\n  renderLine = true,\n  xAccessor,\n  x0Accessor,\n  xScale,\n  yAccessor,\n  y0Accessor,\n  yScale,\n  ...areaProps\n}: BaseAreaSeriesProps<XScale, YScale, Datum> &\n  Pick<DataContextType<XScale, YScale, Datum>, 'xScale' | 'yScale'>) {\n  const { colorScale, theme, horizontal } = useContext(DataContext);\n  const getScaledX0 = useMemo(\n    () => (x0Accessor ? getScaledValueFactory(xScale, x0Accessor) : undefined),\n    [xScale, x0Accessor],\n  );\n  const getScaledX = useMemo(() => getScaledValueFactory(xScale, xAccessor), [xScale, xAccessor]);\n  const getScaledY0 = useMemo(\n    () => (y0Accessor ? getScaledValueFactory(yScale, y0Accessor) : undefined),\n    [yScale, y0Accessor],\n  );\n  const getScaledY = useMemo(() => getScaledValueFactory(yScale, yAccessor), [yScale, yAccessor]);\n  const isDefined = useCallback(\n    (d: Datum) => isValidNumber(xScale(xAccessor(d))) && isValidNumber(yScale(yAccessor(d))),\n    [xScale, xAccessor, yScale, yAccessor],\n  );\n  const color = colorScale?.(dataKey) ?? theme?.colors?.[0] ?? '#222';\n\n  const ownEventSourceKey = `${AREASERIES_EVENT_SOURCE}-${dataKey}`;\n  const eventEmitters = useSeriesEvents<XScale, YScale, Datum>({\n    dataKey,\n    enableEvents,\n    onBlur,\n    onFocus,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    source: ownEventSourceKey,\n    allowedSources: [XYCHART_EVENT_SOURCE, ownEventSourceKey],\n  });\n\n  // accessor functions for the area generator\n  const accessors = useMemo(() => {\n    const numericScaleBaseline = getScaleBaseline(horizontal ? xScale : yScale);\n    return horizontal\n      ? {\n          x0: getScaledX0 ?? numericScaleBaseline,\n          x1: getScaledX,\n          y: getScaledY,\n        }\n      : {\n          x: getScaledX,\n          y0: getScaledY0 ?? numericScaleBaseline,\n          y1: getScaledY,\n        };\n  }, [xScale, yScale, horizontal, getScaledX, getScaledY, getScaledX0, getScaledY0]);\n\n  // render invisible glyphs for focusing if onFocus/onBlur are defined\n  const captureFocusEvents = Boolean(onFocus || onBlur);\n  const renderGlyphs = useCallback(\n    ({ glyphs }: GlyphsProps<XScale, YScale, Datum>) =>\n      captureFocusEvents\n        ? glyphs.map((glyph) => (\n            <Fragment key={glyph.key}>\n              {defaultRenderGlyph({\n                ...glyph,\n                color: 'transparent',\n                onFocus: eventEmitters.onFocus,\n                onBlur: eventEmitters.onBlur,\n              })}\n            </Fragment>\n          ))\n        : null,\n    [captureFocusEvents, eventEmitters.onFocus, eventEmitters.onBlur],\n  );\n\n  return (\n    <>\n      <Area {...accessors} {...areaProps} curve={curve} defined={isDefined}>\n        {({ path }) => (\n          <PathComponent\n            className=\"visx-area\"\n            stroke=\"transparent\"\n            fill={color}\n            strokeLinecap=\"round\" // without this a datum surrounded by nulls will not be visible\n            {...areaProps}\n            d={path(data) || ''}\n            {...eventEmitters}\n          />\n        )}\n      </Area>\n      {renderLine && (\n        <LinePath<Datum>\n          x={getScaledX}\n          y={getScaledY}\n          defined={isDefined}\n          curve={curve}\n          {...lineProps}\n        >\n          {({ path }) => (\n            <PathComponent\n              className=\"visx-line\"\n              fill=\"transparent\"\n              stroke={color}\n              strokeWidth={2}\n              pointerEvents=\"none\"\n              strokeLinecap=\"round\" // without this a datum surrounded by nulls will not be visible\n              {...lineProps}\n              d={path(data) || ''}\n            />\n          )}\n        </LinePath>\n      )}\n      {captureFocusEvents && (\n        <BaseGlyphSeries\n          dataKey={dataKey}\n          data={data}\n          xAccessor={xAccessor}\n          yAccessor={yAccessor}\n          xScale={xScale}\n          yScale={yScale}\n          renderGlyphs={renderGlyphs}\n        />\n      )}\n    </>\n  );\n}\n\nexport default function BaseAreaSeriesWithRegisteredData<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: BaseAreaSeriesProps<XScale, YScale, Datum>) {\n  const { dataKey, data, xAccessor, yAccessor } = props;\n  const { xScale, yScale, dataRegistry } = useContext(DataContext) as unknown as DataContextType<\n    XScale,\n    YScale,\n    Datum\n  >;\n\n  useEffect(() => {\n    if (dataRegistry) dataRegistry.registerData({ key: dataKey, data, xAccessor, yAccessor });\n    return () => dataRegistry?.unregisterData(dataKey);\n  }, [dataRegistry, dataKey, data, xAccessor, yAccessor]);\n\n  const registryEntry = dataRegistry?.get(dataKey);\n\n  // if scales or data are not available in context, render nothing\n  if (!xScale || !yScale || !registryEntry) return null;\n\n  // otherwise pass props + over-write data/accessors\n  return (\n    <BaseAreaSeries\n      {...props}\n      xScale={xScale}\n      yScale={yScale}\n      data={registryEntry.data}\n      xAccessor={registryEntry.xAccessor}\n      yAccessor={registryEntry.yAccessor}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/BaseAreaStack.tsx",
    "content": "import { Fragment, useCallback, useContext, useMemo } from 'react';\nimport type { ReactElement, FC, SVGProps } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport type { SeriesPoint } from '@visx/vendor/d3-shape';\nimport type { StackPathConfig, AreaProps } from '@visx/shape';\nimport { LinePath, Area, getFirstItem, getSecondItem } from '@visx/shape';\nimport { coerceNumber } from '@visx/scale';\n\nimport type {\n  CombinedStackData,\n  DataContextType,\n  GlyphsProps,\n  NearestDatumArgs,\n  NearestDatumReturnType,\n  SeriesProps,\n} from '../../../types';\nimport DataContext from '../../../context/DataContext';\nimport type { BaseAreaSeriesProps } from './BaseAreaSeries';\nimport { BaseGlyphSeries } from './BaseGlyphSeries';\nimport useStackedData from '../../../hooks/useStackedData';\nimport { getStackValue } from '../../../utils/combineBarStackData';\nimport isValidNumber from '../../../typeguards/isValidNumber';\nimport findNearestStackDatum from '../../../utils/findNearestStackDatum';\nimport { AREASTACK_EVENT_SOURCE, XYCHART_EVENT_SOURCE } from '../../../constants';\nimport useSeriesEvents from '../../../hooks/useSeriesEvents';\nimport defaultRenderGlyph from './defaultRenderGlyph';\nimport getScaleBandwidth from '../../../utils/getScaleBandwidth';\n\ntype AreaStackChildProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = Omit<BaseAreaSeriesProps<XScale, YScale, Datum>, 'PathComponent' | 'curve'>;\n\nexport type BaseAreaStackProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = {\n  /** `AreaSeries` elements, note we can't strictly enforce this with TS yet. */\n  children:\n    | ReactElement<AreaStackChildProps<XScale, YScale, Datum>>\n    | ReactElement<AreaStackChildProps<XScale, YScale, Datum>>[];\n  /** Rendered component which is passed path props by BaseAreaStack after processing. */\n  PathComponent?: FC<Omit<SVGProps<SVGPathElement>, 'ref'>> | 'path';\n  /** Sets the curve factory (from @visx/curve or d3-curve) for the line generator. Defaults to curveLinear. */\n  curve?: AreaProps<Datum>['curve'];\n  /** Whether to render a Line along value of the Area shape (area is fill only). */\n  renderLine?: boolean;\n} & Pick<StackPathConfig<Datum, string>, 'offset' | 'order'> &\n  Pick<\n    SeriesProps<XScale, YScale, Datum>,\n    | 'onPointerMove'\n    | 'onPointerOut'\n    | 'onPointerUp'\n    | 'onPointerDown'\n    | 'onBlur'\n    | 'onFocus'\n    | 'enableEvents'\n  >;\n\nconst identity = (_: unknown) => _;\n\nfunction BaseAreaStack<XScale extends AxisScale, YScale extends AxisScale, Datum extends object>({\n  PathComponent = 'path',\n  children,\n  curve,\n  enableEvents = true,\n  offset,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  order,\n  renderLine = true,\n}: BaseAreaStackProps<XScale, YScale, Datum>) {\n  type AreaStackDatum = SeriesPoint<CombinedStackData<XScale, YScale>>;\n\n  const { colorScale, dataRegistry, horizontal, xScale, yScale, theme } = useContext(\n    DataContext,\n  ) as unknown as DataContextType<XScale, YScale, AreaStackDatum>;\n\n  const { dataKeys, seriesChildren, stackedData } = useStackedData<\n    XScale,\n    YScale,\n    Datum,\n    BaseAreaSeriesProps<XScale, YScale, Datum>\n  >({\n    children,\n    order,\n    offset,\n  });\n\n  // accessor functions for the stack generator\n  const accessors = useMemo(() => {\n    const xOffset = getScaleBandwidth(xScale) / 2;\n    const yOffset = getScaleBandwidth(yScale) / 2;\n\n    return horizontal\n      ? {\n          y: (d: AreaStackDatum) => (coerceNumber(yScale(getStackValue(d.data))) ?? 0) + yOffset,\n          x0: (d: AreaStackDatum) => (coerceNumber(xScale(getFirstItem(d))) ?? 0) + xOffset,\n          x1: (d: AreaStackDatum) => (coerceNumber(xScale(getSecondItem(d))) ?? 0) + xOffset,\n          defined: (d: AreaStackDatum) =>\n            isValidNumber(yScale(getStackValue(d.data))) && isValidNumber(xScale(getSecondItem(d))),\n        }\n      : {\n          x: (d: AreaStackDatum) => (coerceNumber(xScale(getStackValue(d.data))) ?? 0) + xOffset,\n          y0: (d: AreaStackDatum) => (coerceNumber(yScale(getFirstItem(d))) ?? 0) + yOffset,\n          y1: (d: AreaStackDatum) => (coerceNumber(yScale(getSecondItem(d))) ?? 0) + yOffset,\n          defined: (d: AreaStackDatum) =>\n            isValidNumber(xScale(getStackValue(d.data))) && isValidNumber(yScale(getSecondItem(d))),\n        };\n  }, [xScale, yScale, horizontal]);\n\n  // pull out all area + line props for each dataKey\n  const stacks = useMemo(\n    () =>\n      stackedData.map((stack, stackIndex) => {\n        const areaSeries: ReactElement<BaseAreaSeriesProps<XScale, YScale, Datum>> | undefined =\n          seriesChildren.find((child) => child.props.dataKey === stack.key);\n        const {\n          data,\n          dataKey,\n          xAccessor,\n          yAccessor,\n          curve: _,\n          PathComponent: __,\n          lineProps,\n          renderLine: ___,\n          ...svgPathProps\n        } = areaSeries?.props || {};\n\n        const areaProps: SVGProps<SVGPathElement> = {\n          fill: colorScale?.(stack.key) ?? theme?.colors?.[0] ?? '#222',\n          ...svgPathProps,\n        };\n\n        return {\n          key: `${stackIndex}-${stack.key}`,\n          accessors,\n          data: stack,\n          areaProps,\n          lineProps,\n        };\n      }),\n    [stackedData, accessors, colorScale, seriesChildren, theme],\n  );\n\n  // custom logic to find the nearest AreaStackDatum (context) and return the original Datum (props)\n  const findNearestDatum = useCallback(\n    (params: NearestDatumArgs<XScale, YScale, AreaStackDatum>): NearestDatumReturnType<Datum> => {\n      const childData = seriesChildren.find((child) => child.props.dataKey === params.dataKey)\n        ?.props?.data;\n      return childData ? findNearestStackDatum(params, childData, horizontal) : null;\n    },\n    [seriesChildren, horizontal],\n  );\n\n  const ownEventSourceKey = `${AREASTACK_EVENT_SOURCE}-${dataKeys.join('-')}`;\n  const eventEmitters = useSeriesEvents<XScale, YScale, Datum>({\n    dataKey: dataKeys,\n    enableEvents,\n    // @ts-expect-error Datum input + return type are expected to be the same type but they differ\n    // for AreaStack (registry data is StackedDatum, return type is user Datum)\n    findNearestDatum,\n    onBlur,\n    onFocus,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    source: ownEventSourceKey,\n    allowedSources: [XYCHART_EVENT_SOURCE, ownEventSourceKey],\n  });\n\n  // render invisible glyphs for focusing if onFocus/onBlur are defined\n  const captureFocusEvents = Boolean(onFocus || onBlur);\n  const renderGlyphs = useCallback(\n    ({ glyphs }: GlyphsProps<XScale, YScale, AreaStackDatum>) =>\n      captureFocusEvents\n        ? glyphs.map((glyph) => (\n            <Fragment key={glyph.key}>\n              {defaultRenderGlyph({\n                ...glyph,\n                color: 'transparent',\n                onFocus: eventEmitters.onFocus,\n                onBlur: eventEmitters.onBlur,\n              })}\n            </Fragment>\n          ))\n        : null,\n    [captureFocusEvents, eventEmitters.onFocus, eventEmitters.onBlur],\n  );\n\n  // if scales and data are not available in the registry, bail\n  if (dataKeys.some((key) => dataRegistry.get(key) == null) || !xScale || !yScale || !colorScale) {\n    return null;\n  }\n\n  return (\n    <g className=\"visx-area-stack\">\n      {stacks.map((stack) => (\n        <Area key={stack.key} curve={curve} {...stack.accessors}>\n          {({ path }) => (\n            <PathComponent\n              className=\"visx-area\"\n              stroke=\"transparent\"\n              d={path(stack.data) || ''}\n              {...stack.areaProps}\n              {...eventEmitters}\n            />\n          )}\n        </Area>\n      ))}\n      {renderLine &&\n        stacks.map((stack) => (\n          <LinePath<AreaStackDatum>\n            key={`line-${stack.key}`}\n            // note: this currently doesn't work well for offset=wiggle\n            // because it only draws a single line. with two lines you\n            // get overlap across stacks :/\n            x={stack.accessors.x || stack.accessors.x1}\n            y={stack.accessors.y || stack.accessors.y1}\n            defined={stack.accessors.defined}\n            curve={curve}\n            {...stack.lineProps}\n          >\n            {({ path }) => (\n              <PathComponent\n                className=\"visx-line\"\n                fill=\"transparent\"\n                stroke={stack.areaProps.fill}\n                strokeWidth={2}\n                pointerEvents=\"none\"\n                {...stack.lineProps}\n                d={path(stack.data) || ''}\n              />\n            )}\n          </LinePath>\n        ))}\n      {captureFocusEvents &&\n        stacks.map((_, i) => {\n          // render in reverse stack order tab to top-values first\n          const stack: (typeof stacks)[number] = stacks[stacks.length - i - 1];\n          return (\n            <BaseGlyphSeries<any, any, AreaStackDatum>\n              key={`glyphs-${stack.key}`}\n              dataKey={stack.key}\n              data={stack.data}\n              xAccessor={stack.accessors.x || stack.accessors.x1}\n              yAccessor={stack.accessors.y || stack.accessors.y1}\n              // accessors include scaling, so just return the scaled value\n              xScale={identity}\n              yScale={identity}\n              renderGlyphs={renderGlyphs}\n            />\n          );\n        })}\n    </g>\n  );\n}\n\nexport default BaseAreaStack;\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/BaseBarGroup.tsx",
    "content": "import { useContext, useMemo, useEffect, useCallback } from 'react';\nimport type { ReactElement, ReactNode, FC } from 'react';\nimport type { PositionScale } from '@visx/shape';\nimport { scaleBand } from '@visx/scale';\nimport type { BaseBarSeriesProps } from './BaseBarSeries';\nimport type {\n  Bar,\n  BarsProps,\n  DataContextType,\n  NearestDatumArgs,\n  NearestDatumReturnType,\n  SeriesProps,\n} from '../../../types';\nimport DataContext from '../../../context/DataContext';\nimport getScaleBandwidth from '../../../utils/getScaleBandwidth';\nimport getScaleBaseline from '../../../utils/getScaleBaseline';\nimport isValidNumber from '../../../typeguards/isValidNumber';\nimport { BARGROUP_EVENT_SOURCE, XYCHART_EVENT_SOURCE } from '../../../constants';\nimport useSeriesEvents from '../../../hooks/useSeriesEvents';\nimport findNearestGroupDatum from '../../../utils/findNearestGroupDatum';\nimport getChildrenAndGrandchildrenWithProps from '../../../utils/getChildrenAndGrandchildrenWithProps';\n\nexport type BaseBarGroupProps<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n> = {\n  /** `BarSeries` elements */\n  children: ReactNode;\n  /** Group band scale padding, [0, 1] where 0 = no padding, 1 = no bar. */\n  padding?: number;\n  /** Comparator function to sort `dataKeys` within a bar group. By default the DOM rendering order of `BarGroup`s `children` is used. */\n  sortBars?: (dataKeyA: string, dataKeyB: string) => number;\n  /** Rendered component which is passed BarsProps by BaseBarGroup after processing. */\n  BarsComponent: FC<BarsProps<XScale, YScale>>;\n} & Pick<\n  SeriesProps<XScale, YScale, Datum>,\n  | 'onPointerMove'\n  | 'onPointerOut'\n  | 'onPointerUp'\n  | 'onPointerDown'\n  | 'onBlur'\n  | 'onFocus'\n  | 'enableEvents'\n>;\n\nexport default function BaseBarGroup<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n>({\n  children,\n  padding = 0.1,\n  sortBars,\n  BarsComponent,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  enableEvents = true,\n}: BaseBarGroupProps<XScale, YScale, Datum>) {\n  const { colorScale, dataRegistry, horizontal, registerData, unregisterData, xScale, yScale } =\n    useContext(DataContext) as unknown as DataContextType<XScale, YScale, Datum>;\n\n  const barSeriesChildren = useMemo(\n    () => getChildrenAndGrandchildrenWithProps<BaseBarSeriesProps<XScale, YScale, Datum>>(children),\n    [children],\n  );\n\n  // extract data keys from child series\n  const dataKeys: string[] = useMemo(\n    () => barSeriesChildren.map((child) => child.props.dataKey ?? '').filter((key) => key),\n    [barSeriesChildren],\n  );\n\n  // register all child data\n  useEffect(() => {\n    const dataToRegister = barSeriesChildren.map((child) => {\n      const { dataKey: key, data, xAccessor, yAccessor } = child.props;\n      return { key, data, xAccessor, yAccessor };\n    });\n\n    registerData(dataToRegister);\n    return () => unregisterData(dataKeys);\n  }, [registerData, unregisterData, barSeriesChildren, dataKeys]);\n\n  // create group scale\n  const groupScale = useMemo(\n    () =>\n      scaleBand<string>({\n        domain: sortBars ? [...dataKeys].sort(sortBars) : dataKeys,\n        range: [0, getScaleBandwidth(horizontal ? yScale : xScale)],\n        padding,\n      }),\n    [sortBars, dataKeys, xScale, yScale, horizontal, padding],\n  );\n\n  const findNearestDatum = useCallback(\n    (params: NearestDatumArgs<XScale, YScale, Datum>): NearestDatumReturnType<Datum> =>\n      findNearestGroupDatum(params, groupScale, horizontal),\n    [groupScale, horizontal],\n  );\n\n  const ownEventSourceKey = `${BARGROUP_EVENT_SOURCE}-${dataKeys.join('-')}}`;\n  const eventEmitters = useSeriesEvents<XScale, YScale, Datum>({\n    dataKey: dataKeys,\n    enableEvents,\n    findNearestDatum,\n    onBlur,\n    onFocus,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    source: ownEventSourceKey,\n    allowedSources: [XYCHART_EVENT_SOURCE, ownEventSourceKey],\n  });\n\n  const xZeroPosition = useMemo(() => (xScale ? getScaleBaseline(xScale) : 0), [xScale]);\n  const yZeroPosition = useMemo(() => (yScale ? getScaleBaseline(yScale) : 0), [yScale]);\n\n  const registryEntries = dataKeys.map((key) => dataRegistry.get(key));\n\n  // if scales and data are not available in the registry, bail\n  if (registryEntries.some((entry) => entry == null) || !xScale || !yScale || !colorScale) {\n    return null;\n  }\n\n  const barThickness = getScaleBandwidth(groupScale);\n\n  const barSeries = registryEntries.map(({ xAccessor, yAccessor, data, key }) => {\n    const getLength = (d: Datum) =>\n      horizontal\n        ? (xScale(xAccessor(d)) ?? NaN) - xZeroPosition\n        : (yScale(yAccessor(d)) ?? NaN) - yZeroPosition;\n\n    const getGroupPosition = horizontal\n      ? (d: Datum) => yScale(yAccessor(d)) ?? NaN\n      : (d: Datum) => xScale(xAccessor(d)) ?? NaN;\n\n    const withinGroupPosition = groupScale(key) ?? 0;\n\n    const getX = horizontal\n      ? (d: Datum) => xZeroPosition + Math.min(0, getLength(d))\n      : (d: Datum) => getGroupPosition(d) + withinGroupPosition;\n\n    const getY = horizontal\n      ? (d: Datum) => getGroupPosition(d) + withinGroupPosition\n      : (d: Datum) => yZeroPosition + Math.min(0, getLength(d));\n\n    const getWidth = horizontal ? (d: Datum) => Math.abs(getLength(d)) : () => barThickness;\n    const getHeight = horizontal ? () => barThickness : (d: Datum) => Math.abs(getLength(d));\n    // get props from child BarSeries, if available\n    const childBarSeries: ReactElement<BaseBarSeriesProps<XScale, YScale, Datum>> | undefined =\n      barSeriesChildren.find((child) => child.props.dataKey === key);\n    const { colorAccessor, radius, radiusAll, radiusBottom, radiusLeft, radiusRight, radiusTop } =\n      childBarSeries?.props || {};\n\n    return {\n      key,\n      radius,\n      radiusAll,\n      radiusBottom,\n      radiusLeft,\n      radiusRight,\n      radiusTop,\n      bars: data\n        .map((bar, index) => {\n          const barX = getX(bar);\n          if (!isValidNumber(barX)) return null;\n          const barY = getY(bar);\n          if (!isValidNumber(barY)) return null;\n          const barWidth = getWidth(bar);\n          if (!isValidNumber(barWidth)) return null;\n          const barHeight = getHeight(bar);\n          if (!isValidNumber(barHeight)) return null;\n\n          return {\n            key: `${key}-${index}`,\n            x: barX,\n            y: barY,\n            width: barWidth,\n            height: barHeight,\n            fill: colorAccessor?.(bar, index) ?? colorScale(key),\n          };\n        })\n        .filter((bar) => bar) as Bar[],\n    };\n  });\n\n  return (\n    <g className=\"visx-bar-group\">\n      {barSeries.map(\n        (series) =>\n          series && (\n            <BarsComponent\n              horizontal={horizontal}\n              xScale={xScale}\n              yScale={yScale}\n              {...series}\n              {...eventEmitters}\n              key={series.key}\n            />\n          ),\n      )}\n    </g>\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/BaseBarSeries.tsx",
    "content": "import { useContext, useEffect, useMemo } from 'react';\nimport type { FC } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport DataContext from '../../../context/DataContext';\nimport type { Bar, BarsProps, DataContextType, SeriesProps } from '../../../types';\nimport getScaledValueFactory from '../../../utils/getScaledValueFactory';\nimport getScaleBandwidth from '../../../utils/getScaleBandwidth';\nimport getScaleBaseline from '../../../utils/getScaleBaseline';\nimport isValidNumber from '../../../typeguards/isValidNumber';\nimport { BARSERIES_EVENT_SOURCE, XYCHART_EVENT_SOURCE } from '../../../constants';\nimport useSeriesEvents from '../../../hooks/useSeriesEvents';\n\nexport type BaseBarSeriesProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = SeriesProps<XScale, YScale, Datum> & {\n  /** Rendered component which is passed BarsProps by BaseBarSeries after processing. */\n  BarsComponent: FC<BarsProps<XScale, YScale>>;\n  /**\n   * Specify bar padding when bar thickness does not come from a `band` scale.\n   * Accepted values are [0, 1], 0 = no padding, 1 = no bar, defaults to 0.1.\n   */\n  barPadding?: number;\n  /** Given a Datum, returns its color. Falls back to theme color if unspecified or if a null-ish value is returned. */\n  colorAccessor?: (d: Datum, index: number) => string | null | undefined;\n} & Pick<\n    BarsProps<XScale, YScale>,\n    'radius' | 'radiusAll' | 'radiusTop' | 'radiusRight' | 'radiusBottom' | 'radiusLeft'\n  >;\n\n// Fallback bandwidth estimate assumes no missing data values (divides chart space by # datum)\nconst getFallbackBandwidth = (fullBarWidth: number, barPadding: number) =>\n  // clamp padding to [0, 1], bar thickness = (1-padding) * availableSpace\n  fullBarWidth * (1 - Math.min(1, Math.max(0, barPadding)));\n\nfunction BaseBarSeries<XScale extends AxisScale, YScale extends AxisScale, Datum extends object>({\n  BarsComponent,\n  barPadding = 0.1,\n  colorAccessor,\n  data,\n  dataKey,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  enableEvents = true,\n  xAccessor,\n  xScale,\n  yAccessor,\n  yScale,\n  ...barComponentProps\n}: BaseBarSeriesProps<XScale, YScale, Datum> &\n  Pick<DataContextType<XScale, YScale, Datum>, 'xScale' | 'yScale'>) {\n  const {\n    colorScale,\n    horizontal,\n    theme,\n    innerWidth = 0,\n    innerHeight = 0,\n  } = useContext(DataContext);\n  const getScaledX = useMemo(() => getScaledValueFactory(xScale, xAccessor), [xScale, xAccessor]);\n  const getScaledY = useMemo(() => getScaledValueFactory(yScale, yAccessor), [yScale, yAccessor]);\n  const scaleBandwidth = getScaleBandwidth(horizontal ? yScale : xScale);\n  const barThickness =\n    scaleBandwidth ||\n    getFallbackBandwidth((horizontal ? innerHeight : innerWidth) / data.length, barPadding);\n\n  const xZeroPosition = useMemo(() => (xScale ? getScaleBaseline(xScale) : 0), [xScale]);\n  const yZeroPosition = useMemo(() => (yScale ? getScaleBaseline(yScale) : 0), [yScale]);\n\n  const color = colorScale?.(dataKey) ?? theme?.colors?.[0] ?? '#222';\n\n  const bars = useMemo(() => {\n    const xOffset = horizontal ? 0 : -barThickness / 2;\n    const yOffset = horizontal ? -barThickness / 2 : 0;\n    return data\n      .map((datum, index) => {\n        const x = getScaledX(datum) + xOffset;\n        if (!isValidNumber(x)) return null;\n        const y = getScaledY(datum) + yOffset;\n        if (!isValidNumber(y)) return null;\n        const barLength = horizontal ? x - xZeroPosition : y - yZeroPosition;\n        if (!isValidNumber(barLength)) return null;\n\n        return {\n          key: `${index}`,\n          x: horizontal ? xZeroPosition + Math.min(0, barLength) : x,\n          y: horizontal ? y : yZeroPosition + Math.min(0, barLength),\n          width: horizontal ? Math.abs(barLength) : barThickness,\n          height: horizontal ? barThickness : Math.abs(barLength),\n          fill: colorAccessor?.(datum, index) ?? color,\n        };\n      })\n      .filter((bar) => bar) as Bar[];\n  }, [\n    barThickness,\n    color,\n    colorAccessor,\n    data,\n    getScaledX,\n    getScaledY,\n    horizontal,\n    xZeroPosition,\n    yZeroPosition,\n  ]);\n\n  const ownEventSourceKey = `${BARSERIES_EVENT_SOURCE}-${dataKey}`;\n  const eventEmitters = useSeriesEvents<XScale, YScale, Datum>({\n    dataKey,\n    enableEvents,\n    onBlur,\n    onFocus,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    source: ownEventSourceKey,\n    allowedSources: [XYCHART_EVENT_SOURCE, ownEventSourceKey],\n  });\n\n  return (\n    <g className=\"vx-bar-series\">\n      <BarsComponent\n        bars={bars}\n        horizontal={horizontal}\n        xScale={xScale}\n        yScale={yScale}\n        {...eventEmitters}\n        {...barComponentProps}\n      />\n    </g>\n  );\n}\n\nexport default function BaseBarSeriesWithRegisteredData<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: BaseBarSeriesProps<XScale, YScale, Datum>) {\n  const { dataKey, data, xAccessor, yAccessor } = props;\n  const { xScale, yScale, dataRegistry } = useContext(DataContext) as unknown as DataContextType<\n    XScale,\n    YScale,\n    Datum\n  >;\n\n  useEffect(() => {\n    if (dataRegistry) dataRegistry.registerData({ key: dataKey, data, xAccessor, yAccessor });\n    return () => dataRegistry?.unregisterData(dataKey);\n  }, [dataRegistry, dataKey, data, xAccessor, yAccessor]);\n\n  const registryEntry = dataRegistry?.get(dataKey);\n\n  // if scales or data are not available in context, render nothing\n  if (!xScale || !yScale || !registryEntry) return null;\n\n  // otherwise pass props + over-write data/accessors\n  return (\n    <BaseBarSeries\n      {...props}\n      xScale={xScale}\n      yScale={yScale}\n      data={registryEntry.data}\n      xAccessor={registryEntry.xAccessor}\n      yAccessor={registryEntry.yAccessor}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/BaseBarStack.tsx",
    "content": "import { useContext, useCallback } from 'react';\nimport type { ReactElement, FC } from 'react';\nimport type { SeriesPoint } from '@visx/vendor/d3-shape';\nimport type { PositionScale, StackPathConfig } from '@visx/shape';\nimport { getFirstItem, getSecondItem, getBandwidth } from '@visx/shape';\n\nimport type { BaseBarSeriesProps } from './BaseBarSeries';\nimport DataContext from '../../../context/DataContext';\nimport type {\n  Bar,\n  BarsProps,\n  BarStackDatum,\n  CombinedStackData,\n  DataContextType,\n  NearestDatumArgs,\n  NearestDatumReturnType,\n  SeriesProps,\n} from '../../../types';\nimport isValidNumber from '../../../typeguards/isValidNumber';\nimport { getStackValue } from '../../../utils/combineBarStackData';\nimport { BARSTACK_EVENT_SOURCE, XYCHART_EVENT_SOURCE } from '../../../constants';\nimport useSeriesEvents from '../../../hooks/useSeriesEvents';\nimport findNearestStackDatum from '../../../utils/findNearestStackDatum';\nimport useStackedData from '../../../hooks/useStackedData';\n\ntype BarStackChildProps<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n> = Omit<BaseBarSeriesProps<XScale, YScale, Datum>, 'BarsComponent'>;\n\nexport type BaseBarStackProps<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n> = {\n  /** `BarSeries` elements, note we can't strictly enforce this with TS yet. */\n  children:\n    | ReactElement<BarStackChildProps<XScale, YScale, Datum>>\n    | ReactElement<BarStackChildProps<XScale, YScale, Datum>>[];\n  /** Rendered component which is passed BarsProps by BaseBarStack after processing. */\n  BarsComponent: FC<BarsProps<XScale, YScale>>;\n} & Pick<StackPathConfig<Datum, string>, 'offset' | 'order'> &\n  Pick<\n    SeriesProps<XScale, YScale, Datum>,\n    | 'onPointerMove'\n    | 'onPointerOut'\n    | 'onPointerUp'\n    | 'onPointerDown'\n    | 'onBlur'\n    | 'onFocus'\n    | 'enableEvents'\n  >;\n\nfunction BaseBarStack<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n>({\n  children,\n  order,\n  offset,\n  BarsComponent,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  enableEvents = true,\n}: BaseBarStackProps<XScale, YScale, Datum>) {\n  type StackBar = SeriesPoint<CombinedStackData<XScale, YScale>>;\n\n  const { colorScale, dataRegistry, horizontal, xScale, yScale } = useContext(\n    DataContext,\n  ) as unknown as DataContextType<XScale, YScale, BarStackDatum<XScale, YScale>>;\n\n  const { seriesChildren, dataKeys, stackedData } = useStackedData<\n    XScale,\n    YScale,\n    Datum,\n    BaseBarSeriesProps<XScale, YScale, Datum>\n  >({\n    children,\n    order,\n    offset,\n  });\n\n  // custom logic to find the nearest AreaStackDatum (context) and return the original Datum (props)\n  const findNearestDatum = useCallback(\n    (\n      params: NearestDatumArgs<XScale, YScale, BarStackDatum<XScale, YScale>>,\n    ): NearestDatumReturnType<Datum> => {\n      const childData = seriesChildren.find((child) => child.props.dataKey === params.dataKey)\n        ?.props?.data;\n      return childData ? findNearestStackDatum(params, childData, horizontal) : null;\n    },\n    [seriesChildren, horizontal],\n  );\n\n  const ownEventSourceKey = `${BARSTACK_EVENT_SOURCE}-${dataKeys.join('-')}`;\n  const eventEmitters = useSeriesEvents<XScale, YScale, Datum>({\n    dataKey: dataKeys,\n    enableEvents,\n    // @ts-expect-error Datum input + return type are expected to be the same type but they differ for BarStack (registry data is StackedDatum, return type is user Datum)\n    findNearestDatum,\n    onBlur,\n    onFocus,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    source: ownEventSourceKey,\n    allowedSources: [XYCHART_EVENT_SOURCE, ownEventSourceKey],\n  });\n\n  const registryEntries = dataKeys.map((key) => dataRegistry.get(key));\n\n  // if scales and data are not available in the registry, bail\n  if (registryEntries.some((entry) => entry == null) || !xScale || !yScale || !colorScale) {\n    return null;\n  }\n\n  const barThickness = getBandwidth(horizontal ? yScale : xScale);\n  const halfBarThickness = barThickness / 2;\n\n  let getWidth: (bar: StackBar) => number | undefined;\n  let getHeight: (bar: StackBar) => number | undefined;\n  let getX: (bar: StackBar) => number | undefined;\n  let getY: (bar: StackBar) => number | undefined;\n\n  if (horizontal) {\n    getWidth = (bar) => (xScale(getSecondItem(bar)) ?? NaN) - (xScale(getFirstItem(bar)) ?? NaN);\n    getHeight = () => barThickness;\n    getX = (bar) => xScale(getFirstItem(bar));\n    getY = (bar) =>\n      'bandwidth' in yScale\n        ? yScale(getStackValue(bar.data))\n        : Math.max((yScale(getStackValue(bar.data)) ?? NaN) - halfBarThickness);\n  } else {\n    getWidth = () => barThickness;\n    getHeight = (bar) => (yScale(getFirstItem(bar)) ?? NaN) - (yScale(getSecondItem(bar)) ?? NaN);\n    getX = (bar) =>\n      'bandwidth' in xScale\n        ? xScale(getStackValue(bar.data))\n        : Math.max((xScale(getStackValue(bar.data)) ?? NaN) - halfBarThickness);\n    getY = (bar) => yScale(getSecondItem(bar));\n  }\n\n  const barSeries = stackedData\n    .map((barStack, stackIndex) => {\n      const entry = dataRegistry.get(barStack.key);\n      if (!entry) return null;\n\n      // get props from child BarSeries, if available\n      const childBarSeries: ReactElement<BaseBarSeriesProps<XScale, YScale, Datum>> | undefined =\n        seriesChildren.find((child) => child.props.dataKey === barStack.key);\n      const { colorAccessor, radius, radiusAll, radiusBottom, radiusLeft, radiusRight, radiusTop } =\n        childBarSeries?.props || {};\n\n      return {\n        key: barStack.key,\n        radius,\n        radiusAll,\n        radiusBottom,\n        radiusLeft,\n        radiusRight,\n        radiusTop,\n        bars: barStack\n          .map((bar, index) => {\n            const barX = getX(bar);\n            if (!isValidNumber(barX)) return null;\n            const barY = getY(bar);\n            if (!isValidNumber(barY)) return null;\n            const barWidth = getWidth(bar);\n            if (!isValidNumber(barWidth)) return null;\n            const barHeight = getHeight(bar);\n            if (!isValidNumber(barHeight)) return null;\n\n            const barSeriesDatum = colorAccessor ? childBarSeries?.props?.data[index] : null;\n\n            return {\n              key: `${stackIndex}-${barStack.key}-${index}`,\n              x: barX,\n              y: barY,\n              width: barWidth,\n              height: barHeight,\n              fill:\n                barSeriesDatum && colorAccessor\n                  ? colorAccessor(barSeriesDatum, index)\n                  : colorScale(barStack.key),\n            };\n          })\n          .filter((bar) => bar) as Bar[],\n      };\n    })\n    .filter((series) => series);\n\n  return (\n    <g className=\"visx-bar-stack\">\n      {barSeries.map(\n        (series) =>\n          series && (\n            <BarsComponent\n              horizontal={horizontal}\n              xScale={xScale}\n              yScale={yScale}\n              {...series}\n              {...eventEmitters}\n              key={series.key}\n            />\n          ),\n      )}\n    </g>\n  );\n}\n\nexport default BaseBarStack;\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/BaseGlyphSeries.tsx",
    "content": "import { useContext, useEffect, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport DataContext from '../../../context/DataContext';\nimport type { DataContextType, GlyphProps, GlyphsProps, SeriesProps } from '../../../types';\nimport getScaledValueFactory from '../../../utils/getScaledValueFactory';\nimport isValidNumber from '../../../typeguards/isValidNumber';\nimport { GLYPHSERIES_EVENT_SOURCE, XYCHART_EVENT_SOURCE } from '../../../constants';\nimport useSeriesEvents from '../../../hooks/useSeriesEvents';\n\nexport type BaseGlyphSeriesProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = SeriesProps<XScale, YScale, Datum> & {\n  /** Given a Datum, returns its color. Falls back to theme color if unspecified or if a null-ish value is returned. */\n  colorAccessor?: (d: Datum, index: number) => string | null | undefined;\n  /** The size of a `Glyph`, a `number` or a function which takes a `Datum` and returns a `number`. */\n  size?: number | ((d: Datum) => number);\n  /** Function which handles rendering glyphs. */\n  renderGlyphs: (glyphsProps: GlyphsProps<XScale, YScale, Datum>) => ReactNode;\n};\n\nexport function BaseGlyphSeries<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  colorAccessor,\n  data,\n  dataKey,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  enableEvents = true,\n  renderGlyphs,\n  size = 8,\n  xAccessor,\n  xScale,\n  yAccessor,\n  yScale,\n}: BaseGlyphSeriesProps<XScale, YScale, Datum> &\n  Pick<DataContextType<XScale, YScale, Datum>, 'xScale' | 'yScale'>) {\n  const { colorScale, theme, horizontal } = useContext(DataContext);\n  const getScaledX = useMemo(() => getScaledValueFactory(xScale, xAccessor), [xScale, xAccessor]);\n  const getScaledY = useMemo(() => getScaledValueFactory(yScale, yAccessor), [yScale, yAccessor]);\n  const color = colorScale?.(dataKey) ?? theme?.colors?.[0] ?? '#222';\n\n  const ownEventSourceKey = `${GLYPHSERIES_EVENT_SOURCE}-${dataKey}`;\n  const eventEmitters = useSeriesEvents<XScale, YScale, Datum>({\n    dataKey,\n    enableEvents,\n    onBlur,\n    onFocus,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    source: ownEventSourceKey,\n    allowedSources: [XYCHART_EVENT_SOURCE, ownEventSourceKey],\n  });\n\n  const glyphs = useMemo(\n    () =>\n      data\n        .map((datum, i) => {\n          const x = getScaledX(datum);\n          if (!isValidNumber(x)) return null;\n          const y = getScaledY(datum);\n          if (!isValidNumber(y)) return null;\n          return {\n            key: `${i}`,\n            x,\n            y,\n            color: colorAccessor?.(datum, i) ?? color,\n            size: typeof size === 'function' ? size(datum) : size,\n            datum,\n          };\n        })\n        .filter((point) => point) as GlyphProps<Datum>[],\n    [color, colorAccessor, data, getScaledX, getScaledY, size],\n  );\n\n  return <>{renderGlyphs({ glyphs, xScale, yScale, horizontal, ...eventEmitters })}</>;\n}\n\nexport default function BaseGlyphSeriesWithRegisteredData<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: BaseGlyphSeriesProps<XScale, YScale, Datum>) {\n  const { dataKey, data, xAccessor, yAccessor } = props;\n  const { xScale, yScale, dataRegistry } = useContext(DataContext) as unknown as DataContextType<\n    XScale,\n    YScale,\n    Datum\n  >;\n\n  useEffect(() => {\n    if (dataRegistry) dataRegistry.registerData({ key: dataKey, data, xAccessor, yAccessor });\n    return () => dataRegistry?.unregisterData(dataKey);\n  }, [dataRegistry, dataKey, data, xAccessor, yAccessor]);\n\n  const registryEntry = dataRegistry?.get(dataKey);\n\n  // if scales or data are not available in context, render nothing\n  if (!xScale || !yScale || !registryEntry) return null;\n\n  // otherwise pass props + over-write data/accessors\n  return (\n    <BaseGlyphSeries\n      {...props}\n      xScale={xScale}\n      yScale={yScale}\n      data={registryEntry.data}\n      xAccessor={registryEntry.xAccessor}\n      yAccessor={registryEntry.yAccessor}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/BaseLineSeries.tsx",
    "content": "import { Fragment, useContext, useCallback, useMemo, useEffect } from 'react';\nimport type { FC, SVGProps } from 'react';\nimport type { LinePathProps } from '@visx/shape';\nimport { LinePath } from '@visx/shape';\nimport type { AxisScale } from '@visx/axis';\nimport DataContext from '../../../context/DataContext';\nimport type { DataContextType, GlyphsProps, SeriesProps } from '../../../types';\nimport getScaledValueFactory from '../../../utils/getScaledValueFactory';\nimport isValidNumber from '../../../typeguards/isValidNumber';\nimport { LINESERIES_EVENT_SOURCE, XYCHART_EVENT_SOURCE } from '../../../constants';\nimport { BaseGlyphSeries } from './BaseGlyphSeries';\nimport defaultRenderGlyph from './defaultRenderGlyph';\nimport useSeriesEvents from '../../../hooks/useSeriesEvents';\n\nexport type BaseLineSeriesProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = SeriesProps<XScale, YScale, Datum> & {\n  /** Rendered component which is passed path props by BaseLineSeries after processing. */\n  PathComponent?: FC<Omit<SVGProps<SVGPathElement>, 'ref'>> | 'path';\n  /** Sets the curve factory (from @visx/curve or d3-curve) for the line generator. Defaults to curveLinear. */\n  curve?: LinePathProps<Datum>['curve'];\n  /** Given a datakey, returns its color. Falls back to theme color if unspecified or if a null-ish value is returned. */\n  colorAccessor?: (dataKey: string) => string | undefined | null;\n} & Omit<SVGProps<SVGPathElement>, 'x' | 'y' | 'x0' | 'x1' | 'y0' | 'y1' | 'ref'>;\n\nfunction BaseLineSeries<XScale extends AxisScale, YScale extends AxisScale, Datum extends object>({\n  colorAccessor,\n  curve,\n  data,\n  dataKey,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  enableEvents = true,\n  xAccessor,\n  xScale,\n  yAccessor,\n  yScale,\n  PathComponent = 'path',\n  ...lineProps\n}: BaseLineSeriesProps<XScale, YScale, Datum> &\n  Pick<DataContextType<XScale, YScale, Datum>, 'xScale' | 'yScale'>) {\n  const { colorScale, theme } = useContext(DataContext);\n  const getScaledX = useMemo(() => getScaledValueFactory(xScale, xAccessor), [xScale, xAccessor]);\n  const getScaledY = useMemo(() => getScaledValueFactory(yScale, yAccessor), [yScale, yAccessor]);\n  const isDefined = useCallback(\n    (d: Datum) => isValidNumber(xScale(xAccessor(d))) && isValidNumber(yScale(yAccessor(d))),\n    [xScale, xAccessor, yScale, yAccessor],\n  );\n  const color = colorScale?.(dataKey) ?? theme?.colors?.[0] ?? '#222';\n\n  const ownEventSourceKey = `${LINESERIES_EVENT_SOURCE}-${dataKey}`;\n  const eventEmitters = useSeriesEvents<XScale, YScale, Datum>({\n    dataKey,\n    enableEvents,\n    onBlur,\n    onFocus,\n    onPointerMove,\n    onPointerOut,\n    onPointerUp,\n    onPointerDown,\n    source: ownEventSourceKey,\n    allowedSources: [XYCHART_EVENT_SOURCE, ownEventSourceKey],\n  });\n\n  // render invisible glyphs for focusing if onFocus/onBlur are defined\n  const captureFocusEvents = Boolean(onFocus || onBlur);\n  const renderGlyphs = useCallback(\n    ({ glyphs }: GlyphsProps<XScale, YScale, Datum>) =>\n      captureFocusEvents\n        ? glyphs.map((glyph) => (\n            <Fragment key={glyph.key}>\n              {defaultRenderGlyph({\n                ...glyph,\n                color: 'transparent',\n                onFocus: eventEmitters.onFocus,\n                onBlur: eventEmitters.onBlur,\n              })}\n            </Fragment>\n          ))\n        : null,\n    [captureFocusEvents, eventEmitters.onFocus, eventEmitters.onBlur],\n  );\n\n  return (\n    <>\n      <LinePath x={getScaledX} y={getScaledY} defined={isDefined} curve={curve} {...lineProps}>\n        {({ path }) => (\n          <PathComponent\n            stroke={colorAccessor?.(dataKey) ?? color}\n            strokeWidth={2}\n            fill=\"transparent\"\n            strokeLinecap=\"round\" // without this a datum surrounded by nulls will not be visible\n            {...lineProps}\n            d={path(data) || ''}\n            {...eventEmitters}\n          />\n        )}\n      </LinePath>\n      {captureFocusEvents && (\n        <BaseGlyphSeries\n          dataKey={dataKey}\n          data={data}\n          xAccessor={xAccessor}\n          yAccessor={yAccessor}\n          xScale={xScale}\n          yScale={yScale}\n          renderGlyphs={renderGlyphs}\n        />\n      )}\n    </>\n  );\n}\n\nexport default function BaseBaseLineSeriesWithRegisteredData<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(props: BaseLineSeriesProps<XScale, YScale, Datum>) {\n  const { dataKey, data, xAccessor, yAccessor } = props;\n  const { xScale, yScale, dataRegistry } = useContext(DataContext) as unknown as DataContextType<\n    XScale,\n    YScale,\n    Datum\n  >;\n\n  useEffect(() => {\n    if (dataRegistry) dataRegistry.registerData({ key: dataKey, data, xAccessor, yAccessor });\n    return () => dataRegistry?.unregisterData(dataKey);\n  }, [dataRegistry, dataKey, data, xAccessor, yAccessor]);\n\n  const registryEntry = dataRegistry?.get(dataKey);\n\n  // if scales or data are not available in context, render nothing\n  if (!xScale || !yScale || !registryEntry) return null;\n\n  // otherwise pass props + over-write data/accessors\n  return (\n    <BaseLineSeries\n      {...props}\n      xScale={xScale}\n      yScale={yScale}\n      data={registryEntry.data}\n      xAccessor={registryEntry.xAccessor}\n      yAccessor={registryEntry.yAccessor}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/components/series/private/defaultRenderGlyph.tsx",
    "content": "import type { GlyphProps } from '../../../types';\n\nexport default function defaultRenderGlyph<Datum extends object>({\n  key,\n  color,\n  x,\n  y,\n  size,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n}: GlyphProps<Datum>) {\n  return (\n    <circle\n      className=\"visx-circle-glyph\"\n      key={key}\n      tabIndex={onBlur || onFocus ? 0 : undefined}\n      fill={color}\n      r={size / 2}\n      cx={x}\n      cy={y}\n      onBlur={onBlur}\n      onFocus={onFocus}\n      onPointerMove={onPointerMove}\n      onPointerOut={onPointerOut}\n      onPointerUp={onPointerUp}\n    />\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/constants.ts",
    "content": "// event sources\nexport const AREASERIES_EVENT_SOURCE = 'AREASERIES_EVENT_SOURCE';\nexport const AREASTACK_EVENT_SOURCE = 'AREASTACK_EVENT_SOURCE';\nexport const BARGROUP_EVENT_SOURCE = 'BARGROUP_EVENT_SOURCE';\nexport const BARSERIES_EVENT_SOURCE = 'BARSERIES_EVENT_SOURCE';\nexport const BARSTACK_EVENT_SOURCE = 'BARSTACK_EVENT_SOURCE';\nexport const GLYPHSERIES_EVENT_SOURCE = 'GLYPHSERIES_EVENT_SOURCE';\nexport const LINESERIES_EVENT_SOURCE = 'LINESERIES_EVENT_SOURCE';\nexport const XYCHART_EVENT_SOURCE = 'XYCHART_EVENT_SOURCE';\n"
  },
  {
    "path": "packages/visx-xychart/src/context/DataContext.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createContext } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport type { DataContextType } from '../types';\n\ntype AnyDataContext = DataContextType<AxisScale, AxisScale, any>;\n\n/** Utilities for inferring context generics */\nexport type InferXScaleConfig<X extends AnyDataContext> = X extends DataContextType<\n  infer T,\n  any,\n  any\n>\n  ? T\n  : AxisScale;\n\nexport type InferYScaleConfig<X extends AnyDataContext> = X extends DataContextType<\n  any,\n  infer T,\n  any\n>\n  ? T\n  : AxisScale;\n\nexport type InferDatum<X extends AnyDataContext> = X extends DataContextType<any, any, infer T>\n  ? T\n  : any;\n\nexport type InferDataContext<C extends AnyDataContext = AnyDataContext> = DataContextType<\n  InferXScaleConfig<C>,\n  InferYScaleConfig<C>,\n  InferDatum<C>\n>;\n\nconst DataContext = createContext<Partial<InferDataContext>>({});\n\nexport default DataContext;\n"
  },
  {
    "path": "packages/visx-xychart/src/context/EventEmitterContext.tsx",
    "content": "import { createContext } from 'react';\nimport type { EventEmitterContextType } from '../types';\n\nconst EventEmitterContext = createContext<EventEmitterContextType | null>(null);\n\nexport default EventEmitterContext;\n"
  },
  {
    "path": "packages/visx-xychart/src/context/ThemeContext.tsx",
    "content": "import { createContext } from 'react';\nimport type { XYChartTheme } from '../types';\nimport lightTheme from '../theme/themes/light';\n\nconst ThemeContext = createContext<XYChartTheme>(lightTheme);\n\nexport default ThemeContext;\n"
  },
  {
    "path": "packages/visx-xychart/src/context/TooltipContext.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { createContext } from 'react';\nimport type { TooltipContextType } from '../types';\n\nconst TooltipContext = createContext<TooltipContextType<any> | null>(null);\n\nexport default TooltipContext;\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useDataRegistry.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { useMemo, useState } from 'react';\nimport DataRegistry from '../classes/DataRegistry';\nimport type { DataContextType } from '../types';\n\n/** Hook that returns an API equivalent to DataRegistry but which updates as needed for use as a hook. */\nexport default function useDataRegistry<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(): DataContextType<XScale, YScale, Datum>['dataRegistry'] {\n  const [, forceUpdate] = useState(Math.random());\n  const privateRegistry = useMemo(() => new DataRegistry<XScale, YScale, Datum>(), []);\n\n  return useMemo(\n    () => ({\n      registerData: (\n        ...params: Parameters<\n          DataContextType<XScale, YScale, Datum>['dataRegistry']['registerData']\n        >\n      ) => {\n        privateRegistry.registerData(...params);\n        forceUpdate(Math.random());\n      },\n      unregisterData: (\n        ...params: Parameters<\n          DataContextType<XScale, YScale, Datum>['dataRegistry']['unregisterData']\n        >\n      ) => {\n        privateRegistry.unregisterData(...params);\n        forceUpdate(Math.random());\n      },\n      entries: () => privateRegistry.entries(),\n      get: (key: string) => privateRegistry.get(key),\n      keys: () => privateRegistry.keys(),\n    }),\n    [privateRegistry],\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useDimensions.ts",
    "content": "import { useCallback, useState } from 'react';\n\nconst DEFAULT_DIMS = {\n  width: 0,\n  height: 0,\n  margin: { top: 0, right: 0, bottom: 0, left: 0 },\n};\n\nexport type Dimensions = typeof DEFAULT_DIMS;\n\n/** A hook for accessing and setting memoized width, height, and margin chart dimensions. */\nexport default function useDimensions(\n  initialDims?: Partial<Dimensions>,\n): [Dimensions, (dims: Dimensions) => void] {\n  const [dimensions, privateSetDimensions] = useState<Dimensions>({\n    width: initialDims?.width == null ? DEFAULT_DIMS.width : initialDims.width,\n    height: initialDims?.height == null ? DEFAULT_DIMS.height : initialDims.height,\n    margin: initialDims?.margin == null ? DEFAULT_DIMS.margin : initialDims.margin,\n  });\n\n  // expose a setter with better memoization logic\n  const publicSetDimensions = useCallback(\n    (dims: Dimensions) => {\n      if (\n        dims.width !== dimensions.width ||\n        dims.height !== dimensions.height ||\n        dims.margin.left !== dimensions.margin.left ||\n        dims.margin.right !== dimensions.margin.right ||\n        dims.margin.top !== dimensions.margin.top ||\n        dims.margin.bottom !== dimensions.margin.bottom\n      ) {\n        privateSetDimensions(dims);\n      }\n    },\n    [\n      dimensions.width,\n      dimensions.height,\n      dimensions.margin.left,\n      dimensions.margin.right,\n      dimensions.margin.bottom,\n      dimensions.margin.top,\n    ],\n  );\n\n  return [dimensions, publicSetDimensions];\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useEventEmitter.ts",
    "content": "import type { PointerEvent, FocusEvent } from 'react';\nimport { useCallback, useContext, useEffect, useRef } from 'react';\nimport { localPoint } from '@visx/event';\nimport EventEmitterContext from '../context/EventEmitterContext';\n\nexport type EventType =\n  | 'pointermove'\n  | 'pointerout'\n  | 'pointerup'\n  | 'pointerdown'\n  | 'focus'\n  | 'blur';\n\nexport type HandlerParams = {\n  /** The react PointerEvent or FocusEvent. */\n  event: PointerEvent | FocusEvent;\n  /** Position of the PointerEvent in svg coordinates. */\n  svgPoint: ReturnType<typeof localPoint>;\n  /** The source of the event. This can be anything, but for this package is the name of the component which emitted the event. */\n  source?: string;\n};\n\nexport type Handler = (params?: HandlerParams) => void;\n\n/**\n * Hook for optionally subscribing to a specified EventType,\n * and returns emitter for emitting events.\n */\nexport default function useEventEmitter(\n  /** Type of event to subscribe to. */\n  eventType?: EventType,\n  /** Handler invoked on emission of EventType event.  */\n  handler?: Handler,\n  /** Optional valid sources for EventType subscription. */\n  allowedSources?: string[],\n) {\n  const emitter = useContext(EventEmitterContext);\n  const allowedSourcesRef = useRef<string[] | undefined>(undefined);\n  allowedSourcesRef.current = allowedSources; // use ref so allowedSources[] can change without creating new handlers\n\n  // wrap emitter.emit so we can enforce stricter type signature\n  const emit = useCallback(\n    (type: EventType, event: HandlerParams['event'], source?: string) => {\n      if (emitter) {\n        emitter.emit<HandlerParams>(type, { event, svgPoint: localPoint(event), source });\n      }\n    },\n    [emitter],\n  );\n\n  useEffect(() => {\n    if (emitter && eventType && handler) {\n      // register handler, with source filtering as needed\n      const handlerWithSourceFilter: Handler = (params?: HandlerParams) => {\n        if (\n          !allowedSourcesRef.current ||\n          (params?.source && allowedSourcesRef.current?.includes(params.source))\n        ) {\n          handler(params);\n        }\n      };\n      emitter.on<HandlerParams>(eventType, handlerWithSourceFilter);\n      return () => emitter?.off<HandlerParams>(eventType, handlerWithSourceFilter);\n    }\n    return undefined;\n  }, [emitter, eventType, handler]);\n\n  return emitter ? emit : null;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useEventEmitters.ts",
    "content": "import type { PointerEvent, FocusEvent } from 'react';\nimport { useCallback } from 'react';\nimport useEventEmitter from './useEventEmitter';\n\ntype PointerEventEmitterParams = {\n  /** Source of the events, e.g., the component name. */\n  source: string;\n  onBlur?: boolean;\n  onFocus?: boolean;\n  onPointerMove?: boolean;\n  onPointerOut?: boolean;\n  onPointerUp?: boolean;\n  onPointerDown?: boolean;\n};\n\n/**\n * A hook that simplifies creation of handlers for emitting\n * pointermove, pointerout, and pointerup events to EventEmitterContext.\n */\nexport default function usePointerEventEmitters({\n  source,\n  onPointerOut = true,\n  onPointerMove = true,\n  onPointerUp = true,\n  onPointerDown = true,\n  onFocus = false,\n  onBlur = false,\n}: PointerEventEmitterParams) {\n  const emit = useEventEmitter();\n\n  const emitPointerMove = useCallback(\n    (event: PointerEvent) => emit?.('pointermove', event, source),\n    [emit, source],\n  );\n  const emitPointerOut = useCallback(\n    (event: PointerEvent) => emit?.('pointerout', event, source),\n    [emit, source],\n  );\n  const emitPointerUp = useCallback(\n    (event: PointerEvent) => emit?.('pointerup', event, source),\n    [emit, source],\n  );\n  const emitPointerDown = useCallback(\n    (event: PointerEvent) => emit?.('pointerdown', event, source),\n    [emit, source],\n  );\n  const emitFocus = useCallback(\n    (event: FocusEvent) => emit?.('focus', event, source),\n    [emit, source],\n  );\n  const emitBlur = useCallback(\n    (event: FocusEvent) => emit?.('blur', event, source),\n    [emit, source],\n  );\n\n  return {\n    onPointerMove: onPointerMove ? emitPointerMove : undefined,\n    onFocus: onFocus ? emitFocus : undefined,\n    onBlur: onBlur ? emitBlur : undefined,\n    onPointerOut: onPointerOut ? emitPointerOut : undefined,\n    onPointerUp: onPointerUp ? emitPointerUp : undefined,\n    onPointerDown: onPointerDown ? emitPointerDown : undefined,\n  };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useEventHandlers.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { PointerEvent, FocusEvent } from 'react';\nimport { useCallback, useContext } from 'react';\nimport DataContext from '../context/DataContext';\nimport { isFocusEvent, isPointerEvent } from '../typeguards/events';\nimport type {\n  DataContextType,\n  EventHandlerParams,\n  NearestDatumArgs,\n  NearestDatumReturnType,\n} from '../types';\nimport findNearestDatumX from '../utils/findNearestDatumX';\nimport findNearestDatumY from '../utils/findNearestDatumY';\nimport type { HandlerParams } from './useEventEmitter';\nimport useEventEmitter from './useEventEmitter';\n\nexport const POINTER_EVENTS_ALL = '__POINTER_EVENTS_ALL';\nexport const POINTER_EVENTS_NEAREST = '__POINTER_EVENTS_NEAREST';\n\nexport type PointerEventHandlerParams<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = {\n  /** Controls whether callbacks are invoked for one or more registered dataKeys, the nearest dataKey, or all dataKeys. */\n  dataKey: string | string[] | typeof POINTER_EVENTS_NEAREST | typeof POINTER_EVENTS_ALL; // last two are eaten by string\n  /** Optionally override the findNearestDatum logic. */\n  findNearestDatum?: (\n    params: NearestDatumArgs<XScale, YScale, Datum>,\n  ) => NearestDatumReturnType<Datum>;\n  /** Callback invoked onFocus for one or more series based on dataKey. */\n  onFocus?: (params: EventHandlerParams<Datum>) => void;\n  /** Callback invoked onBlur. */\n  onBlur?: (event: FocusEvent) => void;\n  /** Callback invoked onPointerMove for one or more series based on dataKey. */\n  onPointerMove?: (params: EventHandlerParams<Datum>) => void;\n  /** Callback invoked onPointerOut. */\n  onPointerOut?: (event: PointerEvent) => void;\n  /** Callback invoked onPointerUp for one or more series based on dataKey. */\n  onPointerUp?: (params: EventHandlerParams<Datum>) => void;\n  /** Callback invoked onPointerDown for one or more series based on dataKey. */\n  onPointerDown?: (params: EventHandlerParams<Datum>) => void;\n  /** Valid event sources for which to invoke handlers. */\n  allowedSources?: string[];\n};\n\n/**\n * Hook that returns PointerEvent handlers that invoke the passed pointer\n * handlers with the nearest datum to the event for the passed dataKey.\n */\nexport default function usePointerEventHandlers<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  dataKey,\n  findNearestDatum: findNearestDatumProps,\n  onBlur,\n  onFocus,\n  onPointerMove,\n  onPointerOut,\n  onPointerUp,\n  onPointerDown,\n  allowedSources,\n}: PointerEventHandlerParams<XScale, YScale, Datum>) {\n  const { width, height, horizontal, dataRegistry, xScale, yScale } = useContext(\n    DataContext,\n  ) as unknown as DataContextType<XScale, YScale, Datum>;\n\n  const findNearestDatum =\n    findNearestDatumProps || (horizontal ? findNearestDatumY : findNearestDatumX);\n\n  // this logic is shared by pointerup, pointermove, and focus handlers\n  const getHandlerParams = useCallback(\n    (params?: HandlerParams) => {\n      const { svgPoint, event } = params || {};\n      const pointerParamsByKey: { [dataKey: string]: EventHandlerParams<Datum> } = {};\n\n      // nearest Datum across all dataKeys, if relevant\n      let nearestDatumPointerParams: EventHandlerParams<Datum> | null = null;\n      let nearestDatumDistance = Infinity;\n\n      if (params && event && svgPoint && width && height) {\n        const considerAllKeys =\n          dataKey === POINTER_EVENTS_NEAREST || dataKey === POINTER_EVENTS_ALL;\n\n        const dataKeys = considerAllKeys\n          ? dataRegistry?.keys() ?? []\n          : Array.isArray(dataKey)\n          ? dataKey\n          : [dataKey];\n\n        // find nearestDatum for relevant dataKey(s)\n        dataKeys.forEach((key) => {\n          const entry = dataRegistry?.get(key);\n          if (entry) {\n            const nearestDatum = findNearestDatum({\n              dataKey: key,\n              data: entry.data,\n              height,\n              point: svgPoint,\n              width,\n              xAccessor: entry.xAccessor,\n              xScale,\n              yAccessor: entry.yAccessor,\n              yScale,\n            });\n\n            if (nearestDatum) {\n              pointerParamsByKey[key] = { key, svgPoint, event, ...nearestDatum };\n\n              // compute nearest Datum if not emitting events for all keys\n              if (dataKey === POINTER_EVENTS_NEAREST) {\n                const distance = Math.sqrt(\n                  (nearestDatum.distanceX ?? Infinity ** 2) +\n                    (nearestDatum.distanceY ?? Infinity ** 2),\n                );\n                nearestDatumPointerParams =\n                  distance < nearestDatumDistance\n                    ? pointerParamsByKey[key]\n                    : nearestDatumPointerParams;\n                nearestDatumDistance = Math.min(nearestDatumDistance, distance);\n              }\n            }\n          }\n        });\n\n        const pointerParams: (EventHandlerParams<Datum> | null)[] =\n          dataKey === POINTER_EVENTS_NEAREST\n            ? [nearestDatumPointerParams]\n            : dataKey === POINTER_EVENTS_ALL || Array.isArray(dataKey)\n            ? Object.values(pointerParamsByKey)\n            : [pointerParamsByKey[dataKey]];\n\n        return pointerParams.filter((param) => param) as EventHandlerParams<Datum>[];\n      }\n      return [];\n    },\n    [dataKey, dataRegistry, xScale, yScale, width, height, findNearestDatum],\n  );\n  const handlePointerMove = useCallback(\n    (params?: HandlerParams) => {\n      if (onPointerMove) {\n        getHandlerParams(params).forEach((p) => onPointerMove(p));\n      }\n    },\n    [getHandlerParams, onPointerMove],\n  );\n  const handlePointerUp = useCallback(\n    (params?: HandlerParams) => {\n      if (onPointerUp) {\n        getHandlerParams(params).forEach((p) => onPointerUp(p));\n      }\n    },\n    [getHandlerParams, onPointerUp],\n  );\n  const handlePointerDown = useCallback(\n    (params?: HandlerParams) => {\n      if (onPointerDown) {\n        getHandlerParams(params).forEach((p) => onPointerDown(p));\n      }\n    },\n    [getHandlerParams, onPointerDown],\n  );\n  const handleFocus = useCallback(\n    (params?: HandlerParams) => {\n      if (onFocus) {\n        getHandlerParams(params).forEach((p) => onFocus(p));\n      }\n    },\n    [getHandlerParams, onFocus],\n  );\n  const handlePointerOut = useCallback(\n    (params?: HandlerParams) => {\n      const event = params?.event;\n      if (event && isPointerEvent(event) && onPointerOut) onPointerOut(event);\n    },\n    [onPointerOut],\n  );\n  const handleBlur = useCallback(\n    (params?: HandlerParams) => {\n      const event = params?.event;\n      if (event && isFocusEvent(event) && onBlur) onBlur(event);\n    },\n    [onBlur],\n  );\n\n  useEventEmitter('pointermove', onPointerMove ? handlePointerMove : undefined, allowedSources);\n  useEventEmitter('pointerout', onPointerOut ? handlePointerOut : undefined, allowedSources);\n  useEventEmitter('pointerup', onPointerUp ? handlePointerUp : undefined, allowedSources);\n  useEventEmitter('pointerdown', onPointerDown ? handlePointerDown : undefined, allowedSources);\n  useEventEmitter('focus', onFocus ? handleFocus : undefined, allowedSources);\n  useEventEmitter('blur', onBlur ? handleBlur : undefined, allowedSources);\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useScales.ts",
    "content": "import type { AxisScaleOutput, AxisScale } from '@visx/axis';\nimport type { ScaleConfig, ScaleInput } from '@visx/scale';\nimport { createScale, scaleCanBeZeroed } from '@visx/scale';\nimport { extent as d3Extent } from '@visx/vendor/d3-array';\nimport { useMemo } from 'react';\nimport type DataRegistry from '../classes/DataRegistry';\nimport isDiscreteScale from '../utils/isDiscreteScale';\n\n/** A hook for creating memoized x- and y-scales. */\nexport default function useScales<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  dataRegistry,\n  xRange,\n  xScaleConfig,\n  yRange,\n  yScaleConfig,\n}: {\n  xScaleConfig: ScaleConfig<AxisScaleOutput>;\n  yScaleConfig: ScaleConfig<AxisScaleOutput>;\n  dataRegistry: Omit<DataRegistry<XScale, YScale, Datum>, 'registry' | 'registryKeys'>;\n  xRange: [number, number];\n  yRange: [number, number];\n}) {\n  // pull out memoization keys that are less likely to change\n  const registryKeys = dataRegistry.keys();\n  const [xMin, xMax] = xRange;\n  const [yMin, yMax] = yRange;\n\n  const memoizedXScale = useMemo(() => {\n    const registryEntries = registryKeys.map((key) => dataRegistry.get(key));\n\n    type XScaleInput = ScaleInput<XScale>;\n\n    const xValues = registryEntries.reduce<XScaleInput[]>(\n      (combined, entry) =>\n        entry ? combined.concat(entry.data.map((d: Datum) => entry.xAccessor(d))) : combined,\n      [],\n    );\n\n    // d3Extent scale returns NaN domain for empty arrays\n    if (xValues.length === 0) return undefined;\n\n    const xDomain = isDiscreteScale(xScaleConfig) ? xValues : d3Extent(xValues);\n\n    let xScale = (\n      scaleCanBeZeroed(xScaleConfig)\n        ? createScale({\n            range: [xMin, xMax],\n            domain: xDomain as [XScaleInput, XScaleInput],\n            zero: true,\n            ...xScaleConfig,\n          })\n        : createScale({\n            range: [xMin, xMax],\n            domain: xDomain as [XScaleInput, XScaleInput],\n            ...xScaleConfig,\n          })\n    ) as XScale;\n\n    // apply any scale updates from the registry\n    registryEntries.forEach((entry) => {\n      if (entry?.xScale) xScale = entry.xScale(xScale);\n    });\n\n    return xScale;\n  }, [dataRegistry, xScaleConfig, registryKeys, xMin, xMax]);\n\n  // same for yScale. this logic is hard to apply generically because of the scale types / accessors\n  const memoizedYScale = useMemo(() => {\n    const registryEntries = registryKeys.map((key) => dataRegistry.get(key));\n\n    type YScaleInput = ScaleInput<YScale>;\n\n    const yValues = registryEntries.reduce<YScaleInput[]>(\n      (combined, entry) =>\n        entry ? combined.concat(entry.data.map((d: Datum) => entry.yAccessor(d))) : combined,\n      [],\n    );\n\n    // d3Extent scale returns NaN domain for empty arrays\n    if (yValues.length === 0) return undefined;\n\n    const yDomain = isDiscreteScale(yScaleConfig) ? yValues : d3Extent(yValues);\n\n    let yScale = (\n      scaleCanBeZeroed(yScaleConfig)\n        ? createScale({\n            range: [yMin, yMax],\n            domain: yDomain as [YScaleInput, YScaleInput],\n            zero: true,\n            ...yScaleConfig,\n          })\n        : createScale({\n            range: [yMin, yMax],\n            domain: yDomain as [YScaleInput, YScaleInput],\n            ...yScaleConfig,\n          })\n    ) as YScale;\n\n    // apply any scale updates from the registry\n    registryEntries.forEach((entry) => {\n      if (entry?.yScale) yScale = entry.yScale(yScale);\n    });\n\n    return yScale;\n  }, [dataRegistry, yScaleConfig, registryKeys, yMin, yMax]);\n\n  return { xScale: memoizedXScale, yScale: memoizedYScale };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useSeriesEvents.ts",
    "content": "import type { FocusEvent, PointerEvent } from 'react';\nimport { useCallback, useContext } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport TooltipContext from '../context/TooltipContext';\nimport type { EventHandlerParams, SeriesProps, TooltipContextType } from '../types';\nimport useEventEmitters from './useEventEmitters';\nimport type { PointerEventHandlerParams } from './useEventHandlers';\nimport useEventHandlers from './useEventHandlers';\n\nexport type SeriesEventsParams<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = Pick<\n  SeriesProps<XScale, YScale, Datum>,\n  | 'enableEvents'\n  | 'onBlur'\n  | 'onFocus'\n  | 'onPointerMove'\n  | 'onPointerOut'\n  | 'onPointerUp'\n  | 'onPointerDown'\n> &\n  Pick<\n    PointerEventHandlerParams<XScale, YScale, Datum>,\n    'dataKey' | 'allowedSources' | 'findNearestDatum'\n  > & {\n    /** The source of emitted events. */\n    source: string;\n  };\n\n/** This hook simplifies the logic for initializing Series event emitters + handlers. */\nexport default function useSeriesEvents<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  dataKey,\n  enableEvents,\n  findNearestDatum,\n  onBlur: onBlurProps,\n  onFocus: onFocusProps,\n  onPointerMove: onPointerMoveProps,\n  onPointerOut: onPointerOutProps,\n  onPointerUp: onPointerUpProps,\n  onPointerDown: onPointerDownProps,\n  source,\n  allowedSources,\n}: SeriesEventsParams<XScale, YScale, Datum>) {\n  const { showTooltip, hideTooltip } = (useContext(TooltipContext) ??\n    {}) as TooltipContextType<Datum>;\n  const onPointerMove = useCallback(\n    (params: EventHandlerParams<Datum>) => {\n      showTooltip(params);\n      if (onPointerMoveProps) onPointerMoveProps(params);\n    },\n    [showTooltip, onPointerMoveProps],\n  );\n  const onFocus = useCallback(\n    (params: EventHandlerParams<Datum>) => {\n      showTooltip(params);\n      if (onFocusProps) onFocusProps(params);\n    },\n    [showTooltip, onFocusProps],\n  );\n  const onPointerOut = useCallback(\n    (event: PointerEvent) => {\n      hideTooltip();\n      if (event && onPointerOutProps) onPointerOutProps(event);\n    },\n    [hideTooltip, onPointerOutProps],\n  );\n  const onBlur = useCallback(\n    (event: FocusEvent) => {\n      hideTooltip();\n      if (event && onBlurProps) onBlurProps(event);\n    },\n    [hideTooltip, onBlurProps],\n  );\n\n  const onPointerDown = useCallback(\n    (params: EventHandlerParams<Datum>) => {\n      showTooltip(params);\n      if (onPointerDownProps) onPointerDownProps(params);\n    },\n    [showTooltip, onPointerDownProps],\n  );\n\n  useEventHandlers({\n    dataKey,\n    findNearestDatum,\n    onBlur: enableEvents ? onBlur : undefined,\n    onFocus: enableEvents ? onFocus : undefined,\n    onPointerMove: enableEvents ? onPointerMove : undefined,\n    onPointerOut: enableEvents ? onPointerOut : undefined,\n    onPointerUp: enableEvents ? onPointerUpProps : undefined,\n    onPointerDown: enableEvents ? onPointerDown : undefined,\n    allowedSources,\n  });\n  return useEventEmitters({\n    source,\n    onBlur: !!onBlurProps && enableEvents,\n    onFocus: !!onFocusProps && enableEvents,\n    onPointerMove: !!onPointerMoveProps && enableEvents,\n    onPointerOut: !!onPointerOutProps && enableEvents,\n    onPointerUp: !!onPointerUpProps && enableEvents,\n    onPointerDown: !!onPointerDownProps && enableEvents,\n  });\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/hooks/useStackedData.ts",
    "content": "import type { ReactNode } from 'react';\nimport { useContext, useEffect, useMemo } from 'react';\nimport type { SeriesPoint } from '@visx/vendor/d3-shape';\nimport { stack as d3stack } from '@visx/vendor/d3-shape';\nimport { stackOffset, stackOrder } from '@visx/shape';\nimport type { StackPathConfig } from '@visx/shape';\nimport { extent } from '@visx/vendor/d3-array';\nimport type { AxisScale } from '@visx/axis';\nimport DataContext from '../context/DataContext';\nimport type { CombinedStackData, DataContextType, SeriesProps } from '../types';\nimport getBarStackRegistryData from '../utils/getBarStackRegistryData';\nimport combineBarStackData from '../utils/combineBarStackData';\nimport getChildrenAndGrandchildrenWithProps from '../utils/getChildrenAndGrandchildrenWithProps';\n\ntype UseStackedData<Datum extends object> = {\n  children: ReactNode;\n} & Pick<StackPathConfig<Datum, string>, 'offset' | 'order'>;\n\nexport default function useStackedData<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n  ChildrenProps extends SeriesProps<XScale, YScale, Datum>,\n>({ children, order, offset }: UseStackedData<Datum>) {\n  type StackDatum = SeriesPoint<CombinedStackData<XScale, YScale>>;\n\n  const { horizontal, registerData, unregisterData } = useContext(\n    DataContext,\n  ) as unknown as DataContextType<XScale, YScale, StackDatum>;\n\n  // find series children\n  // @TODO: memoization doesn't work well if at all for this\n  const seriesChildren = useMemo(\n    () => getChildrenAndGrandchildrenWithProps<ChildrenProps>(children),\n    [children],\n  );\n\n  // extract data keys from child series\n  const dataKeys: string[] = useMemo(\n    () => seriesChildren.filter((child) => child.props.dataKey).map((child) => child.props.dataKey),\n    [seriesChildren],\n  );\n\n  // group all child data by stack value { [x | y]: { [dataKey]: value } }\n  // this format is needed by d3Stack\n  const combinedData = useMemo(\n    () => combineBarStackData<XScale, YScale, Datum>(seriesChildren, horizontal),\n    [horizontal, seriesChildren],\n  );\n\n  // stack data\n  const stackedData = useMemo(() => {\n    // automatically set offset to diverging if it's undefined and negative values are present\n    const hasSomeNegativeValues = offset ? null : combinedData.some((d) => d.negativeSum < 0);\n\n    const stack = d3stack<CombinedStackData<XScale, YScale>, string>();\n    stack.keys(dataKeys);\n    if (order) stack.order(stackOrder(order));\n    if (offset || hasSomeNegativeValues) stack.offset(stackOffset(offset || 'diverging'));\n\n    return stack(combinedData);\n  }, [combinedData, dataKeys, order, offset]);\n\n  // update the domain to account for the (directional) stacked value\n  const comprehensiveDomain = useMemo(\n    () =>\n      extent(\n        stackedData.reduce((allDatum: number[], stack) => {\n          stack.forEach(([min, max]) => {\n            allDatum.push(min);\n            allDatum.push(max);\n          });\n          return allDatum;\n        }, []),\n      ) as [number, number],\n    [stackedData],\n  );\n\n  // register all child data using the stack-transformed values\n  useEffect(() => {\n    const dataToRegister = getBarStackRegistryData(stackedData, comprehensiveDomain, horizontal);\n    registerData(dataToRegister);\n\n    // unregister data on unmount\n    return () => unregisterData(dataKeys);\n  }, [\n    dataKeys,\n    comprehensiveDomain,\n    horizontal,\n    stackedData,\n    registerData,\n    unregisterData,\n    seriesChildren,\n  ]);\n\n  return { seriesChildren, dataKeys, stackedData };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/index.ts",
    "content": "// @visx/xychart\n// components\nexport { default as Annotation } from './components/annotation/Annotation';\nexport { default as AnimatedAnnotation } from './components/annotation/AnimatedAnnotation';\nexport { default as AnnotationLabel } from './components/annotation/AnnotationLabel';\nexport { default as AnnotationConnector } from './components/annotation/AnnotationConnector';\nexport { default as AnnotationCircleSubject } from './components/annotation/AnnotationCircleSubject';\nexport { default as AnnotationLineSubject } from './components/annotation/AnnotationLineSubject';\nexport { default as AnimatedAxis } from './components/axis/AnimatedAxis';\nexport { default as AnimatedGrid } from './components/grid/AnimatedGrid';\nexport { default as Axis } from './components/axis/Axis';\nexport { default as Grid } from './components/grid/Grid';\nexport { default as Tooltip } from './components/Tooltip';\nexport { default as XYChart } from './components/XYChart';\n\n// series components\nexport { default as AreaSeries } from './components/series/AreaSeries';\nexport { default as AreaStack } from './components/series/AreaStack';\nexport { default as BarGroup } from './components/series/BarGroup';\nexport { default as BarSeries } from './components/series/BarSeries';\nexport { default as BarStack } from './components/series/BarStack';\nexport { default as GlyphSeries } from './components/series/GlyphSeries';\nexport { default as LineSeries } from './components/series/LineSeries';\n\n// animated series components\nexport { default as AnimatedAreaSeries } from './components/series/AnimatedAreaSeries';\nexport { default as AnimatedAreaStack } from './components/series/AnimatedAreaStack';\nexport { default as AnimatedBarSeries } from './components/series/AnimatedBarSeries';\nexport { default as AnimatedBarStack } from './components/series/AnimatedBarStack';\nexport { default as AnimatedBarGroup } from './components/series/AnimatedBarGroup';\nexport { default as AnimatedGlyphSeries } from './components/series/AnimatedGlyphSeries';\nexport { default as AnimatedLineSeries } from './components/series/AnimatedLineSeries';\n\n// context\nexport { default as DataContext } from './context/DataContext';\nexport { default as EventEmitterContext } from './context/EventEmitterContext';\nexport { default as ThemeContext } from './context/ThemeContext';\nexport { default as TooltipContext } from './context/TooltipContext';\n\n// providers\nexport { default as DataProvider } from './providers/DataProvider';\nexport { default as EventEmitterProvider } from './providers/EventEmitterProvider';\nexport { default as ThemeProvider } from './providers/ThemeProvider';\nexport { default as TooltipProvider } from './providers/TooltipProvider';\n\n// hooks\nexport { default as useEventEmitter } from './hooks/useEventEmitter';\n\n// themes\nexport { default as lightTheme } from './theme/themes/light';\nexport { default as darkTheme } from './theme/themes/dark';\nexport { default as buildChartTheme } from './theme/buildChartTheme';\nexport { allColors, grayColors, defaultColors } from './theme/colors';\n\n// types\nexport type * from './types';\n"
  },
  {
    "path": "packages/visx-xychart/src/providers/DataProvider.tsx",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { ScaleConfig, ScaleConfigToD3Scale } from '@visx/scale';\nimport { scaleLinear, scaleOrdinal as createOrdinalScale } from '@visx/scale';\nimport { useContext, useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport type { AxisScaleOutput } from '@visx/axis';\nimport type { ResizeObserverPolyfill } from '@visx/responsive';\n\nimport type { AxisScale, DataContextType, XYChartTheme } from '../types';\nimport ThemeContext from '../context/ThemeContext';\nimport DataContext from '../context/DataContext';\nimport useDataRegistry from '../hooks/useDataRegistry';\nimport type { Dimensions } from '../hooks/useDimensions';\nimport useDimensions from '../hooks/useDimensions';\nimport useScales from '../hooks/useScales';\nimport isDiscreteScale from '../utils/isDiscreteScale';\n\n/** Props that can be passed to initialize/update the provider config. */\nexport type DataProviderProps<\n  XScaleConfig extends ScaleConfig<AxisScaleOutput, any, any>,\n  YScaleConfig extends ScaleConfig<AxisScaleOutput, any, any>,\n> = {\n  /* Optionally define the initial dimensions. */\n  initialDimensions?: Partial<Dimensions>;\n  /* Optional chart theme provided by DataProvider, overrides any theme already available in context. */\n  theme?: XYChartTheme;\n  /* x-scale configuration whose shape depends on scale type. */\n  xScale: XScaleConfig;\n  /* y-scale configuration whose shape depends on scale type. */\n  yScale: YScaleConfig;\n  /* Any React children. */\n  children: ReactNode;\n  /* Determines whether Series will be plotted horizontally (e.g., horizontal bars). By default this will try to be inferred based on scale types. */\n  horizontal?: boolean | 'auto';\n  /**\n   * Optionally set the resizeObserverPolyfill context, which will be available to\n   * ParentSize, Tooltip, and AnnotationLabel components.\n   */\n  resizeObserverPolyfill?: ResizeObserverPolyfill;\n};\n\nexport default function DataProvider<\n  XScaleConfig extends ScaleConfig<AxisScaleOutput>,\n  YScaleConfig extends ScaleConfig<AxisScaleOutput>,\n  Datum extends object,\n>({\n  initialDimensions,\n  theme: propsTheme,\n  xScale: xScaleConfig,\n  yScale: yScaleConfig,\n  children,\n  horizontal: initialHorizontal = 'auto',\n  resizeObserverPolyfill,\n}: DataProviderProps<XScaleConfig, YScaleConfig>) {\n  // `DataProvider` provides a theme so that `ThemeProvider` is not strictly needed.\n  // `props.theme` takes precedent over `context.theme`, which has a default even if\n  // a ThemeProvider is not present.\n  const contextTheme = useContext(ThemeContext);\n  const theme = propsTheme || contextTheme;\n  const [{ width, height, margin }, setDimensions] = useDimensions(initialDimensions);\n  const innerWidth = Math.max(0, width - margin.left - margin.right);\n  const innerHeight = Math.max(0, height - margin.top - margin.bottom);\n\n  type XScale = ScaleConfigToD3Scale<XScaleConfig, AxisScaleOutput, any, any>;\n  type YScale = ScaleConfigToD3Scale<YScaleConfig, AxisScaleOutput, any, any>;\n\n  const dataRegistry = useDataRegistry<XScale, YScale, Datum>();\n\n  const { xScale, yScale }: { xScale?: XScale; yScale?: YScale } = useScales({\n    dataRegistry,\n    xScaleConfig,\n    yScaleConfig,\n    xRange: [margin.left, Math.max(0, width - margin.right)],\n    yRange: [Math.max(0, height - margin.bottom), margin.top],\n  });\n\n  const registryKeys = dataRegistry.keys();\n\n  const colorScale = useMemo(\n    () =>\n      createOrdinalScale({\n        domain: registryKeys,\n        range: theme.colors,\n      }),\n    [registryKeys, theme.colors],\n  );\n\n  const horizontal =\n    initialHorizontal === 'auto'\n      ? isDiscreteScale(yScaleConfig) || yScaleConfig.type === 'time' || yScaleConfig.type === 'utc'\n      : initialHorizontal;\n\n  const value: DataContextType<AxisScale, AxisScale, Datum> = useMemo(\n    () => ({\n      dataRegistry,\n      registerData: dataRegistry.registerData,\n      unregisterData: dataRegistry.unregisterData,\n      xScale: xScale || scaleLinear(),\n      yScale: yScale || scaleLinear(),\n      colorScale,\n      theme,\n      width,\n      height,\n      margin,\n      innerWidth,\n      innerHeight,\n      setDimensions,\n      horizontal,\n      resizeObserverPolyfill,\n    }),\n    // everything here should be memoized between renders\n    // to avoid child re-renders\n    [\n      colorScale,\n      dataRegistry,\n      height,\n      horizontal,\n      innerHeight,\n      innerWidth,\n      margin,\n      setDimensions,\n      theme,\n      width,\n      xScale,\n      yScale,\n      resizeObserverPolyfill,\n    ],\n  );\n\n  return <DataContext.Provider value={value}>{children}</DataContext.Provider>;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/providers/EventEmitterProvider.tsx",
    "content": "import { useMemo } from 'react';\nimport type { ReactNode } from 'react';\nimport mitt from 'mitt';\nimport EventEmitterContext from '../context/EventEmitterContext';\n\n/** Provider for EventEmitterContext. */\nexport default function EventEmitterProvider({ children }: { children: ReactNode }) {\n  const emitter = useMemo(() => mitt(), []);\n  return <EventEmitterContext.Provider value={emitter}>{children}</EventEmitterContext.Provider>;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/providers/ThemeProvider.tsx",
    "content": "import type { ReactNode } from 'react';\nimport ThemeContext from '../context/ThemeContext';\nimport type { XYChartTheme } from '../types';\nimport lightTheme from '../theme/themes/light';\n\nexport type ThemeProviderProps = {\n  theme?: XYChartTheme;\n  children: ReactNode;\n};\n\nexport default function ThemeProvider({ theme = lightTheme, children }: ThemeProviderProps) {\n  return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/providers/TooltipProvider.tsx",
    "content": "import { useCallback, useEffect, useMemo, useRef } from 'react';\nimport type { ReactNode } from 'react';\nimport debounce from 'lodash/debounce';\nimport { useTooltip } from '@visx/tooltip';\nimport TooltipContext from '../context/TooltipContext';\nimport type { EventHandlerParams, TooltipContextType, TooltipData } from '../types';\nimport isValidNumber from '../typeguards/isValidNumber';\n\ntype TooltipProviderProps = {\n  /** Debounce time for when `hideTooltip` is invoked. */\n  hideTooltipDebounceMs?: number;\n  children: ReactNode;\n};\n\n/** Simple wrapper around useTooltip, to provide tooltip data via context. */\nexport default function TooltipProvider<Datum extends object>({\n  hideTooltipDebounceMs = 400,\n  children,\n}: TooltipProviderProps) {\n  const {\n    tooltipOpen,\n    tooltipLeft,\n    tooltipTop,\n    tooltipData,\n    updateTooltip,\n    hideTooltip: privateHideTooltip,\n  } = useTooltip<TooltipData<Datum>>(undefined);\n\n  const debouncedHideTooltip = useRef<ReturnType<typeof debounce> | null>(null);\n\n  function cancelDeboundedHideTooltip() {\n    if (debouncedHideTooltip.current) {\n      debouncedHideTooltip.current.cancel();\n      debouncedHideTooltip.current = null;\n    }\n  }\n\n  useEffect(() => cancelDeboundedHideTooltip, []);\n\n  const showTooltip = useRef(\n    ({ svgPoint, index, key, datum, distanceX, distanceY }: EventHandlerParams<Datum>) => {\n      // cancel any hideTooltip calls so it won't hide after invoking the logic below\n      cancelDeboundedHideTooltip();\n      const cleanDistanceX = isValidNumber(distanceX) ? distanceX : Infinity;\n      const cleanDistanceY = isValidNumber(distanceY) ? distanceY : Infinity;\n      const distance = Math.sqrt(cleanDistanceX ** 2 + cleanDistanceY ** 2);\n\n      updateTooltip(({ tooltipData: currData }) => {\n        const currNearestDatumDistance =\n          currData?.nearestDatum && isValidNumber(currData.nearestDatum.distance)\n            ? currData.nearestDatum.distance\n            : Infinity;\n        return {\n          tooltipOpen: true,\n          tooltipLeft: svgPoint?.x,\n          tooltipTop: svgPoint?.y,\n          tooltipData: {\n            nearestDatum:\n              (currData?.nearestDatum?.key ?? '') !== key && currNearestDatumDistance < distance\n                ? currData?.nearestDatum\n                : { key, index, datum, distance },\n            datumByKey: {\n              ...currData?.datumByKey,\n              [key]: {\n                datum,\n                index,\n                key,\n              },\n            },\n          },\n        };\n      });\n    },\n  );\n\n  const hideTooltip = useCallback(() => {\n    debouncedHideTooltip.current = debounce(privateHideTooltip, hideTooltipDebounceMs);\n    debouncedHideTooltip.current();\n  }, [privateHideTooltip, hideTooltipDebounceMs]);\n\n  const value = useMemo(\n    () => ({\n      tooltipOpen,\n      tooltipLeft,\n      tooltipTop,\n      tooltipData,\n      updateTooltip,\n      showTooltip: showTooltip.current as TooltipContextType<Datum>['showTooltip'],\n      hideTooltip,\n    }),\n    [hideTooltip, tooltipData, tooltipLeft, tooltipOpen, tooltipTop, updateTooltip],\n  );\n\n  return <TooltipContext.Provider value={value}>{children}</TooltipContext.Provider>;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/theme/buildChartTheme.ts",
    "content": "import type { CSSProperties } from 'react';\nimport type { SVGTextProps, HTMLTextStyles, LineStyles, XYChartTheme } from '../types/theme';\nimport { textColor } from './colors';\n\nexport type ThemeConfig = {\n  backgroundColor: string;\n\n  // categorical colors, mapped to series `key`s\n  colors: string[];\n\n  // labels\n  svgLabelBig?: SVGTextProps;\n  svgLabelSmall?: SVGTextProps;\n  htmlLabel?: HTMLTextStyles;\n\n  // lines\n  xAxisLineStyles?: LineStyles;\n  yAxisLineStyles?: LineStyles;\n  xTickLineStyles?: LineStyles;\n  yTickLineStyles?: LineStyles;\n  tickLength: number;\n\n  // grid\n  gridColor: string;\n  gridColorDark: string;\n  gridStyles?: CSSProperties;\n};\n\nconst defaultLabelStyles = {\n  fontFamily: '-apple-system,BlinkMacSystemFont,Roboto,Helvetica Neue,sans-serif',\n  fontWeight: 700,\n  fontSize: 12,\n  textAnchor: 'middle',\n  pointerEvents: 'none',\n  letterSpacing: 0.4,\n} as const;\n\n/** Provides a simplified API to build a full XYChartTheme. */\nexport default function buildChartTheme(config: ThemeConfig): XYChartTheme {\n  const baseSvgLabel: SVGTextProps = {\n    ...defaultLabelStyles,\n    fill: textColor,\n    stroke: 'none',\n    ...config.svgLabelBig,\n  } as const;\n\n  const baseTickLabel: SVGTextProps = {\n    ...defaultLabelStyles,\n    fontWeight: 200,\n    fontSize: 11,\n    fill: textColor,\n    stroke: 'none',\n    ...config.svgLabelSmall,\n  } as const;\n\n  const baseHtmlLabel: HTMLTextStyles = {\n    color:\n      config.htmlLabel?.color ??\n      config.svgLabelBig?.fill ??\n      config.svgLabelSmall?.fill ??\n      textColor,\n    ...defaultLabelStyles,\n    ...config.htmlLabel,\n  };\n\n  return {\n    backgroundColor: config.backgroundColor,\n    colors: [...config.colors],\n    htmlLabel: {\n      ...baseHtmlLabel,\n    },\n    svgLabelSmall: {\n      ...baseTickLabel,\n    },\n    svgLabelBig: {\n      ...baseSvgLabel,\n    },\n    gridStyles: {\n      stroke: config.gridColor,\n      strokeWidth: 1,\n      ...config.gridStyles,\n    },\n    axisStyles: {\n      x: {\n        top: {\n          axisLabel: {\n            ...baseSvgLabel,\n            dy: '-0.25em', // needs to include font-size\n          },\n          axisLine: {\n            stroke: config.gridColorDark,\n            strokeWidth: 2,\n            ...config.xAxisLineStyles,\n          },\n          tickLabel: {\n            ...baseTickLabel,\n            dy: '-0.25em', // needs to include font-size\n          },\n          tickLength: config.tickLength,\n          tickLine: {\n            strokeWidth: 1,\n            stroke: config.gridColor,\n            ...config.xTickLineStyles,\n          },\n        },\n        bottom: {\n          axisLabel: {\n            ...baseSvgLabel,\n            dy: '-0.25em',\n          },\n          axisLine: {\n            stroke: config.gridColorDark,\n            strokeWidth: 2,\n            ...config.xAxisLineStyles,\n          },\n          tickLabel: {\n            ...baseTickLabel,\n            dy: '0.125em',\n          },\n          tickLength: config.tickLength,\n          tickLine: {\n            strokeWidth: 1,\n            stroke: config.gridColor,\n            ...config.xTickLineStyles,\n          },\n        },\n      },\n      y: {\n        left: {\n          axisLabel: {\n            ...baseSvgLabel,\n            dx: '-1.25em',\n          },\n          axisLine: {\n            stroke: config.gridColor,\n            strokeWidth: 1,\n            ...config.yAxisLineStyles,\n          },\n          tickLabel: {\n            ...baseTickLabel,\n            textAnchor: 'end',\n            dx: '-0.25em',\n            dy: '0.25em',\n          },\n          tickLength: config.tickLength,\n          tickLine: {\n            strokeWidth: 1,\n            stroke: config.gridColor,\n            ...config.yTickLineStyles,\n          },\n        },\n        right: {\n          axisLabel: {\n            ...baseSvgLabel,\n            dx: '1.25em',\n          },\n          axisLine: {\n            stroke: config.gridColor,\n            strokeWidth: 1,\n            ...config.yAxisLineStyles,\n          },\n          tickLabel: {\n            ...baseTickLabel,\n            textAnchor: 'start',\n            dx: '0.25em',\n            dy: '0.25em',\n          },\n          tickLength: config.tickLength,\n          tickLine: {\n            strokeWidth: 1,\n            stroke: config.gridColor,\n            ...config.yTickLineStyles,\n          },\n        },\n      },\n    },\n  };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/theme/colors.ts",
    "content": "// source https://yeun.github.io/open-color/\nexport const allColors: {\n  [hue: string]: [string, string, string, string, string, string, string, string, string, string];\n} = {\n  red: [\n    '#fff5f5',\n    '#ffe3e3',\n    '#ffc9c9',\n    '#ffa8a8',\n    '#ff8787',\n    '#ff6b6b',\n    '#fa5252',\n    '#f03e3e',\n    '#e03131',\n    '#c92a2a',\n  ],\n  pink: [\n    '#fff0f6',\n    '#ffdeeb',\n    '#fcc2d7',\n    '#faa2c1',\n    '#f783ac',\n    '#f06595',\n    '#e64980',\n    '#d6336c',\n    '#c2255c',\n    '#a61e4d',\n  ],\n  grape: [\n    '#f8f0fc',\n    '#f3d9fa',\n    '#eebefa',\n    '#e599f7',\n    '#da77f2',\n    '#cc5de8',\n    '#be4bdb',\n    '#ae3ec9',\n    '#9c36b5',\n    '#862e9c',\n  ],\n  violet: [\n    '#f3f0ff',\n    '#e5dbff',\n    '#d0bfff',\n    '#b197fc',\n    '#9775fa',\n    '#845ef7',\n    '#7950f2',\n    '#7048e8',\n    '#6741d9',\n    '#5f3dc4',\n  ],\n  indigo: [\n    '#edf2ff',\n    '#dbe4ff',\n    '#bac8ff',\n    '#91a7ff',\n    '#748ffc',\n    '#5c7cfa',\n    '#4c6ef5',\n    '#4263eb',\n    '#3b5bdb',\n    '#364fc7',\n  ],\n  blue: [\n    '#e8f7ff',\n    '#ccedff',\n    '#a3daff',\n    '#72c3fc',\n    '#4dadf7',\n    '#329af0',\n    '#228ae6',\n    '#1c7cd6',\n    '#1b6ec2',\n    '#1862ab',\n  ],\n  cyan: [\n    '#e3fafc',\n    '#c5f6fa',\n    '#99e9f2',\n    '#66d9e8',\n    '#3bc9db',\n    '#22b8cf',\n    '#15aabf',\n    '#1098ad',\n    '#0c8599',\n    '#0b7285',\n  ],\n  teal: [\n    '#e6fcf5',\n    '#c3fae8',\n    '#96f2d7',\n    '#63e6be',\n    '#38d9a9',\n    '#20c997',\n    '#12b886',\n    '#0ca678',\n    '#099268',\n    '#087f5b',\n  ],\n  green: [\n    '#ebfbee',\n    '#d3f9d8',\n    '#b2f2bb',\n    '#8ce99a',\n    '#69db7c',\n    '#51cf66',\n    '#40c057',\n    '#37b24d',\n    '#2f9e44',\n    '#2b8a3e',\n  ],\n  lime: [\n    '#f4fce3',\n    '#e9fac8',\n    '#d8f5a2',\n    '#c0eb75',\n    '#a9e34b',\n    '#94d82d',\n    '#82c91e',\n    '#74b816',\n    '#66a80f',\n    '#5c940d',\n  ],\n  yellow: [\n    '#fff9db',\n    '#fff3bf',\n    '#ffec99',\n    '#ffe066',\n    '#ffd43b',\n    '#fcc419',\n    '#fab005',\n    '#f59f00',\n    '#f08c00',\n    '#e67700',\n  ],\n  orange: [\n    '#fff4e6',\n    '#ffe8cc',\n    '#ffd8a8',\n    '#ffc078',\n    '#ffa94d',\n    '#ff922b',\n    '#fd7e14',\n    '#f76707',\n    '#e8590c',\n    '#d9480f',\n  ],\n  gray: [\n    '#f8f9fa',\n    '#f1f3f5',\n    '#e9ecef',\n    '#dee2e6',\n    '#ced4da',\n    '#adb5bd',\n    '#868e96',\n    '#495057',\n    '#343a40',\n    '#212529',\n  ],\n};\n\nexport const grayColors = allColors.gray;\nexport const textColor = grayColors[7];\n\nexport const defaultColors = [\n  allColors.cyan[9],\n  allColors.cyan[3],\n  allColors.yellow[5],\n  allColors.red[4],\n  allColors.grape[8],\n  allColors.grape[5],\n  allColors.pink[9],\n];\n"
  },
  {
    "path": "packages/visx-xychart/src/theme/themes/dark.ts",
    "content": "import { allColors, grayColors } from '../colors';\nimport buildChartTheme from '../buildChartTheme';\n\nexport default buildChartTheme({\n  backgroundColor: '#222',\n  colors: [\n    allColors.cyan[4],\n    allColors.teal[1],\n    allColors.yellow[2],\n    allColors.red[4],\n    allColors.grape[3],\n    allColors.grape[6],\n    allColors.pink[3],\n  ],\n  tickLength: 4,\n  svgLabelSmall: {\n    fill: grayColors[2],\n  },\n  svgLabelBig: {\n    fill: grayColors[0],\n  },\n  gridColor: grayColors[4],\n  gridColorDark: grayColors[1],\n});\n"
  },
  {
    "path": "packages/visx-xychart/src/theme/themes/light.ts",
    "content": "import { defaultColors, grayColors } from '../colors';\nimport buildChartTheme from '../buildChartTheme';\n\nexport default buildChartTheme({\n  backgroundColor: '#fff',\n  colors: defaultColors,\n  tickLength: 4,\n  svgLabelSmall: {\n    fill: grayColors[7],\n  },\n  svgLabelBig: {\n    fill: grayColors[9],\n  },\n  gridColor: grayColors[5],\n  gridColorDark: grayColors[9],\n});\n"
  },
  {
    "path": "packages/visx-xychart/src/typeguards/events.ts",
    "content": "import type { FocusEvent, PointerEvent } from 'react';\n\ntype EventType = PointerEvent | FocusEvent;\n\n// functional definition of a PointerEvent (mouse, touch)\nexport function isPointerEvent(event?: EventType): event is PointerEvent {\n  return !!event && ('clientX' in event || 'changedTouches' in event);\n}\n\nexport function isFocusEvent(event?: EventType): event is FocusEvent {\n  return !!event && !isPointerEvent(event);\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/typeguards/isValidNumber.ts",
    "content": "export default function isValidNumber(_: unknown): _ is number {\n  return _ != null && typeof _ === 'number' && !Number.isNaN(_) && Number.isFinite(_);\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/types/axis.ts",
    "content": "import type { AxisScale as AxisAxisScale } from '@visx/axis';\n\nexport type AxisScale = AxisAxisScale;\n"
  },
  {
    "path": "packages/visx-xychart/src/types/data.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { ResizeObserverPolyfill } from '@visx/responsive';\nimport type { ScaleTypeToD3Scale, ScaleInput } from '@visx/scale';\nimport type DataRegistry from '../classes/DataRegistry';\nimport type { XYChartTheme } from './theme';\n\nexport type Margin = {\n  top: number;\n  right: number;\n  bottom: number;\n  left: number;\n};\n\nexport type LegendShape = 'rect' | 'line' | 'dashed-line' | 'circle';\n\nexport interface DataRegistryEntry<XScale extends AxisScale, YScale extends AxisScale, Datum> {\n  /** unique data key */\n  key: string;\n  /** array of data for the key. */\n  data: Datum[];\n  /** function that returns the x value of a datum. */\n  xAccessor: (d: Datum) => ScaleInput<XScale>;\n  /** function that returns the y value of a datum. */\n  yAccessor: (d: Datum) => ScaleInput<YScale>;\n  /** whether the entry supports mouse events. */\n  mouseEvents?: boolean;\n  /** Optionally update the xScale. */\n  xScale?: <Scale extends AxisScale>(xScale: Scale) => Scale;\n  /** Optionally update the yScale. */\n  yScale?: <Scale extends AxisScale>(yScale: Scale) => Scale;\n  /** Legend shape for the data key. */\n  legendShape?: LegendShape;\n}\n\nexport interface DataContextType<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> {\n  xScale: XScale;\n  yScale: YScale;\n  colorScale: ScaleTypeToD3Scale<string, string>['ordinal'];\n  width: number;\n  height: number;\n  innerWidth: number;\n  innerHeight: number;\n  margin: Margin;\n  dataRegistry: Omit<DataRegistry<XScale, YScale, Datum>, 'registry' | 'registryKeys'>;\n  registerData: (\n    data: DataRegistryEntry<XScale, YScale, Datum> | DataRegistryEntry<XScale, YScale, Datum>[],\n  ) => void;\n  unregisterData: (keyOrKeys: string | string[]) => void;\n  setDimensions: (dims: { width: number; height: number; margin: Margin }) => void;\n  theme: XYChartTheme;\n  horizontal: boolean;\n  resizeObserverPolyfill?: ResizeObserverPolyfill;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/types/event.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { ScaleInput } from '@visx/scale';\nimport type { Emitter } from 'mitt';\n\nexport type EventEmitterContextType = Emitter;\n\n/** Arguments for findNearestDatum* functions. */\nexport type NearestDatumArgs<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = {\n  dataKey: string;\n  point: { x: number; y: number } | null;\n  xAccessor: (d: Datum) => ScaleInput<XScale>;\n  yAccessor: (d: Datum) => ScaleInput<YScale>;\n  data: Datum[];\n  width: number;\n  height: number;\n  xScale: XScale;\n  yScale: YScale;\n};\n\n/** Return type for nearestDatum* functions. */\nexport type NearestDatumReturnType<Datum extends object> = {\n  datum: Datum;\n  index: number;\n  distanceX: number;\n  distanceY: number;\n} | null;\n"
  },
  {
    "path": "packages/visx-xychart/src/types/index.ts",
    "content": "export type * from './axis';\nexport type * from './data';\nexport type * from './event';\nexport type * from './series';\nexport type * from './theme';\nexport type * from './tooltip';\n"
  },
  {
    "path": "packages/visx-xychart/src/types/series.ts",
    "content": "import type { PointerEvent, FocusEvent, SVGProps } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport type { ScaleInput } from '@visx/scale';\nimport type { Series, SeriesPoint } from '@visx/vendor/d3-shape';\n\n/** Call signature of PointerEvent callback. */\nexport type EventHandlerParams<Datum> = {\n  /** Series key that datum belongs to. */\n  key: string;\n  /** Index of datum in series data array. */\n  index: number;\n  /** Datum. */\n  datum: Datum;\n  /** Optional distance of datum x value to event x value. Used to determine closest datum. */\n  distanceX?: number;\n  /** Optional distance of datum y value to event y value. Used to determine closest datum. */\n  distanceY?: number;\n  /** Coordinates of the event in svg space. */\n  svgPoint?: { x: number; y: number };\n  /** The PointerEvent or FocusEvent. */\n  event?: PointerEvent | FocusEvent;\n};\n\nexport type SeriesProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = {\n  /** Required data key for the Series, should be unique across all series. */\n  dataKey: string;\n  /** Data for the Series. */\n  data: Datum[];\n  /** Given a Datum, returns the x-scale value. */\n  xAccessor: (d: Datum) => ScaleInput<XScale>;\n  /** Given a Datum, returns the y-scale value. */\n  yAccessor: (d: Datum) => ScaleInput<YScale>;\n  /**\n   * Callback invoked for onPointerMove events for the nearest Datum to the PointerEvent.\n   * By default XYChart will capture and emit PointerEvents, invoking this function for\n   * any Series with a defined handler. Alternatively you may set <XYChart captureEvents={false} />\n   * and Series will emit their own events.\n   */\n  onPointerMove?: ({\n    datum,\n    distanceX,\n    distanceY,\n    event,\n    index,\n    key,\n    svgPoint,\n  }: EventHandlerParams<Datum>) => void;\n  /**\n   * Callback invoked for onPointerOut events. By default XYChart will capture and emit\n   * PointerEvents, invoking this function for any Series with a defined handler.\n   * Alternatively you may set <XYChart captureEvents={false} /> and Series will emit\n   * their own events.\n   */\n  onPointerOut?: (\n    /** The PointerEvent. */\n    event: PointerEvent,\n  ) => void;\n  /**\n   * Callback invoked for onPointerUp events for the nearest Datum to the PointerEvent.\n   * By default XYChart will capture and emit PointerEvents, invoking this function for\n   * any Series with a defined handler. Alternatively you may set <XYChart captureEvents={false} />\n   * and Series will emit their own events.\n   */\n  onPointerUp?: ({\n    datum,\n    distanceX,\n    distanceY,\n    event,\n    index,\n    key,\n    svgPoint,\n  }: EventHandlerParams<Datum>) => void;\n\n  /**\n   * Callback invoked for onPointerDown events for the nearest Datum to the PointerEvent.\n   * By default XYChart will capture and emit PointerEvents, invoking this function for\n   * any Series with a defined handler. Alternatively you may set <XYChart captureEvents={false} />\n   * and Series will emit their own events.\n   */\n  onPointerDown?: ({\n    datum,\n    distanceX,\n    distanceY,\n    event,\n    index,\n    key,\n    svgPoint,\n  }: EventHandlerParams<Datum>) => void;\n\n  /**\n   * Callback invoked for onFocus events for the nearest Datum to the FocusEvent.\n   * XYChart will NOT capture and emit FocusEvents, they are emitted from individual Series glyph shapes.\n   */\n  onFocus?: ({\n    datum,\n    distanceX,\n    distanceY,\n    event,\n    index,\n    key,\n    svgPoint,\n  }: EventHandlerParams<Datum>) => void;\n  /**\n   * Callback invoked for onBlur events for the nearest Datum to the FocusEvent.\n   * XYChart will NOT capture and emit FocusEvents, they are emitted from individual Series glyph shapes.\n   */\n  onBlur?: (\n    /** The FocusEvent. */\n    event: FocusEvent,\n  ) => void;\n  /** Whether the Series emits and subscribes to PointerEvents and FocusEvents (including Tooltip triggering). */\n  enableEvents?: boolean;\n};\n\n/** Bar shape. */\nexport type Bar = {\n  /** Unique key for Bar (not dataKey). */\n  key: string;\n  /** X coordinate of Bar. */\n  x: number;\n  /** Y coordinate of Bar. */\n  y: number;\n  /** Width of Bar. */\n  width: number;\n  /** Height of Bar. */\n  height: number;\n  /** Fill color of Bar */\n  fill?: string;\n};\n\n/** Props for base Bars components */\nexport type BarsProps<XScale extends AxisScale, YScale extends AxisScale> = {\n  bars: Bar[];\n  xScale: XScale;\n  yScale: YScale;\n  horizontal?: boolean;\n  /** Optional radius to apply to bar corners. */\n  radius?: number;\n  /** Whether to apply radius to all corners. */\n  radiusAll?: boolean;\n  /** Whether to apply radius to top corners. */\n  radiusTop?: boolean;\n  /** Whether to apply radius to right corners. */\n  radiusRight?: boolean;\n  /** Whether to apply radius to bottom corners. */\n  radiusBottom?: boolean;\n  /** Whether to apply radius to left corners. */\n  radiusLeft?: boolean;\n} & Omit<\n  SVGProps<SVGRectElement | SVGPathElement>,\n  'x' | 'y' | 'width' | 'height' | 'ref' | 'children'\n>;\n\n// BarStack transforms its child series Datum into CombinedData<XScale, YScale>\nexport type BarStackDatum<XScale extends AxisScale, YScale extends AxisScale> = SeriesPoint<\n  CombinedStackData<XScale, YScale>\n>;\n\nexport type BarStackData<XScale extends AxisScale, YScale extends AxisScale> = Series<\n  CombinedStackData<XScale, YScale>,\n  string\n>[];\n\nexport type CombinedStackData<XScale extends AxisScale, YScale extends AxisScale> = {\n  [dataKey: string]: ScaleInput<XScale> | ScaleInput<YScale>;\n} & { stack: ScaleInput<XScale> | ScaleInput<YScale>; positiveSum: number; negativeSum: number };\n\n/** Glyphs */\nexport type GlyphsProps<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n> = {\n  xScale: XScale;\n  yScale: YScale;\n  horizontal?: boolean;\n  glyphs: GlyphProps<Datum>[];\n  /** Callback to invoke for onBlur. */\n  onBlur?: (event: FocusEvent) => void;\n  /** Callback to invoke for onFocus. */\n  onFocus?: (event: FocusEvent) => void;\n  /** Callback to invoke for onPointerMove. */\n  onPointerMove?: (event: PointerEvent) => void;\n  /** Callback to invoke for onPointerOut. */\n  onPointerOut?: (event: PointerEvent) => void;\n  /** Callback to invoke for onPointerUp. */\n  onPointerUp?: (event: PointerEvent) => void;\n};\n\nexport type GlyphProps<Datum extends object> = {\n  /** Unique key for Glyph (not dataKey). */\n  key: string;\n  /** Datum for Glyph. */\n  datum: Datum;\n  /** Index of Datum in data array. */\n  index: number;\n  /** X coordinate of Glyph. */\n  x: number;\n  /** Y coordinate of Glyph. */\n  y: number;\n  /** Size of Glyph. */\n  size: number;\n  /** Color of Glyph. */\n  color: string;\n  /** Callback to invoke for onBlur. */\n  onBlur?: (event: FocusEvent) => void;\n  /** Callback to invoke for onFocus. */\n  onFocus?: (event: FocusEvent) => void;\n  /** Callback to invoke for onPointerMove. */\n  onPointerMove?: (event: PointerEvent) => void;\n  /** Callback to invoke for onPointerOut. */\n  onPointerOut?: (event: PointerEvent) => void;\n  /** Callback to invoke for onPointerUp. */\n  onPointerUp?: (event: PointerEvent) => void;\n};\n"
  },
  {
    "path": "packages/visx-xychart/src/types/theme.ts",
    "content": "import type { CSSProperties, HTMLAttributes, SVGAttributes } from 'react';\nimport type { TextProps } from '@visx/text';\n\nexport type HTMLTextStyles = HTMLAttributes<HTMLDivElement>['style'];\n\nexport type LineStyles = Omit<SVGAttributes<SVGLineElement>, 'Key'>;\n\nexport type GridStyles = CSSProperties;\n\nexport type SVGTextProps = TextProps;\n\ninterface AxisStyle {\n  /** Axis label styles. */\n  axisLabel: SVGTextProps;\n  /** Axis line styles. */\n  axisLine: LineStyles;\n  /** Tick label styles. */\n  tickLabel: SVGTextProps;\n  /** Tick line styles. */\n  tickLine: LineStyles;\n  /** Length of axis tick lines. */\n  tickLength: number;\n}\n\n/** A complete chart theme includes style definitions for all axis orientations. */\nexport interface XYChartTheme {\n  /** Base background color. */\n  backgroundColor: string;\n  /** Ordinal colors to be used for default coloring by series `key`s. */\n  colors: string[];\n  /** Styles to applied to HMTL labels. */\n  htmlLabel: HTMLTextStyles;\n  /** Styles to applied to big SVG labels (axis label, annotation title, etc.). */\n  svgLabelBig: SVGTextProps;\n  /** Styles to applied to small SVG labels (tick label, annotation subtitle, etc.). */\n  svgLabelSmall: SVGTextProps;\n  /** Styles to be applied to chart grids. */\n  gridStyles: GridStyles;\n  /** Styles to be applied to axes (axis labels, ticks, tick labels). */\n  axisStyles: {\n    x: {\n      top: AxisStyle;\n      bottom: AxisStyle;\n    };\n    y: {\n      left: AxisStyle;\n      right: AxisStyle;\n    };\n  };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/types/tooltip.ts",
    "content": "import type { UseTooltipParams } from '@visx/tooltip';\nimport type { EventHandlerParams } from './series';\n\nexport type TooltipDatum<Datum extends object> = {\n  /** Series key that datum belongs to. */\n  key: string;\n  /** Index of datum in series data array. */\n  index: number;\n  /** Datum. */\n  datum: Datum;\n};\n\nexport type TooltipData<Datum extends object = object> = {\n  /** Nearest Datum to event across all Series. */\n  nearestDatum?: TooltipDatum<Datum> & { distance: number };\n  /** Nearest Datum to event across for each Series. */\n  datumByKey: {\n    [key: string]: TooltipDatum<Datum>;\n  };\n};\n\nexport type TooltipContextType<Datum extends object> = UseTooltipParams<TooltipData<Datum>> & {\n  showTooltip: (params: EventHandlerParams<Datum>) => void;\n};\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/cleanColorString.ts",
    "content": "/* react-spring cannot tween colors with url ids (patterns, gradients), these helpers detect and clean them. */\nconst neutralCleanColor = 'rgba(0,0,0,0.1)';\nexport const colorHasUrl = (color?: string) => Boolean(color?.includes('url('));\nexport const cleanColor = (color?: string) => (colorHasUrl(color) ? neutralCleanColor : color);\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/combineBarStackData.ts",
    "content": "import type { ReactElement } from 'react';\nimport type { AxisScale } from '@visx/axis';\nimport type { CombinedStackData, SeriesProps } from '../types';\n\n/** Returns the value which forms a stack group. */\nexport const getStackValue = <XScale extends AxisScale, YScale extends AxisScale>(\n  d: Pick<CombinedStackData<XScale, YScale>, 'stack'>,\n) => d.stack;\n\n/**\n * Merges `seriesChildren` `props.data` by their `stack` value which\n * forms the stack grouping (`x` if vertical, `y` if horizontal)\n * and returns `CombinedStackData[]`.\n */\nexport default function combineBarStackData<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(\n  seriesChildren: ReactElement<SeriesProps<XScale, YScale, Datum>>[],\n  horizontal?: boolean,\n): CombinedStackData<XScale, YScale>[] {\n  const dataByStackValue = new Map<string, CombinedStackData<XScale, YScale>>();\n\n  seriesChildren.forEach((child) => {\n    const { dataKey, data, xAccessor, yAccessor } = child.props;\n\n    // this should exist but double check\n    if (!xAccessor || !yAccessor) return;\n\n    const [stackFn, valueFn] = horizontal ? [yAccessor, xAccessor] : [xAccessor, yAccessor];\n\n    data.forEach((d) => {\n      const stack = stackFn(d);\n      const numericValue = valueFn(d);\n      const stackKey = String(stack);\n      if (!dataByStackValue.has(stackKey)) {\n        dataByStackValue.set(stackKey, {\n          stack,\n          positiveSum: 0,\n          negativeSum: 0,\n        });\n      }\n      const stackEntry = dataByStackValue.get(stackKey)!;\n      stackEntry[dataKey] = numericValue;\n      stackEntry[numericValue >= 0 ? 'positiveSum' : 'negativeSum'] += numericValue;\n    });\n  });\n\n  return Array.from(dataByStackValue.values());\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/findNearestDatumSingleDimension.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { ScaleInput } from '@visx/scale';\nimport { bisector, range as d3Range, bisectLeft } from '@visx/vendor/d3-array';\n\n// @TODO make more robust to null/undefined scaled values\n/** Finds the nearest datum in a single direction (x or y) closest to the specified `scaledValue`. */\nexport default function findNearestDatumSingleDimension<\n  Scale extends AxisScale,\n  Datum extends object,\n>({\n  scale,\n  accessor,\n  scaledValue,\n  data,\n}: {\n  scale: Scale;\n  accessor: (d: Datum) => ScaleInput<Scale>;\n  scaledValue: number;\n  data: Datum[];\n}) {\n  const coercedScale = scale as AxisScale; // broaden type before type guards below\n\n  let nearestDatum: Datum;\n  let nearestDatumIndex: number;\n  // if scale has .invert(), convert svg coord to nearest data value\n  if ('invert' in coercedScale && typeof coercedScale.invert === 'function') {\n    const bisect = bisector(accessor).left;\n    // find closest data value, then map that to closest datum\n    const dataValue = Number(coercedScale.invert(scaledValue));\n    const index = bisect(data, dataValue);\n    // take the two datum nearest this index, and compute which is closer\n    const nearestDatum0 = data[index - 1];\n    const nearestDatum1 = data[index];\n    nearestDatum =\n      !nearestDatum0 ||\n      Math.abs(dataValue - accessor(nearestDatum0)) > Math.abs(dataValue - accessor(nearestDatum1))\n        ? nearestDatum1\n        : nearestDatum0;\n    nearestDatumIndex = nearestDatum === nearestDatum0 ? index - 1 : index;\n  } else if ('step' in coercedScale && typeof coercedScale.step !== 'undefined') {\n    // band scales don't have an invert function but they do have discrete domains\n    // so we manually invert\n    const domain = scale.domain();\n    const range = scale.range().map(Number);\n    const sortedRange = [...range].sort((a, b) => a - b); // bisectLeft assumes sort\n    const rangePoints = d3Range(sortedRange[0], sortedRange[1], coercedScale.step());\n    const domainIndex = bisectLeft(rangePoints, scaledValue);\n    // y-axis scales may have reverse ranges, correct for this\n    const sortedDomain = range[0] < range[1] ? domain : domain.reverse();\n    const domainValue = sortedDomain[domainIndex - 1];\n    const index = data.findIndex((d) => String(accessor(d)) === String(domainValue));\n    nearestDatum = data[index];\n    nearestDatumIndex = index;\n  } else {\n    console.warn('[visx/xychart/findNearestDatum] encountered incompatible scale type, bailing');\n    return null;\n  }\n\n  if (nearestDatum == null || nearestDatumIndex == null) return null;\n\n  const distance = Math.abs(Number(coercedScale(accessor(nearestDatum))) - scaledValue);\n\n  return { datum: nearestDatum, index: nearestDatumIndex, distance };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/findNearestDatumX.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport findNearestDatumSingleDimension from './findNearestDatumSingleDimension';\nimport type { NearestDatumArgs, NearestDatumReturnType } from '../types';\n\nexport default function findNearestDatumX<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  xScale: scale,\n  xAccessor: accessor,\n  yScale,\n  yAccessor,\n  point,\n  data,\n}: NearestDatumArgs<XScale, YScale, Datum>): NearestDatumReturnType<Datum> {\n  if (!point) return null;\n\n  const nearestDatum = findNearestDatumSingleDimension<XScale, Datum>({\n    scale,\n    accessor,\n    scaledValue: point.x,\n    data,\n  });\n\n  return nearestDatum\n    ? {\n        datum: nearestDatum.datum,\n        index: nearestDatum.index,\n        distanceX: nearestDatum.distance,\n        distanceY: Math.abs(Number(yScale(yAccessor(nearestDatum.datum))) - point.y),\n      }\n    : null;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/findNearestDatumXY.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { voronoi } from '@visx/voronoi';\nimport type { NearestDatumArgs, NearestDatumReturnType } from '../types';\n\n/* finds the datum nearest to svgMouseX/Y using a voronoi */\nexport default function findNearestDatumXY<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  width,\n  height,\n  xScale,\n  yScale,\n  xAccessor,\n  yAccessor,\n  point,\n  data,\n}: NearestDatumArgs<XScale, YScale, Datum>): NearestDatumReturnType<Datum> {\n  if (!point) return null;\n\n  const scaledX = (d: Datum) => Number(xScale(xAccessor(d)));\n  const scaledY = (d: Datum) => Number(yScale(yAccessor(d)));\n\n  // Create a voronoi for each datum's x,y coordinate\n  const voronoiInstance = voronoi({\n    x: scaledX,\n    y: scaledY,\n    width,\n    height,\n  });\n\n  const nearestDatum = voronoiInstance(data).find(point.x, point.y);\n\n  if (!nearestDatum) return null;\n\n  const { data: datum, index } = nearestDatum;\n  const distanceX = Math.abs(scaledX(datum) - point.x);\n  const distanceY = Math.abs(scaledY(datum) - point.y);\n\n  return { datum, index, distanceX, distanceY };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/findNearestDatumY.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport findNearestDatumSingleDimension from './findNearestDatumSingleDimension';\nimport type { NearestDatumArgs, NearestDatumReturnType } from '../types';\n\nexport default function findNearestDatumY<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>({\n  yScale: scale,\n  yAccessor: accessor,\n  xScale,\n  xAccessor,\n  point,\n  data,\n}: NearestDatumArgs<XScale, YScale, Datum>): NearestDatumReturnType<Datum> {\n  if (!point) return null;\n\n  const nearestDatum = findNearestDatumSingleDimension<YScale, Datum>({\n    scale,\n    accessor,\n    scaledValue: point.y,\n    data,\n  });\n\n  return nearestDatum\n    ? {\n        datum: nearestDatum.datum,\n        index: nearestDatum.index,\n        distanceY: nearestDatum.distance,\n        distanceX: Math.abs(Number(xScale(xAccessor(nearestDatum.datum))) - point.x),\n      }\n    : null;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/findNearestGroupDatum.ts",
    "content": "import type { PositionScale } from '@visx/shape';\nimport type { ScaleTypeToD3Scale } from '@visx/scale';\nimport type { NearestDatumArgs } from '../types';\nimport findNearestDatumX from './findNearestDatumX';\nimport findNearestDatumY from './findNearestDatumY';\n\n/**\n * This is a wrapper around findNearestDatumX/Y for BarGroup, accounting for a\n * Bar's group scale offset (which findNearestDatum does not).\n */\nexport default function findNearestGroupDatum<\n  XScale extends PositionScale,\n  YScale extends PositionScale,\n  Datum extends object,\n>(\n  nearestDatumArgs: NearestDatumArgs<XScale, YScale, Datum>,\n  groupScale: ScaleTypeToD3Scale<string, string>['band'],\n  horizontal?: boolean,\n) {\n  const { dataKey, xAccessor, yAccessor, xScale, yScale, point } = nearestDatumArgs;\n  const datum = (horizontal ? findNearestDatumY : findNearestDatumX)(nearestDatumArgs);\n\n  if (!datum || !point) return null;\n\n  const barGroupOffset = groupScale(dataKey);\n  const barWidth = groupScale.step();\n\n  if (horizontal) {\n    const groupPosition = yScale(yAccessor(datum.datum));\n    const barStart = (groupPosition ?? Infinity) + (barGroupOffset ?? Infinity);\n    const barEnd = barStart + barWidth;\n    const barMiddle = (barStart + barEnd) / 2;\n    const cursorIsOnBar = point.y >= barStart && point.y <= barEnd;\n    return {\n      ...datum,\n      distanceX: 0, // we want all group bars to have same X distance so only Y distance matters\n      distanceY: cursorIsOnBar ? 0 : Math.abs(point.y - barMiddle),\n    };\n  }\n  const groupPosition = xScale(xAccessor(datum.datum));\n  const barStart = (groupPosition ?? Infinity) + (barGroupOffset ?? Infinity);\n  const barEnd = barStart + barWidth;\n  const barMiddle = (barStart + barEnd) / 2;\n  const cursorIsOnBar = point.x >= barStart && point.x <= barEnd;\n  return {\n    ...datum,\n    distanceY: 0, // we want all group bars to have same Y distance so only X distance matters\n    distanceX: cursorIsOnBar ? 0 : Math.abs(point.x - barMiddle),\n  };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/findNearestStackDatum.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { getFirstItem, getSecondItem } from '@visx/shape';\nimport findNearestDatumY from './findNearestDatumY';\nimport findNearestDatumX from './findNearestDatumX';\nimport type { BarStackDatum, NearestDatumArgs } from '../types';\n\n/**\n * This is a wrapper around findNearestDatumX/Y for BarStack, accounting for a\n * Bar's d0 and d1, not just d1 (which findNearestDatum uses). Additionally,\n * returns the BarSeries original `Datum`, not the `BarStackDatum` so\n * Tooltip typing is correct.\n */\nexport default function findNearestStackDatum<\n  XScale extends AxisScale,\n  YScale extends AxisScale,\n  Datum extends object,\n>(\n  nearestDatumArgs: NearestDatumArgs<XScale, YScale, BarStackDatum<XScale, YScale>>,\n  seriesData: Datum[],\n  horizontal?: boolean,\n) {\n  const { xScale, yScale, point } = nearestDatumArgs;\n  const datum = (horizontal ? findNearestDatumY : findNearestDatumX)(nearestDatumArgs);\n  const seriesDatum = datum?.index == null ? null : seriesData[datum.index];\n\n  return datum && seriesDatum && point\n    ? {\n        index: datum.index,\n        datum: seriesDatum,\n        distanceX: horizontal // if mouse is ON the stack series, set 0 distance\n          ? point.x >= Number(xScale(getFirstItem(datum.datum)) ?? Infinity) &&\n            point.x <= Number(xScale(getSecondItem(datum.datum)) ?? -Infinity)\n            ? 0\n            : datum.distanceX\n          : datum.distanceX,\n        distanceY: horizontal\n          ? datum.distanceY // if mouse is ON the stack series, set 0 distance\n          : point.y <= Number(yScale(getFirstItem(datum.datum)) ?? -Infinity) &&\n            point.y >= Number(yScale(getSecondItem(datum.datum)) ?? Infinity)\n          ? 0\n          : datum.distanceY,\n      }\n    : null;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/getBarStackRegistryData.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { getFirstItem, getSecondItem } from '@visx/shape';\nimport { extent } from '@visx/vendor/d3-array';\nimport type { BarStackData, BarStackDatum, DataRegistryEntry } from '../types';\n\nconst getStack = <XScale extends AxisScale, YScale extends AxisScale>(\n  bar: BarStackDatum<XScale, YScale>,\n) => bar?.data?.stack;\n\n// returns average of top + bottom of bar (the middle) as this enables more accurately\n// finding the nearest datum to a FocusEvent (which is based on the middle of the rect bounding box)\nconst getNumericValue = <XScale extends AxisScale, YScale extends AxisScale>(\n  bar: BarStackDatum<XScale, YScale>,\n) => (getFirstItem(bar) + getSecondItem(bar)) / 2;\n\n/** Constructs the `DataRegistryEntry`s for a BarStack, using the stacked data. */\nexport default function getBarStackRegistryData<XScale extends AxisScale, YScale extends AxisScale>(\n  stackedData: BarStackData<XScale, YScale>,\n  comprehensiveDomain: [number, number],\n  horizontal?: boolean,\n) {\n  const [xAccessor, yAccessor] = horizontal\n    ? [getNumericValue, getStack]\n    : [getStack, getNumericValue];\n  return stackedData\n    .map((data, index) => {\n      const entry: DataRegistryEntry<XScale, YScale, BarStackDatum<XScale, YScale>> = {\n        key: data.key,\n        data,\n        xAccessor,\n        yAccessor,\n      };\n\n      // update the numeric domain to account for full data stack\n      // only need to do this for one key\n      if (comprehensiveDomain.length > 0 && index === 0) {\n        if (horizontal) {\n          entry.xScale = (scale) =>\n            scale.domain(extent(scale.domain().concat(comprehensiveDomain))) as typeof scale;\n        } else {\n          entry.yScale = (scale) =>\n            scale.domain(extent(scale.domain().concat(comprehensiveDomain))) as typeof scale;\n        }\n      }\n\n      return entry;\n    })\n    .filter((entry) => entry) as DataRegistryEntry<XScale, YScale, BarStackDatum<XScale, YScale>>[];\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/getChildrenAndGrandchildrenWithProps.ts",
    "content": "import type { ReactElement, ReactNode } from 'react';\nimport { Children } from 'react';\n\n/** Returns whether the ReactNode has props (and therefore is an `Element` versus primitive type) */\nfunction isChildWithProps<P extends object>(child: ReactNode): child is ReactElement<P> {\n  return !!child && typeof child === 'object' && 'props' in child && child.props != null;\n}\n\n/**\n * Returns children and grandchildren of type ReactNode.\n * Flattens children one level to support Fragments and Array type children.\n */\nexport default function getChildrenAndGrandchildrenWithProps<P extends object>(\n  children: ReactNode,\n): ReactElement<P>[] {\n  return Children.toArray(children)\n    .flatMap((child) => {\n      if (isChildWithProps(child) && (child.props as any).children) {\n        return (child.props as any).children;\n      }\n      return child;\n    })\n    .filter((child) => isChildWithProps<P>(child)) as unknown as ReactElement<P>[];\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/getScaleBandwidth.ts",
    "content": "import type { AxisScale } from '@visx/axis';\n\nexport default function getScaleBandwidth<Scale extends AxisScale>(scale?: Scale) {\n  // Broaden type before using 'xxx' in s as typeguard.\n  const s = scale as AxisScale;\n  return s && 'bandwidth' in s ? s?.bandwidth() ?? 0 : 0;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/getScaleBaseline.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { coerceNumber } from '@visx/scale';\nimport isValidNumber from '../typeguards/isValidNumber';\n\n/**\n * Returns the output value of a scale's baseline value, which is either zero\n * or the minimum scale value if its domain doesn't include zero.\n */\nexport default function getScaleBaseline<Scale extends AxisScale>(scale: Scale) {\n  const [a, b] = scale.range().map((rangeBoundary) => coerceNumber(rangeBoundary) ?? 0);\n  const isDescending = a != null && b != null && b < a;\n  const maybeScaleZero = scale(0);\n  const [minOutput, maxOutput] = isDescending ? [b, a] : [a, b];\n\n  // if maybeScaleZero _is_ a number, but the scale is not clamped and it's outside the domain\n  // fallback to the scale's minimum\n  return isDescending\n    ? isValidNumber(maybeScaleZero)\n      ? Math.min(Math.max(minOutput, maybeScaleZero), maxOutput)\n      : maxOutput\n    : isValidNumber(maybeScaleZero)\n    ? Math.max(maybeScaleZero, minOutput)\n    : minOutput;\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/getScaledValueFactory.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport type { ScaleInput } from '@visx/scale';\nimport isValidNumber from '../typeguards/isValidNumber';\nimport getScaleBandwidth from './getScaleBandwidth';\n\n/** Returns a function that takes a Datum as input and returns a scaled value, correcting for the scale's bandwidth if applicable. */\nexport default function getScaledValueFactory<Scale extends AxisScale, Datum>(\n  scale: Scale,\n  accessor: (d: Datum) => ScaleInput<Scale>,\n  align: 'start' | 'center' | 'end' = 'center',\n) {\n  return (d: Datum) => {\n    const scaledValue = scale(accessor(d));\n    if (isValidNumber(scaledValue)) {\n      const bandwidthOffset =\n        (align === 'start' ? 0 : getScaleBandwidth(scale)) / (align === 'center' ? 2 : 1);\n      return scaledValue + bandwidthOffset;\n    }\n    return NaN;\n  };\n}\n"
  },
  {
    "path": "packages/visx-xychart/src/utils/isDiscreteScale.ts",
    "content": "/* eslint-disable @typescript-eslint/no-explicit-any */\nimport type { AxisScaleOutput } from '@visx/axis';\nimport type { ScaleConfig } from '@visx/scale';\n\nexport default function isDiscreteScale(scaleConfig: ScaleConfig<AxisScaleOutput, any, any>) {\n  return (\n    scaleConfig?.type === 'band' || scaleConfig?.type === 'ordinal' || scaleConfig?.type === 'point'\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/test/__mocks__/@visx/event.ts",
    "content": "export function localPoint() {\n  return {\n    x: 5,\n    y: 3,\n    value: () => ({ x: 5, y: 3 }),\n    toArray: () => [5, 3],\n  };\n}\n"
  },
  {
    "path": "packages/visx-xychart/test/classes/DataRegistry.test.ts",
    "content": "import DataRegistry from '../../src/classes/DataRegistry';\n\nconst data = { key: 'visx', data: [], xAccessor: () => 'x', yAccessor: () => 'y' };\n\ndescribe('DataRegistry', () => {\n  it('should be defined', () => {\n    expect(DataRegistry).toBeDefined();\n  });\n\n  it('should register one data', () => {\n    const reg = new DataRegistry();\n    reg.registerData(data);\n    expect(reg.get('visx')).toBe(data);\n    expect(reg.keys()).toEqual(['visx']);\n  });\n\n  it('should register multiple data', () => {\n    const data2 = { key: 'd3', data: [], xAccessor: () => 'x2', yAccessor: () => 'y2' };\n    const reg = new DataRegistry();\n    reg.registerData([data, data2]);\n    expect(reg.get('visx')).toBe(data);\n    expect(reg.get('d3')).toBe(data2);\n    expect(reg.keys()).toEqual(['visx', 'd3']);\n  });\n\n  it('should de-register data', () => {\n    const reg = new DataRegistry();\n    reg.registerData(data);\n    expect(reg.get('visx')).toBe(data);\n    reg.unregisterData('visx');\n    expect(reg.get('visx')).toBeUndefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/Annotation.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { DataContext, Annotation, AnimatedAnnotation } from '../../src';\nimport getDataContext from '../mocks/getDataContext';\n\nconst series = { key: 'visx', data: [{}], xAccessor: () => 4, yAccessor: () => 7 };\n\nfunction setup(children: React.ReactNode) {\n  return render(\n    <DataContext.Provider value={getDataContext(series)}>\n      <svg>{children}</svg>\n    </DataContext.Provider>,\n  );\n}\n\ndescribe('<Annotation />', () => {\n  it('should be defined', () => {\n    expect(Annotation).toBeDefined();\n  });\n  it('should render a VxAnnotation', () => {\n    const { getByText } = setup(\n      <Annotation dataKey={series.key} datum={{}}>\n        {'test'}\n      </Annotation>,\n    );\n    expect(getByText('test')).toBeInTheDocument();\n  });\n  it('should render a VxEditableAnnotation when editable=true', () => {\n    const { container } = setup(\n      <Annotation editable dataKey={series.key} datum={{}}>\n        {'test'}\n      </Annotation>,\n    );\n    // with editable=true, the svg should have a circle overlay with 'cursor: grab' attribute\n    const CircleElement = container.querySelector('circle');\n    expect(CircleElement).toHaveAttribute('cursor');\n  });\n});\n\ndescribe('<AnimatedAnnotation />', () => {\n  it('should be defined', () => {\n    expect(AnimatedAnnotation).toBeDefined();\n  });\n  it('should render a VxAnnotation', () => {\n    const { getByText } = setup(\n      <AnimatedAnnotation dataKey={series.key} datum={{}}>\n        {'test'}\n      </AnimatedAnnotation>,\n    );\n    expect(getByText('test')).toBeInTheDocument();\n  });\n  it('should render a VxEditableAnnotation when editable=true', () => {\n    const { container } = setup(\n      <AnimatedAnnotation editable dataKey={series.key} datum={{}}>\n        {'test'}\n      </AnimatedAnnotation>,\n    );\n\n    // with editable=true, the svg should have a circle overlay with 'cursor: grab' attribute\n    const CircleElement = container.querySelector('circle');\n    expect(CircleElement).toHaveAttribute('cursor');\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/AnnotationCircleSubject.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { AnnotationCircleSubject } from '../../src';\n\ndescribe('<AnnotationCircleSubject />', () => {\n  it('should be defined', () => {\n    expect(AnnotationCircleSubject).toBeDefined();\n  });\n\n  it('should render VxAnnotationCircleSubject', () => {\n    const { container } = render(\n      <svg>\n        <AnnotationCircleSubject x={10} y={10} />\n      </svg>,\n    );\n\n    expect(container.querySelector('circle')).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/AnnotationConnector.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { AnnotationConnector } from '../../src';\n\ndescribe('<AnnotationConnector />', () => {\n  const defaultProps = {\n    x: 100,\n    y: 100,\n    dx: 50,\n    dy: 50,\n  };\n\n  it('should be defined', () => {\n    expect(AnnotationConnector).toBeDefined();\n  });\n\n  it('should render connector line', () => {\n    const { container } = render(\n      <svg>\n        <AnnotationConnector {...defaultProps} />\n      </svg>,\n    );\n\n    const path = container.querySelector('path');\n    expect(path).toBeInTheDocument();\n\n    // Verify the path has correct attributes\n    expect(path).toHaveAttribute('d', expect.any(String));\n    expect(path).toHaveAttribute('stroke', expect.any(String));\n    expect(path).toHaveAttribute('fill', 'transparent');\n\n    // Verify the path connects the correct points\n    const dAttribute = path?.getAttribute('d') || '';\n    expect(dAttribute).toContain('M100,100'); // Should start at x,y\n    expect(dAttribute).toContain('150,150'); // Should end at x+dx,y+dy\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/AnnotationLabel.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { AnnotationLabel } from '../../src';\nimport { addMock, removeMock } from '../mocks/svgMock';\n\n// Mock ResizeObserver\nclass MockResizeObserver {\n  observe = vi.fn();\n  unobserve = vi.fn();\n  disconnect = vi.fn();\n}\n\ndescribe('<AnnotationLabel />', () => {\n  const defaultProps = {\n    x: 100,\n    y: 100,\n    title: 'label',\n    subtitle: 'subtitle',\n    showAnchorLine: true,\n  };\n\n  beforeAll(() => {\n    // Add ResizeObserver mock\n    vi.stubGlobal('ResizeObserver', MockResizeObserver);\n    addMock();\n  });\n\n  afterAll(() => {\n    // Clean up\n    vi.unstubAllGlobals();\n    removeMock();\n  });\n\n  it('should be defined', () => {\n    expect(AnnotationLabel).toBeDefined();\n  });\n\n  it('should render with content', () => {\n    const { getByText } = render(\n      <svg>\n        <AnnotationLabel {...defaultProps} />\n      </svg>,\n    );\n\n    expect(getByText('label')).toBeInTheDocument();\n    expect(getByText('subtitle')).toBeInTheDocument();\n  });\n\n  it('should render within foreignObject', async () => {\n    const { findByText } = render(\n      <svg>\n        <AnnotationLabel\n          {...defaultProps}\n          title=\"Title in foreignObject\"\n          subtitle=\"Subtitle in foreignObject\"\n        />\n      </svg>,\n    );\n\n    // Since foreignObject contains the text, if we can find the text\n    // then foreignObject must exist and be working correctly\n    const title = await findByText('Title in');\n    const subtitle = await findByText('Subtitle in');\n\n    expect(title).toBeInTheDocument();\n    expect(subtitle).toBeInTheDocument();\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/AnnotationLineSubject.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\n\nimport { AnnotationLineSubject } from '../../src';\n\ndescribe('<AnnotationLineSubject />', () => {\n  const defaultProps = {\n    x: 100,\n    y: 100,\n    x1: 100,\n    y1: 100,\n    x2: 200,\n    y2: 200,\n  };\n\n  it('should be defined', () => {\n    expect(AnnotationLineSubject).toBeDefined();\n  });\n\n  it('should render with minimal props', () => {\n    const { container } = render(\n      <svg>\n        <AnnotationLineSubject {...defaultProps} />\n      </svg>,\n    );\n\n    const line = container.querySelector('line');\n    expect(line).toBeInTheDocument();\n    expect(line).toHaveAttribute('x1', '100');\n    expect(line).toHaveAttribute('y1', '100');\n    expect(line).toHaveAttribute('x2', '200');\n    expect(line).toHaveAttribute('y2', '200');\n  });\n\n  it('should render with custom className', () => {\n    const className = 'custom-line';\n    const { container } = render(\n      <svg>\n        <AnnotationLineSubject {...defaultProps} className={className} />\n      </svg>,\n    );\n\n    const line = container.querySelector('line');\n    expect(line).toBeInTheDocument();\n    expect(line).toHaveClass(className);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/AreaSeries.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext, useEffect } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { AnimatedAreaSeries, DataContext, AreaSeries, useEventEmitter } from '../../src';\nimport getDataContext from '../mocks/getDataContext';\nimport setupTooltipTest from '../mocks/setupTooltipTest';\nimport { XYCHART_EVENT_SOURCE } from '../../src/constants';\n\nconst series = { data: [{}], xAccessor: () => 4, yAccessor: () => 7 };\n\ndescribe('<AreaSeries />', () => {\n  it('should be defined', () => {\n    expect(AreaSeries).toBeDefined();\n  });\n\n  it('should render an Area', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <AreaSeries dataKey={'line'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    const Path = container.querySelector('path');\n    expect(Path).toBeInTheDocument();\n  });\n\n  it('should set strokeLinecap=\"round\" to make datum surrounded by nulls visible', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <AreaSeries dataKey={'line'} renderLine={false} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    const Path = container.querySelector('path');\n    expect(Path).toBeInTheDocument();\n    expect(Path).toHaveAttribute('stroke-linecap', 'round');\n  });\n\n  it('should use x/y0Accessors in an Area', () => {\n    const y0Accessor = vi.fn(() => 3);\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <AreaSeries dataKey={'line'} {...series} y0Accessor={y0Accessor} />\n        </svg>\n      </DataContext.Provider>,\n    );\n\n    const Path = container.querySelector('path');\n    expect(Path).toBeInTheDocument();\n    expect(y0Accessor).toHaveBeenCalled();\n  });\n\n  it('should render a LinePath is renderLine=true', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <AreaSeries renderLine dataKey={'line'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n\n    const LinePath = container.querySelector('.visx-line');\n    expect(LinePath).toBeInTheDocument();\n  });\n\n  it('should render Glyphs if focus/blur handlers are set', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          {/* eslint-disable-next-line */}\n          <AreaSeries dataKey={\"line\"} {...series} onFocus={() => { }} />\n        </svg>\n      </DataContext.Provider>,\n    );\n\n    const Circles = container.querySelectorAll('circle');\n    expect(Circles).toHaveLength(series.data.length);\n  });\n\n  it('should invoke showTooltip/hideTooltip on pointermove/pointerout', async () => {\n    const showTooltip = vi.fn();\n    const hideTooltip = vi.fn();\n\n    const EventEmitter = () => {\n      const emit = useEventEmitter();\n\n      useEffect(() => {\n        if (emit) {\n          // Get the SVG element to use as event target\n          const svg = document.querySelector('svg');\n\n          // Create PointerEvent with proper target\n          const moveEvent = new PointerEvent('pointermove', {\n            bubbles: true,\n            clientX: 50,\n            clientY: 50,\n          });\n          Object.defineProperty(moveEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          const outEvent = new PointerEvent('pointerout', {\n            bubbles: true,\n          });\n          Object.defineProperty(outEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          emit(\n            'pointermove',\n            moveEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n          emit(\n            'pointerout',\n            outEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n        }\n      });\n\n      return null;\n    };\n\n    const ConditionalEventEmitter = () => {\n      const { dataRegistry } = useContext(DataContext);\n      // AreaSeries won't render until its data is registered\n      // wait for that to emit the events\n      return dataRegistry?.get('line') ? <EventEmitter /> : null;\n    };\n\n    setupTooltipTest(\n      <>\n        <AreaSeries dataKey={'line'} {...series} />\n        <ConditionalEventEmitter />\n      </>,\n      { showTooltip, hideTooltip },\n    );\n\n    // Wait for async event handlers to be called\n    await waitFor(() => {\n      expect(showTooltip).toHaveBeenCalledTimes(1);\n    });\n\n    expect(hideTooltip).toHaveBeenCalledTimes(1);\n  });\n});\n\ndescribe('<AnimatedAreaSeries />', () => {\n  it('should be defined', () => {\n    expect(AnimatedAreaSeries).toBeDefined();\n  });\n  it('should render an animated.path', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <AnimatedAreaSeries renderLine={false} dataKey={'line'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    const Path = container.querySelectorAll('path');\n    expect(Path).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/AreaStack.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext, useEffect, useRef } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport {\n  AreaStack,\n  AreaSeries,\n  DataProvider,\n  DataContext,\n  useEventEmitter,\n  AnimatedAreaStack,\n} from '../../src';\nimport setupTooltipTest from '../mocks/setupTooltipTest';\nimport { XYCHART_EVENT_SOURCE } from '../../src/constants';\n\nconst providerProps = {\n  initialDimensions: { width: 100, height: 100 },\n  xScale: { type: 'linear' },\n  yScale: { type: 'linear' },\n} as const;\n\nconst accessors = {\n  xAccessor: (d: { x?: number }) => d?.x,\n  yAccessor: (d: { y?: number }) => d?.y,\n};\n\nconst series1 = {\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: 5 },\n  ],\n  ...accessors,\n};\n\nconst series2 = {\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: 20 },\n  ],\n  ...accessors,\n};\n\ndescribe('<AreaStack />', () => {\n  it('should be defined', () => {\n    expect(AreaSeries).toBeDefined();\n  });\n\n  it('should render Areas', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <AreaStack>\n            <AreaSeries dataKey={'area1'} {...series1} />\n            <AreaSeries dataKey={'area2'} {...series2} />\n          </AreaStack>\n        </svg>\n      </DataProvider>,\n    );\n    const Areas = container.querySelectorAll('.visx-area');\n    expect(Areas).toHaveLength(2);\n  });\n\n  it('should render LinePaths if renderLine=true', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <AreaStack renderLine>\n            <AreaSeries dataKey={'area1'} {...series1} />\n            <AreaSeries dataKey={'area2'} {...series2} />\n          </AreaStack>\n        </svg>\n      </DataProvider>,\n    );\n    const LinePaths = container.querySelectorAll('.visx-line');\n    expect(LinePaths).toHaveLength(2);\n  });\n\n  it('should render Glyphs if focus/blur handlers are set', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <AreaStack onFocus={() => {}}>\n            <AreaSeries dataKey={'area1'} {...series1} />\n          </AreaStack>\n        </svg>\n      </DataProvider>,\n    );\n    const Circles = container.querySelectorAll('circle');\n    expect(Circles).toHaveLength(series1.data.length);\n  });\n\n  it('should update scale domain to include stack sums including negative values', async () => {\n    let yScale: any;\n\n    function Assertion() {\n      yScale = useContext(DataContext).yScale;\n      return null;\n    }\n\n    render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <AreaStack>\n            <AreaSeries dataKey={'area1'} {...series1} />\n            <AreaSeries\n              dataKey={'area2'}\n              {...series2}\n              data={[\n                { x: 10, y: 5 },\n                { x: 7, y: -20 },\n              ]}\n            />\n          </AreaStack>\n        </svg>\n        <Assertion />\n      </DataProvider>,\n    );\n\n    await waitFor(() => {\n      expect(yScale.domain()).toEqual([-20, 10]);\n    });\n  });\n\n  it('should invoke showTooltip/hideTooltip on pointermove/pointerout', async () => {\n    expect.assertions(2);\n\n    const showTooltip = vi.fn();\n    const hideTooltip = vi.fn();\n\n    const EventEmitter = () => {\n      const emit = useEventEmitter();\n      const { yScale } = useContext(DataContext);\n      const hasEmitted = useRef(false);\n\n      useEffect(() => {\n        // checking for yScale ensures stack data is registered and stacks are rendered\n        if (emit && yScale && !hasEmitted.current) {\n          hasEmitted.current = true;\n\n          // Get the SVG element to use as event target\n          const svg = document.querySelector('svg');\n\n          // Create PointerEvent with proper target\n          const moveEvent = new PointerEvent('pointermove', {\n            bubbles: true,\n            clientX: 50,\n            clientY: 50,\n          });\n          Object.defineProperty(moveEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          const outEvent = new PointerEvent('pointerout', {\n            bubbles: true,\n          });\n          Object.defineProperty(outEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          emit(\n            'pointermove',\n            moveEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n          emit(\n            'pointerout',\n            outEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n        }\n      });\n\n      return null;\n    };\n\n    setupTooltipTest(\n      <>\n        <AreaStack>\n          <AreaSeries dataKey={'area1'} {...series1} />\n          <AreaSeries dataKey={'area2'} {...series2} />\n        </AreaStack>\n        <EventEmitter />\n      </>,\n      { showTooltip, hideTooltip },\n    );\n\n    // Wait for both async event handlers to be called\n    await waitFor(() => {\n      expect(showTooltip).toHaveBeenCalledTimes(2); // one per key\n      expect(hideTooltip).toHaveBeenCalledTimes(1);\n    });\n  });\n});\n\ndescribe('<AnimatedAreaStack />', () => {\n  it('should be defined', () => {\n    expect(AnimatedAreaStack).toBeDefined();\n  });\n  it('should render an animated.path', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <AnimatedAreaStack renderLine={false}>\n            <AreaSeries dataKey={'area1'} {...series1} />\n            <AreaSeries dataKey={'area2'} {...series2} />\n          </AnimatedAreaStack>\n        </svg>\n      </DataProvider>,\n    );\n    const Circles = container.querySelectorAll('path');\n    expect(Circles).toHaveLength(2);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/Axis.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { scaleLinear } from '@visx/scale';\nimport BaseAxis from '../../src/components/axis/BaseAxis';\nimport { Axis, AnimatedAxis, DataContext, lightTheme } from '../../src';\nimport getDataContext from '../mocks/getDataContext';\nimport { addMock, removeMock } from '../mocks/svgMock';\n\nconst series = { key: 'visx', data: [{}], xAccessor: () => 4, yAccessor: () => 7 };\n\nfunction setup(\n  children: React.ReactNode,\n  contextOverrides?: Partial<ReturnType<typeof getDataContext>>,\n) {\n  return render(\n    <DataContext.Provider value={{ ...getDataContext(series), ...contextOverrides }}>\n      <svg>{children}</svg>\n    </DataContext.Provider>,\n  );\n}\n\ndescribe('<Axis />', () => {\n  beforeAll(addMock);\n  afterAll(removeMock);\n\n  it('should be defined', () => {\n    expect(Axis).toBeDefined();\n  });\n  it('should render a VxAxis', () => {\n    expect(\n      setup(<Axis orientation=\"bottom\" />).container.querySelectorAll('.visx-axis'),\n    ).toHaveLength(1);\n  });\n});\n\ndescribe('<AnimatedAxis />', () => {\n  beforeAll(addMock);\n  afterAll(removeMock);\n\n  it('should be defined', () => {\n    expect(AnimatedAxis).toBeDefined();\n  });\n  it('should render a VxAnimatedAxis', () => {\n    expect(\n      setup(<AnimatedAxis orientation=\"bottom\" />).container.querySelectorAll('.visx-axis'),\n    ).toHaveLength(1);\n  });\n});\n\ndescribe('<BaseAxis />', () => {\n  beforeAll(addMock);\n  afterAll(removeMock);\n\n  it('should be defined', () => {\n    expect(BaseAxis).toBeDefined();\n  });\n  it('<BaseAxis/> renders', () => {\n    const { container } = setup(\n      <BaseAxis orientation=\"top\" AxisComponent={() => <Axis orientation=\"top\" />} />,\n    );\n    const AxisComponents = container.querySelectorAll('.visx-axis');\n    expect(AxisComponents).toHaveLength(1);\n  });\n\n  it('should use scale=xScale for orientation=top (or bottom)', () => {\n    const xScale = scaleLinear({ domain: [0, 4], range: [0, 10] });\n    const { container } = setup(\n      <BaseAxis orientation=\"top\" AxisComponent={() => <Axis orientation=\"top\" />} />,\n      { xScale },\n    );\n    const TickLabels = container.querySelectorAll('tspan');\n    expect(TickLabels[0].textContent).toBe('0.0');\n    expect(TickLabels[0]).toHaveAttribute('x', '0');\n    expect(TickLabels[TickLabels.length - 1].textContent).toBe('4.0');\n    expect(TickLabels[TickLabels.length - 1]).toHaveAttribute('x', '10');\n  });\n\n  it('should use scale=yScale for orientation=left (or right)', () => {\n    const yScale = scaleLinear({ domain: [0, 4], range: [0, 10] });\n    const { container } = setup(\n      <BaseAxis orientation=\"left\" AxisComponent={() => <Axis orientation=\"left\" />} />,\n      { yScale },\n    );\n    const TickLabels = container.querySelectorAll('tspan');\n    expect(TickLabels[0].textContent).toBe('0.0');\n    expect(TickLabels[0].parentNode).toHaveAttribute('y', '0');\n    expect(TickLabels[TickLabels.length - 1].textContent).toBe('4.0');\n    expect(TickLabels[TickLabels.length - 1].parentNode).toHaveAttribute('y', '10');\n  });\n\n  it('should use axis styles from context theme unless specified in props', () => {\n    const axisStyles = lightTheme.axisStyles.x.top;\n    const { container } = setup(\n      <BaseAxis\n        orientation=\"left\"\n        AxisComponent={() => <Axis orientation=\"top\" stroke=\"#22222\" tickLength={12345} />}\n      />,\n    );\n\n    const VisxAxisLine = container.querySelector('.visx-axis-line');\n    const VisxLine = container.querySelector('.visx-line');\n\n    // specified styles in the props\n    expect(VisxAxisLine).toHaveAttribute('stroke', '#22222');\n    // tick length = y1-y2 of axis line\n    expect(VisxLine).toHaveAttribute('y1', '0');\n    expect(VisxLine).toHaveAttribute('y2', '-12345');\n\n    // context theme styles\n    expect(VisxLine).toHaveAttribute('stroke-width', `${axisStyles.axisLine.strokeWidth}`);\n    expect(VisxLine).toHaveAttribute('stroke', axisStyles.tickLine.stroke);\n  });\n\n  it('should accept props for tickline', () => {\n    const tickLineProps = { strokeWidth: 12345, stroke: 'banana', opacity: 0.5 };\n    const { container } = setup(\n      <BaseAxis\n        orientation=\"left\"\n        AxisComponent={() => <AnimatedAxis orientation=\"top\" tickLineProps={tickLineProps} />}\n      />,\n    );\n\n    const VisxAxisTick = container.querySelector('.visx-axis-tick > line');\n\n    // specified styles in the props\n    expect(VisxAxisTick).toHaveAttribute('stroke-width', `${tickLineProps.strokeWidth}`);\n    expect(VisxAxisTick).toHaveAttribute('stroke', `${tickLineProps.stroke}`);\n    expect(VisxAxisTick).toHaveAttribute('opacity', `${tickLineProps.opacity}`);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/BarGroup.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext, useEffect, useRef } from 'react';\nimport '@testing-library/jest-dom';\nimport { render, waitFor } from '@testing-library/react';\nimport {\n  AnimatedBarGroup,\n  BarGroup,\n  BarSeries,\n  DataContext,\n  DataProvider,\n  useEventEmitter,\n} from '../../src';\nimport setupTooltipTest from '../mocks/setupTooltipTest';\nimport { XYCHART_EVENT_SOURCE } from '../../src/constants';\n\nconst providerProps = {\n  initialDimensions: { width: 100, height: 100 },\n  xScale: { type: 'linear' },\n  yScale: { type: 'linear' },\n} as const;\n\nconst accessors = {\n  xAccessor: (d: { x?: number }) => d?.x,\n  yAccessor: (d: { y?: number }) => d?.y,\n};\n\nconst series1 = {\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: 5 },\n  ],\n  ...accessors,\n};\n\nconst series2 = {\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: 20 },\n  ],\n  ...accessors,\n};\n\nconst seriesMissingData = {\n  data: [{ y: 5 }, { x: 7 }, { x: 7, y: 20 }],\n  ...accessors,\n};\n\ndescribe('<BarGroup />', () => {\n  it('should be defined', () => {\n    expect(BarSeries).toBeDefined();\n  });\n\n  it('should render rects', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarGroup>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries dataKey={'bar2'} {...series2} />\n          </BarGroup>\n        </svg>\n      </DataProvider>,\n    );\n    expect(container.querySelectorAll('rect')).toHaveLength(4);\n  });\n\n  it('should render BarRounded if radius is set', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarGroup>\n            <BarSeries dataKey={'bar1'} radiusAll radius={4} {...series1} />\n            <BarSeries dataKey={'bar2'} {...series2} />\n          </BarGroup>\n        </svg>\n      </DataProvider>,\n    );\n    expect(container.querySelectorAll('path')).toHaveLength(2);\n  });\n\n  it('should use colorAccessor if passed', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarGroup>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries\n              dataKey={'bar2'}\n              {...series2}\n              colorAccessor={(_, i) => (i === 0 ? 'banana' : null)}\n            />\n          </BarGroup>\n        </svg>\n      </DataProvider>,\n    );\n    const rects = container.querySelectorAll('rect');\n    expect(rects[0]).not.toHaveAttribute('fill', 'banana');\n    expect(rects[1]).not.toHaveAttribute('fill', 'banana');\n    expect(rects[2]).toHaveAttribute('fill', 'banana');\n    expect(rects[3]).not.toHaveAttribute('fill', 'banana');\n  });\n\n  it('should not render rects with invalid x or y', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarGroup>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries dataKey={'seriesMissingData'} {...seriesMissingData} />\n          </BarGroup>\n        </svg>\n      </DataProvider>,\n    );\n    expect(container.querySelectorAll('rect')).toHaveLength(3);\n  });\n\n  it('should invoke showTooltip/hideTooltip on pointermove/pointerout', async () => {\n    expect.assertions(2);\n\n    const showTooltip = vi.fn();\n    const hideTooltip = vi.fn();\n\n    const EventEmitter = () => {\n      const emit = useEventEmitter();\n      const { yScale } = useContext(DataContext);\n      const hasEmitted = useRef(false);\n\n      useEffect(() => {\n        // checking for yScale ensures stack data is registered and stacks are rendered\n        if (emit && yScale && !hasEmitted.current) {\n          hasEmitted.current = true;\n\n          // Get the SVG element to use as event target\n          const svg = document.querySelector('svg');\n\n          // Create PointerEvent with proper target\n          const moveEvent = new PointerEvent('pointermove', {\n            bubbles: true,\n            clientX: 50,\n            clientY: 50,\n          });\n          Object.defineProperty(moveEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          const outEvent = new PointerEvent('pointerout', {\n            bubbles: true,\n          });\n          Object.defineProperty(outEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          emit(\n            'pointermove',\n            moveEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n          emit(\n            'pointerout',\n            outEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n        }\n      });\n\n      return null;\n    };\n\n    setupTooltipTest(\n      <>\n        <BarGroup>\n          <BarSeries dataKey={'bar1'} {...series1} />\n          <BarSeries dataKey={'bar2'} {...series2} />\n        </BarGroup>\n        <EventEmitter />\n      </>,\n      { showTooltip, hideTooltip },\n    );\n\n    // Wait for async event handlers to be called\n    await waitFor(() => {\n      expect(showTooltip).toHaveBeenCalledTimes(2); // one per key\n    });\n\n    expect(hideTooltip).toHaveBeenCalledTimes(1);\n  });\n});\n\ndescribe('<AnimatedBarGroup />', () => {\n  it('should be defined', () => {\n    expect(AnimatedBarGroup).toBeDefined();\n  });\n  it('should render an animated.rect', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <AnimatedBarGroup>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries dataKey={'bar2'} {...series2} />\n          </AnimatedBarGroup>\n        </svg>\n      </DataProvider>,\n    );\n    expect(container.querySelectorAll('rect')).toHaveLength(4);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/BarSeries.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext, useEffect } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { DataContext, AnimatedBarSeries, BarSeries, useEventEmitter } from '../../src';\nimport getDataContext from '../mocks/getDataContext';\nimport setupTooltipTest from '../mocks/setupTooltipTest';\nimport { XYCHART_EVENT_SOURCE } from '../../src/constants';\n\nconst series = { data: [{}, {}], xAccessor: () => 0, yAccessor: () => 10 };\nconst seriesMissingData = {\n  data: [{ x: 1 }, { x: 0, y: 3 }, { y: 2 }],\n  xAccessor: (d: { x?: number }) => d.x,\n  yAccessor: (d: { y?: number }) => d.y,\n};\n\ndescribe('<BarSeries />', () => {\n  it('should be defined', () => {\n    expect(BarSeries).toBeDefined();\n  });\n\n  it('should render rects', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'bar', ...series })}>\n        <svg>\n          <BarSeries dataKey={'bar'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('rect')).toHaveLength(2);\n  });\n\n  it('should render rounded rects if radius is set', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'bar', ...series })}>\n        <svg>\n          <BarSeries dataKey={'bar'} radiusAll radius={4} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('path')).toHaveLength(2);\n  });\n\n  it('should use colorAccessor if passed', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'bar', ...series })}>\n        <svg>\n          <BarSeries\n            dataKey={'bar'}\n            {...series}\n            colorAccessor={(_, i) => (i === 0 ? 'banana' : null)}\n          />\n        </svg>\n      </DataContext.Provider>,\n    );\n    const rects = container.querySelectorAll('rect');\n    expect(rects[0]).toHaveAttribute('fill', 'banana');\n    expect(rects[1]).not.toHaveAttribute('fill', 'banana');\n  });\n\n  it('should not render rects if x or y is invalid', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'barMissingData', ...seriesMissingData })}>\n        <svg>\n          <BarSeries dataKey={'barMissingData'} {...seriesMissingData} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('rect')).toHaveLength(1);\n  });\n\n  it('should invoke showTooltip/hideTooltip on pointermove/pointerout', async () => {\n    expect.assertions(2);\n\n    const showTooltip = vi.fn();\n    const hideTooltip = vi.fn();\n\n    const EventEmitter = () => {\n      const emit = useEventEmitter();\n\n      useEffect(() => {\n        if (emit) {\n          // Get the SVG element to use as event target\n          const svg = document.querySelector('svg');\n\n          // Create PointerEvent with proper target\n          const moveEvent = new PointerEvent('pointermove', {\n            bubbles: true,\n            clientX: 50,\n            clientY: 50,\n          });\n          Object.defineProperty(moveEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          const outEvent = new PointerEvent('pointerout', {\n            bubbles: true,\n          });\n          Object.defineProperty(outEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          emit(\n            'pointermove',\n            moveEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n          emit(\n            'pointerout',\n            outEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n        }\n      });\n\n      return null;\n    };\n\n    const ConditionalEventEmitter = () => {\n      const { dataRegistry } = useContext(DataContext);\n      // BarSeries won't render until its data is registered\n      // wait for that to emit the events\n      return dataRegistry?.get('bar') ? <EventEmitter /> : null;\n    };\n\n    setupTooltipTest(\n      <>\n        <BarSeries dataKey={'bar'} {...series} />\n        <ConditionalEventEmitter />\n      </>,\n      { showTooltip, hideTooltip },\n    );\n\n    // Wait for async event handlers to be called\n    await waitFor(() => {\n      expect(showTooltip).toHaveBeenCalledTimes(1);\n    });\n\n    expect(hideTooltip).toHaveBeenCalledTimes(1);\n  });\n});\n\ndescribe('<AnimatedBarSeries />', () => {\n  it('should be defined', () => {\n    expect(AnimatedBarSeries).toBeDefined();\n  });\n  it('should render an animated.rect', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'bar', ...series })}>\n        <svg>\n          <AnimatedBarSeries dataKey={'bar'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('rect')).toHaveLength(series.data.length);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/BarStack.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext, useEffect, useRef } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport {\n  BarStack,\n  BarSeries,\n  DataProvider,\n  DataContext,\n  useEventEmitter,\n  AnimatedBarStack,\n} from '../../src';\nimport setupTooltipTest from '../mocks/setupTooltipTest';\nimport { XYCHART_EVENT_SOURCE } from '../../src/constants';\n\nconst providerProps = {\n  initialDimensions: { width: 100, height: 100 },\n  xScale: { type: 'linear' },\n  yScale: { type: 'linear' },\n} as const;\n\nconst accessors = {\n  xAccessor: (d: { x?: number }) => d?.x,\n  yAccessor: (d: { y?: number }) => d?.y,\n};\n\nconst series1 = {\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: 5 },\n  ],\n  ...accessors,\n};\n\nconst series2 = {\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: 20 },\n  ],\n  ...accessors,\n};\nconst seriesMissingData = {\n  data: [{ y: 5 }, { x: 7 }, { x: 7, y: 20 }],\n  ...accessors,\n};\n\ndescribe('<BarStack />', () => {\n  it('should be defined', () => {\n    expect(BarSeries).toBeDefined();\n  });\n\n  it('should render rects', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarStack>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries dataKey={'bar2'} {...series2} />\n          </BarStack>\n        </svg>\n      </DataProvider>,\n    );\n    const RectElements = container.querySelectorAll('rect');\n    expect(RectElements).toHaveLength(4);\n  });\n\n  it('should render BarRounded if radius is set', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarStack>\n            <BarSeries dataKey={'bar1'} radiusAll radius={4} {...series1} />\n            <BarSeries dataKey={'bar2'} {...series2} />\n          </BarStack>\n        </svg>\n      </DataProvider>,\n    );\n    expect(container.querySelectorAll('path')).toHaveLength(2);\n  });\n\n  it('should use colorAccessor if passed', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarStack>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries\n              dataKey={'bar2'}\n              {...series2}\n              colorAccessor={(_, i) => (i === 0 ? 'banana' : null)}\n            />\n          </BarStack>\n        </svg>\n      </DataProvider>,\n    );\n    const RectElements = container.querySelectorAll('rect');\n    expect(RectElements[0]).not.toHaveAttribute('fill', 'banana');\n    expect(RectElements[1]).not.toHaveAttribute('fill', 'banana');\n    expect(RectElements[2]).toHaveAttribute('fill', 'banana');\n    expect(RectElements[3]).not.toHaveAttribute('fill', 'banana');\n  });\n\n  it('should not render rects if x or y are invalid', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarStack>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries dataKey={'seriesMissingData'} {...seriesMissingData} />\n          </BarStack>\n        </svg>\n      </DataProvider>,\n    );\n    const RectElements = container.querySelectorAll('rect');\n    expect(RectElements).toHaveLength(3);\n  });\n\n  it('should update scale domain to include stack sums including negative values', async () => {\n    let yScale: any;\n\n    function Assertion() {\n      yScale = useContext(DataContext).yScale;\n\n      return null;\n    }\n\n    render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <BarStack>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries\n              dataKey={'bar2'}\n              {...series2}\n              data={[\n                { x: 10, y: 5 },\n                { x: 7, y: -20 },\n              ]}\n            />\n          </BarStack>\n        </svg>\n        <Assertion />\n      </DataProvider>,\n    );\n\n    await waitFor(() => {\n      expect(yScale.domain()).toEqual([-20, 10]);\n    });\n  });\n\n  it('should invoke showTooltip/hideTooltip on pointermove/pointerout', async () => {\n    expect.assertions(2);\n\n    const showTooltip = vi.fn();\n    const hideTooltip = vi.fn();\n\n    const EventEmitter = () => {\n      const emit = useEventEmitter();\n      const { yScale } = useContext(DataContext);\n      const hasEmitted = useRef(false);\n\n      useEffect(() => {\n        // checking for yScale ensures stack data is registered and stacks are rendered\n        if (emit && yScale && !hasEmitted.current) {\n          hasEmitted.current = true;\n\n          // Get the SVG element to use as event target\n          const svg = document.querySelector('svg');\n\n          // Create PointerEvent with proper target\n          const moveEvent = new PointerEvent('pointermove', {\n            bubbles: true,\n            clientX: 50,\n            clientY: 50,\n          });\n          Object.defineProperty(moveEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          const outEvent = new PointerEvent('pointerout', {\n            bubbles: true,\n          });\n          Object.defineProperty(outEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          emit(\n            'pointermove',\n            moveEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n          emit(\n            'pointerout',\n            outEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n        }\n      });\n\n      return null;\n    };\n\n    setupTooltipTest(\n      <>\n        <BarStack>\n          <BarSeries dataKey={'bar1'} {...series1} />\n          <BarSeries dataKey={'bar2'} {...series2} />\n        </BarStack>\n        <EventEmitter />\n      </>,\n      { showTooltip, hideTooltip },\n    );\n\n    // Wait for async event handlers to be called\n    await waitFor(() => {\n      expect(showTooltip).toHaveBeenCalledTimes(2); // one per key\n    });\n\n    expect(hideTooltip).toHaveBeenCalledTimes(1);\n  });\n});\n\ndescribe('<AnimatedBarStack />', () => {\n  it('should be defined', () => {\n    expect(AnimatedBarStack).toBeDefined();\n  });\n  it('should render an animated.rect', () => {\n    const { container } = render(\n      <DataProvider {...providerProps}>\n        <svg>\n          <AnimatedBarStack>\n            <BarSeries dataKey={'bar1'} {...series1} />\n            <BarSeries dataKey={'bar2'} {...series2} />\n          </AnimatedBarStack>\n        </svg>\n      </DataProvider>,\n    );\n    const RectElements = container.querySelectorAll('rect');\n    expect(RectElements).toHaveLength(4);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/GlyphSeries.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext, useEffect } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { AnimatedGlyphSeries, DataContext, GlyphSeries, useEventEmitter } from '../../src';\nimport getDataContext from '../mocks/getDataContext';\nimport setupTooltipTest from '../mocks/setupTooltipTest';\nimport { XYCHART_EVENT_SOURCE } from '../../src/constants';\n\nconst series = { data: [{}, {}], xAccessor: () => 4, yAccessor: () => 7 };\nconst seriesMissingData = {\n  data: [{ x: 1 }, { x: 0, y: 3 }, { y: 2 }],\n  xAccessor: (d: { x?: number }) => d.x,\n  yAccessor: (d: { y?: number }) => d.y,\n};\n\ndescribe('<GlyphSeries />', () => {\n  it('should be defined', () => {\n    expect(GlyphSeries).toBeDefined();\n  });\n\n  it('should render a DefaultGlyph for each Datum', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'glyph', ...series })}>\n        <svg>\n          <GlyphSeries dataKey={'glyph'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('circle')).toHaveLength(series.data.length);\n  });\n\n  it('should use colorAccessor if passed', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'glyph', ...series })}>\n        <svg>\n          <GlyphSeries\n            dataKey={'glyph'}\n            {...series}\n            colorAccessor={(_, i) => (i === 0 ? 'banana' : null)}\n          />\n        </svg>\n      </DataContext.Provider>,\n    );\n    const circles = container.querySelectorAll('circle');\n    expect(circles[0]).toHaveAttribute('fill', 'banana');\n    expect(circles[1]).not.toHaveAttribute('fill', 'banana');\n  });\n\n  it('should not render Glyphs if x or y is invalid', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'barMissingData', ...seriesMissingData })}>\n        <svg>\n          <GlyphSeries dataKey={'barMissingData'} {...seriesMissingData} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('circle')).toHaveLength(1);\n  });\n\n  it('should render a custom Glyph for each Datum', () => {\n    const customRenderGlyph = () => <rect className=\"custom-glyph\" />;\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'glyph', ...series })}>\n        <svg>\n          <GlyphSeries dataKey={'glyph'} {...series} renderGlyph={customRenderGlyph} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('.custom-glyph')).toHaveLength(series.data.length);\n  });\n\n  it('should invoke showTooltip/hideTooltip on pointermove/pointerout', async () => {\n    expect.assertions(2);\n\n    const showTooltip = vi.fn();\n    const hideTooltip = vi.fn();\n\n    const EventEmitter = () => {\n      const emit = useEventEmitter();\n\n      useEffect(() => {\n        if (emit) {\n          // Get the SVG element to use as event target\n          const svg = document.querySelector('svg');\n\n          // Create PointerEvent with proper target\n          const moveEvent = new PointerEvent('pointermove', {\n            bubbles: true,\n            clientX: 50,\n            clientY: 50,\n          });\n          Object.defineProperty(moveEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          const outEvent = new PointerEvent('pointerout', {\n            bubbles: true,\n          });\n          Object.defineProperty(outEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          emit(\n            'pointermove',\n            moveEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n          emit(\n            'pointerout',\n            outEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n        }\n      });\n\n      return null;\n    };\n\n    const ConditionalEventEmitter = () => {\n      const { dataRegistry } = useContext(DataContext);\n      // GlyphSeries won't render until its data is registered\n      // wait for that to emit the events\n      return dataRegistry?.get('glyph') ? <EventEmitter /> : null;\n    };\n\n    setupTooltipTest(\n      <>\n        <GlyphSeries dataKey={'glyph'} {...series} />\n        <ConditionalEventEmitter />\n      </>,\n      { showTooltip, hideTooltip },\n    );\n\n    // Wait for async event handlers to be called\n    await waitFor(() => {\n      expect(showTooltip).toHaveBeenCalledTimes(1);\n    });\n\n    expect(hideTooltip).toHaveBeenCalledTimes(1);\n  });\n});\n\ndescribe('<AnimatedGlyphSeries />', () => {\n  it('should be defined', () => {\n    expect(AnimatedGlyphSeries).toBeDefined();\n  });\n  it('should render an animated.g for each datum', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'glyph', ...series })}>\n        <svg>\n          <AnimatedGlyphSeries dataKey={'glyph'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('g')).toHaveLength(series.data.length);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/Grid.test.tsx",
    "content": "import * as React from 'react';\nimport { render } from '@testing-library/react';\nimport { Grid, AnimatedGrid, DataContext } from '../../src';\nimport getDataContext from '../mocks/getDataContext';\n\nconst mockContext = getDataContext();\n\ndescribe('<Grid />', () => {\n  it('should be defined', () => {\n    expect(Grid).toBeDefined();\n  });\n  it('should render VxGridRows if rows=true', () => {\n    const { container } = render(\n      <DataContext.Provider value={mockContext}>\n        <svg>\n          <Grid rows columns={false} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('.visx-rows')).toHaveLength(1);\n    expect(container.querySelectorAll('.visx-columns')).toHaveLength(0);\n  });\n  it('should render VxGridColumns if columns=true', () => {\n    const { container } = render(\n      <DataContext.Provider value={mockContext}>\n        <svg>\n          <Grid rows={false} columns />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('.visx-rows')).toHaveLength(0);\n    expect(container.querySelectorAll('.visx-columns')).toHaveLength(1);\n  });\n});\n\ndescribe('<AnimatedGrid />', () => {\n  it('should be defined', () => {\n    expect(AnimatedGrid).toBeDefined();\n  });\n  it('should render VxAnimatedGridRows if rows=true', () => {\n    const { container } = render(\n      <DataContext.Provider value={mockContext}>\n        <svg>\n          <AnimatedGrid rows columns={false} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('.visx-rows')).toHaveLength(1);\n    expect(container.querySelectorAll('.visx-columns')).toHaveLength(0);\n  });\n  it('should render VxAnimatedGridColumns if columns=true', () => {\n    const { container } = render(\n      <DataContext.Provider value={mockContext}>\n        <svg>\n          <AnimatedGrid rows={false} columns />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('.visx-rows')).toHaveLength(0);\n    expect(container.querySelectorAll('.visx-columns')).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/LineSeries.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext, useEffect } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { AnimatedLineSeries, DataContext, LineSeries, useEventEmitter } from '../../src';\nimport getDataContext from '../mocks/getDataContext';\nimport setupTooltipTest from '../mocks/setupTooltipTest';\nimport { XYCHART_EVENT_SOURCE } from '../../src/constants';\n\nconst series = { data: [{}], xAccessor: () => 4, yAccessor: () => 7 };\n\ndescribe('<LineSeries />', () => {\n  it('should be defined', () => {\n    expect(LineSeries).toBeDefined();\n  });\n\n  it('should render a LinePath', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <LineSeries dataKey={'line'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('path')).toHaveLength(1);\n  });\n\n  it('should set strokeLinecap=\"round\" to make datum surrounded by nulls visible', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <LineSeries dataKey={'line'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelector('path')).toHaveAttribute('stroke-linecap', 'round');\n  });\n\n  it('should render Glyphs if focus/blur handlers are set', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <LineSeries dataKey={'line'} {...series} onFocus={() => {}} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('circle')).toHaveLength(series.data.length);\n  });\n\n  it('should invoke showTooltip/hideTooltip on pointermove/pointerout', async () => {\n    expect.assertions(2);\n\n    const showTooltip = vi.fn();\n    const hideTooltip = vi.fn();\n\n    const EventEmitter = () => {\n      const emit = useEventEmitter();\n\n      useEffect(() => {\n        if (emit) {\n          // Get the SVG element to use as event target\n          const svg = document.querySelector('svg');\n\n          // Create PointerEvent with proper target\n          const moveEvent = new PointerEvent('pointermove', {\n            bubbles: true,\n            clientX: 50,\n            clientY: 50,\n          });\n          Object.defineProperty(moveEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          const outEvent = new PointerEvent('pointerout', {\n            bubbles: true,\n          });\n          Object.defineProperty(outEvent, 'target', {\n            value: svg,\n            enumerable: true,\n          });\n\n          emit(\n            'pointermove',\n            moveEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n          emit(\n            'pointerout',\n            outEvent as unknown as React.PointerEvent<Element>,\n            XYCHART_EVENT_SOURCE,\n          );\n        }\n      });\n\n      return null;\n    };\n\n    const ConditionalEventEmitter = () => {\n      const { dataRegistry } = useContext(DataContext);\n      // LineSeries won't render until its data is registered\n      // wait for that to emit the events\n      return dataRegistry?.get('line') ? <EventEmitter /> : null;\n    };\n\n    setupTooltipTest(\n      <>\n        <LineSeries dataKey={'line'} {...series} />\n        <ConditionalEventEmitter />\n      </>,\n      { showTooltip, hideTooltip },\n    );\n\n    // Wait for async event handlers to be called\n    await waitFor(() => {\n      expect(showTooltip).toHaveBeenCalledTimes(1);\n    });\n\n    expect(hideTooltip).toHaveBeenCalledTimes(1);\n  });\n\n  it('should use colorAccessor if passed', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <LineSeries dataKey={'line'} {...series} colorAccessor={(_) => 'banana'} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelector('path')).toHaveAttribute('stroke', 'banana');\n  });\n});\n\ndescribe('<AnimatedLineSeries />', () => {\n  it('should be defined', () => {\n    expect(AnimatedLineSeries).toBeDefined();\n  });\n  it('should render an animated.path', () => {\n    const { container } = render(\n      <DataContext.Provider value={getDataContext({ key: 'line', ...series })}>\n        <svg>\n          <AnimatedLineSeries dataKey={'line'} {...series} />\n        </svg>\n      </DataContext.Provider>,\n    );\n    expect(container.querySelectorAll('path')).toHaveLength(1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/Tooltip.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React from 'react';\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport type { AnyD3Scale } from '@visx/scale';\nimport type { DataRegistryEntry, TooltipContextType } from '../../src';\nimport { DataContext, Tooltip, TooltipContext } from '../../src';\nimport type { TooltipProps } from '../../src/components/Tooltip';\nimport getDataContext from '../mocks/getDataContext';\n\ndescribe('<Tooltip />', () => {\n  type SetupProps =\n    | {\n        props?: Partial<TooltipProps<object>>;\n        context?: Partial<TooltipContextType<object>>;\n        dataEntries?: DataRegistryEntry<AnyD3Scale, AnyD3Scale, {}>[];\n      }\n    | undefined;\n\n  function setup({ props, context, dataEntries = [] }: SetupProps = {}) {\n    //  Disable Warning: render(): Rendering components directly into document.body is discouraged.\n    const wrapper = render(\n      <DataContext.Provider\n        value={{\n          ...getDataContext(dataEntries),\n        }}\n      >\n        <TooltipContext.Provider\n          value={{\n            tooltipOpen: false,\n            showTooltip: vi.fn(),\n            updateTooltip: vi.fn(),\n            hideTooltip: vi.fn(),\n            ...context,\n          }}\n        >\n          <Tooltip\n            resizeObserverPolyfill={ResizeObserver}\n            renderTooltip={() => <div />}\n            {...props}\n          />\n        </TooltipContext.Provider>\n      </DataContext.Provider>,\n    );\n    return wrapper;\n  }\n  it('should be defined', () => {\n    expect(Tooltip).toBeDefined();\n  });\n\n  it('should not render a BaseTooltip when TooltipContext.tooltipOpen=false', () => {\n    const { container } = setup();\n    expect(container?.parentNode?.querySelectorAll('.visx-tooltip')).toHaveLength(0);\n  });\n\n  it('should not render a BaseTooltip when TooltipContext.tooltipOpen=true and renderTooltip returns false', () => {\n    const { container } = setup({\n      context: { tooltipOpen: true },\n      props: { renderTooltip: () => null },\n    });\n    expect(container?.parentNode?.querySelectorAll('.visx-tooltip')).toHaveLength(0);\n  });\n\n  it('should render a BaseTooltip when TooltipContext.tooltipOpen=true and renderTooltip returns non-null', () => {\n    const { container } = setup({\n      props: { renderTooltip: () => <div />, snapTooltipToDatumX: true },\n      context: { tooltipOpen: true },\n    });\n    expect(container?.parentNode?.querySelectorAll('.visx-tooltip')).toHaveLength(1);\n  });\n\n  it('should not invoke props.renderTooltip when TooltipContext.tooltipOpen=false', () => {\n    const renderTooltip = vi.fn(() => <div />);\n    setup({\n      props: { renderTooltip },\n    });\n    expect(renderTooltip).toHaveBeenCalledTimes(0);\n  });\n\n  it('should invoke props.renderTooltip when TooltipContext.tooltipOpen=true', () => {\n    const renderTooltip = vi.fn(() => <div />);\n    setup({\n      props: { renderTooltip },\n      context: { tooltipOpen: true },\n    });\n    expect(renderTooltip).toHaveBeenCalled(); // may be invoked more than once due to forceRefreshBounds invocation\n  });\n\n  it('should render a vertical crosshair if showVerticalCrossHair=true', () => {\n    const { container } = setup({\n      props: { showVerticalCrosshair: true },\n      context: { tooltipOpen: true },\n    });\n    expect(container?.parentNode?.querySelectorAll('div.visx-crosshair-vertical')).toHaveLength(1);\n  });\n\n  it('should render a horizontal crosshair if showVerticalCrossHair=true', () => {\n    const { container } = setup({\n      props: { showHorizontalCrosshair: true },\n      context: { tooltipOpen: true },\n    });\n    expect(container?.parentNode?.querySelectorAll('div.visx-crosshair-horizontal')).toHaveLength(\n      1,\n    );\n  });\n\n  it('should not render a glyph if showDatumGlyph=true and there is no nearestDatum', () => {\n    const { container } = setup({\n      props: { showDatumGlyph: true },\n      context: {\n        tooltipOpen: true,\n        tooltipData: {\n          datumByKey: {},\n        },\n      },\n      dataEntries: [\n        {\n          key: 'd1',\n          xAccessor: () => 3,\n          yAccessor: () => 7,\n          data: [{}],\n        },\n      ],\n    });\n    expect(container?.parentNode?.querySelectorAll('div.visx-tooltip-glyph')).toHaveLength(0);\n  });\n\n  it('should render a glyph if showDatumGlyph=true if there is a nearestDatum', () => {\n    const { container } = setup({\n      props: { showDatumGlyph: true },\n      context: {\n        tooltipOpen: true,\n        tooltipData: {\n          nearestDatum: { distance: 1, key: 'd1', index: 0, datum: {} },\n          datumByKey: {},\n        },\n      },\n      dataEntries: [\n        {\n          key: 'd1',\n          xAccessor: () => 3,\n          yAccessor: () => 7,\n          data: [{}],\n        },\n      ],\n    });\n    expect(container?.parentNode?.querySelectorAll('.visx-tooltip-glyph')).toHaveLength(1);\n  });\n\n  it('should render a glyph for each series if showSeriesGlyphs=true', () => {\n    const { container } = setup({\n      props: { showSeriesGlyphs: true },\n      context: {\n        tooltipOpen: true,\n        tooltipData: {\n          datumByKey: {\n            d1: { key: 'd1', index: 0, datum: {} },\n            d2: { key: 'd2', index: 1, datum: {} },\n          },\n        },\n      },\n      dataEntries: [\n        {\n          key: 'd1',\n          xAccessor: () => 3,\n          yAccessor: () => 7,\n          data: [{}],\n        },\n        {\n          key: 'd2',\n          xAccessor: () => 3,\n          yAccessor: () => 7,\n          data: [{}],\n        },\n      ],\n    });\n    expect(container?.parentNode?.querySelectorAll('div.visx-tooltip-glyph')).toHaveLength(2);\n  });\n\n  it('should pass zIndex prop to Portal', () => {\n    const { container } = setup({\n      props: { zIndex: 123 },\n      context: { tooltipOpen: true },\n    });\n    const zIndex =\n      container?.parentNode?.querySelector('div.visx-tooltip')?.parentElement?.style.zIndex;\n    expect(zIndex).toBe('123');\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/components/XYChart.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useContext } from 'react';\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { XYChart, DataProvider, DataContext } from '../../src';\n\nconst chartProps = {\n  xScale: { type: 'linear' },\n  yScale: { type: 'linear' },\n  width: 100,\n  height: 100,\n} as const;\n\ndescribe('<XYChart />', () => {\n  let initialResizeObserver: typeof ResizeObserver;\n  beforeAll(() => {\n    initialResizeObserver = window.ResizeObserver;\n    window.ResizeObserver = ResizeObserver;\n  });\n\n  afterAll(() => {\n    window.ResizeObserver = initialResizeObserver;\n  });\n\n  it('should be defined', () => {\n    expect(XYChart).toBeDefined();\n  });\n\n  it('should render with parent size if width or height is not provided', () => {\n    const { getByTestId } = render(\n      <div style={{ width: '200px', height: '200px' }} data-testid=\"wrapper\">\n        <XYChart {...chartProps} width={undefined}>\n          <rect />\n        </XYChart>\n      </div>,\n    );\n\n    const wrapper = getByTestId('wrapper');\n    expect(wrapper.firstChild).toHaveStyle('width: 100%; height: 100%');\n  });\n\n  it('should warn if DataProvider is not available and no x- or yScale config is passed', () => {\n    const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {});\n\n    const { container } = render(\n      <XYChart>\n        <rect />\n      </XYChart>,\n    );\n\n    expect(warnSpy).toHaveBeenCalledWith(\n      '[@visx/xychart] XYChart: When no DataProvider is available in context, you must pass xScale & yScale config to XYChart.',\n    );\n\n    // Component should return null and not render an SVG\n    expect(container.querySelector('svg')).not.toBeInTheDocument();\n\n    warnSpy.mockRestore();\n  });\n\n  it('should render an svg', () => {\n    const { container } = render(\n      <XYChart {...chartProps}>\n        <rect />\n      </XYChart>,\n    );\n    expect(container.querySelector('svg')).toBeInTheDocument();\n  });\n\n  it('should render children', () => {\n    const { container } = render(\n      <XYChart {...chartProps}>\n        <rect id=\"xychart-child\" />\n      </XYChart>,\n    );\n    expect(container.querySelector('#xychart-child')).toBeInTheDocument();\n  });\n\n  it('should update the registry dimensions', () => {\n    const spy = vi.fn((_) => null);\n    const width = 123;\n    const height = 456;\n\n    const DataConsumer = () => {\n      const data = useContext(DataContext);\n      return spy(data);\n    };\n\n    render(\n      <DataProvider xScale={{ type: 'linear' }} yScale={{ type: 'linear' }}>\n        <XYChart width={width} height={height}>\n          <DataConsumer />\n        </XYChart>\n      </DataProvider>,\n    );\n\n    expect(spy).toHaveBeenCalledWith(\n      expect.objectContaining({\n        width,\n        height,\n      }),\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/hooks/useDataRegistry.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport useDataRegistry from '../../src/hooks/useDataRegistry';\n\ndescribe('useDataRegistry', () => {\n  it('should be defined', () => {\n    expect(useDataRegistry).toBeDefined();\n  });\n\n  it('should provide a DataRegistry', () => {\n    expect.assertions(1);\n\n    const RegistryConsumer = () => {\n      const registry = useDataRegistry();\n      expect(registry).toBeDefined();\n\n      return null;\n    };\n\n    render(<RegistryConsumer />);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/hooks/useEventEmitter.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useEffect } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport useEventEmitter from '../../src/hooks/useEventEmitter';\nimport { EventEmitterProvider } from '../../src';\n\n// Create a properly formed PointerEvent with a target\nconst getEvent = (eventType: string) => {\n  const svg = document.querySelector('svg') || document.createElement('svg');\n  const event = new PointerEvent(eventType, {\n    bubbles: true,\n    clientX: 50,\n    clientY: 50,\n  });\n  Object.defineProperty(event, 'target', {\n    value: svg,\n    enumerable: true,\n  });\n  return event as unknown as React.PointerEvent;\n};\n\ndescribe('useEventEmitter', () => {\n  it('should be defined', () => {\n    expect(useEventEmitter).toBeDefined();\n  });\n\n  it('should provide an emitter', () => {\n    expect.assertions(1);\n\n    const Component = () => {\n      const emitter = useEventEmitter();\n      expect(emitter).toEqual(expect.any(Function));\n      return null;\n    };\n\n    render(\n      <EventEmitterProvider>\n        <Component />\n      </EventEmitterProvider>,\n    );\n  });\n\n  it('should register event listeners and emit events', async () => {\n    expect.assertions(1);\n\n    const listener = vi.fn();\n\n    const Component = () => {\n      const emit = useEventEmitter('pointermove', listener);\n\n      useEffect(() => {\n        if (emit) {\n          emit('pointermove', getEvent('pointermove'));\n        }\n      });\n\n      return null;\n    };\n\n    render(\n      <EventEmitterProvider>\n        <Component />\n      </EventEmitterProvider>,\n    );\n\n    await waitFor(() => {\n      expect(listener).toHaveBeenCalledTimes(1);\n    });\n  });\n\n  it('should filter invalid sources if specified', async () => {\n    expect.assertions(2);\n\n    const eventType = 'pointermove';\n    const sourceId = 'sourceId';\n    const listener = vi.fn();\n    const filteredListener = vi.fn();\n\n    const Component = () => {\n      const emit = useEventEmitter();\n      useEventEmitter('pointermove', listener);\n      useEventEmitter('pointermove', filteredListener, [sourceId]);\n\n      useEffect(() => {\n        if (emit) {\n          emit(eventType, getEvent(eventType));\n          emit(eventType, getEvent(eventType), sourceId);\n        }\n      });\n\n      return null;\n    };\n\n    render(\n      <EventEmitterProvider>\n        <Component />\n      </EventEmitterProvider>,\n    );\n\n    // Wait for both emits to complete and verify filtering behavior\n    await waitFor(() => {\n      // listener receives all events (no filter)\n      expect(listener).toHaveBeenCalledTimes(2);\n    });\n\n    // filteredListener only receives events with matching sourceId\n    expect(filteredListener).toHaveBeenCalledTimes(1);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/hooks/useEventEmitters.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useEffect } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport { EventEmitterProvider, useEventEmitter } from '../../src';\nimport useEventEmitters from '../../src/hooks/useEventEmitters';\n\ndescribe('useEventEmitters', () => {\n  it('should be defined', () => {\n    expect(useEventEmitters).toBeDefined();\n  });\n\n  it('should provide an emitter for each callback specified', () => {\n    expect.assertions(1);\n\n    const Component = () => {\n      const emitters = useEventEmitters({\n        source: 'visx',\n        onPointerOut: false,\n        onBlur: true,\n        onFocus: true,\n      });\n      expect(emitters).toEqual({\n        onBlur: expect.any(Function),\n        onFocus: expect.any(Function),\n        onPointerMove: expect.any(Function),\n        onPointerOut: undefined,\n        onPointerUp: expect.any(Function),\n        onPointerDown: expect.any(Function),\n      });\n      return null;\n    };\n\n    render(\n      <EventEmitterProvider>\n        <Component />\n      </EventEmitterProvider>,\n    );\n  });\n  it('emitters should emit events', async () => {\n    expect.assertions(1);\n\n    const source = 'sourceId';\n    const listener = vi.fn();\n\n    const Component = () => {\n      useEventEmitter('pointerup', listener, [source]);\n      const emitters = useEventEmitters({ source });\n\n      useEffect(() => {\n        if (emitters.onPointerUp) {\n          emitters.onPointerUp(new MouseEvent('pointerup') as unknown as React.PointerEvent);\n        }\n      });\n\n      return null;\n    };\n\n    render(\n      <EventEmitterProvider>\n        <Component />\n      </EventEmitterProvider>,\n    );\n\n    await waitFor(() => {\n      expect(listener).toHaveBeenCalledTimes(1);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/hooks/useEventHandlers.test.tsx",
    "content": "import { vi } from 'vitest';\nimport React, { useEffect } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport { EventEmitterProvider, useEventEmitter, DataContext } from '../../src';\nimport useEventHandlers, { POINTER_EVENTS_ALL } from '../../src/hooks/useEventHandlers';\nimport getDataContext from '../mocks/getDataContext';\n\nconst series1 = { key: 'series1', data: [{}], xAccessor: () => 4, yAccessor: () => 7 };\nconst series2 = { key: 'series2', data: [{}], xAccessor: () => 4, yAccessor: () => 7 };\n\n// Create a properly formed PointerEvent with a target\nconst getEvent = (eventType: string) => {\n  const svg = document.querySelector('svg') || document.createElement('svg');\n  const event = new PointerEvent(eventType, {\n    bubbles: true,\n    clientX: 50,\n    clientY: 50,\n  });\n  Object.defineProperty(event, 'target', {\n    value: svg,\n    enumerable: true,\n  });\n  return event as unknown as React.PointerEvent;\n};\n\n// Create a properly formed FocusEvent with a target\nconst getFocusEvent = (eventType: 'focus' | 'blur') => {\n  const svg = document.querySelector('svg') || document.createElement('svg');\n  const event = new FocusEvent(eventType, {\n    bubbles: true,\n  });\n  Object.defineProperty(event, 'target', {\n    value: svg,\n    enumerable: true,\n  });\n  return event as unknown as React.FocusEvent;\n};\n\ndescribe('useEventHandlers', () => {\n  function setup(children: React.ReactNode) {\n    return render(\n      <DataContext.Provider value={getDataContext([series1, series2])}>\n        <EventEmitterProvider>{children}</EventEmitterProvider>\n      </DataContext.Provider>,\n    );\n  }\n\n  it('should be defined', () => {\n    expect(useEventHandlers).toBeDefined();\n  });\n  it('should invoke handlers for each pointer event handler specified', async () => {\n    expect.assertions(5);\n\n    const sourceId = 'sourceId';\n    const pointerMoveListener = vi.fn();\n    const pointerOutListener = vi.fn();\n    const pointerUpListener = vi.fn();\n    const focusListener = vi.fn();\n    const blurListener = vi.fn();\n\n    const Component = () => {\n      const emit = useEventEmitter();\n\n      useEventHandlers({\n        allowedSources: [sourceId],\n        dataKey: series1.key,\n        onFocus: focusListener,\n        onBlur: blurListener,\n        onPointerMove: pointerMoveListener,\n        onPointerOut: pointerOutListener,\n        onPointerUp: pointerUpListener,\n      });\n\n      useEffect(() => {\n        if (emit) {\n          emit('pointermove', getEvent('pointermove'), sourceId);\n          emit('pointermove', getEvent('pointermove'), 'invalidSource');\n          emit('pointerout', getEvent('pointerout'), sourceId);\n          emit('pointerout', getEvent('pointerout'), 'invalidSource');\n          emit('pointerup', getEvent('pointerup'), sourceId);\n          emit('pointerup', getEvent('pointerup'), 'invalidSource');\n          emit('focus', getFocusEvent('focus'), sourceId);\n          emit('focus', getFocusEvent('focus'), 'invalidSource');\n          emit('blur', getFocusEvent('blur'), sourceId);\n          emit('blur', getFocusEvent('blur'), 'invalidSource');\n        }\n      });\n\n      return null;\n    };\n\n    setup(<Component />);\n\n    await waitFor(() => {\n      expect(pointerMoveListener).toHaveBeenCalledTimes(1);\n    });\n    expect(pointerOutListener).toHaveBeenCalledTimes(1);\n    expect(pointerUpListener).toHaveBeenCalledTimes(1);\n    expect(focusListener).toHaveBeenCalledTimes(1);\n    expect(blurListener).toHaveBeenCalledTimes(1);\n  });\n\n  it('should invoke handlers once for each dataKey specified', async () => {\n    expect.assertions(4);\n\n    const sourceId = 'sourceId';\n    const pointerMoveListenerAll = vi.fn();\n    const pointerMoveListenerMultipleKeys = vi.fn();\n\n    const Component = () => {\n      const emit = useEventEmitter();\n\n      useEventHandlers({\n        allowedSources: [sourceId],\n        dataKey: POINTER_EVENTS_ALL,\n        onPointerMove: pointerMoveListenerAll,\n      });\n      useEventHandlers({\n        allowedSources: [sourceId],\n        dataKey: [series1.key, series2.key],\n        onPointerMove: pointerMoveListenerMultipleKeys,\n      });\n\n      useEffect(() => {\n        if (emit) {\n          emit('pointermove', getEvent('pointermove'), sourceId);\n          emit('pointermove', getEvent('pointermove'), 'invalidSource');\n        }\n      });\n\n      return null;\n    };\n\n    setup(<Component />);\n\n    await waitFor(() => {\n      expect(pointerMoveListenerAll).toHaveBeenCalledTimes(2);\n      expect(pointerMoveListenerMultipleKeys).toHaveBeenCalledTimes(2);\n    });\n    // After invalid source, counts should stay the same\n    expect(pointerMoveListenerAll).toHaveBeenCalledTimes(2);\n    expect(pointerMoveListenerMultipleKeys).toHaveBeenCalledTimes(2);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/hooks/useScales.test.tsx",
    "content": "import useScales from '../../src/hooks/useScales';\n\ndescribe('useScales', () => {\n  it('should be defined', () => {\n    expect(useScales).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/hooks/useStackedData.test.tsx",
    "content": "import React, { useContext } from 'react';\nimport { render, waitFor } from '@testing-library/react';\nimport { AreaSeries, DataContext, DataProvider } from '../../src';\nimport useStackedData from '../../src/hooks/useStackedData';\n\nconst seriesAProps = {\n  dataKey: 'a',\n  data: [\n    { x: 'stack-a', y: 3 },\n    { x: 'stack-b', y: 7 },\n    { x: 'stack-c', y: -2 },\n  ],\n  xAccessor: (d: { x: string }) => d.x,\n  yAccessor: (d: { y: number }) => d.y,\n};\n\nconst seriesBProps = {\n  ...seriesAProps,\n  dataKey: 'b',\n  data: [\n    { x: 'stack-a', y: 0 },\n    { x: 'stack-b', y: 7 },\n    { x: 'stack-c', y: 10 },\n  ],\n};\n\nfunction setup(children: React.ReactElement | React.ReactElement[]) {\n  return render(\n    <DataProvider\n      initialDimensions={{ width: 10, height: 10 }}\n      xScale={{ type: 'band' }}\n      yScale={{ type: 'linear' }}\n    >\n      {children}\n    </DataProvider>,\n  );\n}\n\ndescribe('useStackedData', () => {\n  it('should be defined', () => {\n    expect(useStackedData).toBeDefined();\n  });\n\n  it('should return a data stack', () => {\n    expect.hasAssertions();\n\n    const Consumer = ({ children }: { children: React.ReactElement | React.ReactElement[] }) => {\n      const { stackedData } = useStackedData({ children });\n      // stackedData has arrays with data properties set by d3 which jest doesn't like\n      expect(stackedData.map((series) => series.map(([min, max]) => [min, max]))).toMatchObject([\n        [\n          // series a\n          [0, 3],\n          [0, 7],\n          [-2, 0],\n        ],\n        [\n          // series b\n          [0, 0],\n          [7, 14],\n          [0, 10],\n        ],\n      ]);\n      return null;\n    };\n\n    setup(\n      <Consumer>\n        <AreaSeries {...seriesAProps} />\n        <AreaSeries {...seriesBProps} />\n      </Consumer>,\n    );\n  });\n\n  it('compute a comprehensive domain based on the total stack value', async () => {\n    let yScale: any;\n    const Consumer = ({ children }: { children: React.ReactElement | React.ReactElement[] }) => {\n      useStackedData({ children });\n      yScale = useContext(DataContext).yScale;\n      return null;\n    };\n\n    setup(\n      <Consumer>\n        <AreaSeries {...seriesAProps} />\n        <AreaSeries {...seriesBProps} />\n      </Consumer>,\n    );\n\n    await waitFor(() => {\n      expect(yScale.domain()).toEqual([-2, 14]);\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/mocks/getDataContext.ts",
    "content": "/* eslint-disable import/no-extraneous-dependencies */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { scaleLinear, scaleOrdinal } from '@visx/scale';\nimport { ResizeObserver } from '@juggle/resize-observer';\nimport type { DataContextType } from '../../src';\nimport { lightTheme } from '../../src';\nimport DataRegistry from '../../lib/classes/DataRegistry';\n\nconst width = 10;\nconst height = 10;\nconst margin = { top: 0, right: 0, bottom: 0, left: 0 };\nconst noOp = () => {};\n\nfunction getDataContext(entries?: Parameters<typeof DataRegistry.prototype.registerData>[0]) {\n  const dataRegistry = new DataRegistry();\n  if (entries) dataRegistry.registerData(entries);\n\n  const mockContext: DataContextType<any, any, any> = {\n    dataRegistry,\n    registerData: (data) => {\n      dataRegistry.registerData(data);\n    },\n    unregisterData: (keys) => {\n      dataRegistry.unregisterData(keys);\n    },\n    xScale: scaleLinear({ domain: [0, 10], range: [0, width] }),\n    yScale: scaleLinear({ domain: [0, 10], range: [0, height] }),\n    colorScale: scaleOrdinal({ domain: ['sf', 'ny', 'la'], range: ['purple', 'violet', 'grape'] }),\n    width,\n    height,\n    margin,\n    innerWidth: width,\n    innerHeight: height,\n    theme: lightTheme,\n    setDimensions: noOp,\n    horizontal: false,\n    resizeObserverPolyfill: ResizeObserver,\n  };\n\n  return mockContext;\n}\n\nexport default getDataContext;\n"
  },
  {
    "path": "packages/visx-xychart/test/mocks/setupTooltipTest.tsx",
    "content": "/* eslint-disable import/no-extraneous-dependencies */\nimport { vi } from 'vitest';\nimport { render } from '@testing-library/react';\n/* eslint-enable import/no-extraneous-dependencies */\nimport React from 'react';\nimport type { TooltipContextType } from '../../src';\nimport { DataProvider, EventEmitterProvider, TooltipContext } from '../../src';\n\nconst providerProps = {\n  initialDimensions: { width: 100, height: 100 },\n  xScale: { type: 'linear' },\n  yScale: { type: 'linear' },\n} as const;\n\nconst defaultTooltipContext = {\n  tooltipOpen: false,\n  showTooltip: vi.fn(),\n  updateTooltip: vi.fn(),\n  hideTooltip: vi.fn(),\n};\n\n// sets up boilerplate context for testing tooltips\nexport default function setupTooltipTest(\n  children: React.ReactNode,\n  tooltipContext?: Partial<TooltipContextType<object>>,\n) {\n  return render(\n    <DataProvider {...providerProps}>\n      <EventEmitterProvider>\n        <TooltipContext.Provider value={{ ...defaultTooltipContext, ...tooltipContext }}>\n          <svg>{children}</svg>\n        </TooltipContext.Provider>\n      </EventEmitterProvider>\n    </DataProvider>,\n  );\n}\n"
  },
  {
    "path": "packages/visx-xychart/test/mocks/svgMock.ts",
    "content": "// @ts-expect-error\nlet originalFn: typeof SVGElement.prototype.getComputedTextLength;\n\n/**\n * JSDom does not implement getComputedTextLength()\n * so this function add mock implementation for testing.\n */\nexport function addMock() {\n  // @ts-expect-error\n  originalFn = SVGElement.prototype.getComputedTextLength;\n\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = function getComputedTextLength() {\n    // Make every character 10px wide\n    return (this.textContent?.length ?? 0) * 10;\n  };\n}\n\n/**\n * Remove mock from addMock()\n */\nexport function removeMock() {\n  // @ts-expect-error\n  SVGElement.prototype.getComputedTextLength = originalFn;\n}\n"
  },
  {
    "path": "packages/visx-xychart/test/providers/DataProvider.test.tsx",
    "content": "import React, { useContext, useEffect } from 'react';\nimport { render } from '@testing-library/react';\nimport { DataProvider, DataContext } from '../../src';\nimport type { DataProviderProps } from '../../lib/providers/DataProvider';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst getWrapper = (consumer: React.ReactNode, props?: DataProviderProps<any, any>) => {\n  render(\n    <DataProvider xScale={{ type: 'linear' }} yScale={{ type: 'linear' }} {...props}>\n      {consumer}\n    </DataProvider>,\n  );\n};\ndescribe('<DataProvider />', () => {\n  it('should be defined', () => {\n    expect(DataProvider).toBeDefined();\n  });\n\n  it('should provide a XYChartTheme', () => {\n    expect.assertions(1);\n\n    const DataConsumer = () => {\n      const data = useContext(DataContext);\n      expect(data.theme).toBeDefined();\n\n      return null;\n    };\n\n    getWrapper(<DataConsumer />);\n  });\n\n  it('should provide dimensions', () => {\n    expect.assertions(5);\n\n    const DataConsumer = () => {\n      const data = useContext(DataContext);\n      expect(data.width).toEqual(expect.any(Number));\n      expect(data.height).toEqual(expect.any(Number));\n      expect(data.innerWidth).toEqual(expect.any(Number));\n      expect(data.innerHeight).toEqual(expect.any(Number));\n      expect(data.margin).toMatchObject({\n        top: expect.any(Number),\n        right: expect.any(Number),\n        bottom: expect.any(Number),\n        left: expect.any(Number),\n      });\n\n      return null;\n    };\n\n    getWrapper(<DataConsumer />);\n  });\n\n  it('should provide scales', () => {\n    expect.hasAssertions();\n\n    const DataConsumer = () => {\n      const { xScale, yScale, colorScale, registerData } = useContext(DataContext);\n\n      // some data needs to be registered for valid scales to be available\n      useEffect(() => {\n        if (registerData) {\n          registerData({\n            key: 'visx',\n            xAccessor: (d) => d.x,\n            yAccessor: (d) => d.y,\n            data: [\n              { x: 0, y: 1 },\n              { x: 5, y: 7 },\n            ],\n          });\n        }\n      }, [registerData]);\n\n      useEffect(() => {\n        if (xScale && yScale && colorScale) {\n          expect(xScale).toBeDefined();\n          expect(yScale).toBeDefined();\n          expect(colorScale).toBeDefined();\n        }\n      }, [xScale, yScale, colorScale]);\n\n      return null;\n    };\n\n    getWrapper(<DataConsumer />);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/providers/EventEmitterProvider.test.tsx",
    "content": "import React, { useContext } from 'react';\nimport { render } from '@testing-library/react';\nimport { EventEmitterProvider, EventEmitterContext } from '../../src';\n\ndescribe('<EventEmitterProvider />', () => {\n  it('should be defined', () => {\n    expect(EventEmitterProvider).toBeDefined();\n  });\n\n  it('should provide an emitter for subscribing and emitting events', () => {\n    expect.assertions(1);\n\n    const EventEmitterConsumer = () => {\n      const emitter = useContext(EventEmitterContext);\n      expect(emitter).toMatchObject({ on: expect.any(Function), emit: expect.any(Function) });\n\n      return null;\n    };\n\n    render(\n      <EventEmitterProvider>\n        <EventEmitterConsumer />\n      </EventEmitterProvider>,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/providers/ThemeProvider.test.tsx",
    "content": "import React, { useContext } from 'react';\nimport { render } from '@testing-library/react';\nimport { ThemeProvider, ThemeContext } from '../../src';\n\ndescribe('<ThemeProvider />', () => {\n  it('should be defined', () => {\n    expect(ThemeProvider).toBeDefined();\n  });\n\n  it('should provide a XYChartTheme', () => {\n    expect.assertions(1);\n\n    const ThemeConsumer = () => {\n      const theme = useContext(ThemeContext);\n      expect(theme).toBeDefined();\n\n      return null;\n    };\n\n    render(\n      <ThemeProvider>\n        <ThemeConsumer />\n      </ThemeProvider>,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/providers/TooltipProvider.test.tsx",
    "content": "import React, { useContext, useEffect } from 'react';\nimport { render } from '@testing-library/react';\nimport type { TooltipData } from '../../src';\nimport { TooltipProvider, TooltipContext } from '../../src';\n\ndescribe('<TooltipProvider />', () => {\n  it('should be defined', () => {\n    expect(TooltipProvider).toBeDefined();\n  });\n\n  it('should provide tooltip state', () => {\n    expect.assertions(1);\n\n    const TooltipConsumer = () => {\n      const tooltipContext = useContext(TooltipContext);\n      expect(tooltipContext).toMatchObject({\n        tooltipOpen: expect.any(Boolean),\n        showTooltip: expect.any(Function),\n        updateTooltip: expect.any(Function),\n        hideTooltip: expect.any(Function),\n      });\n\n      return null;\n    };\n\n    render(\n      <TooltipProvider>\n        <TooltipConsumer />\n      </TooltipProvider>,\n    );\n  });\n\n  it('showTooltip should update tooltipData.nearestDatum/datumByKey', () => {\n    expect.assertions(1);\n\n    const TooltipConsumer = () => {\n      const tooltipContext = useContext(TooltipContext);\n      const tooltipOpen = tooltipContext?.tooltipOpen;\n      const showTooltip = tooltipContext?.showTooltip;\n\n      useEffect(() => {\n        // this triggers a re-render of the component which triggers the assertion block\n        if (!tooltipOpen && showTooltip) {\n          showTooltip({\n            key: 'near',\n            index: 0,\n            distanceX: 0,\n            distanceY: 0,\n            datum: { hi: 'hello' },\n          });\n          showTooltip({\n            key: 'far',\n            index: 1,\n            datum: { good: 'bye' },\n            distanceX: NaN,\n            // no distance = Infinity\n          });\n        }\n      }, [tooltipOpen, showTooltip]);\n\n      if (tooltipOpen) {\n        expect(tooltipContext?.tooltipData).toMatchObject({\n          nearestDatum: { key: 'near', index: 0, distance: 0, datum: { hi: 'hello' } },\n          datumByKey: {\n            near: { key: 'near', index: 0, datum: { hi: 'hello' } },\n            far: { key: 'far', index: 1, datum: { good: 'bye' } },\n          },\n        } as TooltipData<object>);\n      }\n\n      return null;\n    };\n\n    render(\n      <TooltipProvider>\n        <TooltipConsumer />\n      </TooltipProvider>,\n    );\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/theme.test.tsx",
    "content": "import {\n  lightTheme,\n  darkTheme,\n  allColors,\n  defaultColors,\n  grayColors,\n  buildChartTheme,\n} from '../src';\n\ndescribe('colors', () => {\n  it('should export allColors', () => {\n    expect(allColors).toMatchObject({ red: expect.arrayContaining([expect.any(String)]) });\n    expect(Object.keys(allColors)).toHaveLength(13);\n  });\n  it('should export defaultColors', () => {\n    expect(defaultColors).toMatchObject(expect.arrayContaining([expect.any(String)]));\n  });\n  it('should export grayColors', () => {\n    expect(grayColors).toMatchObject(expect.arrayContaining([expect.any(String)]));\n  });\n});\n\ndescribe('theme', () => {\n  it('exports a light theme', () => {\n    expect(lightTheme).toBeDefined();\n  });\n  it('exports a dark theme', () => {\n    expect(darkTheme).toBeDefined();\n  });\n  it('builds a theme', () => {\n    const theme = buildChartTheme({\n      backgroundColor: 'white',\n      gridColor: 'fuchsia',\n      gridColorDark: 'orange',\n      colors: ['violet'],\n      gridStyles: { strokeDasharray: '1,5' },\n      tickLength: 7.5,\n      svgLabelBig: { fontFamily: 'Comic Sans', fill: 'grape' },\n      svgLabelSmall: { fontSize: 100, fill: 'banana' },\n      xTickLineStyles: { strokeWidth: 2.4 },\n    });\n\n    expect(theme).toMatchObject({\n      backgroundColor: 'white',\n      colors: ['violet'],\n      gridStyles: { stroke: 'fuchsia', strokeDasharray: '1,5' },\n      htmlLabel: { color: 'grape' },\n      svgLabelBig: { fill: 'grape' },\n      svgLabelSmall: { fill: 'banana' },\n      axisStyles: {\n        x: {\n          top: {\n            axisLabel: { fontFamily: 'Comic Sans', fill: 'grape' },\n            axisLine: { stroke: 'orange' },\n            tickLabel: { fill: 'banana', fontSize: 100 },\n            tickLine: { strokeWidth: 2.4 },\n          },\n        },\n        y: {\n          left: {\n            axisLabel: { fontFamily: 'Comic Sans', fill: 'grape' },\n            axisLine: { stroke: 'fuchsia' },\n            tickLabel: { fill: 'banana', fontSize: 100 },\n            tickLine: { strokeWidth: 1 },\n          },\n        },\n      },\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-xychart/test/utils/cleanColorString.test.ts",
    "content": "import { cleanColor } from '../../src/utils/cleanColorString';\n\ndescribe('cleanColorString', () => {\n  describe('cleanColor', () => {\n    it('should be defined', () => {\n      expect(cleanColor).toBeDefined();\n    });\n    it('should return input color for non-url colors', () => {\n      expect(cleanColor('violet')).toBe('violet');\n    });\n    it('should return a neutral color for url-containing colors', () => {\n      expect(cleanColor('url(#id)')).not.toBe('url(#id)');\n    });\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/utils/combineBarStackData.test.tsx",
    "content": "import React from 'react';\nimport { BarSeries } from '../../src';\nimport combineBarStackData from '../../src/utils/combineBarStackData';\n\nconst accessors = {\n  xAccessor: (d: { x: number }) => d.x,\n  yAccessor: (d: { y: number }) => d.y,\n};\n\nconst series1 = {\n  dataKey: 'bar1',\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: -5 },\n  ],\n  ...accessors,\n};\n\nconst series2 = {\n  dataKey: 'bar2',\n  data: [\n    { x: 10, y: 5 },\n    { x: 7, y: 20 },\n  ],\n  ...accessors,\n};\n\nconst seriesChildren = [\n  <BarSeries key={series1.dataKey} {...series1} />,\n  <BarSeries key={series2.dataKey} {...series2} />,\n];\n\ndescribe('combineBarStackData', () => {\n  it('should be defined', () => {\n    expect(combineBarStackData).toBeDefined();\n  });\n\n  it('should combine data by x stack value when horizontal=false', () => {\n    expect(combineBarStackData(seriesChildren)).toEqual([\n      { stack: 10, bar1: 5, bar2: 5, positiveSum: 10, negativeSum: 0 },\n      { stack: 7, bar1: -5, bar2: 20, positiveSum: 20, negativeSum: -5 },\n    ]);\n  });\n  it('should combine data by y stack value when horizontal=true', () => {\n    expect(combineBarStackData(seriesChildren, true)).toEqual([\n      { stack: 5, bar1: 10, bar2: 10, positiveSum: 20, negativeSum: 0 },\n      { stack: -5, bar1: 7, positiveSum: 7, negativeSum: 0 },\n      { stack: 20, bar2: 7, positiveSum: 7, negativeSum: 0 },\n    ]);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/utils/findNearestDatum.test.ts",
    "content": "import type { AxisScale } from '@visx/axis';\nimport { scaleBand, scaleLinear } from '@visx/scale';\nimport type { PositionScale } from '@visx/shape';\n\nimport findNearestDatumX from '../../src/utils/findNearestDatumX';\nimport findNearestDatumY from '../../src/utils/findNearestDatumY';\nimport findNearestDatumXY from '../../src/utils/findNearestDatumXY';\nimport findNearestDatumSingleDimension from '../../src/utils/findNearestDatumSingleDimension';\nimport findNearestStackDatum from '../../src/utils/findNearestStackDatum';\nimport findNearestGroupDatum from '../../src/utils/findNearestGroupDatum';\nimport type { BarStackDatum, NearestDatumArgs } from '../../src';\n\ntype Datum = { xVal: number; yVal: string };\n\nconst params: NearestDatumArgs<AxisScale, AxisScale, Datum> = {\n  dataKey: 'visx',\n  width: 10,\n  height: 10,\n  point: { x: 3, y: 8 },\n  data: [\n    { xVal: 0, yVal: '0' },\n    { xVal: 8, yVal: '8' },\n  ],\n  xAccessor: (d) => d.xVal,\n  yAccessor: (d) => d.yVal,\n  xScale: scaleLinear({ domain: [0, 10], range: [0, 10] }),\n  yScale: scaleBand({ domain: ['0', '8'], range: [0, 10] }),\n};\n\ndescribe('findNearestDatumX', () => {\n  it('should be defined', () => {\n    expect(findNearestDatumX).toBeDefined();\n  });\n\n  it('should find the nearest datum', () => {\n    expect(\n      findNearestDatumX({\n        ...params,\n      })!.datum,\n    ).toEqual({ xVal: 0, yVal: '0' });\n  });\n});\n\ndescribe('findNearestDatumY', () => {\n  it('should be defined', () => {\n    expect(findNearestDatumY).toBeDefined();\n  });\n  it('should find the nearest datum', () => {\n    expect(\n      findNearestDatumY({\n        ...params,\n      })!.datum,\n    ).toEqual({ xVal: 8, yVal: '8' });\n  });\n});\n\ndescribe('findNearestDatumXY', () => {\n  it('should be defined', () => {\n    expect(findNearestDatumXY).toBeDefined();\n  });\n\n  it('should find the nearest datum', () => {\n    expect(\n      findNearestDatumXY({\n        ...params,\n        point: { x: 3, y: 3 },\n      })!.datum,\n    ).toEqual({ xVal: 0, yVal: '0' });\n  });\n});\n\ndescribe('findNearestDatumSingleDimension', () => {\n  it('should be defined', () => {\n    expect(findNearestDatumSingleDimension).toBeDefined();\n  });\n\n  it('should find the nearest datum for scaleLinear', () => {\n    expect(\n      findNearestDatumSingleDimension({\n        scale: params.xScale,\n        accessor: params.xAccessor,\n        data: params.data,\n        scaledValue: 3,\n      })!.datum,\n    ).toEqual({ xVal: 0, yVal: '0' });\n\n    expect(\n      findNearestDatumSingleDimension({\n        scale: params.xScale,\n        accessor: params.xAccessor,\n        data: params.data,\n        scaledValue: 7,\n      })!.datum,\n    ).toEqual({ xVal: 8, yVal: '8' });\n  });\n\n  it('should find the nearest datum for scaleBand', () => {\n    expect(\n      findNearestDatumSingleDimension({\n        scale: params.yScale,\n        accessor: params.yAccessor,\n        data: params.data,\n        scaledValue: 3,\n      })!.datum,\n    ).toEqual({ xVal: 0, yVal: '0' });\n\n    expect(\n      findNearestDatumSingleDimension({\n        scale: params.yScale,\n        accessor: params.yAccessor,\n        data: params.data,\n        scaledValue: 8,\n      })!.datum,\n    ).toEqual({ xVal: 8, yVal: '8' });\n  });\n});\n\ndescribe('findNearestStackDatum', () => {\n  it('should be defined', () => {\n    expect(findNearestStackDatum).toBeDefined();\n  });\n\n  it('should find the nearest datum', () => {\n    const d1 = { yVal: '🍌' };\n    const d2 = { yVal: '🚀' };\n    expect(\n      findNearestStackDatum(\n        {\n          ...params,\n          // type is not technically correct, but coerce for test\n        } as unknown as NearestDatumArgs<AxisScale, AxisScale, BarStackDatum<AxisScale, AxisScale>>,\n        [d1, d2],\n        true,\n      )!.datum,\n    ).toEqual(d2); // nearest datum index=1\n  });\n});\n\ndescribe('findNearestGroupDatum', () => {\n  it('should be defined', () => {\n    expect(findNearestGroupDatum).toBeDefined();\n  });\n\n  it('should find the nearest datum', () => {\n    expect(\n      findNearestGroupDatum(\n        {\n          ...params,\n        } as NearestDatumArgs<PositionScale, PositionScale, Datum>,\n        scaleBand({ domain: [params.dataKey], range: [0, 10] }),\n      )!.datum,\n    ).toEqual({ xVal: 0, yVal: '0' }); // non-horizontal means nearest x value\n  });\n\n  it('should set distance to 0', () => {\n    expect(\n      findNearestGroupDatum(\n        {\n          ...params,\n        } as NearestDatumArgs<PositionScale, PositionScale, Datum>,\n        scaleBand({ domain: [params.dataKey], range: [0, 10] }),\n        true,\n      )!.distanceY,\n    ).toBe(0);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/utils/getScaleBaseline.test.ts",
    "content": "import { scaleLinear } from '@visx/scale';\nimport getScaleBaseline from '../../src/utils/getScaleBaseline';\n\ndescribe('getScaleBaseline', () => {\n  it('should be defined', () => {\n    expect(getScaleBaseline).toBeDefined();\n  });\n\n  it('should work for ascending ranges', () => {\n    expect(\n      getScaleBaseline(\n        scaleLinear({\n          domain: [0, 100],\n          range: [50, 100],\n        }),\n      ),\n    ).toBe(50);\n  });\n\n  it('should work for descending ranges', () => {\n    expect(\n      getScaleBaseline(\n        scaleLinear({\n          domain: [0, 100],\n          range: [100, 50],\n        }),\n      ),\n    ).toBe(100);\n  });\n\n  it(\"should use a scale's minimum even if its not clamped to exclude zero\", () => {\n    expect(\n      getScaleBaseline(\n        scaleLinear({\n          domain: [100, 200],\n          range: [50, 100], // ascending\n        }),\n      ),\n    ).toBe(50);\n    expect(\n      getScaleBaseline(\n        scaleLinear({\n          domain: [100, 200],\n          range: [100, 50], // descending\n        }),\n      ),\n    ).toBe(100);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/test/utils/isDiscreteScale.test.ts",
    "content": "import isDiscreteScale from '../../src/utils/isDiscreteScale';\n\ndescribe('isDiscreteScale', () => {\n  it('should be defined', () => {\n    expect(isDiscreteScale).toBeDefined();\n  });\n\n  it('should return true for discrete scales', () => {\n    expect(isDiscreteScale({ type: 'band' })).toBe(true);\n    expect(isDiscreteScale({ type: 'point' })).toBe(true);\n    expect(isDiscreteScale({ type: 'ordinal' })).toBe(true);\n  });\n\n  it('should return false for non-discrete scales', () => {\n    expect(isDiscreteScale({ type: 'time' })).toBe(false);\n    expect(isDiscreteScale({ type: 'utc' })).toBe(false);\n    expect(isDiscreteScale({ type: 'log' })).toBe(false);\n    expect(isDiscreteScale({ type: 'linear' })).toBe(false);\n  });\n});\n"
  },
  {
    "path": "packages/visx-xychart/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-annotation\"\n    },\n    {\n      \"path\": \"../visx-axis\"\n    },\n    {\n      \"path\": \"../visx-event\"\n    },\n    {\n      \"path\": \"../visx-glyph\"\n    },\n    {\n      \"path\": \"../visx-grid\"\n    },\n    {\n      \"path\": \"../visx-react-spring\"\n    },\n    {\n      \"path\": \"../visx-responsive\"\n    },\n    {\n      \"path\": \"../visx-scale\"\n    },\n    {\n      \"path\": \"../visx-shape\"\n    },\n    {\n      \"path\": \"../visx-text\"\n    },\n    {\n      \"path\": \"../visx-tooltip\"\n    },\n    {\n      \"path\": \"../visx-vendor\"\n    },\n    {\n      \"path\": \"../visx-voronoi\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-xychart/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/xychart',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-xychart/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/xychart': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "packages/visx-zoom/.npmrc",
    "content": "package-lock=false"
  },
  {
    "path": "packages/visx-zoom/Readme.md",
    "content": "# @visx/Zoom\n\n<a title=\"@visx/zoom npm downloads\" href=\"https://www.npmjs.com/package/@visx/zoom\">\n  <img src=\"https://img.shields.io/npm/dm/@visx/zoom.svg?style=flat-square\" />\n</a>\n\n`@visx/zoom` provides `react` components that make it easy to apply transforms to a viewport or\nchart.\n\n## Installation\n\n```\nnpm install --save @visx/zoom\n```\n"
  },
  {
    "path": "packages/visx-zoom/package.json",
    "content": "{\n  \"name\": \"@visx/zoom\",\n  \"version\": \"4.0.1-alpha.0\",\n  \"description\": \"visx zoom\",\n  \"sideEffects\": false,\n  \"main\": \"lib/index.js\",\n  \"module\": \"esm/index.js\",\n  \"types\": \"lib/index.d.ts\",\n  \"exports\": {\n    \".\": {\n      \"types\": \"./lib/index.d.ts\",\n      \"import\": \"./esm/index.js\",\n      \"require\": \"./lib/index.js\"\n    }\n  },\n  \"files\": [\n    \"lib\",\n    \"esm\"\n  ],\n  \"repository\": {\n    \"type\": \"git\",\n    \"url\": \"git+https://github.com/airbnb/visx.git\"\n  },\n  \"keywords\": [\n    \"visx\",\n    \"react\",\n    \"d3\",\n    \"visualizations\",\n    \"charts\"\n  ],\n  \"author\": \"@hshoff\",\n  \"license\": \"MIT\",\n  \"bugs\": {\n    \"url\": \"https://github.com/airbnb/visx/issues\"\n  },\n  \"homepage\": \"https://github.com/airbnb/visx#readme\",\n  \"publishConfig\": {\n    \"access\": \"public\"\n  },\n  \"peerDependencies\": {\n    \"react\": \"^16.14.0 || ^17.0.0-0 || ^18.0.0-0 || ^19.0.0-0\"\n  },\n  \"dependencies\": {\n    \"@types/react\": \"*\",\n    \"@use-gesture/react\": \"^10.3.1\",\n    \"@visx/event\": \"workspace:*\"\n  }\n}\n"
  },
  {
    "path": "packages/visx-zoom/src/Zoom.tsx",
    "content": "import { useState, useRef, useCallback } from 'react';\nimport type { ReactElement } from 'react';\nimport { localPoint } from '@visx/event';\nimport type { UserHandlers } from '@use-gesture/react';\nimport { useGesture } from '@use-gesture/react';\nimport {\n  composeMatrices,\n  inverseMatrix,\n  applyMatrixToPoint,\n  applyInverseMatrixToPoint,\n  translateMatrix,\n  identityMatrix,\n  scaleMatrix,\n} from './util/matrix';\nimport type {\n  TransformMatrix,\n  Point,\n  Translate,\n  Scale,\n  ScaleSignature,\n  PinchDelta,\n  GenericWheelEvent,\n  InteractionEvent,\n  Zoom as ZoomType,\n} from './types';\n\n// default prop values\nconst defaultInitialTransformMatrix = {\n  scaleX: 1,\n  scaleY: 1,\n  translateX: 0,\n  translateY: 0,\n  skewX: 0,\n  skewY: 0,\n};\n\nconst defaultWheelDelta = (event: GenericWheelEvent) =>\n  -event.deltaY > 0 ? { scaleX: 1.1, scaleY: 1.1 } : { scaleX: 0.9, scaleY: 0.9 };\n\nconst defaultPinchDelta: PinchDelta = ({ offset: [s], lastOffset: [lastS] }) => ({\n  scaleX: s - lastS < 0 ? 0.9 : 1.1,\n  scaleY: s - lastS < 0 ? 0.9 : 1.1,\n});\n\nexport type ZoomProps<ElementType> = {\n  /** Width of the zoom container. */\n  width: number;\n  /** Height of the zoom container. */\n  height: number;\n  /**\n   * ```js\n   *  wheelDelta(event)\n   * ```\n   *\n   * A function that returns { scaleX,scaleY } factors to scale the matrix by.\n   * Scale factors greater than 1 will increase (zoom in), less than 1 will decrease (zoom out).\n   */\n  wheelDelta?: (event: GenericWheelEvent) => Scale;\n  /**\n   * ```js\n   *  pinchDelta(state)\n   * ```\n   *\n   * A function that returns { scaleX, scaleY, point } factors to scale the matrix by.\n   * Scale factors greater than 1 will increase (zoom in), less than 1 will decrease (zoom out), the point is used to find where to zoom.\n   * The state parameter is from react-use-gestures onPinch handler\n   */\n  pinchDelta?: PinchDelta;\n  /** Minimum x scale value for transform. */\n  scaleXMin?: number;\n  /** Maximum x scale value for transform. */\n  scaleXMax?: number;\n  /** Minimum y scale value for transform. */\n  scaleYMin?: number;\n  /** Maximum y scale value for transform. */\n  scaleYMax?: number;\n  /**\n   * By default constrain() will only constrain scale values. To change\n   * constraints you can pass in your own constrain function as a prop.\n   *\n   * For example, if you wanted to constrain your view to within [[0, 0], [width, height]]:\n   *\n   * ```js\n   * function constrain(transformMatrix, prevTransformMatrix) {\n   *   const min = applyMatrixToPoint(transformMatrix, { x: 0, y: 0 });\n   *   const max = applyMatrixToPoint(transformMatrix, { x: width, y: height });\n   *   if (max.x < width || max.y < height) {\n   *     return prevTransformMatrix;\n   *   }\n   *   if (min.x > 0 || min.y > 0) {\n   *     return prevTransformMatrix;\n   *   }\n   *   return transformMatrix;\n   * }\n   * ```\n   */\n  constrain?: (transform: TransformMatrix, prevTransform: TransformMatrix) => TransformMatrix;\n  /** Initial transform matrix to apply. */\n  initialTransformMatrix?: TransformMatrix;\n  children: (zoom: ZoomType<ElementType>) => ReactElement;\n};\n\nfunction Zoom<ElementType extends Element>({\n  scaleXMin = 0,\n  scaleXMax = Infinity,\n  scaleYMin = 0,\n  scaleYMax = Infinity,\n  initialTransformMatrix = defaultInitialTransformMatrix,\n  wheelDelta = defaultWheelDelta,\n  pinchDelta = defaultPinchDelta,\n  width,\n  height,\n  constrain,\n  children,\n}: ZoomProps<ElementType>): ReactElement {\n  const containerRef = useRef<ElementType>(null);\n  const matrixStateRef = useRef<TransformMatrix>(initialTransformMatrix);\n\n  const [transformMatrix, setTransformMatrixState] = useState<TransformMatrix>(\n    initialTransformMatrix!,\n  );\n  const [isDragging, setIsDragging] = useState(false);\n  const [startTranslate, setStartTranslate] = useState<Translate | undefined>(undefined);\n  const [startPoint, setStartPoint] = useState<Point | undefined>(undefined);\n\n  const defaultConstrain = useCallback(\n    (newTransformMatrix: TransformMatrix, prevTransformMatrix: TransformMatrix) => {\n      if (constrain) return constrain(newTransformMatrix, prevTransformMatrix);\n      const { scaleX, scaleY } = newTransformMatrix;\n      const shouldConstrainScaleX = scaleX > scaleXMax! || scaleX < scaleXMin!;\n      const shouldConstrainScaleY = scaleY > scaleYMax! || scaleY < scaleYMin!;\n\n      if (shouldConstrainScaleX || shouldConstrainScaleY) {\n        return prevTransformMatrix;\n      }\n      return newTransformMatrix;\n    },\n    [constrain, scaleXMin, scaleXMax, scaleYMin, scaleYMax],\n  );\n\n  const setTransformMatrix = useCallback(\n    (newTransformMatrix: TransformMatrix) => {\n      setTransformMatrixState((prevTransformMatrix) => {\n        const updatedTransformMatrix = defaultConstrain(newTransformMatrix, prevTransformMatrix);\n        matrixStateRef.current = updatedTransformMatrix;\n        return updatedTransformMatrix;\n      });\n    },\n    [defaultConstrain],\n  );\n\n  const applyToPoint = useCallback(\n    ({ x, y }: Point) => applyMatrixToPoint(transformMatrix, { x, y }),\n    [transformMatrix],\n  );\n\n  const applyInverseToPoint = useCallback(\n    ({ x, y }: Point) => applyInverseMatrixToPoint(transformMatrix, { x, y }),\n    [transformMatrix],\n  );\n\n  const reset = useCallback(() => {\n    setTransformMatrix(initialTransformMatrix);\n  }, [initialTransformMatrix, setTransformMatrix]);\n\n  const scale = useCallback(\n    ({ scaleX, scaleY: maybeScaleY, point }: ScaleSignature) => {\n      const scaleY = maybeScaleY || scaleX;\n      const cleanPoint = point || { x: width / 2, y: height / 2 };\n      // need to use ref value instead of state here because wheel listener does not have access to latest state\n      const translate = applyInverseMatrixToPoint(matrixStateRef.current, cleanPoint);\n      const nextMatrix = composeMatrices(\n        matrixStateRef.current,\n        translateMatrix(translate.x, translate.y),\n        scaleMatrix(scaleX, scaleY),\n        translateMatrix(-translate.x, -translate.y),\n      );\n      setTransformMatrix(nextMatrix);\n      if (isDragging) {\n        const { translateX, translateY } = matrixStateRef.current;\n        setStartPoint(point);\n        setStartTranslate({ translateX, translateY });\n      }\n    },\n    [height, width, isDragging, setTransformMatrix],\n  );\n\n  const translate = useCallback(\n    ({ translateX, translateY }: Translate) => {\n      const nextMatrix = composeMatrices(transformMatrix, translateMatrix(translateX, translateY));\n      setTransformMatrix(nextMatrix);\n    },\n    [setTransformMatrix, transformMatrix],\n  );\n\n  const setTranslate = useCallback(\n    ({ translateX, translateY }: Translate) => {\n      const nextMatrix = {\n        ...transformMatrix,\n        translateX,\n        translateY,\n      };\n      setTransformMatrix(nextMatrix);\n    },\n    [setTransformMatrix, transformMatrix],\n  );\n\n  const translateTo = useCallback(\n    ({ x, y }: Point) => {\n      const point = applyInverseMatrixToPoint(transformMatrix, { x, y });\n      setTranslate({ translateX: point.x, translateY: point.y });\n    },\n    [setTranslate, transformMatrix],\n  );\n\n  const invert = useCallback(() => inverseMatrix(transformMatrix), [transformMatrix]);\n\n  const toStringInvert = useCallback(() => {\n    const { translateX, translateY, scaleX, scaleY, skewX, skewY } = invert();\n    return `matrix(${scaleX}, ${skewY}, ${skewX}, ${scaleY}, ${translateX}, ${translateY})`;\n  }, [invert]);\n\n  const dragStart = useCallback(\n    (event: InteractionEvent) => {\n      const { translateX, translateY } = transformMatrix;\n      setStartPoint(localPoint(event) || undefined);\n      setStartTranslate({ translateX, translateY });\n      setIsDragging(true);\n    },\n    [transformMatrix],\n  );\n\n  const dragMove = useCallback(\n    (event: InteractionEvent, options?: { offsetX?: number; offsetY?: number }) => {\n      if (!isDragging || !startPoint || !startTranslate) return;\n      const currentPoint = localPoint(event);\n      const dx = currentPoint ? -(startPoint.x - currentPoint.x) : -startPoint.x;\n      const dy = currentPoint ? -(startPoint.y - currentPoint.y) : -startPoint.y;\n\n      let translateX = startTranslate.translateX + dx;\n      if (options?.offsetX) translateX += options?.offsetX ?? 0;\n      let translateY = startTranslate.translateY + dy;\n      if (options?.offsetY) translateY += options?.offsetY ?? 0;\n      setTranslate({\n        translateX,\n        translateY,\n      });\n    },\n    [isDragging, setTranslate, startPoint, startTranslate],\n  );\n\n  const dragEnd = useCallback(() => {\n    setStartPoint(undefined);\n    setStartTranslate(undefined);\n    setIsDragging(false);\n  }, []);\n\n  const handleWheel = useCallback(\n    (event: GenericWheelEvent) => {\n      event.preventDefault();\n      const point = localPoint(event) || undefined;\n      const { scaleX, scaleY } = wheelDelta!(event);\n      scale({ scaleX, scaleY, point });\n    },\n    [scale, wheelDelta],\n  );\n\n  const handlePinch: UserHandlers['onPinch'] = useCallback(\n    (state) => {\n      const {\n        origin: [ox, oy],\n        memo,\n      } = state;\n      let currentMemo = memo;\n      if (containerRef.current) {\n        const { top, left } = currentMemo ?? containerRef.current.getBoundingClientRect();\n        if (!currentMemo) {\n          currentMemo = { top, left };\n        }\n        const { scaleX, scaleY } = pinchDelta(state);\n        scale({\n          scaleX,\n          scaleY,\n          point: { x: ox - left, y: oy - top },\n        });\n      }\n      return currentMemo;\n    },\n    [scale, pinchDelta],\n  );\n\n  const toString = useCallback(() => {\n    const { translateX, translateY, scaleX, scaleY, skewX, skewY } = transformMatrix;\n    return `matrix(${scaleX}, ${skewY}, ${skewX}, ${scaleY}, ${translateX}, ${translateY})`;\n  }, [transformMatrix]);\n\n  const center = useCallback(() => {\n    const centerPoint = { x: width / 2, y: height / 2 };\n    const inverseCentroid = applyInverseToPoint(centerPoint);\n    translate({\n      translateX: inverseCentroid.x - centerPoint.x,\n      translateY: inverseCentroid.y - centerPoint.y,\n    });\n  }, [height, width, applyInverseToPoint, translate]);\n\n  const clear = useCallback(() => {\n    setTransformMatrix(identityMatrix());\n  }, [setTransformMatrix]);\n\n  useGesture(\n    {\n      onDragStart: ({ event }) => {\n        if (!(event instanceof KeyboardEvent)) dragStart(event);\n      },\n      onDrag: ({ event, pinching, cancel }) => {\n        if (pinching) {\n          cancel();\n          dragEnd();\n        } else if (!(event instanceof KeyboardEvent)) {\n          dragMove(event);\n        }\n      },\n      onDragEnd: dragEnd,\n      onPinch: handlePinch,\n      onWheel: ({ event, active, pinching }) => {\n        if (\n          // Outside of Safari, the wheel event is fired together with the pinch event\n          pinching ||\n          // currently onWheelEnd emits one final wheel event which causes 2x scale\n          // updates for the last tick. ensuring that the gesture is active avoids this\n          !active\n        ) {\n          return;\n        }\n        handleWheel(event);\n      },\n    },\n    { target: containerRef, eventOptions: { passive: false }, drag: { filterTaps: true } },\n  );\n\n  const zoom: ZoomType<ElementType> = {\n    initialTransformMatrix,\n    transformMatrix,\n    isDragging,\n    center,\n    clear,\n    scale,\n    translate,\n    translateTo,\n    setTranslate,\n    setTransformMatrix,\n    reset,\n    handleWheel,\n    handlePinch,\n    dragEnd,\n    dragMove,\n    dragStart,\n    toString,\n    invert,\n    toStringInvert,\n    applyToPoint,\n    applyInverseToPoint,\n    containerRef,\n  };\n\n  return <>{children(zoom)}</>;\n}\n\nexport default Zoom;\n"
  },
  {
    "path": "packages/visx-zoom/src/index.ts",
    "content": "// @visx/zoom\nexport { default as Zoom } from './Zoom';\nexport {\n  identityMatrix,\n  createMatrix,\n  inverseMatrix,\n  applyMatrixToPoint,\n  applyInverseMatrixToPoint,\n  scaleMatrix,\n  translateMatrix,\n  multiplyMatrices,\n  composeMatrices,\n} from './util/matrix';\n\nexport type * from './types';\nexport type { ZoomProps } from './Zoom';\n"
  },
  {
    "path": "packages/visx-zoom/src/types.ts",
    "content": "import type { UserHandlers, WebKitGestureEvent, Handler } from '@use-gesture/react';\nimport type {\n  RefObject,\n  MouseEvent as ReactMouseEvent,\n  TouchEvent as ReactTouchEvent,\n  PointerEvent as ReactPointerEvent,\n  WheelEvent as ReactWheelEvent,\n} from 'react';\n\nexport type GenericWheelEvent = ReactWheelEvent | WheelEvent;\n\nexport type InteractionEvent =\n  | ReactMouseEvent\n  | ReactTouchEvent\n  | ReactPointerEvent\n  | MouseEvent\n  | TouchEvent\n  | PointerEvent;\n\nexport interface TransformMatrix {\n  scaleX: number;\n  scaleY: number;\n  translateX: number;\n  translateY: number;\n  skewX: number;\n  skewY: number;\n}\n\nexport interface Point {\n  x: number;\n  y: number;\n}\n\nexport type Translate = Pick<TransformMatrix, 'translateX' | 'translateY'>;\n\nexport type Scale = Pick<TransformMatrix, 'scaleX' | 'scaleY'>;\n\nexport type PinchDelta = (\n  params: Parameters<\n    Handler<\n      'pinch',\n      | TouchEvent\n      | ReactTouchEvent\n      | PointerEvent\n      | ReactPointerEvent\n      | WheelEvent\n      | ReactWheelEvent\n      | WebKitGestureEvent\n    >\n  >[0],\n) => Scale;\n\nexport interface ScaleSignature {\n  scaleX: TransformMatrix['scaleX'];\n  scaleY?: TransformMatrix['scaleY'];\n  point?: Point;\n}\n\nexport interface ProvidedZoom<ElementType> {\n  /** Sets translateX/Y to the center defined by width and height. */\n  center: () => void;\n  /** Sets the transform matrix to the identity matrix. */\n  clear: () => void;\n  /** Applies the specified scaleX + optional scaleY transform relative to the specified point (or center of canvas if unspecified). */\n  scale: (scale: ScaleSignature) => void;\n  /** Multiplies the current transform matrix by the specified translation. */\n  translate: (translate: Translate) => void;\n  /** Translates to a specific x,y point. */\n  translateTo: (point: Point) => void;\n  /** Sets the translation of the current transform matrix to the specified translation. */\n  setTranslate: (translate: Translate) => void;\n  /**\n   * Sets the transform matrix to the specified matrix, constraining the transform\n   * scale by default (or applying props.constrain if provided).\n   */\n  setTransformMatrix: (matrix: TransformMatrix) => void;\n  /** Resets the transform to the initial transform specified by props. */\n  reset: () => void;\n  /** Callback for a wheel event, updating scale based on props.wheelDelta, relative to the mouse position. */\n  handleWheel: (event: ReactWheelEvent | WheelEvent) => void;\n  /** Callback for a @use-gesture/react on pinch event, updating scale based on props.pinchDelta, relative to the pinch position. */\n  handlePinch: UserHandlers['onPinch'];\n  /** Callback for dragEnd, sets isDragging to false. */\n  dragEnd: () => void;\n  /** Callback for dragMove, results in a scale transform. */\n  dragMove: (event: InteractionEvent, options?: { offsetX?: number; offsetY?: number }) => void;\n  /** Callback for dragStart, sets isDragging to true.  */\n  dragStart: (event: InteractionEvent) => void;\n  /**\n   * Returns a string representation of the matrix transform:\n   * matrix(${scaleX}, ${skewY}, ${skewX}, ${scaleY}, ${translateX}, ${translateY})\n   */\n  toString: () => string;\n  /** Returns the inverse of the current transform matrix. */\n  invert: () => TransformMatrix;\n  /**\n   * Returns the string representation of the inverse of the current transform matrix:\n   * matrix(${scaleX}, ${skewY}, ${skewX}, ${scaleY}, ${translateX}, ${translateY})\n   */\n  toStringInvert: () => string;\n  /** Applies the current transform matrix to the specified point. */\n  applyToPoint: ({ x, y }: Point) => Point;\n  /** Applies the inverse of the current transform matrix to the specified point. */\n  applyInverseToPoint: ({ x, y }: Point) => Point;\n  /** Ref to stick on element to attach all handlers automatically. */\n  containerRef: RefObject<ElementType | null>;\n}\n\n/** Internal state properties exposed by the Zoom component. */\nexport interface ZoomState {\n  /** The initial transform matrix specified by props. */\n  initialTransformMatrix: TransformMatrix;\n  /** The current transform matrix. */\n  transformMatrix: TransformMatrix;\n  /** Whether the user is currently dragging. */\n  isDragging: boolean;\n}\n\n/** Complete Zoom API including methods and state, passed to children render prop. */\nexport type Zoom<ElementType> = ProvidedZoom<ElementType> & ZoomState;\n"
  },
  {
    "path": "packages/visx-zoom/src/util/matrix.ts",
    "content": "import type { TransformMatrix, Point } from '../types';\n\nexport function identityMatrix(): TransformMatrix {\n  return {\n    scaleX: 1,\n    scaleY: 1,\n    translateX: 0,\n    translateY: 0,\n    skewX: 0,\n    skewY: 0,\n  };\n}\n\nexport function createMatrix({\n  scaleX = 1,\n  scaleY = 1,\n  translateX = 0,\n  translateY = 0,\n  skewX = 0,\n  skewY = 0,\n}: Partial<TransformMatrix>): TransformMatrix {\n  return {\n    scaleX,\n    scaleY,\n    translateX,\n    translateY,\n    skewX,\n    skewY,\n  };\n}\n\nexport function inverseMatrix({\n  scaleX,\n  scaleY,\n  translateX,\n  translateY,\n  skewX,\n  skewY,\n}: TransformMatrix) {\n  const denominator = scaleX * scaleY - skewY * skewX;\n  return {\n    scaleX: scaleY / denominator,\n    scaleY: scaleX / denominator,\n    translateX: (scaleY * translateX - skewX * translateY) / -denominator,\n    translateY: (skewY * translateX - scaleX * translateY) / denominator,\n    skewX: skewX / -denominator,\n    skewY: skewY / -denominator,\n  };\n}\n\nexport function applyMatrixToPoint(matrix: TransformMatrix, { x, y }: Point) {\n  return {\n    x: matrix.scaleX * x + matrix.skewX * y + matrix.translateX,\n    y: matrix.skewY * x + matrix.scaleY * y + matrix.translateY,\n  };\n}\n\nexport function applyInverseMatrixToPoint(matrix: TransformMatrix, { x, y }: Point) {\n  return applyMatrixToPoint(inverseMatrix(matrix), { x, y });\n}\n\nexport function scaleMatrix(\n  scaleX: TransformMatrix['scaleX'],\n  maybeScaleY: TransformMatrix['scaleY'] | undefined = undefined,\n) {\n  const scaleY = maybeScaleY || scaleX;\n  return createMatrix({ scaleX, scaleY });\n}\n\nexport function translateMatrix(\n  translateX: TransformMatrix['translateX'],\n  translateY: TransformMatrix['translateY'],\n) {\n  return createMatrix({ translateX, translateY });\n}\n\nexport function multiplyMatrices(matrix1: TransformMatrix, matrix2: TransformMatrix) {\n  return {\n    scaleX: matrix1.scaleX * matrix2.scaleX + matrix1.skewX * matrix2.skewY,\n    scaleY: matrix1.skewY * matrix2.skewX + matrix1.scaleY * matrix2.scaleY,\n    translateX:\n      matrix1.scaleX * matrix2.translateX + matrix1.skewX * matrix2.translateY + matrix1.translateX,\n    translateY:\n      matrix1.skewY * matrix2.translateX + matrix1.scaleY * matrix2.translateY + matrix1.translateY,\n    skewX: matrix1.scaleX * matrix2.skewX + matrix1.skewX * matrix2.scaleY,\n    skewY: matrix1.skewY * matrix2.scaleX + matrix1.scaleY * matrix2.skewY,\n  };\n}\n\nexport function composeMatrices(...matrices: TransformMatrix[]): TransformMatrix {\n  switch (matrices.length) {\n    case 0:\n      throw new Error('composeMatrices() requires arguments: was called with no args');\n    case 1:\n      return matrices[0];\n    case 2:\n      return multiplyMatrices(matrices[0], matrices[1]);\n    default: {\n      const [matrix1, matrix2, ...restMatrices] = matrices;\n      const matrix = multiplyMatrices(matrix1, matrix2);\n      return composeMatrices(matrix, ...restMatrices);\n    }\n  }\n}\n"
  },
  {
    "path": "packages/visx-zoom/test/Zoom.test.tsx",
    "content": "import React from 'react';\nimport { render } from '@testing-library/react';\nimport '@testing-library/jest-dom';\nimport { Zoom, inverseMatrix } from '../src';\n\ndescribe('<Zoom />', () => {\n  it('should be defined', () => {\n    expect(Zoom).toBeDefined();\n  });\n\n  it('should render the children and pass zoom params', () => {\n    const initialTransform = {\n      scaleX: 1.27,\n      scaleY: 1.27,\n      translateX: -211.62,\n      translateY: 162.59,\n      skewX: 0,\n      skewY: 0,\n    };\n\n    const { getByText } = render(\n      <Zoom\n        width={400}\n        height={400}\n        scaleXMin={1 / 2}\n        scaleXMax={4}\n        scaleYMin={1 / 2}\n        scaleYMax={4}\n        initialTransformMatrix={initialTransform}\n      >\n        {({ transformMatrix }) => {\n          const { scaleX, scaleY, translateX, translateY } = transformMatrix;\n          return <div>{[scaleX, scaleY, translateX, translateY].join(',')}</div>;\n        }}\n      </Zoom>,\n    );\n\n    expect(getByText('1.27,1.27,-211.62,162.59')).toBeInTheDocument();\n  });\n});\n\ndescribe('inverseMatrix', () => {\n  it('should be defined', () => {\n    expect(inverseMatrix).toBeDefined();\n  });\n});\n"
  },
  {
    "path": "packages/visx-zoom/test/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"composite\": false,\n    \"emitDeclarationOnly\": false,\n    \"noEmit\": true,\n    \"rootDir\": \".\",\n    \"types\": [\"vitest/globals\"]\n  },\n  \"extends\": \"../../../tsconfig.options.json\",\n  \"include\": [\"**/*\", \"../types/**/*\", \"../../../types/**/*\"],\n  \"references\": [\n    {\n      \"path\": \"..\"\n    }\n  ]\n}\n"
  },
  {
    "path": "packages/visx-zoom/tsconfig.json",
    "content": "{\n  \"compilerOptions\": {\n    \"declarationDir\": \"lib\",\n    \"outDir\": \"lib\",\n    \"rootDir\": \"src\"\n  },\n  \"exclude\": [\n    \"lib\",\n    \"test\"\n  ],\n  \"extends\": \"../../tsconfig.options.json\",\n  \"include\": [\n    \"src/**/*\",\n    \"types/**/*\",\n    \"../../types/**/*\"\n  ],\n  \"references\": [\n    {\n      \"path\": \"../visx-event\"\n    }\n  ]\n}"
  },
  {
    "path": "packages/visx-zoom/vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\nimport path from 'path';\n\nexport default defineConfig({\n  test: {\n    name: '@visx/zoom',\n    globals: true,\n    environment: 'jsdom',\n    setupFiles: [],\n    coverage: {\n      provider: 'v8',\n      reporter: ['lcov', 'json-summary', 'html', 'json', 'text'],\n      include: ['packages/visx-zoom/src/**/*.{ts,tsx}'],\n      exclude: ['**/node_modules/**', '**/esm/**', '**/lib/**', '**/test/**', '**/dist/**'],\n      reportsDirectory: './coverage',\n    },\n  },\n  resolve: {\n    alias: {\n      '@visx/zoom': path.resolve(__dirname, './src'),\n    },\n  },\n});\n"
  },
  {
    "path": "prettier.config.js",
    "content": "module.exports = {\n  arrowParens: 'always',\n  bracketSpacing: true,\n  bracketSameLine: false,\n  printWidth: 100,\n  proseWrap: 'always',\n  requirePragma: false,\n  semi: true,\n  singleQuote: true,\n  tabWidth: 2,\n  trailingComma: 'all',\n  useTabs: false,\n};\n"
  },
  {
    "path": "scripts/compareBuildSizes.ts",
    "content": "import fs from 'fs';\nimport size from 'filesize';\nimport chalk from 'chalk';\n\nimport upsertPullRequestComment from './utils/upsertPullRequestComment';\nimport { PACKAGE_SIZES_FILENAME } from './computeBuildSizes';\n\ntype StatMap = {\n  [pkg: string]: {\n    [dir: string]: number;\n  };\n};\n\nfunction calculateDiff(prev: number, next: number): number {\n  return (next - prev) / prev;\n}\n\nfunction formatDiff(diff: number): string {\n  const sum = diff * 100;\n  const percent = sum.toFixed(1);\n\n  // Smaller\n  if (percent.startsWith('-')) {\n    return `${sum < -10 ? ':small_red_triangle_down: ' : ''}${percent}%`;\n  }\n\n  // Larger\n  return `${sum > 10 ? ':small_red_triangle: ' : ''}+${percent}%`;\n}\n\nasync function compareBuildSizes() {\n  const nextSizes: StatMap = JSON.parse(fs.readFileSync(PACKAGE_SIZES_FILENAME, 'utf8'));\n  let prevSizes: StatMap = {};\n  let sameBuild = false;\n\n  try {\n    const masterFileSizesRequest = await fetch(\n      `https://raw.githubusercontent.com/airbnb/visx/master/${PACKAGE_SIZES_FILENAME}`,\n    );\n\n    prevSizes = await masterFileSizesRequest.json();\n  } catch (error) {\n    console.log(`Could not fetch file ${PACKAGE_SIZES_FILENAME} from master. Aborting.`);\n    console.log((error as any).message);\n\n    prevSizes = nextSizes;\n    sameBuild = true;\n  }\n\n  function getPrevSize(name: string, type: string) {\n    return prevSizes[name]?.[type] || 0;\n  }\n\n  const output: string[] = [\n    '### Size Changes',\n    '| Package | Diff | ESM | Prev ESM | CJS | Prev CJS |',\n    '| --- | ---: | ---: | ---: | ---: | ---: |',\n  ];\n  const rows: string[] = [];\n\n  Object.entries(nextSizes).forEach(([pkgName, stats]) => {\n    const prevEsm = getPrevSize(pkgName, 'esm');\n    const prevLib = getPrevSize(pkgName, 'lib');\n    const diff = calculateDiff(prevEsm, stats.esm);\n\n    if (!isFinite(diff) || diff === 0 || diff === 0.0) {\n      return;\n    }\n\n    const row = [\n      pkgName,\n      formatDiff(diff),\n      size(stats.esm),\n      prevEsm === 0 ? 'N/A' : size(prevEsm),\n      size(stats.lib),\n      prevLib === 0 ? 'N/A' : size(prevLib),\n    ];\n\n    rows.push(`| ${row.join(' | ')} |`);\n  });\n\n  // Don't post anything if no changes\n  if (rows.length === 0) {\n    return;\n  }\n\n  // Sort rows before joining to output\n  rows.sort();\n\n  output.push(...rows);\n  output.push('> Compared to master. File sizes are unminified and ungzipped.');\n\n  // Show dumps for easier debugging\n  if (!sameBuild) {\n    output.push(`<details>\n<summary>View raw build stats</summary>\n\n#### Previous (master)\n\\`\\`\\`json\n${JSON.stringify(prevSizes, null, 2)}\n\\`\\`\\`\n\n#### Current\n\\`\\`\\`json\n${JSON.stringify(nextSizes, null, 2)}\n\\`\\`\\`\n</details>`);\n  }\n\n  // Leave a comment on the PR\n  const breakdown = output.join('\\n');\n\n  try {\n    await upsertPullRequestComment('### Size Changes', breakdown);\n  } catch (error) {\n    console.warn(`Could not post size stats:\\n${breakdown}`);\n    // @TODO this should throw once it works on forks\n    console.error(error);\n  }\n}\n\n// invoke function since this is a script\ncompareBuildSizes().catch((error) => {\n  console.error(chalk.red(String(error.message)));\n  process.exitCode = 1;\n});\n"
  },
  {
    "path": "scripts/computeBuildSizes.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport chalk from 'chalk';\nimport glob from 'fast-glob';\n\nexport const PACKAGE_SIZES_FILENAME = './packages/sizes.json';\n\nasync function getTotalSize(fileGlob: string, cwd: string): Promise<number> {\n  const files = await glob(fileGlob, { absolute: true, cwd, onlyFiles: true });\n  const sizes = await Promise.all<number>(\n    files.map(\n      (file) =>\n        new Promise((resolve, reject) => {\n          fs.stat(file, (error, stats) => {\n            if (error) {\n              reject(error);\n            } else {\n              resolve(stats.size);\n            }\n          });\n        }),\n    ),\n  );\n\n  return sizes.reduce((sum, size) => sum + size, 0);\n}\n\nasync function computeBuildSizes() {\n  const packages = await glob('./packages/*', { absolute: true, onlyDirectories: true });\n  const stats: { name: string; sizes: object }[] = [];\n\n  await Promise.all(\n    packages.map(async (packagePath) => {\n      const packageName = path.basename(packagePath);\n\n      stats.push({\n        name: packageName,\n        sizes: {\n          esm: await getTotalSize('./esm/**/*.js', packagePath),\n          lib: await getTotalSize('./lib/**/*.js', packagePath),\n        },\n      });\n    }),\n  );\n\n  // Sort so its deterministic\n  stats.sort((a, b) => a.name.localeCompare(b.name));\n\n  // Convert to an object\n  const sizes = stats.reduce(\n    (obj, stat) => ({\n      ...obj,\n      [stat.name]: stat.sizes,\n    }),\n    {},\n  );\n\n  fs.writeFileSync(PACKAGE_SIZES_FILENAME, JSON.stringify(sizes), 'utf8');\n}\n\ncomputeBuildSizes().catch((error) => {\n  console.error(chalk.red(String(error.message)));\n  process.exitCode = 1;\n});\n"
  },
  {
    "path": "scripts/generateDocs.ts",
    "content": "/* eslint-disable */\n\n/**\n * Custom script to extract component documentation from TypeScript files\n * This generates a JSON file that matches the react-docgen-typescript-loader format\n * for compatibility with the existing demo site.\n */\n\nimport * as fs from 'fs';\nimport * as path from 'path';\nimport * as ts from 'typescript';\nimport glob from 'fast-glob';\n\ninterface PropInfo {\n  // e.g., { value: '5' }\n  defaultValue?: { value?: unknown };\n  // JSDoc description\n  description?: string;\n  // Prop\n  name: string;\n  // Is the prop required\n  required: boolean;\n  // e.g., { name: 'string' }\n  type?: { name: string };\n}\n\ninterface ParamInfo {\n  // Parameter\n  name: string;\n  // JSDoc description\n  description?: string;\n  // e.g., { name: 'string' }\n  type?: { name: string };\n  // e.g., { value: '5' }\n  defaultValue?: { value?: unknown };\n}\n\ninterface DocGenInfo {\n  // Overall component/function description\n  description?: string;\n  // Display name of the component/function\n  displayName?: string;\n  // For components/hooks - their props/return values\n  props: { [propName: string]: PropInfo };\n  // For utility functions - their parameters and return type\n  kind?: 'component' | 'hook' | 'function';\n  // Function parameters\n  parameters?: ParamInfo[];\n  // Function return type\n  returnType?: string;\n  // Source file information for \"View Source\" links\n  filePath?: string;\n  // 1-indexed line number\n  lineNumber?: number;\n}\n\n// Mapping of component name to its documentation\ninterface ComponentDocs {\n  [componentName: string]: DocGenInfo;\n}\n\n// Mapping of package name to its components' documentation\ninterface PackageDocs {\n  [packageName: string]: ComponentDocs;\n}\n\n/**\n * Extract JSDoc comment from a node\n */\nfunction extractJSDocComment(node: ts.Node): string | undefined {\n  const sourceFile = node.getSourceFile();\n  const fullText = sourceFile.getFullText();\n\n  // Get leading comments\n  const commentRanges = ts.getLeadingCommentRanges(fullText, node.getFullStart());\n  if (!commentRanges || commentRanges.length === 0) {\n    return undefined;\n  }\n\n  // Get the last comment (closest to the node)\n  const lastComment = commentRanges[commentRanges.length - 1];\n  let commentText = fullText.substring(lastComment.pos, lastComment.end);\n\n  // Clean up JSDoc comment\n  commentText = commentText\n    .replace(/^\\/\\*\\*/, '') // Remove opening /**\n    .replace(/\\*\\/$/, '') // Remove closing */\n    .split('\\n')\n    .map((line) => line.trim().replace(/^\\* ?/, '')) // Remove leading * from each line\n    .join('\\n')\n    .trim();\n\n  return commentText || undefined;\n}\n\n/**\n * Get a readable type string from a ts.Type\n */\nfunction getTypeString(type: ts.Type, checker: ts.TypeChecker): string {\n  // Get the type string, but clean it up for readability\n  const typeString = checker.typeToString(type, undefined, ts.TypeFormatFlags.NoTruncation);\n\n  // Clean up React types\n  return typeString\n    .replace(/import\\(\".*?\"\\)\\./g, '') // Remove import paths\n    .replace(/React\\./g, ''); // Remove React. prefix\n}\n\n/**\n * Extract default values from function parameter destructuring\n * e.g., function Foo({ bar = 5, baz = 'hello' }) => { bar: '5', baz: \"'hello'\" }\n */\nfunction extractParameterDefaults(\n  functionNode: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n): Map<string, string> {\n  const defaults = new Map<string, string>();\n\n  if (!functionNode.parameters || functionNode.parameters.length === 0) {\n    return defaults;\n  }\n\n  // Get the first parameter (props parameter)\n  const propsParam = functionNode.parameters[0];\n\n  // Check if it's a destructuring binding pattern\n  if (propsParam.name && ts.isObjectBindingPattern(propsParam.name)) {\n    propsParam.name.elements.forEach((element) => {\n      if (ts.isBindingElement(element) && element.initializer) {\n        const paramName = element.name.getText();\n        const defaultValue = element.initializer.getText();\n        defaults.set(paramName, defaultValue);\n      }\n    });\n  }\n\n  return defaults;\n}\n\n/**\n * Extract function parameters as ParamInfo[]\n */\nfunction extractFunctionParameters(\n  functionNode: ts.FunctionDeclaration | ts.ArrowFunction | ts.FunctionExpression,\n  checker: ts.TypeChecker,\n): ParamInfo[] {\n  const parameters: ParamInfo[] = [];\n\n  if (!functionNode.parameters || functionNode.parameters.length === 0) {\n    return parameters;\n  }\n\n  functionNode.parameters.forEach((param) => {\n    const paramName = param.name.getText();\n\n    let paramType: ts.Type | undefined;\n    if (param.type) {\n      paramType = checker.getTypeFromTypeNode(param.type);\n    }\n\n    let defaultValue: { value?: unknown } | undefined;\n    if (param.initializer) {\n      defaultValue = { value: param.initializer.getText() };\n    }\n\n    // Try to extract JSDoc for the parameter\n    const jsDocComment = extractJSDocComment(param);\n\n    parameters.push({\n      name: paramName,\n      description: jsDocComment,\n      type: paramType ? { name: getTypeString(paramType, checker) } : undefined,\n      defaultValue,\n    });\n  });\n\n  return parameters;\n}\n\n/**\n * Extract props information from a ts.Type\n */\nfunction extractPropsFromType(\n  type: ts.Type,\n  checker: ts.TypeChecker,\n  sourceFile: ts.SourceFile,\n  parameterDefaults?: Map<string, string>,\n): { [propName: string]: PropInfo } {\n  const props: { [propName: string]: PropInfo } = {};\n\n  // Get properties from the type\n  const properties = type.getProperties();\n\n  for (const prop of properties) {\n    const propName = prop.getName();\n\n    // Skip internal React props\n    if (\n      propName === 'children' &&\n      prop.declarations?.[0]?.getSourceFile().fileName.includes('node_modules')\n    ) {\n      continue;\n    }\n\n    // Skip props from node_modules (inherited HTML/SVG props)\n    if (prop.declarations?.some((decl) => decl.getSourceFile().fileName.includes('node_modules'))) {\n      continue;\n    }\n\n    // Skip props without declarations\n    if (!prop.declarations || prop.declarations.length === 0) {\n      continue;\n    }\n\n    const propType = checker.getTypeOfSymbolAtLocation(prop, prop.declarations[0]);\n    const propDeclaration = prop.declarations[0];\n\n    // Check if required (not optional)\n    const isOptional = (prop.flags & ts.SymbolFlags.Optional) !== 0;\n    const required = !isOptional;\n\n    // Get JSDoc comment\n    const description = propDeclaration ? extractJSDocComment(propDeclaration) : undefined;\n\n    // Get default value if available\n    let defaultValue: { value?: unknown } | undefined;\n\n    // First check function parameter defaults\n    if (parameterDefaults && parameterDefaults.has(propName)) {\n      defaultValue = { value: parameterDefaults.get(propName) };\n    }\n    // Then check property declaration initializers\n    else if (\n      propDeclaration &&\n      ts.isPropertyDeclaration(propDeclaration) &&\n      propDeclaration.initializer\n    ) {\n      const initText = propDeclaration.initializer.getText();\n      defaultValue = { value: initText };\n    }\n\n    props[propName] = {\n      name: propName,\n      required,\n      description,\n      type: { name: getTypeString(propType, checker) },\n      defaultValue,\n    };\n  }\n\n  return props;\n}\n\n/**\n * Determine what kind of export this is\n */\nfunction getExportKind(name: string): 'component' | 'hook' | 'function' {\n  if (name.startsWith('use')) return 'hook';\n  // Simple heuristic: starts with capital = component, lowercase = function\n  if (name[0] === name[0].toUpperCase()) return 'component';\n  return 'function';\n}\n\n/**\n * Get the relative file path and line number for a node\n */\nfunction getSourceLocation(node: ts.Node): { filePath: string; lineNumber: number } {\n  const sourceFile = node.getSourceFile();\n  const { line } = sourceFile.getLineAndCharacterOfPosition(node.getStart());\n\n  // Get path relative to repo root (remove everything before /packages/)\n  const fullPath = sourceFile.fileName;\n  const match = fullPath.match(/packages\\/(.+)$/);\n  const filePath = match ? match[1] : fullPath;\n\n  return {\n    filePath,\n    lineNumber: line + 1, // Line numbers are 0-indexed, GitHub uses 1-indexed\n  };\n}\n\n/**\n * Extract component documentation from a source file\n */\nfunction extractComponentDocs(sourceFile: ts.SourceFile, checker: ts.TypeChecker): ComponentDocs {\n  const docs: ComponentDocs = {};\n  const allVariableDeclarations = new Map<string, ts.VariableDeclaration>();\n  const allFunctionDeclarations = new Map<string, ts.FunctionDeclaration>();\n\n  function visit(node: ts.Node) {\n    // Collect all variable declarations for later lookup (for export default cases)\n    if (ts.isVariableStatement(node)) {\n      node.declarationList.declarations.forEach((decl) => {\n        if (ts.isVariableDeclaration(decl) && decl.name && ts.isIdentifier(decl.name)) {\n          allVariableDeclarations.set(decl.name.text, decl);\n        }\n      });\n    }\n\n    // Collect all function declarations for later lookup (for export default cases)\n    if (ts.isFunctionDeclaration(node) && node.name) {\n      allFunctionDeclarations.set(node.name.text, node);\n    }\n    // Look for class components (handle both export class and class that's exported as default)\n    if (ts.isClassDeclaration(node) && node.name) {\n      const componentName = node.name.text;\n      const kind = getExportKind(componentName);\n      const description = extractJSDocComment(node);\n\n      // Check if it has a heritage clause (extends Component)\n      if (node.heritageClauses) {\n        for (const clause of node.heritageClauses) {\n          for (const type of clause.types) {\n            // Get the type arguments (props type is usually the first)\n            if (type.typeArguments && type.typeArguments.length > 0) {\n              const propsTypeNode = type.typeArguments[0];\n              const propsType = checker.getTypeFromTypeNode(propsTypeNode);\n              const props = extractPropsFromType(propsType, checker, sourceFile);\n              const { filePath, lineNumber } = getSourceLocation(node);\n\n              docs[componentName] = {\n                displayName: componentName,\n                description,\n                kind,\n                props,\n                filePath,\n                lineNumber,\n              };\n              break;\n            }\n          }\n        }\n      }\n    }\n\n    // Look for exported functions (components, hooks, utilities)\n    if (\n      ts.isFunctionDeclaration(node) &&\n      node.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword) &&\n      node.name\n    ) {\n      const exportName = node.name.text;\n      const kind = getExportKind(exportName);\n      const description = extractJSDocComment(node);\n\n      const { filePath, lineNumber } = getSourceLocation(node);\n\n      if (kind === 'function') {\n        // Utility function - extract parameters and return type\n        const parameters = extractFunctionParameters(node, checker);\n        let returnType: string | undefined;\n        if (node.type) {\n          const returnTypeObj = checker.getTypeFromTypeNode(node.type);\n          returnType = getTypeString(returnTypeObj, checker);\n        }\n\n        docs[exportName] = {\n          displayName: exportName,\n          description,\n          kind,\n          props: {},\n          parameters,\n          returnType,\n          filePath,\n          lineNumber,\n        };\n      } else {\n        // Component or hook - extract props/return type\n        const isHook = kind === 'hook';\n        let propsType: ts.Type | undefined;\n\n        if (isHook && node.type) {\n          // Get return type from type annotation for hooks\n          propsType = checker.getTypeFromTypeNode(node.type);\n        } else {\n          // Get the first parameter (props) for components\n          const propsParam = node.parameters[0];\n          if (propsParam?.type) {\n            propsType = checker.getTypeFromTypeNode(propsParam.type);\n          }\n        }\n\n        if (propsType) {\n          // Extract parameter defaults for components (not hooks)\n          const parameterDefaults = isHook ? undefined : extractParameterDefaults(node);\n          const props = extractPropsFromType(propsType, checker, sourceFile, parameterDefaults);\n\n          docs[exportName] = {\n            displayName: exportName,\n            description,\n            kind,\n            props,\n            filePath,\n            lineNumber,\n          };\n        }\n      }\n    }\n\n    // Look for exported variable declarations (arrow functions)\n    if (\n      ts.isVariableStatement(node) &&\n      node.modifiers?.some((mod) => mod.kind === ts.SyntaxKind.ExportKeyword)\n    ) {\n      node.declarationList.declarations.forEach((decl) => {\n        if (ts.isVariableDeclaration(decl) && decl.name && ts.isIdentifier(decl.name)) {\n          const exportName = decl.name.text;\n          const kind = getExportKind(exportName);\n          const description = extractJSDocComment(node);\n\n          // Check if it's a function (arrow function, React.FC, or React.forwardRef)\n          if (\n            decl.initializer &&\n            (ts.isArrowFunction(decl.initializer) || ts.isCallExpression(decl.initializer))\n          ) {\n            // Try to get props type from the type annotation or generic\n            let propsType: ts.Type | undefined;\n            let functionNode: ts.ArrowFunction | ts.FunctionExpression | undefined;\n\n            if (decl.type) {\n              // Has explicit type annotation\n              const declType = checker.getTypeFromTypeNode(decl.type);\n              // If it's a React component type, extract the props type argument\n              const typeArgs = (declType as any).typeArguments;\n              if (typeArgs && typeArgs.length > 0) {\n                propsType = typeArgs[0];\n              }\n            } else if (ts.isArrowFunction(decl.initializer)) {\n              // Arrow function, get first parameter type\n              functionNode = decl.initializer;\n              const propsParam = decl.initializer.parameters[0];\n              if (propsParam?.type) {\n                propsType = checker.getTypeFromTypeNode(propsParam.type);\n              }\n            } else if (ts.isCallExpression(decl.initializer)) {\n              // Could be React.forwardRef or other HOC\n              // Check if it has type arguments (e.g., React.forwardRef<HTMLDivElement, TooltipProps>)\n              if (decl.initializer.typeArguments && decl.initializer.typeArguments.length >= 2) {\n                // For forwardRef, the second type argument is the props type\n                propsType = checker.getTypeFromTypeNode(decl.initializer.typeArguments[1]);\n              } else if (decl.initializer.arguments.length > 0) {\n                // Try to extract from the arrow function passed to forwardRef\n                const firstArg = decl.initializer.arguments[0];\n                if (ts.isArrowFunction(firstArg) || ts.isFunctionExpression(firstArg)) {\n                  functionNode = firstArg;\n                  const propsParam = firstArg.parameters[0];\n                  if (propsParam?.type) {\n                    propsType = checker.getTypeFromTypeNode(propsParam.type);\n                  }\n                }\n              }\n            }\n\n            if (propsType) {\n              // Extract parameter defaults if we have a function node\n              const parameterDefaults = functionNode\n                ? extractParameterDefaults(functionNode)\n                : undefined;\n              const props = extractPropsFromType(propsType, checker, sourceFile, parameterDefaults);\n              const { filePath, lineNumber } = getSourceLocation(decl);\n\n              docs[exportName] = {\n                displayName: exportName,\n                description,\n                kind,\n                props,\n                filePath,\n                lineNumber,\n              };\n            }\n          }\n        }\n      });\n    }\n\n    ts.forEachChild(node, visit);\n  }\n\n  visit(sourceFile);\n\n  // Handle export default statements for functions/components not caught above\n  sourceFile.forEachChild((node) => {\n    if (ts.isExportAssignment(node) && !node.isExportEquals && ts.isIdentifier(node.expression)) {\n      const exportedName = node.expression.text;\n      const kind = getExportKind(exportedName);\n\n      // Check if it's a function declaration\n      const funcDecl = allFunctionDeclarations.get(exportedName);\n      if (funcDecl && !docs[exportedName]) {\n        const description = extractJSDocComment(funcDecl);\n        const { filePath, lineNumber } = getSourceLocation(funcDecl);\n\n        if (kind === 'function') {\n          // Utility function - extract parameters and return type\n          const parameters = extractFunctionParameters(funcDecl, checker);\n          let returnType: string | undefined;\n          if (funcDecl.type) {\n            const returnTypeObj = checker.getTypeFromTypeNode(funcDecl.type);\n            returnType = getTypeString(returnTypeObj, checker);\n          }\n\n          docs[exportedName] = {\n            displayName: exportedName,\n            description,\n            kind,\n            props: {},\n            parameters,\n            returnType,\n            filePath,\n            lineNumber,\n          };\n        } else {\n          // Component or hook\n          const isHook = kind === 'hook';\n          let propsType: ts.Type | undefined;\n\n          if (isHook && funcDecl.type) {\n            // Get return type from type annotation\n            propsType = checker.getTypeFromTypeNode(funcDecl.type);\n          } else {\n            // Get the first parameter (props) for components\n            const propsParam = funcDecl.parameters[0];\n            if (propsParam?.type) {\n              propsType = checker.getTypeFromTypeNode(propsParam.type);\n            }\n          }\n\n          if (propsType) {\n            // Extract parameter defaults for components (not hooks)\n            const parameterDefaults = isHook ? undefined : extractParameterDefaults(funcDecl);\n            const props = extractPropsFromType(propsType, checker, sourceFile, parameterDefaults);\n\n            docs[exportedName] = {\n              displayName: exportedName,\n              description,\n              kind,\n              props,\n              filePath,\n              lineNumber,\n            };\n          }\n        }\n      }\n\n      // Check if it's a variable declaration\n      const decl = allVariableDeclarations.get(exportedName);\n      if (decl && decl.initializer && !docs[exportedName]) {\n        // Process this variable declaration as if it were exported\n        if (ts.isArrowFunction(decl.initializer) || ts.isCallExpression(decl.initializer)) {\n          const description = extractJSDocComment(decl);\n          let propsType: ts.Type | undefined;\n          let functionNode: ts.ArrowFunction | ts.FunctionExpression | undefined;\n\n          if (decl.type) {\n            const declType = checker.getTypeFromTypeNode(decl.type);\n            const typeArgs = (declType as any).typeArguments;\n            if (typeArgs && typeArgs.length > 0) {\n              propsType = typeArgs[0];\n            }\n          } else if (ts.isArrowFunction(decl.initializer)) {\n            functionNode = decl.initializer;\n            const propsParam = decl.initializer.parameters[0];\n            if (propsParam?.type) {\n              propsType = checker.getTypeFromTypeNode(propsParam.type);\n            }\n          } else if (ts.isCallExpression(decl.initializer)) {\n            // Handle React.forwardRef\n            if (decl.initializer.typeArguments && decl.initializer.typeArguments.length >= 2) {\n              propsType = checker.getTypeFromTypeNode(decl.initializer.typeArguments[1]);\n            } else if (decl.initializer.arguments.length > 0) {\n              const firstArg = decl.initializer.arguments[0];\n              if (ts.isArrowFunction(firstArg) || ts.isFunctionExpression(firstArg)) {\n                functionNode = firstArg;\n                const propsParam = firstArg.parameters[0];\n                if (propsParam?.type) {\n                  propsType = checker.getTypeFromTypeNode(propsParam.type);\n                }\n              }\n            }\n          }\n\n          if (propsType) {\n            // Extract parameter defaults if we have a function node\n            const parameterDefaults = functionNode\n              ? extractParameterDefaults(functionNode)\n              : undefined;\n            const props = extractPropsFromType(propsType, checker, sourceFile, parameterDefaults);\n            const { filePath, lineNumber } = getSourceLocation(decl);\n\n            docs[exportedName] = {\n              displayName: exportedName,\n              description,\n              kind,\n              props,\n              filePath,\n              lineNumber,\n            };\n          }\n        }\n      }\n    }\n  });\n\n  return docs;\n}\n\n/**\n * Extract export name mappings from index.ts\n * e.g., \"export { default as LegendLinear } from './legends/Linear'\" -> { Linear: 'LegendLinear' }\n */\nfunction extractExportNameMappings(indexPath: string): Map<string, string> {\n  const mappings = new Map<string, string>();\n\n  if (!fs.existsSync(indexPath)) {\n    return mappings;\n  }\n\n  const sourceFile = ts.createSourceFile(\n    indexPath,\n    fs.readFileSync(indexPath, 'utf8'),\n    ts.ScriptTarget.Latest,\n    true,\n  );\n\n  sourceFile.forEachChild((node) => {\n    // Handle: export { default as ExportName } from './path'\n    if (\n      ts.isExportDeclaration(node) &&\n      node.moduleSpecifier &&\n      node.exportClause &&\n      ts.isNamedExports(node.exportClause)\n    ) {\n      node.exportClause.elements.forEach((element) => {\n        if (element.propertyName && element.propertyName.text === 'default' && element.name) {\n          // Get the source file path from the module specifier\n          const modulePath = (node.moduleSpecifier as ts.StringLiteral).text;\n          // Extract the original component name from the path (e.g., './legends/Linear' -> 'Linear')\n          const originalName = path.basename(modulePath);\n          const exportedName = element.name.text;\n          mappings.set(originalName, exportedName);\n        }\n      });\n    }\n  });\n\n  return mappings;\n}\n\n/**\n * Generate documentation for all visx packages\n */\nfunction generateDocsForPackages(): PackageDocs {\n  const allDocs: PackageDocs = {};\n\n  // Find all visx packages\n  const packagePaths = glob.sync('packages/visx-*/package.json', {\n    ignore: [\n      '**/node_modules/**',\n      'packages/visx-demo/**',\n      'packages/visx-vendor/**',\n      'packages/visx-visx/**',\n    ],\n  });\n\n  for (const packagePath of packagePaths) {\n    const packageDir = path.dirname(packagePath);\n    const packageName = path.basename(packageDir);\n\n    console.log(`Processing ${packageName}...`);\n\n    // Find all component files in src/\n    const srcFiles = glob.sync(`${packageDir}/src/**/*.{ts,tsx}`, {\n      ignore: ['**/*.test.ts', '**/*.test.tsx', '**/test/**'],\n    });\n\n    // Create a TypeScript program for this package\n    const tsConfigPath = path.join(packageDir, 'tsconfig.json');\n    const configFile = ts.readConfigFile(tsConfigPath, ts.sys.readFile);\n    const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, packageDir);\n\n    const program = ts.createProgram(srcFiles, parsedConfig.options);\n    const checker = program.getTypeChecker();\n\n    const packageDocs: ComponentDocs = {};\n\n    for (const sourceFile of program.getSourceFiles()) {\n      // Only process files in this package\n      if (\n        sourceFile.fileName.includes(packageDir) &&\n        !sourceFile.fileName.includes('node_modules')\n      ) {\n        const fileDocs = extractComponentDocs(sourceFile, checker);\n        Object.assign(packageDocs, fileDocs);\n      }\n    }\n\n    // Remap component names based on index.ts exports\n    const indexPath = path.join(packageDir, 'src/index.ts');\n    const exportMappings = extractExportNameMappings(indexPath);\n\n    if (exportMappings.size > 0) {\n      const remappedDocs: ComponentDocs = {};\n      Object.entries(packageDocs).forEach(([originalName, docInfo]) => {\n        const exportedName = exportMappings.get(originalName) || originalName;\n        remappedDocs[exportedName] = {\n          ...docInfo,\n          displayName: exportedName,\n        };\n      });\n      Object.assign(packageDocs, remappedDocs);\n\n      // Remove old names that were remapped\n      exportMappings.forEach((exportedName, originalName) => {\n        if (exportedName !== originalName && packageDocs[originalName]) {\n          delete packageDocs[originalName];\n        }\n      });\n    }\n\n    if (Object.keys(packageDocs).length > 0) {\n      allDocs[`@visx/${packageName.replace('visx-', '')}`] = packageDocs;\n    }\n  }\n\n  return allDocs;\n}\n\n/**\n * Main script execution\n */\nfunction main() {\n  console.log('Generating component documentation...');\n\n  const docs = generateDocsForPackages();\n\n  // Write to output file\n  const outputPath = path.join(__dirname, '../packages/visx-demo/src/generated/docs.json');\n  fs.mkdirSync(path.dirname(outputPath), { recursive: true });\n  fs.writeFileSync(outputPath, JSON.stringify(docs, null, 2));\n\n  const totalComponents = Object.values(docs).reduce(\n    (sum, pkg) => sum + Object.keys(pkg).length,\n    0,\n  );\n\n  console.log(\n    `✓ Generated documentation for ${totalComponents} components across ${\n      Object.keys(docs).length\n    } packages`,\n  );\n  console.log(`✓ Output written to ${outputPath}`);\n}\n\nmain();\n"
  },
  {
    "path": "scripts/performRelease/constants.ts",
    "content": "export const ALPHA_RELEASE = 'alpha-release';\nexport const PATCH_RELEASE = 'patch-release';\nexport const MINOR_RELEASE = 'minor-release';\nexport const MAJOR_RELEASE = 'major-release';\nexport const RELEASE_LABELS = [PATCH_RELEASE, MINOR_RELEASE, MAJOR_RELEASE, ALPHA_RELEASE];\n"
  },
  {
    "path": "scripts/performRelease/createGithubRelease.ts",
    "content": "import type { GithubClient } from '../utils/getGitHubClient';\nimport getChangelogAddition from './updateChangelog/getChangelogAddition';\nimport type { PR } from './types';\nimport getRepoContext from '../utils/getRepoContext';\n\n/**\n * Posts a new Github release if prs is not empty.\n * Release text matches changelog entry.\n */\nexport default async function createGithubRelease(\n  client: GithubClient,\n  prs: PR[],\n  tagName: string,\n) {\n  if (prs.length === 0) {\n    console.log('No PRs for which to create Github release. Exiting.');\n    return;\n  }\n\n  const { owner, repo } = getRepoContext();\n  const releaseDescription = getChangelogAddition(tagName, prs);\n\n  try {\n    await client.request('POST /repos/{owner}/{repo}/releases', {\n      owner,\n      repo,\n      tag_name: tagName,\n      target_commitish: 'master',\n      name: tagName,\n      body: releaseDescription,\n      draft: false,\n      prerelease: false,\n      generate_release_notes: false,\n    });\n  } catch (error) {\n    console.log(`Could not post new Github release. Aborting.`);\n    const message =\n      error instanceof Error\n        ? error.message\n        : typeof error === 'string'\n        ? error\n        : JSON.stringify(error);\n    console.warn(message); // log but don't fail the job\n  }\n}\n"
  },
  {
    "path": "scripts/performRelease/fetchCommitsSinceTag.ts",
    "content": "import type { GithubClient } from '../utils/getGitHubClient';\nimport getRepoContext from '../utils/getRepoContext';\n\nexport default async function fetchCommitsSinceTag(client: GithubClient, tagSha: string) {\n  console.log('Fetching commits since sha', tagSha);\n\n  const { owner, repo } = getRepoContext();\n  return client.request('GET /repos/{owner}/{repo}/compare/{base}...{head}', {\n    owner,\n    repo,\n    base: tagSha,\n    head: 'HEAD',\n  });\n}\n"
  },
  {
    "path": "scripts/performRelease/fetchPRsForCommits.ts",
    "content": "import type { GithubClient } from '../utils/getGitHubClient';\nimport getRepoContext from '../utils/getRepoContext';\nimport type { PR } from './types';\n\nexport default async function fetchPRsForCommits(\n  client: GithubClient,\n  shas: string[],\n): Promise<PR[]> {\n  const { owner, repo } = getRepoContext();\n  const prs: PR[] = [];\n\n  await Promise.all(\n    shas.map(async (sha) => {\n      console.log('Fetching PRs associated with commit', sha);\n\n      const prsForCommit = await client.request(\n        'GET /repos/{owner}/{repo}/commits/{commit_sha}/pulls',\n        {\n          owner,\n          repo,\n          commit_sha: sha,\n          // special header needed https://docs.github.com/en/rest/reference/repos#list-pull-requests-associated-with-a-commit\n          mediaType: {\n            previews: ['groot'],\n          },\n        },\n      );\n      if (prsForCommit.data.length === 0) {\n        console.log('Ignoring commit with no PRs', sha);\n        return;\n      }\n      if (prsForCommit.data.length > 1) {\n        console.warn('Multiple PRs associated with commit, only considering the first', sha);\n      }\n\n      const prForCommit = prsForCommit.data[0] as PR;\n      prs.push(prForCommit);\n    }),\n  );\n\n  return prs;\n}\n"
  },
  {
    "path": "scripts/performRelease/fetchTags.ts",
    "content": "import type { GithubClient } from '../utils/getGitHubClient';\nimport getRepoContext from '../utils/getRepoContext';\n\nexport default async function fetchTags(client: GithubClient) {\n  console.log('Fetching tags.');\n\n  const { owner, repo } = getRepoContext();\n  return client.request('GET /repos/{owner}/{repo}/tags', {\n    owner,\n    repo,\n  });\n}\n"
  },
  {
    "path": "scripts/performRelease/index.ts",
    "content": "import chalk from 'chalk';\n\nimport fetchCommitsSinceTag from './fetchCommitsSinceTag';\nimport fetchPRsForCommits from './fetchPRsForCommits';\nimport fetchTags from './fetchTags';\nimport getGitHubClient from '../utils/getGitHubClient';\nimport performLernaRelease from './performLernaRelease';\nimport postReleaseOnPrs from './postReleaseOnPrs';\nimport updateChangelog from './updateChangelog';\nimport createGithubRelease from './createGithubRelease';\n/**\n * Performs a release + updates changelog as needed using the following approach\n * - fetch PRs for all commits since last non-alpha tag\n * - perform release if any PR has a release label\n * - posts on all PRs with the release info\n * - updates changelog\n */\nasync function performRelease() {\n  const client = getGitHubClient();\n\n  console.log('Running release script');\n\n  // fetch most recent alpha + non-alpha tags\n  // this allows posting on PRs for the alpha / non-alpha release\n  // while only using PRs since the last (alpha or non-alpha) tag to dictate the next release version\n  const tagsRequest = await fetchTags(client); // sorted new => old\n  const mostRecentTag = tagsRequest.data[0];\n  const mostRecentNonAlphaTag = tagsRequest.data.find((tag) => !tag.name.includes('alpha'));\n\n  if (!mostRecentTag || !mostRecentNonAlphaTag) {\n    console.log('Could not find recent tag. Exiting.');\n    process.exit(1);\n  }\n\n  console.log('Most recent tag found is', mostRecentTag.name);\n  console.log('Most recent non-alpha tag found is', mostRecentNonAlphaTag.name);\n\n  // get commits since most recent alpha / non-alpha tag\n  const commitsSinceLastTagRequest = await fetchCommitsSinceTag(client, mostRecentTag.commit.sha);\n  const commitsSinceNonAlphaTagRequest = await fetchCommitsSinceTag(\n    client,\n    mostRecentNonAlphaTag.commit.sha,\n  );\n\n  const commitsSinceNonAlphaTag = commitsSinceNonAlphaTagRequest.data.commits;\n  const commitsSinceLastTag = commitsSinceLastTagRequest.data.commits;\n\n  if (commitsSinceLastTag.length === 0) {\n    console.log(`No commits found since last release tag. Exiting.`);\n    process.exit(0);\n  }\n\n  // find PRs since last alpha / non-alpha tags, to determine if we need to release\n  // and for changelog generation\n  const prsSinceLastTag = await fetchPRsForCommits(\n    client,\n    commitsSinceLastTag.map((commit) => commit.sha),\n  );\n  const prsSinceLastNonAlphaTag = await fetchPRsForCommits(\n    client,\n    commitsSinceNonAlphaTag.map((commit) => commit.sha),\n  );\n\n  // release is based on tags since last tag regardless of alpha / non-alpha\n  // this better matches the workflow where you\n  //   1) publish alpha major release (e.g., 2.0.0-alpha.0)\n  //   2) publish alpha patch changes (e.g., 2.0.1-alpha.0)\n  //   3) publish non-alpha patch     (e.g., 2.0.2)\n  // if we base the release on PRs since the last non-alpha tag, we would get\n  // get multiple major version bumps\n  const isPreRelease = await performLernaRelease(prsSinceLastTag);\n\n  const newTagsRequest = await fetchTags(client);\n  const newTag = newTagsRequest.data[0];\n\n  // no new tag was created, bail\n  if (newTag.name === mostRecentTag.name) {\n    console.log('Newest tag equals previous tag, will not update changelog or post on PRs.');\n    process.exit(0);\n  }\n\n  // update changelog + create Github release only for non-alpha releases\n  // include all PRs since last non-alpha release\n  if (!isPreRelease) {\n    await updateChangelog(prsSinceLastNonAlphaTag, newTag.name);\n    await createGithubRelease(client, prsSinceLastNonAlphaTag, newTag.name);\n  }\n\n  // post release version on all PRs since last non-alpha release to inform authors\n  // this will double post on alpha PRs (which is desired)\n  await postReleaseOnPrs(client, prsSinceLastNonAlphaTag, newTag.name);\n}\n\nperformRelease().catch((error) => {\n  console.error(chalk.red(String(error.message)));\n  process.exit(1);\n});\n"
  },
  {
    "path": "scripts/performRelease/performLernaRelease.ts",
    "content": "import util from 'util';\nimport childProcess from 'child_process';\nimport { ALPHA_RELEASE, MAJOR_RELEASE, MINOR_RELEASE, RELEASE_LABELS } from './constants';\nimport type { PR } from './types';\n\nconst exec = util.promisify(childProcess.exec);\n\nexport function isReleasePR(pr: PR) {\n  return RELEASE_LABELS.some((releaseLabel) =>\n    pr.labels.some((label) => label.name === releaseLabel),\n  );\n}\n\nexport default async function performLernaRelease(prsSinceLastTag: PR[]) {\n  const releasePRsSinceLastTag = prsSinceLastTag.filter(isReleasePR);\n\n  if (releasePRsSinceLastTag.length === 0) {\n    console.log('No release PRs found for commits since last release. Exiting.');\n    process.exit(0);\n  }\n\n  // run lerna based on the type of release\n  const isPreRelease = releasePRsSinceLastTag.some((pr) =>\n    // note that this logic requires that all alpha tags be removed from PRs\n    // in order to trigger a non-alpha release. git keeps tag history so\n    // preserving context should not be an issue\n    pr.labels.some((label) => label.name === ALPHA_RELEASE),\n  );\n  const isMinor = releasePRsSinceLastTag.some((pr) =>\n    pr.labels.some((label) => label.name === MINOR_RELEASE),\n  );\n  const isMajor = releasePRsSinceLastTag.some((pr) =>\n    pr.labels.some((label) => label.name === MAJOR_RELEASE),\n  );\n\n  // perform release\n  try {\n    const version = `${isPreRelease ? 'pre' : ''}${\n      isMajor ? 'major' : isMinor ? 'minor' : 'patch'\n    }`;\n\n    const distTag = isPreRelease ? 'next' : 'latest';\n\n    console.log(`Attempting to publish a '${version}' release.`);\n\n    const { stdout, stderr } = await exec(\n      // --no-verify-access is needed because the CI token isn't valid for that endpoint\n      // provenance is automatically generated when using OIDC Trusted Publishers\n      `npx lerna publish ${version} --exact --yes --dist-tag ${distTag}`,\n    );\n    if (stdout) {\n      console.log('Lerna output', stdout);\n    }\n    if (stderr) {\n      console.warn('The following stderr was generated during publishing:', stderr);\n    }\n  } catch (error) {\n    const message =\n      error instanceof Error\n        ? error.message\n        : typeof error === 'string'\n        ? error\n        : JSON.stringify(error);\n    console.warn('The following error occurred during publishing. Exiting.', message);\n    process.exit(1);\n  }\n\n  return isPreRelease;\n}\n"
  },
  {
    "path": "scripts/performRelease/postReleaseOnPrs.ts",
    "content": "import type { GithubClient } from '../utils/getGitHubClient';\nimport getRepoContext from '../utils/getRepoContext';\nimport type { PR } from './types';\n\nexport default async function postReleaseOnPrs(client: GithubClient, prs: PR[], tagName: string) {\n  console.log(`Posting release on ${prs.length} PRs`);\n  const { owner, repo } = getRepoContext();\n  const message = `🎉 This PR is included in version \\`${tagName}\\` of the packages modified 🎉`;\n\n  await Promise.all(\n    prs.map(async (pr) => {\n      console.log('Posting release on PR #', pr.number);\n\n      await client.issues.createComment({\n        issue_number: pr.number,\n        owner,\n        repo,\n        body: message,\n      });\n    }),\n  );\n}\n"
  },
  {
    "path": "scripts/performRelease/types.ts",
    "content": "import type { components } from '@octokit/openapi-types';\n\nexport type PR = components['schemas']['pull-request-simple'];\n"
  },
  {
    "path": "scripts/performRelease/updateChangelog/getChangelogAddition.ts",
    "content": "import type { PR } from '../types';\n\nconst MS_PER_MINUTE = 60 * 1000;\n\n/** Returns a UTC date string in the format YYYY-MM-DD */\nfunction getCurrentDate() {\n  const now = new Date();\n  return new Date(now.getTime() - now.getTimezoneOffset() * MS_PER_MINUTE)\n    .toISOString()\n    .split('T')[0];\n}\n\n/** util to print a section of PRs. */\nconst printPRs = (sectionTitle: string, prs: PR[]) =>\n  `\\n\\n${sectionTitle}\\n\\n${prs\n    .map((pr) => `- ${pr.title} [#${pr.number}](${pr.html_url})`)\n    .join('\\n')}`;\n\n/** Creates the new content for the changelog. */\nexport default function getChangelogAddition(tagName: string, prs: PR[]) {\n  // find unique contributors and alphabetize\n  const contributors = Array.from(\n    new Set(prs.map((pr) => pr.user?.login ?? '').filter((user) => user)),\n  ).sort((a, b) => a.toLowerCase().localeCompare(b.toLowerCase()));\n\n  // categorize PRs. each PR may be in multiple categories tho it will have only one title\n  const enhancements = prs.filter((pr) =>\n    pr.labels.some((label) => label.name?.match(/enhancement/gi)),\n  );\n  const bugFixes = prs.filter((pr) => pr.labels.some((label) => label.name?.match(/bug/gi)));\n  const breaking = prs.filter((pr) => pr.labels.some((label) => label.name?.match(/breaking/gi)));\n  const internal = prs.filter((pr) => pr.labels.some((label) => label.name?.match(/internal/gi)));\n  const docs = prs.filter((pr) => pr.labels.some((label) => label.name?.match(/docs/gi)));\n  const uncategorized = prs.filter(\n    ({ id }) =>\n      !enhancements.find((pr) => pr.id === id) &&\n      !bugFixes.find((pr) => pr.id === id) &&\n      !breaking.find((pr) => pr.id === id) &&\n      !internal.find((pr) => pr.id === id) &&\n      !docs.find((pr) => pr.id === id),\n  );\n\n  const changelogAddition = `# ${tagName} (${getCurrentDate()})${\n    enhancements.length === 0 ? '' : printPRs('#### :rocket: Enhancements', enhancements)\n  }${bugFixes.length === 0 ? '' : printPRs('#### :bug: Bug Fix', bugFixes)}${\n    breaking.length === 0 ? '' : printPRs('### :boom:  Breaking Changes', breaking)\n  }${docs.length === 0 ? '' : printPRs('### :memo: Documentation', docs)}${\n    internal.length === 0 ? '' : printPRs('### :house:  Internal', internal)\n  }${uncategorized.length === 0 ? '' : printPRs('#### Uncategorized', uncategorized)}\n  \n#### :trophy: Contributors\n${contributors\n  .map((contributor) => `- [${contributor}](https://github.com/${contributor})`)\n  .join('\\n')}`;\n\n  return changelogAddition;\n}\n"
  },
  {
    "path": "scripts/performRelease/updateChangelog/index.ts",
    "content": "import fs from 'fs';\nimport util from 'util';\nimport childProcess from 'child_process';\n\nimport type { PR } from '../types';\nimport getChangelogAddition from './getChangelogAddition';\nimport mergeUpdateIntoChangelog from './mergeUpdateIntoChangelog';\n\nconst CHANGELOG_PATH = 'CHANGELOG.md';\nconst exec = util.promisify(childProcess.exec);\n\nexport default async function updateChangelog(prs: PR[], tagName: string) {\n  if (prs.length === 0) {\n    console.log('No PRs with which to update changelog. Exiting.');\n    return;\n  }\n\n  try {\n    console.log('Fetching current changelog');\n\n    const currChangelogRequest = await fetch(\n      `https://raw.githubusercontent.com/airbnb/visx/master/${CHANGELOG_PATH}`,\n    );\n\n    const currChangelog = await currChangelogRequest.text();\n    const nextChangelog = mergeUpdateIntoChangelog(\n      currChangelog,\n      getChangelogAddition(tagName, prs),\n      tagName,\n    );\n\n    console.log('Updating changelog with new content.');\n\n    fs.writeFileSync(CHANGELOG_PATH, nextChangelog, 'utf8');\n\n    const { stdout, stderr } = await exec(\n      `git add . && git commit -m \"changelog: ${tagName}\" && git push`,\n    );\n    if (stdout) {\n      console.log('Commit changelog output', stdout);\n    }\n    if (stderr) {\n      console.warn('Commit changelog stderr:', stderr);\n    }\n  } catch (error) {\n    console.log(`Could not update CHANGELOG.md from master. Aborting.`);\n    const message =\n      error instanceof Error\n        ? error.message\n        : typeof error === 'string'\n        ? error\n        : JSON.stringify(error);\n    console.warn(message);\n    process.exit(1);\n  }\n}\n"
  },
  {
    "path": "scripts/performRelease/updateChangelog/mergeUpdateIntoChangelog.ts",
    "content": "const CHANGELOG_HEADER = '# Changelog';\nconst LINK_CONTENT_SEPARATOR = '------';\n\n/**\n * Util that merges a new changelog entry into the existing changelog. It: \n * - inserts a convenience link for the new release tag\n * - moves the oldest *recent* link into the *older releases section*\n * - incorporate the new changelog change addition\n\n * Example structure\n    # Changelog\n    - [v1.6.0](#v160)\n    - [v1.5.0](#v150)\n    - [v1.4.0](#v140)\n    <details>\n    <summary>Older Releases...</summary>\n    <ul>\n    <li><a href=\"#v00198\">v0.0.198</a></li>\n    <li><a href=\"#v00197\">v0.0.197</a></li>\n    </ul>\n    </details>\n    ------\n    # v1.6.0\n    ...\n\n    # v1.5.0\n    ...\n */\nexport default function mergeUpdateIntoChangelog(\n  currChangelog: string,\n  changelogAddition: string,\n  tagName: string,\n) {\n  // split into all links and actual changelog content\n  const [currChangelogLinks, currChangelogContent] = currChangelog.split(LINK_CONTENT_SEPARATOR);\n  const currChangelogLinksByLine = currChangelogLinks\n    .split('\\n')\n    .filter((line) => line !== '\\n' && line !== CHANGELOG_HEADER); // remove header + newlines\n\n  // find start of older releases\n  const detailsIndex = currChangelogLinksByLine.findIndex((line) => line.includes('<details>'));\n  const oldestRecentLinkIndex = detailsIndex - 1;\n  const [oldestRecentLink] = currChangelogLinksByLine.splice(oldestRecentLinkIndex, 1);\n\n  // extract the version + URL id from the oldest recent link `- [v1.3.0](#v130)`\n  const oldestRecentLinkMatch = oldestRecentLink.match(/\\[(.*)\\]\\((.*)\\)/);\n  if (oldestRecentLinkMatch == null) {\n    console.log('Error merging changes into changelog. Exiting.');\n    process.exit(1);\n  }\n  const oldestRecentLinkVersion = oldestRecentLinkMatch[1];\n  const oldestRecentLinkUrl = oldestRecentLinkMatch[2];\n\n  const ulIndex = currChangelogLinksByLine.findIndex((line) => line.includes('<ul>'));\n  const oldestRecentLinkInsertionIndex = ulIndex + 1;\n  const nextChangelogLinksByLine = [\n    // new link\n    `- [${tagName}](#${tagName.replace(/\\./g, '')})`, // remove '.' in tag\n    // previous recent links\n    ...currChangelogLinksByLine.slice(0, oldestRecentLinkInsertionIndex),\n    // oldest recent link now in older links\n    `  <li><a href=\"${oldestRecentLinkUrl}\">${oldestRecentLinkVersion}</a></li>`,\n    // older links\n    ...currChangelogLinksByLine.slice(oldestRecentLinkInsertionIndex),\n  ];\n\n  // now merge new and old content\n  const nextChangelog = `${CHANGELOG_HEADER}\\n${nextChangelogLinksByLine.join(\n    '\\n',\n  )}${LINK_CONTENT_SEPARATOR}\\n${changelogAddition}\\n${currChangelogContent}`;\n\n  return nextChangelog;\n}\n"
  },
  {
    "path": "scripts/postInstall.ts",
    "content": "import fs from 'fs';\nimport path from 'path';\nimport { EOL } from 'os';\n\nexport const DIRNAME = __dirname; // eslint-disable-line no-undef\nconst ROOT_PATH = path.resolve(DIRNAME, '../');\n\n/**\n * Fix compilation issues in jsdom files.\n */\nfunction updateJSDomTypeDefinition() {\n  const relativePath = path.join('node_modules', '@types', 'jsdom', 'base.d.ts');\n  const filePath = path.join(ROOT_PATH, relativePath);\n  if (!fs.existsSync(filePath)) {\n    console.warn(`JSdom base.d.ts not found '${filePath}' (visx post install script)`);\n    return;\n  }\n  const fileContents = fs.readFileSync(filePath, { encoding: 'utf8' });\n  const replacedContents = fileContents.replace(\n    /\\s*globalThis: DOMWindow;\\s*readonly \\[\"Infinity\"]: number;\\s*readonly \\[\"NaN\"]: number;/g,\n    [\n      'globalThis: DOMWindow;',\n      '// @ts-ignore',\n      'readonly [\"Infinity\"]: number;',\n      '// @ts-ignore',\n      'readonly [\"NaN\"]: number;',\n    ].join(`${EOL}        `),\n  );\n  if (replacedContents === fileContents) {\n    console.warn('JSdom base.d.ts not updated');\n    return;\n  }\n  fs.writeFileSync(filePath, replacedContents);\n}\n\nupdateJSDomTypeDefinition();\n"
  },
  {
    "path": "scripts/updateTsReferences.ts",
    "content": "import fs from 'fs';\nimport chalk from 'chalk';\nimport glob from 'fast-glob';\n\n/** Updates references in all package/../tsconfig.json files */\nasync function updateTsReferences() {\n  const packages = await glob('./packages/*', { absolute: true, onlyDirectories: true });\n\n  packages.forEach((packagePath) => {\n    try {\n      console.log(chalk.green(`Updating refs for ${packagePath}`));\n      const packageJsonFile = fs.readFileSync(`${packagePath}/package.json`, 'utf-8');\n      const packageJson = JSON.parse(packageJsonFile);\n      const { dependencies = {} } = packageJson;\n      const visXDependencies = Object.keys(dependencies).filter((key) => key.startsWith('@visx/'));\n\n      const visXReferences = visXDependencies.map((dep) => ({\n        path: `../visx-${dep.replace('@visx/', '')}`,\n      }));\n\n      const tsConfigFile = fs.readFileSync(`${packagePath}/tsconfig.json`, 'utf-8');\n      const tsConfig = JSON.parse(tsConfigFile);\n\n      tsConfig.references = visXReferences;\n\n      fs.writeFileSync(`${packagePath}/tsconfig.json`, JSON.stringify(tsConfig, null, 2));\n    } catch (error) {\n      console.error(chalk.red(String(error)));\n      throw error;\n    }\n  });\n\n  return Promise.resolve();\n}\n\nupdateTsReferences().catch((error) => {\n  console.error(chalk.red(String(error)));\n  process.exitCode = 1;\n});\n"
  },
  {
    "path": "scripts/utils/getGitHubClient.ts",
    "content": "// eslint-disable-next-line import/no-extraneous-dependencies\nimport { Octokit } from '@octokit/rest';\n\nexport default function getGitHubClient() {\n  if (!process.env.GITHUB_TOKEN) throw new Error('No GitHub token available. Aborting.');\n\n  const client = new Octokit({\n    auth: `token ${process.env.GITHUB_TOKEN}`,\n    userAgent: 'visx',\n  });\n\n  return client;\n}\n\nexport type GithubClient = ReturnType<typeof getGitHubClient>;\n"
  },
  {
    "path": "scripts/utils/getPullRequestNumber.ts",
    "content": "export default function getPullRequestNumber() {\n  const prNumberString = process.env.PR_NUMBER;\n  if (!prNumberString) throw new Error('No PR number available. Aborting.');\n\n  return Number(prNumberString);\n}\n"
  },
  {
    "path": "scripts/utils/getRepoContext.ts",
    "content": "export default function getRepoContext() {\n  const { GITHUB_REPOSITORY = '/' } = process.env;\n  const [owner, repo] = GITHUB_REPOSITORY.split('/');\n  return { owner, repo };\n}\n"
  },
  {
    "path": "scripts/utils/upsertPullRequestComment.ts",
    "content": "import getGitHubClient from './getGitHubClient';\nimport getPullRequestNumber from './getPullRequestNumber';\nimport getRepoContext from './getRepoContext';\n\nexport default async function upsertPullRequestComment(query: string, body: string) {\n  const client = getGitHubClient();\n  const prNumber = getPullRequestNumber();\n  const { owner, repo } = getRepoContext();\n\n  console.log(`Loading comments for repo ${owner} ${repo} PR #${prNumber}`);\n\n  // Load all comments\n  const { data: comments } = await client.issues.listComments({\n    issue_number: prNumber,\n    owner,\n    repo,\n  });\n\n  // Find a previously created comment by our bot\n  const previousComments = comments.filter(\n    (comment) =>\n      comment.body?.includes(query) &&\n      comment.user?.type.toLowerCase() === 'bot' &&\n      comment.user?.login === 'github-actions[bot]',\n  );\n\n  // Update existing comment\n  if (previousComments.length > 0) {\n    const { id } = previousComments[0];\n\n    console.log(`Updating comment #${id}`);\n\n    await client.issues.updateComment({\n      comment_id: id,\n      owner,\n      repo,\n      body,\n    });\n\n    // Insert a new comment\n  } else {\n    console.log('Adding a new comment');\n\n    await client.issues.createComment({\n      issue_number: prNumber,\n      owner,\n      repo,\n      body,\n    });\n  }\n}\n"
  },
  {
    "path": "tsconfig.eslint.json",
    "content": "{\n  \"extends\": \"./tsconfig.options.json\",\n  \"include\": [\n    \"scripts/**/*\",\n    \"packages/*/src/**/*\",\n    \"packages/*/test/**/*\",\n    \"packages/*/types/**/*\",\n    \"packages/*/scripts/**/*\",\n    \"vitest.workspace.ts\",\n    \"packages/*/vitest.config.ts\"\n  ]\n}"
  },
  {
    "path": "tsconfig.json",
    "content": "{\n  \"extends\": \"./tsconfig.options.json\",\n  \"files\": [],\n}"
  },
  {
    "path": "tsconfig.node.json",
    "content": "{\n  \"compilerOptions\": {\n    \"allowSyntheticDefaultImports\": true,\n    \"composite\": true,\n    \"declaration\": true,\n    \"declarationMap\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"isolatedModules\": false,\n    \"jsx\": \"react\",\n    \"lib\": [\"dom\", \"esnext\"],\n    \"module\": \"commonjs\",\n    \"moduleResolution\": \"node\",\n    \"noEmitOnError\": true,\n    \"noErrorTruncation\": false,\n    \"noImplicitReturns\": true,\n    \"noUnusedLocals\": true,\n    \"pretty\": true,\n    \"removeComments\": false,\n    \"resolveJsonModule\": true,\n    \"strict\": true,\n    \"target\": \"es2015\",\n    \"typeRoots\": [\"./node_modules/@types\", \"./types\"],\n    \"useDefineForClassFields\": false\n  }\n}\n"
  },
  {
    "path": "tsconfig.options.json",
    "content": "{\n  \"compilerOptions\": {\n    \"allowSyntheticDefaultImports\": true,\n    \"declaration\": true,\n    \"esModuleInterop\": true,\n    \"forceConsistentCasingInFileNames\": true,\n    \"isolatedModules\": false,\n    \"jsx\": \"react-jsx\",\n    \"lib\": [\n      \"dom\",\n      \"esnext\"\n    ],\n    \"module\": \"esnext\",\n    \"moduleResolution\": \"node\",\n    \"noEmitOnError\": true,\n    \"noImplicitReturns\": true,\n    \"noUnusedLocals\": true,\n    \"pretty\": true,\n    \"removeComments\": false,\n    \"strict\": true,\n    \"target\": \"es2015\",\n    \"useDefineForClassFields\": false,\n    \"composite\": true,\n    \"declarationMap\": true,\n    \"emitDeclarationOnly\": true,\n    \"resolveJsonModule\": true\n  }\n}"
  },
  {
    "path": "vitest.config.ts",
    "content": "import { defineConfig } from 'vitest/config';\n\nexport default defineConfig({\n  test: {\n    projects: [\n      'packages/visx-scale/vitest.config.ts',\n      'packages/visx-point/vitest.config.ts',\n      'packages/visx-curve/vitest.config.ts',\n      'packages/visx-event/vitest.config.ts',\n      'packages/visx-mock-data/vitest.config.ts',\n      'packages/visx-stats/vitest.config.ts',\n      'packages/visx-delaunay/vitest.config.ts',\n      'packages/visx-voronoi/vitest.config.ts',\n      'packages/visx-drag/vitest.config.ts',\n      'packages/visx-network/vitest.config.ts',\n      'packages/visx-threshold/vitest.config.ts',\n      'packages/visx-group/vitest.config.ts',\n      'packages/visx-pattern/vitest.config.ts',\n      'packages/visx-clip-path/vitest.config.ts',\n      'packages/visx-zoom/vitest.config.ts',\n      'packages/visx-grid/vitest.config.ts',\n      'packages/visx-marker/vitest.config.ts',\n      'packages/visx-gradient/vitest.config.ts',\n      'packages/visx-glyph/vitest.config.ts',\n      'packages/visx-tooltip/vitest.config.ts',\n      'packages/visx-chord/vitest.config.ts',\n      'packages/visx-responsive/vitest.config.ts',\n      'packages/visx-annotation/vitest.config.ts',\n      'packages/visx-axis/vitest.config.ts',\n      'packages/visx-legend/vitest.config.ts',\n      'packages/visx-bounds/vitest.config.ts',\n      'packages/visx-brush/vitest.config.ts',\n      'packages/visx-geo/vitest.config.ts',\n      'packages/visx-heatmap/vitest.config.ts',\n      'packages/visx-hierarchy/vitest.config.ts',\n      'packages/visx-react-spring/vitest.config.ts',\n      'packages/visx-sankey/vitest.config.ts',\n      'packages/visx-shape/vitest.config.ts',\n      'packages/visx-text/vitest.config.ts',\n      'packages/visx-wordcloud/vitest.config.ts',\n      'packages/visx-xychart/vitest.config.ts',\n      'packages/visx-visx/vitest.config.ts',\n      'packages/visx-vendor/vitest.config.ts',\n    ],\n  },\n});\n"
  }
]