pax_global_header00006660000000000000000000000064152205641610014514gustar00rootroot0000000000000052 comment=329f7a680efa262c310b938a343295880eefe4fc immutable-js-immutable-js-6a01d72/000077500000000000000000000000001522056416100170225ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/.editorconfig000066400000000000000000000003061522056416100214760ustar00rootroot00000000000000# EditorConfig is awesome: http://EditorConfig.org root = true [*] end_of_line = lf insert_final_newline = true [*.{js,d.ts,json,html,md,sh}] charset = utf-8 indent_style = space indent_size = 2 immutable-js-immutable-js-6a01d72/.git-blame-ignore-revs000066400000000000000000000002041522056416100231160ustar00rootroot00000000000000# upgrade to prettier 3 0355483c301dba5e215e2c3d113125a274444e38 # sort imports with eslint 67a4fa91a0fe147656886e8dc0227f2c24185b6eimmutable-js-immutable-js-6a01d72/.github/000077500000000000000000000000001522056416100203625ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/.github/CONTRIBUTING.md000066400000000000000000000064131522056416100226170ustar00rootroot00000000000000# Have a question? Please ask questions on [Stack Overflow](https://stackoverflow.com/questions/tagged/immutable.js) instead of opening a Github Issue. There are more people on Stack Overflow who can answer questions, and good answers can be searchable and canonical. # Issues We use GitHub issues to track bugs. Please ensure your bug description is clear and has sufficient instructions to be able to reproduce the issue. The absolute best way to report a bug is to submit a pull request including a new failing test which describes the bug. When the bug is fixed, your pull request can then be merged! The next best way to report a bug is to provide a reduced test case on jsFiddle or jsBin or produce exact code inline in the issue which will reproduce the bug. # Code of Conduct Immutable.js is maintained within the [Contributor Covenant's Code of Conduct](https://www.contributor-covenant.org/version/2/0/code_of_conduct/). # Pull Requests All active development of Immutable JS happens on GitHub. We actively welcome your [pull requests](https://help.github.com/articles/creating-a-pull-request). 1. Fork the repo and create your branch from `master`. 2. Install all dependencies. (`npm install`) 3. If you've added code, add tests. 4. If you've changed APIs, update the documentation. 5. Build generated JS, run tests and ensure your code passes lint. (`npm run test`) 6. If you haven't already, complete the Contributor License Agreement ("CLA"). ## Documentation Documentation for Immutable.js (hosted at https://immutable-js.com/) is developed in `pages/`. Run `npm start` to get a local copy in your browser while making edits. ## Coding Style - 2 spaces for indentation (no tabs) - 80 character line length strongly preferred. - Prefer `'` over `"` - ES6 Harmony when possible. - Use semicolons; - Trailing commas, - Avd abbr wrds. # Functionality Testing Run the following command to build the library and test functionality: ```bash npm run test ``` ## Performance Regression Testing Performance tests run against master and your feature branch. Make sure to commit your changes in your local feature branch before proceeding. These commands assume you have a remote named `upstream` amd that you do not already have a local `master` branch: ```bash git fetch upstream git checkout -b master upstream/master ``` These commands build `dist` and commit `dist/immutable.js` to `master` so that the regression tests can run. ```bash npm run test git add dist/immutable.js -f git commit -m 'perf test prerequisite.' ``` Switch back to your feature branch, and run the following command to run regression tests: ```bash npm run test npm run perf ``` Sample output: ```bash > immutable@4.0.0-rc.9 perf ~/github.com/immutable-js/immutable-js > node ./resources/bench.js List > builds from array of 2 Old: 678,974 683,071 687,218 ops/sec New: 669,012 673,553 678,157 ops/sec compare: 1 -1 diff: -1.4% rme: 0.64% ``` ## TypeScript version support TypeScript version does support the same version as [DefinitelyTyped](https://github.com/DefinitelyTyped/DefinitelyTyped) versions. Immutable "may" work with older versions, but no support will be provided. ## License By contributing to Immutable.js, you agree that your contributions will be licensed under its MIT license. immutable-js-immutable-js-6a01d72/.github/FUNDING.yml000066400000000000000000000000221522056416100221710ustar00rootroot00000000000000github: [jdeniau] immutable-js-immutable-js-6a01d72/.github/ISSUE_TEMPLATE.md000066400000000000000000000032171522056416100230720ustar00rootroot00000000000000 ### What happened ### How to reproduce immutable-js-immutable-js-6a01d72/.github/dependabot.yml000066400000000000000000000010151522056416100232070ustar00rootroot00000000000000# To get started with Dependabot version updates, you'll need to specify which # package ecosystems to update and where the package manifests are located. # Please see the documentation for all configuration options: # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file version: 2 updates: - package-ecosystem: "npm" # See documentation for possible values directory: "/" # Location of package manifests schedule: interval: "weekly" immutable-js-immutable-js-6a01d72/.github/workflows/000077500000000000000000000000001522056416100224175ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/.github/workflows/ci.yml000066400000000000000000000075471522056416100235520ustar00rootroot00000000000000name: CI on: push: branches: - main - 5.x - 6.x pull_request: ~ jobs: lint: name: 'Lint' runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: node-version: '24' - uses: actions/cache@v5 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-node- - run: npm ci - run: npm run lint - run: npm run check-git-clean type-check: name: 'Type Check' runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: node-version: '24' - uses: actions/cache@v5 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-node- - uses: actions/cache@v5 with: path: ~/.dts key: ${{ runner.OS }}-dts-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-dts- - run: npm ci - run: npm run type-check - run: npm run check-git-clean test: name: 'Build & Unit Test & Type Test' runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: node-version: '24' - uses: actions/cache@v5 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-node- - name: 'Install dependencies' run: npm ci - name: 'Build JS files' run: npm run build - name: 'Ensure all files are builded' run: npm run check-build-output - name: 'Run unit tests' run: npm run test:unit - name: 'Test types' run: npm run test:types -- --target '5.0 || *' - run: npx size-limit - run: npm run check-git-clean website: name: 'Build Website' runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version: '24' - uses: actions/cache@v5 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-node- - run: npm ci - run: NODE_OPTIONS=--openssl-legacy-provider npm run website:build - run: npm run check-git-clean publish: name: 'Publish' needs: [lint, type-check, test, website] if: github.ref == 'refs/heads/main' runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 with: fetch-depth: 0 - uses: actions/setup-node@v6 with: node-version: '24' - uses: actions/cache@v5 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-node- - run: npm ci - run: npm run build - run: NODE_OPTIONS=--openssl-legacy-provider npm run website:build - name: Push NPM Branch if: github.ref == 'refs/heads/main' uses: peaceiris/actions-gh-pages@v3 with: enable_jekyll: true github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./npm publish_branch: npm user_name: 'github-actions[bot]' user_email: 'github-actions[bot]@users.noreply.github.com' - name: Publish Docs if: github.ref == 'refs/heads/main' uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./website/out cname: immutable-js.com user_name: 'github-actions[bot]' user_email: 'github-actions[bot]@users.noreply.github.com' immutable-js-immutable-js-6a01d72/.github/workflows/output_diff.yml000066400000000000000000000032601522056416100254730ustar00rootroot00000000000000name: Output diff for TS files on: pull_request: branches: - main - init-migrate-to-ts # run only if there is ts files in the PR paths: - 'src/**/*.ts' jobs: diff: name: 'Output diff' runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 with: path: 'pr' - uses: actions/checkout@v7 with: ref: ${{ github.event.pull_request.base.sha }} path: 'main' - uses: actions/setup-node@v6 with: node-version: '24' - uses: actions/cache@v5 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-node- - name: 'Install PR branch dependencies' run: npm ci working-directory: pr - name: 'Install main branch dependencies' run: npm ci working-directory: main - name: 'Build PR branch' run: npm run build working-directory: pr - name: 'Build main branch' run: npm run build working-directory: main - name: 'Execute prettier and remove ts-expect-error on PR dist' run: npx terser dist/immutable.es.js --comments false | npx prettier --parser=babel > dist/immutable.es.prettier.js working-directory: pr - name: 'Execute prettier main dist' run: npx terser dist/immutable.es.js --comments false | npx prettier --parser=babel > dist/immutable.es.prettier.js working-directory: main - name: 'Output diff' run: diff --unified --ignore-blank-lines --ignore-all-space main/dist/immutable.es.prettier.js pr/dist/immutable.es.prettier.js immutable-js-immutable-js-6a01d72/.github/workflows/release.yml000066400000000000000000000024211522056416100245610ustar00rootroot00000000000000name: Release on: workflow_dispatch: ~ release: types: [published] permissions: id-token: write # Required for OIDC / npm contents: read jobs: build: name: 'Build & Publish to NPM' permissions: contents: read id-token: write runs-on: ubuntu-latest steps: - uses: actions/checkout@v7 - uses: actions/setup-node@v6 with: node-version: '24' registry-url: 'https://registry.npmjs.org' - uses: actions/cache@v5 with: path: ~/.npm key: ${{ runner.OS }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.OS }}-node- # Ensure npm 11.5.1 or later is installed - name: Update npm run: npm install -g npm@latest - run: npm ci - run: npm run build - name: 'Determine NPM tag: latest or next depending if we are on a prerelease or not (version with hyphen should be a prerelease)' id: npm_tag run: | VERSION=$(node -p "require('./package.json').version") if [[ $VERSION == *-* ]]; then echo "TAG=next" >> "$GITHUB_OUTPUT" else echo "TAG=latest" >> "$GITHUB_OUTPUT" fi - run: cd npm && npm publish --tag ${{ steps.npm_tag.outputs.TAG }} immutable-js-immutable-js-6a01d72/.gitignore000066400000000000000000000003211522056416100210060ustar00rootroot00000000000000.*.haste_cache.* node_modules npm-debug.log yarn-error.log .DS_Store *~ *.swp .idea *.iml TODO /website/.next /website/out /website/public/sitemap*.xml /website/public/robots.txt /gh-pages /npm /dist /coverageimmutable-js-immutable-js-6a01d72/.prettierignore000066400000000000000000000000421522056416100220610ustar00rootroot00000000000000dist type-definitions/flow-tests/ immutable-js-immutable-js-6a01d72/.prettierrc.json000066400000000000000000000000321522056416100221510ustar00rootroot00000000000000{ "singleQuote": true } immutable-js-immutable-js-6a01d72/CHANGELOG.md000066400000000000000000001045451522056416100206440ustar00rootroot00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Dates are formatted as YYYY-MM-DD. ## Unreleased ## 5.1.9 - fix(List): a `List` grown past 32 elements while all its values are `undefined` no longer reads those values back as `null` (affected `get`, iteration, `toArray`, `equals` and `hashCode`) ## 5.1.8 - fix(List): guard oversized bounds in setListBounds. Fixes CVE https://github.com/immutable-js/immutable-js/security/advisories/GHSA-v56q-mh7h-f735 - perf(Map): index large hash-collision buckets for faster lookups. Fixes CVE https://github.com/immutable-js/immutable-js/security/advisories/GHSA-xvcm-6775-5m9r ## 4.3.9 - fix(List): guard oversized bounds in setListBounds. Fixes CVE https://github.com/immutable-js/immutable-js/security/advisories/GHSA-v56q-mh7h-f735 - perf(Map): index large hash-collision buckets for faster lookups. Fixes CVE https://github.com/immutable-js/immutable-js/security/advisories/GHSA-xvcm-6775-5m9r ## 5.1.7 - fix(Repeat): lastIndexOf returned size instead of size - 1 by @chatman-media in https://github.com/immutable-js/immutable-js/pull/2227. Fixes CVE [CVE-2026-29063 ](https://github.com/immutable-js/immutable-js/security/advisories/GHSA-wf6x-7x77-mvgw) - fix(IndexedCollection): `has(index)` on a lazy `Seq` of unknown size now checks index existence instead of searching for a value equal to the index [#2203](https://github.com/immutable-js/immutable-js/pull/2203) - [TypeScript]: `reduce`/`reduceRight` without an initial value now infer the result type from the collection's values when the reducer returns a value (e.g. `list.reduce((a, b) => a + b)` infers `number`), matching `Array#reduce`. Previously an explicit type argument was required. [#2205](https://github.com/immutable-js/immutable-js/pull/2205) ## 5.1.6 - fix(reverseFactory): read `reversedSequence.size` in `__iterator` instead of this [#2196](https://github.com/immutable-js/immutable-js/pull/2196) ## 5.1.5 - Fix Improperly Controlled Modification of Object Prototype Attributes ('Prototype Pollution') in immutable ## 5.1.4 - Migrate some files to TS by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2125 - Iterator.ts - PairSorting.ts - toJS.ts - Math.ts - Hash.ts - Extract CollectionHelperMethods and convert to TS by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2131 - Use npm [trusted publishing only](https://docs.npmjs.com/trusted-publishers) to avoid token stealing. ### Documentation - Fix/a11y issues by @lyannel in https://github.com/immutable-js/immutable-js/pull/2136 - Doc add Map.get signature update by @borracciaBlu in https://github.com/immutable-js/immutable-js/pull/2138 - fix(doc):minor-issues#2132 by @JayMeDotDot in https://github.com/immutable-js/immutable-js/pull/2133 - Fix algolia search by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2135 - Typo in OrderedMap by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2144 ### Internal - chore: Sort all imports and activate eslint import rule by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2119 ## 5.1.3 ### TypeScript - fix: allow readonly map entry constructor by @septs in https://github.com/immutable-js/immutable-js/pull/2123 ### Documentation There has been a huge amount of changes in the documentation, mainly migrate from an autogenerated documentation from .d.ts file, to a proper documentation in markdown. The playground has been included on nearly all method examples. We added a page about browser extensions too: https://immutable-js.com/browser-extension/ ### Internal - replace rimraf by a node script by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2113 - remove warning for tseslint config by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2114 - Use default tsconfig for tests by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2055 - add tests for arrCopy by @jdeniau in https://github.com/immutable-js/immutable-js/pull/2120 ## 5.1.2 - Revert previous assertion as it introduced a regression [#2102](https://github.com/immutable-js/immutable-js/pull/2102) by [@giggo1604](https://github.com/giggo1604) - Merge should work with empty record [#2103](https://github.com/immutable-js/immutable-js/pull/2103) by [@jdeniau](https://github.com/jdeniau) ## 5.1.1 - Fix type copying ## 5.1.0 - Add shuffle to list [#2066](https://github.com/immutable-js/immutable-js/pull/2066) by [@mazerty](https://github.com/mazerty) - TypeScript: Better getIn `RetrievePath` [#2070](https://github.com/immutable-js/immutable-js/pull/2070) by [@jdeniau](https://github.com/jdeniau) - Fix #1915 "Converting a Seq to a list causes RangeError (max call size exceeded)" by @alexvictoor in [#2038](https://github.com/immutable-js/immutable-js/pull/2038) - TypeScript: Fix proper typings for Seq.concat() [#2040](https://github.com/immutable-js/immutable-js/pull/2040) by [@alexvictoor](https://github.com/alexvictoor) - Fix Uncaught "TypeError: keyPath.slice is not a function" for ArrayLike method [#2065](https://github.com/immutable-js/immutable-js/pull/2065) by [@jdeniau](https://github.com/jdeniau) ### Internal - Upgrade typescript and typescript-eslint [#2046](https://github.com/immutable-js/immutable-js/pull/2046) by [@jdeniau](https://github.com/jdeniau) - Upgrade to rollup 4 [#2049](https://github.com/immutable-js/immutable-js/pull/2049) by [@jdeniau](https://github.com/jdeniau) - Start migrating codebase to TypeScript without any runtime change nor .d.ts change: - allow TS files to be compiled in src dir [#2054](https://github.com/immutable-js/immutable-js/pull/2054) by [@jdeniau](https://github.com/jdeniau) - add exception for code that should not happen in updateIn [#2074](https://github.com/immutable-js/immutable-js/pull/2074) by [@jdeniau](https://github.com/jdeniau) - Reformat Range.toString for readability [#2075](https://github.com/immutable-js/immutable-js/pull/2075) by [@Ustin.Vaskin](https://github.com/ustinvaskin) ## [5.0.3] - Fix List.VNode.removeAfter() / removeBefore() issue on some particular case [#2030](https://github.com/immutable-js/immutable-js/pull/2030) by [@alexvictoor](https://github.com/alexvictoor) ## [5.0.2] - Fix wrong path for esm module after fix in 5.0.1 ## [5.0.1] - Fix circular dependency issue with ESM build by @iambumblehead in [#2035](https://github.com/immutable-js/immutable-js/pull/2035) by [@iambumblehead](https://github.com/iambumblehead) ## [5.0.0] ### Breaking changes To sum up, the **big** change in 5.0 is a Typescript change related to `Map` that is typed closer to the JS object. This is a huge change for TS users, but do not impact the runtime behavior. (see [Improve TypeScript definition for `Map`](#typescript-break-improve-typescript-definition-for-map) for more details) Other breaking changes are: #### [BREAKING] Remove deprecated methods: _Released in 5.0.0-rc.1_ - `Map.of('k', 'v')`: use `Map([ [ 'k', 'v' ] ])` or `Map({ k: 'v' })` - `Collection.isIterable`: use `isIterable` directly - `Collection.isKeyed`: use `isKeyed` directly - `Collection.isIndexed`: use `isIndexed` directly - `Collection.isAssociative`: use `isAssociative` directly - `Collection.isOrdered`: use `isOrdered` directly #### [BREAKING] `OrdererMap` and `OrderedSet` hashCode implementation has been fixed _Released in 5.0.0-rc.1_ Fix issue implementation of `hashCode` for `OrdererMap` and `OrderedSet` where equal objects might not return the same `hashCode`. Changed in [#2005](https://github.com/immutable-js/immutable-js/pull/2005) #### [BREAKING] Range function needs at least two defined parameters _Released in 5.0.0-beta.5_ Range with `undefined` would end in an infinite loop. Now, you need to define at least the start and end values. If you need an infinite range, you can use `Range(0, Infinity)`. Changed in [#1967](https://github.com/immutable-js/immutable-js/pull/1967) by [@jdeniau](https://github.com/jdeniau) #### [Minor BC break] Remove default export _Released in 5.0.0-beta.1_ Immutable does not export a default object containing all it's API anymore. As a drawback, you can not `immport Immutable` directly: ```diff - import Immutable from 'immutable'; + import { List, Map } from 'immutable'; - const l = Immutable.List([Immutable.Map({ a: 'A' })]); + const l = List([Map({ a: 'A' })]); ``` If you want the non-recommanded, but shorter migration path, you can do this: ```diff - import Immutable from 'immutable'; + import * as Immutable from 'immutable'; const l = Immutable.List([Immutable.Map({ a: 'A' })]); ``` #### [TypeScript Break] Improve TypeScript definition for `Map` _Released in 5.0.0-beta.1_ > If you do use TypeScript, then this change does not impact you : no runtime change here. > But if you use Map with TypeScript, this is a HUGE change ! > Imagine the following code ```ts const m = Map({ length: 3, 1: 'one' }); ``` This was previously typed as `Map` and return type of `m.get('length')` or `m.get('inexistant')` was typed as `string | number | undefined`. This made `Map` really unusable with TypeScript. Now the Map is typed like this: ```ts MapOf<{ length: number; 1: string; }>; ``` and the return type of `m.get('length')` is typed as `number`. The return of `m.get('inexistant')` throw the TypeScript error: > Argument of type '"inexistant"' is not assignable to parameter of type '1 | "length" ##### If you want to keep the old definition **This is a minor BC for TS users**, so if you want to keep the old definition, you can declare you Map like this: ```ts const m = Map({ length: 3, 1: 'one' }); ``` ##### If you need to type the Map with a larger definition You might want to declare a wider definition, you can type your Map like this: ```ts type MyMapType = { length: number; 1: string | null; optionalProperty?: string; }; const m = Map({ length: 3, 1: 'one' }); ``` Keep in mind that the `MapOf` will try to be consistant with the simple TypeScript object, so you can not do this: ```ts Map({ a: 'a' }).set('b', 'b'); Map({ a: 'a' }).delete('a'); ``` Like a simple object, it will only work if the type is forced: ```ts Map<{ a: string; b?: string }>({ a: 'a' }).set('b', 'b'); // b is forced in type and optional Map<{ a?: string }>({ a: 'a' }).delete('a'); // you can only delete an optional key ``` ##### Are all `Map` methods implemented ? For now, only `get`, `getIn`, `set`, `update`, `delete`, `remove`, `toJS`, `toJSON` methods are implemented. All other methods will fallback to the basic `Map` definition. Other method definition will be added later, but as some might be really complex, we prefer the progressive enhancement on the most used functions. ### Fixes - Fix type inference for first() and last() [#2001](https://github.com/immutable-js/immutable-js/pull/2001) by [@butchler](https://github.com/butchler) - Fix issue with empty list that is a singleton [#2004](https://github.com/immutable-js/immutable-js/pull/2004) by [@jdeniau](https://github.com/jdeniau) - Map and Set sort and sortBy return type [#2013](https://github.com/immutable-js/immutable-js/pull/2013) by [@jdeniau](https://github.com/jdeniau) ### Internal - [Internal] Migrating TS type tests from dtslint to [TSTyche](https://tstyche.org/) [#1988](https://github.com/immutable-js/immutable-js/pull/1988) and [#1991](https://github.com/immutable-js/immutable-js/pull/1991) by [@mrazauskas](https://github.com/mrazauskas). Special thanks to [@arnfaldur](https://github.com/arnfaldur) that migrated every type tests to tsd just before that. - [internal] Upgrade to rollup 3.x [#1965](https://github.com/immutable-js/immutable-js/pull/1965) by [@jdeniau](https://github.com/jdeniau) - [internal] upgrade tooling (TS, eslint) and documentation packages: #1971, #1972, #1973, #1974, #1975, #1976, #1977, #1978, #1979, #1980, #1981 ## [4.3.7] - 2024-07-22 - Fix issue with slice negative of filtered sequence [#2006](https://github.com/immutable-js/immutable-js/pull/2006) by [@jdeniau](https://github.com/jdeniau) ## [4.3.6] - 2024-05-13 - Fix `Repeat().equals(undefined)` incorrectly returning true [#1994](https://github.com/immutable-js/immutable-js/pull/1994) by [@butchler](https://github.com/butchler) ## [4.3.5] - 2024-01-16 - Upgrade to TS 5.1 [#1972](https://github.com/immutable-js/immutable-js/pull/1972) by [@jdeniau](https://github.com/jdeniau) - Fix Set.fromKeys types with Map constructor in TS 5.0 [#1971](https://github.com/immutable-js/immutable-js/pull/1971) by [@jdeniau](https://github.com/jdeniau) - Fix Read the Docs link on readme [#1970](https://github.com/immutable-js/immutable-js/pull/1970) by [@joshding](https://github.com/joshding) ## [4.3.4] - 2023-08-25 - Rollback toJS type due to circular reference error [#1958](https://github.com/immutable-js/immutable-js/pull/1958) by [@jdeniau](https://github.com/jdeniau) ## [4.3.3] - 2023-08-23 - [typescript] manage to handle toJS circular reference. [#1932](https://github.com/immutable-js/immutable-js/pull/1932) by [@jdeniau](https://github.com/jdeniau) - [doc] Add install instructions for pnpm and Bun [#1952](https://github.com/immutable-js/immutable-js/pull/1952) by [@colinhacks](https://github.com/colinhacks) and [#1953](https://github.com/immutable-js/immutable-js/pull/1953) by [@menglingyu659](https://github.com/menglingyu659) ## [4.3.2] - 2023-08-01 - [TypeScript] Fix isOrderedSet type [#1948](https://github.com/immutable-js/immutable-js/pull/1948) ## [4.3.1] - 2023-07-11 - Faster and implementation of `some` [#1944](https://github.com/immutable-js/immutable-js/pull/1944) - [internal] remove unused exports [#1928](https://github.com/immutable-js/immutable-js/pull/1928) ## [4.3.0] - 2023-03-10 - Introduce Comparator and PairSorting [#1937](https://github.com/immutable-js/immutable-js/pull/1937) by [@https://github.com/giancosta86](https://github.com/giancosta86) - [TypeScript] Fix fromJS declaration for greater compatibility [#1936](https://github.com/immutable-js/immutable-js/pull/1936) ## [4.2.4] - 2023-02-06 - [TypeScript] Improve type infererence for from JS by [KSXGitHub](https://github.com/KSXGitHub) [#1927](https://github.com/immutable-js/immutable-js/pull/1927) ## [4.2.3] - 2023-02-02 - [TypeScript] `groupBy` return either a `Map` or an `OrderedMap`: make the type more precise than base `Collection` [#1924](https://github.com/immutable-js/immutable-js/pull/1924) ## [4.2.2] - 2023-01-02 - [Flow] Add type for `partition` method [#1920](https://github.com/immutable-js/immutable-js/pull/1920) by [Dagur](https://github.com/Dagur) ## [4.2.1] - 2022-12-23 - [Typescript] rollback some of the change on `toJS` to avoir circular reference ## [4.2.0] - 2022-12-22 - [TypeScript] Better type for toJS [#1917](https://github.com/immutable-js/immutable-js/pull/1917) by [jdeniau](https://github.com/jdeniau) - [TS Minor Break] tests are ran with TS > 4.5 only. It was tested with TS > 2.1 previously, but we want to level up TS types with recent features. TS 4.5 has been released more than one year before this release. If it does break your implementation (it might not), you should probably consider upgrading to the latest TS version. - Added a `partition` method to all containers [#1916](https://github.com/immutable-js/immutable-js/pull/1916) by [johnw42](https://github.com/johnw42) ## [4.1.0] - 2022-05-23 - Accept Symbol as Map key. [#1859](https://github.com/immutable-js/immutable-js/pull/1859) by [jdeniau](https://github.com/jdeniau) - Optimize contructors without arguments [#1887](https://github.com/immutable-js/immutable-js/pull/1887) by [marianoguerra](https://github.com/marianoguerra) - Fix Flow removeIn types [#1902](https://github.com/immutable-js/immutable-js/pull/1902) by [nifgraup](https://github.com/nifgraup) - Fix bug in Record.equals when comparing against Map [#1903](https://github.com/immutable-js/immutable-js/pull/1903) by [jmtoung](https://github.com/jmtoung) ## [4.0.0] - 2021-09-30 This release brings new functionality and many fixes. 1. [Key changes](#key-changes) 1. [Note for users of v4.0.0-rc.12](#note-for-users-of-v400-rc12) 1. [Breaking changes](#breaking) 1. [New](#new) 1. [Fixed](#fixed) ### Key changes - New members have joined the team - The project has been relicensed as MIT - Better TypeScript and Flow type definitions - A brand-new documentation lives at [immutable-js.com](https://immutable-js.com/) and can show multiple versions - Behavior of `merge` and `mergeDeep` has changed - `Iterable` is renamed to [Collection](https://immutable-js.com/docs/latest@main/Collection/) - [Records](https://immutable-js.com/docs/latest@main/Record/) no longer extend from Collections - All collection types now implement the [ES6 iterable protocol](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterable_protocol) - New methods: - [toJSON()]() - [wasAltered()]() - [Collection.Indexed.zipAll()]() - [Map.deleteAll()]()
   Diff of changed API (click to expand) ```diff + Collection.[Symbol.iterator] + Collection.toJSON + Collection.update + Collection.Indexed.[Symbol.iterator] + Collection.Indexed.toJSON + Collection.Indexed.update + Collection.Indexed.zipAll + Collection.Keyed.[Symbol.iterator] + Collection.Keyed.toJSON + Collection.Keyed.update + Collection.Set.[Symbol.iterator] + Collection.Set.toJSON + Collection.Set.update - Collection.size - Collection.Indexed.size - Collection.Keyed.size - Collection.Set.size + List.[Symbol.iterator] + List.toJSON + List.wasAltered + List.zipAll - List.mergeDeep - List.mergeDeepWith - List.mergeWith + Map.[Symbol.iterator] + Map.deleteAll + Map.toJSON + Map.wasAltered + OrderedMap.[Symbol.iterator] + OrderedMap.deleteAll + OrderedMap.toJSON + OrderedMap.wasAltered + OrderedSet.[Symbol.iterator] + OrderedSet.toJSON + OrderedSet.update + OrderedSet.wasAltered + OrderedSet.zip + OrderedSet.zipAll + OrderedSet.zipWith + Record.[Symbol.iterator] + Record.asImmutable + Record.asMutable + Record.clear + Record.delete + Record.deleteIn + Record.merge + Record.mergeDeep + Record.mergeDeepIn + Record.mergeDeepWith + Record.mergeIn + Record.mergeWith + Record.set + Record.setIn + Record.toJSON + Record.update + Record.updateIn + Record.wasAltered + Record.withMutations + Record.Factory.displayName - Record.butLast - Record.concat - Record.count - Record.countBy - Record.entries - Record.entrySeq - Record.every - Record.filter - Record.filterNot - Record.find - Record.findEntry - Record.findKey - Record.findLast - Record.findLastEntry - Record.findLastKey - Record.first - Record.flatMap - Record.flatten - Record.flip - Record.forEach - Record.groupBy - Record.includes - Record.isEmpty - Record.isSubset - Record.isSuperset - Record.join - Record.keyOf - Record.keySeq - Record.keys - Record.last - Record.lastKeyOf - Record.map - Record.mapEntries - Record.mapKeys - Record.max - Record.maxBy - Record.min - Record.minBy - Record.reduce - Record.reduceRight - Record.rest - Record.reverse - Record.skip - Record.skipLast - Record.skipUntil - Record.skipWhile - Record.slice - Record.some - Record.sort - Record.sortBy - Record.take - Record.takeLast - Record.takeUntil - Record.takeWhile - Record.toArray - Record.toIndexedSeq - Record.toKeyedSeq - Record.toList - Record.toMap - Record.toOrderedMap - Record.toOrderedSet - Record.toSet - Record.toSetSeq - Record.toStack - Record.valueSeq - Record.values + Seq.[Symbol.iterator] + Seq.toJSON + Seq.update + Seq.Indexed.[Symbol.iterator] + Seq.Indexed.toJSON + Seq.Indexed.update + Seq.Indexed.zipAll + Seq.Keyed.[Symbol.iterator] + Seq.Keyed.toJSON + Seq.Keyed.update + Seq.Set.[Symbol.iterator] + Seq.Set.toJSON + Seq.Set.update + Set.[Symbol.iterator] + Set.toJSON + Set.update + Set.wasAltered + Stack.[Symbol.iterator] + Stack.toJSON + Stack.update + Stack.wasAltered + Stack.zipAll + ValueObject.equals + ValueObject.hashCode - Iterable.* - Iterable.Indexed.* - Iterable.Keyed.* - Iterable.Set.* ```
### Note for users of v4.0.0-rc.12 There were mostly bugfixes and improvements since RC 12. Upgrading should be painless for most users. However, there is **one breaking change**: The behavior of `merge` and `mergeDeep` has changed. See below for details. ### BREAKING #### [merge()]() - No longer use value-equality within `merge()` ([#1391](https://github.com/immutable-js/immutable-js/pull/1391)) > This rectifies an inconsistent behavior between `x.merge(y)` and `x.mergeDeep(y)` where merge would > use `===` on leaf values to determine return-self optimizations, while mergeDeep would use `is()`. > This improves consistency across the library and avoids a possible performance pitfall. - No longer deeply coerce argument to merge() ([#1339](https://github.com/immutable-js/immutable-js/pull/1339)) > Previously, the argument provided to `merge()` was deeply converted to Immutable collections via `fromJS()`. > This was the only function in the library which calls `fromJS()` indirectly, > and it was surprising and made it difficult to understand what the result of `merge()` would be. > Now, the value provided to `merge()` is only shallowly converted to an Immutable collection, similar to > related methods in the library. This may change the behavior of your calls to `merge()`. #### [mergeDeep()]() - Replace incompatible collections when merging nested data ([#1840](https://github.com/immutable-js/immutable-js/pull/1840)) > It will no longer merge lists of tuples into maps. For more information see > [#1840](https://github.com/immutable-js/immutable-js/pull/1840) and the updated `mergeDeep()` documentation. - Concat Lists when merging deeply ([#1344](https://github.com/immutable-js/immutable-js/pull/1344)) > Previously, calling `map.mergeDeep()` with a value containing a `List` would replace the values in the > original List. This has always been confusing, and does not properly treat `List` as a monoid. > Now, `List.merge` is simply an alias for `List.concat`, and `map.mergeDeep()` will concatenate deeply-found lists > instead of replacing them. #### [Seq](https://immutable-js.com/docs/latest@main/Seq/) - Remove IteratorSequence. Do not attempt to detect iterators in `Seq()`. ([#1589](https://github.com/immutable-js/immutable-js/pull/1589)) > Iterables can still be provided to `Seq()`, and _most_ Iterators are also > Iterables, so this change should not affect the vast majority of uses. > For more information, see PR #1589 - Remove `Seq.of()` (#1311, #1310) > This method has been removed since it cannot be correctly typed. It's recommended to convert > `Seq.of(1, 2, 3)` to `Seq([1, 2, 3])`. #### [isImmutable()]() - `isImmutable()` now returns true for collections currently within a `withMutations()` call. ([#1374](https://github.com/immutable-js/immutable-js/pull/1374)) > Previously, `isImmutable()` did double-duty of both determining if a value was a Collection or Record > from this library as well as if it was outside a `withMutations()` call. > This latter case caused confusion and was rarely used. #### [toArray()]() - KeyedCollection.toArray() returns array of tuples. ([#1340](https://github.com/immutable-js/immutable-js/pull/1340)) > Previously, calling `toArray()` on a keyed collection (incl `Map` and `OrderedMap`) would > discard keys and return an Array of values. This has always been confusing, and differs from `Array.from()`. > Now, calling `toArray()` on a keyed collection will return an Array of `[key, value]` tuples, matching > the behavior of `Array.from()`. #### [concat()]() - `list.concat()` now has a slightly more efficient implementation and `map.concat()` is an alias for `map.merge()`. ([#1373](https://github.com/immutable-js/immutable-js/pull/1373)) > In rare cases, this may affect use of `map.concat()` which expected slightly different behavior from `map.merge()`. #### [Collection](https://immutable-js.com/docs/latest@main/Collection/), formerly `Iterable` - The `Iterable` class has been renamed to `Collection`, and `isIterable()` has been renamed to `isCollection()`. Aliases with the existing names exist to make transitioning code easier. #### [Record](https://immutable-js.com/docs/latest@main/Record/) - Record is no longer an Immutable Collection type. - Now `isCollection(myRecord)` returns `false` instead of `true`. - The sequence API (such as `map`, `filter`, `forEach`) no longer exist on Records. - `delete()` and `clear()` no longer exist on Records. #### Other breaking changes - **Potentially Breaking:** Improve hash speed and avoid collision for common values ([#1629](https://github.com/immutable-js/immutable-js/pull/1629)) > Causes some hash values to change, which could impact the order of iteration of values in some Maps > (which are already advertised as unordered, but highlighting just to be safe) - Node buffers no longer considered value-equal ([#1437](https://github.com/immutable-js/immutable-js/pull/1437)) - Plain Objects and Arrays are no longer considered opaque values ([#1369](https://github.com/immutable-js/immutable-js/pull/1369)) > This changes the behavior of a few common methods with respect to plain Objects and Arrays where these were > previously considered opaque to `merge()` and `setIn()`, they now are treated as collections and can be merged > into and updated (persistently). This offers an exciting alternative to small Lists and Records. - The "predicate" functions, `isCollection`, `isKeyed`, `isIndexed`, `isAssociative` have been moved from `Iterable.` to the top level exports. - The `toJSON()` method performs a shallow conversion (previously it was an alias for `toJS()`, which remains a deep conversion). - Some minor implementation details have changed, which may require updates to libraries which deeply integrate with Immutable.js's private APIs. - The Cursor API is officially deprecated. Use [immutable-cursor](https://github.com/redbadger/immutable-cursor) instead. - **Potentially Breaking:** [TypeScript] Remove `Iterable` as tuple from Map constructor types ([#1626](https://github.com/immutable-js/immutable-js/pull/1626)) > Typescript allowed constructing a Map with a list of List instances, assuming each was a key, value pair. > While this runtime behavior still works, this type led to more issues than it solved, so it has been removed. > (Note, this may break previous v4 rcs, but is not a change against v3) ### New - Update TypeScript and Flow definitions: - The Flowtype and TypeScript type definitions have been completely rewritten with much higher quality and accuracy, taking advantage of the latest features from both tools. - Simplified TypeScript definition files to support all UMD use cases ([#1854](https://github.com/immutable-js/immutable-js/pull/1854)) - Support Typescript 3 ([#1593](https://github.com/immutable-js/immutable-js/pull/1593)) - Support Typescript strictNullChecks ([#1168](https://github.com/immutable-js/immutable-js/pull/1168)) - Flow types to be compatible with the latest version 0.160.0 - Enable flow strict ([#1580](https://github.com/immutable-js/immutable-js/pull/1580)) - Add "sideEffects: false" to package.json ([#1661](https://github.com/immutable-js/immutable-js/pull/1661)) - Use ES standard for iterator method reuse ([#1867](https://github.com/immutable-js/immutable-js/pull/1867)) - Generalize `fromJS()` and `Seq()` to support Sets ([#1865](https://github.com/immutable-js/immutable-js/pull/1865)) - Top level predicate functions ([#1600](https://github.com/immutable-js/immutable-js/pull/1600)) > New functions are exported from the `immutable` module: > `isSeq()`, `isList()`, `isMap()`, `isOrderedMap()`, `isStack()`, `isSet()`, `isOrderedSet()`, and `isRecord()`. - Improve performance of toJS ([#1581](https://github.com/immutable-js/immutable-js/pull/1581)) > Cursory test is >10% faster than both v3.8.2 and v4.0.0-rc.7, > and corrects the regression since v4.0.0-rc.9. - Added optional `notSetValue` in `first()` and `last()` ([#1556](https://github.com/immutable-js/immutable-js/pull/1556)) - Make `isArrayLike` check more precise to avoid false positives ([#1520](https://github.com/immutable-js/immutable-js/pull/1520)) - `map()` for List, Map, and Set returns itself for no-ops ([#1455](https://github.com/immutable-js/immutable-js/pull/1455)) (5726bd1) - Hash functions as objects, allowing functions as values in collections ([#1485](https://github.com/immutable-js/immutable-js/pull/1485)) - Functional API for `get()`, `set()`, and more which support both Immutable.js collections and plain Objects and Arrays ([#1369](https://github.com/immutable-js/immutable-js/pull/1369)) - Relicensed as MIT ([#1320](https://github.com/immutable-js/immutable-js/pull/1320)) - Support for Transducers! ([ee9c68f1](https://github.com/immutable-js/immutable-js/commit/ee9c68f1d43da426498ee009ecea37aa2ef77cb8)) - Add new method, `zipAll()` ([#1195](https://github.com/immutable-js/immutable-js/pull/1195)) - Bundle and distribute an "es module" so Webpack and Rollup can use tree-shaking for smaller builds ([#1204](https://github.com/immutable-js/immutable-js/pull/1204)) - Warn instead of throw when `getIn()` has a bad path ([668f2236](https://github.com/immutable-js/immutable-js/commit/668f2236642c97bd4e7d8dfbf62311f497a6ac18)) - A new predicate function `isValueObject()` helps to detect objects which implement `equals()` and `hashCode()`, and type definitions now define the interface `ValueObject` which you can implement in your own code to create objects which behave as values and can be keys in Maps or entries in Sets. - Using `fromJS()` with a "reviver" function now provides access to the key path to each translated value. ([#1118](https://github.com/immutable-js/immutable-js/pull/1118)) ### Fixed - Fix issue with IE11 and missing Symbol.iterator ([#1850](https://github.com/immutable-js/immutable-js/pull/1850)) - Fix ordered set with map ([#1663](https://github.com/immutable-js/immutable-js/pull/1663)) - Do not modify iter during List.map and Map.map ([#1649](https://github.com/immutable-js/immutable-js/pull/1649)) - Fix ordered map delete all ([#1777](https://github.com/immutable-js/immutable-js/pull/1777)) - Hash symbols as objects ([#1753](https://github.com/immutable-js/immutable-js/pull/1753)) - Fix returning a Record in merge() when Record is empty ([#1785](https://github.com/immutable-js/immutable-js/pull/1785)) - Fix for RC~12: Records from different factories aren't equal ([#1734](https://github.com/immutable-js/immutable-js/issues/1734)) - "too much recursion" error when creating a Record type from an instance of another Record ([#1690](https://github.com/immutable-js/immutable-js/pull/1690)) - Fix glob for npm format script on Windows ([#18](https://github.com/immutable-js-oss/immutable-js/pull/18)) - Remove deprecated cursor API ([#13](https://github.com/immutable-js-oss/immutable-js/issues/13)) - Add missing es exports ([#1740](https://github.com/immutable-js/immutable-js/pull/1740)) - Support nulls in genTypeDefData.js ([#185](https://github.com/immutable-js/immutable-js/pull/185)) - Support isPlainObj in IE11 and other esoteric parameters [f3a6d5ce](https://github.com/immutable-js/immutable-js/pull/1833/commits/f3a6d5ce75bb9d60b87074240838f5429e896b60) - `Set.map` produces valid underlying map ([#1606](https://github.com/immutable-js/immutable-js/pull/1606)) - Support isPlainObj with `constructor` key ([#1627](https://github.com/immutable-js/immutable-js/pull/1627)) - `groupBy` no longer returns a mutable Map instance ([#1602](https://github.com/immutable-js/immutable-js/pull/1602)) - Fix issue where refs can recursively collide, corrupting `.size` ([#1598](https://github.com/immutable-js/immutable-js/pull/1598)) - Throw error in `mergeWith()` method if missing the required `merger` function ([#1543](https://github.com/immutable-js/immutable-js/pull/1543)) - Update `isPlainObj()` to workaround Safari bug and allow cross-realm values ([#1557](https://github.com/immutable-js/immutable-js/pull/1557)) - Fix missing "& T" to some methods in RecordInstance ([#1464](https://github.com/immutable-js/immutable-js/pull/1464)) - Make notSetValue optional for typed Records ([#1461](https://github.com/immutable-js/immutable-js/pull/1461)) (a1029bb) - Export type of RecordInstance ([#1434](https://github.com/immutable-js/immutable-js/pull/1434)) - Fix Record `size` check in merge() ([#1521](https://github.com/immutable-js/immutable-js/pull/1521)) - Fix Map#concat being not defined ([#1402](https://github.com/immutable-js/immutable-js/pull/1402)) - `getIn()` no longer throws when encountering a missing path ([#1361](https://github.com/immutable-js/immutable-js/pull/1361)) - Do not throw when printing value that cannot be coerced to primitive ([#1334](https://github.com/immutable-js/immutable-js/pull/1334)) - Do not throw from hasIn ([#1319](https://github.com/immutable-js/immutable-js/pull/1319)) - Long hash codes no longer cause an infinite loop ([#1175](https://github.com/immutable-js/immutable-js/pull/1175)) - `slice()` which should return an empty set could return a full set or vice versa (#1245, #1287) - Ensure empty slices do not throw when iterated ([#1220](https://github.com/immutable-js/immutable-js/pull/1220)) - Error during equals check on Record with undefined or null ([#1208](https://github.com/immutable-js/immutable-js/pull/1208)) - Fix size of count() after filtering or flattening ([#1171](https://github.com/immutable-js/immutable-js/pull/1171)) ## [3.8.2] - 2017-10-05 Released in 2017, still the most commonly used release. [unreleased]: https://github.com/immutable-js/immutable-js/compare/v4.0.0-rc.15...HEAD [4.0.0]: https://github.com/immutable-js/immutable-js/compare/v3.8.2...v4.0.0-rc.15 [3.8.2]: https://github.com/immutable-js/immutable-js/compare/3.7.6...v3.8.2 immutable-js-immutable-js-6a01d72/LICENSE000066400000000000000000000021131522056416100200240ustar00rootroot00000000000000MIT License Copyright (c) 2014-present, Lee Byron and other contributors. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. immutable-js-immutable-js-6a01d72/README.md000066400000000000000000000671631522056416100203160ustar00rootroot00000000000000# Immutable collections for JavaScript [![Build Status](https://github.com/immutable-js/immutable-js/actions/workflows/ci.yml/badge.svg?branch=main)](https://github.com/immutable-js/immutable-js/actions/workflows/ci.yml?query=branch%3Amain) [Chat on slack](https://immutable-js.slack.com) [Read the docs](https://immutable-js.com/docs/) and eat your vegetables. Docs are automatically generated from [README.md][] and [immutable.d.ts][]. Please contribute! Also, don't miss the [wiki][] which contains articles on additional specific topics. Can't find something? Open an [issue][]. **Table of contents:** - [Introduction](#introduction) - [Getting started](#getting-started) - [The case for Immutability](#the-case-for-immutability) - [JavaScript-first API](#javascript-first-api) - [Nested Structures](#nested-structures) - [Equality treats Collections as Values](#equality-treats-collections-as-values) - [Batching Mutations](#batching-mutations) - [Lazy Seq](#lazy-seq) - [Additional Tools and Resources](#additional-tools-and-resources) - [Contributing](#contributing) ## Introduction [Immutable][] data cannot be changed once created, leading to much simpler application development, no defensive copying, and enabling advanced memoization and change detection techniques with simple logic. [Persistent][] data presents a mutative API which does not update the data in-place, but instead always yields new updated data. Immutable.js provides many Persistent Immutable data structures including: `List`, `Stack`, `Map`, `OrderedMap`, `Set`, `OrderedSet` and `Record`. These data structures are highly efficient on modern JavaScript VMs by using structural sharing via [hash maps tries][] and [vector tries][] as popularized by Clojure and Scala, minimizing the need to copy or cache data. Immutable.js also provides a lazy `Seq`, allowing efficient chaining of collection methods like `map` and `filter` without creating intermediate representations. Create some `Seq` with `Range` and `Repeat`. Want to hear more? Watch the presentation about Immutable.js: [![Immutable Data and React](website/public/Immutable-Data-and-React-YouTube.png)](https://youtu.be/I7IdS-PbEgI) [README.md]: https://github.com/immutable-js/immutable-js/blob/main/README.md [immutable.d.ts]: https://github.com/immutable-js/immutable-js/blob/main/type-definitions/immutable.d.ts [wiki]: https://github.com/immutable-js/immutable-js/wiki [issue]: https://github.com/immutable-js/immutable-js/issues [Persistent]: https://en.wikipedia.org/wiki/Persistent_data_structure [Immutable]: https://en.wikipedia.org/wiki/Immutable_object [hash maps tries]: https://en.wikipedia.org/wiki/Hash_array_mapped_trie [vector tries]: https://hypirion.com/musings/understanding-persistent-vector-pt-1 ## Getting started Install `immutable` using npm. ```shell # using npm npm install immutable # using Yarn yarn add immutable # using pnpm pnpm add immutable # using Bun bun add immutable ``` Then require it into any module. ```js import { Map } from 'immutable'; const map1 = Map({ a: 1, b: 2, c: 3 }); const map2 = map1.set('b', 50); map1.get('b') + ' vs. ' + map2.get('b'); // 2 vs. 50 ``` ### Browser Immutable.js has no dependencies, which makes it predictable to include in a Browser. It's highly recommended to use a module bundler like [webpack](https://webpack.js.org/), [rollup](https://rollupjs.org/), or [browserify](https://browserify.org/). The `immutable` npm module works without any additional consideration. All examples throughout the documentation will assume use of this kind of tool. Alternatively, Immutable.js may be directly included as a script tag. Download or link to a CDN such as [CDNJS](https://cdnjs.com/libraries/immutable) or [jsDelivr](https://www.jsdelivr.com/package/npm/immutable). Use a script tag to directly add `Immutable` to the global scope: ```html ``` Or use an AMD-style loader (such as [RequireJS](https://requirejs.org/)): ```js require(['./immutable.min.js'], function (Immutable) { var map1 = Immutable.Map({ a: 1, b: 2, c: 3 }); var map2 = map1.set('b', 50); map1.get('b'); // 2 map2.get('b'); // 50 }); ``` ### Flow & TypeScript Use these Immutable collections and sequences as you would use native collections in your [Flowtype](https://flowtype.org/) or [TypeScript](https://typescriptlang.org) programs while still taking advantage of type generics, error detection, and auto-complete in your IDE. Installing `immutable` via npm brings with it type definitions for Flow (v0.55.0 or higher) and TypeScript (v4.5 or higher), so you shouldn't need to do anything at all! #### Using TypeScript with Immutable.js v4+ Immutable.js type definitions embrace ES2015. While Immutable.js itself supports legacy browsers and environments, its type definitions require TypeScript's 2015 lib. Include either `"target": "es2015"` or `"lib": "es2015"` in your `tsconfig.json`, or provide `--target es2015` or `--lib es2015` to the `tsc` command. ```js import { Map } from 'immutable'; const map1 = Map({ a: 1, b: 2, c: 3 }); const map2 = map1.set('b', 50); map1.get('b') + ' vs. ' + map2.get('b'); // 2 vs. 50 ``` #### Using TypeScript with Immutable.js v3 and earlier: Previous versions of Immutable.js include a reference file which you can include via relative path to the type definitions at the top of your file. ```js /// import { Map } from 'immutable'; var map1: Map; map1 = Map({ a: 1, b: 2, c: 3 }); var map2 = map1.set('b', 50); map1.get('b'); // 2 map2.get('b'); // 50 ``` ## The case for Immutability Much of what makes application development difficult is tracking mutation and maintaining state. Developing with immutable data encourages you to think differently about how data flows through your application. Subscribing to data events throughout your application creates a huge overhead of book-keeping which can hurt performance, sometimes dramatically, and creates opportunities for areas of your application to get out of sync with each other due to easy to make programmer error. Since immutable data never changes, subscribing to changes throughout the model is a dead-end and new data can only ever be passed from above. This model of data flow aligns well with the architecture of [React][] and especially well with an application designed using the ideas of [Flux][]. When data is passed from above rather than being subscribed to, and you're only interested in doing work when something has changed, you can use equality. Immutable collections should be treated as _values_ rather than _objects_. While objects represent some thing which could change over time, a value represents the state of that thing at a particular instance of time. This principle is most important to understanding the appropriate use of immutable data. In order to treat Immutable.js collections as values, it's important to use the `Immutable.is()` function or `.equals()` method to determine _value equality_ instead of the `===` operator which determines object _reference identity_. ```js import { Map } from 'immutable'; const map1 = Map({ a: 1, b: 2, c: 3 }); const map2 = Map({ a: 1, b: 2, c: 3 }); map1.equals(map2); // true map1 === map2; // false ``` Note: As a performance optimization Immutable.js attempts to return the existing collection when an operation would result in an identical collection, allowing for using `===` reference equality to determine if something definitely has not changed. This can be extremely useful when used within a memoization function which would prefer to re-run the function if a deeper equality check could potentially be more costly. The `===` equality check is also used internally by `Immutable.is` and `.equals()` as a performance optimization. ```js import { Map } from 'immutable'; const map1 = Map({ a: 1, b: 2, c: 3 }); const map2 = map1.set('b', 2); // Set to same value map1 === map2; // true ``` If an object is immutable, it can be "copied" simply by making another reference to it instead of copying the entire object. Because a reference is much smaller than the object itself, this results in memory savings and a potential boost in execution speed for programs which rely on copies (such as an undo-stack). ```js import { Map } from 'immutable'; const map = Map({ a: 1, b: 2, c: 3 }); const mapCopy = map; // Look, "copies" are free! ``` [React]: https://reactjs.org/ [Flux]: https://facebook.github.io/flux/docs/in-depth-overview/ ## JavaScript-first API While Immutable.js is inspired by Clojure, Scala, Haskell and other functional programming environments, it's designed to bring these powerful concepts to JavaScript, and therefore has an Object-Oriented API that closely mirrors that of [ES2015][] [Array][], [Map][], and [Set][]. [es2015]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_6_support_in_Mozilla [array]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array [map]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map [set]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set The difference for the immutable collections is that methods which would mutate the collection, like `push`, `set`, `unshift` or `splice`, instead return a new immutable collection. Methods which return new arrays, like `slice` or `concat`, instead return new immutable collections. ```js import { List } from 'immutable'; const list1 = List([1, 2]); const list2 = list1.push(3, 4, 5); const list3 = list2.unshift(0); const list4 = list1.concat(list2, list3); assert.equal(list1.size, 2); assert.equal(list2.size, 5); assert.equal(list3.size, 6); assert.equal(list4.size, 13); assert.equal(list4.get(0), 1); ``` Almost all of the methods on [Array][] will be found in similar form on `Immutable.List`, those of [Map][] found on `Immutable.Map`, and those of [Set][] found on `Immutable.Set`, including collection operations like `forEach()` and `map()`. ```js import { Map } from 'immutable'; const alpha = Map({ a: 1, b: 2, c: 3, d: 4 }); alpha.map((v, k) => k.toUpperCase()).join(); // 'A,B,C,D' ``` ### Convert from raw JavaScript objects and arrays. Designed to inter-operate with your existing JavaScript, Immutable.js accepts plain JavaScript Arrays and Objects anywhere a method expects a `Collection`. ```js import { Map, List } from 'immutable'; const map1 = Map({ a: 1, b: 2, c: 3, d: 4 }); const map2 = Map({ c: 10, a: 20, t: 30 }); const obj = { d: 100, o: 200, g: 300 }; const map3 = map1.merge(map2, obj); // Map { a: 20, b: 2, c: 10, d: 100, t: 30, o: 200, g: 300 } const list1 = List([1, 2, 3]); const list2 = List([4, 5, 6]); const array = [7, 8, 9]; const list3 = list1.concat(list2, array); // List [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] ``` This is possible because Immutable.js can treat any JavaScript Array or Object as a Collection. You can take advantage of this in order to get sophisticated collection methods on JavaScript Objects, which otherwise have a very sparse native API. Because Seq evaluates lazily and does not cache intermediate results, these operations can be extremely efficient. ```js import { Seq } from 'immutable'; const myObject = { a: 1, b: 2, c: 3 }; Seq(myObject) .map((x) => x * x) .toObject(); // { a: 1, b: 4, c: 9 } ``` Keep in mind, when using JS objects to construct Immutable Maps, that JavaScript Object properties are always strings, even if written in a quote-less shorthand, while Immutable Maps accept keys of any type. ```js import { fromJS } from 'immutable'; const obj = { 1: 'one' }; console.log(Object.keys(obj)); // [ "1" ] console.log(obj['1'], obj[1]); // "one", "one" const map = fromJS(obj); console.log(map.get('1'), map.get(1)); // "one", undefined ``` Property access for JavaScript Objects first converts the key to a string, but since Immutable Map keys can be of any type the argument to `get()` is not altered. ### Converts back to raw JavaScript objects. All Immutable.js Collections can be converted to plain JavaScript Arrays and Objects shallowly with `toArray()` and `toObject()` or deeply with `toJS()`. All Immutable Collections also implement `toJSON()` allowing them to be passed to `JSON.stringify` directly. They also respect the custom `toJSON()` methods of nested objects. ```js import { Map, List } from 'immutable'; const deep = Map({ a: 1, b: 2, c: List([3, 4, 5]) }); console.log(deep.toObject()); // { a: 1, b: 2, c: List [ 3, 4, 5 ] } console.log(deep.toArray()); // [ 1, 2, List [ 3, 4, 5 ] ] console.log(deep.toJS()); // { a: 1, b: 2, c: [ 3, 4, 5 ] } JSON.stringify(deep); // '{"a":1,"b":2,"c":[3,4,5]}' ``` ### Embraces ES2015 Immutable.js supports all JavaScript environments, including legacy browsers (even IE11). However it also takes advantage of features added to JavaScript in [ES2015][], the latest standard version of JavaScript, including [Iterators][], [Arrow Functions][], [Classes][], and [Modules][]. It's inspired by the native [Map][] and [Set][] collections added to ES2015. All examples in the Documentation are presented in ES2015. To run in all browsers, they need to be translated to ES5. ```js // ES2015 const mapped = foo.map((x) => x * x); // ES5 var mapped = foo.map(function (x) { return x * x; }); ``` All Immutable.js collections are [Iterable][iterators], which allows them to be used anywhere an Iterable is expected, such as when spreading into an Array. ```js import { List } from 'immutable'; const aList = List([1, 2, 3]); const anArray = [0, ...aList, 4, 5]; // [ 0, 1, 2, 3, 4, 5 ] ``` Note: A Collection is always iterated in the same order, however that order may not always be well defined, as is the case for the `Map` and `Set`. [Iterators]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/The_Iterator_protocol [Arrow Functions]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/Arrow_functions [Classes]: https://wiki.ecmascript.org/doku.php?id=strawman:maximally_minimal_classes [Modules]: https://www.2ality.com/2014/09/es6-modules-final.html ## Nested Structures The collections in Immutable.js are intended to be nested, allowing for deep trees of data, similar to JSON. ```js import { fromJS } from 'immutable'; const nested = fromJS({ a: { b: { c: [3, 4, 5] } } }); // Map { a: Map { b: Map { c: List [ 3, 4, 5 ] } } } ``` A few power-tools allow for reading and operating on nested data. The most useful are `mergeDeep`, `getIn`, `setIn`, and `updateIn`, found on `List`, `Map` and `OrderedMap`. ```js import { fromJS } from 'immutable'; const nested = fromJS({ a: { b: { c: [3, 4, 5] } } }); const nested2 = nested.mergeDeep({ a: { b: { d: 6 } } }); // Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 6 } } } console.log(nested2.getIn(['a', 'b', 'd'])); // 6 const nested3 = nested2.updateIn(['a', 'b', 'd'], (value) => value + 1); console.log(nested3); // Map { a: Map { b: Map { c: List [ 3, 4, 5 ], d: 7 } } } const nested4 = nested3.updateIn(['a', 'b', 'c'], (list) => list.push(6)); // Map { a: Map { b: Map { c: List [ 3, 4, 5, 6 ], d: 7 } } } ``` ## Equality treats Collections as Values Immutable.js collections are treated as pure data _values_. Two immutable collections are considered _value equal_ (via `.equals()` or `is()`) if they represent the same collection of values. This differs from JavaScript's typical _reference equal_ (via `===` or `==`) for Objects and Arrays which only determines if two variables represent references to the same object instance. Consider the example below where two identical `Map` instances are not _reference equal_ but are _value equal_. ```js // First consider: const obj1 = { a: 1, b: 2, c: 3 }; const obj2 = { a: 1, b: 2, c: 3 }; obj1 !== obj2; // two different instances are always not equal with === import { Map, is } from 'immutable'; const map1 = Map({ a: 1, b: 2, c: 3 }); const map2 = Map({ a: 1, b: 2, c: 3 }); map1 !== map2; // two different instances are not reference-equal map1.equals(map2); // but are value-equal if they have the same values is(map1, map2); // alternatively can use the is() function ``` Value equality allows Immutable.js collections to be used as keys in Maps or values in Sets, and retrieved with different but equivalent collections: ```js import { Map, Set } from 'immutable'; const map1 = Map({ a: 1, b: 2, c: 3 }); const map2 = Map({ a: 1, b: 2, c: 3 }); const set = Set().add(map1); set.has(map2); // true because these are value-equal ``` Note: `is()` uses the same measure of equality as [Object.is][] for scalar strings and numbers, but uses value equality for Immutable collections, determining if both are immutable and all keys and values are equal using the same measure of equality. [object.is]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is #### Performance tradeoffs While value equality is useful in many circumstances, it has different performance characteristics than reference equality. Understanding these tradeoffs may help you decide which to use in each case, especially when used to memoize some operation. When comparing two collections, value equality may require considering every item in each collection, on an `O(N)` time complexity. For large collections of values, this could become a costly operation. Though if the two are not equal and hardly similar, the inequality is determined very quickly. In contrast, when comparing two collections with reference equality, only the initial references to memory need to be compared which is not based on the size of the collections, which has an `O(1)` time complexity. Checking reference equality is always very fast, however just because two collections are not reference-equal does not rule out the possibility that they may be value-equal. #### Return self on no-op optimization When possible, Immutable.js avoids creating new objects for updates where no change in _value_ occurred, to allow for efficient _reference equality_ checking to quickly determine if no change occurred. ```js import { Map } from 'immutable'; const originalMap = Map({ a: 1, b: 2, c: 3 }); const updatedMap = originalMap.set('b', 2); updatedMap === originalMap; // No-op .set() returned the original reference. ``` However updates which do result in a change will return a new reference. Each of these operations occur independently, so two similar updates will not return the same reference: ```js import { Map } from 'immutable'; const originalMap = Map({ a: 1, b: 2, c: 3 }); const updatedMap = originalMap.set('b', 1000); // New instance, leaving the original immutable. updatedMap !== originalMap; const anotherUpdatedMap = originalMap.set('b', 1000); // Despite both the results of the same operation, each created a new reference. anotherUpdatedMap !== updatedMap; // However the two are value equal. anotherUpdatedMap.equals(updatedMap); ``` ## Batching Mutations > If a tree falls in the woods, does it make a sound? > > If a pure function mutates some local data in order to produce an immutable > return value, is that ok? > > — Rich Hickey, Clojure Applying a mutation to create a new immutable object results in some overhead, which can add up to a minor performance penalty. If you need to apply a series of mutations locally before returning, Immutable.js gives you the ability to create a temporary mutable (transient) copy of a collection and apply a batch of mutations in a performant manner by using `withMutations`. In fact, this is exactly how Immutable.js applies complex mutations itself. As an example, building `list2` results in the creation of 1, not 3, new immutable Lists. ```js import { List } from 'immutable'; const list1 = List([1, 2, 3]); const list2 = list1.withMutations(function (list) { list.push(4).push(5).push(6); }); assert.equal(list1.size, 3); assert.equal(list2.size, 6); ``` Note: Immutable.js also provides `asMutable` and `asImmutable`, but only encourages their use when `withMutations` will not suffice. Use caution to not return a mutable copy, which could result in undesired behavior. _Important!_: Only a select few methods can be used in `withMutations` including `set`, `push` and `pop`. These methods can be applied directly against a persistent data-structure where other methods like `map`, `filter`, `sort`, and `splice` will always return new immutable data-structures and never mutate a mutable collection. ## Lazy Seq `Seq` describes a lazy operation, allowing them to efficiently chain use of all the higher-order collection methods (such as `map` and `filter`) by not creating intermediate collections. **Seq is immutable** — Once a Seq is created, it cannot be changed, appended to, rearranged or otherwise modified. Instead, any mutative method called on a `Seq` will return a new `Seq`. **Seq is lazy** — `Seq` does as little work as necessary to respond to any method call. Values are often created during iteration, including implicit iteration when reducing or converting to a concrete data structure such as a `List` or JavaScript `Array`. For example, the following performs no work, because the resulting `Seq`'s values are never iterated: ```js import { Seq } from 'immutable'; const oddSquares = Seq([1, 2, 3, 4, 5, 6, 7, 8]) .filter((x) => x % 2 !== 0) .map((x) => x * x); ``` Once the `Seq` is used, it performs only the work necessary. In this example, no intermediate arrays are ever created, filter is called three times, and map is only called once: ```js oddSquares.get(1); // 9 ``` Any collection can be converted to a lazy Seq with `Seq()`. ```js import { Map, Seq } from 'immutable'; const map = Map({ a: 1, b: 2, c: 3 }); const lazySeq = Seq(map); ``` `Seq` allows for the efficient chaining of operations, allowing for the expression of logic that can otherwise be very tedious: ```js lazySeq .flip() .map((key) => key.toUpperCase()) .flip(); // Seq { A: 1, B: 2, C: 3 } ``` As well as expressing logic that would otherwise seem memory or time limited, for example `Range` is a special kind of Lazy sequence. ```js import { Range } from 'immutable'; Range(1, Infinity) .skip(1000) .map((n) => -n) .filter((n) => n % 2 === 0) .take(2) .reduce((r, n) => r * n, 1); // 1006008 ``` ## Comparison of filter(), groupBy(), and partition() The `filter()`, `groupBy()`, and `partition()` methods are similar in that they all divide a collection into parts based on applying a function to each element. All three call the predicate or grouping function once for each item in the input collection. All three return zero or more collections of the same type as their input. The returned collections are always distinct from the input (according to `===`), even if the contents are identical. Of these methods, `filter()` is the only one that is lazy and the only one which discards items from the input collection. It is the simplest to use, and the fact that it returns exactly one collection makes it easy to combine with other methods to form a pipeline of operations. The `partition()` method is similar to an eager version of `filter()`, but it returns two collections; the first contains the items that would have been discarded by `filter()`, and the second contains the items that would have been kept. It always returns an array of exactly two collections, which can make it easier to use than `groupBy()`. Compared to making two separate calls to `filter()`, `partition()` makes half as many calls it the predicate passed to it. The `groupBy()` method is a more generalized version of `partition()` that can group by an arbitrary function rather than just a predicate. It returns a map with zero or more entries, where the keys are the values returned by the grouping function, and the values are nonempty collections of the corresponding arguments. Although `groupBy()` is more powerful than `partition()`, it can be harder to use because it is not always possible predict in advance how many entries the returned map will have and what their keys will be. | Summary | `filter` | `partition` | `groupBy` | | :---------------------------- | :------- | :---------- | :------------- | | ease of use | easiest | moderate | hardest | | generality | least | moderate | most | | laziness | lazy | eager | eager | | # of returned sub-collections | 1 | 2 | 0 or more | | sub-collections may be empty | yes | yes | no | | can discard items | yes | no | no | | wrapping container | none | array | Map/OrderedMap | ## Additional Tools and Resources - [Atom-store](https://github.com/jameshopkins/atom-store/) - A Clojure-inspired atom implementation in Javascript with configurability for external persistance. - [Chai Immutable](https://github.com/astorije/chai-immutable) - If you are using the [Chai Assertion Library](https://chaijs.com/), this provides a set of assertions to use against Immutable.js collections. - [Fantasy-land](https://github.com/fantasyland/fantasy-land) - Specification for interoperability of common algebraic structures in JavaScript. - [Immutagen](https://github.com/pelotom/immutagen) - A library for simulating immutable generators in JavaScript. - [Immutable-cursor](https://github.com/redbadger/immutable-cursor) - Immutable cursors incorporating the Immutable.js interface over Clojure-inspired atom. - [Immutable-ext](https://github.com/DrBoolean/immutable-ext) - Fantasyland extensions for immutablejs - [Immutable-js-tools](https://github.com/madeinfree/immutable-js-tools) - Util tools for immutable.js - [Immutable-Redux](https://github.com/gajus/redux-immutable) - redux-immutable is used to create an equivalent function of Redux combineReducers that works with Immutable.js state. - [Immutable-Treeutils](https://github.com/lukasbuenger/immutable-treeutils) - Functional tree traversal helpers for ImmutableJS data structures. - [Irecord](https://github.com/ericelliott/irecord) - An immutable store that exposes an RxJS observable. Great for React. - [Mudash](https://github.com/brianneisler/mudash) - Lodash wrapper providing Immutable.JS support. - [React-Immutable-PropTypes](https://github.com/HurricaneJames/react-immutable-proptypes) - PropType validators that work with Immutable.js. - [Redux-Immutablejs](https://github.com/indexiatech/redux-immutablejs) - Redux Immutable facilities. - [Rxstate](https://github.com/yamalight/rxstate) - Simple opinionated state management library based on RxJS and Immutable.js. - [Transit-Immutable-js](https://github.com/glenjamin/transit-immutable-js) - Transit serialisation for Immutable.js. - See also: [Transit-js](https://github.com/cognitect/transit-js) Have an additional tool designed to work with Immutable.js? Submit a PR to add it to this list in alphabetical order. ## Contributing Use [Github issues](https://github.com/immutable-js/immutable-js/issues) for requests. We actively welcome pull requests, learn how to [contribute](https://github.com/immutable-js/immutable-js/blob/main/.github/CONTRIBUTING.md). Immutable.js is maintained within the [Contributor Covenant's Code of Conduct](https://www.contributor-covenant.org/version/2/0/code_of_conduct/). ### Changelog Changes are tracked as [Github releases](https://github.com/immutable-js/immutable-js/releases). ### License Immutable.js is [MIT-licensed](./LICENSE). ### Thanks [Phil Bagwell](https://www.youtube.com/watch?v=K2NYwP90bNs), for his inspiration and research in persistent data structures. [Hugh Jackson](https://github.com/hughfdjackson/), for providing the npm package name. If you're looking for his unsupported package, see [this repository](https://github.com/hughfdjackson/immutable). immutable-js-immutable-js-6a01d72/SECURITY.md000066400000000000000000000011231522056416100206100ustar00rootroot00000000000000# Security Policy ## Supported Versions | Version | Supported | | ------- | ------------------ | | 5.1.x | :white_check_mark: | | 5.0.x | :x: | | 4.0.x | :white_check_mark: | | < 4.0 | :x: | ## Reporting a Vulnerability You can send an email to julien@deniau.me to report a security vulnerability. Please be as specific as possible on how to reproduce and understand the issue. This way, we can fix the issue as fast as possible. I will try to reply to you in the following days (it might be sometime longer depending on my personal life). immutable-js-immutable-js-6a01d72/__tests__/000077500000000000000000000000001522056416100207605ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/__tests__/ArraySeq.ts000066400000000000000000000060171522056416100230630ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Seq } from 'immutable'; describe('ArraySequence', () => { it('every is true when predicate is true for all entries', () => { expect(Seq([]).every(() => false)).toBe(true); expect(Seq([1, 2, 3]).every((v) => v > 0)).toBe(true); expect(Seq([1, 2, 3]).every((v) => v < 3)).toBe(false); }); it('some is true when predicate is true for any entry', () => { expect(Seq([]).some(() => true)).toBe(false); expect(Seq([1, 2, 3]).some((v) => v > 0)).toBe(true); expect(Seq([1, 2, 3]).some((v) => v < 3)).toBe(true); expect(Seq([1, 2, 3]).some((v) => v > 1)).toBe(true); expect(Seq([1, 2, 3]).some((v) => v < 0)).toBe(false); }); it('maps', () => { const i = Seq([1, 2, 3]); const m = i.map((x) => x + x).toArray(); expect(m).toEqual([2, 4, 6]); }); it('reduces', () => { const i = Seq([1, 2, 3]); const r = i.reduce((acc, x) => acc + x); expect(r).toEqual(6); }); it('efficiently chains iteration methods', () => { const i = Seq('abcdefghijklmnopqrstuvwxyz'.split('')); function studly(letter: string, index: number): string { return index % 2 === 0 ? letter : letter.toUpperCase(); } const result = i .reverse() .take(10) .reverse() .take(5) .map(studly) .toArray() .join(''); expect(result).toBe('qRsTu'); }); it('counts from the end of the sequence on negative index', () => { const i = Seq([1, 2, 3, 4, 5, 6, 7]); expect(i.get(-1)).toBe(7); expect(i.get(-5)).toBe(3); expect(i.get(-9)).toBe(undefined); expect(i.get(-999, 1000)).toBe(1000); }); it('handles trailing holes', () => { const a = [1, 2, 3]; a.length = 10; const seq = Seq(a); expect(seq.size).toBe(10); expect(seq.toArray().length).toBe(10); expect(seq.map((x) => x * x).size).toBe(10); expect(seq.map((x) => x * x).toArray().length).toBe(10); expect(seq.skip(2).toArray().length).toBe(8); expect(seq.take(2).toArray().length).toBe(2); expect(seq.take(5).toArray().length).toBe(5); expect(seq.filter((x) => x % 2 === 1).toArray().length).toBe(2); expect(seq.toKeyedSeq().flip().size).toBe(10); expect(seq.toKeyedSeq().flip().flip().size).toBe(10); expect(seq.toKeyedSeq().flip().flip().toArray().length).toBe(10); }); it('can be iterated', () => { const a = [1, 2, 3]; const seq = Seq(a); const entries = seq.entries(); expect(entries.next()).toEqual({ value: [0, 1], done: false }); expect(entries.next()).toEqual({ value: [1, 2], done: false }); expect(entries.next()).toEqual({ value: [2, 3], done: false }); expect(entries.next()).toEqual({ value: undefined, done: true }); }); it('cannot be mutated after calling toArray', () => { const seq = Seq(['A', 'B', 'C']); const firstReverse = Seq(seq.toArray().reverse()); const secondReverse = Seq(seq.toArray().reverse()); expect(firstReverse.get(0)).toEqual('C'); expect(secondReverse.get(0)).toEqual('C'); }); }); immutable-js-immutable-js-6a01d72/__tests__/Comparator.ts000066400000000000000000000041361522056416100234430ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { type Comparator, List, OrderedSet, PairSorting, Seq } from 'immutable'; const sourceNumbers: readonly number[] = [3, 4, 5, 6, 7, 9, 10, 12, 90, 92, 95]; const expectedSortedNumbers: readonly number[] = [ 7, 95, 90, 92, 3, 5, 9, 4, 6, 10, 12, ]; const testComparator: Comparator = (left, right) => { //The number 7 always goes first... if (left === 7) { return PairSorting.LeftThenRight; } else if (right === 7) { return PairSorting.RightThenLeft; } //...followed by numbers >= 90, then by all the others. if (left >= 90 && right < 90) { return PairSorting.LeftThenRight; } else if (left < 90 && right >= 90) { return PairSorting.RightThenLeft; } //Within each group, even numbers go first... if (left % 2 && !(right % 2)) { return PairSorting.LeftThenRight; } else if (!(left % 2) && right % 2) { return PairSorting.RightThenLeft; } //...and, finally, sort the numbers of each subgroup in ascending order. return left - right; }; describe.each([ ['List', List], ['OrderedSet', OrderedSet], ['Seq.Indexed', Seq.Indexed], ])('Comparator applied to %s', (_collectionName, testCollectionConstructor) => { const sourceCollection = testCollectionConstructor(sourceNumbers); const expectedSortedCollection = testCollectionConstructor( expectedSortedNumbers ); describe('when sorting', () => { it('should support the enum as well as numeric return values', () => { const actualCollection = sourceCollection.sort(testComparator); expect(actualCollection).toEqual(expectedSortedCollection); }); }); describe('when retrieving the max value', () => { it('should support the enum as well as numeric return values', () => { const actualMax = sourceCollection.max(testComparator); expect(actualMax).toBe(12); }); }); describe('when retrieving the min value', () => { it('should support the enum as well as numeric return values', () => { const actualMin = sourceCollection.min(testComparator); expect(actualMin).toBe(7); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/Conversion.ts000066400000000000000000000144001522056416100234540ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc, { type JsonValue } from 'fast-check'; import { type Collection, fromJS, is, List, Map, OrderedMap, Record, } from 'immutable'; describe('Conversion', () => { // Note: order of keys based on Map's hashing order const js = { deepList: [ { position: 'first', }, { position: 'second', }, { position: 'third', }, ], deepMap: { a: 'A', b: 'B', }, emptyMap: Object.create(null), point: { x: 10, y: 20 }, string: 'Hello', list: [1, 2, 3], }; const Point = Record({ x: 0, y: 0 }, 'Point'); const immutableData = Map({ deepList: List.of( Map({ position: 'first', }), Map({ position: 'second', }), Map({ position: 'third', }) ), deepMap: Map({ a: 'A', b: 'B', }), emptyMap: Map(), point: Map({ x: 10, y: 20 }), string: 'Hello', list: List.of(1, 2, 3), }); const immutableOrderedData = OrderedMap({ deepList: List.of( OrderedMap({ position: 'first', }), OrderedMap({ position: 'second', }), OrderedMap({ position: 'third', }) ), deepMap: OrderedMap({ a: 'A', b: 'B', }), emptyMap: OrderedMap(), point: new Point({ x: 10, y: 20 }), string: 'Hello', list: List.of(1, 2, 3), }); const immutableOrderedDataString = 'OrderedMap { ' + '"deepList": List [ ' + 'OrderedMap { ' + '"position": "first"' + ' }, ' + 'OrderedMap { ' + '"position": "second"' + ' }, ' + 'OrderedMap { ' + '"position": "third"' + ' }' + ' ], ' + '"deepMap": OrderedMap { ' + '"a": "A", ' + '"b": "B"' + ' }, ' + '"emptyMap": OrderedMap {}, ' + '"point": Point { x: 10, y: 20 }, ' + '"string": "Hello", ' + '"list": List [ 1, 2, 3 ]' + ' }'; const nonStringKeyMap = OrderedMap().set(1, true).set(false, 'foo'); const nonStringKeyMapString = 'OrderedMap { 1: true, false: "foo" }'; it('Converts deep JS to deep immutable sequences', () => { expect(fromJS(js)).toEqual(immutableData); }); it('Throws when provided circular reference', () => { type OType = { a: { b: { c: OType | null } } }; const o: OType = { a: { b: { c: null } } }; o.a.b.c = o; expect(() => fromJS(o)).toThrow( 'Cannot convert circular structure to Immutable' ); }); it('Converts deep JSON with custom conversion', () => { const seq = fromJS( js, function ( this: typeof js, key: PropertyKey, sequence: | Collection.Keyed | Collection.Indexed ) { if (key === 'point') { // @ts-expect-error -- to convert to real typing return new Point(sequence); } // @ts-expect-error -- any type for too complex object return Array.isArray(this[key]) ? sequence.toList() : sequence.toOrderedMap(); } ); expect(seq).toEqual(immutableOrderedData); expect(seq.toString()).toEqual(immutableOrderedDataString); }); it('Converts deep JSON with custom conversion including keypath if requested', () => { const paths: Array | undefined> = []; // eslint-disable-next-line @typescript-eslint/no-unused-vars const seq1 = fromJS( js, // eslint-disable-next-line @typescript-eslint/no-explicit-any function (this: typeof js, key: any, sequence, keypath) { expect(arguments.length).toBe(3); paths.push(keypath); // @ts-expect-error -- any type for too complex object return Array.isArray(this[key]) ? sequence.toList() : sequence.toOrderedMap(); } ); expect(paths).toEqual([ [], ['deepList'], ['deepList', 0], ['deepList', 1], ['deepList', 2], ['deepMap'], ['emptyMap'], ['point'], ['list'], ]); // eslint-disable-next-line @typescript-eslint/no-unused-vars const seq2 = fromJS(js, function (key, sequence) { // eslint-disable-next-line prefer-rest-params expect(arguments[2]).toBe(undefined); }); }); it('Prints keys as JS values', () => { expect(nonStringKeyMap.toString()).toEqual(nonStringKeyMapString); }); it('Converts deep sequences to JS', () => { const js2 = immutableData.toJS(); expect(is(js2, js)).toBe(false); // raw JS is not immutable. expect(js2).toEqual(js); // but should be deep equal. }); it('Converts shallowly to JS', () => { const js2 = immutableData.toJSON(); expect(js2).not.toEqual(js); expect(js2.deepList).toBe(immutableData.get('deepList')); }); it('JSON.stringify() works equivalently on immutable sequences', () => { expect(JSON.stringify(js)).toBe(JSON.stringify(immutableData)); }); it('JSON.stringify() respects toJSON methods on values', () => { const Model = Record({}); Model.prototype.toJSON = function () { return 'model'; }; expect(Map({ a: new Model() }).toJS()).toEqual({ a: {} }); expect(JSON.stringify(Map({ a: new Model() }))).toEqual('{"a":"model"}'); }); it('is conservative with array-likes, only accepting true Arrays.', () => { expect(fromJS({ 1: 2, length: 3 })).toEqual( Map().set('1', 2).set('length', 3) ); expect(fromJS('string')).toEqual('string'); }); it('toJS isomorphic value', () => { fc.assert( fc.property(fc.jsonValue(), (v: JsonValue) => { const imm = fromJS(v); expect( // @ts-expect-error Property 'toJS' does not exist on type '{}'.ts(2339) imm && imm.toJS ? imm.toJS() : imm ).toEqual(v); }), { numRuns: 30 } ); }); it('Explicitly convert values to string using String constructor', () => { expect(() => fromJS({ foo: Symbol('bar') }) + '').not.toThrow(); expect(() => Map().set('foo', Symbol('bar')) + '').not.toThrow(); expect(() => Map().set(Symbol('bar'), 'foo') + '').not.toThrow(); }); it('Converts an immutable value of an entry correctly', () => { const arr = [{ key: 'a' }]; const result = fromJS(arr).entrySeq().toJS(); expect(result).toEqual([[0, { key: 'a' }]]); }); }); immutable-js-immutable-js-6a01d72/__tests__/Equality.ts000066400000000000000000000102701522056416100231250ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { List, Map, Seq, Set, is } from 'immutable'; describe('Equality', () => { function expectIs(left: unknown, right: unknown): void { const comparison = is(left, right); expect(comparison).toBe(true); const commutative = is(right, left); expect(commutative).toBe(true); } function expectIsNot(left: unknown, right: unknown): void { const comparison = is(left, right); expect(comparison).toBe(false); const commutative = is(right, left); expect(commutative).toBe(false); } it('uses Object.is semantics', () => { expectIs(null, null); expectIs(undefined, undefined); expectIsNot(undefined, null); expectIs(true, true); expectIs(false, false); expectIsNot(true, false); expectIs(123, 123); expectIsNot(123, -123); expectIs(NaN, NaN); expectIs(0, 0); expectIs(-0, -0); // Note: Unlike Object.is, is assumes 0 and -0 are the same value, // matching the behavior of ES6 Map key equality. expectIs(0, -0); expectIs(NaN, 0 / 0); const str = 'hello'; expectIs(str, str); expectIs(str, 'hello'); expectIsNot('hello', 'HELLO'); expectIsNot('hello', 'goodbye'); const array = [1, 2, 3]; expectIs(array, array); expectIsNot(array, [1, 2, 3]); const object = { key: 'value' }; expectIs(object, object); expectIsNot(object, { key: 'value' }); }); it('dereferences things', () => { const ptrA = { foo: 1 }; const ptrB = { foo: 2 }; expectIsNot(ptrA, ptrB); ptrA.valueOf = ptrB.valueOf = function () { return 5; }; expectIs(ptrA, ptrB); const object = { key: 'value' }; ptrA.valueOf = ptrB.valueOf = function () { return object; }; expectIs(ptrA, ptrB); ptrA.valueOf = ptrB.valueOf = function () { // eslint-disable-next-line @typescript-eslint/no-explicit-any return null as any; }; expectIs(ptrA, ptrB); ptrA.valueOf = ptrB.valueOf = function () { // eslint-disable-next-line @typescript-eslint/no-explicit-any return undefined as any; }; expectIs(ptrA, ptrB); ptrA.valueOf = function () { return 4; }; ptrB.valueOf = function () { return 5; }; expectIsNot(ptrA, ptrB); }); it('compares sequences', () => { const arraySeq = Seq([1, 2, 3]); const arraySeq2 = Seq([1, 2, 3]); expectIs(arraySeq, arraySeq); expectIs(arraySeq, Seq([1, 2, 3])); expectIs(arraySeq2, arraySeq2); expectIs(arraySeq2, Seq([1, 2, 3])); expectIsNot(arraySeq, [1, 2, 3]); expectIsNot(arraySeq2, [1, 2, 3]); expectIs(arraySeq, arraySeq2); expectIs( arraySeq, arraySeq.map((x) => x) ); expectIs( arraySeq2, arraySeq2.map((x) => x) ); }); it('compares lists', () => { const list = List([1, 2, 3]); expectIs(list, list); expectIsNot(list, [1, 2, 3]); expectIs(list, Seq([1, 2, 3])); expectIs(list, List([1, 2, 3])); const listLonger = list.push(4); expectIsNot(list, listLonger); const listShorter = listLonger.pop(); expect(list === listShorter).toBe(false); expectIs(list, listShorter); }); const genSimpleVal = fc.oneof(fc.constant('A'), fc.constant(1)); const genVal = fc.oneof( fc.array(genSimpleVal, { minLength: 0, maxLength: 4 }).map(List), fc.array(genSimpleVal, { minLength: 0, maxLength: 4 }).map(Set), fc .array(fc.array(genSimpleVal, { minLength: 2, maxLength: 2 }), { minLength: 0, maxLength: 4, }) .map(Map) ); it('has symmetric equality', () => { fc.assert( fc.property(genVal, genVal, (a, b) => { expect(is(a, b)).toBe(is(b, a)); }), { numRuns: 1000 } ); }); it('has hash symmetry', () => { fc.assert( fc.property(genVal, genVal, (a, b) => { if (is(a, b)) { // eslint-disable-next-line jest/no-conditional-expect expect(a.hashCode()).toBe(b.hashCode()); } }), { numRuns: 1000 } ); }); describe('hash', () => { it('differentiates decimals', () => { expect(Seq([1.5]).hashCode()).not.toBe(Seq([1.6]).hashCode()); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/IndexedSeq.ts000066400000000000000000000057101522056416100233640ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Seq } from 'immutable'; describe('IndexedSequence', () => { it('maintains skipped offset', () => { const seq = Seq(['A', 'B', 'C', 'D', 'E']); // This is what we expect for IndexedSequences const operated = seq.skip(1); expect(operated.entrySeq().toArray()).toEqual([ [0, 'B'], [1, 'C'], [2, 'D'], [3, 'E'], ]); expect(operated.first()).toEqual('B'); }); it('reverses correctly', () => { const seq = Seq(['A', 'B', 'C', 'D', 'E']); // This is what we expect for IndexedSequences const operated = seq.reverse(); expect(operated.get(0)).toEqual('E'); expect(operated.get(1)).toEqual('D'); expect(operated.get(4)).toEqual('A'); expect(operated.first()).toEqual('E'); expect(operated.last()).toEqual('A'); }); it('can be iterated in reverse through a lazy chain', () => { // Regression: reverseFactory's __iterator is an arrow function, so `this` // is NOT the reversed sequence there — it must read `reversedSequence.size` // rather than `this.size`. The bug only surfaces when the reversed indexed // Seq is iterated *backwards* (reverse=true) via the iterator protocol, // which a wrapping `.reverse()` triggers on the inner sequence. // The `.map()` in between prevents the two reverses from collapsing. const seq = Seq([1, 2, 3]) .reverse() .map((x) => x * 10) .reverse(); // Consuming via the iterator protocol (not toArray, which uses __iterate) // is what exercised the broken `this.size` path. expect([...seq]).toEqual([10, 20, 30]); expect([...seq.entries()]).toEqual([ [0, 10], [1, 20], [2, 30], ]); }); it('has() checks index existence on a lazy seq of unknown size', () => { // A filtered indexed Seq has no known size, so `has` must iterate by key. // Regression: it previously delegated to `indexOf(index)`, which searches // for a *value* equal to the index instead of checking the index itself. const seq = Seq([10, 20, 30]).filter(() => true); expect(seq.size).toBeUndefined(); expect(seq.has(0)).toBe(true); expect(seq.has(2)).toBe(true); // index out of bounds, even though the *value* 10 exists at index 0 expect(seq.has(10)).toBe(false); expect(seq.has(3)).toBe(false); // negative index resolves from the end (materializing the size) expect(seq.has(-1)).toBe(true); }); it('negative indexes correctly', () => { const seq = Seq(['A', 'B', 'C', 'D', 'E']); expect(seq.first()).toEqual('A'); expect(seq.last()).toEqual('E'); expect(seq.get(-0)).toEqual('A'); expect(seq.get(2)).toEqual('C'); expect(seq.get(-2)).toEqual('D'); const indexes = seq.keySeq(); expect(indexes.first()).toEqual(0); expect(indexes.last()).toEqual(4); expect(indexes.get(-0)).toEqual(0); expect(indexes.get(2)).toEqual(2); expect(indexes.get(-2)).toEqual(3); }); }); immutable-js-immutable-js-6a01d72/__tests__/KeyedSeq.ts000066400000000000000000000065041522056416100230470ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { Range, Seq } from 'immutable'; import invariant from '../src/utils/invariant'; describe('KeyedSeq', () => { it('iterates equivalently', () => { fc.assert( fc.property(fc.array(fc.integer()), (ints: Array) => { const seq = Seq(ints); const keyed = seq.toKeyedSeq(); const seqEntries = seq.entries(); const keyedEntries = keyed.entries(); let seqStep; let keyedStep; do { seqStep = seqEntries.next(); keyedStep = keyedEntries.next(); expect(keyedStep).toEqual(seqStep); } while (!seqStep.done); }) ); }); it('maintains keys', () => { const isEven = (x: number): boolean => x % 2 === 0; const seq = Range(0, 100); // This is what we expect for IndexedSequences const operated = seq.filter(isEven).skip(10).take(5); expect(operated.entrySeq().toArray()).toEqual([ [0, 20], [1, 22], [2, 24], [3, 26], [4, 28], ]); const [indexed0, indexed1] = seq .partition(isEven) .map((part) => part.skip(10).take(5)); invariant(indexed0, 'indexed0 is not undefined'); invariant(indexed1, 'indexed0 is not undefined'); expect(indexed0.entrySeq().toArray()).toEqual([ [0, 21], [1, 23], [2, 25], [3, 27], [4, 29], ]); expect(indexed1.entrySeq().toArray()).toEqual([ [0, 20], [1, 22], [2, 24], [3, 26], [4, 28], ]); // Where Keyed Sequences maintain keys. const keyed = seq.toKeyedSeq(); const keyedOperated = keyed.filter(isEven).skip(10).take(5); expect(keyedOperated.entrySeq().toArray()).toEqual([ [20, 20], [22, 22], [24, 24], [26, 26], [28, 28], ]); const [keyed0, keyed1] = keyed .partition(isEven) .map((part) => part.skip(10).take(5)); invariant(keyed0, 'keyed0 is not undefined'); invariant(keyed1, 'keyed1 is not undefined'); expect(keyed0.entrySeq().toArray()).toEqual([ [21, 21], [23, 23], [25, 25], [27, 27], [29, 29], ]); expect(keyed1.entrySeq().toArray()).toEqual([ [20, 20], [22, 22], [24, 24], [26, 26], [28, 28], ]); }); it('works with reverse', () => { const seq = Range(0, 100); // This is what we expect for IndexedSequences expect(seq.reverse().take(5).entrySeq().toArray()).toEqual([ [0, 99], [1, 98], [2, 97], [3, 96], [4, 95], ]); // Where Keyed Sequences maintain keys. expect(seq.toKeyedSeq().reverse().take(5).entrySeq().toArray()).toEqual([ [99, 99], [98, 98], [97, 97], [96, 96], [95, 95], ]); }); it('works with double reverse', () => { const seq = Range(0, 100); // This is what we expect for IndexedSequences expect( seq.reverse().skip(10).take(5).reverse().entrySeq().toArray() ).toEqual([ [0, 85], [1, 86], [2, 87], [3, 88], [4, 89], ]); // Where Keyed Sequences maintain keys. expect( seq.reverse().toKeyedSeq().skip(10).take(5).reverse().entrySeq().toArray() ).toEqual([ [14, 85], [13, 86], [12, 87], [11, 88], [10, 89], ]); }); }); immutable-js-immutable-js-6a01d72/__tests__/List.ts000066400000000000000000001212321522056416100222440ustar00rootroot00000000000000import { describe, expect, it, jest } from '@jest/globals'; import fc from 'fast-check'; import { List, Map, Range, Seq, Set, fromJS } from 'immutable'; import { create as createSeed } from 'random-seed'; import invariant from '../src/utils/invariant'; function arrayOfSize(s: number) { const a = new Array(s); for (let ii = 0; ii < s; ii++) { a[ii] = ii; } return a; } describe('List', () => { it('determines assignment of unspecified value types', () => { interface Test { list: List; } const t: Test = { list: List(), }; expect(t.list.size).toBe(0); }); it('of provides initial values', () => { const v = List.of('a', 'b', 'c'); expect(v.get(0)).toBe('a'); expect(v.get(1)).toBe('b'); expect(v.get(2)).toBe('c'); }); it('toArray provides a JS array', () => { const v = List.of('a', 'b', 'c'); expect(v.toArray()).toEqual(['a', 'b', 'c']); }); it('does not accept a scalar', () => { expect(() => { // @ts-expect-error -- test that runtime does throw List(3); }).toThrow('Expected Array or collection object of values: 3'); }); it('accepts an array', () => { const v = List(['a', 'b', 'c']); expect(v.get(1)).toBe('b'); expect(v.toArray()).toEqual(['a', 'b', 'c']); }); it('accepts an array-like', () => { const v = List({ length: 3, 2: 'c' }); expect(v.get(2)).toBe('c'); expect(v.toArray()).toEqual([undefined, undefined, 'c']); }); it('accepts any array-like collection, including strings', () => { const v = List('abc'); expect(v.get(1)).toBe('b'); expect(v.toArray()).toEqual(['a', 'b', 'c']); }); it('accepts an indexed Seq', () => { const seq = Seq(['a', 'b', 'c']); const v = List(seq); expect(v.toArray()).toEqual(['a', 'b', 'c']); }); it('accepts a keyed Seq as a list of entries', () => { const seq = Seq({ a: null, b: null, c: null }).flip(); const v = List(seq); expect(v.toArray()).toEqual([ [null, 'a'], [null, 'b'], [null, 'c'], ]); // Explicitly getting the values sequence const v2 = List(seq.valueSeq()); expect(v2.toArray()).toEqual(['a', 'b', 'c']); // toList() does this for you. const v3 = seq.toList(); expect(v3.toArray()).toEqual(['a', 'b', 'c']); }); it('can set and get a value', () => { let v = List(); expect(v.get(0)).toBe(undefined); v = v.set(0, 'value'); expect(v.get(0)).toBe('value'); }); it('can setIn and getIn a deep value', () => { let v = List([ Map({ aKey: List(['bad', 'good']), }), ]); expect(v.getIn([0, 'aKey', 1])).toBe('good'); v = v.setIn([0, 'aKey', 1], 'great'); expect(v.getIn([0, 'aKey', 1])).toBe('great'); }); it('can setIn on an inexistant index', () => { const myMap = Map<{ a: Array; b: Array; c?: List }>( { a: [], b: [] } ); const out = myMap.setIn(['a', 0], 'v').setIn(['c', 0], 'v'); expect(out.getIn(['a', 0])).toEqual('v'); expect(out.getIn(['c', 0])).toEqual('v'); expect(out.get('a')).toBeInstanceOf(Array); expect(out.get('b')).toBeInstanceOf(Array); expect(out.get('c')).toBeInstanceOf(Map); expect(out.get('c')?.keySeq().first()).toBe(0); }); it('throw when calling setIn on a non data structure', () => { const avengers = [ 'ironMan', // index [0] [ 'captainAmerica', // index [1][0] [ 'blackWidow', // index [1][1][0] ['theHulk'], // index [1][1][1][0] ], ], ]; const avengersList = fromJS(avengers) as List; // change theHulk to scarletWitch const out1 = avengersList.setIn([1, 1, 1, 0], 'scarletWitch'); expect(out1.getIn([1, 1, 1, 0])).toEqual('scarletWitch'); const out2 = avengersList.setIn([1, 1, 1, 3], 'scarletWitch'); expect(out2.getIn([1, 1, 1, 3])).toEqual('scarletWitch'); expect(() => { avengersList.setIn([0, 1], 'scarletWitch'); }).toThrow( 'Cannot update within non-data-structure value in path [0]: ironMan' ); }); it('can update a value', () => { const l = List.of(5); // @ts-expect-error -- Type definition limitation expect(l.update(0, (v) => v * v).toArray()).toEqual([25]); }); it('can updateIn a deep value', () => { let l = List([ Map({ aKey: List(['bad', 'good']), }), ]); // @ts-expect-error -- Type definition limitation l = l.updateIn([0, 'aKey', 1], (v) => v + v); expect(l.toJS()).toEqual([ { aKey: ['bad', 'goodgood'], }, ]); }); it('returns undefined when getting a null value', () => { const v = List([1, 2, 3]); // @ts-expect-error -- test runtime expect(v.get(null)).toBe(undefined); const o = List([{ a: 1 }, { b: 2 }, { c: 3 }]); // @ts-expect-error -- test runtime expect(o.get(null)).toBe(undefined); }); it('counts from the end of the list on negative index', () => { const i = List.of(1, 2, 3, 4, 5, 6, 7); expect(i.get(-1)).toBe(7); expect(i.get(-5)).toBe(3); expect(i.get(-9)).toBe(undefined); expect(i.get(-999, 1000)).toBe(1000); }); it('coerces numeric-string keys', () => { // Of course, TypeScript protects us from this, so cast to "any" to test. // eslint-disable-next-line @typescript-eslint/no-explicit-any const i: any = List.of(1, 2, 3, 4, 5, 6); expect(i.get('1')).toBe(2); expect(i.set('3', 10).get('3')).toBe(10); // Like array, string negative numbers do not qualify expect(i.get('-1')).toBe(undefined); // Like array, string floating point numbers do not qualify expect(i.get('1.0')).toBe(undefined); }); it('uses not set value for string index', () => { const list = List(); // @ts-expect-error -- test runtime expect(list.get('stringKey', 'NOT-SET')).toBe('NOT-SET'); }); it('uses not set value for index {}', () => { const list = List.of(1, 2, 3, 4, 5); // @ts-expect-error -- test runtime expect(list.get({}, 'NOT-SET')).toBe('NOT-SET'); }); it('uses not set value for index void 0', () => { const list = List.of(1, 2, 3, 4, 5); // @ts-expect-error -- test runtime expect(list.get(void 0, 'NOT-SET')).toBe('NOT-SET'); }); it('uses not set value for index undefined', () => { const list = List.of(1, 2, 3, 4, 5); // @ts-expect-error -- test runtime expect(list.get(undefined, 'NOT-SET')).toBe('NOT-SET'); }); it('doesnt coerce empty strings to index 0', () => { const list = List.of(1, 2, 3); // @ts-expect-error -- test runtime expect(list.has('')).toBe(false); }); it('doesnt contain elements at non-empty string keys', () => { const list = List.of(1, 2, 3, 4, 5); // @ts-expect-error -- test runtime expect(list.has('str')).toBe(false); }); it('hasIn doesnt contain elements at non-empty string keys', () => { const list = List.of(1, 2, 3, 4, 5); expect(list.hasIn(['str'])).toBe(false); }); it('hasIn doesnt throw for bad key-path', () => { const list = List.of(1, 2, 3, 4, 5); expect(list.hasIn([1, 2, 3])).toBe(false); const list2 = List([{}]); expect(list2.hasIn([0, 'bad'])).toBe(false); }); it('setting creates a new instance', () => { const v0 = List.of('a'); const v1 = v0.set(0, 'A'); expect(v0.get(0)).toBe('a'); expect(v1.get(0)).toBe('A'); }); it('size includes the highest index', () => { const v0 = List(); const v1 = v0.set(0, 'a'); const v2 = v1.set(1, 'b'); const v3 = v2.set(2, 'c'); expect(v0.size).toBe(0); expect(v1.size).toBe(1); expect(v2.size).toBe(2); expect(v3.size).toBe(3); }); it('get helpers make for easier to read code', () => { const v = List.of('a', 'b', 'c'); expect(v.first()).toBe('a'); expect(v.get(1)).toBe('b'); expect(v.last()).toBe('c'); }); it('slice helpers make for easier to read code', () => { const v0 = List.of('a', 'b', 'c'); const v1 = List.of('a', 'b'); const v2 = List.of('a'); const v3 = List(); expect(v0.rest().toArray()).toEqual(['b', 'c']); expect(v0.butLast().toArray()).toEqual(['a', 'b']); expect(v1.rest().toArray()).toEqual(['b']); expect(v1.butLast().toArray()).toEqual(['a']); expect(v2.rest().toArray()).toEqual([]); expect(v2.butLast().toArray()).toEqual([]); expect(v3.rest().toArray()).toEqual([]); expect(v3.butLast().toArray()).toEqual([]); }); it('can set at arbitrary indices', () => { const v0 = List.of('a', 'b', 'c'); const v1 = v0.set(1, 'B'); // within existing tail const v2 = v1.set(3, 'd'); // at last position const v3 = v2.set(31, 'e'); // (testing internal guts) const v4 = v3.set(32, 'f'); // (testing internal guts) const v5 = v4.set(1023, 'g'); // (testing internal guts) const v6 = v5.set(1024, 'h'); // (testing internal guts) const v7 = v6.set(32, 'F'); // set within existing tree expect(v7.size).toBe(1025); const expectedArray = ['a', 'B', 'c', 'd']; expectedArray[31] = 'e'; expectedArray[32] = 'F'; expectedArray[1023] = 'g'; expectedArray[1024] = 'h'; expect(v7.toArray()).toEqual(expectedArray); }); it('can contain a large number of indices', () => { const r = Range(0, 20000).toList(); let iterations = 0; r.forEach((v) => { expect(v).toBe(iterations); iterations++; }); }); it('describes a dense list', () => { const v = List.of('a', 'b', 'c') .push('d') .set(14, 'o') .set(6, undefined) .remove(1); expect(v.size).toBe(14); // eslint-disable-next-line no-sparse-arrays expect(v.toJS()).toEqual(['a', 'c', 'd', , , , , , , , , , , 'o']); }); it('iterates a dense list', () => { const v = List() .setSize(11) .set(1, 1) .set(3, 3) .set(5, 5) .set(7, 7) .set(9, 9); expect(v.size).toBe(11); const forEachResults: Array<[number, undefined | number]> = []; v.forEach((val, i) => forEachResults.push([i, val])); expect(forEachResults).toEqual([ [0, undefined], [1, 1], [2, undefined], [3, 3], [4, undefined], [5, 5], [6, undefined], [7, 7], [8, undefined], [9, 9], [10, undefined], ]); const arrayResults = v.toArray(); expect(arrayResults).toEqual([ undefined, 1, undefined, 3, undefined, 5, undefined, 7, undefined, 9, undefined, ]); const iteratorResults: Array<[number, undefined | number]> = []; const iterator = v.entries(); let step; while (!(step = iterator.next()).done) { iteratorResults.push(step.value); } expect(iteratorResults).toEqual([ [0, undefined], [1, 1], [2, undefined], [3, 3], [4, undefined], [5, 5], [6, undefined], [7, 7], [8, undefined], [9, 9], [10, undefined], ]); }); it('has the same iterator function for values', () => { const l = List(['a', 'b', 'c']); expect(l[Symbol.iterator]).toBe(l.values); }); it('push inserts at highest index', () => { const v0 = List.of('a', 'b', 'c'); const v1 = v0.push('d', 'e', 'f'); expect(v0.size).toBe(3); expect(v1.size).toBe(6); expect(v1.toArray()).toEqual(['a', 'b', 'c', 'd', 'e', 'f']); }); it('pushes multiple values to the end', () => { fc.assert( fc.property(fc.nat(100), fc.nat(100), (s1, s2) => { const a1 = arrayOfSize(s1); const a2 = arrayOfSize(s2); const v1 = List(a1); const v3 = v1.push.apply(v1, a2); const a3 = a1.slice(); a3.push.apply(a3, a2); expect(v3.size).toEqual(a3.length); expect(v3.toArray()).toEqual(a3); }) ); }); it('pop removes the highest index, decrementing size', () => { let v = List.of('a', 'b', 'c').pop(); expect(v.last()).toBe('b'); expect(v.toArray()).toEqual(['a', 'b']); v = v.set(1230, 'x'); expect(v.size).toBe(1231); expect(v.last()).toBe('x'); v = v.pop(); expect(v.size).toBe(1230); expect(v.last()).toBe(undefined); v = v.push('X'); expect(v.size).toBe(1231); expect(v.last()).toBe('X'); }); it('pop removes the highest index, just like array', () => { fc.assert( fc.property(fc.nat(100), (len) => { const a = arrayOfSize(len); let v = List(a); while (a.length) { expect(v.size).toBe(a.length); expect(v.toArray()).toEqual(a); v = v.pop(); a.pop(); } expect(v.size).toBe(a.length); expect(v.toArray()).toEqual(a); }) ); }); it('push adds the next highest index, just like array', () => { fc.assert( fc.property(fc.nat(100), (len) => { const a: Array = []; let v = List(); for (let ii = 0; ii < len; ii++) { expect(v.size).toBe(a.length); expect(v.toArray()).toEqual(a); v = v.push(ii); a.push(ii); } expect(v.size).toBe(a.length); expect(v.toArray()).toEqual(a); }) ); }); it('allows popping an empty list', () => { let v = List.of('a').pop(); expect(v.size).toBe(0); expect(v.toArray()).toEqual([]); v = v.pop().pop().pop().pop().pop(); expect(v.size).toBe(0); expect(v.toArray()).toEqual([]); }); it.each(['remove', 'delete'])('remove removes any index', (fn) => { invariant(fn === 'remove' || fn === 'delete', 'Invalid function name'); let v = List.of('a', 'b', 'c')[fn](2)[fn](0); expect(v.size).toBe(1); expect(v.get(0)).toBe('b'); expect(v.get(1)).toBe(undefined); expect(v.get(2)).toBe(undefined); expect(v.toArray()).toEqual(['b']); v = v.push('d'); expect(v.size).toBe(2); expect(v.get(1)).toBe('d'); expect(v.toArray()).toEqual(['b', 'd']); }); it('shifts values from the front', () => { const v = List.of('a', 'b', 'c').shift(); expect(v.first()).toBe('b'); expect(v.size).toBe(2); }); it('unshifts values to the front', () => { const v = List.of('a', 'b', 'c').unshift('x', 'y', 'z'); expect(v.first()).toBe('x'); expect(v.size).toBe(6); expect(v.toArray()).toEqual(['x', 'y', 'z', 'a', 'b', 'c']); }); it('unshifts multiple values to the front', () => { fc.assert( fc.property(fc.nat(100), fc.nat(100), (s1, s2) => { const a1 = arrayOfSize(s1); const a2 = arrayOfSize(s2); const v1 = List(a1); const v3 = v1.unshift.apply(v1, a2); const a3 = a1.slice(); a3.unshift.apply(a3, a2); expect(v3.size).toEqual(a3.length); expect(v3.toArray()).toEqual(a3); }) ); }); it('finds values using indexOf', () => { const v = List.of('a', 'b', 'c', 'b', 'a'); expect(v.indexOf('b')).toBe(1); expect(v.indexOf('c')).toBe(2); expect(v.indexOf('d')).toBe(-1); }); it('finds values using lastIndexOf', () => { const v = List.of('a', 'b', 'c', 'b', 'a'); expect(v.lastIndexOf('b')).toBe(3); expect(v.lastIndexOf('c')).toBe(2); expect(v.lastIndexOf('d')).toBe(-1); }); it('finds values using findIndex', () => { const v = List.of('a', 'b', 'c', 'B', 'a'); expect(v.findIndex((value) => value.toUpperCase() === value)).toBe(3); expect(v.findIndex((value) => value.length > 1)).toBe(-1); }); it('finds values using findEntry', () => { const v = List.of('a', 'b', 'c', 'B', 'a'); expect(v.findEntry((value) => value.toUpperCase() === value)).toEqual([ 3, 'B', ]); expect(v.findEntry((value) => value.length > 1)).toBe(undefined); }); it('maps values', () => { const v = List.of('a', 'b', 'c'); const r = v.map((value) => value.toUpperCase()); expect(r.toArray()).toEqual(['A', 'B', 'C']); }); it('map no-ops return the same reference', () => { const v = List.of('a', 'b', 'c'); const r = v.map((value) => value); expect(r).toBe(v); }); it('ensures iter is unmodified', () => { const v = List.of(1, 2, 3); const r = v.map((value, index, iter) => iter.get(index - 1)); expect(r.toArray()).toEqual([3, 1, 2]); }); it('filters values', () => { const v = List.of('a', 'b', 'c', 'd', 'e', 'f'); const r = v.filter((value, index) => index % 2 === 1); expect(r.toArray()).toEqual(['b', 'd', 'f']); }); it('partitions values', () => { const v = List.of('a', 'b', 'c', 'd', 'e', 'f'); const r = v .partition((value, index) => index % 2 === 1) .map((part) => part.toArray()); expect(r).toEqual([ ['a', 'c', 'e'], ['b', 'd', 'f'], ]); }); it('filters values based on type', () => { class A {} class B extends A { b(): void {} } class C extends A { c(): void {} } const l1 = List([new B(), new C(), new B(), new C()]); const l2: List = l1.filter((v): v is C => v instanceof C); expect(l2.size).toEqual(2); expect(l2.every((v) => v instanceof C)).toBe(true); }); it('partitions values based on type', () => { class A {} class B extends A { b(): void {} } class C extends A { c(): void {} } const l1 = List([new B(), new C(), new B(), new C()]); const [la, lc]: [List, List] = l1.partition( (v): v is C => v instanceof C ); expect(la.size).toEqual(2); expect(la.some((v) => v instanceof C)).toBe(false); expect(lc.size).toEqual(2); expect(lc.every((v) => v instanceof C)).toBe(true); }); it('reduces values', () => { const v = List.of(1, 10, 100); const r = v.reduce((reduction, value) => reduction + value); expect(r).toEqual(111); const r2 = v.reduce((reduction, value) => reduction + value, 1000); expect(r2).toEqual(1111); }); it('reduces without an initial value', () => { // With a single value and no initial reduction, the reducer is never // called and the lone value is returned as-is. const reducer = jest.fn((reduction: number, value: number) => Math.max(reduction, value) ); expect(List.of(42).reduce(reducer)).toEqual(42); expect(reducer).not.toHaveBeenCalled(); // An empty list with no initial reduction returns undefined. expect( List().reduce((reduction, value) => reduction + value) ).toBeUndefined(); }); it('reduces from the right', () => { const v = List.of('a', 'b', 'c'); const r = v.reduceRight((reduction, value) => reduction + value); expect(r).toEqual('cba'); const r2 = v.reduceRight((reduction, value) => reduction + value, 'x'); expect(r2).toEqual('xcba'); }); it('takes maximum number', () => { const v = List.of('a', 'b', 'c'); const r = v.take(Number.MAX_SAFE_INTEGER); expect(r).toBe(v); }); it('takes and skips values', () => { const v = List.of('a', 'b', 'c', 'd', 'e', 'f'); const r = v.skip(2).take(2); expect(r.toArray()).toEqual(['c', 'd']); }); it('takes and skips no-ops return same reference', () => { const v = List.of('a', 'b', 'c', 'd', 'e', 'f'); const r = v.skip(0).take(6); expect(r).toBe(v); }); it('takeLast and skipLast values', () => { const v = List.of('a', 'b', 'c', 'd', 'e', 'f'); const r = v.skipLast(1).takeLast(2); expect(r.toArray()).toEqual(['d', 'e']); }); it('takeLast and skipLast no-ops return same reference', () => { const v = List.of('a', 'b', 'c', 'd', 'e', 'f'); const r = v.skipLast(0).takeLast(6); expect(r).toBe(v); }); it('efficiently chains array methods', () => { const v = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14); const r = v .filter((x) => x % 2 === 0) .skip(2) .map((x) => x * x) .take(3) .reduce((a: number, b: number) => a + b, 0); expect(r).toEqual(200); }); it('can convert to a map', () => { const v = List.of('a', 'b', 'c'); const m = v.toMap(); expect(m.size).toBe(3); expect(m.get(1)).toBe('b'); }); it('reverses', () => { const v = List.of('a', 'b', 'c'); expect(v.reverse().toArray()).toEqual(['c', 'b', 'a']); }); it('ensures equality', () => { // Make a sufficiently long list. const a = Array(100).join('abcdefghijklmnopqrstuvwxyz').split(''); const v1 = List(a); const v2 = List(a); // eslint-disable-next-line eqeqeq expect(v1 == v2).not.toBe(true); expect(v1 === v2).not.toBe(true); expect(v1.equals(v2)).toBe(true); }); it('works with insert', () => { const v = List.of('a', 'b', 'c'); const m = v.insert(1, 'd'); expect(m.size).toBe(4); expect(m.get(1)).toBe('d'); // Works when index is greater than size of array. const n = v.insert(10, 'e'); expect(n.size).toBe(4); expect(n.get(3)).toBe('e'); // Works when index is negative. const o = v.insert(-4, 'f'); expect(o.size).toBe(4); expect(o.get(0)).toBe('f'); }); it('works with push, set and insert without phantom values', () => { const v = List.of().set(287, 287).push(42).insert(33, 33); expect(v.toJS().filter((item) => item === 287)).toHaveLength(1); const v2 = List.of().push(0).unshift(-1).unshift(-2).pop().pop().set(2, 2); expect(v2.toJS()).toEqual([-2, undefined, 2]); const v3 = List.of().set(447, 447).push(0).insert(65, 65); expect(v3.toJS().filter((item) => item === 447)).toHaveLength(1); const v4 = List.of().set(-28, -28).push(0).shift().set(-30, -30); expect(v4.toJS().filter((item) => item === -28)).toHaveLength(0); const v5 = List.of().unshift(0).set(33, 33).shift().set(-35, -35); expect(v5.toJS().filter((item) => item === 0)).toHaveLength(0); // execute the same test as `v` but for the 2000 first integers const isOkV1 = (v: number): boolean => List.of() .set(v, v) .push('pushed-value') .insert(33, 'inserted-value') .filter((item) => item === v).size === 1; const arr = new Array(2000).fill(null).map((_, v) => v); const notOkArray = arr.filter((v) => !isOkV1(v)); expect(notOkArray).toHaveLength(0); }); // TODO: assert that findIndex only calls the function as much as it needs to. it('forEach iterates in the correct order', () => { let n = 0; const a: Array = []; const v = List.of(0, 1, 2, 3, 4); v.forEach((x) => { a.push(x); n++; }); expect(n).toBe(5); expect(a.length).toBe(5); expect(a).toEqual([0, 1, 2, 3, 4]); }); it('forEach iteration terminates when callback returns false', () => { const a: Array = []; function count(x: number): void | false { if (x > 2) { return false; } a.push(x); } const v = List.of(0, 1, 2, 3, 4); v.forEach(count); expect(a).toEqual([0, 1, 2]); }); it('concat works like Array.prototype.concat', () => { const v1 = List([1, 2, 3]); const v2 = v1.concat( 4, List([5, 6]), [7, 8], Seq([9, 10]), Set.of(11, 12), null ); expect(v1.toArray()).toEqual([1, 2, 3]); expect(v2.toArray()).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, null]); }); it('concat works like Array.prototype.concat even for IE11', () => { const v1 = List([1, 2, 3]); const a = [4]; // remove Symbol.iterator as IE11 does not handle it. // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/@@iterator#browser_compatibility // @ts-expect-error -- simulate IE11 a[Symbol.iterator] = undefined; const v2 = v1.concat(a); expect(v1.toArray()).toEqual([1, 2, 3]); expect(v2.toArray()).toEqual([1, 2, 3, 4]); }); it('concat returns self when no changes', () => { const v1 = List([1, 2, 3]); expect(v1.concat([])).toBe(v1); }); it('concat returns arg when concat to empty', () => { const v1 = List([1, 2, 3]); expect(List().concat(v1)).toBe(v1); }); it('concats a single value', () => { const v1 = List([1, 2, 3]); expect(v1.concat(4)).toEqual(List([1, 2, 3, 4])); }); it('concat returns List-coerced arg when concat to empty', () => { expect(List().concat([1, 2, 3])).toEqual(List([1, 2, 3])); }); it('concat does not spread in string characters', () => { const v1 = List([1, 2, 3]); expect(v1.concat('abcdef')).toEqual(List([1, 2, 3, 'abcdef'])); }); it('allows chained mutations', () => { const v1 = List(); const v2 = v1.push(1); const v3 = v2.withMutations((v) => v.push(2).push(3).push(4)); const v4 = v3.push(5); expect(v1.toArray()).toEqual([]); expect(v2.toArray()).toEqual([1]); expect(v3.toArray()).toEqual([1, 2, 3, 4]); expect(v4.toArray()).toEqual([1, 2, 3, 4, 5]); }); it('allows chained mutations using alternative API', () => { const v1 = List(); const v2 = v1.push(1); const v3 = v2.asMutable().push(2).push(3).push(4).asImmutable(); const v4 = v3.push(5); expect(v1.toArray()).toEqual([]); expect(v2.toArray()).toEqual([1]); expect(v3.toArray()).toEqual([1, 2, 3, 4]); expect(v4.toArray()).toEqual([1, 2, 3, 4, 5]); }); it('chained mutations does not result in new empty list instance', () => { const v1 = List(['x']); const v2 = v1.withMutations((v) => v.push('y').pop().pop()); expect(v2).toEqual(List()); }); it('calling `clear` and `setSize` should set all items to undefined', () => { const l = List(['a', 'b']); const l2 = l.clear().setSize(3); expect(l2.get(0)).toBeUndefined(); expect(l2.get(1)).toBeUndefined(); expect(l2.get(2)).toBeUndefined(); }); it('calling `clear` and `setSize` while mutating should set all items to undefined', () => { const l = List(['a', 'b']); const l2 = l.withMutations((innerList) => { innerList.clear().setSize(3); }); expect(l2.get(0)).toBeUndefined(); expect(l2.get(1)).toBeUndefined(); expect(l2.get(2)).toBeUndefined(); }); it('allows size to be set', () => { const v1 = Range(0, 2000).toList(); const v2 = v1.setSize(1000); const v3 = v2.setSize(1500); expect(v1.size).toBe(2000); expect(v2.size).toBe(1000); expect(v3.size).toBe(1500); expect(v1.get(900)).toBe(900); expect(v1.get(1300)).toBe(1300); expect(v1.get(1800)).toBe(1800); expect(v2.get(900)).toBe(900); expect(v2.get(1300)).toBe(undefined); expect(v2.get(1800)).toBe(undefined); expect(v3.get(900)).toBe(900); expect(v3.get(1300)).toBe(undefined); expect(v3.get(1800)).toBe(undefined); }); it('discards truncated elements when using slice', () => { const list: Array = [1, 2, 3, 4, 5, 6]; const v1 = fromJS(list) as List; const v2 = v1.slice(0, 3); const v3 = v2.setSize(6); expect(v2.toArray()).toEqual(list.slice(0, 3)); expect(v3.toArray()).toEqual( list.slice(0, 3).concat([undefined, undefined, undefined]) ); }); it('discards truncated elements when using setSize', () => { const list: Array = [1, 2, 3, 4, 5, 6]; const v1 = fromJS(list) as List; const v2 = v1.setSize(3); const v3 = v2.setSize(6); expect(v2.toArray()).toEqual(list.slice(0, 3)); expect(v3.toArray()).toEqual( list.slice(0, 3).concat([undefined, undefined, undefined]) ); }); // A List grown past 32 elements while every value is `undefined` must read // back `undefined` at every index, never `null`. describe('preserves stored undefined (never reads back as null)', () => { // Asserts every in-bounds slot reads as `undefined` (not `null`) through // every read path: get, toArray, the values iterator (both directions), // forEach, and the structural equals / hashCode. function expectAllUndefined(list: List, size: number) { const expected = List( new Array(size).fill(undefined) ); expect(list.size).toBe(size); for (let i = 0; i < size; i++) { expect(list.get(i)).toBeUndefined(); } expect(list.toArray()).toEqual(new Array(size).fill(undefined)); expect([...list.values()]).toEqual(new Array(size).fill(undefined)); expect([...list.toSeq().reverse().values()]).toEqual( new Array(size).fill(undefined) ); list.forEach((value) => expect(value).toBeUndefined()); // @ts-expect-error null should not be here expect(list.includes(null)).toBe(false); expect(list.equals(expected)).toBe(true); expect(list.hashCode()).toBe(expected.hashCode()); } it('setSize(32).setSize(33) — minimal repro', () => { expectAllUndefined( List().setSize(32).setSize(33), 33 ); }); it('setSize(1).setSize(33) — grows a tiny List across the boundary', () => { expectAllUndefined(List().setSize(1).setSize(33), 33); }); it('setSize(31).setSize(33)', () => { expectAllUndefined( List().setSize(31).setSize(33), 33 ); }); it('setSize(32).setSize(65) — undefined region spanning two leaf nodes', () => { expectAllUndefined( List().setSize(32).setSize(65), 65 ); }); it('setSize(32).push(undefined) — grow via push, not setSize', () => { expectAllUndefined( List().setSize(32).push(undefined), 33 ); }); it('writing undefined past index 32 in a mutation', () => { const list = List().withMutations((m) => { for (let i = 0; i < 33; i++) { m.set(i, undefined); } }); expectAllUndefined(list, 33); }); // The sequence reported in #2230, reaching the same all-undefined state // through unshift/delete/shift rather than setSize. it('unshift/delete/setSize/shift sequence (issue #2230)', () => { const list = List() .unshift(86) .unshift(87) .unshift(54) // [54, 87, 86] .delete(1) // [54, 86] .setSize(6) // [54, 86, undefined, undefined, undefined, undefined] .shift() .shift() // [undefined, undefined, undefined, undefined] .delete(1); // -> [undefined, undefined, undefined] expectAllUndefined(list, 3); }); // A genuine `null` value is a valid element and must round-trip as `null`, // distinct from an absent / undefined slot. it('keeps an explicitly stored null as null', () => { const list = List().setSize(32).setSize(33).set(0, null); expect(list.get(0)).toBeNull(); expect(list.get(1)).toBeUndefined(); expect(list.toArray()[0]).toBeNull(); }); }); it('can be efficiently sliced', () => { const v1 = Range(0, 2000).toList(); const v2 = v1.slice(100, -100).toList(); const v3 = v2.slice(0, Infinity); expect(v1.size).toBe(2000); expect(v2.size).toBe(1800); expect(v3.size).toBe(1800); expect(v2.first()).toBe(100); expect(v2.rest().size).toBe(1799); expect(v2.last()).toBe(1899); expect(v2.butLast().size).toBe(1799); }); [NaN, Infinity, -Infinity].forEach((zeroishValue) => { it(`treats ${zeroishValue} like zero when setting size`, () => { const v1 = List.of('a', 'b', 'c'); const v2 = v1.setSize(zeroishValue); expect(v2.size).toBe(0); }); }); // A List addresses its values through a 32-wide trie using signed 32-bit // bitwise math. Sizes/indices at or beyond 2 ** 30 used to overflow that math: // the level-raising loop spun forever, hanging an empty List and OOM-crashing // (SIGABRT) a populated one, while `setSize` silently wrapped large values. // All of these must now throw a clear, catchable RangeError. describe('rejects out-of-range sizes instead of hanging / crashing', () => { const tooBig = 2 ** 30; it('throws (does not hang) when setting a too-large index on an empty List', () => { expect(() => List().set(tooBig, 'x')).toThrow(RangeError); }); it('throws (does not OOM-crash) when setting a too-large index on a populated List', () => { const list = List(arrayOfSize(64)); expect(() => list.set(tooBig, 'x')).toThrow(RangeError); }); it('throws for a numeric-string index coming through a setIn key path', () => { const state = fromJS({ items: arrayOfSize(64) }); expect(() => state.setIn(['items', '1073741824'], 'x')).toThrow( RangeError ); }); it('throws on setSize beyond the max rather than silently truncating', () => { // Previously returned size 0 and size 5 respectively. expect(() => List([1, 2, 3]).setSize(2 ** 31)).toThrow(RangeError); expect(() => List([1, 2, 3]).setSize(2 ** 32 + 5)).toThrow(RangeError); }); it('still allows operations within the addressable range', () => { expect(List([1, 2, 3]).setSize(1500).size).toBe(1500); expect(List([1, 2, 3]).set(5, 'x').size).toBe(6); // Largest in-range size is accepted by the bounds math (sparse, no alloc). expect(List([1, 2, 3]).setSize(tooBig).size).toBe(tooBig); }); it('handles a large in-range negative index without hanging', () => { // Exercises the deep-tree origin-normalization path (the `2 ** exp` // fallback). Must terminate rather than spin forever; the existing values // are shifted to the end of the grown List. const result = List([1, 2, 3]).set(-(2 ** 29), 'x'); expect(result.size).toBe(2 ** 29); expect(result.get(result.size - 3)).toBe(1); expect(result.get(result.size - 2)).toBe(2); expect(result.get(result.size - 1)).toBe(3); }); }); it('Does not infinite loop when sliced with NaN #459', () => { const list = List([1, 2, 3, 4, 5]); const newList = list.slice(0, NaN); expect(newList.toJS()).toEqual([]); }); it('Accepts NaN for slice and concat #602', () => { const list = List().slice(0, NaN).concat(NaN); // toEqual([ NaN ]) expect(list.size).toBe(1); expect(isNaNValue(list.get(0))).toBe(true); }); it('return a new emptyList if the emptyList has been mutated #2003', () => { const emptyList = List(); const nonEmptyList = emptyList.withMutations((l) => { l.setSize(1); l.set(0, 'a'); }); expect(nonEmptyList.size).toBe(1); expect(nonEmptyList).toEqual(List.of('a')); expect(emptyList.size).toBe(0); const mutableList = emptyList.asMutable(); mutableList.setSize(1); mutableList.set(0, 'b'); expect(mutableList.size).toBe(1); expect(mutableList).toEqual(List.of('b')); expect(emptyList.size).toBe(0); expect(List().size).toBe(0); }); it('Mutating empty list with a JS API should not mutate new instances', () => { Object.assign(List(), List([1, 2])); expect(List().size).toBe(0); expect(List().toArray()).toEqual([]); }); // Note: NaN is the only value not equal to itself. The isNaN() built-in // function returns true for any non-numeric value, not just the NaN value. function isNaNValue(value: unknown): boolean { return value !== value; } describe('when slicing', () => { [NaN, -Infinity].forEach((zeroishValue) => { it(`considers a ${zeroishValue} begin argument to be zero`, () => { const v1 = List.of('a', 'b', 'c'); const v2 = v1.slice(zeroishValue, 3); expect(v2.size).toBe(3); }); it(`considers a ${zeroishValue} end argument to be zero`, () => { const v1 = List.of('a', 'b', 'c'); const v2 = v1.slice(0, zeroishValue); expect(v2.size).toBe(0); }); it(`considers ${zeroishValue} begin and end arguments to be zero`, () => { const v1 = List.of('a', 'b', 'c'); const v2 = v1.slice(zeroishValue, zeroishValue); expect(v2.size).toBe(0); }); }); }); describe('when shuffling', () => { const list = List.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); it('should work when empty', () => { expect(List().shuffle()).toStrictEqual(List()); }); it('should work with Math.random', () => { expect(list.shuffle().sort()).toStrictEqual(list); }); it('should work with a pseudo random number generator', () => { const seed = createSeed('lorem ipsum'); const random = () => seed.random(); expect(list.shuffle(random)).toStrictEqual( List.of(5, 2, 4, 7, 6, 3, 10, 1, 9, 8) ); expect(list.shuffle(random)).toStrictEqual( List.of(1, 6, 2, 3, 9, 7, 4, 10, 5, 8) ); expect(list.shuffle(random)).toStrictEqual( List.of(6, 1, 8, 10, 9, 5, 4, 7, 3, 2) ); }); }); describe('Iterator', () => { const pInt = fc.nat(100); it('iterates through List', () => { fc.assert( fc.property(pInt, pInt, (start, len) => { const l1 = Range(0, start + len).toList(); const l2: List = l1.slice(start, start + len); expect(l2.size).toBe(len); const valueIter = l2.values(); const keyIter = l2.keys(); const entryIter = l2.entries(); for (let ii = 0; ii < len; ii++) { expect(valueIter.next().value).toBe(start + ii); expect(keyIter.next().value).toBe(ii); expect(entryIter.next().value).toEqual([ii, start + ii]); } }) ); }); it('iterates through List in reverse', () => { fc.assert( fc.property(pInt, pInt, (start, len) => { const l1 = Range(0, start + len).toList(); const l2: List = l1.slice(start, start + len); const s = l2.toSeq().reverse(); // impl calls List.__iterator(REVERSE) expect(s.size).toBe(len); const valueIter = s.values(); const keyIter = s.keys(); const entryIter = s.entries(); for (let ii = 0; ii < len; ii++) { expect(valueIter.next().value).toBe(start + len - 1 - ii); expect(keyIter.next().value).toBe(ii); expect(entryIter.next().value).toEqual([ii, start + len - 1 - ii]); } }) ); }); }); }); describe('List sequence helpers', () => { it('skipWhile / skipUntil drop a leading run', () => { expect( List([1, 2, 3, 4, 1]) .skipWhile((x) => x < 3) .toArray() ).toEqual([3, 4, 1]); expect( List([1, 2, 3, 4, 1]) .skipUntil((x) => x >= 3) .toArray() ).toEqual([3, 4, 1]); }); it('takeWhile / takeUntil keep a leading run', () => { expect( List([1, 2, 3, 4, 1]) .takeWhile((x) => x < 3) .toArray() ).toEqual([1, 2]); expect( List([1, 2, 3, 4, 1]) .takeUntil((x) => x >= 3) .toArray() ).toEqual([1, 2]); }); it('skip / skipLast / take / takeLast handle 0 and out-of-range amounts', () => { const list = List([1, 2, 3]); expect(list.skip(0)).toBe(list); // amount === 0 short-circuits to `this` expect(list.skipLast(0)).toBe(list); expect(list.skip(10).toArray()).toEqual([]); expect(list.take(0).toArray()).toEqual([]); expect(list.takeLast(0).toArray()).toEqual([]); expect(list.takeLast(2).toArray()).toEqual([2, 3]); }); it('filterNot keeps entries for which the predicate is false', () => { expect( List([1, 2, 3, 4]) .filterNot((x) => x % 2 === 0) .toArray() ).toEqual([1, 3]); }); it('count() returns the size, count(pred) the matching count', () => { expect(List([1, 2, 3, 4]).count()).toBe(4); expect(List([1, 2, 3, 4]).count((x) => x > 2)).toBe(2); }); it('sortBy accepts an explicit comparator', () => { expect( List([{ id: 1 }, { id: 3 }, { id: 2 }]) .sortBy( (x) => x.id, (a, b) => b - a ) .toArray() ).toEqual([{ id: 3 }, { id: 2 }, { id: 1 }]); }); it('findLast / findLastEntry return the last match', () => { expect(List([10, 20, 30, 40]).findLast((x) => x < 30)).toBe(20); expect(List([10, 20, 30, 40]).findLastEntry((x) => x < 30)).toEqual([ 1, 20, ]); expect(List([10, 20, 30, 40]).findLast((x) => x > 40)).toBeUndefined(); }); it('findLastIndex / lastIndexOf return indices from the end, or -1', () => { expect(List([1, 2, 3, 2]).findLastIndex((x) => x === 2)).toBe(3); expect(List([1, 2, 1]).lastIndexOf(1)).toBe(2); expect(List([1, 2, 1]).lastIndexOf(9)).toBe(-1); }); it('partition splits into [non-matching, matching] and narrows by guard', () => { const [odds, evens] = List([1, 2, 3, 4]).partition((x) => x % 2 === 0); expect(odds.toArray()).toEqual([1, 3]); expect(evens.toArray()).toEqual([2, 4]); const [others, strings] = List([1, 'a', 2]).partition( (x): x is string => typeof x === 'string' ); expect(strings.toArray()).toEqual(['a']); expect(others.toArray()).toEqual([1, 2]); }); it('predicate methods honour the `context` argument', () => { const ctx = { max: 2 }; expect( List([1, 2, 3]) .takeWhile(function (this: typeof ctx, x) { return x <= this.max; }, ctx) .toArray() ).toEqual([1, 2]); }); }); immutable-js-immutable-js-6a01d72/__tests__/ListJS.js000066400000000000000000000030531522056416100224670ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List } from 'immutable'; const NON_NUMBERS = { array: ['not', 'a', 'number'], NaN: NaN, object: { not: 'a number' }, string: 'not a number', }; describe('List', () => { describe('setSize()', () => { Object.keys(NON_NUMBERS).forEach((type) => { const nonNumber = NON_NUMBERS[type]; it(`considers a size argument of type '${type}' to be zero`, () => { const v1 = List.of(1, 2, 3); const v2 = v1.setSize(nonNumber); expect(v2.size).toBe(0); }); }); }); describe('slice()', () => { // Mimic the behavior of Array::slice() // http://www.ecma-international.org/ecma-262/6.0/#sec-array.prototype.slice Object.keys(NON_NUMBERS).forEach((type) => { const nonNumber = NON_NUMBERS[type]; it(`considers a begin argument of type '${type}' to be zero`, () => { const v1 = List.of('a', 'b', 'c'); const v2 = v1.slice(nonNumber, 2); expect(v2.size).toBe(2); expect(v2.first()).toBe('a'); expect(v2.rest().size).toBe(1); expect(v2.last()).toBe('b'); expect(v2.butLast().size).toBe(1); }); it(`considers an end argument of type '${type}' to be zero`, () => { const v1 = List.of('a', 'b', 'c'); const v2 = v1.slice(0, nonNumber); expect(v2.size).toBe(0); expect(v2.first()).toBe(undefined); expect(v2.rest().size).toBe(0); expect(v2.last()).toBe(undefined); expect(v2.butLast().size).toBe(0); }); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/Map.collision.ts000066400000000000000000000202131522056416100240350ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Map, Set, fromJS, hash, is } from 'immutable'; /** * Generates `2 ** rounds` distinct strings that all share the same * `Immutable.hash()`, by concatenating the classic "Aa"/"BB" collision blocks * (both equal `65 * 31 + 97 === 66 * 31 + 66 === 2112` under the JVM-style * `31 * h + c` string hash). Inserting these into a Map forces them all into a * single HashCollisionNode — the hash-flooding scenario this code guards. */ function collisionKeys(rounds: number): Array { let keys = ['']; for (let i = 0; i < rounds; i++) { const next: Array = []; for (const k of keys) { next.push(k + 'Aa'); next.push(k + 'BB'); } keys = next; } return keys; } describe('Map hash collisions', () => { it('the generated keys really do collide (test is meaningful)', () => { const keys = collisionKeys(8); // 256 keys const h = hash(keys[0]!); expect(keys.every((k) => hash(k) === h)).toBe(true); expect(new globalThis.Set(keys).size).toBe(keys.length); // all distinct }); it('does not change the public, deterministic hash() of strings', () => { // The secondary collision hash is internal and seeded; it must not leak // into the public hash(). expect(hash('a')).toBe(97); expect(hash('immutable-js')).toBe(510203252); }); describe('correctness with thousands of colliding keys', () => { const keys = collisionKeys(11); // 2048 keys, well above the index threshold it('stores and retrieves every colliding key (built from an object)', () => { const obj: Record = {}; keys.forEach((k, i) => (obj[k] = i)); const map = Map(obj); expect(map.size).toBe(keys.length); expect(keys.every((k, i) => map.get(k) === i)).toBe(true); expect(map.get('not-a-colliding-key', 'default')).toBe('default'); expect(map.has(keys[0]!)).toBe(true); expect(map.has('not-a-colliding-key')).toBe(false); }); it('behaves the same whether built transiently or persistently', () => { const transient = Map().withMutations((m) => { keys.forEach((k, i) => m.set(k, i)); }); let persistent = Map(); keys.forEach((k, i) => (persistent = persistent.set(k, i))); expect(transient.size).toBe(keys.length); expect(persistent.size).toBe(keys.length); expect(is(transient, persistent)).toBe(true); expect(keys.every((k, i) => persistent.get(k) === i)).toBe(true); }); it('overwrites an existing colliding key without changing size', () => { const map = Map(keys.map((k, i) => [k, i])); const updated = map.set(keys[100]!, 9999); expect(updated.get(keys[100]!)).toBe(9999); expect(updated.size).toBe(map.size); // original is untouched (persistence) expect(map.get(keys[100]!)).toBe(100); }); it('removes colliding keys and keeps the rest retrievable', () => { const map = Map(keys.map((k, i) => [k, i])); const removed = map.remove(keys[50]!).remove(keys[51]!).remove(keys[52]!); expect(removed.size).toBe(map.size - 3); expect(removed.get(keys[50]!, 'gone')).toBe('gone'); expect(removed.get(keys[51]!, 'gone')).toBe('gone'); // a previously-removed-around key is still correct (index stayed valid) expect(removed.get(keys[53]!)).toBe(53); expect(removed.get(keys[0]!)).toBe(0); expect(removed.get(keys[keys.length - 1]!)).toBe(keys.length - 1); }); it('iterates over every colliding entry exactly once', () => { const map = Map(keys.map((k, i) => [k, i])); const seen = new globalThis.Set(); map.forEach((_v, k) => seen.add(k)); expect(seen.size).toBe(keys.length); expect(keys.every((k) => seen.has(k))).toBe(true); expect(map.keySeq().toArray().sort()).toEqual([...keys].sort()); expect(map.entrySeq().count()).toBe(keys.length); }); it('keeps equals() and hashCode() consistent', () => { const a = Map(keys.map((k, i) => [k, i])); const b = Map(keys.map((k, i) => [k, i])); expect(is(a, b)).toBe(true); expect(a.hashCode()).toBe(b.hashCode()); const c = a.set(keys[0]!, -1); expect(is(a, c)).toBe(false); }); }); it('mixes colliding and normally-distributed keys', () => { const keys = collisionKeys(10); // 1024 colliding const map = Map(keys.map((k, i) => [k, i])) .set('alpha', 'a') .set('beta', 'b'); expect(map.get('alpha')).toBe('a'); expect(map.get('beta')).toBe('b'); expect(map.get(keys[7]!)).toBe(7); expect(map.size).toBe(keys.length + 2); }); it('is correct just below and just above the index threshold', () => { // 8 keys (below threshold 16) then 64 keys (above) — both must be correct. for (const rounds of [3, 6]) { const keys = collisionKeys(rounds); let map = Map(); keys.forEach((k, i) => (map = map.set(k, i))); expect(map.size).toBe(keys.length); expect(keys.every((k, i) => map.get(k) === i)).toBe(true); // remove half, the rest must remain correct let trimmed = map; keys .slice(0, keys.length / 2) .forEach((k) => (trimmed = trimmed.remove(k))); expect(trimmed.size).toBe(keys.length / 2); expect( keys .slice(keys.length / 2) .every((k, i) => trimmed.get(k) === i + keys.length / 2) ).toBe(true); } }); it('merge() and mergeDeep() work with colliding keys', () => { const keys = collisionKeys(11); // 2048 colliding const userObj: Record = {}; keys.forEach((k, i) => (userObj[k] = i)); const merged = Map({ existing: -1 }).merge(userObj); expect(merged.get('existing')).toBe(-1); expect(merged.get(keys[123]!)).toBe(123); expect(merged.size).toBe(keys.length + 1); const deep = Map({ existing: -1 }).mergeDeep(fromJS(userObj)); expect(deep.get(keys[123]!)).toBe(123); expect(deep.size).toBe(keys.length + 1); }); it('Set (backed by Map) handles colliding values', () => { const keys = collisionKeys(11); // 2048 colliding const set = Set(keys); expect(set.size).toBe(keys.length); expect(keys.every((k) => set.has(k))).toBe(true); expect(set.has('not-in-set')).toBe(false); const without = set.remove(keys[10]!); expect(without.has(keys[10]!)).toBe(false); expect(without.size).toBe(keys.length - 1); }); it('handles value-object keys that all share one hashCode', () => { // Exercises the non-string fallback in hashCollisionKey: equality is still // decided by is()/equals(), never by the (constant) secondary hash. class Collider { constructor(readonly id: number) {} equals(other: unknown): boolean { return other instanceof Collider && other.id === this.id; } hashCode(): number { return 7; // force every instance into the same collision node } } const items = Array.from({ length: 50 }, (_, i) => new Collider(i)); let map = Map(); items.forEach((c, i) => (map = map.set(c, i))); expect(map.size).toBe(items.length); expect(items.every((c, i) => map.get(new Collider(i)) === i)).toBe(true); expect(map.get(new Collider(999), 'absent')).toBe('absent'); const removed = map.remove(new Collider(25)); expect(removed.size).toBe(items.length - 1); expect(removed.get(new Collider(25), 'gone')).toBe('gone'); expect(removed.get(new Collider(26))).toBe(26); }); it('does not degrade for a large flood of colliding keys', () => { // A regression guard: with the linear scan this is ~O(n²) and takes seconds // for 16384 keys; with the seeded index it is ~linear and near-instant. const keys = collisionKeys(14); // 16384 colliding keys const obj: Record = {}; keys.forEach((k, i) => (obj[k] = i)); const map = Map(obj); expect(map.size).toBe(keys.length); // spot-check retrieval across the whole bucket expect(map.get(keys[0]!)).toBe(0); expect(map.get(keys[keys.length - 1]!)).toBe(keys.length - 1); expect(map.get(keys[keys.length >> 1]!)).toBe(keys.length >> 1); }); }); immutable-js-immutable-js-6a01d72/__tests__/Map.ts000066400000000000000000000433411522056416100220520ustar00rootroot00000000000000import { describe, expect, it, jest } from '@jest/globals'; import fc from 'fast-check'; import { List, Map, OrderedMap, Range, Record, Seq, fromJS, is, } from 'immutable'; describe('Map', () => { it('converts from object', () => { const m = Map({ a: 'A', b: 'B', c: 'C' }); expect(m.size).toBe(3); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); }); it('converts from JS (global) Map', () => { const m = Map( new global.Map([ ['a', 'A'], ['b', 'B'], ['c', 'C'], ]) ); expect(Map.isMap(m)).toBe(true); expect(m.size).toBe(3); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); }); it('constructor provides initial values', () => { const m = Map({ a: 'A', b: 'B', c: 'C' }); expect(m.size).toBe(3); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); }); it('constructor provides initial values as array of entries', () => { const m = Map([ ['a', 'A'], ['b', 'B'], ['c', 'C'], ]); expect(m.size).toBe(3); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); }); it('constructor provides initial values as sequence', () => { const s = Seq({ a: 'A', b: 'B', c: 'C' }); const m = Map(s); expect(m.size).toBe(3); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); }); it('constructor provides initial values as list of lists', () => { const l = List([List(['a', 'A']), List(['b', 'B']), List(['c', 'C'])]); const m = Map(l); expect(m.size).toBe(3); // @ts-expect-error -- Not supported by typescript since 4.0.0 https://github.com/immutable-js/immutable-js/pull/1626 expect(m.get('a')).toBe('A'); // @ts-expect-error -- Not supported by typescript since 4.0.0 https://github.com/immutable-js/immutable-js/pull/1626 expect(m.get('b')).toBe('B'); // @ts-expect-error -- Not supported by typescript since 4.0.0 https://github.com/immutable-js/immutable-js/pull/1626 expect(m.get('c')).toBe('C'); }); it('constructor is identity when provided map', () => { const m1 = Map({ a: 'A', b: 'B', c: 'C' }); const m2 = Map(m1); expect(m2).toBe(m1); }); it('does not accept a scalar', () => { expect(() => { // TODO: should expect error Map(3); }).toThrow( 'Expected Array or collection object of [k, v] entries, or keyed object: 3' ); }); it('does not accept strings (collection, but scalar)', () => { expect(() => { // @ts-expect-error -- constructor does not accept strings, this is expected to throw Map('abc'); }).toThrow(); }); it('does not accept non-entries array', () => { expect(() => { // @ts-expect-error -- not an array of entries, this is expected to throw Map([1, 2, 3]); }).toThrow('Expected [K, V] tuple: 1'); }); it('accepts non-collection array-like objects as keyed collections', () => { const m = Map({ length: 3, 1: 'one' }); expect(m.get('length')).toBe(3); // @ts-expect-error -- type error, but the API is tolerante expect(m.get('1')).toBe('one'); expect(m.toJS()).toEqual({ length: 3, 1: 'one' }); }); it('converts back to JS object', () => { const m = Map({ a: 'A', b: 'B', c: 'C' }); expect(m.toObject()).toEqual({ a: 'A', b: 'B', c: 'C' }); }); it('iterates values', () => { const m = Map({ a: 'A', b: 'B', c: 'C' }); const iterator = jest.fn(); m.forEach(iterator); expect(iterator.mock.calls).toEqual([ ['A', 'a', m], ['B', 'b', m], ['C', 'c', m], ]); }); it('has the same iterator function for entries', () => { const m = Map({ a: 'A', b: 'B', c: 'C' }); expect(m[Symbol.iterator]).toBe(m.entries); }); it('merges two maps', () => { const m1 = Map({ a: 'A', b: 'B', c: 'C' }); const m2 = Map({ wow: 'OO', d: 'DD', b: 'BB' }); expect(m2.toObject()).toEqual({ wow: 'OO', d: 'DD', b: 'BB' }); const m3 = m1.merge(m2); expect(m3.toObject()).toEqual({ a: 'A', b: 'BB', c: 'C', wow: 'OO', d: 'DD', }); }); it('concatenates two maps (alias for merge)', () => { const m1 = Map({ a: 'A', b: 'B', c: 'C' }); const m2 = Map({ wow: 'OO', d: 'DD', b: 'BB' }); expect(m2.toObject()).toEqual({ wow: 'OO', d: 'DD', b: 'BB' }); const m3 = m1.concat(m2); expect(m3.toObject()).toEqual({ a: 'A', b: 'BB', c: 'C', wow: 'OO', d: 'DD', }); }); it('accepts null as a key', () => { const m1 = Map(); const m2 = m1.set(null, 'null'); const m3 = m2.remove(null); expect(m1.size).toBe(0); expect(m2.size).toBe(1); expect(m3.size).toBe(0); expect(m2.get(null)).toBe('null'); }); it('is persistent to sets', () => { const m1 = Map(); const m2 = m1.set('a', 'Aardvark'); const m3 = m2.set('b', 'Baboon'); const m4 = m3.set('c', 'Canary'); const m5 = m4.set('b', 'Bonobo'); expect(m1.size).toBe(0); expect(m2.size).toBe(1); expect(m3.size).toBe(2); expect(m4.size).toBe(3); expect(m5.size).toBe(3); expect(m3.get('b')).toBe('Baboon'); expect(m5.get('b')).toBe('Bonobo'); }); it('is persistent to deletes', () => { const m1 = Map(); const m2 = m1.set('a', 'Aardvark'); const m3 = m2.set('b', 'Baboon'); const m4 = m3.set('c', 'Canary'); const m5 = m4.remove('b'); expect(m1.size).toBe(0); expect(m2.size).toBe(1); expect(m3.size).toBe(2); expect(m4.size).toBe(3); expect(m5.size).toBe(2); expect(m3.has('b')).toBe(true); expect(m3.get('b')).toBe('Baboon'); expect(m5.has('b')).toBe(false); expect(m5.get('b')).toBe(undefined); expect(m5.get('c')).toBe('Canary'); }); it('deletes down to empty map', () => { fc.assert( fc.property(fc.nat(100), (size) => { let m = Range(0, size).toMap(); expect(m.size).toBe(size); for (let ii = size - 1; ii >= 0; ii--) { m = m.remove(ii); expect(m.size).toBe(ii); } expect(m).toBe(Map()); }) ); }); it('can map many items', () => { let m = Map(); for (let ii = 0; ii < 2000; ii++) { m = m.set('thing:' + ii, ii); } expect(m.size).toBe(2000); expect(m.get('thing:1234')).toBe(1234); }); it('can use weird keys', () => { const symbol = Symbol('A'); const m = Map() .set(NaN, 1) .set(Infinity, 2) .set(symbol, 'A') .set(-Infinity, 3); expect(m.get(symbol)).toBe('A'); expect(m.get(NaN)).toBe(1); expect(m.get(Infinity)).toBe(2); expect(m.get(-Infinity)).toBe(3); }); it('can map items known to hash collide', () => { // make a big map, so it hashmaps let m: Map = Range(0, 32).toMap(); m = m.set('AAA', 'letters').set(64545, 'numbers'); expect(m.size).toBe(34); expect(m.get('AAA')).toEqual('letters'); expect(m.get(64545)).toEqual('numbers'); }); it('can progressively add items known to collide', () => { // make a big map, so it hashmaps let map: Map = Range(0, 32).toMap(); map = map.set('@', '@'); map = map.set(64, 64); map = map.set(96, 96); expect(map.size).toBe(35); expect(map.get('@')).toBe('@'); expect(map.get(64)).toBe(64); expect(map.get(96)).toBe(96); }); it('maps values', () => { const m = Map({ a: 'a', b: 'b', c: 'c' }); const r = m.map((value) => value.toUpperCase()); expect(r.toObject()).toEqual({ a: 'A', b: 'B', c: 'C' }); }); it('maps keys', () => { const m = Map({ a: 'a', b: 'b', c: 'c' }); const r = m.mapKeys((key) => key.toUpperCase()); expect(r.toObject()).toEqual({ A: 'a', B: 'b', C: 'c' }); }); it('maps no-ops return the same reference', () => { const m = Map({ a: 'a', b: 'b', c: 'c' }); const r = m.map((value) => value); expect(r).toBe(m); }); it('provides unmodified original collection as 3rd iter argument', () => { const m = Map({ a: 1, b: 1 }); const r = m.map((value, key, iter) => { expect(iter).toEqual(m); return 2 * (iter.get(key) as number); }); expect(r.toObject()).toEqual({ a: 2, b: 2 }); }); it('filters values', () => { const m = Map({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }); const r = m.filter((value) => value % 2 === 1); expect(r.toObject()).toEqual({ a: 1, c: 3, e: 5 }); }); it('filterNots values', () => { const m = Map({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }); const r = m.filterNot((value) => value % 2 === 1); expect(r.toObject()).toEqual({ b: 2, d: 4, f: 6 }); }); it('partitions values', () => { const m = Map({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }); const r = m .partition((value) => value % 2 === 1) .map((part) => part.toObject()); expect(r).toEqual([ { b: 2, d: 4, f: 6 }, { a: 1, c: 3, e: 5 }, ]); }); it('derives keys', () => { const v = Map({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }); expect(v.keySeq().toArray()).toEqual(['a', 'b', 'c', 'd', 'e', 'f']); }); it('flips keys and values', () => { const v = Map({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6 }); expect(v.flip().toObject()).toEqual({ 1: 'a', 2: 'b', 3: 'c', 4: 'd', 5: 'e', 6: 'f', }); }); it('can convert to a list', () => { const m = Map({ a: 1, b: 2, c: 3 }); const v = m.toList(); const k = m.keySeq().toList(); expect(v.size).toBe(3); expect(k.size).toBe(3); // Note: Map has undefined ordering, this List may not be the same // order as the order you set into the Map. expect(v.get(1)).toBe(2); expect(k.get(1)).toBe('b'); }); it('works like an object', () => { fc.assert( fc.property(fc.object({ maxKeys: 50 }), (obj) => { let map = Map(obj); Object.keys(obj).forEach((key) => { expect(map.get(key)).toBe(obj[key]); expect(map.has(key)).toBe(true); }); Object.keys(obj).forEach((key) => { expect(map.get(key)).toBe(obj[key]); expect(map.has(key)).toBe(true); map = map.remove(key); expect(map.get(key)).toBe(undefined); expect(map.has(key)).toBe(false); }); }) ); }); it('sets', () => { fc.assert( fc.property(fc.nat(100), (len) => { let map = Map(); for (let ii = 0; ii < len; ii++) { expect(map.size).toBe(ii); map = map.set('' + ii, ii); } expect(map.size).toBe(len); expect(is(map.toSet(), Range(0, len).toSet())).toBe(true); }) ); }); it('has and get', () => { fc.assert( fc.property(fc.nat(100), (len) => { const map = Range(0, len) .toKeyedSeq() .mapKeys((x) => '' + x) .toMap(); for (let ii = 0; ii < len; ii++) { expect(map.get('' + ii)).toBe(ii); expect(map.has('' + ii)).toBe(true); } }) ); }); it('deletes', () => { fc.assert( fc.property(fc.nat(100), (len) => { let map = Range(0, len).toMap(); for (let ii = 0; ii < len; ii++) { expect(map.size).toBe(len - ii); map = map.remove(ii); } expect(map.size).toBe(0); expect(map.toObject()).toEqual({}); }) ); }); it('deletes from transient', () => { fc.assert( fc.property(fc.nat(100), (len) => { const map = Range(0, len).toMap().asMutable(); for (let ii = 0; ii < len; ii++) { expect(map.size).toBe(len - ii); map.remove(ii); } expect(map.size).toBe(0); expect(map.toObject()).toEqual({}); }) ); }); it('iterates through all entries', () => { fc.assert( fc.property(fc.nat(100), (len) => { const v = Range(0, len).toMap(); const a = v.toArray(); const iter = v.entries(); for (let ii = 0; ii < len; ii++) { delete a[iter.next().value[0]]; } expect(a).toEqual(new Array(len)); }) ); }); it('allows chained mutations', () => { const m1 = Map(); const m2 = m1.set('a', 1); const m3 = m2.withMutations((m) => m.set('b', 2).set('c', 3)); const m4 = m3.set('d', 4); expect(m1.toObject()).toEqual({}); expect(m2.toObject()).toEqual({ a: 1 }); expect(m3.toObject()).toEqual({ a: 1, b: 2, c: 3 }); expect(m4.toObject()).toEqual({ a: 1, b: 2, c: 3, d: 4 }); }); it('chained mutations does not result in new empty map instance', () => { const v1 = Map<{ x?: number; y?: number }>({ x: 1 }); const v2 = v1.withMutations((v) => v.set('y', 2).delete('x').delete('y')); expect(v2).toBe(Map()); }); it('expresses value equality with unordered sequences', () => { const m1 = Map({ A: 1, B: 2, C: 3 }); const m2 = Map({ C: 3, B: 2, A: 1 }); expect(is(m1, m2)).toBe(true); }); it('does not equal Record with same values', () => { const m1 = Map({ A: 1, B: 2, C: 3 }); const m2 = Record({ A: 1, B: 2, C: 3 }); expect(is(m1, m2)).toBe(false); }); it('deletes all the provided keys', () => { const NOT_SET = undefined; const m1 = Map({ A: 1, B: 2, C: 3 }); const m2 = m1.deleteAll(['A', 'B']); expect(m2.get('A')).toBe(NOT_SET); expect(m2.get('B')).toBe(NOT_SET); expect(m2.get('C')).toBe(3); expect(m2.size).toBe(1); }); it('remains unchanged when no keys are provided', () => { const m1 = Map({ A: 1, B: 2, C: 3 }); const m2 = m1.deleteAll([]); expect(m1).toBe(m2); }); it('uses toString on keys and values', () => { class A extends Record({ x: null as number | null }) { override toString() { return this.x; } } const r = new A({ x: 2 }); const map = Map([[r, r]]); expect(map.toString()).toEqual('Map { 2: 2 }'); }); it('supports Symbols as tuple keys', () => { const a = Symbol('a'); const b = Symbol('b'); const c = Symbol('c'); const m = Map([ [a, 'a'], [b, 'b'], [c, 'c'], ]); expect(m.size).toBe(3); expect(m.get(a)).toBe('a'); expect(m.get(b)).toBe('b'); expect(m.get(c)).toBe('c'); }); it('supports Symbols as object constructor keys', () => { const a = Symbol.for('a'); const b = Symbol('b'); const c = Symbol('c'); const m = Map({ [a]: 'a', [b]: 'b', [c]: 'c', }); expect(m.size).toBe(3); expect(m.get(a)).toBe('a'); expect(m.get(b)).toBe('b'); expect(m.get(c)).toBe('c'); const m2 = fromJS({ [a]: 'a' }) as Map; expect(m2.size).toBe(1); expect(m2.get(a)).toBe('a'); }); it('Symbol keys are unique', () => { const a = Symbol('FooBar'); const b = Symbol('FooBar'); const m = Map([ [a, 'FizBuz'], [b, 'FooBar'], ]); expect(m.size).toBe(2); expect(m.get(a)).toBe('FizBuz'); expect(m.get(b)).toBe('FooBar'); }); it('mergeDeep with tuple Symbol keys', () => { const a = Symbol('a'); const b = Symbol('b'); const c = Symbol('c'); const d = Symbol('d'); const e = Symbol('e'); const f = Symbol('f'); const g = Symbol('g'); // Note the use of nested Map constructors, Map() does not do a // deep conversion! const m1 = Map([ [ a, Map([ [ b, Map([ [c, 1], [d, 2], ]), ], ]), ], ]); const m2 = Map([ [ a, Map([ [ b, Map([ [c, 10], [e, 20], [f, 30], [g, 40], ]), ], ]), ], ]); const merged = m1.mergeDeep(m2); expect(merged).toEqual( Map([ [ a, Map([ [ b, Map([ [c, 10], [d, 2], [e, 20], [f, 30], [g, 40], ]), ], ]), ], ]) ); }); it('toJS / toObject are not sensible to prototype pollution', () => { type User = { user: string; admin?: boolean }; // @ts-expect-error -- intentionally setting __proto__ to test prototype pollution const m = Map({ user: 'alice' }).set('__proto__', { admin: true }); expect(m.toObject().admin).toBeUndefined(); expect(m.toJS().admin).toBeUndefined(); }); }); describe('Map sequence helpers', () => { it('first / last return values (base, keyed) or the notSetValue', () => { expect(Map({ a: 1, b: 2 }).first()).toBe(1); expect(Map({ a: 1, b: 2 }).last()).toBe(2); expect(Map().first()).toBeUndefined(); expect(Map().last('none')).toBe('none'); }); it('filterNot keeps entries for which the predicate is false', () => { expect( Map({ a: 1, b: 2, c: 3 }) .filterNot((v) => v % 2 === 0) .toObject() ).toEqual({ a: 1, c: 3 }); }); it('skipWhile / takeWhile operate in iteration order', () => { expect( Map({ a: 1, b: 2, c: 3 }) .skipWhile((v) => v < 2) .toObject() ).toEqual({ b: 2, c: 3 }); expect( Map({ a: 1, b: 2, c: 3 }) .takeWhile((v) => v < 3) .toObject() ).toEqual({ a: 1, b: 2 }); }); it('findLastKey / lastKeyOf return the last matching key', () => { expect(Map({ a: 1, b: 2, c: 1 }).findLastKey((v) => v === 1)).toBe('c'); expect( OrderedMap([ ['a', 1], ['b', 1], ['c', 2], ]).lastKeyOf(1) ).toBe('b'); }); it('flip swaps keys and values', () => { expect(Map({ a: 1, b: 2 }).flip().toObject()).toEqual({ 1: 'a', 2: 'b' }); }); }); immutable-js-immutable-js-6a01d72/__tests__/MultiRequire.js000066400000000000000000000050131522056416100237440ustar00rootroot00000000000000import { describe, expect, it, jest } from '@jest/globals'; import * as Immutable1 from '../src/Immutable'; jest.resetModules(); const Immutable2 = jest.requireActual('../src/Immutable'); describe('MultiRequire', () => { it('might require two different instances of Immutable', () => { expect(Immutable1).not.toBe(Immutable2); expect(Immutable1.Map({ a: 1 }).toJS()).toEqual({ a: 1 }); expect(Immutable2.Map({ a: 1 }).toJS()).toEqual({ a: 1 }); }); it('detects sequences', () => { const x = Immutable1.Map({ a: 1 }); const y = Immutable2.Map({ a: 1 }); expect(Immutable1.isCollection(y)).toBe(true); expect(Immutable2.isCollection(x)).toBe(true); }); it('detects records', () => { const R1 = Immutable1.Record({ a: 1 }); const R2 = Immutable2.Record({ a: 1 }); expect(Immutable1.Record.isRecord(R2())).toBe(true); expect(Immutable2.Record.isRecord(R1())).toBe(true); }); it('converts to JS when inter-nested', () => { const deep = Immutable1.Map({ a: 1, b: 2, c: Immutable2.Map({ x: 3, y: 4, z: Immutable1.Map(), }), }); expect(deep.toJS()).toEqual({ a: 1, b: 2, c: { x: 3, y: 4, z: {}, }, }); }); it('compares for equality', () => { const x = Immutable1.Map({ a: 1 }); const y = Immutable2.Map({ a: 1 }); expect(Immutable1.is(x, y)).toBe(true); expect(Immutable2.is(x, y)).toBe(true); }); it('flattens nested values', () => { const nested = Immutable1.List( Immutable2.List(Immutable1.List(Immutable2.List.of(1, 2))) ); expect(nested.flatten().toJS()).toEqual([1, 2]); }); it('detects types', () => { let c1 = Immutable1.Map(); let c2 = Immutable2.Map(); expect(Immutable1.Map.isMap(c2)).toBe(true); expect(Immutable2.Map.isMap(c1)).toBe(true); c1 = Immutable1.OrderedMap(); c2 = Immutable2.OrderedMap(); expect(Immutable1.OrderedMap.isOrderedMap(c2)).toBe(true); expect(Immutable2.OrderedMap.isOrderedMap(c1)).toBe(true); c1 = Immutable1.List(); c2 = Immutable2.List(); expect(Immutable1.List.isList(c2)).toBe(true); expect(Immutable2.List.isList(c1)).toBe(true); c1 = Immutable1.Stack(); c2 = Immutable2.Stack(); expect(Immutable1.Stack.isStack(c2)).toBe(true); expect(Immutable2.Stack.isStack(c1)).toBe(true); c1 = Immutable1.Set(); c2 = Immutable2.Set(); expect(Immutable1.Set.isSet(c2)).toBe(true); expect(Immutable2.Set.isSet(c1)).toBe(true); }); }); immutable-js-immutable-js-6a01d72/__tests__/ObjectSeq.ts000066400000000000000000000033071522056416100232120ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Seq } from 'immutable'; describe('ObjectSequence', () => { it('maps', () => { const i = Seq({ a: 'A', b: 'B', c: 'C' }); const m = i.map((x) => x + x).toObject(); expect(m).toEqual({ a: 'AA', b: 'BB', c: 'CC' }); }); it('reduces', () => { const i = Seq({ a: 'A', b: 'B', c: 'C' }); const r = i.reduce((acc, x) => acc + x, ''); expect(r).toEqual('ABC'); }); it('extracts keys', () => { const i = Seq({ a: 'A', b: 'B', c: 'C' }); const k = i.keySeq().toArray(); expect(k).toEqual(['a', 'b', 'c']); }); it('is reversable', () => { const i = Seq({ a: 'A', b: 'B', c: 'C' }); const k = i.reverse().toArray(); expect(k).toEqual([ ['c', 'C'], ['b', 'B'], ['a', 'A'], ]); }); it('is double reversable', () => { const i = Seq({ a: 'A', b: 'B', c: 'C' }); const k = i.reverse().reverse().toArray(); expect(k).toEqual([ ['a', 'A'], ['b', 'B'], ['c', 'C'], ]); }); it('can be iterated', () => { const obj = { a: 1, b: 2, c: 3 }; const seq = Seq(obj); const entries = seq.entries(); expect(entries.next()).toEqual({ value: ['a', 1], done: false }); expect(entries.next()).toEqual({ value: ['b', 2], done: false }); expect(entries.next()).toEqual({ value: ['c', 3], done: false }); expect(entries.next()).toEqual({ value: undefined, done: true }); }); it('cannot be mutated after calling toObject', () => { const seq = Seq({ a: 1, b: 2, c: 3 }); const obj = seq.toObject(); obj.c = 10; const seq2 = Seq(obj); expect(seq.get('c')).toEqual(3); expect(seq2.get('c')).toEqual(10); }); }); immutable-js-immutable-js-6a01d72/__tests__/OrderedMap.ts000066400000000000000000000100561522056416100233540ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { OrderedMap, Range, Seq } from 'immutable'; describe('OrderedMap', () => { it('converts from object', () => { const m = OrderedMap({ c: 'C', b: 'B', a: 'A' }); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); expect(m.toArray()).toEqual([ ['c', 'C'], ['b', 'B'], ['a', 'A'], ]); }); it('constructor provides initial values', () => { const m = OrderedMap({ a: 'A', b: 'B', c: 'C' }); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); expect(m.size).toBe(3); expect(m.toArray()).toEqual([ ['a', 'A'], ['b', 'B'], ['c', 'C'], ]); }); it('provides initial values in a mixed order', () => { const m = OrderedMap({ c: 'C', b: 'B', a: 'A' }); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); expect(m.size).toBe(3); expect(m.toArray()).toEqual([ ['c', 'C'], ['b', 'B'], ['a', 'A'], ]); }); it('constructor accepts sequences', () => { const s = Seq({ c: 'C', b: 'B', a: 'A' }); const m = OrderedMap(s); expect(m.get('a')).toBe('A'); expect(m.get('b')).toBe('B'); expect(m.get('c')).toBe('C'); expect(m.size).toBe(3); expect(m.toArray()).toEqual([ ['c', 'C'], ['b', 'B'], ['a', 'A'], ]); }); it('maintains order when new keys are set', () => { const m = OrderedMap() .set('A', 'aardvark') .set('Z', 'zebra') .set('A', 'antelope'); expect(m.size).toBe(2); expect(m.toArray()).toEqual([ ['A', 'antelope'], ['Z', 'zebra'], ]); }); it('resets order when a keys is deleted', () => { const m = OrderedMap() .set('A', 'aardvark') .set('Z', 'zebra') .remove('A') .set('A', 'antelope'); expect(m.size).toBe(2); expect(m.toArray()).toEqual([ ['Z', 'zebra'], ['A', 'antelope'], ]); }); it('removes correctly', () => { const m = OrderedMap({ A: 'aardvark', Z: 'zebra', }).remove('A'); expect(m.size).toBe(1); expect(m.get('A')).toBe(undefined); expect(m.get('Z')).toBe('zebra'); }); it('respects order for equality', () => { const m1 = OrderedMap().set('A', 'aardvark').set('Z', 'zebra'); const m2 = OrderedMap().set('Z', 'zebra').set('A', 'aardvark'); expect(m1.equals(m2)).toBe(false); expect(m1.equals(m2.reverse())).toBe(true); }); it('respects order when merging', () => { const m1 = OrderedMap({ A: 'apple', B: 'banana', C: 'coconut' }); const m2 = OrderedMap({ C: 'chocolate', B: 'butter', D: 'donut' }); expect(m1.merge(m2).entrySeq().toArray()).toEqual([ ['A', 'apple'], ['B', 'butter'], ['C', 'chocolate'], ['D', 'donut'], ]); expect(m2.merge(m1).entrySeq().toArray()).toEqual([ ['C', 'coconut'], ['B', 'banana'], ['D', 'donut'], ['A', 'apple'], ]); }); it('performs deleteAll correctly after resizing internal list', () => { // See condition for resizing internal list here: // https://github.com/immutable-js/immutable-js/blob/91c7c1e82ec616804768f968cc585565e855c8fd/src/OrderedMap.js#L138 // Create OrderedMap greater than or equal to SIZE (currently 32) const SIZE = 32; let map = OrderedMap(Range(0, SIZE).map((key) => [key, 0])); // Delete half of the keys so that internal list is twice the size of internal map const keysToDelete = Range(0, SIZE / 2); map = map.deleteAll(keysToDelete); // Delete one more key to trigger resizing map = map.deleteAll([SIZE / 2]); expect(map.size).toBe(SIZE / 2 - 1); }); it('hashCode should return the same value if the values are the same', () => { const m1 = OrderedMap({ b: 'b' }); const m2 = OrderedMap({ a: 'a', b: 'b' }).remove('a'); const m3 = OrderedMap({ b: 'b' }).remove('b').set('b', 'b'); expect(m1.hashCode()).toEqual(m2.hashCode()); expect(m1.hashCode()).toEqual(m3.hashCode()); }); }); immutable-js-immutable-js-6a01d72/__tests__/OrderedSet.ts000066400000000000000000000105371522056416100233760ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Map, OrderedSet } from 'immutable'; describe('OrderedSet', () => { it('provides initial values in a mixed order', () => { const s = OrderedSet.of('C', 'B', 'A'); expect(s.has('A')).toBe(true); expect(s.has('B')).toBe(true); expect(s.has('C')).toBe(true); expect(s.size).toBe(3); expect(s.toArray()).toEqual(['C', 'B', 'A']); }); it('maintains order when new values are added', () => { const s = OrderedSet().add('A').add('Z').add('A'); expect(s.size).toBe(2); expect(s.toArray()).toEqual(['A', 'Z']); }); it('resets order when a value is deleted', () => { const s = OrderedSet().add('A').add('Z').remove('A').add('A'); expect(s.size).toBe(2); expect(s.toArray()).toEqual(['Z', 'A']); }); it('removes correctly', () => { const s = OrderedSet(['A', 'Z']).remove('A'); expect(s.size).toBe(1); expect(s.has('A')).toBe(false); expect(s.has('Z')).toBe(true); }); it('respects order for equality', () => { const s1 = OrderedSet.of('A', 'Z'); const s2 = OrderedSet.of('Z', 'A'); expect(s1.equals(s2)).toBe(false); expect(s1.equals(s2.reverse())).toBe(true); }); it('respects order when unioning', () => { const s1 = OrderedSet.of('A', 'B', 'C'); const s2 = OrderedSet.of('C', 'B', 'D'); expect(s1.union(s2).toArray()).toEqual(['A', 'B', 'C', 'D']); expect(s2.union(s1).toArray()).toEqual(['C', 'B', 'D', 'A']); }); it('can be zipped', () => { const s1 = OrderedSet.of('A', 'B', 'C'); const s2 = OrderedSet.of('C', 'B', 'D'); expect(s1.zip(s2).toArray()).toEqual([ ['A', 'C'], ['B', 'B'], ['C', 'D'], ]); expect(s1.zipWith((c1, c2) => c1 + c2, s2).toArray()).toEqual([ 'AC', 'BB', 'CD', ]); }); /** * @see https://github.com/immutable-js/immutable-js/issues/1716 */ it('handles `subtract` when Set contains >=32 elements', () => { const fillArray = (nb: number) => Array(nb) .fill(1) .map((el, i) => i + 1); const capacity = 32; // items from keys 0 to 31 and values 1 to 32 const defaultItems = fillArray(capacity); const allItems = OrderedSet(defaultItems); const partialCapacity = Math.ceil(capacity / 2) + 1; const someOfThem = fillArray(partialCapacity); expect(someOfThem.length).toBe(17); const existingItems = OrderedSet(someOfThem).intersect(allItems); expect(allItems.subtract(existingItems).size).toBe(15); expect(allItems.subtract(existingItems).size + someOfThem.length).toBe(32); }); /** * @see https://github.com/immutable-js/immutable-js/issues/1603 */ it('handles consecutive `subtract` invocations', () => { let a = OrderedSet(); let b = OrderedSet(); let c; let d; // Set a to 0-45 for (let i = 0; i < 46; i++) { a = a.add(i); } // Set b to 0-24 for (let i = 0; i < 25; i++) { b = b.add(i); } // Set c to 0-23 // eslint-disable-next-line prefer-const c = b.butLast(); // Set d to 0-22 // eslint-disable-next-line prefer-const d = c.butLast(); // Internal list resizing happens on the final `subtract` when subtracting d from a const aNotB = a.subtract(b); const aNotC = a.subtract(c); const aNotD = a.subtract(d); expect(aNotB.size).toBe(21); expect(aNotC.size).toBe(22); expect(aNotD.size).toBe(23); }); it('keeps the Set ordered when updating a value with .map()', () => { const first = Map({ id: 1, valid: true }); const second = Map({ id: 2, valid: true }); const third = Map({ id: 3, valid: true }); const initial = OrderedSet([first, second, third]); const out = initial.map((t) => { if (t.get('id') === 2) { return t.set('valid', false); } return t; }); const expected = OrderedSet([ Map({ id: 1, valid: true }), Map({ id: 2, valid: false }), Map({ id: 3, valid: true }), ]); expect(out).toEqual(expected); expect(out.has(first)).toBe(true); expect(out.has(second)).toBe(false); expect(out.has(third)).toBe(true); }); it('hashCode should return the same value if the values are the same', () => { const set1 = OrderedSet(['hello']); const set2 = OrderedSet(['goodbye', 'hello']).remove('goodbye'); expect(set1.hashCode()).toBe(set2.hashCode()); }); }); immutable-js-immutable-js-6a01d72/__tests__/Predicates.ts000066400000000000000000000031251522056416100234140ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, Set, Stack, is, isImmutable, isValueObject, } from 'immutable'; describe('isImmutable', () => { it('behaves as advertised', () => { expect(isImmutable([])).toBe(false); expect(isImmutable({})).toBe(false); expect(isImmutable(Map())).toBe(true); expect(isImmutable(List())).toBe(true); expect(isImmutable(Set())).toBe(true); expect(isImmutable(Stack())).toBe(true); expect(isImmutable(Map().asMutable())).toBe(true); }); }); describe('isValueObject', () => { it('behaves as advertised', () => { expect(isValueObject(null)).toBe(false); expect(isValueObject(123)).toBe(false); expect(isValueObject('abc')).toBe(false); expect(isValueObject([])).toBe(false); expect(isValueObject({})).toBe(false); expect(isValueObject(Map())).toBe(true); expect(isValueObject(List())).toBe(true); expect(isValueObject(Set())).toBe(true); expect(isValueObject(Stack())).toBe(true); expect(isValueObject(Map().asMutable())).toBe(true); }); it('works on custom types', () => { class MyValueType { v: number; constructor(val: number) { this.v = val; } equals(other: MyValueType) { return Boolean(other && this.v === other.v); } hashCode() { return this.v; } } expect(isValueObject(new MyValueType(123))).toBe(true); expect(is(new MyValueType(123), new MyValueType(123))).toBe(true); expect(Set().add(new MyValueType(123)).add(new MyValueType(123)).size).toBe( 1 ); }); }); immutable-js-immutable-js-6a01d72/__tests__/Range.ts000066400000000000000000000154411522056416100223710ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { Range } from 'immutable'; describe('Range', () => { it('fixed range', () => { const v = Range(0, 3); expect(v.size).toBe(3); expect(v.first()).toBe(0); expect(v.rest().toArray()).toEqual([1, 2]); expect(v.last()).toBe(2); expect(v.butLast().toArray()).toEqual([0, 1]); expect(v.toArray()).toEqual([0, 1, 2]); }); it('stepped range', () => { const v = Range(1, 10, 3); expect(v.size).toBe(3); expect(v.first()).toBe(1); expect(v.rest().toArray()).toEqual([4, 7]); expect(v.last()).toBe(7); expect(v.butLast().toArray()).toEqual([1, 4]); expect(v.toArray()).toEqual([1, 4, 7]); }); it('range should contain start and end values', () => { // @ts-expect-error -- test that runtime error is thrown expect(() => Range()).toThrow( 'You must define a start value when using Range' ); // @ts-expect-error -- test that runtime error is thrown expect(() => Range(1)).toThrow( 'You must define an end value when using Range' ); }); it('open range', () => { const v = Range(10, Infinity); expect(v.size).toBe(Infinity); expect(v.first()).toBe(10); expect(v.rest().first()).toBe(11); expect(v.last()).toBe(Infinity); expect(v.butLast().first()).toBe(10); expect(v.butLast().last()).toBe(Infinity); expect(() => v.rest().toArray()).toThrow( 'Cannot perform this action with an infinite size.' ); expect(() => v.butLast().toArray()).toThrow( 'Cannot perform this action with an infinite size.' ); expect(() => v.toArray()).toThrow( 'Cannot perform this action with an infinite size.' ); }); it('backwards range', () => { const v = Range(10, 1, 3); expect(v.size).toBe(3); expect(v.first()).toBe(10); expect(v.last()).toBe(4); expect(v.toArray()).toEqual([10, 7, 4]); }); it('empty range', () => { const v = Range(10, 10); expect(v.size).toBe(0); expect(v.first()).toBe(undefined); expect(v.rest().toArray()).toEqual([]); expect(v.last()).toBe(undefined); expect(v.butLast().toArray()).toEqual([]); expect(v.toArray()).toEqual([]); }); const shrinkInt = fc.integer({ min: -1000, max: 1000 }); it('includes first, excludes last', () => { fc.assert( fc.property(shrinkInt, shrinkInt, (from, to) => { const isIncreasing = to >= from; const size = isIncreasing ? to - from : from - to; const r = Range(from, to); const a = r.toArray(); expect(r.size).toBe(size); expect(a.length).toBe(size); expect(r.get(0)).toBe(size ? from : undefined); expect(a[0]).toBe(size ? from : undefined); const last = to + (isIncreasing ? -1 : 1); expect(r.last()).toBe(size ? last : undefined); if (size) { // eslint-disable-next-line jest/no-conditional-expect expect(a[a.length - 1]).toBe(last); } }) ); }); it('slices the same as array slices', () => { fc.assert( fc.property( shrinkInt, shrinkInt, shrinkInt, shrinkInt, (from, to, begin, end) => { const r = Range(from, to); const a = r.toArray(); expect(r.slice(begin, end).toArray()).toEqual(a.slice(begin, end)); } ) ); }); it('slices range', () => { const v = Range(1, 11, 2); const s = v.slice(1, -2); expect(s.size).toBe(2); expect(s.toArray()).toEqual([3, 5]); }); it('empty slice of range', () => { const v = Range(1, 11, 2); const s = v.slice(100, 200); expect(s.size).toBe(0); expect(s.toArray()).toEqual([]); }); it('slices empty range', () => { const v = Range(10, 10); const s = v.slice(1, -2); expect(s.size).toBe(0); expect(s.toArray()).toEqual([]); }); it('stepped range does not land on end', () => { const v = Range(0, 7, 2); expect(v.size).toBe(4); expect(v.toArray()).toEqual([0, 2, 4, 6]); }); it('can be float', () => { const v = Range(0.5, 2.5, 0.5); expect(v.size).toBe(4); expect(v.toArray()).toEqual([0.5, 1, 1.5, 2]); }); it('can be negative', () => { const v = Range(10, -10, 5); expect(v.size).toBe(4); expect(v.toArray()).toEqual([10, 5, 0, -5]); }); it('can get from any index in O(1)', () => { const v = Range(0, Infinity, 8); expect(v.get(111)).toBe(888); }); it('can find an index in O(1)', () => { const v = Range(0, Infinity, 8); expect(v.indexOf(888)).toBe(111); }); it('maps values', () => { const r = Range(0, 4).map((v) => v * v); expect(r.toArray()).toEqual([0, 1, 4, 9]); }); it('filters values', () => { const r = Range(0, 10).filter((v) => v % 2 === 0); expect(r.toArray()).toEqual([0, 2, 4, 6, 8]); }); it('partitions values', () => { const r = Range(0, 10) .partition((v) => v % 2 === 0) .map((part) => part.toArray()); expect(r).toEqual([ [1, 3, 5, 7, 9], [0, 2, 4, 6, 8], ]); }); it('reduces values', () => { const v = Range(0, 10, 2); const r = v.reduce((a, b) => a + b, 0); expect(r).toEqual(20); }); it('takes and skips values', () => { const v = Range(0, 100, 3); const r = v.skip(2).take(2); expect(r.toArray()).toEqual([6, 9]); }); it('can describe lazy operations', () => { expect( Range(1, Infinity) .map((n) => -n) .take(5) .toArray() ).toEqual([-1, -2, -3, -4, -5]); }); it('efficiently chains array methods', () => { const v = Range(1, Infinity); const r = v .filter((x) => x % 2 === 0) .skip(2) .map((x) => x * x) .take(3) .reduce((a, b) => a + b, 0); expect(r).toEqual(200); }); it('sliced sequence works even on filtered sequence', () => { expect(Range(0, 3).slice(-2).toArray()).toEqual([1, 2]); expect( Range(0, 3) .filter(() => true) .slice(-2) .toArray() ).toEqual([1, 2]); }); it('toString', () => { expect(Range(0, 0).toString()).toBe('Range []'); expect(Range(0, 3).toString()).toBe('Range [ 0...3 ]'); expect(Range(0, 10, 2).toString()).toBe('Range [ 0...10 by 2 ]'); expect(Range(10, 0, -2).toString()).toBe('Range [ 10...0 by -2 ]'); }); it('has() checks index existence on a lazy seq of unknown size', () => { // A filtered indexed Seq has no known size, so `has` must iterate by key. // Regression: it previously delegated to `indexOf(index)`, which searches // for a *value* equal to the index instead of checking the index itself. const filteredRange = Range(0, 10, 3) // [0, 3, 6, 9] .filter((v) => v % 2 === 0); // [0, 6]; expect(filteredRange.has(6)).toBe(false); expect(filteredRange.has(1)).toBe(true); }); }); immutable-js-immutable-js-6a01d72/__tests__/Record.ts000066400000000000000000000217431522056416100225550ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, Record, Seq, isKeyed } from 'immutable'; describe('Record', () => { it('defines a constructor', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const t1 = MyType(); const t2 = t1.set('a', 10); expect(t1 instanceof Record).toBe(true); expect(t1 instanceof MyType).toBe(true); expect(t2 instanceof Record).toBe(true); expect(t2 instanceof MyType).toBe(true); expect(t1.get('a')).toBe(1); expect(t2.get('a')).toBe(10); }); it('allows for a descriptive name', () => { const Person = Record({ name: null as string | null }, 'Person'); const me = Person({ name: 'My Name' }); expect(me.toString()).toEqual('Person { name: "My Name" }'); expect(Record.getDescriptiveName(me)).toEqual('Person'); expect(Person.displayName).toBe('Person'); }); it('passes through records of the same type', () => { const P2 = Record({ x: 0, y: 0 }); const P3 = Record({ x: 0, y: 0, z: 0 }); const p2 = P2(); const p3 = P3(); expect(P3(p2) instanceof P3).toBe(true); expect(P2(p3) instanceof P2).toBe(true); expect(P2(p2)).toBe(p2); expect(P3(p3)).toBe(p3); }); it('setting an unknown key is a no-op', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const t1 = MyType({ a: 10, b: 20 }); // @ts-expect-error -- try to force an unknown value const t2 = t1.set('d', 4); expect(t2).toBe(t1); }); it('falls back to default values when deleted or cleared', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const t1 = MyType({ a: 10, b: 20 }); const t2 = MyType({ b: 20 }); const t3 = t1.delete('a'); const t4 = t3.clear(); expect(t1.get('a')).toBe(10); expect(t2.get('a')).toBe(1); expect(t3.get('a')).toBe(1); expect(t4.get('b')).toBe(2); expect(t2.equals(t3)).toBe(true); expect(t2.equals(t4)).toBe(false); expect(t4.equals(MyType())).toBe(true); }); it('allows deletion of values deep within a tree', () => { const AType = Record({ a: 1 }); const BType = Record({ b: AType({ a: 2 }) }); const t1 = BType(); const t2 = t1.deleteIn(['b', 'a']); expect(t1.get('b').get('a')).toBe(2); expect(t2.get('b').get('a')).toBe(1); }); it('is a value type and equals other similar Records', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const t1 = MyType({ a: 10 }); const t2 = MyType({ a: 10, b: 2 }); expect(t1.equals(t2)).toBe(true); }); it('if compared against undefined or null should return false', () => { const MyType = Record({ a: 1, b: 2 }); const t1 = MyType(); expect(t1.equals(undefined)).toBeFalsy(); expect(t1.equals(null)).toBeFalsy(); }); it('if compared against Map should return false', () => { const MyType = Record({ a: 1, b: 2 }); const t1 = MyType(); expect(t1.equals(Map({ a: 1, b: 2 }))).toBeFalsy(); }); it('merges in Objects and other Records', () => { const Point2 = Record({ x: 0, y: 0 }); const Point3 = Record({ x: 0, y: 0, z: 0 }); const p2 = Point2({ x: 20, y: 20 }); const p3 = Point3({ x: 10, y: 10, z: 10 }); expect(p3.merge(p2).toObject()).toEqual({ x: 20, y: 20, z: 10 }); expect(p2.merge({ y: 30 }).toObject()).toEqual({ x: 20, y: 30 }); expect(p3.merge({ y: 30, z: 30 }).toObject()).toEqual({ x: 10, y: 30, z: 30, }); }); it('converts sequences to records', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const seq = Seq({ a: 10, b: 20 }); const t = MyType(seq); expect(t.toObject()).toEqual({ a: 10, b: 20, c: 3 }); }); it('allows for functional construction', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const seq = Seq({ a: 10, b: 20 }); const t = MyType(seq); expect(t.toObject()).toEqual({ a: 10, b: 20, c: 3 }); }); it('skips unknown keys', () => { const MyType = Record({ a: 1, b: 2 }); const seq = Seq({ b: 20, c: 30 }); const t = MyType(seq); expect(t.get('a')).toEqual(1); expect(t.get('b')).toEqual(20); // @ts-expect-error -- unknown key should not return anything expect(t.get('c')).toBeUndefined(); }); it('returns itself when setting identical values', () => { const MyType = Record({ a: 1, b: 2 }); const t1 = MyType(); const t2 = MyType({ a: 1 }); const t3 = t1.set('a', 1); const t4 = t2.set('a', 1); expect(t3).toBe(t1); expect(t4).toBe(t2); }); it('returns record when setting values', () => { const MyType = Record({ a: 1, b: 2 }); const t1 = MyType(); const t2 = MyType({ a: 1 }); const t3 = t1.set('a', 3); const t4 = t2.set('a', 3); expect(t3).not.toBe(t1); expect(t4).not.toBe(t2); }); it('allows for readonly property access', () => { const MyType = Record({ a: 1, b: 'foo' }); const t1 = MyType(); const a: number = t1.a; const b: string = t1.b; expect(a).toEqual(1); expect(b).toEqual('foo'); // @ts-expect-error -- test that runtime does throw expect(() => (t1.a = 2)).toThrow('Cannot set on an immutable record.'); }); it('allows for class extension', () => { class ABClass extends Record({ a: 1, b: 2 }) { setA(aVal: number) { return this.set('a', aVal); } setB(bVal: number) { return this.set('b', bVal); } } // Note: `new` is only used because of `class` const t1 = new ABClass({ a: 1 }); const t2 = t1.setA(3); const t3 = t2.setB(10); const a: number = t3.a; expect(a).toEqual(3); expect(t3.toObject()).toEqual({ a: 3, b: 10 }); }); it('does not allow overwriting property names', () => { const realWarn = console.warn; try { const warnings: Array = []; console.warn = (w) => warnings.push(w); // size is a safe key to use const MyType1 = Record({ size: 123 }); const t1 = MyType1(); expect(warnings.length).toBe(0); expect(t1.size).toBe(123); // get() is not safe to use const MyType2 = Record({ get: 0 }); // eslint-disable-next-line @typescript-eslint/no-unused-vars const t2 = MyType2(); expect(warnings.length).toBe(1); expect(warnings[0]).toBe( 'Cannot define Record with property "get" since that property name is part of the Record API.' ); } finally { console.warn = realWarn; } }); it('can be converted to a keyed sequence', () => { const MyType = Record({ a: 0, b: 0 }); const t1 = MyType({ a: 10, b: 20 }); const seq1 = t1.toSeq(); expect(isKeyed(seq1)).toBe(true); expect(seq1.toJS()).toEqual({ a: 10, b: 20 }); const seq2 = Seq(t1); expect(isKeyed(seq2)).toBe(true); expect(seq2.toJS()).toEqual({ a: 10, b: 20 }); const seq3 = Seq.Keyed(t1); expect(isKeyed(seq3)).toBe(true); expect(seq3.toJS()).toEqual({ a: 10, b: 20 }); const seq4 = Seq.Indexed(t1); expect(isKeyed(seq4)).toBe(false); expect(seq4.toJS()).toEqual([ ['a', 10], ['b', 20], ]); }); it('can be iterated over', () => { const MyType = Record({ a: 0, b: 0 }); const t1 = MyType({ a: 10, b: 20 }); const entries: Array<[string, number]> = []; for (const entry of t1) { entries.push(entry); } expect(entries).toEqual([ ['a', 10], ['b', 20], ]); }); it('calling `equals` between two instance of factories with same properties and same value should return true', () => { const factoryA = Record({ id: '' }); const factoryB = Record({ id: '' }); expect(factoryA().equals(factoryA())).toBe(true); expect(factoryA().equals(factoryB())).toBe(true); }); /** * @see https://github.com/immutable-js/immutable-js/issues/1565 */ it('check that reset does reset the record.', () => { type UserType = { name: string; roles: List | Array; }; const User = Record({ name: 'default name', roles: List(), }); const user0 = new User({ name: 'John', roles: ['superuser', 'admin'], }); const user1 = user0.clear(); expect(user1.name).toBe('default name'); expect(user1.roles).toEqual(List()); const user2 = user0.withMutations((mutable: Record) => { mutable.clear(); }); expect(user2.name).toBe('default name'); expect(user2.roles).toEqual(List()); }); it('does not accept a Record as constructor', () => { const Foo = Record({ foo: 'bar' }); const fooInstance = Foo(); expect(() => { Record(fooInstance); }).toThrowErrorMatchingSnapshot(); }); it('does not accept a non object as constructor', () => { const defaultValues = null; expect(() => { // @ts-expect-error -- test that runtime does throw Record(defaultValues); }).toThrowErrorMatchingSnapshot(); }); it('does not accept an immutable object that is not a Record as constructor', () => { const defaultValues = Map({ foo: 'bar' }); expect(() => { Record(defaultValues); }).toThrowErrorMatchingSnapshot(); }); }); immutable-js-immutable-js-6a01d72/__tests__/RecordJS.js000066400000000000000000000033551522056416100227770ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Record } from 'immutable'; describe('Record', () => { it('defines a record factory', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const t = MyType(); const t2 = t.set('a', 10); expect(t.a).toBe(1); expect(t2.a).toBe(10); }); it('can have mutations apply', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); const t = MyType(); expect(() => { t.a = 10; }).toThrow(); const t2 = t.withMutations((mt) => { mt.a = 10; mt.b = 20; mt.c = 30; }); expect(t.a).toBe(1); expect(t2.a).toBe(10); }); it('can be subclassed', () => { class Alphabet extends Record({ a: 1, b: 2, c: 3 }) { soup() { return this.a + this.b + this.c; } } // Note: `new` is only used because of `class` const t = new Alphabet(); const t2 = t.set('b', 200); expect(t instanceof Record).toBe(true); expect(t instanceof Alphabet).toBe(true); expect(t.soup()).toBe(6); expect(t2.soup()).toBe(204); // Uses class name as descriptive name expect(Record.getDescriptiveName(t)).toBe('Alphabet'); // Uses display name over class name class NotADisplayName extends Record({ x: 1 }, 'DisplayName') {} const t3 = new NotADisplayName(); expect(Record.getDescriptiveName(t3)).toBe('DisplayName'); }); it('can be cleared', () => { const MyType = Record({ a: 1, b: 2, c: 3 }); let t = MyType({ c: 'cats' }); expect(t.c).toBe('cats'); t = t.clear(); expect(t.c).toBe(3); const MyType2 = Record({ d: 4, e: 5, f: 6 }); let t2 = MyType2({ d: 'dogs' }); expect(t2.d).toBe('dogs'); t2 = t2.clear(); expect(t2.d).toBe(4); }); }); immutable-js-immutable-js-6a01d72/__tests__/Repeat.ts000066400000000000000000000020631522056416100225510ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Repeat } from 'immutable'; describe('Repeat', () => { it('fixed repeat', () => { const v = Repeat('wtf', 3); expect(v.size).toBe(3); expect(v.first()).toBe('wtf'); expect(v.rest().toArray()).toEqual(['wtf', 'wtf']); expect(v.last()).toBe('wtf'); expect(v.butLast().toArray()).toEqual(['wtf', 'wtf']); expect(v.toArray()).toEqual(['wtf', 'wtf', 'wtf']); expect(v.join()).toEqual('wtf,wtf,wtf'); }); it('does not claim to be equal to undefined', () => { expect(Repeat(1).equals(undefined)).toEqual(false); }); it('indexOf and lastIndexOf return the first and last index', () => { const v = Repeat('wtf', 3); expect(v.indexOf('wtf')).toBe(0); expect(v.lastIndexOf('wtf')).toBe(2); expect(v.indexOf('nope')).toBe(-1); expect(v.lastIndexOf('nope')).toBe(-1); }); it('lastIndexOf on an empty Repeat returns -1', () => { const v = Repeat('wtf', 0); expect(v.indexOf('wtf')).toBe(-1); expect(v.lastIndexOf('wtf')).toBe(-1); }); }); immutable-js-immutable-js-6a01d72/__tests__/Seq.ts000066400000000000000000000174001522056416100220620ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Seq, isCollection, isIndexed, isKeyed, isOrdered, isSeq, } from 'immutable'; describe('Seq', () => { it('returns undefined if empty and first is called without default argument', () => { expect(Seq().first()).toBeUndefined(); }); it('returns undefined if empty and last is called without default argument', () => { expect(Seq().last()).toBeUndefined(); }); it('returns default value if empty and first is called with default argument', () => { expect(Seq().first({})).toEqual({}); }); it('returns default value if empty and last is called with default argument', () => { expect(Seq().last({})).toEqual({}); }); it('can be empty', () => { expect(Seq().size).toBe(0); }); it('accepts an array', () => { expect(Seq([1, 2, 3]).size).toBe(3); }); it('accepts an object', () => { expect(Seq({ a: 1, b: 2, c: 3 }).size).toBe(3); }); it('accepts an object with a next property', () => { expect(Seq({ a: 1, b: 2, next: (_: unknown) => _ }).size).toBe(3); }); it('accepts a collection string', () => { expect(Seq('foo').size).toBe(3); }); it('accepts arbitrary objects', () => { function Foo(this: { bar: string; baz: string }) { this.bar = 'bar'; this.baz = 'baz'; } // @ts-expect-error -- any type for too complex object expect(Seq(new Foo()).size).toBe(2); }); it('accepts another sequence', () => { const seq = Seq([1, 2, 3]); expect(Seq(seq).size).toBe(3); }); it('accepts a string', () => { const seq = Seq('abc'); expect(seq.size).toBe(3); expect(seq.get(1)).toBe('b'); expect(seq.join('')).toBe('abc'); }); it('accepts an array-like', () => { const seq = Seq({ length: 2, 0: 'a', 1: 'b' }); expect(isIndexed(seq)).toBe(true); expect(seq.size).toBe(2); expect(seq.get(1)).toBe('b'); const map = Seq({ length: 1, foo: 'bar' }); expect(isIndexed(map)).toBe(false); expect(map.size).toBe(2); expect(map.get('foo')).toBe('bar'); const empty = Seq({ length: 0 }); expect(isIndexed(empty)).toBe(true); expect(empty.size).toEqual(0); }); it('accepts a JS (global) Map', () => { const seq = Seq( new global.Map([ ['a', 'A'], ['b', 'B'], ['c', 'C'], ]) ); expect(isKeyed(seq)).toBe(true); expect(seq.size).toBe(3); }); it('accepts a JS (global) Set', () => { const seq = Seq(new global.Set(['a', 'b', 'c'])); expect(isIndexed(seq)).toBe(false); expect(isKeyed(seq)).toBe(false); expect(seq.size).toBe(3); }); it('does not accept a scalar', () => { expect(() => { // @ts-expect-error -- test that runtime does throw Seq(3); }).toThrow( 'Expected Array or collection object of values, or keyed object: 3' ); }); it('detects sequences', () => { const seq = Seq([1, 2, 3]); expect(Seq.isSeq(seq)).toBe(true); expect(isCollection(seq)).toBe(true); }); it('Does not infinite loop when sliced with NaN', () => { const list = Seq([1, 2, 3, 4, 5]); expect(list.slice(0, NaN).toJS()).toEqual([]); expect(list.slice(NaN).toJS()).toEqual([1, 2, 3, 4, 5]); }); it('Does not infinite loop when spliced with negative number #559', () => { const dog = Seq(['d', 'o', 'g']); const dg = dog.filter((c) => c !== 'o'); const dig = dg.splice(-1, 0, 'i'); expect(dig.toJS()).toEqual(['d', 'i', 'g']); }); it('Does not infinite loop when an undefined number is passed to take', () => { const list = Seq([1, 2, 3, 4, 5]); expect(list.take(NaN).toJS()).toEqual([]); }); it('Converts deeply toJS after converting to entries', () => { const list = Seq([Seq([1, 2]), Seq({ a: 'z' })]); expect(list.entrySeq().toJS()).toEqual([ [0, [1, 2]], [1, { a: 'z' }], ]); const map = Seq({ x: Seq([1, 2]), y: Seq({ a: 'z' }) }); expect(map.entrySeq().toJS()).toEqual([ ['x', [1, 2]], ['y', { a: 'z' }], ]); }); }); describe('Seq brands across the hierarchy', () => { // Every Seq kind extends its matching collection kind, so each prototype // carries the Seq brand itself (it is no longer inherited from a shared // SeqImpl ancestor). it('marks every Seq kind as a Seq', () => { expect(isSeq(Seq())).toBe(true); expect(isSeq(Seq.Keyed({ a: 1 }))).toBe(true); expect(isSeq(Seq.Indexed([1]))).toBe(true); expect(isSeq(Seq.Set([1]))).toBe(true); }); it('marks operation-built Seqs as Seqs', () => { expect(isSeq(Seq.Keyed({ a: 1 }).map((v) => v))).toBe(true); expect(isSeq(Seq.Indexed([1, 2]).filter((v) => v > 1))).toBe(true); expect(isSeq(Seq.Set([1, 2]).map((v) => v))).toBe(true); expect(isSeq(Seq([1, 2]).reverse())).toBe(true); }); it('keeps the kind brands', () => { expect(isKeyed(Seq.Keyed({ a: 1 }))).toBe(true); expect(isKeyed(Seq.Indexed([1]))).toBe(false); expect(isIndexed(Seq.Indexed([1]))).toBe(true); expect(isIndexed(Seq.Set([1]))).toBe(false); // object-backed and indexed Seqs are ordered, set Seqs are not expect(isOrdered(Seq({ a: 1 }))).toBe(true); expect(isOrdered(Seq([1]))).toBe(true); expect(isOrdered(Seq.Set([1]))).toBe(false); }); }); describe('Seq kinds expose the kind-specific methods', () => { // These methods come from the matching `*CollectionImpl` classes (inherited // since the re-parenting; they were copied by `mixin` before). it('keyed Seq: flip / mapKeys / mapEntries / entries iterator / toJSON', () => { expect(Seq.Keyed({ a: 1 }).flip().get(1)).toBe('a'); expect( Seq({ a: 1, b: 2 }) .mapKeys((k) => k.toUpperCase()) .toObject() ).toEqual({ A: 1, B: 2 }); expect( Seq({ a: 1 }) .mapEntries(([k, v]) => [k.toUpperCase(), v * 2]) .toObject() ).toEqual({ A: 2 }); expect([...Seq.Keyed({ a: 1 })]).toEqual([['a', 1]]); expect(Seq.Keyed({ a: 1 }).toJSON()).toEqual({ a: 1 }); }); it('indexed Seq: interpose / splice / zip / keySeq', () => { expect(Seq([1, 2, 3]).interpose(0).toArray()).toEqual([1, 0, 2, 0, 3]); expect(Seq(['d', 'o', 'g']).splice(1, 1).toArray()).toEqual(['d', 'g']); expect( Seq([1, 2]) .zip(Seq(['a', 'b'])) .toArray() ).toEqual([ [1, 'a'], [2, 'b'], ]); expect(Seq([10, 20]).keySeq().toArray()).toEqual([0, 1]); }); it('set Seq: has / keys-as-values', () => { expect(Seq.Set(['a', 'b']).has('b')).toBe(true); expect(Seq.Set(['a', 'b']).has('c')).toBe(false); expect([...Seq.Set(['a']).keys()]).toEqual(['a']); }); }); describe('cacheResult', () => { function* numbers() { yield 1; yield 2; yield 3; } it('materializes an unknown size', () => { const seq = Seq(numbers()); expect(seq.size).toBe(undefined); seq.cacheResult(); expect(seq.size).toBe(3); }); it('makes a one-shot iterable re-iterable from the cache', () => { const seq = Seq(numbers()).cacheResult(); // The generator is consumed during caching; both reads come from the cache. expect(seq.toArray()).toEqual([1, 2, 3]); expect(seq.toArray()).toEqual([1, 2, 3]); expect([...seq.values()]).toEqual([1, 2, 3]); expect([...seq.entries()]).toEqual([ [0, 1], [1, 2], [2, 3], ]); }); it('is used internally to reverse an iterable-backed Seq', () => { expect(Seq(numbers()).reverse().toArray()).toEqual([3, 2, 1]); }); it('is a no-op on a Seq with a concrete backing', () => { const seq = Seq([1, 2]); expect(seq.cacheResult()).toBe(seq); expect(seq.size).toBe(2); }); it('caches an operation-built Seq', () => { const mapped = Seq({ a: 1, b: 2 }).map((v) => v * 10); mapped.cacheResult(); expect(mapped.size).toBe(2); expect(mapped.toObject()).toEqual({ a: 10, b: 20 }); }); }); immutable-js-immutable-js-6a01d72/__tests__/Set.ts000066400000000000000000000267451522056416100221010ustar00rootroot00000000000000import { describe, expect, it, jest } from '@jest/globals'; import { List, Map, OrderedSet, Seq, Set, fromJS, is } from 'immutable'; describe('Set', () => { it('accepts array of values', () => { const s = Set([1, 2, 3]); expect(s.has(1)).toBe(true); expect(s.has(2)).toBe(true); expect(s.has(3)).toBe(true); expect(s.has(4)).toBe(false); }); it('accepts array-like of values', () => { const s = Set({ length: 3, 2: 3 }); expect(s.size).toBe(2); expect(s.has(undefined)).toBe(true); expect(s.has(3)).toBe(true); expect(s.has(2)).toBe(false); }); it('accepts a JS (global) Set', () => { const s = Set(new global.Set([1, 2, 3])); expect(Set.isSet(s)).toBe(true); expect(s.size).toBe(3); expect(s.has(1)).toBe(true); expect(s.has(2)).toBe(true); expect(s.has(3)).toBe(true); expect(s.has(4)).toBe(false); }); it('accepts string, an array-like collection', () => { const s = Set('abc'); expect(s.size).toBe(3); expect(s.has('a')).toBe(true); expect(s.has('b')).toBe(true); expect(s.has('c')).toBe(true); expect(s.has('abc')).toBe(false); }); it('accepts sequence of values', () => { const seq = Seq([1, 2, 3]); const s = Set(seq); expect(s.has(1)).toBe(true); expect(s.has(2)).toBe(true); expect(s.has(3)).toBe(true); expect(s.has(4)).toBe(false); }); it('accepts a keyed Seq as a set of entries', () => { const seq = Seq({ a: null, b: null, c: null }).flip(); const s = Set(seq); expect(s.toArray()).toEqual([ [null, 'a'], [null, 'b'], [null, 'c'], ]); // Explicitly getting the values sequence const s2 = Set(seq.valueSeq()); expect(s2.toArray()).toEqual(['a', 'b', 'c']); // toSet() does this for you. const v3 = seq.toSet(); expect(v3.toArray()).toEqual(['a', 'b', 'c']); }); it('accepts object keys', () => { const s = Set.fromKeys({ a: null, b: null, c: null }); expect(s.has('a')).toBe(true); expect(s.has('b')).toBe(true); expect(s.has('c')).toBe(true); expect(s.has('d')).toBe(false); }); it('accepts sequence keys', () => { const seq = Seq({ a: null, b: null, c: null }); const s = Set.fromKeys(seq); expect(s.has('a')).toBe(true); expect(s.has('b')).toBe(true); expect(s.has('c')).toBe(true); expect(s.has('d')).toBe(false); }); it('accepts explicit values', () => { const s = Set([1, 2, 3]); expect(s.has(1)).toBe(true); expect(s.has(2)).toBe(true); expect(s.has(3)).toBe(true); expect(s.has(4)).toBe(false); }); it('converts back to JS array', () => { const s = Set([1, 2, 3]); expect(s.toArray()).toEqual([1, 2, 3]); }); it('converts back to JS object', () => { const s = Set.of('a', 'b', 'c'); expect(s.toObject()).toEqual({ a: 'a', b: 'b', c: 'c' }); }); it('maps no-ops return the same reference', () => { const s = Set([1, 2, 3]); const r = s.map((value) => value); expect(r).toBe(s); }); it('maps should produce new set if values changed', () => { const s = Set([1, 2, 3]); expect(s.has(4)).toBe(false); expect(s.size).toBe(3); const m = s.map((v) => v + 1); expect(m.has(1)).toBe(false); expect(m.has(2)).toBe(true); expect(m.has(3)).toBe(true); expect(m.has(4)).toBe(true); expect(m.size).toBe(3); }); it('unions an unknown collection of Sets', () => { const abc = Set(['a', 'b', 'c']); const cat = Set(['c', 'a', 't']); expect(Set.union([abc, cat]).toArray()).toEqual(['c', 'a', 't', 'b']); expect(Set.union([abc])).toBe(abc); expect(Set.union([])).toBe(Set()); }); it('intersects an unknown collection of Sets', () => { const abc = Set(['a', 'b', 'c']); const cat = Set(['c', 'a', 't']); expect(Set.intersect([abc, cat]).toArray()).toEqual(['c', 'a']); expect(Set.intersect([abc])).toBe(abc); expect(Set.intersect([])).toBe(Set()); }); it('concatenates strings using union', () => { const s = Set(['one', 'two']); expect(s.union('three').toArray()).toEqual(['one', 'two', 'three']); }); it('iterates values', () => { const s = Set([1, 2, 3]); const iterator = jest.fn(); s.forEach(iterator); expect(iterator.mock.calls).toEqual([ [1, 1, s], [2, 2, s], [3, 3, s], ]); }); it('has the same iterator function for keys and values', () => { const s = Set([1, 2, 3]); expect(s[Symbol.iterator]).toBe(s.keys); expect(s[Symbol.iterator]).toBe(s.values); }); it('unions two sets', () => { const s1 = Set.of('a', 'b', 'c'); const s2 = Set.of('d', 'b', 'wow'); const s3 = s1.union(s2); expect(s3.toArray()).toEqual(['a', 'b', 'c', 'd', 'wow']); }); it('returns self when union results in no-op', () => { const s1 = Set.of('a', 'b', 'c'); const s2 = Set.of('c', 'a'); const s3 = s1.union(s2); expect(s3).toBe(s1); }); it('returns arg when union results in no-op', () => { const s1 = Set(); const s2 = Set.of('a', 'b', 'c'); const s3 = s1.union(s2); expect(s3).toBe(s2); }); it('unions a set and another collection and returns a set', () => { const s1 = Set([1, 2, 3]); const emptySet = Set(); const l = List([1, 2, 3]); const s2 = s1.union(l); const s3 = emptySet.union(l); const o = OrderedSet([1, 2, 3]); const s4 = s1.union(o); const s5 = emptySet.union(o); expect(Set.isSet(s2)).toBe(true); expect(Set.isSet(s3)).toBe(true); expect(Set.isSet(s4) && !OrderedSet.isOrderedSet(s4)).toBe(true); expect(Set.isSet(s5) && !OrderedSet.isOrderedSet(s5)).toBe(true); }); it('is persistent to adds', () => { const s1 = Set(); const s2 = s1.add('a'); const s3 = s2.add('b'); const s4 = s3.add('c'); const s5 = s4.add('b'); expect(s1.size).toBe(0); expect(s2.size).toBe(1); expect(s3.size).toBe(2); expect(s4.size).toBe(3); expect(s5.size).toBe(3); }); it('is persistent to deletes', () => { const s1 = Set(); const s2 = s1.add('a'); const s3 = s2.add('b'); const s4 = s3.add('c'); const s5 = s4.remove('b'); expect(s1.size).toBe(0); expect(s2.size).toBe(1); expect(s3.size).toBe(2); expect(s4.size).toBe(3); expect(s5.size).toBe(2); expect(s3.has('b')).toBe(true); expect(s5.has('b')).toBe(false); }); it('deletes down to empty set', () => { const s = Set.of('A').remove('A'); expect(s).toBe(Set()); }); it('unions multiple sets', () => { const s = Set.of('A', 'B', 'C').union( Set.of('C', 'D', 'E'), Set.of('D', 'B', 'F') ); expect(s).toEqual(Set.of('A', 'B', 'C', 'D', 'E', 'F')); }); it('intersects multiple sets', () => { const s = Set.of('A', 'B', 'C').intersect( Set.of('B', 'C', 'D'), Set.of('A', 'C', 'E') ); expect(s).toEqual(Set.of('C')); }); it('diffs multiple sets', () => { const s = Set.of('A', 'B', 'C').subtract( Set.of('C', 'D', 'E'), Set.of('D', 'B', 'F') ); expect(s).toEqual(Set.of('A')); }); it('expresses value equality with set sequences', () => { const s1 = Set.of('A', 'B', 'C'); expect(s1.equals(null)).toBe(false); const s2 = Set.of('C', 'B', 'A'); expect(s1 === s2).toBe(false); expect(is(s1, s2)).toBe(true); expect(s1.equals(s2)).toBe(true); // Map and Set are not the same (keyed vs unkeyed) const v1 = Map({ A: 'A', C: 'C', B: 'B' }); expect(is(s1, v1)).toBe(false); }); it('can use union in a withMutation', () => { const js = Set() .withMutations((set) => { set.union(['a']); set.add('b'); }) .toJS(); expect(js).toEqual(['a', 'b']); }); it('can determine if an array is a subset', () => { const s = Set.of('A', 'B', 'C'); expect(s.isSuperset(['B', 'C'])).toBe(true); expect(s.isSuperset(['B', 'C', 'D'])).toBe(false); }); it('can determine if it is a subset of an iterable', () => { const s = Set.of('A', 'B'); // plain array (uses the iterable's own `includes`) expect(s.isSubset(['A', 'B', 'C'])).toBe(true); expect(s.isSubset(['A', 'Z'])).toBe(false); // another immutable collection expect(s.isSubset(Set.of('A', 'B', 'C'))).toBe(true); expect(s.isSubset(List.of('A', 'B', 'C'))).toBe(true); }); it('accepts a primitive iterable (string) without throwing', () => { // A string is a valid Iterable; the membership test must not throw. expect(Set.of('a', 'b').isSubset('abc')).toBe(true); expect(Set.of('a', 'z').isSubset('abc')).toBe(false); expect(Set.of('a', 'b').isSuperset('ab')).toBe(true); }); describe('accepts Symbol as entry #579', () => { it('operates on small number of symbols, preserving set uniqueness', () => { const a = Symbol(); const b = Symbol(); const c = Symbol(); const symbolSet = Set([a, b, c, a, b, c, a, b, c, a, b, c]); expect(symbolSet.size).toBe(3); expect(symbolSet.has(b)).toBe(true); expect(symbolSet.get(c)).toEqual(c); }); it('operates on a large number of symbols, maintaining obj uniqueness', () => { const manySymbols = [ Symbol('a'), Symbol('b'), Symbol('c'), Symbol('a'), Symbol('b'), Symbol('c'), Symbol('a'), Symbol('b'), Symbol('c'), Symbol('a'), Symbol('b'), Symbol('c'), ] as const; const symbolSet = Set(manySymbols); expect(symbolSet.size).toBe(12); expect(symbolSet.has(manySymbols[10])).toBe(true); expect(symbolSet.get(manySymbols[10])).toEqual(manySymbols[10]); }); }); it('can use intersect after add or union in a withMutation', () => { const set = Set(['a', 'd']).withMutations((s) => { s.add('b'); s.union(['c']); s.intersect(['b', 'c', 'd']); }); expect(set.toArray()).toEqual(['c', 'd', 'b']); }); it('can count entries that satisfy a predicate', () => { const set = Set([1, 2, 3, 4, 5]); expect(set.size).toEqual(5); expect(set.count()).toEqual(5); expect(set.count((x) => x % 2 === 0)).toEqual(2); expect(set.count(() => true)).toEqual(5); }); describe('"size" should correctly reflect the number of elements in a Set', () => { describe('deduplicating custom classes that invoke fromJS() as part of equality check', () => { class Entity { entityId: string; entityKey: string; constructor(entityId: string, entityKey: string) { this.entityId = entityId; this.entityKey = entityKey; } asImmutable() { return fromJS({ entityId: this.entityId, entityKey: this.entityKey, }); } valueOf() { return this.asImmutable().toString(); } } it('with mutations', () => { const testSet = Set().withMutations((mutableSet) => { mutableSet.add(new Entity('hello', 'world')); mutableSet.add(new Entity('testing', 'immutable')); mutableSet.add(new Entity('hello', 'world')); }); expect(testSet.size).toEqual(2); }); it('without mutations', () => { const testSet0 = Set(); const testSet1 = testSet0.add(new Entity('hello', 'world')); const testSet2 = testSet1.add(new Entity('testing', 'immutable')); const testSet3 = testSet2.add(new Entity('hello', 'world')); expect(testSet0.size).toEqual(0); expect(testSet1.size).toEqual(1); expect(testSet2.size).toEqual(2); expect(testSet3.size).toEqual(2); }); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/Stack.ts000066400000000000000000000141531522056416100224010ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { Seq, Stack } from 'immutable'; function arrayOfSize(s: number): Array { const a = new Array(s); for (let ii = 0; ii < s; ii++) { a[ii] = ii; } return a; } describe('Stack', () => { it('constructor provides initial values', () => { const s = Stack.of('a', 'b', 'c'); expect(s.get(0)).toBe('a'); expect(s.get(1)).toBe('b'); expect(s.get(2)).toBe('c'); }); it('toArray provides a JS array', () => { const s = Stack.of('a', 'b', 'c'); expect(s.toArray()).toEqual(['a', 'b', 'c']); }); it('accepts a JS array', () => { const s = Stack(['a', 'b', 'c']); expect(s.toArray()).toEqual(['a', 'b', 'c']); }); it('accepts a Seq', () => { const seq = Seq(['a', 'b', 'c']); const s = Stack(seq); expect(s.toArray()).toEqual(['a', 'b', 'c']); }); it('accepts a keyed Seq', () => { const seq = Seq({ a: null, b: null, c: null }).flip(); const s = Stack(seq); expect(s.toArray()).toEqual([ [null, 'a'], [null, 'b'], [null, 'c'], ]); // Explicit values const s2 = Stack(seq.valueSeq()); expect(s2.toArray()).toEqual(['a', 'b', 'c']); // toStack() does this for you. const s3 = seq.toStack(); expect(s3.toArray()).toEqual(['a', 'b', 'c']); }); it('pushing creates a new instance', () => { const s0 = Stack.of('a'); const s1 = s0.push('A'); expect(s0.get(0)).toBe('a'); expect(s1.get(0)).toBe('A'); }); it('get helpers make for easier to read code', () => { const s = Stack.of('a', 'b', 'c'); expect(s.first()).toBe('a'); expect(s.last()).toBe('c'); expect(s.peek()).toBe('a'); }); it('slice helpers make for easier to read code', () => { const s = Stack.of('a', 'b', 'c'); expect(s.rest().toArray()).toEqual(['b', 'c']); }); it('iterable in reverse order', () => { const s = Stack.of('a', 'b', 'c'); expect(s.size).toBe(3); const forEachResults: Array<[number, string, string | undefined]> = []; s.forEach((val, i) => forEachResults.push([i, val, s.get(i)])); expect(forEachResults).toEqual([ [0, 'a', 'a'], [1, 'b', 'b'], [2, 'c', 'c'], ]); // map will cause reverse iterate expect(s.map((val) => val + val).toArray()).toEqual(['aa', 'bb', 'cc']); let iteratorResults: Array<[number, string]> = []; let iterator = s.entries(); let step: IteratorResult<[number, string]>; while (!(step = iterator.next()).done) { iteratorResults.push(step.value); } expect(iteratorResults).toEqual([ [0, 'a'], [1, 'b'], [2, 'c'], ]); iteratorResults = []; iterator = s.toSeq().reverse().entries(); while (!(step = iterator.next()).done) { iteratorResults.push(step.value); } expect(iteratorResults).toEqual([ [0, 'c'], [1, 'b'], [2, 'a'], ]); }); it('map is called in reverse order but with correct indices', () => { const s = Stack(['a', 'b', 'c']); const s2 = s.map((v, i, c) => v + i + c.get(i)); expect(s2.toArray()).toEqual(['a0a', 'b1b', 'c2c']); const mappedSeq = s.toSeq().map((v, i, c) => v + i + c.get(i)); const s3 = Stack(mappedSeq); expect(s3.toArray()).toEqual(['a0a', 'b1b', 'c2c']); }); it('push inserts at lowest index', () => { const s0 = Stack.of('a', 'b', 'c'); const s1 = s0.push('d', 'e', 'f'); expect(s0.size).toBe(3); expect(s1.size).toBe(6); expect(s1.toArray()).toEqual(['d', 'e', 'f', 'a', 'b', 'c']); }); it('pop removes the lowest index, decrementing size', () => { const s = Stack.of('a', 'b', 'c').pop(); expect(s.peek()).toBe('b'); expect(s.toArray()).toEqual(['b', 'c']); }); it('shift removes the lowest index, just like array', () => { fc.assert( fc.property(fc.nat(100), (len) => { const a = arrayOfSize(len); let s = Stack(a); while (a.length) { expect(s.size).toBe(a.length); expect(s.toArray()).toEqual(a); s = s.shift(); a.shift(); } expect(s.size).toBe(a.length); expect(s.toArray()).toEqual(a); }) ); }); it('unshift adds the next lowest index, just like array', () => { fc.assert( fc.property(fc.nat(100), (len) => { const a: Array = []; let s = Stack(); for (let ii = 0; ii < len; ii++) { expect(s.size).toBe(a.length); expect(s.toArray()).toEqual(a); s = s.unshift(ii); a.unshift(ii); } expect(s.size).toBe(a.length); expect(s.toArray()).toEqual(a); }) ); }); it('unshifts multiple values to the front', () => { fc.assert( fc.property(fc.nat(100), fc.nat(100), (size1: number, size2: number) => { const a1 = arrayOfSize(size1); const a2 = arrayOfSize(size2); const s1 = Stack(a1); const s3 = s1.unshift.apply(s1, a2); const a3 = a1.slice(); a3.unshift.apply(a3, a2); expect(s3.size).toEqual(a3.length); expect(s3.toArray()).toEqual(a3); }) ); }); it('finds values using indexOf', () => { const s = Stack.of('a', 'b', 'c', 'b', 'a'); expect(s.indexOf('b')).toBe(1); expect(s.indexOf('c')).toBe(2); expect(s.indexOf('d')).toBe(-1); }); it('pushes on all items in an iter', () => { const abc = Stack(['a', 'b', 'c']); const xyz = Stack(['x', 'y', 'z']); const xyzSeq = Seq(['x', 'y', 'z']); // Push all to the front of the Stack so first item ends up first. expect(abc.pushAll(xyz).toArray()).toEqual(['x', 'y', 'z', 'a', 'b', 'c']); expect(abc.pushAll(xyzSeq).toArray()).toEqual([ 'x', 'y', 'z', 'a', 'b', 'c', ]); // Pushes Seq contents into Stack expect(Stack().pushAll(xyzSeq)).not.toBe(xyzSeq); expect(Stack().pushAll(xyzSeq).toArray()).toEqual(['x', 'y', 'z']); // Pushing a Stack onto an empty Stack returns === Stack expect(Stack().pushAll(xyz)).toBe(xyz); // Pushing an empty Stack onto a Stack return === Stack expect(abc.pushAll(Stack())).toBe(abc); }); }); immutable-js-immutable-js-6a01d72/__tests__/__snapshots__/000077500000000000000000000000001522056416100235765ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/__tests__/__snapshots__/Record.ts.snap000066400000000000000000000011311522056416100263200ustar00rootroot00000000000000// Jest Snapshot v1, https://goo.gl/fbAQLP exports[`Record does not accept a Record as constructor 1`] = `"Can not call \`Record\` with an immutable Record as default values. Use a plain javascript object instead."`; exports[`Record does not accept a non object as constructor 1`] = `"Can not call \`Record\` with a non-object as default values. Use a plain javascript object instead."`; exports[`Record does not accept an immutable object that is not a Record as constructor 1`] = `"Can not call \`Record\` with an immutable Collection as default values. Use a plain javascript object instead."`; immutable-js-immutable-js-6a01d72/__tests__/concat.ts000066400000000000000000000133441522056416100226040ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Seq, Set } from 'immutable'; describe('concat', () => { it('concats two sequences', () => { const a = Seq([1, 2, 3]); const b = Seq([4, 5, 6]); expect(a.concat(b).size).toBe(6); expect(a.concat(b).toArray()).toEqual([1, 2, 3, 4, 5, 6]); }); it('concats two object sequences', () => { const a = Seq({ a: 1, b: 2, c: 3 }); const b = Seq({ d: 4, e: 5, f: 6 }); expect(a.size).toBe(3); expect(a.concat(b).size).toBe(6); expect(a.concat(b).toObject()).toEqual({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, }); }); it('concats objects to keyed seq', () => { const a = Seq({ a: 1, b: 2, c: 3 }); const b = { d: 4, e: 5, f: 6 }; expect(a.concat(b).toObject()).toEqual({ a: 1, b: 2, c: 3, d: 4, e: 5, f: 6, }); }); it('doesnt concat raw arrays to keyed seq', () => { const a = Seq({ a: 1, b: 2, c: 3 }); const b = [4, 5, 6]; expect(() => { // @ts-expect-error -- test that runtime does throw a.concat(b).toJS(); }).toThrow('Expected [K, V] tuple: 4'); }); it('concats arrays to indexed seq', () => { const a = Seq([1, 2, 3]); const b = [4, 5, 6]; expect(a.concat(b).size).toBe(6); expect(a.concat(b).toArray()).toEqual([1, 2, 3, 4, 5, 6]); }); it('concats values', () => { const a = Seq([1, 2, 3]); expect(a.concat(4, 5, 6).size).toBe(6); expect(a.concat(4, 5, 6).toArray()).toEqual([1, 2, 3, 4, 5, 6]); }); it('doesnt concat objects to indexed seq', () => { const a = Seq([0, 1, 2, 3]); const b = { 4: 4 }; const i = a.concat(b); expect(i.size).toBe(5); expect(i.get(4)).toBe(b); expect(i.toArray()).toEqual([0, 1, 2, 3, { 4: 4 }]); }); it('concats multiple arguments', () => { const a = Seq([1, 2, 3]); const b = [4, 5, 6]; const c = [7, 8, 9]; expect(a.concat(b, c).size).toBe(9); expect(a.concat(b, c).toArray()).toEqual([1, 2, 3, 4, 5, 6, 7, 8, 9]); }); it('can concat itself!', () => { const a = Seq([1, 2, 3]); expect(a.concat(a, a).size).toBe(9); expect(a.concat(a, a).toArray()).toEqual([1, 2, 3, 1, 2, 3, 1, 2, 3]); }); it('returns itself when concat does nothing', () => { const a = Seq([1, 2, 3]); const b = Seq(); expect(a.concat()).toBe(a); expect(a.concat(b)).toBe(a); expect(b.concat(b)).toBe(b); }); it('returns non-empty item when concat does nothing', () => { const a = Seq([1, 2, 3]); const b = Seq(); expect(a.concat(b)).toBe(a); expect(b.concat(a)).toBe(a); expect(b.concat(b, b, b, a, b, b)).toBe(a); }); it('always returns the same type', () => { const a = Set([1, 2, 3]); const b = List(); expect(b.concat(a)).not.toBe(a); expect(List.isList(b.concat(a))).toBe(true); expect(b.concat(a)).toEqual(List([1, 2, 3])); }); it('iterates repeated keys', () => { const a = Seq({ a: 1, b: 2, c: 3 }); expect(a.concat(a, a).toObject()).toEqual({ a: 1, b: 2, c: 3 }); expect(a.concat(a, a).valueSeq().toArray()).toEqual([ 1, 2, 3, 1, 2, 3, 1, 2, 3, ]); expect(a.concat(a, a).keySeq().toArray()).toEqual([ 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', ]); expect(a.concat(a, a).toArray()).toEqual([ ['a', 1], ['b', 2], ['c', 3], ['a', 1], ['b', 2], ['c', 3], ['a', 1], ['b', 2], ['c', 3], ]); }); it('lazily reverses un-indexed sequences', () => { const a = Seq({ a: 1, b: 2, c: 3 }); const b = Seq({ d: 4, e: 5, f: 6 }); expect(a.concat(b).reverse().keySeq().toArray()).toEqual([ 'f', 'e', 'd', 'c', 'b', 'a', ]); }); it('lazily reverses indexed sequences', () => { const a = Seq([1, 2, 3]); expect(a.concat(a, a).reverse().size).toBe(9); expect(a.concat(a, a).reverse().toArray()).toEqual([ 3, 2, 1, 3, 2, 1, 3, 2, 1, ]); }); it('lazily reverses indexed sequences with unknown size, maintaining indicies', () => { const a = Seq([1, 2, 3]).filter(() => true); expect(a.size).toBe(undefined); // Note: lazy filter does not know what size in O(1). expect(a.concat(a, a).toKeyedSeq().reverse().size).toBe(undefined); expect(a.concat(a, a).toKeyedSeq().reverse().toArray()).toEqual([ [8, 3], [7, 2], [6, 1], [5, 3], [4, 2], [3, 1], [2, 3], [1, 2], [0, 1], ]); }); it('counts from the end of the indexed sequence on negative index', () => { const i = List.of(9, 5, 3, 1).map((x) => -x); expect(i.get(0)).toBe(-9); expect(i.get(-1)).toBe(-1); expect(i.get(-4)).toBe(-9); expect(i.get(-5, 888)).toBe(888); }); it('should iterate on many concatenated sequences', () => { let meta = Seq(); for (let i = 0; i < 10000; ++i) { meta = meta.concat(i) as Seq; // TODO fix typing } expect(meta.toList().size).toBe(10000); }); it('should handle iterator on many concatenated sequences', () => { const nbLoops = 10000; let meta = Seq(); for (let i = 1; i < nbLoops; i++) { meta = meta.concat(i) as Seq; // TODO fix typing } const it = meta[Symbol.iterator](); let done = false; let i = 0; while (!done) { const result = it.next(); i++; done = !!result.done; } expect(i).toBe(nbLoops); }); it('should iterate on reverse order on concatenated sequences', () => { let meta = Seq([1]); meta = meta.concat(42); const it = meta.reverse()[Symbol.iterator](); const result = it.next(); expect(result).toEqual({ done: false, value: 42, }); }); }); immutable-js-immutable-js-6a01d72/__tests__/count.ts000066400000000000000000000047621522056416100224710ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Range, Seq } from 'immutable'; describe('count', () => { it('counts sequences with known lengths', () => { expect(Seq([1, 2, 3, 4, 5]).size).toBe(5); expect(Seq([1, 2, 3, 4, 5]).count()).toBe(5); }); it('counts sequences with unknown lengths, resulting in a cached size', () => { const seq = Seq([1, 2, 3, 4, 5, 6]).filter((x) => x % 2 === 0); expect(seq.size).toBe(undefined); expect(seq.count()).toBe(3); expect(seq.size).toBe(3); }); it('counts sequences with a specific predicate', () => { const seq = Seq([1, 2, 3, 4, 5, 6]); expect(seq.size).toBe(6); expect(seq.count((x) => x > 3)).toBe(3); }); describe('countBy', () => { it('counts by keyed sequence', () => { const grouped = Seq({ a: 1, b: 2, c: 3, d: 4 }).countBy((x) => x % 2); expect(grouped.toJS()).toEqual({ 1: 2, 0: 2 }); expect(grouped.get(1)).toEqual(2); }); it('counts by indexed sequence', () => { expect( Seq([1, 2, 3, 4, 5, 6]) .countBy((x) => x % 2) .toJS() ).toEqual({ 1: 3, 0: 3 }); }); it('counts by specific keys', () => { expect( Seq([1, 2, 3, 4, 5, 6]) .countBy((x) => (x % 2 ? 'odd' : 'even')) .toJS() ).toEqual({ odd: 3, even: 3 }); }); }); describe('isEmpty', () => { it('is O(1) on sequences with known lengths', () => { expect(Seq([1, 2, 3, 4, 5]).size).toBe(5); expect(Seq([1, 2, 3, 4, 5]).isEmpty()).toBe(false); expect(Seq().size).toBe(0); expect(Seq().isEmpty()).toBe(true); }); it('lazily evaluates Seq with unknown length', () => { let seq = Seq([1, 2, 3, 4, 5, 6]).filter((x) => x % 2 === 0); expect(seq.size).toBe(undefined); expect(seq.isEmpty()).toBe(false); expect(seq.size).toBe(undefined); seq = Seq([1, 2, 3, 4, 5, 6]).filter((x) => x > 10); expect(seq.size).toBe(undefined); expect(seq.isEmpty()).toBe(true); expect(seq.size).toBe(undefined); }); it('with infinitely long sequences of known length', () => { const seq = Range(0, Infinity); expect(seq.size).toBe(Infinity); expect(seq.isEmpty()).toBe(false); }); it('with infinitely long sequences of unknown length', () => { const seq = Range(0, Infinity).filter((x) => x % 2 === 0); expect(seq.size).toBe(undefined); expect(seq.isEmpty()).toBe(false); expect(seq.size).toBe(undefined); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/find.ts000066400000000000000000000012021522056416100222430ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Seq } from 'immutable'; describe('find', () => { it('find returns notSetValue when match is not found', () => { expect(Seq([1, 2, 3, 4, 5, 6]).find(() => false, null, 9)).toEqual(9); }); it('findEntry returns notSetValue when match is not found', () => { expect( Seq([1, 2, 3, 4, 5, 6]).findEntry( () => false, null, 9 ) ).toEqual(9); }); it('findLastEntry returns notSetValue when match is not found', () => { expect(Seq([1, 2, 3, 4, 5, 6]).findLastEntry(() => false, null, 9)).toEqual( 9 ); }); }); immutable-js-immutable-js-6a01d72/__tests__/flatten.ts000066400000000000000000000065251522056416100227750ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Collection, List, Range, Seq, fromJS } from 'immutable'; describe('flatten', () => { it('flattens sequences one level deep', () => { const nested = fromJS([ [1, 2], [3, 4], [5, 6], ]); const flat = nested.flatten(); expect(flat.toJS()).toEqual([1, 2, 3, 4, 5, 6]); }); it('flattening a List returns a List', () => { const nested = fromJS([[1], 2, 3, [4, 5, 6]]); const flat = nested.flatten(); expect(flat.toString()).toEqual('List [ 1, 2, 3, 4, 5, 6 ]'); }); it('gives the correct iteration count', () => { const nested = fromJS([ [1, 2, 3], [4, 5, 6], ]); const flat = nested.flatten(); // @ts-expect-error -- `flatten` return type should be improved expect(flat.forEach((x: number) => x < 4)).toEqual(4); }); type SeqType = number | Array | Collection; it('flattens only Sequences (not sequenceables)', () => { const nested = Seq([Range(1, 3), [3, 4], List([5, 6, 7]), 8]); const flat = nested.flatten(); expect(flat.toJS()).toEqual([1, 2, [3, 4], 5, 6, 7, 8]); }); it('can be reversed', () => { const nested = Seq([Range(1, 3), [3, 4], List([5, 6, 7]), 8]); const flat = nested.flatten(); const reversed = flat.reverse(); expect(reversed.toJS()).toEqual([8, 7, 6, 5, [3, 4], 2, 1]); }); it('can flatten at various levels of depth', () => { const deeplyNested = fromJS([ [ [ ['A', 'B'], ['A', 'B'], ], [ ['A', 'B'], ['A', 'B'], ], ], [ [ ['A', 'B'], ['A', 'B'], ], [ ['A', 'B'], ['A', 'B'], ], ], ]); // deeply flatten expect(deeplyNested.flatten().toJS()).toEqual([ 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', 'A', 'B', ]); // shallow flatten expect(deeplyNested.flatten(true).toJS()).toEqual([ [ ['A', 'B'], ['A', 'B'], ], [ ['A', 'B'], ['A', 'B'], ], [ ['A', 'B'], ['A', 'B'], ], [ ['A', 'B'], ['A', 'B'], ], ]); // flatten two levels expect(deeplyNested.flatten(2).toJS()).toEqual([ ['A', 'B'], ['A', 'B'], ['A', 'B'], ['A', 'B'], ['A', 'B'], ['A', 'B'], ['A', 'B'], ['A', 'B'], ]); }); describe('flatMap', () => { it('first maps, then shallow flattens', () => { const numbers = Range(97, 100); const letters = numbers.flatMap((v) => fromJS([String.fromCharCode(v), String.fromCharCode(v).toUpperCase()]) ); expect(letters.toJS()).toEqual(['a', 'A', 'b', 'B', 'c', 'C']); }); it('maps to sequenceables, not only Sequences.', () => { const numbers = Range(97, 100); // the map function returns an Array, rather than a Collection. // Array is iterable, so this works just fine. const letters = numbers.flatMap((v) => [ String.fromCharCode(v), String.fromCharCode(v).toUpperCase(), ]); expect(letters.toJS()).toEqual(['a', 'A', 'b', 'B', 'c', 'C']); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/fromJS.ts000066400000000000000000000040311522056416100225260ustar00rootroot00000000000000import { runInNewContext } from 'vm'; import { describe, expect, it } from '@jest/globals'; import { List, Map, Set, fromJS, isCollection } from 'immutable'; describe('fromJS', () => { it('convert Array to Immutable.List', () => { const list = fromJS([1, 2, 3]); expect(List.isList(list)).toBe(true); expect(list.count()).toBe(3); }); it('convert plain Object to Immutable.Map', () => { const map = fromJS({ a: 'A', b: 'B', c: 'C' }); expect(Map.isMap(map)).toBe(true); expect(map.count()).toBe(3); }); it('convert JS (global) Set to Immutable.Set', () => { const set = fromJS(new global.Set([1, 2, 3])); expect(Set.isSet(set)).toBe(true); expect(set.count()).toBe(3); }); it('convert JS (global) Map to Immutable.Map', () => { const map = fromJS( new global.Map([ ['a', 'A'], ['b', 'B'], ['c', 'C'], ]) ); expect(Map.isMap(map)).toBe(true); expect(map.count()).toBe(3); }); it('convert iterable to Immutable collection', () => { function* values() { yield 1; yield 2; yield 3; } const result = fromJS(values()); expect(List.isList(result)).toBe(true); expect(result.count()).toBe(3); }); it('does not convert existing Immutable collections', () => { const orderedSet = Set(['a', 'b', 'c']); expect(fromJS(orderedSet)).toBe(orderedSet); }); it('does not convert strings', () => { expect(fromJS('abc')).toBe('abc'); }); it('does not convert non-plain Objects', () => { class Test {} const result = fromJS(new Test()); expect(isCollection(result)).toBe(false); expect(result instanceof Test).toBe(true); }); it('is iterable outside of a vm', () => { expect(isCollection(fromJS({}))).toBe(true); }); // eslint-disable-next-line jest/expect-expect it('is iterable inside of a vm', () => { runInNewContext( ` expect(isCollection(fromJS({}))).toBe(true); `, { expect, isCollection, fromJS, }, {} ); }); }); immutable-js-immutable-js-6a01d72/__tests__/functional/000077500000000000000000000000001522056416100231225ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/__tests__/functional/get.ts000066400000000000000000000023251522056416100242530ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { get, Map, List, Range } from 'immutable'; import invariant from '../../src/utils/invariant'; describe('get', () => { it('for immutable structure', () => { expect(get(Range(0, 100), 20)).toBe(20); expect(get(List(['dog', 'frog', 'cat']), 1)).toBe('frog'); expect(get(List(['dog', 'frog', 'cat']), 20)).toBeUndefined(); expect(get(List(['dog', 'frog', 'cat']), 20, 'ifNotSet')).toBe('ifNotSet'); expect(get(Map({ x: 123, y: 456 }), 'x')).toBe(123); }); it('for Array', () => { expect(get(['dog', 'frog', 'cat'], 1)).toBe('frog'); expect(get(['dog', 'frog', 'cat'], 20)).toBeUndefined(); expect(get(['dog', 'frog', 'cat'], 20, 'ifNotSet')).toBe('ifNotSet'); }); it('for plain objects', () => { expect(get({ x: 123, y: 456 }, 'x')).toBe(123); expect(get({ x: 123, y: 456 }, 'z', 'ifNotSet')).toBe('ifNotSet'); expect( get( { x: 'xx', y: 'yy', get: function (this, key: string) { invariant(typeof this[key] === 'string', 'this[key] is a string'); return this[key].toUpperCase(); }, }, 'x' ) ).toBe('XX'); }); }); immutable-js-immutable-js-6a01d72/__tests__/functional/has.ts000066400000000000000000000012761522056416100242530ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, Range, has } from 'immutable'; describe('has', () => { it('for immutable structure', () => { expect(has(Range(0, 100), 20)).toBe(true); expect(has(List(['dog', 'frog', 'cat']), 1)).toBe(true); expect(has(List(['dog', 'frog', 'cat']), 20)).toBe(false); expect(has(Map({ x: 123, y: 456 }), 'x')).toBe(true); }); it('for Array', () => { expect(has(['dog', 'frog', 'cat'], 1)).toBe(true); expect(has(['dog', 'frog', 'cat'], 20)).toBe(false); }); it('for plain objects', () => { expect(has({ x: 123, y: 456 }, 'x')).toBe(true); expect(has({ x: 123, y: 456 }, 'z')).toBe(false); }); }); immutable-js-immutable-js-6a01d72/__tests__/functional/remove.ts000066400000000000000000000010571522056416100247720ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, remove } from 'immutable'; describe('remove', () => { it('for immutable structure', () => { expect(remove(List(['dog', 'frog', 'cat']), 1)).toEqual( List(['dog', 'cat']) ); expect(remove(Map({ x: 123, y: 456 }), 'x')).toEqual(Map({ y: 456 })); }); it('for Array', () => { expect(remove(['dog', 'frog', 'cat'], 1)).toEqual(['dog', 'cat']); }); it('for plain objects', () => { expect(remove({ x: 123, y: 456 }, 'x')).toEqual({ y: 456 }); }); }); immutable-js-immutable-js-6a01d72/__tests__/functional/set.ts000066400000000000000000000047001522056416100242660ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { set } from 'immutable'; describe('set', () => { it('for immutable structure', () => { const originalArray = ['dog', 'frog', 'cat']; expect(set(originalArray, 1, 'cow')).toEqual(['dog', 'cow', 'cat']); expect(set(originalArray, 4, 'cow')).toEqual([ 'dog', 'frog', 'cat', undefined, 'cow', ]); expect(originalArray).toEqual(['dog', 'frog', 'cat']); const originalObject = { x: 123, y: 456 }; expect(set(originalObject, 'x', 789)).toEqual({ x: 789, y: 456 }); expect(set(originalObject, 'z', 789)).toEqual({ x: 123, y: 456, z: 789 }); expect(originalObject).toEqual({ x: 123, y: 456 }); }); it('for Array', () => { const originalArray = ['dog', 'frog', 'cat']; expect(set(originalArray, 1, 'cow')).toEqual(['dog', 'cow', 'cat']); expect(set(originalArray, 4, 'cow')).toEqual([ 'dog', 'frog', 'cat', undefined, 'cow', ]); expect(originalArray).toEqual(['dog', 'frog', 'cat']); }); it('for plain objects', () => { const originalObject = { x: 123, y: 456 }; expect(set(originalObject, 'x', 789)).toEqual({ x: 789, y: 456 }); expect(set(originalObject, 'z', 789)).toEqual({ x: 123, y: 456, z: 789 }); expect(originalObject).toEqual({ x: 123, y: 456 }); }); it('is not sensible to prototype pollution via set on plain object', () => { type User = { user: string; admin?: boolean }; const obj: User = { user: 'Alice' }; // Setting __proto__ key should not change the returned object's prototype chain // @ts-expect-error -- intentionally setting __proto__ to test prototype pollution const result = set(obj, '__proto__', { admin: true }); // The returned copy should NOT have 'admin' accessible via prototype // @ts-expect-error -- testing prototype pollution expect(result.admin).toBeUndefined(); }); it('is not sensible to prototype pollution via set with JSON.parse source', () => { type User = { user: string; admin?: boolean }; // JSON.parse creates __proto__ as an own property const malicious = JSON.parse( '{"user":"Eve","__proto__":{"admin":true}}' ) as User; // set on an object that already carries __proto__ from JSON.parse const result = set(malicious, 'user', 'Alice'); // The returned copy should NOT have 'admin' accessible via prototype pollution expect(result.admin).toBeUndefined(); }); }); immutable-js-immutable-js-6a01d72/__tests__/functional/update.ts000066400000000000000000000040441522056416100247560ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { update } from 'immutable'; describe('update', () => { it('for immutable structure', () => { const originalArray = ['dog', 'frog', 'cat']; expect(update(originalArray, 1, (val) => val?.toUpperCase())).toEqual([ 'dog', 'FROG', 'cat', ]); expect(originalArray).toEqual(['dog', 'frog', 'cat']); const originalObject = { x: 123, y: 456 }; expect(update(originalObject, 'x', (val) => val * 6)).toEqual({ x: 738, y: 456, }); expect(originalObject).toEqual({ x: 123, y: 456 }); }); it('for Array', () => { const originalArray = ['dog', 'frog', 'cat']; expect(update(originalArray, 1, (val) => val?.toUpperCase())).toEqual([ 'dog', 'FROG', 'cat', ]); expect(originalArray).toEqual(['dog', 'frog', 'cat']); }); it('for plain objects', () => { const originalObject = { x: 123, y: 456 }; expect(update(originalObject, 'x', (val) => val * 6)).toEqual({ x: 738, y: 456, }); expect(originalObject).toEqual({ x: 123, y: 456 }); }); it('is not sensible to prototype pollution via update on plain object', () => { type User = { user: string; admin?: boolean }; const obj: User = { user: 'Alice' }; // @ts-expect-error -- intentionally setting __proto__ to test prototype pollution const result = update(obj, '__proto__', () => ({ admin: true, })) as unknown as User; // The returned copy should NOT have 'admin' accessible via prototype expect(result.admin).toBeUndefined(); }); it('is not sensible to prototype pollution via update with JSON.parse source', () => { type User = { user: string; admin?: boolean }; // JSON.parse creates __proto__ as an own property const malicious = JSON.parse('{"user":"Eve","__proto__":{"admin":true}}'); const result = update(malicious, 'user', () => 'Alice') as User; // The returned copy (via shallowCopy) should NOT have 'admin' via prototype expect(result.admin).toBeUndefined(); }); }); immutable-js-immutable-js-6a01d72/__tests__/get.ts000066400000000000000000000023471522056416100221150ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Range } from 'immutable'; describe('get', () => { it('gets any index', () => { const seq = Range(0, 100); expect(seq.get(20)).toBe(20); }); it('gets first', () => { const seq = Range(0, 100); expect(seq.first()).toBe(0); }); it('gets last', () => { const seq = Range(0, 100); expect(seq.last()).toBe(99); }); it('gets any index after reversing', () => { const seq = Range(0, 100).reverse(); expect(seq.get(20)).toBe(79); }); it('gets first after reversing', () => { const seq = Range(0, 100).reverse(); expect(seq.first()).toBe(99); }); it('gets last after reversing', () => { const seq = Range(0, 100).reverse(); expect(seq.last()).toBe(0); }); it('gets any index when size is unknown', () => { const seq = Range(0, 100).filter((x) => x % 2 === 1); expect(seq.get(20)).toBe(41); }); it('gets first when size is unknown', () => { const seq = Range(0, 100).filter((x) => x % 2 === 1); expect(seq.first()).toBe(1); }); it('gets last when size is unknown', () => { const seq = Range(0, 100).filter((x) => x % 2 === 1); expect(seq.last()).toBe(99); // Note: this is O(N) }); }); immutable-js-immutable-js-6a01d72/__tests__/getIn.ts000066400000000000000000000100341522056416100223740ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, fromJS, getIn } from 'immutable'; describe('getIn', () => { it('deep get', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect(m.getIn(['a', 'b', 'c'])).toEqual(10); expect(getIn(m, ['a', 'b', 'c'])).toEqual(10); }); it('deep get with list as keyPath', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect(m.getIn(fromJS(['a', 'b', 'c']))).toEqual(10); expect(getIn(m, fromJS(['a', 'b', 'c']))).toEqual(10); }); it('deep get throws without list or array-like', () => { // @ts-expect-error -- test that runtime does throw expect(() => Map().getIn(undefined)).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: undefined' ); // @ts-expect-error -- test that runtime does throw expect(() => Map().getIn({ a: 1, b: 2 })).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: [object Object]' ); // TODO: should expect error expect(() => Map().getIn('abc')).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: abc' ); // TODO: should expect error expect(() => getIn(Map(), 'abc')).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: abc' ); }); it('deep get returns not found if path does not match', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect(m.getIn(['a', 'b', 'z'])).toEqual(undefined); expect(m.getIn(['a', 'b', 'z'], 123)).toEqual(123); expect(m.getIn(['a', 'y', 'z'])).toEqual(undefined); expect(m.getIn(['a', 'y', 'z'], 123)).toEqual(123); expect(getIn(m, ['a', 'y', 'z'])).toEqual(undefined); expect(getIn(m, ['a', 'y', 'z'], 123)).toEqual(123); }); it('does not use notSetValue when path does exist but value is nullable', () => { const m = fromJS({ a: { b: { c: null, d: undefined } } }); expect(m.getIn(['a', 'b', 'c'])).toEqual(null); expect(m.getIn(['a', 'b', 'd'])).toEqual(undefined); expect(m.getIn(['a', 'b', 'c'], 123)).toEqual(null); expect(m.getIn(['a', 'b', 'd'], 123)).toEqual(undefined); expect(getIn(m, ['a', 'b', 'c'], 123)).toEqual(null); expect(getIn(m, ['a', 'b', 'd'], 123)).toEqual(undefined); }); it('deep get returns not found if path encounters non-data-structure', () => { const m = fromJS({ a: { b: { c: null, d: undefined } } }); expect(m.getIn(['a', 'b', 'c', 'x'])).toEqual(undefined); expect(m.getIn(['a', 'b', 'c', 'x'], 123)).toEqual(123); expect(m.getIn(['a', 'b', 'd', 'x'])).toEqual(undefined); expect(m.getIn(['a', 'b', 'd', 'x'], 123)).toEqual(123); expect(getIn(m, ['a', 'b', 'd', 'x'])).toEqual(undefined); expect(getIn(m, ['a', 'b', 'd', 'x'], 123)).toEqual(123); expect(getIn('a', ['length'])).toEqual(undefined); expect(getIn(new Date(), ['getDate'])).toEqual(undefined); }); it('gets in nested plain Objects and Arrays', () => { const m = List([{ key: ['item'] }]); expect(m.getIn([0, 'key', 0])).toEqual('item'); }); it('deep get returns not found if non-existing path in nested plain Object', () => { const deep = Map({ key: { regular: 'jsobj' }, list: List([Map({ num: 10 })]), }); expect(deep.getIn(['key', 'foo', 'item'])).toBe(undefined); expect(deep.getIn(['key', 'foo', 'item'], 'notSet')).toBe('notSet'); expect(deep.getIn(['list', 0, 'num', 'badKey'])).toBe(undefined); expect(deep.getIn(['list', 0, 'num', 'badKey'], 'notSet')).toBe('notSet'); }); it('gets in plain Objects and Arrays', () => { const m = [{ key: ['item'] }]; expect(getIn(m, [0, 'key', 0])).toEqual('item'); }); it('deep get returns not found if non-existing path in plain Object', () => { const deep = { key: { regular: 'jsobj' }, list: [{ num: 10 }] }; expect(getIn(deep, ['key', 'foo', 'item'])).toBe(undefined); expect(getIn(deep, ['key', 'foo', 'item'], 'notSet')).toBe('notSet'); expect(getIn(deep, ['list', 0, 'num', 'badKey'])).toBe(undefined); expect(getIn(deep, ['list', 0, 'num', 'badKey'], 'notSet')).toBe('notSet'); }); }); immutable-js-immutable-js-6a01d72/__tests__/groupBy.ts000066400000000000000000000065061522056416100227660ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Collection, List, Map, OrderedMap, OrderedSet, Seq, Set, Stack, isOrdered, } from 'immutable'; describe('groupBy', () => { it.each` constructor | constructorIsOrdered | isObject ${Collection} | ${true} | ${false} ${List} | ${true} | ${false} ${Seq} | ${true} | ${false} ${Set} | ${false} | ${false} ${Stack} | ${true} | ${false} ${OrderedSet} | ${true} | ${false} ${Map} | ${false} | ${true} ${OrderedMap} | ${true} | ${true} `( 'groupBy returns ordered or unordered of the base type is ordered or not: $constructor.name', ({ constructor, constructorIsOrdered, isObject }) => { const iterableConstructor = ['a', 'b', 'a', 'c']; const objectConstructor = { a: 1, b: 2, c: 3, d: 1 }; const col = constructor( isObject ? objectConstructor : iterableConstructor ); const grouped = col.groupBy((v: unknown) => v); // all groupBy should be instance of Map expect(grouped).toBeInstanceOf(Map); // ordered objects should be instance of OrderedMap expect(isOrdered(col)).toBe(constructorIsOrdered); expect(isOrdered(grouped)).toBe(constructorIsOrdered); if (constructorIsOrdered) { // eslint-disable-next-line jest/no-conditional-expect expect(grouped).toBeInstanceOf(OrderedMap); } else { // eslint-disable-next-line jest/no-conditional-expect expect(grouped).not.toBeInstanceOf(OrderedMap); } } ); it('groups keyed sequence', () => { const grouped = Seq({ a: 1, b: 2, c: 3, d: 4 }).groupBy((x) => x % 2); expect(grouped.toJS()).toEqual({ 1: { a: 1, c: 3 }, 0: { b: 2, d: 4 } }); // Each group should be a keyed sequence, not an indexed sequence const firstGroup = grouped.get(1); expect(firstGroup && firstGroup.toArray()).toEqual([ ['a', 1], ['c', 3], ]); }); it('groups indexed sequence', () => { const group = Seq([1, 2, 3, 4, 5, 6]).groupBy((x) => x % 2); expect(group.toJS()).toEqual({ 1: [1, 3, 5], 0: [2, 4, 6] }); }); it('groups to keys', () => { const group = Seq([1, 2, 3, 4, 5, 6]).groupBy((x) => x % 2 ? 'odd' : 'even' ); expect(group.toJS()).toEqual({ odd: [1, 3, 5], even: [2, 4, 6] }); }); it('allows `undefined` as a key', () => { const group = Seq([1, 2, 3, 4, 5, 6]).groupBy((x) => x % 2 ? undefined : 'even' ); expect(group.toJS()).toEqual({ undefined: [1, 3, 5], even: [2, 4, 6] }); }); it('groups indexed sequences, maintaining indicies when keyed sequences', () => { const group = Seq([1, 2, 3, 4, 5, 6]).groupBy((x) => x % 2); expect(group.toJS()).toEqual({ 1: [1, 3, 5], 0: [2, 4, 6] }); const keyedGroup = Seq([1, 2, 3, 4, 5, 6]) .toKeyedSeq() .groupBy((x) => x % 2); expect(keyedGroup.toJS()).toEqual({ 1: { 0: 1, 2: 3, 4: 5 }, 0: { 1: 2, 3: 4, 5: 6 }, }); }); it('has groups that can be mapped', () => { const mappedGroup = Seq([1, 2, 3, 4, 5, 6]) .groupBy((x) => x % 2) .map((group) => group.map((value) => value * 10)); expect(mappedGroup.toJS()).toEqual({ 1: [10, 30, 50], 0: [20, 40, 60] }); }); }); immutable-js-immutable-js-6a01d72/__tests__/hasIn.ts000066400000000000000000000050331522056416100223730ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, fromJS, hasIn } from 'immutable'; describe('hasIn', () => { it('deep has', () => { const m = fromJS({ a: { b: { c: 10, d: undefined } } }); expect(m.hasIn(['a', 'b', 'c'])).toEqual(true); expect(m.hasIn(['a', 'b', 'd'])).toEqual(true); expect(m.hasIn(['a', 'b', 'z'])).toEqual(false); expect(m.hasIn(['a', 'y', 'z'])).toEqual(false); expect(hasIn(m, ['a', 'b', 'c'])).toEqual(true); expect(hasIn(m, ['a', 'b', 'z'])).toEqual(false); }); it('deep has with list as keyPath', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect(m.hasIn(fromJS(['a', 'b', 'c']))).toEqual(true); expect(m.hasIn(fromJS(['a', 'b', 'z']))).toEqual(false); expect(m.hasIn(fromJS(['a', 'y', 'z']))).toEqual(false); expect(hasIn(m, fromJS(['a', 'b', 'c']))).toEqual(true); expect(hasIn(m, fromJS(['a', 'y', 'z']))).toEqual(false); }); it('deep has throws without list or array-like', () => { // @ts-expect-error -- test that runtime does throw expect(() => Map().hasIn(undefined)).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: undefined' ); // @ts-expect-error -- test that runtime does throw expect(() => Map().hasIn({ a: 1, b: 2 })).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: [object Object]' ); // TODO: should expect error expect(() => Map().hasIn('abc')).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: abc' ); // TODO: should expect error expect(() => hasIn(Map(), 'abc')).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: abc' ); }); it('deep has does not throw if non-readable path', () => { const deep = Map({ key: { regular: 'jsobj' }, list: List([Map({ num: 10 })]), }); expect(deep.hasIn(['key', 'foo', 'item'])).toBe(false); expect(deep.hasIn(['list', 0, 'num', 'badKey'])).toBe(false); expect(hasIn(deep, ['key', 'foo', 'item'])).toBe(false); expect(hasIn(deep, ['list', 0, 'num', 'badKey'])).toBe(false); }); it('deep has in plain Object and Array', () => { const m = { a: { b: { c: [10, undefined], d: undefined } } }; expect(hasIn(m, ['a', 'b', 'c', 0])).toEqual(true); expect(hasIn(m, ['a', 'b', 'c', 1])).toEqual(true); expect(hasIn(m, ['a', 'b', 'c', 2])).toEqual(false); expect(hasIn(m, ['a', 'b', 'd'])).toEqual(true); expect(hasIn(m, ['a', 'b', 'z'])).toEqual(false); expect(hasIn(m, ['a', 'b', 'z'])).toEqual(false); }); }); immutable-js-immutable-js-6a01d72/__tests__/hash.ts000066400000000000000000000032151522056416100222540ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { hash } from 'immutable'; describe('hash', () => { it('stable hash of well known values', () => { expect(hash(true)).toBe(0x42108421); expect(hash(false)).toBe(0x42108420); expect(hash(0)).toBe(0); expect(hash(null)).toBe(0x42108422); expect(hash(undefined)).toBe(0x42108423); expect(hash('a')).toBe(97); expect(hash('immutable-js')).toBe(510203252); expect(hash(123)).toBe(123); }); it('generates different hashes for decimal values', () => { expect(hash(123.456)).toBe(884763256); expect(hash(123.4567)).toBe(887769707); }); it('generates different hashes for different objects', () => { const objA = {}; const objB = {}; expect(hash(objA)).toBe(hash(objA)); expect(hash(objA)).not.toBe(hash(objB)); }); it('generates different hashes for different symbols', () => { const symA = Symbol(); const symB = Symbol(); expect(hash(symA)).toBe(hash(symA)); expect(hash(symA)).not.toBe(hash(symB)); }); it('generates different hashes for different functions', () => { const funA = () => {}; const funB = () => {}; expect(hash(funA)).toBe(hash(funA)); expect(hash(funA)).not.toBe(hash(funB)); }); const genValue = fc.oneof(fc.string(), fc.integer()); it('generates unsigned 31-bit integers', () => { fc.assert( fc.property(genValue, (value) => { const hashVal = hash(value); expect(Number.isInteger(hashVal)).toBe(true); expect(hashVal).toBeGreaterThan(-(2 ** 31)); expect(hashVal).toBeLessThan(2 ** 31); }) ); }); }); immutable-js-immutable-js-6a01d72/__tests__/interpose.ts000066400000000000000000000021241522056416100233370ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Range } from 'immutable'; describe('interpose', () => { it('separates with a value', () => { const range = Range(10, 15); const interposed = range.interpose(0); expect(interposed.toArray()).toEqual([10, 0, 11, 0, 12, 0, 13, 0, 14]); }); it('can be iterated', () => { const range = Range(10, 15); const interposed = range.interpose(0); const values = interposed.values(); expect(values.next()).toEqual({ value: 10, done: false }); expect(values.next()).toEqual({ value: 0, done: false }); expect(values.next()).toEqual({ value: 11, done: false }); expect(values.next()).toEqual({ value: 0, done: false }); expect(values.next()).toEqual({ value: 12, done: false }); expect(values.next()).toEqual({ value: 0, done: false }); expect(values.next()).toEqual({ value: 13, done: false }); expect(values.next()).toEqual({ value: 0, done: false }); expect(values.next()).toEqual({ value: 14, done: false }); expect(values.next()).toEqual({ value: undefined, done: true }); }); }); immutable-js-immutable-js-6a01d72/__tests__/issues.ts000066400000000000000000000112531522056416100226450ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, OrderedMap, OrderedSet, Record, Seq, Set, fromJS, } from 'immutable'; describe('Issue #1175', () => { it('invalid hashCode() response should not infinitly recurse', () => { class BadHash { equals() { return false; } hashCode() { return 2 ** 32; } } const set = Set([new BadHash()]); expect(set.size).toEqual(1); }); }); describe('Issue #1188', () => { it('Removing items from OrderedSet should return OrderedSet', () => { const orderedSet = OrderedSet(['one', 'two', 'three']); const emptyOrderedSet = orderedSet.subtract(['two', 'three', 'one']); expect(OrderedSet.isOrderedSet(emptyOrderedSet)).toBe(true); }); }); describe('Issue #1220 : Seq.rest() throws an exception when invoked on a single item sequence', () => { it('should be iterable', () => { // Helper for this test const ITERATOR_SYMBOL = (typeof Symbol === 'function' && Symbol.iterator) || '@@iterator'; const r = Seq([1]).rest(); // @ts-expect-error -- any type for too complex object const i = r[ITERATOR_SYMBOL](); expect(i.next()).toEqual({ value: undefined, done: true }); }); }); describe('Issue #1245', () => { it('should return empty collection after takeLast(0)', () => { const size = List(['a', 'b', 'c']).takeLast(0).size; expect(size).toEqual(0); }); }); describe('Issue #1262', () => { it('Set.subtract should accept an array', () => { const MyType = Record({ val: 1 }); const set1 = Set([ MyType({ val: 1 }), MyType({ val: 2 }), MyType({ val: 3 }), ]); const set2 = set1.subtract([MyType({ val: 2 })]); const set3 = set1.subtract(List([MyType({ val: 2 })])); expect(set2).toEqual(set3); }); }); describe('Issue #1287', () => { it('should skip all items in OrderedMap when skipping Infinity', () => { const size = OrderedMap([['a', 1]]).skip(Infinity).size; expect(size).toEqual(0); }); }); describe('Issue #1247', () => { it('Records should not be considered altered after creation', () => { const R = Record({ a: 1 }); const r = new R(); expect(r.wasAltered()).toBe(false); }); }); describe('Issue #1252', () => { it('should be toString-able even if it contains a value which is not', () => { const prototypelessObj = Object.create(null); const list = List([prototypelessObj]); expect(list.toString()).toBe('List [ {} ]'); }); }); describe('Issue #1293', () => { it('merge() should not deeply coerce values', () => { type StateObject = { foo: string | { qux: string }; biz?: string }; const State = Record({ foo: 'bar', biz: 'baz' }); const deepObject = { qux: 'quux' }; const firstState = State({ foo: deepObject }); const secondState = State().merge({ foo: deepObject }); expect(secondState).toEqual(firstState); }); }); describe('Issue #1643', () => { [ ['a string', 'test'], ['a number', 5], ['null', null], ['undefined', undefined], ['a boolean', true], ['an object', {}], ['an array', []], ['a function', () => null], ].forEach(([label, value]) => { class MyClass { valueOf() { return value; } } it(`Collection#hashCode() should handle objects that return ${label} for valueOf`, () => { const set = Set().add(new MyClass()); expect(() => set.hashCode()).not.toThrow(); }); }); }); describe('Issue #1785', () => { it('merge() should not return undefined', () => { const emptyRecord = Record({})(); expect(emptyRecord.merge({ id: 1 })).toBe(emptyRecord); }); }); describe('Issue #1475', () => { it('complex case should return first value on mergeDeep when types are incompatible', () => { const a = fromJS({ ch: [ { code: 8, }, ], }) as Map; const b = fromJS({ ch: { code: 8, }, }); expect(a.mergeDeep(b).equals(b)).toBe(true); }); it('simple case should return first value on mergeDeep when types are incompatible', () => { const a = fromJS({ ch: [], }) as Map; const b = fromJS({ ch: { code: 8 }, }); expect(a.merge(b).equals(b)).toBe(true); }); }); describe('Issue #1719', () => { it('mergeDeep() should overwrite when types conflict', () => { const objWithObj = fromJS({ items: { '1': { id: '1', }, }, }) as Map; const objWithArray = fromJS({ items: [ { id: '1', }, ], }); expect(objWithObj.mergeDeep(objWithArray).equals(objWithArray)).toBe(true); }); }); immutable-js-immutable-js-6a01d72/__tests__/join.ts000066400000000000000000000024421522056416100222710ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { Seq } from 'immutable'; describe('join', () => { it('string-joins sequences with commas by default', () => { expect(Seq([1, 2, 3, 4, 5]).join()).toBe('1,2,3,4,5'); }); it('string-joins sequences with any string', () => { expect(Seq([1, 2, 3, 4, 5]).join('foo')).toBe('1foo2foo3foo4foo5'); }); it('string-joins sequences with empty string', () => { expect(Seq([1, 2, 3, 4, 5]).join('')).toBe('12345'); }); it('joins sparse-sequences like Array.join', () => { const a = [ 1, undefined, 2, undefined, 3, undefined, 4, undefined, 5, undefined, undefined, ]; expect(Seq(a).join()).toBe(a.join()); }); const genPrimitive = fc.oneof( fc.string(), fc.integer(), fc.boolean(), fc.constant(null), fc.constant(undefined), fc.constant(NaN) ); it('behaves the same as Array.join', () => { fc.assert( fc.property(fc.array(genPrimitive), genPrimitive, (array, joiner) => { // @ts-expect-error unexpected values for typescript joiner, but valid at runtime despite the unexpected errors expect(Seq(array).join(joiner)).toBe(array.join(joiner)); }) ); }); }); immutable-js-immutable-js-6a01d72/__tests__/merge.ts000066400000000000000000000306271522056416100224370ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, Record, Set, fromJS, merge, mergeDeep, mergeDeepWith, } from 'immutable'; describe('merge', () => { it('merges two maps', () => { const m1 = Map({ a: 1, b: 2, c: 3 }); const m2 = Map({ d: 10, b: 20, e: 30 }); expect(m1.merge(m2)).toEqual(Map({ a: 1, b: 20, c: 3, d: 10, e: 30 })); }); it('can merge in an explicitly undefined value', () => { const m1 = Map({ a: 1, b: 2 }); const m2 = Map({ a: undefined }); expect(m1.merge(m2)).toEqual(Map({ a: undefined, b: 2 })); }); it('merges two maps with a merge function', () => { const m1 = Map({ a: 1, b: 2, c: 3 }); const m2 = Map({ d: 10, b: 20, e: 30 }); expect(m1.mergeWith((a: number, b: number) => a + b, m2)).toEqual( Map({ a: 1, b: 22, c: 3, d: 10, e: 30 }) ); }); it('throws typeError without merge function', () => { const m1 = Map({ a: 1, b: 2, c: 3 }); const m2 = Map({ d: 10, b: 20, e: 30 }); // @ts-expect-error -- test that runtime does throw expect(() => m1.mergeWith(1, m2)).toThrow(TypeError); }); it('provides key as the third argument of merge function', () => { const m1 = Map({ id: 'temp', b: 2, c: 3 }); const m2 = Map({ id: 10, b: 20, e: 30 }); const add = (a: number, b: number) => a + b; expect( // @ts-expect-error -- it's difficult to type `a` not as `string | number` m1.mergeWith((a, b, key) => (key !== 'id' ? add(a, b) : b), m2) ).toEqual(Map({ id: 10, b: 22, c: 3, e: 30 })); }); it('deep merges two maps', () => { const m1 = fromJS({ a: { b: { c: 1, d: 2 } } }); const m2 = fromJS({ a: { b: { c: 10, e: 20 }, f: 30 }, g: 40 }); expect(m1.mergeDeep(m2)).toEqual( fromJS({ a: { b: { c: 10, d: 2, e: 20 }, f: 30 }, g: 40 }) ); }); it('merge uses === for return-self optimization', () => { const date1 = new Date(1234567890000); // Value equal, but different reference. const date2 = new Date(1234567890000); const m = Map().set('a', date1); expect(m.merge({ a: date2 })).not.toBe(m); expect(m.merge({ a: date1 })).toBe(m); }); it('deep merge uses === for return-self optimization', () => { const date1 = new Date(1234567890000); // Value equal, but different reference. const date2 = new Date(1234567890000); const m = Map().setIn(['a', 'b', 'c'], date1); expect(m.mergeDeep({ a: { b: { c: date2 } } })).not.toBe(m); expect(m.mergeDeep({ a: { b: { c: date1 } } })).toBe(m); }); it('deep merges raw JS', () => { const m1 = fromJS({ a: { b: { c: 1, d: 2 } } }); const js = { a: { b: { c: 10, e: 20 }, f: 30 }, g: 40 }; expect(m1.mergeDeep(js)).toEqual( fromJS({ a: { b: { c: 10, d: 2, e: 20 }, f: 30 }, g: 40 }) ); }); it('deep merges raw JS with a merge function', () => { const m1 = fromJS({ a: { b: { c: 1, d: 2 } } }); const js = { a: { b: { c: 10, e: 20 }, f: 30 }, g: 40 }; // @ts-expect-error type of `mergeDeepWith` is too lazy for now expect(m1.mergeDeepWith((a: number, b: number) => a + b, js)).toEqual( fromJS({ a: { b: { c: 11, d: 2, e: 20 }, f: 30 }, g: 40 }) ); }); it('deep merges raw JS into raw JS with a merge function', () => { const js1 = { a: { b: { c: 1, d: 2 } } }; const js2 = { a: { b: { c: 10, e: 20 }, f: 30 }, g: 40 }; // @ts-expect-error type of `mergeDeepWith` is too lazy for now expect(mergeDeepWith((a: number, b: number) => a + b, js1, js2)).toEqual({ a: { b: { c: 11, d: 2, e: 20 }, f: 30 }, g: 40, }); }); it('deep merges collections into raw JS with a merge function', () => { const js = { a: { b: { c: 1, d: 2 } } }; const m = fromJS({ a: { b: { c: 10, e: 20 }, f: 30 }, g: 40 }); // @ts-expect-error type of `mergeDeepWith` is too lazy for now expect(mergeDeepWith((a: number, b: number) => a + b, js, m)).toEqual({ a: { b: { c: 11, d: 2, e: 20 }, f: 30 }, g: 40, }); }); it('returns self when a deep merges is a no-op', () => { const m1 = fromJS({ a: { b: { c: 1, d: 2 } } }); expect(m1.mergeDeep({ a: { b: { c: 1 } } })).toBe(m1); }); it('returns arg when a deep merges is a no-op', () => { const m1 = fromJS({ a: { b: { c: 1, d: 2 } } }); expect(Map().mergeDeep(m1)).toBe(m1); }); it('returns self when a deep merges is a no-op on raw JS', () => { const m1 = { a: { b: { c: 1, d: 2 } } }; expect(mergeDeep(m1, { a: { b: { c: 1 } } })).toBe(m1); }); it('can overwrite existing maps', () => { expect( fromJS({ a: { x: 1, y: 1 }, b: { x: 2, y: 2 } }).merge({ a: null, b: Map({ x: 10 }), }) ).toEqual(fromJS({ a: null, b: { x: 10 } })); expect( fromJS({ a: { x: 1, y: 1 }, b: { x: 2, y: 2 } }).mergeDeep({ a: null, b: { x: 10 }, }) ).toEqual(fromJS({ a: null, b: { x: 10, y: 2 } })); }); it('can overwrite existing maps with objects', () => { const m1 = fromJS({ a: { x: 1, y: 1 } }); // deep conversion. const m2 = Map({ a: { z: 10 } }); // shallow conversion to Map. // Raw object simply replaces map. expect(m1.merge(m2).get('a')).toEqual({ z: 10 }); // raw object. // However, mergeDeep will merge that value into the inner Map. expect(m1.mergeDeep(m2).get('a')).toEqual(Map({ x: 1, y: 1, z: 10 })); }); it('merges map entries with List and Set values', () => { const initial = Map({ a: Map({ x: 10, y: 20 }), b: List([1, 2, 3]), c: Set([1, 2, 3]), }); const additions = Map({ a: Map({ y: 50, z: 100 }), b: List([4, 5, 6]), c: Set([4, 5, 6]), }); expect(initial.mergeDeep(additions)).toEqual( Map({ a: Map({ x: 10, y: 50, z: 100 }), b: List([1, 2, 3, 4, 5, 6]), c: Set([1, 2, 3, 4, 5, 6]), }) ); }); it('merges map entries with new values', () => { const initial = Map({ a: List([1]) }); // Note: merge and mergeDeep do not deeply coerce values, they only merge // with what's there prior. expect(initial.merge({ b: [2] })).toEqual(Map({ a: List([1]), b: [2] })); expect(initial.mergeDeep({ b: [2] })).toEqual( fromJS(Map({ a: List([1]), b: [2] })) ); }); it('maintains JS values inside immutable collections', () => { const m1 = fromJS({ a: { b: { imm: 'map' } } }); const m2 = m1.mergeDeep(Map({ a: Map({ b: { plain: 'obj' } }) })); expect(m1.getIn(['a', 'b'])).toEqual(Map([['imm', 'map']])); // However mergeDeep will merge that value into the inner Map expect(m2.getIn(['a', 'b'])).toEqual(Map({ imm: 'map', plain: 'obj' })); }); it('merges plain Objects', () => { expect(merge({ x: 1, y: 1 }, { y: 2, z: 2 }, Map({ z: 3, q: 3 }))).toEqual({ x: 1, y: 2, z: 3, q: 3, }); }); it('merges plain Arrays', () => { expect(merge([1, 2], [3, 4], List([5, 6]))).toEqual([1, 2, 3, 4, 5, 6]); }); it('merging plain Array returns self after no-op', () => { const a = [1, 2, 3]; expect(merge(a, [], [])).toBe(a); }); it('merges records with a size property set to 0', () => { const Sizable = Record({ size: 0 }); expect(Sizable().merge({ size: 123 }).size).toBe(123); }); it('mergeDeep merges partial conflicts', () => { const a = fromJS({ ch: [ { code: 8, }, ], banana: 'good', }) as Map; const b = fromJS({ ch: { code: 8, }, apple: 'anti-doctor', }); expect( a.mergeDeep(b).equals( fromJS({ ch: { code: 8, }, apple: 'anti-doctor', banana: 'good', }) ) ).toBe(true); }); // eslint-disable-next-line @typescript-eslint/no-explicit-any type TypeValue = { type: any; value: any }; const map: TypeValue = { type: 'Map', value: Map({ b: 5, c: 9 }) }; const object: TypeValue = { type: 'object', value: { b: 7, d: 12 } }; const RecordFactory = Record({ a: 1, b: 2 }); const record: TypeValue = { type: 'Record', value: RecordFactory({ b: 3 }) }; const list: TypeValue = { type: 'List', value: List(['5']) }; const array: TypeValue = { type: 'array', value: ['9'] }; const set: TypeValue = { type: 'Set', value: Set('3') }; const incompatibleTypes: Array<[TypeValue, TypeValue]> = [ [map, list], [map, array], [map, set], [object, list], [object, array], [object, set], [record, list], [record, array], [record, set], [list, set], ]; for (const [ { type: type1, value: value1 }, { type: type2, value: value2 }, ] of incompatibleTypes) { it(`mergeDeep and Map#mergeDeep replaces ${type1} and ${type2} with each other`, () => { const aObject = { a: value1 }; const bObject = { a: value2 }; expect(mergeDeep(aObject, bObject)).toEqual(bObject); expect(mergeDeep(bObject, aObject)).toEqual(aObject); const aMap = Map({ a: value1 }); const bMap = Map({ a: value2 }); expect(aMap.mergeDeep(bMap).equals(bMap)).toBe(true); expect(bMap.mergeDeep(aMap).equals(aMap)).toBe(true); }); } const compatibleTypesAndResult = [ [map, object, Map({ b: 7, c: 9, d: 12 })], [map, record, Map({ a: 1, b: 3, c: 9 })], [object, map, { b: 5, c: 9, d: 12 }], [object, record, { a: 1, b: 3, d: 12 }], [record, map, RecordFactory({ b: 5 })], [record, object, RecordFactory({ b: 7 })], [list, array, List(['5', '9'])], [array, list, ['9', '5']], [map, { type: 'Map', value: Map({ b: 7 }) }, Map({ b: 7, c: 9 })], [object, { type: 'object', value: { d: 3 } }, { b: 7, d: 3 }], [ record, { type: 'Record', value: RecordFactory({ a: 3 }) }, RecordFactory({ a: 3, b: 2 }), ], [list, { type: 'List', value: List(['12']) }, List(['5', '12'])], [array, { type: 'array', value: ['3'] }, ['9', '3']], [set, { type: 'Set', value: Set(['3', '5']) }, Set(['3', '5'])], ] as const; for (const [ { type: type1, value: value1 }, { type: type2, value: value2 }, result, ] of compatibleTypesAndResult) { it(`mergeDeep and Map#mergeDeep merges ${type1} and ${type2}`, () => { const aObject = { a: value1 }; const bObject = { a: value2 }; expect(mergeDeep(aObject, bObject)).toEqual({ a: result }); const aMap = Map({ a: value1 }); const bMap = Map({ a: value2 }); expect(aMap.mergeDeep(bMap)).toEqual(Map({ a: result })); }); } it('Map#mergeDeep replaces nested List with Map and Map with List', () => { const a = Map({ a: List([Map({ x: 1 })]) }); const b = Map({ a: Map([[0, Map({ y: 2 })]]) }); expect(a.mergeDeep(b).equals(b)).toBe(true); expect(b.mergeDeep(a).equals(a)).toBe(true); }); it('functional mergeDeep replaces nested array with Map', () => { const a = { a: [{ x: 1 }] }; const b = Map({ a: Map([[0, Map({ y: 2 })]]) }); expect(mergeDeep(a, b)).toEqual({ a: Map([[0, Map({ y: 2 })]]) }); }); it('works with an empty Record', () => { class MyRecord extends Record({ a: 1 }) {} const myRecord = new MyRecord(); expect(merge(myRecord, { a: 4 })).toEqual( new MyRecord({ a: 4, }) ); class MyEmptyRecord extends Record({}) {} const myEmptyRecord = new MyEmptyRecord(); // merging with an empty record should return the same empty record instance expect(merge(myEmptyRecord, { a: 4 })).toBe(myEmptyRecord); }); it('is not sensible to prototype pollution', () => { type User = { user: string; admin?: boolean }; // Simulates: app merges HTTP request body (JSON) into user profile const userProfile: User = { user: 'Alice' }; const requestBody = JSON.parse('{"user":"Eve","__proto__":{"admin":true}}'); const r1 = mergeDeep(userProfile, requestBody); expect(r1.user).toBe('Eve'); // Eve (updated correctly) expect(r1.admin).toBeUndefined(); const r2 = mergeDeepWith((a, b) => b, userProfile, requestBody); expect(r2.admin).toBeUndefined(); const r3 = merge(userProfile, requestBody); expect(r3.admin).toBeUndefined(); const nested = JSON.parse('{"profile":{"__proto__":{"admin":true}}}'); const r6 = mergeDeep<{ profile: { bio: string; admin?: boolean } }>( { profile: { bio: 'Hello' } }, nested ); expect(r6.profile.admin).toBeUndefined(); // @ts-expect-error -- confirm that admin is not on the global object expect({}.admin).toBeUndefined(); // Confirm NOT global too }); }); immutable-js-immutable-js-6a01d72/__tests__/minmax.ts000066400000000000000000000065351522056416100226320ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { Seq, is } from 'immutable'; const genHeterogeneousishArray = fc.oneof( fc.sparseArray(fc.string()), fc.array(fc.oneof(fc.integer(), fc.constant(NaN))) ); describe('max', () => { it('returns max in a sequence', () => { expect(Seq([1, 9, 2, 8, 3, 7, 4, 6, 5]).max()).toBe(9); }); it('accepts a comparator', () => { expect(Seq([1, 9, 2, 8, 3, 7, 4, 6, 5]).max((a, b) => b - a)).toBe(1); }); it('by a mapper', () => { const family = Seq([ { name: 'Oakley', age: 7 }, { name: 'Dakota', age: 7 }, { name: 'Casey', age: 34 }, { name: 'Avery', age: 34 }, ]); expect(family.maxBy((p) => p.age)).toBe(family.get(2)); }); it('by a mapper and a comparator', () => { const family = Seq([ { name: 'Oakley', age: 7 }, { name: 'Dakota', age: 7 }, { name: 'Casey', age: 34 }, { name: 'Avery', age: 34 }, ]); expect( family.maxBy( (p) => p.age, (a, b) => b - a ) ).toBe(family.get(0)); }); it('surfaces NaN, null, and undefined', () => { expect(is(NaN, Seq([1, 2, 3, 4, 5, NaN]).max())).toBe(true); expect(is(NaN, Seq([NaN, 1, 2, 3, 4, 5]).max())).toBe(true); expect(is(null, Seq(['A', 'B', 'C', 'D', null]).max())).toBe(true); expect(is(null, Seq([null, 'A', 'B', 'C', 'D']).max())).toBe(true); }); it('null treated as 0 in default iterator', () => { expect(is(2, Seq([-1, -2, null, 1, 2]).max())).toBe(true); }); it('is not dependent on order', () => { fc.assert( fc.property(genHeterogeneousishArray, (vals) => { expect( is( Seq(shuffle(vals.slice())).max(), Seq(vals).max() ) ).toEqual(true); }) ); }); }); describe('min', () => { it('returns min in a sequence', () => { expect(Seq([1, 9, 2, 8, 3, 7, 4, 6, 5]).min()).toBe(1); }); it('accepts a comparator', () => { expect(Seq([1, 9, 2, 8, 3, 7, 4, 6, 5]).min((a, b) => b - a)).toBe(9); }); it('by a mapper', () => { const family = Seq([ { name: 'Oakley', age: 7 }, { name: 'Dakota', age: 7 }, { name: 'Casey', age: 34 }, { name: 'Avery', age: 34 }, ]); expect(family.minBy((p) => p.age)).toBe(family.get(0)); }); it('by a mapper and a comparator', () => { const family = Seq([ { name: 'Oakley', age: 7 }, { name: 'Dakota', age: 7 }, { name: 'Casey', age: 34 }, { name: 'Avery', age: 34 }, ]); expect( family.minBy( (p) => p.age, (a, b) => b - a ) ).toBe(family.get(2)); }); it('is not dependent on order', () => { fc.assert( fc.property(genHeterogeneousishArray, (vals) => { expect( is( Seq(shuffle(vals.slice())).min(), Seq(vals).min() ) ).toEqual(true); }) ); }); }); function shuffle>(array: A): A { let m = array.length; let t; let i; // While there remain elements to shuffle… while (m) { // Pick a remaining element… i = Math.floor(Math.random() * m--); // And swap it with the current element. t = array[m]; array[m] = array[i]; array[i] = t; } return array; } immutable-js-immutable-js-6a01d72/__tests__/partition.ts000066400000000000000000000054161522056416100233470ustar00rootroot00000000000000import { beforeEach, describe, expect, it, jest } from '@jest/globals'; import { Map as IMap, Set as ISet, List, Seq, isAssociative, isIndexed, isKeyed, isList, isMap, isSeq, isSet, } from 'immutable'; describe('partition', () => { let isOdd: jest.Mock<(x: number) => number>; beforeEach(() => { isOdd = jest.fn((x) => x % 2); }); it('partitions keyed sequence', () => { const parts = Seq({ a: 1, b: 2, c: 3, d: 4 }).partition(isOdd); expect(isKeyed(parts[0])).toBe(true); expect(isSeq(parts[0])).toBe(true); expect(parts.map((part) => part.toJS())).toEqual([ { b: 2, d: 4 }, { a: 1, c: 3 }, ]); expect(isOdd.mock.calls.length).toBe(4); // Each group should be a keyed sequence, not an indexed sequence const trueGroup = parts[1]; expect(trueGroup && trueGroup.toArray()).toEqual([ ['a', 1], ['c', 3], ]); }); it('partitions indexed sequence', () => { const parts = Seq([1, 2, 3, 4, 5, 6]).partition(isOdd); expect(isIndexed(parts[0])).toBe(true); expect(isSeq(parts[0])).toBe(true); expect(parts.map((part) => part.toJS())).toEqual([ [2, 4, 6], [1, 3, 5], ]); expect(isOdd.mock.calls.length).toBe(6); }); it('partitions set sequence', () => { const parts = Seq.Set([1, 2, 3, 4, 5, 6]).partition(isOdd); expect(isAssociative(parts[0])).toBe(false); expect(isSeq(parts[0])).toBe(true); expect(parts.map((part) => part.toJS())).toEqual([ [2, 4, 6], [1, 3, 5], ]); expect(isOdd.mock.calls.length).toBe(6); }); it('partitions keyed collection', () => { const parts = IMap({ a: 1, b: 2, c: 3, d: 4 }).partition(isOdd); expect(isMap(parts[0])).toBe(true); expect(isSeq(parts[0])).toBe(false); expect(parts.map((part) => part.toJS())).toEqual([ { b: 2, d: 4 }, { a: 1, c: 3 }, ]); expect(isOdd.mock.calls.length).toBe(4); // Each group should be a keyed collection, not an indexed collection const trueGroup = parts[1]; expect(trueGroup && trueGroup.toArray()).toEqual([ ['a', 1], ['c', 3], ]); }); it('partitions indexed collection', () => { const parts = List([1, 2, 3, 4, 5, 6]).partition(isOdd); expect(isList(parts[0])).toBe(true); expect(isSeq(parts[0])).toBe(false); expect(parts.map((part) => part.toJS())).toEqual([ [2, 4, 6], [1, 3, 5], ]); expect(isOdd.mock.calls.length).toBe(6); }); it('partitions set collection', () => { const parts = ISet([1, 2, 3, 4, 5, 6]).partition(isOdd); expect(isSet(parts[0])).toBe(true); expect(isSeq(parts[0])).toBe(false); expect(parts.map((part) => part.toJS().sort())).toEqual([ [2, 4, 6], [1, 3, 5], ]); expect(isOdd.mock.calls.length).toBe(6); }); }); immutable-js-immutable-js-6a01d72/__tests__/slice.ts000066400000000000000000000220101522056416100224220ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { List, Range, Seq } from 'immutable'; describe('slice', () => { it('slices a sequence', () => { expect(Seq([1, 2, 3, 4, 5, 6]).slice(2).toArray()).toEqual([3, 4, 5, 6]); expect(Seq([1, 2, 3, 4, 5, 6]).slice(2, 4).toArray()).toEqual([3, 4]); expect(Seq([1, 2, 3, 4, 5, 6]).slice(-3, -1).toArray()).toEqual([4, 5]); expect(Seq([1, 2, 3, 4, 5, 6]).slice(-1).toArray()).toEqual([6]); expect(Seq([1, 2, 3, 4, 5, 6]).slice(0, -1).toArray()).toEqual([ 1, 2, 3, 4, 5, ]); }); it('creates an immutable stable sequence', () => { const seq = Seq([1, 2, 3, 4, 5, 6]); const sliced = seq.slice(2, -2); expect(sliced.toArray()).toEqual([3, 4]); expect(sliced.toArray()).toEqual([3, 4]); expect(sliced.toArray()).toEqual([3, 4]); }); it('slices a sparse indexed sequence', () => { expect( Seq([ 1, undefined, 2, undefined, 3, undefined, 4, undefined, 5, undefined, 6, ]) .slice(1) .toArray() ).toEqual([ undefined, 2, undefined, 3, undefined, 4, undefined, 5, undefined, 6, ]); expect( Seq([ 1, undefined, 2, undefined, 3, undefined, 4, undefined, 5, undefined, 6, ]) .slice(2) .toArray() ).toEqual([2, undefined, 3, undefined, 4, undefined, 5, undefined, 6]); expect( Seq([ 1, undefined, 2, undefined, 3, undefined, 4, undefined, 5, undefined, 6, ]) .slice(3, -3) .toArray() ).toEqual([undefined, 3, undefined, 4, undefined]); // one trailing hole. }); it('can maintain indices for an keyed indexed sequence', () => { expect( Seq([1, 2, 3, 4, 5, 6]).toKeyedSeq().slice(2).entrySeq().toArray() ).toEqual([ [2, 3], [3, 4], [4, 5], [5, 6], ]); expect( Seq([1, 2, 3, 4, 5, 6]).toKeyedSeq().slice(2, 4).entrySeq().toArray() ).toEqual([ [2, 3], [3, 4], ]); }); it('slices an unindexed sequence', () => { expect(Seq({ a: 1, b: 2, c: 3 }).slice(1).toObject()).toEqual({ b: 2, c: 3, }); expect(Seq({ a: 1, b: 2, c: 3 }).slice(1, 2).toObject()).toEqual({ b: 2 }); expect(Seq({ a: 1, b: 2, c: 3 }).slice(0, 2).toObject()).toEqual({ a: 1, b: 2, }); expect(Seq({ a: 1, b: 2, c: 3 }).slice(-1).toObject()).toEqual({ c: 3 }); expect(Seq({ a: 1, b: 2, c: 3 }).slice(1, -1).toObject()).toEqual({ b: 2 }); }); it('is reversable', () => { expect(Seq([1, 2, 3, 4, 5, 6]).slice(2).reverse().toArray()).toEqual([ 6, 5, 4, 3, ]); expect(Seq([1, 2, 3, 4, 5, 6]).slice(2, 4).reverse().toArray()).toEqual([ 4, 3, ]); expect( Seq([1, 2, 3, 4, 5, 6]) .toKeyedSeq() .slice(2) .reverse() .entrySeq() .toArray() ).toEqual([ [5, 6], [4, 5], [3, 4], [2, 3], ]); expect( Seq([1, 2, 3, 4, 5, 6]) .toKeyedSeq() .slice(2, 4) .reverse() .entrySeq() .toArray() ).toEqual([ [3, 4], [2, 3], ]); }); it('slices a list', () => { expect(List([1, 2, 3, 4, 5, 6]).slice(2).toArray()).toEqual([3, 4, 5, 6]); expect(List([1, 2, 3, 4, 5, 6]).slice(2, 4).toArray()).toEqual([3, 4]); }); it('returns self for whole slices', () => { const s = Seq([1, 2, 3]); expect(s.slice(0)).toBe(s); expect(s.slice(0, 3)).toBe(s); expect(s.slice(-4, 4)).toBe(s); const v = List([1, 2, 3]); expect(v.slice(-4, 4)).toBe(v); expect(v.slice(-3)).toBe(v); expect(v.slice(-4, 4).toList()).toBe(v); }); it('creates a sliced list in O(log32(n))', () => { expect(List([1, 2, 3, 4, 5]).slice(-3, -1).toList().toArray()).toEqual([ 3, 4, ]); }); it('has the same behavior as array slice in known edge cases', () => { const a = Range(0, 33).toArray(); const v = List(a); expect(v.slice(31).toList().toArray()).toEqual(a.slice(31)); }); it('does not slice by floating-point numbers', () => { const seq = Seq([0, 1, 2, 3, 4, 5]); const sliced = seq.slice(0, 2.6); expect(sliced.size).toEqual(2); expect(sliced.toArray()).toEqual([0, 1]); }); it('can create an iterator', () => { const seq = Seq([0, 1, 2, 3, 4, 5]); const iterFront = seq.slice(0, 2).values(); expect(iterFront.next()).toEqual({ value: 0, done: false }); expect(iterFront.next()).toEqual({ value: 1, done: false }); expect(iterFront.next()).toEqual({ value: undefined, done: true }); const iterMiddle = seq.slice(2, 4).values(); expect(iterMiddle.next()).toEqual({ value: 2, done: false }); expect(iterMiddle.next()).toEqual({ value: 3, done: false }); expect(iterMiddle.next()).toEqual({ value: undefined, done: true }); const iterTail = seq.slice(4, 123456).values(); expect(iterTail.next()).toEqual({ value: 4, done: false }); expect(iterTail.next()).toEqual({ value: 5, done: false }); expect(iterTail.next()).toEqual({ value: undefined, done: true }); }); it('stops the entries iterator when the sequence has an undefined end', () => { let seq = Seq([0, 1, 2, 3, 4, 5]); // flatMap is lazy and thus the resulting sequence has no size. seq = seq.flatMap((a) => [a]); expect(seq.size).toEqual(undefined); const iterFront = seq.slice(0, 2).entries(); expect(iterFront.next()).toEqual({ value: [0, 0], done: false }); expect(iterFront.next()).toEqual({ value: [1, 1], done: false }); expect(iterFront.next()).toEqual({ value: undefined, done: true }); const iterMiddle = seq.slice(2, 4).entries(); expect(iterMiddle.next()).toEqual({ value: [0, 2], done: false }); expect(iterMiddle.next()).toEqual({ value: [1, 3], done: false }); expect(iterMiddle.next()).toEqual({ value: undefined, done: true }); const iterTail = seq.slice(4, 123456).entries(); expect(iterTail.next()).toEqual({ value: [0, 4], done: false }); expect(iterTail.next()).toEqual({ value: [1, 5], done: false }); expect(iterTail.next()).toEqual({ value: undefined, done: true }); }); it('slices a sequence with unknown size and no end', () => { let seq = Seq([0, 1, 2, 3, 4, 5]); expect(seq.size).toEqual(6); // flatMap is lazy and thus the resulting sequence has no size. seq = seq.flatMap((a) => [a]); expect(seq.size).toEqual(undefined); const sliced = seq.slice(4); expect(sliced.size).toEqual(undefined); expect(sliced.toArray()).toEqual([4, 5]); }); it('works like Array.prototype.slice', () => { fc.assert( fc.property( fc.integer({ min: -1000, max: 1000 }), fc.sparseArray(fc.integer({ min: -1000, max: 1000 }), { maxLength: 3 }), (valuesLen, args) => { const a = Range(0, valuesLen).toArray(); const v = List(a); const slicedV = v.slice(...args); const slicedA = a.slice(...args); expect(slicedV.toArray()).toEqual(slicedA); } ) ); }); it('works like Array.prototype.slice on sparse array input', () => { fc.assert( fc.property( fc.array(fc.tuple(fc.nat(1000), fc.integer({ min: -1000, max: 1000 }))), fc.sparseArray(fc.integer({ min: -1000, max: 1000 }), { maxLength: 3 }), (entries, args) => { const a: Array = []; entries.forEach((entry) => (a[entry[0]] = entry[1])); const s = Seq(a); const slicedS = s.slice(...args); const slicedA = a.slice(...args); expect(slicedS.toArray()).toEqual(slicedA); } ) ); }); describe('take', () => { it('takes the first n from a list', () => { fc.assert( fc.property( fc.integer({ min: -1000, max: 1000 }), fc.nat(1000), (len, num) => { const a = Range(0, len).toArray(); const v = List(a); expect(v.take(num).toArray()).toEqual(a.slice(0, num)); } ) ); }); it('creates an immutable stable sequence', () => { const seq = Seq([1, 2, 3, 4, 5, 6]); const sliced = seq.take(3); expect(sliced.toArray()).toEqual([1, 2, 3]); expect(sliced.toArray()).toEqual([1, 2, 3]); expect(sliced.toArray()).toEqual([1, 2, 3]); }); it('converts to array with correct length', () => { const seq = Seq([1, 2, 3, 4, 5, 6]); const s1 = seq.take(3); const s2 = seq.take(10); const sn = seq.take(Infinity); const s3 = seq.filter((v) => v < 4).take(10); const s4 = seq.filter((v) => v < 4).take(2); expect(s1.toArray().length).toEqual(3); expect(s2.toArray().length).toEqual(6); expect(sn.toArray().length).toEqual(6); expect(s3.toArray().length).toEqual(3); expect(s4.toArray().length).toEqual(2); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/sort.ts000066400000000000000000000033141522056416100223200ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, OrderedMap, Range, Seq } from 'immutable'; describe('sort', () => { it('sorts a sequence', () => { expect(Seq([4, 5, 6, 3, 2, 1]).sort().toArray()).toEqual([ 1, 2, 3, 4, 5, 6, ]); }); it('sorts a list', () => { expect(List([4, 5, 6, 3, 2, 1]).sort().toArray()).toEqual([ 1, 2, 3, 4, 5, 6, ]); }); it('sorts undefined values last', () => { expect( List([4, undefined, 5, 6, 3, undefined, 2, 1]).sort().toArray() ).toEqual([1, 2, 3, 4, 5, 6, undefined, undefined]); }); it('sorts a keyed sequence', () => { expect( Seq({ z: 1, y: 2, x: 3, c: 3, b: 2, a: 1 }).sort().entrySeq().toArray() ).toEqual([ ['z', 1], ['a', 1], ['y', 2], ['b', 2], ['x', 3], ['c', 3], ]); }); it('sorts an OrderedMap', () => { expect( OrderedMap({ z: 1, y: 2, x: 3, c: 3, b: 2, a: 1 }) .sort() .entrySeq() .toArray() ).toEqual([ ['z', 1], ['a', 1], ['y', 2], ['b', 2], ['x', 3], ['c', 3], ]); }); it('accepts a sort function', () => { expect( Seq([4, 5, 6, 3, 2, 1]) .sort((a, b) => b - a) .toArray() ).toEqual([6, 5, 4, 3, 2, 1]); }); it('sorts by using a mapper', () => { expect( Range(1, 10) .sortBy((v) => v % 3) .toArray() ).toEqual([3, 6, 9, 1, 4, 7, 2, 5, 8]); }); it('sorts by using a mapper and a sort function', () => { expect( Range(1, 10) .sortBy( (v) => v % 3, (a: number, b: number) => b - a ) .toArray() ).toEqual([2, 5, 8, 1, 4, 7, 3, 6, 9]); }); }); immutable-js-immutable-js-6a01d72/__tests__/splice.ts000066400000000000000000000042151522056416100226110ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { List, Range, Seq } from 'immutable'; describe('splice', () => { it('splices a sequence only removing elements', () => { expect(Seq([1, 2, 3]).splice(0, 1).toArray()).toEqual([2, 3]); expect(Seq([1, 2, 3]).splice(1, 1).toArray()).toEqual([1, 3]); expect(Seq([1, 2, 3]).splice(2, 1).toArray()).toEqual([1, 2]); expect(Seq([1, 2, 3]).splice(3, 1).toArray()).toEqual([1, 2, 3]); }); it('splices a list only removing elements', () => { expect(List([1, 2, 3]).splice(0, 1).toArray()).toEqual([2, 3]); expect(List([1, 2, 3]).splice(1, 1).toArray()).toEqual([1, 3]); expect(List([1, 2, 3]).splice(2, 1).toArray()).toEqual([1, 2]); expect(List([1, 2, 3]).splice(3, 1).toArray()).toEqual([1, 2, 3]); }); it('splicing by infinity', () => { const l = List(['a', 'b', 'c', 'd']); expect(l.splice(2, Infinity, 'x').toArray()).toEqual(['a', 'b', 'x']); expect(l.splice(Infinity, 2, 'x').toArray()).toEqual([ 'a', 'b', 'c', 'd', 'x', ]); const s = List(['a', 'b', 'c', 'd']); expect(s.splice(2, Infinity, 'x').toArray()).toEqual(['a', 'b', 'x']); expect(s.splice(Infinity, 2, 'x').toArray()).toEqual([ 'a', 'b', 'c', 'd', 'x', ]); }); it('has the same behavior as array splice in known edge cases', () => { // arbitrary numbers that sum to 31 const a = Range(0, 49).toArray(); const v = List(a); a.splice(-18, 0, 0); expect(v.splice(-18, 0, 0).toList().toArray()).toEqual(a); }); it('has the same behavior as array splice', () => { fc.assert( fc.property( fc.array(fc.integer()), fc.integer(), fc.integer(), fc.array(fc.integer()), (values, index, removeNum, insertValues) => { const v = List(values); const a = values.slice(); // clone const splicedV = v.splice(index, removeNum, ...insertValues); // persistent a.splice(index, removeNum, ...insertValues); // mutative expect(splicedV.toArray()).toEqual(a); } ) ); }); }); immutable-js-immutable-js-6a01d72/__tests__/toSeq.ts000066400000000000000000000103231522056416100224220ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { Collection, isIndexed, isKeyed, isSeq, List, Map, OrderedMap, OrderedSet, Range, Repeat, Seq, Set, Stack, } from 'immutable'; describe('toSeq', () => { it('returns a keyed Seq for a keyed collection, preserving entries', () => { const seq = Map({ a: 1, b: 2 }).toSeq(); expect(isSeq(seq)).toBe(true); expect(isKeyed(seq)).toBe(true); expect(seq.toObject()).toEqual({ a: 1, b: 2 }); }); it('returns an indexed Seq for an indexed collection, preserving order', () => { const seq = List([1, 2, 3]).toSeq(); expect(isSeq(seq)).toBe(true); expect(isIndexed(seq)).toBe(true); expect(seq.toArray()).toEqual([1, 2, 3]); }); it('returns an indexed Seq for a Stack, preserving order', () => { const seq = Stack([1, 2, 3]).toSeq(); expect(isSeq(seq)).toBe(true); expect(isIndexed(seq)).toBe(true); expect(seq.toArray()).toEqual([1, 2, 3]); }); it('returns a set Seq for a set collection, preserving values', () => { const seq = Set([1, 2, 3]).toSeq(); expect(isSeq(seq)).toBe(true); expect(isKeyed(seq)).toBe(false); expect(isIndexed(seq)).toBe(false); expect(seq.toArray().sort()).toEqual([1, 2, 3]); }); it('returns a set Seq for an OrderedSet, preserving insertion order', () => { const seq = OrderedSet([3, 1, 2]).toSeq(); expect(isSeq(seq)).toBe(true); expect(isKeyed(seq)).toBe(false); expect(isIndexed(seq)).toBe(false); expect(seq.toArray()).toEqual([3, 1, 2]); }); it('dispatches on the kind when called through the base Collection', () => { expect(isIndexed(Collection([1, 2, 3]).toSeq())).toBe(true); expect(isKeyed(Collection({ a: 1 }).toSeq())).toBe(true); }); it('is idempotent on a Seq (returns an equivalent Seq)', () => { const seq = Seq([1, 2, 3]); const again = seq.toSeq(); expect(isSeq(again)).toBe(true); expect(again.toArray()).toEqual([1, 2, 3]); }); it('returns the same instance for a keyed Seq', () => { const seq = Seq.Keyed({ a: 1, b: 2 }); expect(seq.toSeq()).toBe(seq); expect(isKeyed(seq.toSeq())).toBe(true); }); it('returns the same instance for an indexed Seq', () => { const seq = Seq.Indexed([1, 2, 3]); expect(seq.toSeq()).toBe(seq); expect(isIndexed(seq.toSeq())).toBe(true); }); it('returns the same instance for a set Seq', () => { const seq = Seq.Set([1, 2, 3]); expect(seq.toSeq()).toBe(seq); expect(isKeyed(seq.toSeq())).toBe(false); expect(isIndexed(seq.toSeq())).toBe(false); }); it('keeps ordering for ordered keyed collections', () => { const seq = OrderedMap([ ['b', 2], ['a', 1], ]).toSeq(); expect(isKeyed(seq)).toBe(true); expect(seq.keySeq().toArray()).toEqual(['b', 'a']); }); it('is lazy: works on an infinite Range', () => { const seq = Range(0, Infinity).toSeq(); expect(isSeq(seq)).toBe(true); expect(seq.take(3).toArray()).toEqual([0, 1, 2]); }); it('is lazy: works on an infinite Repeat', () => { const seq = Repeat('x', Infinity).toSeq(); expect(isSeq(seq)).toBe(true); expect(isIndexed(seq)).toBe(true); expect(seq.take(3).toArray()).toEqual(['x', 'x', 'x']); }); }); describe('map (migrated to class)', () => { it('maps values of a keyed collection and stays keyed', () => { const mapped = Map({ a: 1, b: 2 }).map((x) => 10 * x); expect(isKeyed(mapped)).toBe(true); expect(mapped.toObject()).toEqual({ a: 10, b: 20 }); }); it('maps values of an indexed collection and stays indexed', () => { const mapped = List([1, 2, 3]).map((x) => 10 * x); expect(isIndexed(mapped)).toBe(true); expect(mapped.toArray()).toEqual([10, 20, 30]); }); it('maps values of a set collection', () => { const mapped = Set([1, 2, 3]).map((x) => 10 * x); expect(mapped.toArray().sort((a, b) => a - b)).toEqual([10, 20, 30]); }); it('passes value, key and the collection to the mapper', () => { const seen: Array<[number, string]> = []; Map({ a: 1, b: 2 }).map((value, key, iter) => { expect(iter.get(key)).toBe(value); seen.push([value, key]); return value; }); expect(seen).toEqual([ [1, 'a'], [2, 'b'], ]); }); }); immutable-js-immutable-js-6a01d72/__tests__/transformerProtocol.ts000066400000000000000000000073651522056416100254270ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, Set, Stack } from 'immutable'; import * as t from 'transducers-js'; describe('Transformer Protocol', () => { it('transduces Stack without initial values', () => { const s = Stack.of(1, 2, 3, 4); const xform = t.comp( t.filter((x: number) => x % 2 === 0), t.map((x: number) => x + 1) ); // @ts-expect-error: transduce typing issue const s2 = t.transduce(xform, Stack(), s); expect(s.toArray()).toEqual([1, 2, 3, 4]); expect(s2.toArray()).toEqual([5, 3]); }); it('transduces Stack with initial values', () => { const v1 = Stack.of(1, 2, 3); const v2 = Stack.of(4, 5, 6, 7); const xform = t.comp( t.filter((x: number) => x % 2 === 0), t.map((x: number) => x + 1) ); // @ts-expect-error: transduce typing issue const r = t.transduce(xform, Stack(), v1, v2); expect(v1.toArray()).toEqual([1, 2, 3]); expect(v2.toArray()).toEqual([4, 5, 6, 7]); expect(r.toArray()).toEqual([7, 5, 1, 2, 3]); }); it('transduces List without initial values', () => { const v = List.of(1, 2, 3, 4); const xform = t.comp( t.filter((x: number) => x % 2 === 0), t.map((x: number) => x + 1) ); // @ts-expect-error: transduce typing issue const r = t.transduce(xform, List(), v); expect(v.toArray()).toEqual([1, 2, 3, 4]); expect(r.toArray()).toEqual([3, 5]); }); it('transduces List with initial values', () => { const v1 = List.of(1, 2, 3); const v2 = List.of(4, 5, 6, 7); const xform = t.comp( t.filter((x: number) => x % 2 === 0), t.map((x: number) => x + 1) ); // @ts-expect-error: transduce typing issue const r = t.transduce(xform, List(), v1, v2); expect(v1.toArray()).toEqual([1, 2, 3]); expect(v2.toArray()).toEqual([4, 5, 6, 7]); expect(r.toArray()).toEqual([1, 2, 3, 5, 7]); }); it('transduces Map without initial values', () => { const m1 = Map({ a: 1, b: 2, c: 3, d: 4 }); const xform = t.comp( t.filter(([_k, v]: [string, number]) => v % 2 === 0), t.map(([k, v]: [string, number]) => [k, v * 2]) ); // @ts-expect-error: transduce typing issue const m2 = t.transduce(xform, Map(), m1); expect(m1.toObject()).toEqual({ a: 1, b: 2, c: 3, d: 4 }); expect(m2.toObject()).toEqual({ b: 4, d: 8 }); }); it('transduces Map with initial values', () => { const m1 = Map({ a: 1, b: 2, c: 3 }); const m2 = Map({ a: 4, b: 5 }); const xform = t.comp( t.filter(([_k, v]: [string, number]) => v % 2 === 0), t.map(([k, v]: [string, number]) => [k, v * 2]) ); // @ts-expect-error: transduce typing issue const m3 = t.transduce(xform, Map(), m1, m2); expect(m1.toObject()).toEqual({ a: 1, b: 2, c: 3 }); expect(m2.toObject()).toEqual({ a: 4, b: 5 }); expect(m3.toObject()).toEqual({ a: 8, b: 2, c: 3 }); }); it('transduces Set without initial values', () => { const s1 = Set.of(1, 2, 3, 4); const xform = t.comp( t.filter((x: number) => x % 2 === 0), t.map((x: number) => x + 1) ); // @ts-expect-error: transduce typing issue const s2 = t.transduce(xform, Set(), s1); expect(s1.toArray()).toEqual([1, 2, 3, 4]); expect(s2.toArray()).toEqual([3, 5]); }); it('transduces Set with initial values', () => { const s1 = Set.of(1, 2, 3, 4); const s2 = Set.of(2, 3, 4, 5, 6); const xform = t.comp( t.filter((x: number) => x % 2 === 0), t.map((x: number) => x + 1) ); // @ts-expect-error: transduce typing issue const s3 = t.transduce(xform, Set(), s1, s2); expect(s1.toArray()).toEqual([1, 2, 3, 4]); expect(s2.toArray()).toEqual([2, 3, 4, 5, 6]); expect(s3.toArray()).toEqual([1, 2, 3, 4, 5, 7]); }); }); immutable-js-immutable-js-6a01d72/__tests__/ts-utils.ts000066400000000000000000000002411522056416100231110ustar00rootroot00000000000000import { expect } from '@jest/globals'; export function expectToBeDefined( arg: T ): asserts arg is Exclude { expect(arg).toBeDefined(); } immutable-js-immutable-js-6a01d72/__tests__/tsconfig.json000066400000000000000000000002441522056416100234670ustar00rootroot00000000000000{ "extends": "../tsconfig.json", "include": ["./"], "compilerOptions": { "paths": { "immutable": ["../type-definitions/immutable.d.ts"] } } } immutable-js-immutable-js-6a01d72/__tests__/updateIn.ts000066400000000000000000000376051522056416100231140ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import { List, Map, type MapOf, Seq, Set, fromJS, removeIn, setIn, updateIn, } from 'immutable'; import invariant from '../src/utils/invariant'; describe('updateIn', () => { it('deep edit', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect( // @ts-expect-error -- type of fromJS may return a MapOf in the future, to help `updateIn` to work, `updateIn` should copy the comportment of `getIn` m.updateIn(['a', 'b', 'c'], (value: number) => value * 2).toJS() ).toEqual({ a: { b: { c: 20 } }, }); }); it('deep edit with list as keyPath', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect( // @ts-expect-error -- type of fromJS may return a MapOf in the future, to help `updateIn` to work, `updateIn` should copy the comportment of `getIn` m.updateIn(fromJS(['a', 'b', 'c']), (value: number) => value * 2).toJS() ).toEqual({ a: { b: { c: 20 } } }); }); it('deep edit in raw JS', () => { const m = { a: { b: { c: [10] } } }; expect( updateIn(m, ['a', 'b', 'c', 0], (value: number) => value * 2) ).toEqual({ a: { b: { c: [20] } }, }); }); it('deep edit throws without list or array-like', () => { // @ts-expect-error -- test that runtime does throw expect(() => Map().updateIn(undefined, (x) => x)).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: undefined' ); // @ts-expect-error -- test that runtime does th expect(() => Map().updateIn({ a: 1, b: 2 }, (x) => x)).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: [object Object]' ); expect(() => Map().updateIn('abc', (x) => x)).toThrow( 'Invalid keyPath: expected Ordered Collection or Array: abc' ); }); it('deep edit throws if non-editable path', () => { const deep = Map({ key: Set([List(['item'])]) }); expect(() => deep.updateIn(['key', 'foo', 'item'], () => 'newval')).toThrow( 'Cannot update immutable value without .set() method: Set { List [ "item" ] }' ); const deepSeq = Map({ key: Seq([List(['item'])]) }); expect(() => deepSeq.updateIn(['key', 'foo', 'item'], () => 'newval') ).toThrow( 'Cannot update immutable value without .set() method: Seq [ List [ "item" ] ]' ); const nonObj = Map({ key: 123 }); expect(() => nonObj.updateIn(['key', 'foo'], () => 'newval')).toThrow( 'Cannot update within non-data-structure value in path ["key"]: 123' ); }); it('handle ArrayLike objects that are nor Array not immutable Collection', () => { class CustomArrayLike implements ArrayLike { readonly length: number; [n: number]: T; constructor(...values: Array) { this.length = values.length; for (let i = 0; i < values.length; i++) { // @ts-expect-error -- TypeScript does not know that this is a valid index this[i] = values[i]; } } // Define other methods if needed, but do not include the `slice` method // For example, you can define a method to set values set(index: number, value: T): void { if (index < 0 || index >= this.length) { throw new RangeError('Index out of bounds'); } this[index] = value; } // Define a method to get values get(index: number): T { if (index < 0 || index >= this.length) { throw new RangeError('Index out of bounds'); } invariant(typeof this[index] !== 'undefined', 'Index out of bounds'); return this[index]; } } // create an ArrayLike const customArray = new CustomArrayLike(10, 20); // code that works perfectly expect( updateIn({ 10: { 20: 'a' } }, customArray, (v) => // @ts-expect-error -- `updateIn` keypath type should be `OrderedCollection | ArrayLike; typeof v === 'string' ? v.toUpperCase() : v ) ).toEqual({ 10: { 20: 'A' } }); expect(() => updateIn({ 10: 'a' }, customArray, (v) => // @ts-expect-error -- `updateIn` keypath type should be `OrderedCollection | ArrayLike; typeof v === 'string' ? v.toUpperCase() : v ) ).toThrow('Cannot update within non-data-structure value in path [10]: a'); }); it('identity with notSetValue is still identity', () => { const m = Map({ a: { b: { c: 10 } } }); expect(m.updateIn(['x'], 100, (id) => id)).toEqual(m); }); it('shallow remove', () => { const m = Map({ a: 123 }); expect(m.updateIn([], () => undefined)).toEqual(undefined); }); it('deep remove', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect( m // @ts-expect-error -- type of fromJS may return a MapOf in the future, to help `updateIn` to work, `updateIn` should copy the comportment of `getIn` .updateIn(['a', 'b'], (map: MapOf<{ c: number }>) => map.remove('c')) .toJS() ).toEqual({ a: { b: {} }, }); }); it('deep set', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect( m // @ts-expect-error -- type of fromJS may return a MapOf in the future, to help `updateIn` to work, `updateIn` should copy the comportment of `getIn` .updateIn(['a', 'b'], (map: MapOf<{ c: number }>) => map.set('d', 20)) .toJS() ).toEqual({ a: { b: { c: 10, d: 20 } }, }); }); it('deep push', () => { const m = fromJS({ a: { b: [1, 2, 3] } }); expect( // @ts-expect-error -- type of fromJS may return a MapOf in the future, to help `updateIn` to work, `updateIn` should copy the comportment of `getIn` m.updateIn(['a', 'b'], (list: List) => list.push(4)).toJS() ).toEqual({ a: { b: [1, 2, 3, 4] }, }); }); it('deep map', () => { const m = fromJS({ a: { b: [1, 2, 3] } }); expect( m // @ts-expect-error -- type of fromJS may return a MapOf in the future, to help `updateIn` to work, `updateIn` should copy the comportment of `getIn` .updateIn(['a', 'b'], (list: List) => list.map((value) => value * 10) ) .toJS() ).toEqual({ a: { b: [10, 20, 30] } }); }); it('creates new maps if path contains gaps', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect( m .updateIn( ['a', 'q', 'z'], Map(), // @ts-expect-error -- updateIn should handle the `notSetValue` parameter (map: Map) => map.set('d', 20) ) .toJS() ).toEqual({ a: { b: { c: 10 }, q: { z: { d: 20 } } } }); }); it('creates new objects if path contains gaps within raw JS', () => { const m = { a: { b: { c: 10 } } }; expect( updateIn( m, ['a', 'b', 'z'], Map(), (map: Map) => map.set('d', 20) ) ).toEqual({ a: { b: { c: 10, z: Map({ d: 20 }) } } }); }); it('throws if path cannot be set', () => { const m = fromJS({ a: { b: { c: 10 } } }); expect(() => { m.updateIn(['a', 'b', 'c', 'd'], () => 20).toJS(); }).toThrow( 'Cannot update within non-data-structure value in path ["a","b","c"]: 10' ); }); it('update with notSetValue when non-existing key', () => { const m = Map({ a: { b: { c: 10 } } }); // @ts-expect-error -- updateIn should handle the `notSetValue` parameter expect(m.updateIn(['x'], 100, (map: number) => map + 1).toJS()).toEqual({ a: { b: { c: 10 } }, x: 101, }); }); it('update with notSetValue when non-existing key in raw JS', () => { const m = { a: { b: { c: 10 } } }; expect(updateIn(m, ['x'], 100, (map: number) => map + 1)).toEqual({ a: { b: { c: 10 } }, x: 101, }); }); it('updates self for empty path', () => { const m = fromJS({ a: 1, b: 2, c: 3 }); // @ts-expect-error -- type of fromJS may return a MapOf in the future, to help `updateIn` to work, `updateIn` should copy the comportment of `getIn` expect(m.updateIn([], (map: typeof m) => map.set('b', 20)).toJS()).toEqual({ a: 1, b: 20, c: 3, }); }); it('does not perform edit when new value is the same as old value', () => { const m = fromJS({ a: { b: { c: 10 } } }); const m2 = m.updateIn(['a', 'b', 'c'], (id) => id); expect(m2).toBe(m); }); it('does not perform edit when new value is the same as old value in raw JS', () => { const m = { a: { b: { c: 10 } } }; const m2 = updateIn(m, ['a', 'b', 'c'], (id) => id); expect(m2).toBe(m); }); it('does not perform edit when notSetValue is what you return from updater', () => { const m = Map(); let spiedOnID; const m2 = m.updateIn(['a', 'b', 'c'], Set(), (id) => (spiedOnID = id)); expect(m2).toBe(m); expect(spiedOnID).toBe(Set()); }); it('provides default notSetValue of undefined', () => { const m = Map(); let spiedOnID; const m2 = m.updateIn(['a', 'b', 'c'], (id) => (spiedOnID = id)); expect(m2).toBe(m); expect(spiedOnID).toBe(undefined); }); describe('setIn', () => { it('provides shorthand for updateIn to set a single value', () => { const m = Map().setIn(['a', 'b', 'c'], 'X'); expect(m).toEqual(fromJS({ a: { b: { c: 'X' } } })); }); it('accepts a list as a keyPath', () => { const m = Map().setIn(fromJS(['a', 'b', 'c']), 'X'); expect(m).toEqual(fromJS({ a: { b: { c: 'X' } } })); }); it('returns value when setting empty path', () => { const m = Map(); expect(m.setIn([], 'X')).toBe('X'); }); it('can setIn undefined', () => { const m = Map().setIn(['a', 'b', 'c'], undefined); expect(m).toEqual(Map({ a: Map({ b: Map({ c: undefined }) }) })); }); it('returns self for a no-op', () => { const m = fromJS({ a: { b: { c: 123 } } }); expect(m.setIn(['a', 'b', 'c'], 123)).toBe(m); }); it('provides shorthand for updateIn to set a single value in raw JS', () => { const m = setIn({}, ['a', 'b', 'c'], 'X'); expect(m).toEqual({ a: { b: { c: 'X' } } }); }); it('accepts a list as a keyPath in raw JS', () => { const m = setIn({}, fromJS(['a', 'b', 'c']), 'X'); expect(m).toEqual({ a: { b: { c: 'X' } } }); }); it('returns value when setting empty path in raw JS', () => { expect(setIn({}, [], 'X')).toBe('X'); }); it('can setIn undefined in raw JS', () => { const m = setIn({}, ['a', 'b', 'c'], undefined); expect(m).toEqual({ a: { b: { c: undefined } } }); }); it('returns self for a no-op in raw JS', () => { const m = { a: { b: { c: 123 } } }; expect(setIn(m, ['a', 'b', 'c'], 123)).toBe(m); }); }); describe('removeIn', () => { it('provides shorthand for updateIn to remove a single value', () => { const m = fromJS({ a: { b: { c: 'X', d: 'Y' } } }) as Map< string, unknown >; expect(m.removeIn(['a', 'b', 'c']).toJS()).toEqual({ a: { b: { d: 'Y' } }, }); }); it('accepts a list as a keyPath', () => { const m = fromJS({ a: { b: { c: 'X', d: 'Y' } } }) as Map< string, unknown >; expect(m.removeIn(fromJS(['a', 'b', 'c'])).toJS()).toEqual({ a: { b: { d: 'Y' } }, }); }); it('does not create empty maps for an unset path', () => { const m = Map(); expect(m.removeIn(['a', 'b', 'c']).toJS()).toEqual({}); }); it('removes itself when removing empty path', () => { const m = Map(); expect(m.removeIn([])).toBe(undefined); }); it('removes values from a Set', () => { const m = Map({ set: Set([1, 2, 3]) }); const m2 = m.removeIn(['set', 2]); expect(m2.toJS()).toEqual({ set: [1, 3] }); }); it('returns undefined when removing an empty path in raw JS', () => { expect(removeIn({}, [])).toBe(undefined); }); it('can removeIn in raw JS', () => { const m = removeIn({ a: { b: { c: 123 } } }, ['a', 'b', 'c']); expect(m).toEqual({ a: { b: { c: undefined } } }); }); it('returns self for a no-op in raw JS', () => { const m = { a: { b: { c: 123 } } }; expect(removeIn(m, ['a', 'b', 'd'])).toBe(m); }); }); describe('mergeIn', () => { it('provides shorthand for updateIn to merge a nested value', () => { const m1 = fromJS({ x: { a: 1, b: 2, c: 3 } }); const m2 = fromJS({ d: 10, b: 20, e: 30 }); expect(m1.mergeIn(['x'], m2).toJS()).toEqual({ x: { a: 1, b: 20, c: 3, d: 10, e: 30 }, }); }); it('accepts a list as a keyPath', () => { const m1 = fromJS({ x: { a: 1, b: 2, c: 3 } }); const m2 = fromJS({ d: 10, b: 20, e: 30 }); expect(m1.mergeIn(fromJS(['x']), m2).toJS()).toEqual({ x: { a: 1, b: 20, c: 3, d: 10, e: 30 }, }); }); it('does not create empty maps for a no-op merge', () => { const m = Map(); expect(m.mergeIn(['a', 'b', 'c'], Map()).toJS()).toEqual({}); }); it('merges into itself for empty path', () => { const m = Map({ a: 1, b: 2, c: 3 }); expect(m.mergeIn([], Map({ d: 10, b: 20, e: 30 })).toJS()).toEqual({ a: 1, b: 20, c: 3, d: 10, e: 30, }); }); it('merges into plain JS Object and Array', () => { const m = Map({ a: { x: [1, 2, 3] } }); expect(m.mergeIn(['a', 'x'], [4, 5, 6])).toEqual( Map({ a: { x: [1, 2, 3, 4, 5, 6] } }) ); }); }); describe('mergeDeepIn', () => { it('provides shorthand for updateIn to merge a nested value', () => { const m1 = fromJS({ x: { a: 1, b: 2, c: 3 } }); const m2 = fromJS({ d: 10, b: 20, e: 30 }); expect(m1.mergeDeepIn(['x'], m2).toJS()).toEqual({ x: { a: 1, b: 20, c: 3, d: 10, e: 30 }, }); }); it('accepts a list as a keyPath', () => { const m1 = fromJS({ x: { a: 1, b: 2, c: 3 } }); const m2 = fromJS({ d: 10, b: 20, e: 30 }); expect(m1.mergeDeepIn(fromJS(['x']), m2).toJS()).toEqual({ x: { a: 1, b: 20, c: 3, d: 10, e: 30 }, }); }); it('does not create empty maps for a no-op merge', () => { const m = Map(); expect(m.mergeDeepIn(['a', 'b', 'c'], Map()).toJS()).toEqual({}); }); it('merges into itself for empty path', () => { const m = Map({ a: 1, b: 2, c: 3 }); expect(m.mergeDeepIn([], Map({ d: 10, b: 20, e: 30 })).toJS()).toEqual({ a: 1, b: 20, c: 3, d: 10, e: 30, }); }); it('merges deep into plain JS Object and Array', () => { const m = Map({ a: { x: [1, 2, 3] } }); expect(m.mergeDeepIn(['a'], { x: [4, 5, 6] })).toEqual( Map({ a: { x: [1, 2, 3, 4, 5, 6] } }) ); }); }); describe('prototype pollution', () => { it('setIn on plain object with __proto__ key should not pollute returned object', () => { type User = { profile: { bio: string }; admin?: boolean }; const obj: User = { profile: { bio: 'Hello' } }; const result = setIn(obj, ['__proto__', 'admin'], true); // The returned object should NOT have 'admin' accessible via prototype expect(result.admin).toBeUndefined(); }); it('setIn on plain object with nested __proto__ key should not pollute returned object', () => { type User = { profile: { bio: string; admin?: boolean } }; const obj: User = { profile: { bio: 'Hello' } }; const result = setIn(obj, ['profile', '__proto__', 'admin'], true); // The nested object should NOT have 'admin' accessible via prototype expect(result.profile.admin).toBeUndefined(); }); it('updateIn on plain object with __proto__ key should not pollute returned object', () => { type User = { profile: { bio: string }; admin?: boolean }; const obj: User = { profile: { bio: 'Hello' } }; const result = updateIn(obj, ['__proto__', 'admin'], () => true); // The returned object should NOT have 'admin' accessible via prototype expect(result.admin).toBeUndefined(); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/utils.js000066400000000000000000000033431522056416100224610ustar00rootroot00000000000000/** * @jest-environment jsdom */ import { List, isPlainObject } from 'immutable'; describe('Utils', () => { describe('isPlainObj()', function testFunc() { const nonPlainCases = [ ['Host object', document.createElement('div')], ['bool primitive false', false], ['bool primitive true', true], ['falsy undefined', undefined], ['falsy null', null], ['Simple function', function () {}], [ 'Instance of other object', (function () { function Foo() {} return new Foo(); })(), ], ['Number primitive ', 5], ['String primitive ', 'P'], ['Number Object', Number(6)], ['Immutable.List', new List()], ['simple array', ['one']], ['Error', Error], ['Internal namespaces', Math], ['Arguments', arguments], ]; const plainCases = [ ['literal Object', {}], // eslint-disable-next-line no-object-constructor ['new Object', new Object()], ['Object.create(null)', Object.create(null)], ['nested object', { one: { prop: 'two' } }], ['constructor prop', { constructor: 'prop' }], // shadows an object's constructor ['constructor.name', { constructor: { name: 'two' } }], // shadows an object's constructor.name [ 'Fake toString', { toString: function () { return '[object Object]'; }, }, ], ]; nonPlainCases.forEach(([name, value]) => { it(`${name} returns false`, () => { expect(isPlainObject(value)).toBe(false); }); }); plainCases.forEach(([name, value]) => { it(`${name} returns true`, () => { expect(isPlainObject(value)).toBe(true); }); }); }); }); immutable-js-immutable-js-6a01d72/__tests__/utils/000077500000000000000000000000001522056416100221205ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/__tests__/utils/arrCopy.ts000066400000000000000000000021431522056416100241070ustar00rootroot00000000000000import { describe, it, expect } from '@jest/globals'; import arrCopy from '../../src/utils/arrCopy'; describe('arrCopy', () => { it('should copy an array without offset', () => { const arr = [1, 2, 3, 4]; const result = arrCopy(arr); expect(result).toEqual([1, 2, 3, 4]); expect(result).not.toBe(arr); // Should be a new array }); it('should copy an array with offset', () => { const arr = [1, 2, 3, 4, 5]; const result = arrCopy(arr, 2); expect(result).toEqual([3, 4, 5]); }); it('should return an empty array if offset >= arr.length', () => { const arr = [1, 2, 3]; expect(arrCopy(arr, 3)).toEqual([]); expect(arrCopy(arr, 5)).toEqual([]); }); it('should handle empty array', () => { expect(arrCopy([])).toEqual([]); expect(arrCopy([], 2)).toEqual([]); }); it('should copy array of objects by reference', () => { const obj1 = { a: 1 }; const obj2 = { b: 2 }; const arr = [obj1, obj2]; const result = arrCopy(arr); expect(result).toEqual([obj1, obj2]); expect(result[0]).toBe(obj1); expect(result[1]).toBe(obj2); }); }); immutable-js-immutable-js-6a01d72/__tests__/utils/shallowCopy.ts000066400000000000000000000033111522056416100247720ustar00rootroot00000000000000import { describe, it, expect } from '@jest/globals'; import shallowCopy from '../../src/utils/shallowCopy'; describe('shallowCopy', () => { it('copies a plain object', () => { const obj = { a: 1, b: 2 }; const copy = shallowCopy(obj); expect(copy).toEqual({ a: 1, b: 2 }); expect(copy).not.toBe(obj); }); it('copies an array', () => { const arr = [1, 2, 3]; const copy = shallowCopy(arr); expect(copy).toEqual([1, 2, 3]); expect(copy).not.toBe(arr); }); it('should not propagate __proto__ key from source object', () => { type User = { user: string; admin?: boolean }; // @ts-expect-error -- testing prototype pollution delete Object.prototype.admin; // JSON.parse creates an own property named "__proto__" (not the actual prototype) const malicious = JSON.parse('{"user":"Eve","__proto__":{"admin":true}}'); const copy = shallowCopy(malicious); // The copy should NOT have admin on its prototype chain expect((copy as User).admin).toBeUndefined(); // Global Object prototype should NOT be polluted expect(({} as User).admin).toBeUndefined(); // @ts-expect-error -- cleanup delete Object.prototype.admin; }); it('should not propagate constructor key from source object', () => { type User = { user: string; admin?: boolean }; const malicious: User = { user: 'Eve', // @ts-expect-error -- intentionally setting constructor to test pollution constructor: { prototype: { admin: true } }, }; const copy = shallowCopy(malicious); expect((copy as User).admin).toBeUndefined(); // The constructor of a plain new object should still be Object expect({}.constructor).toBe(Object); }); }); immutable-js-immutable-js-6a01d72/__tests__/zip.ts000066400000000000000000000075641522056416100221460ustar00rootroot00000000000000import { describe, expect, it } from '@jest/globals'; import fc from 'fast-check'; import { List, Range, Seq } from 'immutable'; import { expectToBeDefined } from './ts-utils'; describe('zip', () => { it('zips lists into a list of tuples', () => { expect( Seq([1, 2, 3]) .zip(Seq([4, 5, 6])) .toArray() ).toEqual([ [1, 4], [2, 5], [3, 6], ]); }); it('zip results can be converted to JS', () => { const l1 = List([List([1]), List([2]), List([3])]); const l2 = List([List([4]), List([5]), List([6])]); const zipped = l1.zip(l2); expect(zipped).toEqual( List([ [List([1]), List([4])], [List([2]), List([5])], [List([3]), List([6])], ]) ); expect(zipped.toJS()).toEqual([ [[1], [4]], [[2], [5]], [[3], [6]], ]); }); it('zips with infinite lists', () => { expect( Range(0, Infinity) .zip(Seq(['A', 'B', 'C'])) .toArray() ).toEqual([ [0, 'A'], [1, 'B'], [2, 'C'], ]); }); it('has unknown size when zipped with unknown size', () => { const seq = Range(0, 10); const zipped = seq.zip(seq.filter((n) => n % 2 === 0)); expect(zipped.size).toBe(undefined); expect(zipped.count()).toBe(5); }); it('is always the size of the smaller sequence', () => { fc.assert( fc.property(fc.array(fc.nat(), { minLength: 1 }), (lengths) => { const ranges = lengths.map((l) => Range(0, l)); const first = ranges.shift(); expectToBeDefined(first); const zipped = first.zip.apply(first, ranges); const shortestLength = Math.min.apply(Math, lengths); expect(zipped.size).toBe(shortestLength); }) ); }); describe('zipWith', () => { it('zips with a custom function', () => { expect( Seq([1, 2, 3]) .zipWith((a, b) => a + b, Seq([4, 5, 6])) .toArray() ).toEqual([5, 7, 9]); }); it('can zip to create immutable collections', () => { expect( Seq([1, 2, 3]) .zipWith( function () { // eslint-disable-next-line prefer-rest-params return List(arguments); }, Seq([4, 5, 6]), Seq([7, 8, 9]) ) .toJS() ).toEqual([ [1, 4, 7], [2, 5, 8], [3, 6, 9], ]); }); }); describe('zipAll', () => { it('fills in the empty zipped values with undefined', () => { expect( Seq([1, 2, 3]) .zipAll(Seq([4])) .toArray() ).toEqual([ [1, 4], [2, undefined], [3, undefined], ]); }); it('is always the size of the longest sequence', () => { fc.assert( fc.property(fc.array(fc.nat(), { minLength: 1 }), (lengths) => { const ranges = lengths.map((l) => Range(0, l)); const first = ranges.shift(); expectToBeDefined(first); const zipped = first.zipAll.apply(first, ranges); const longestLength = Math.max.apply(Math, lengths); expect(zipped.size).toBe(longestLength); }) ); }); }); describe('interleave', () => { it('interleaves multiple collections', () => { expect( Seq([1, 2, 3]) .interleave(Seq([4, 5, 6]), Seq([7, 8, 9])) .toArray() ).toEqual([1, 4, 7, 2, 5, 8, 3, 6, 9]); }); it('stops at the shortest collection', () => { const i = Seq([1, 2, 3]).interleave(Seq([4, 5]), Seq([7, 8, 9])); expect(i.size).toBe(6); expect(i.toArray()).toEqual([1, 4, 7, 2, 5, 8]); }); it('with infinite lists', () => { const r: Seq.Indexed = Range(0, Infinity); const i = r.interleave(Seq(['A', 'B', 'C'])); expect(i.size).toBe(6); expect(i.toArray()).toEqual([0, 'A', 1, 'B', 2, 'C']); }); }); }); immutable-js-immutable-js-6a01d72/eslint.config.mjs000066400000000000000000000102111522056416100222720ustar00rootroot00000000000000import pluginJs from '@eslint/js'; import importPlugin from 'eslint-plugin-import'; import pluginJest from 'eslint-plugin-jest'; import pluginReact from 'eslint-plugin-react'; import globals from 'globals'; import { config as tseslintConfig, configs as tseslintConfigs, } from 'typescript-eslint'; /** @type {import('eslint').Linter.Config[]} */ export default tseslintConfig( { files: ['**/*.{js,mjs,cjs,ts,jsx,tsx}'] }, { ignores: [ 'npm/', 'dist/', 'type-definitions/flow-tests', 'website/out/', 'website/.next/', 'website/next-env.d.ts', ], }, { languageOptions: { globals: globals.browser, // parserOptions: { // projectService: true, // tsconfigRootDir: import.meta.dirname, // }, }, }, pluginJs.configs.recommended, importPlugin.flatConfigs.recommended, importPlugin.flatConfigs.typescript, ...tseslintConfigs.recommended, { settings: { 'import/resolver': { typescript: {}, }, }, }, { rules: { eqeqeq: 'error', 'constructor-super': 'off', 'no-constructor-return': 'error', 'no-else-return': 'error', 'no-lonely-if': 'error', 'no-object-constructor': 'error', 'no-prototype-builtins': 'off', 'no-this-before-super': 'off', 'no-useless-concat': 'error', 'no-var': 'error', 'operator-assignment': 'error', 'prefer-arrow-callback': 'error', 'prefer-spread': 'off', '@typescript-eslint/no-unused-vars': [ 'error', { argsIgnorePattern: '^_', }, ], 'sort-imports': 'off', 'import/order': [ 'error', { alphabetize: { order: 'asc' }, // warnOnUnassignedImports: true, }, ], }, }, { files: ['src/*'], rules: { 'no-console': 'error', }, }, { files: ['website/'], ...pluginReact.configs.flat.recommended, ...pluginReact.configs.flat['jsx-runtime'], rules: { 'react/destructuring-assignment': 'off', 'react/jsx-boolean-value': 'off', 'react/jsx-curly-brace-presence': 'off', 'react/jsx-filename-extension': 'off', 'react/no-array-index-key': 'off', 'react/no-danger': 'off', 'react/no-multi-comp': 'off', 'react/prefer-es6-class': 'off', 'react/prefer-stateless-function': 'off', 'react/prop-types': 'off', 'react/self-closing-comp': 'error', 'react/sort-comp': 'off', 'react/jsx-props-no-spreading': 'off', 'react/require-default-props': [ 'error', { functions: 'ignore', }, ], 'jsx-a11y/no-static-element-interactions': 'off', }, }, { files: ['type-definitions/ts-tests/*'], rules: { '@typescript-eslint/no-unused-vars': 'off', 'import/no-unresolved': [ 'error', { ignore: ['immutable'], }, ], }, }, { files: ['__tests__/**/*', 'website/**/*.test.ts', 'perf/*'], languageOptions: { globals: pluginJest.environments.globals.globals, }, ...pluginJest.configs['flat/recommended'], ...pluginJest.configs['flat/style'], plugins: { jest: pluginJest }, rules: { ...pluginJest.configs['flat/recommended'].rules, // TODO activate style rules later // ...pluginJest.configs['jest/style'].rules, 'jest/expect-expect': [ 'error', { assertFunctionNames: [ 'expect', 'expectIs', 'expectIsNot', 'expectAllUndefined', ], additionalTestBlockFunctions: [], }, ], 'import/no-unresolved': [ 'error', { ignore: ['immutable'], }, ], }, }, { files: ['perf/*'], rules: { 'jest/expect-expect': 'off', 'no-redeclare': 'off', 'no-var': 'off', 'prefer-arrow-callback': 'off', }, }, { files: ['resources/*'], rules: { 'no-undef': 'off', 'no-redeclare': 'off', 'no-var': 'off', 'prefer-arrow-callback': 'off', '@typescript-eslint/no-require-imports': 'off', }, } ); immutable-js-immutable-js-6a01d72/jest.config.mjs000066400000000000000000000006011522056416100217430ustar00rootroot00000000000000/** @type {import('jest').Config} */ const config = { moduleFileExtensions: ['js', 'ts'], resolver: '/resources/jestResolver.js', transform: { '^.+\\.(js|ts)$': '/resources/jestPreprocessor.js', }, testRegex: ['/__tests__/.*\\.(ts|js)$', '/website/.*\\.test\\.(ts|js)$'], testPathIgnorePatterns: ['/__tests__/ts-utils.ts'], }; export default config; immutable-js-immutable-js-6a01d72/package-lock.json000066400000000000000000033527231522056416100222550ustar00rootroot00000000000000{ "name": "immutable", "version": "5.1.9", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "immutable", "version": "5.1.9", "license": "MIT", "devDependencies": { "@codemirror/commands": "^6.8.1", "@codemirror/lang-javascript": "^6.2.3", "@codemirror/state": "^6.5.2", "@codemirror/theme-one-dark": "^6.1.2", "@codemirror/view": "^6.36.5", "@docsearch/react": "^4.0.0-beta.5", "@eslint/js": "^9.27.0", "@immutable/devtools": "^2.1.7", "@jest/globals": "^29.7.0", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", "@next/mdx": "^15.3.2", "@rollup/plugin-buble": "1.0.3", "@rollup/plugin-commonjs": "29.0.3", "@rollup/plugin-json": "6.1.0", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.2", "@size-limit/esbuild-why": "^11.2.0", "@size-limit/preset-small-lib": "^12.1.0", "@types/mdx": "^2.0.13", "@types/node": "^25.0.0", "@types/prismjs": "^1.26.3", "@types/random-seed": "0.3.5", "@types/react": "19.1.0", "@types/transducers-js": "^0.4.8", "benchmark": "2.1.4", "codemirror": "^6.0.1", "colors": "1.4.0", "cpy-cli": "^5.0.0", "eslint": "^9.27.0", "eslint-import-resolver-typescript": "^4.4.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.12.0", "eslint-plugin-react": "^7.37.4", "fast-check": "^4.0.0", "flow-bin": "0.160.0", "globals": "^16.5.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jsonml-html": "^1.2.0", "make-synchronous": "0.1.1", "marked": "^11.2.0", "marked-highlight": "^2.1.0", "microtime": "3.1.1", "next": "^15.3.2", "next-sitemap": "4.2.3", "npm-run-all": "4.1.5", "prettier": "^3.5.0", "prismjs": "^1.29.0", "random-seed": "0.3.0", "react": "19.1.0", "react-dom": "19.1.0", "rollup": "4.59.0", "size-limit": "^11.2.0", "transducers-js": "0.4.174", "ts-node": "^10.9.2", "tslib": "^2.8.1", "tstyche": "^5.0.2", "typescript": "5.7", "typescript-eslint": "^8.33.0" }, "engines": { "npm": ">=7.0.0" } }, "node_modules/@ai-sdk/provider": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", "dev": true, "license": "Apache-2.0", "dependencies": { "json-schema": "^0.4.0" }, "engines": { "node": ">=18" } }, "node_modules/@ai-sdk/provider-utils": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", "dev": true, "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" }, "engines": { "node": ">=18" }, "peerDependencies": { "zod": "^3.23.8" } }, "node_modules/@ai-sdk/react": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", "dev": true, "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/ui-utils": "1.2.11", "swr": "^2.2.5", "throttleit": "2.1.0" }, "engines": { "node": ">=18" }, "peerDependencies": { "react": "^18 || ^19 || ^19.0.0-rc", "zod": "^3.23.8" }, "peerDependenciesMeta": { "zod": { "optional": true } } }, "node_modules/@ai-sdk/ui-utils": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "zod-to-json-schema": "^3.24.1" }, "engines": { "node": ">=18" }, "peerDependencies": { "zod": "^3.23.8" } }, "node_modules/@algolia/abtesting": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/autocomplete-core": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", "dev": true, "license": "MIT", "dependencies": { "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", "@algolia/autocomplete-shared": "1.19.2" } }, "node_modules/@algolia/autocomplete-plugin-algolia-insights": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", "dev": true, "license": "MIT", "dependencies": { "@algolia/autocomplete-shared": "1.19.2" }, "peerDependencies": { "search-insights": ">= 1 < 3" } }, "node_modules/@algolia/autocomplete-shared": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", "dev": true, "license": "MIT", "peerDependencies": { "@algolia/client-search": ">= 4.9.1 < 6", "algoliasearch": ">= 4.9.1 < 6" } }, "node_modules/@algolia/client-abtesting": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-analytics": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-common": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", "dev": true, "license": "MIT", "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-insights": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-personalization": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-query-suggestions": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/client-search": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/ingestion": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/monitoring": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/recommend": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-browser-xhr": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-fetch": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@algolia/requester-node-http": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", "dev": true, "license": "MIT", "dependencies": { "@algolia/client-common": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", "dev": true, "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.8", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", "@babel/parser": "^7.26.8", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@types/gensync": "^1.0.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/babel" } }, "node_modules/@babel/generator": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.26.8", "@babel/types": "^7.26.8", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "license": "ISC", "dependencies": { "yallist": "^3.0.2" } }, "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true, "license": "ISC" }, "node_modules/@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.10" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.26.10" }, "bin": { "parser": "bin/babel-parser.js" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-jsx": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-syntax-typescript": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/template": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "@babel/template": "^7.26.8", "@babel/types": "^7.26.8", "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse/node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/@babel/types": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true, "license": "MIT" }, "node_modules/@codemirror/autocomplete": { "version": "6.18.6", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "node_modules/@codemirror/commands": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.0.tgz", "integrity": "sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "node_modules/@codemirror/lang-javascript": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.3.tgz", "integrity": "sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "node_modules/@codemirror/language": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.1.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "node_modules/@codemirror/lint": { "version": "6.8.5", "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.35.0", "crelt": "^1.0.5" } }, "node_modules/@codemirror/search": { "version": "6.5.10", "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz", "integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "crelt": "^1.0.5" } }, "node_modules/@codemirror/state": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", "dev": true, "license": "MIT", "dependencies": { "@marijn/find-cluster-break": "^1.0.0" } }, "node_modules/@codemirror/theme-one-dark": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/highlight": "^1.0.0" } }, "node_modules/@codemirror/view": { "version": "6.36.5", "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.5.tgz", "integrity": "sha512-cd+FZEUlu3GQCYnguYm3EkhJ8KJVisqqUsCOKedBoAt/d9c76JUUap6U0UrpElln5k6VyrEOYliMuDAKIeDQLg==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/state": "^6.5.0", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "node_modules/@corex/deepmerge": { "version": "4.0.43", "resolved": "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-4.0.43.tgz", "integrity": "sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==", "dev": true }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, "engines": { "node": ">=12" } }, "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } }, "node_modules/@docsearch/css": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.0.0-beta.5.tgz", "integrity": "sha512-bZy+gIXRZch0KNPC7MLoj4wkEcNVeEHBXOKJtonoJ2EaLw2vbO1PLGIXxtPgW7Ab7TvI0StkrmGuEQqE2q/1QA==", "dev": true, "license": "MIT" }, "node_modules/@docsearch/react": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.0.0-beta.5.tgz", "integrity": "sha512-OomfOZASe0mUCm0FjOijxjokYDPa/KUOs44gwh6z0qTQxqpLhHMxyDcJHmdfMzmpMba5juu8hC1mUtpDbFAnNg==", "dev": true, "license": "MIT", "dependencies": { "@ai-sdk/react": "^1.2.12", "@algolia/autocomplete-core": "1.19.2", "@docsearch/css": "4.0.0-beta.5", "algoliasearch": "^5.28.0", "marked": "^15.0.12" }, "peerDependencies": { "@types/react": ">= 16.8.0 < 20.0.0", "react": ">= 16.8.0 < 20.0.0", "react-dom": ">= 16.8.0 < 20.0.0", "search-insights": ">= 1 < 3" }, "peerDependenciesMeta": { "@types/react": { "optional": true }, "react": { "optional": true }, "react-dom": { "optional": true }, "search-insights": { "optional": true } } }, "node_modules/@docsearch/react/node_modules/marked": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true, "license": "MIT", "bin": { "marked": "bin/marked.js" }, "engines": { "node": ">= 18" } }, "node_modules/@emnapi/core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "node_modules/@emnapi/runtime": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@emnapi/wasi-threads": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@esbuild/aix-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "aix" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/android-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "cpu": [ "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "cpu": [ "mips64el" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "cpu": [ "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "netbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/openharmony-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "sunos" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint-community/regexpp": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/config-array": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/config-helpers": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/core": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "license": "Apache-2.0", "dependencies": { "@types/json-schema": "^7.0.15" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/eslintrc": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "license": "MIT", "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@eslint/eslintrc/node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true, "license": "Python-2.0" }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@eslint/eslintrc/node_modules/js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/@eslint/js": { "version": "9.39.2", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://eslint.org/donate" } }, "node_modules/@eslint/object-schema": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@eslint/plugin-kit": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "license": "Apache-2.0", "dependencies": { "@eslint/core": "^0.14.0", "levn": "^0.4.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" } }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, "engines": { "node": ">=18.18.0" } }, "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=12.22" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=18.18" }, "funding": { "type": "github", "url": "https://github.com/sponsors/nzakas" } }, "node_modules/@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "dev": true, "license": "MIT", "optional": true, "engines": { "node": ">=18" } }, "node_modules/@img/sharp-darwin-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "node_modules/@img/sharp-darwin-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "darwin" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "node_modules/@img/sharp-libvips-darwin-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "cpu": [ "arm64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-darwin-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "cpu": [ "x64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "darwin" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-arm": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "cpu": [ "arm" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "cpu": [ "arm64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-ppc64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", "cpu": [ "ppc64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-riscv64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", "cpu": [ "riscv64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-s390x": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "cpu": [ "s390x" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linux-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "cpu": [ "x64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "cpu": [ "arm64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "cpu": [ "x64" ], "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ "linux" ], "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-linux-arm": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "cpu": [ "arm" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-arm": "1.2.4" } }, "node_modules/@img/sharp-linux-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-arm64": "1.2.4" } }, "node_modules/@img/sharp-linux-ppc64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", "cpu": [ "ppc64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-ppc64": "1.2.4" } }, "node_modules/@img/sharp-linux-riscv64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", "cpu": [ "riscv64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "node_modules/@img/sharp-linux-s390x": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "cpu": [ "s390x" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "node_modules/@img/sharp-linux-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linux-x64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0", "optional": true, "os": [ "linux" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "node_modules/@img/sharp-wasm32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "cpu": [ "wasm32" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { "@emnapi/runtime": "^1.7.0" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", "cpu": [ "arm64" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-ia32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "cpu": [ "ia32" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@img/sharp-win32-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "cpu": [ "x64" ], "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ "win32" ], "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" } }, "node_modules/@immutable/devtools": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@immutable/devtools/-/devtools-2.1.7.tgz", "integrity": "sha512-Wyrl89smqtRNyx/7WHe2+VGSY1/KUVvQbs7X8tFQvksb+J0AHpZeZZaBLvU2MKxpfDyKZUVst9nhHoH0UeXVDw==", "dev": true, "license": "BSD", "engines": { "node": ">=18" } }, "node_modules/@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "dependencies": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/load-nyc-config/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "license": "MIT", "dependencies": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "license": "MIT", "dependencies": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "license": "MIT", "dependencies": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" }, "engines": { "node": ">=10" } }, "node_modules/@jest/reporters/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-result": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/test-sequencer": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "dependencies": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "node_modules/@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@lezer/common": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", "dev": true, "license": "MIT" }, "node_modules/@lezer/highlight": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" } }, "node_modules/@lezer/javascript": { "version": "1.4.21", "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.21.tgz", "integrity": "sha512-lL+1fcuxWYPURMM/oFZLEDm0XuLN128QPV+VuGtKpeaOGdcl9F2LYC3nh1S9LkPqx9M0mndZFdXCipNAZpzIkQ==", "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.0" } }, "node_modules/@lezer/lr": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", "dev": true, "license": "MIT", "dependencies": { "@lezer/common": "^1.0.0" } }, "node_modules/@marijn/find-cluster-break": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", "dev": true, "license": "MIT" }, "node_modules/@mdx-js/loader": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.1.1.tgz", "integrity": "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==", "dev": true, "license": "MIT", "dependencies": { "@mdx-js/mdx": "^3.0.0", "source-map": "^0.7.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { "webpack": ">=5" }, "peerDependenciesMeta": { "webpack": { "optional": true } } }, "node_modules/@mdx-js/loader/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@mdx-js/mdx": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/@mdx-js/mdx/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } }, "node_modules/@mdx-js/mdx/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@mdx-js/react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "dev": true, "license": "MIT", "dependencies": { "@types/mdx": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" }, "peerDependencies": { "@types/react": ">=16", "react": ">=16" } }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "@emnapi/core": "^1.4.0", "@emnapi/runtime": "^1.4.0", "@tybys/wasm-util": "^0.9.0" } }, "node_modules/@next/env": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz", "integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==", "dev": true, "license": "MIT" }, "node_modules/@next/mdx": { "version": "15.3.2", "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-15.3.2.tgz", "integrity": "sha512-D6lSSbVzn1EiPwrBKG5QzXClcgdqiNCL8a3/6oROinzgZnYSxbVmnfs0UrqygtGSOmgW7sdJJSEOy555DoAwvw==", "dev": true, "license": "MIT", "dependencies": { "source-map": "^0.7.0" }, "peerDependencies": { "@mdx-js/loader": ">=0.15.0", "@mdx-js/react": ">=0.15.0" }, "peerDependenciesMeta": { "@mdx-js/loader": { "optional": true }, "@mdx-js/react": { "optional": true } } }, "node_modules/@next/mdx/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/@next/swc-darwin-arm64": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz", "integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">= 10" } }, "node_modules/@next/swc-darwin-x64": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz", "integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": ">= 10" } }, "node_modules/@next/swc-linux-arm64-gnu": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz", "integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">= 10" } }, "node_modules/@next/swc-linux-arm64-musl": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz", "integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">= 10" } }, "node_modules/@next/swc-linux-x64-gnu": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz", "integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">= 10" } }, "node_modules/@next/swc-linux-x64-musl": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz", "integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ], "engines": { "node": ">= 10" } }, "node_modules/@next/swc-win32-arm64-msvc": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz", "integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">= 10" } }, "node_modules/@next/swc-win32-x64-msvc": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz", "integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ], "engines": { "node": ">= 10" } }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { "node": ">= 8" } }, "node_modules/@rollup/plugin-buble": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-buble/-/plugin-buble-1.0.3.tgz", "integrity": "sha512-QYD9BKkJoof0FdCFeSYYhF6/Y8e0Mnf+098xGgmWOFJ4UPHlWujjqOYeVwEm2hJPOmlR5k7HPUdAjqtOWhN64Q==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/buble": "^0.19.2", "buble": "^0.20.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/plugin-buble/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/@rollup/plugin-buble/node_modules/buble": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/buble/-/buble-0.20.0.tgz", "integrity": "sha512-/1gnaMQE8xvd5qsNBl+iTuyjJ9XxeaVxAMF86dQ4EyxFJOZtsgOS8Ra+7WHgZTam5IFDtt4BguN0sH0tVTKrOw==", "dev": true, "dependencies": { "acorn": "^6.4.1", "acorn-dynamic-import": "^4.0.0", "acorn-jsx": "^5.2.0", "chalk": "^2.4.2", "magic-string": "^0.25.7", "minimist": "^1.2.5", "regexpu-core": "4.5.4" }, "bin": { "buble": "bin/buble" } }, "node_modules/@rollup/plugin-buble/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/@rollup/plugin-buble/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/@rollup/plugin-buble/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/@rollup/plugin-buble/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" } }, "node_modules/@rollup/plugin-buble/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/@rollup/plugin-buble/node_modules/regexpu-core": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", "dev": true, "dependencies": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.0.2", "regjsgen": "^0.5.0", "regjsparser": "^0.6.0", "unicode-match-property-ecmascript": "^1.0.4", "unicode-match-property-value-ecmascript": "^1.1.0" }, "engines": { "node": ">=4" } }, "node_modules/@rollup/plugin-buble/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/@rollup/plugin-commonjs": { "version": "29.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.3.tgz", "integrity": "sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "engines": { "node": ">=16.0.0 || 14 >= 14.17" }, "peerDependencies": { "rollup": "^2.68.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, "license": "MIT", "peerDependencies": { "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { "picomatch": { "optional": true } } }, "node_modules/@rollup/plugin-commonjs/node_modules/magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@rollup/plugin-json": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/plugin-terser": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, "license": "MIT", "dependencies": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/plugin-typescript": { "version": "12.1.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", "dev": true, "license": "MIT", "dependencies": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^2.14.0||^3.0.0||^4.0.0", "tslib": "*", "typescript": ">=3.7.0" }, "peerDependenciesMeta": { "rollup": { "optional": true }, "tslib": { "optional": true } } }, "node_modules/@rollup/pluginutils": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "engines": { "node": ">=14.0.0" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "peerDependenciesMeta": { "rollup": { "optional": true } } }, "node_modules/@rollup/pluginutils/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/@rollup/rollup-android-arm-eabi": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-android-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "android" ] }, "node_modules/@rollup/rollup-darwin-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-darwin-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@rollup/rollup-freebsd-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-freebsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "cpu": [ "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-loong64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "cpu": [ "loong64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-ppc64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "cpu": [ "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-linux-x64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@rollup/rollup-openbsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openbsd" ] }, "node_modules/@rollup/rollup-openharmony-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "openharmony" ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true, "license": "MIT" }, "node_modules/@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "dependencies": { "type-detect": "4.0.8" } }, "node_modules/@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "dependencies": { "@sinonjs/commons": "^3.0.0" } }, "node_modules/@size-limit/esbuild-why": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/@size-limit/esbuild-why/-/esbuild-why-11.2.0.tgz", "integrity": "sha512-VtoQbbkvFbF314LWEaEp1+IjG0DH+9w6nP//D6Gd48SEAPLoBgqk287mjYTF9WYxg9N5lo8KjpXxEFk4gOXNpw==", "dev": true, "license": "MIT", "dependencies": { "esbuild-visualizer": "^0.7.0", "open": "^10.1.0" }, "engines": { "node": "^18.0.0 || >=20.0.0" }, "peerDependencies": { "size-limit": "11.2.0" } }, "node_modules/@size-limit/preset-small-lib": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@size-limit/preset-small-lib/-/preset-small-lib-12.1.0.tgz", "integrity": "sha512-TVVQ/iuHbaGtHJrjur5s4XKYEyGk0nIwUAqhuzhKPbTyV9nYOH/laDelQ4vg3cGmm8sayRx998wxEdnwM/Yewg==", "dev": true, "license": "MIT", "dependencies": { "@size-limit/esbuild": "12.1.0", "@size-limit/file": "12.1.0", "size-limit": "12.1.0" }, "peerDependencies": { "size-limit": "12.1.0" } }, "node_modules/@size-limit/preset-small-lib/node_modules/@size-limit/esbuild": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@size-limit/esbuild/-/esbuild-12.1.0.tgz", "integrity": "sha512-Um6MVrX+05kIxI4+zk0ZByG9dA/Th1f+sfGc571D95BnCPc90/pl2+2OdsQuOyoWEbeAMqfcTKo0v07i+E65Vw==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.28.0", "nanoid": "^5.1.7" }, "engines": { "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "size-limit": "12.1.0" } }, "node_modules/@size-limit/preset-small-lib/node_modules/@size-limit/file": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@size-limit/file/-/file-12.1.0.tgz", "integrity": "sha512-eGwDcIufnNnvJRzv3liDOn6MAOGgmOTUdpeGQ2KuRTlgIgO54AJH1ilvktlJc6PIjNfwpYY0dOGyap1QgM1swQ==", "dev": true, "license": "MIT", "engines": { "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "size-limit": "12.1.0" } }, "node_modules/@size-limit/preset-small-lib/node_modules/nanoid": { "version": "5.1.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.11.tgz", "integrity": "sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "bin": { "nanoid": "bin/nanoid.js" }, "engines": { "node": "^18 || >=20" } }, "node_modules/@size-limit/preset-small-lib/node_modules/size-limit": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-12.1.0.tgz", "integrity": "sha512-VnDS2fycANrJFVPQwjaD+h+hkISY7EB3LsPsYWje4lBCjQwwsZLxjwwRwVJKHrcj2ZqyG+DdXykWm9mbZklZrw==", "dev": true, "license": "MIT", "dependencies": { "bytes-iec": "^3.1.1", "lilconfig": "^3.1.3", "nanospinner": "^1.2.2", "picocolors": "^1.1.1", "tinyglobby": "^0.2.16" }, "bin": { "size-limit": "bin.js" }, "engines": { "node": "^20.0.0 || ^22.0.0 || >=24.0.0" }, "peerDependencies": { "jiti": "^2.0.0" }, "peerDependenciesMeta": { "jiti": { "optional": true } } }, "node_modules/@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "dev": true, "license": "Apache-2.0", "dependencies": { "tslib": "^2.8.0" } }, "node_modules/@tootallnate/once": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 10" } }, "node_modules/@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true, "license": "MIT" }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true, "license": "MIT" }, "node_modules/@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, "license": "MIT", "optional": true, "dependencies": { "tslib": "^2.4.0" } }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "node_modules/@types/babel__generator": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__traverse": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.20.7" } }, "node_modules/@types/buble": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@types/buble/-/buble-0.19.2.tgz", "integrity": "sha512-uUD8zIfXMKThmFkahTXDGI3CthFH1kMg2dOm3KLi4GlC5cbARA64bEcUMbbWdWdE73eoc/iBB9PiTMqH0dNS2Q==", "dev": true, "dependencies": { "magic-string": "^0.25.0" } }, "node_modules/@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "license": "MIT", "dependencies": { "@types/ms": "*" } }, "node_modules/@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true, "license": "MIT" }, "node_modules/@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "*" } }, "node_modules/@types/gensync": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", "dev": true, "license": "MIT" }, "node_modules/@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "node_modules/@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/jsdom": { "version": "20.0.1", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", "dev": true, "dependencies": { "@types/node": "*", "@types/tough-cookie": "*", "parse5": "^7.0.0" } }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true, "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true, "license": "MIT" }, "node_modules/@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "*" } }, "node_modules/@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", "dev": true, "license": "MIT" }, "node_modules/@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true, "license": "MIT" }, "node_modules/@types/node": { "version": "25.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.0.tgz", "integrity": "sha512-rl78HwuZlaDIUSeUKkmogkhebA+8K1Hy7tddZuJ3D0xV8pZSfsYGTsliGUol1JPzu9EKnTxPC4L1fiWouStRew==", "dev": true, "license": "MIT", "dependencies": { "undici-types": "~7.16.0" } }, "node_modules/@types/prismjs": { "version": "1.26.5", "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", "dev": true, "license": "MIT" }, "node_modules/@types/random-seed": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@types/random-seed/-/random-seed-0.3.5.tgz", "integrity": "sha512-CftxcDPAHgs0SLHU2dt+ZlDPJfGqLW3sZlC/ATr5vJDSe5tRLeOne7HMvCOJnFyF8e1U41wqzs3h6AMC613xtA==", "dev": true, "license": "MIT" }, "node_modules/@types/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.0.2" } }, "node_modules/@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "node_modules/@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, "node_modules/@types/transducers-js": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/@types/transducers-js/-/transducers-js-0.4.8.tgz", "integrity": "sha512-WMzIHF9H1R9/oJHogF4m2pp2OkmWp1eHFDXyZY7L8UTcgramikok09SPFCnH/TJxZ70ke4ubTksFjIHLCu3OLA==", "dev": true, "license": "MIT" }, "node_modules/@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true, "license": "MIT" }, "node_modules/@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/type-utils": "8.61.1", "@typescript-eslint/utils": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "@typescript-eslint/parser": "^8.61.1", "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/@typescript-eslint/parser": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/project-service": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/tsconfig-utils": "^8.61.1", "@typescript-eslint/types": "^8.61.1", "debug": "^4.4.3" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/scope-manager": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/tsconfig-utils": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/type-utils": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/utils": "8.61.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/types": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/typescript-estree": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/project-service": "8.61.1", "@typescript-eslint/tsconfig-utils": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true, "license": "MIT", "engines": { "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "license": "MIT", "dependencies": { "balanced-match": "^4.0.2" }, "engines": { "node": "18 || 20 || >=22" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "license": "BlueOak-1.0.0", "dependencies": { "brace-expansion": "^5.0.5" }, "engines": { "node": "18 || 20 || >=22" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/@typescript-eslint/utils": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/@typescript-eslint/visitor-keys": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/types": "8.61.1", "eslint-visitor-keys": "^5.0.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" } }, "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^20.19.0 || ^22.13.0 || >=24" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true, "license": "ISC" }, "node_modules/@unrs/resolver-binding-darwin-arm64": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.2.tgz", "integrity": "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@unrs/resolver-binding-darwin-x64": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.2.tgz", "integrity": "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "darwin" ] }, "node_modules/@unrs/resolver-binding-freebsd-x64": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.2.tgz", "integrity": "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "freebsd" ] }, "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.2.tgz", "integrity": "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.2.tgz", "integrity": "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==", "cpu": [ "arm" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.2.tgz", "integrity": "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-arm64-musl": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.2.tgz", "integrity": "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.2.tgz", "integrity": "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==", "cpu": [ "ppc64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.2.tgz", "integrity": "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.2.tgz", "integrity": "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==", "cpu": [ "riscv64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.2.tgz", "integrity": "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==", "cpu": [ "s390x" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-x64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz", "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-linux-x64-musl": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz", "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "linux" ] }, "node_modules/@unrs/resolver-binding-wasm32-wasi": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.2.tgz", "integrity": "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==", "cpu": [ "wasm32" ], "dev": true, "license": "MIT", "optional": true, "dependencies": { "@napi-rs/wasm-runtime": "^0.2.9" }, "engines": { "node": ">=14.0.0" } }, "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.2.tgz", "integrity": "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==", "cpu": [ "arm64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.2.tgz", "integrity": "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==", "cpu": [ "ia32" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/@unrs/resolver-binding-win32-x64-msvc": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz", "integrity": "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==", "cpu": [ "x64" ], "dev": true, "license": "MIT", "optional": true, "os": [ "win32" ] }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "node_modules/acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true, "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-dynamic-import": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", "dev": true, "peerDependencies": { "acorn": "^6.0.0" } }, "node_modules/acorn-globals": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dev": true, "dependencies": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" } }, "node_modules/acorn-globals/node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "node_modules/acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "dependencies": { "debug": "4" }, "engines": { "node": ">= 6.0.0" } }, "node_modules/aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "license": "MIT", "dependencies": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" }, "funding": { "type": "github", "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/algoliasearch": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", "dev": true, "license": "MIT", "dependencies": { "@algolia/abtesting": "1.1.0", "@algolia/client-abtesting": "5.35.0", "@algolia/client-analytics": "5.35.0", "@algolia/client-common": "5.35.0", "@algolia/client-insights": "5.35.0", "@algolia/client-personalization": "5.35.0", "@algolia/client-query-suggestions": "5.35.0", "@algolia/client-search": "5.35.0", "@algolia/ingestion": "1.35.0", "@algolia/monitoring": "1.35.0", "@algolia/recommend": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" }, "engines": { "node": ">= 14.0.0" } }, "node_modules/ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "license": "MIT", "dependencies": { "type-fest": "^0.21.3" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { "color-convert": "^2.0.1" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" }, "engines": { "node": ">= 8" } }, "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true, "license": "MIT" }, "node_modules/argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "dependencies": { "sprintf-js": "~1.0.2" } }, "node_modules/array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.findlastindex": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flat": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.flatmap": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/arrify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "dev": true, "license": "MIT", "bin": { "astring": "bin/astring" } }, "node_modules/async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "license": "MIT", "dependencies": { "possible-typed-array-names": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "license": "MIT", "dependencies": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.8.0" } }, "node_modules/babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" }, "engines": { "node": ">=8" } }, "node_modules/babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "license": "MIT", "dependencies": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "dependencies": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "license": "MIT", "dependencies": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@babel/core": "^7.0.0" } }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "node_modules/benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", "dev": true, "dependencies": { "lodash": "^4.17.4", "platform": "^1.3.3" } }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.1.1" }, "engines": { "node": ">=8" } }, "node_modules/browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" }, "engines": { "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" } }, "node_modules/bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "dependencies": { "node-int64": "^0.4.0" } }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "node_modules/bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "license": "MIT", "dependencies": { "run-applescript": "^7.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bytes-iec": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/bytes-iec/-/bytes-iec-3.1.1.tgz", "integrity": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==", "dev": true, "engines": { "node": ">= 0.8" } }, "node_modules/call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/call-bound": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/caniuse-lite": { "version": "1.0.30001699", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/caniuse-lite" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "CC-BY-4.0" }, "node_modules/ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/chalk?sponsor=1" } }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-entities-legacy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/character-reference-invalid": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "license": "MIT", "dependencies": { "readdirp": "^4.0.1" }, "engines": { "node": ">= 14.16.0" }, "funding": { "url": "https://paulmillr.com/funding/" } }, "node_modules/ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/sibiraj-s" } ], "engines": { "node": ">=8" } }, "node_modules/cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true, "license": "MIT" }, "node_modules/clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, "license": "MIT", "dependencies": { "escape-string-regexp": "5.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/clean-stack/node_modules/escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "dev": true, "license": "MIT" }, "node_modules/cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "license": "ISC", "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/cliui/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/cliui/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/cliui/node_modules/wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true, "license": "MIT", "engines": { "iojs": ">= 1.0.0", "node": ">= 0.12.0" } }, "node_modules/codemirror": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", "dev": true, "license": "MIT", "dependencies": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "node_modules/collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true, "license": "MIT" }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "dependencies": { "color-name": "~1.1.4" }, "engines": { "node": ">=7.0.0" } }, "node_modules/color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "node_modules/colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true, "engines": { "node": ">=0.1.90" } }, "node_modules/combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "dependencies": { "delayed-stream": "~1.0.0" }, "engines": { "node": ">= 0.8" } }, "node_modules/comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, "node_modules/cp-file": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-10.0.0.tgz", "integrity": "sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==", "dev": true, "license": "MIT", "dependencies": { "graceful-fs": "^4.2.10", "nested-error-stacks": "^2.1.1", "p-event": "^5.0.1" }, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cpy": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/cpy/-/cpy-10.1.0.tgz", "integrity": "sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ==", "dev": true, "license": "MIT", "dependencies": { "arrify": "^3.0.0", "cp-file": "^10.0.0", "globby": "^13.1.4", "junk": "^4.0.1", "micromatch": "^4.0.5", "nested-error-stacks": "^2.1.1", "p-filter": "^3.0.0", "p-map": "^6.0.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cpy-cli": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-5.0.0.tgz", "integrity": "sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ==", "dev": true, "license": "MIT", "dependencies": { "cpy": "^10.1.0", "meow": "^12.0.1" }, "bin": { "cpy": "cli.js" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cpy/node_modules/globby": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "license": "MIT", "dependencies": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/cpy/node_modules/slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" }, "bin": { "create-jest": "bin/create-jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true, "license": "MIT" }, "node_modules/crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "dev": true, "license": "MIT" }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" }, "engines": { "node": ">= 8" } }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", "dev": true }, "node_modules/cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "dependencies": { "cssom": "~0.3.6" }, "engines": { "node": ">=8" } }, "node_modules/cssstyle/node_modules/cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true }, "node_modules/csstype": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==", "dev": true }, "node_modules/data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, "dependencies": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0" }, "engines": { "node": ">=12" } }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/data-view-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/inspect-js" } }, "node_modules/data-view-byte-offset": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" }, "engines": { "node": ">=6.0" }, "peerDependenciesMeta": { "supports-color": { "optional": true } } }, "node_modules/decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, "node_modules/decode-named-character-reference": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", "dev": true, "license": "MIT", "dependencies": { "character-entities": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/dedent": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "dev": true, "license": "MIT", "peerDependencies": { "babel-plugin-macros": "^3.1.0" }, "peerDependenciesMeta": { "babel-plugin-macros": { "optional": true } } }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true, "license": "MIT" }, "node_modules/deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/default-browser": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, "license": "MIT", "dependencies": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/default-browser-id": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true, "engines": { "node": ">=0.4.0" } }, "node_modules/dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "license": "Apache-2.0", "optional": true, "engines": { "node": ">=8" } }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, "license": "MIT", "dependencies": { "dequal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "license": "MIT", "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "dependencies": { "path-type": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "license": "Apache-2.0", "dependencies": { "esutils": "^2.0.2" }, "engines": { "node": ">=0.10.0" } }, "node_modules/domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "dev": true, "dependencies": { "webidl-conversions": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/electron-to-chromium": { "version": "1.5.97", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", "dev": true, "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" } }, "node_modules/entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true, "engines": { "node": ">=0.12" }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } }, "node_modules/es-abstract": { "version": "1.23.9", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "license": "MIT", "dependencies": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/es-iterator-helpers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-set-tostringtag": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-to-primitive": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "license": "MIT", "dependencies": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/esast-util-from-js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/esast-util-from-js/node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/esbuild": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "hasInstallScript": true, "license": "MIT", "bin": { "esbuild": "bin/esbuild" }, "engines": { "node": ">=18" }, "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" } }, "node_modules/esbuild-visualizer": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/esbuild-visualizer/-/esbuild-visualizer-0.7.0.tgz", "integrity": "sha512-Vz22k+G2WT7GuCo7rbhaQwGbZ26lEhwzsctkEdQlu2SVrshoM4hzQeRpu/3DP596a9+9K2JyYsinuC6AC896Og==", "dev": true, "license": "MIT", "dependencies": { "open": "^8.4.0", "picomatch": "^4.0.0", "yargs": "^17.6.2" }, "bin": { "esbuild-visualizer": "dist/bin/cli.js" }, "engines": { "node": ">=18" } }, "node_modules/esbuild-visualizer/node_modules/define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/esbuild-visualizer/node_modules/is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/esbuild-visualizer/node_modules/is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "license": "MIT", "dependencies": { "is-docker": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/esbuild-visualizer/node_modules/open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "license": "MIT", "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/esbuild-visualizer/node_modules/picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/escodegen": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", "esgenerate": "bin/esgenerate.js" }, "engines": { "node": ">=6.0" }, "optionalDependencies": { "source-map": "~0.6.1" } }, "node_modules/eslint": { "version": "9.27.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", "dev": true, "license": "MIT", "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.27.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "bin": { "eslint": "bin/eslint.js" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://eslint.org/donate" }, "peerDependencies": { "jiti": "*" }, "peerDependenciesMeta": { "jiti": { "optional": true } } }, "node_modules/eslint-import-context": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.6.tgz", "integrity": "sha512-/e2ZNPDLCrU8niIy0pddcvXuoO2YrKjf3NAIX+60mHJBT4yv7mqCqvVdyCW2E720e25e4S/1OSVef4U6efGLFg==", "dev": true, "license": "MIT", "dependencies": { "get-tsconfig": "^4.10.1", "stable-hash": "^0.0.5" }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/eslint-import-context" }, "peerDependencies": { "unrs-resolver": "^1.0.0" }, "peerDependenciesMeta": { "unrs-resolver": { "optional": true } } }, "node_modules/eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-import-resolver-typescript": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.1.tgz", "integrity": "sha512-KHQnjMAn/Hbs1AcMs2YfJTeNoWsaOoMRvJUKr77Y2dv7jNOaT8/IJYlvfN/ZIwTxUsv2B6amwv7u9bt2Vl9lZg==", "dev": true, "license": "ISC", "dependencies": { "debug": "^4.4.1", "eslint-import-context": "^0.1.5", "get-tsconfig": "^4.10.1", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.14", "unrs-resolver": "^1.7.2" }, "engines": { "node": "^16.17.0 || >=18.6.0" }, "funding": { "url": "https://opencollective.com/eslint-import-resolver-typescript" }, "peerDependencies": { "eslint": "*", "eslint-plugin-import": "*", "eslint-plugin-import-x": "*" }, "peerDependenciesMeta": { "eslint-plugin-import": { "optional": true }, "eslint-plugin-import-x": { "optional": true } } }, "node_modules/eslint-module-utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "license": "MIT", "dependencies": { "debug": "^3.2.7" }, "engines": { "node": ">=4" }, "peerDependenciesMeta": { "eslint": { "optional": true } } }, "node_modules/eslint-module-utils/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-import": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "license": "MIT", "dependencies": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9" } }, "node_modules/eslint-plugin-import/node_modules/debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.1" } }, "node_modules/eslint-plugin-jest": { "version": "28.12.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.12.0.tgz", "integrity": "sha512-J6zmDp8WiQ9tyvYXE+3RFy7/+l4hraWLzmsabYXyehkmmDd36qV4VQFc7XzcsD8C1PTNt646MSx25bO1mdd9Yw==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "engines": { "node": "^16.10.0 || ^18.12.0 || >=20.0.0" }, "peerDependencies": { "@typescript-eslint/eslint-plugin": "^6.0.0 || ^7.0.0 || ^8.0.0", "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0", "jest": "*" }, "peerDependenciesMeta": { "@typescript-eslint/eslint-plugin": { "optional": true }, "jest": { "optional": true } } }, "node_modules/eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "engines": { "node": ">=4" }, "peerDependencies": { "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7" } }, "node_modules/eslint-plugin-react/node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/eslint-scope": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true, "license": "Apache-2.0", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/@eslint/js": { "version": "9.27.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", "dev": true, "license": "MIT", "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://eslint.org/donate" } }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.3" }, "engines": { "node": ">=10.13.0" } }, "node_modules/espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "url": "https://opencollective.com/eslint" } }, "node_modules/espree/node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true, "bin": { "esparse": "bin/esparse.js", "esvalidate": "bin/esvalidate.js" }, "engines": { "node": ">=4" } }, "node_modules/esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "estraverse": "^5.1.0" }, "engines": { "node": ">=0.10" } }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "estraverse": "^5.2.0" }, "engines": { "node": ">=4.0" } }, "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true, "engines": { "node": ">=4.0" } }, "node_modules/estree-util-attach-comments": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/estree-util-build-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/estree-util-build-jsx/node_modules/estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0" } }, "node_modules/estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "dev": true, "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/estree-util-scope": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/estree-util-to-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/estree-util-to-js/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">= 8" } }, "node_modules/estree-util-visit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true, "license": "MIT" }, "node_modules/esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "license": "MIT", "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true, "engines": { "node": ">= 0.8.0" } }, "node_modules/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "license": "MIT", "dependencies": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true, "license": "MIT" }, "node_modules/fast-check": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.0.0.tgz", "integrity": "sha512-aXLyLemZ7qhLNn2oq+YpjT2Xed21+i29WGAYuyrGbU4r8oinB3i4XR4e62O3NY6qmm5qHEDoc/7d+gMsri3AfA==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/dubzzz" }, { "type": "opencollective", "url": "https://opencollective.com/fast-check" } ], "license": "MIT", "dependencies": { "pure-rand": "^7.0.0" }, "engines": { "node": ">=12.17.0" } }, "node_modules/fast-check/node_modules/pure-rand": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/dubzzz" }, { "type": "opencollective", "url": "https://opencollective.com/fast-check" } ], "license": "MIT" }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true, "license": "MIT" }, "node_modules/fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" }, "engines": { "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true, "license": "MIT" }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "dependencies": { "bser": "2.1.1" } }, "node_modules/file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "license": "MIT", "dependencies": { "flat-cache": "^4.0.0" }, "engines": { "node": ">=16.0.0" } }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "license": "MIT", "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.4" }, "engines": { "node": ">=16" } }, "node_modules/flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true, "license": "ISC" }, "node_modules/flow-bin": { "version": "0.160.0", "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.160.0.tgz", "integrity": "sha512-hqb/1z7U9Jv+2hDdslAgdab6D4AUDrYIcF2zH/CKx9YgQtCeHfnzCcypzCNU7xmBm2+Mi9+1hqeB4OQX2adh0A==", "dev": true, "bin": { "flow": "cli.js" }, "engines": { "node": ">=0.10.0" } }, "node_modules/for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "dependencies": { "is-callable": "^1.1.3" } }, "node_modules/form-data": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.4", "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" } }, "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "license": "MIT", "optional": true, "os": [ "darwin" ], "engines": { "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/function.prototype.name": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true, "engines": { "node": ">=8.0.0" } }, "node_modules/get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/get-tsconfig": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "license": "MIT", "dependencies": { "resolve-pkg-maps": "^1.0.0" }, "funding": { "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" } }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "license": "ISC", "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" }, "engines": { "node": "*" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "dependencies": { "is-glob": "^4.0.1" }, "engines": { "node": ">= 6" } }, "node_modules/globals": { "version": "16.5.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.2.1", "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "node_modules/has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "license": "MIT", "dependencies": { "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/hast-util-to-estree": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "node_modules/html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "dependencies": { "whatwg-encoding": "^2.0.0" }, "engines": { "node": ">=12" } }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true, "license": "MIT" }, "node_modules/http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "dependencies": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "dependencies": { "agent-base": "6", "debug": "4" }, "engines": { "node": ">= 6" } }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true, "license": "Apache-2.0", "engines": { "node": ">=10.17.0" } }, "node_modules/iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", "engines": { "node": ">= 4" } }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "license": "MIT", "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" }, "bin": { "import-local-fixture": "fixtures/cli.js" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true, "engines": { "node": ">=0.8.19" } }, "node_modules/indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" } }, "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "node_modules/inline-style-parser": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "dev": true, "license": "MIT" }, "node_modules/internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-alphanumerical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "dev": true, "license": "MIT", "dependencies": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "license": "MIT", "dependencies": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-bigint": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "license": "MIT", "dependencies": { "has-bigints": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-bun-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.7.1" } }, "node_modules/is-bun-module/node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-data-view": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-date-object": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true, "license": "MIT", "bin": { "is-docker": "cli.js" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/is-finalizationregistry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/is-generator-function": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, "engines": { "node": ">=0.10.0" } }, "node_modules/is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "license": "MIT", "dependencies": { "is-docker": "^3.0.0" }, "bin": { "is-inside-container": "cli.js" }, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "node_modules/is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "dependencies": { "@types/estree": "*" } }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-shared-array-buffer": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true, "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-symbol": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "license": "MIT", "dependencies": { "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-weakset": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "license": "MIT", "dependencies": { "is-inside-container": "^1.0.0" }, "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "dependencies": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" }, "engines": { "node": ">=8" } }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" }, "engines": { "node": ">=10" } }, "node_modules/istanbul-reports": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-changed-files": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "license": "MIT", "dependencies": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "license": "MIT", "dependencies": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" }, "bin": { "jest": "bin/jest.js" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" }, "peerDependenciesMeta": { "node-notifier": { "optional": true } } }, "node_modules/jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "@types/node": "*", "ts-node": ">=9.0.0" }, "peerDependenciesMeta": { "@types/node": { "optional": true }, "ts-node": { "optional": true } } }, "node_modules/jest-config/node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" }, "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "license": "MIT", "dependencies": { "detect-newline": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-each": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-environment-jsdom": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0", "jsdom": "^20.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "peerDependencies": { "canvas": "^2.5.0" }, "peerDependenciesMeta": { "canvas": { "optional": true } } }, "node_modules/jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" }, "optionalDependencies": { "fsevents": "^2.3.2" } }, "node_modules/jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "license": "MIT", "dependencies": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "license": "MIT", "engines": { "node": ">=6" }, "peerDependencies": { "jest-resolve": "*" }, "peerDependenciesMeta": { "jest-resolve": { "optional": true } } }, "node_modules/jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "license": "MIT", "dependencies": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-resolve-dependencies": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "license": "MIT", "dependencies": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-runner/node_modules/source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "license": "MIT", "dependencies": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-snapshot/node_modules/semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "license": "MIT", "dependencies": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-validate/node_modules/camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true, "license": "MIT", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "license": "MIT", "dependencies": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "license": "MIT", "dependencies": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/jest-worker/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/supports-color?sponsor=1" } }, "node_modules/jiti": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "dev": true, "license": "MIT", "bin": { "jiti": "lib/jiti-cli.mjs" } }, "node_modules/js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "node_modules/js-yaml": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "license": "MIT", "dependencies": { "argparse": "^1.0.7", "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" } }, "node_modules/jsdom": { "version": "20.0.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, "dependencies": { "abab": "^2.0.6", "acorn": "^8.8.1", "acorn-globals": "^7.0.0", "cssom": "^0.5.0", "cssstyle": "^2.3.0", "data-urls": "^3.0.2", "decimal.js": "^10.4.2", "domexception": "^4.0.0", "escodegen": "^2.0.0", "form-data": "^4.0.0", "html-encoding-sniffer": "^3.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.2", "parse5": "^7.1.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^4.1.2", "w3c-xmlserializer": "^4.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0", "ws": "^8.11.0", "xml-name-validator": "^4.0.0" }, "engines": { "node": ">=14" }, "peerDependencies": { "canvas": "^2.5.0" }, "peerDependenciesMeta": { "canvas": { "optional": true } } }, "node_modules/jsdom/node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/jsdom/node_modules/tough-cookie": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" }, "engines": { "node": ">=6" } }, "node_modules/jsdom/node_modules/universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true, "engines": { "node": ">= 4.0.0" } }, "node_modules/jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { "node": ">=6" } }, "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true, "license": "MIT" }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true, "license": "MIT" }, "node_modules/json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true, "license": "(AFL-2.1 OR BSD-3-Clause)" }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true, "license": "MIT" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true, "license": "MIT" }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true, "license": "ISC" }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true, "bin": { "json5": "lib/cli.js" }, "engines": { "node": ">=6" } }, "node_modules/jsonml-html": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jsonml-html/-/jsonml-html-1.2.1.tgz", "integrity": "sha512-cLEJ3EvUskBRdkJlxPvEmGoPwdlCY1JM0uSM4fgjB91eIgRKyr4fsfvB89suuD1ecns1hsJJZDV80aqzHxdXhg==", "dev": true, "license": "ISC" }, "node_modules/jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "license": "MIT", "dependencies": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" }, "engines": { "node": ">=4.0" } }, "node_modules/junk": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", "dev": true, "license": "MIT", "engines": { "node": ">=12.20" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "license": "MIT", "dependencies": { "json-buffer": "3.0.1" } }, "node_modules/kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true, "license": "MIT", "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/antonk52" } }, "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true, "license": "MIT" }, "node_modules/load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "dependencies": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/load-json-file/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^5.0.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true, "license": "MIT" }, "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true, "license": "MIT" }, "node_modules/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" }, "bin": { "loose-envify": "cli.js" } }, "node_modules/magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "license": "MIT", "dependencies": { "sourcemap-codec": "^1.4.8" } }, "node_modules/make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "license": "MIT", "dependencies": { "semver": "^7.5.3" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true, "license": "ISC" }, "node_modules/make-synchronous": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/make-synchronous/-/make-synchronous-0.1.1.tgz", "integrity": "sha512-Y4SxxqhaoyMDokJQ0AZz0E+bLhRkOSR7Z/IQoTKPdS6HYi3aobal2kMHoHHoqBadPWjf07P4K1FQLXOx3wf9Yw==", "dev": true, "dependencies": { "subsume": "^3.0.0", "type-fest": "^0.16.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-synchronous/node_modules/type-fest": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "dependencies": { "tmpl": "1.0.5" } }, "node_modules/markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "dev": true, "license": "MIT", "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/marked": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", "dev": true, "bin": { "marked": "bin/marked.js" }, "engines": { "node": ">= 18" } }, "node_modules/marked-highlight": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.2.3.tgz", "integrity": "sha512-FCfZRxW/msZAiasCML4isYpxyQWKEEx44vOgdn5Kloae+Qc3q4XR7WjpKKf8oMLk7JP9ZCRd2vhtclJFdwxlWQ==", "dev": true, "license": "MIT", "peerDependencies": { "marked": ">=4 <18" } }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/mdast-util-from-markdown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-mdx": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "dev": true, "license": "MIT", "dependencies": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-mdx-expression": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-mdx-jsx": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-mdxjs-esm": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "dev": true, "license": "MIT", "dependencies": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-phrasing": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-hast": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-markdown": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/mdast-util-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true, "engines": { "node": ">= 0.10.0" } }, "node_modules/meow": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true, "license": "MIT", "engines": { "node": ">=16.10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "node_modules/merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-core-commonmark": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-expression": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-extension-mdx-jsx": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-mdx-md": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "dev": true, "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-mdxjs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "dev": true, "license": "MIT", "dependencies": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-mdxjs-esm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/micromark-extension-mdxjs/node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/micromark-factory-destination": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-label": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-mdx-expression": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "node_modules/micromark-factory-space": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-title": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-factory-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-character": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-chunked": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-classify-character": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-combine-extensions": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-decode-numeric-character-reference": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-decode-string": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-encode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromark-util-events-to-acorn": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "node_modules/micromark-util-html-tag-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromark-util-normalize-identifier": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-resolve-all": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-sanitize-uri": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "node_modules/micromark-util-subtokenize": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT", "dependencies": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "node_modules/micromark-util-symbol": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromark-util-types": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true, "funding": [ { "type": "GitHub Sponsors", "url": "https://github.com/sponsors/unifiedjs" }, { "type": "OpenCollective", "url": "https://opencollective.com/unified" } ], "license": "MIT" }, "node_modules/micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { "node": ">=8.6" } }, "node_modules/microtime": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/microtime/-/microtime-3.1.1.tgz", "integrity": "sha512-to1r7o24cDsud9IhN6/8wGmMx5R2kT0w2Xwm5okbYI3d1dk6Xv0m+Z+jg2vS9pt+ocgQHTCtgs/YuyJhySzxNg==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "node-addon-api": "^5.0.0", "node-gyp-build": "^4.4.0" }, "engines": { "node": ">= 14.13.0" } }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "license": "MIT", "dependencies": { "mime-db": "1.52.0" }, "engines": { "node": ">= 0.6" } }, "node_modules/mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, "engines": { "node": "*" } }, "node_modules/minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, "license": "MIT" }, "node_modules/nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, "engines": { "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, "node_modules/nanospinner": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/nanospinner/-/nanospinner-1.2.2.tgz", "integrity": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==", "dev": true, "license": "MIT", "dependencies": { "picocolors": "^1.1.1" } }, "node_modules/napi-postinstall": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.3.tgz", "integrity": "sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w==", "dev": true, "license": "MIT", "bin": { "napi-postinstall": "lib/cli.js" }, "engines": { "node": "^12.20.0 || ^14.18.0 || >=16.0.0" }, "funding": { "url": "https://opencollective.com/napi-postinstall" } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "node_modules/nested-error-stacks": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", "dev": true, "license": "MIT" }, "node_modules/next": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz", "integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==", "dev": true, "license": "MIT", "dependencies": { "@next/env": "15.5.18", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "styled-jsx": "5.1.6" }, "bin": { "next": "dist/bin/next" }, "engines": { "node": "^18.18.0 || ^19.8.0 || >= 20.0.0" }, "optionalDependencies": { "@next/swc-darwin-arm64": "15.5.18", "@next/swc-darwin-x64": "15.5.18", "@next/swc-linux-arm64-gnu": "15.5.18", "@next/swc-linux-arm64-musl": "15.5.18", "@next/swc-linux-x64-gnu": "15.5.18", "@next/swc-linux-x64-musl": "15.5.18", "@next/swc-win32-arm64-msvc": "15.5.18", "@next/swc-win32-x64-msvc": "15.5.18", "sharp": "^0.34.3" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", "@playwright/test": "^1.51.1", "babel-plugin-react-compiler": "*", "react": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "react-dom": "^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0", "sass": "^1.3.0" }, "peerDependenciesMeta": { "@opentelemetry/api": { "optional": true }, "@playwright/test": { "optional": true }, "babel-plugin-react-compiler": { "optional": true }, "sass": { "optional": true } } }, "node_modules/next-sitemap": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/next-sitemap/-/next-sitemap-4.2.3.tgz", "integrity": "sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==", "dev": true, "funding": [ { "url": "https://github.com/iamvishnusankar/next-sitemap.git" } ], "dependencies": { "@corex/deepmerge": "^4.0.43", "@next/env": "^13.4.3", "fast-glob": "^3.2.12", "minimist": "^1.2.8" }, "bin": { "next-sitemap": "bin/next-sitemap.mjs", "next-sitemap-cjs": "bin/next-sitemap.cjs" }, "engines": { "node": ">=14.18" }, "peerDependencies": { "next": "*" } }, "node_modules/next-sitemap/node_modules/@next/env": { "version": "13.5.8", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.8.tgz", "integrity": "sha512-YmiG58BqyZ2FjrF2+5uZExL2BrLr8RTQzLXNDJ8pJr0O+rPlOeDPXp1p1/4OrR3avDidzZo3D8QO2cuDv1KCkw==", "dev": true, "license": "MIT" }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node_modules/node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", "dev": true, "license": "MIT" }, "node_modules/node-gyp-build": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "dev": true, "license": "MIT", "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", "node-gyp-build-test": "build-test.js" } }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node_modules/node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true, "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "dependencies": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" } }, "node_modules/normalize-package-data/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", "cross-spawn": "^6.0.5", "memorystream": "^0.3.1", "minimatch": "^3.0.4", "pidtree": "^0.3.0", "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" }, "bin": { "npm-run-all": "bin/npm-run-all/index.js", "run-p": "bin/run-p/index.js", "run-s": "bin/run-s/index.js" }, "engines": { "node": ">= 4" } }, "node_modules/npm-run-all/node_modules/ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { "color-convert": "^1.9.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { "color-name": "1.1.3" } }, "node_modules/npm-run-all/node_modules/color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true, "license": "MIT" }, "node_modules/npm-run-all/node_modules/cross-spawn": { "version": "6.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "engines": { "node": ">=4.8" } }, "node_modules/npm-run-all/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.8.0" } }, "node_modules/npm-run-all/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "license": "ISC", "bin": { "semver": "bin/semver" } }, "node_modules/npm-run-all/node_modules/shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "license": "MIT", "dependencies": { "shebang-regex": "^1.0.0" }, "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-all/node_modules/shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/npm-run-all/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { "has-flag": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/npm-run-all/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "which": "bin/which" } }, "node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "license": "MIT", "dependencies": { "path-key": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true, "engines": { "node": ">= 0.4" } }, "node_modules/object.assign": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.entries": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object.groupby": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/object.values": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "license": "MIT", "dependencies": { "mimic-fn": "^2.1.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, "license": "MIT", "dependencies": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" }, "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "license": "MIT", "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "license": "MIT", "dependencies": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/p-event": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", "dev": true, "license": "MIT", "dependencies": { "p-timeout": "^5.0.2" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, "license": "MIT", "dependencies": { "p-map": "^5.1.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-filter/node_modules/p-map": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "license": "MIT", "dependencies": { "aggregate-error": "^4.0.0" }, "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^3.0.2" }, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-map": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-6.0.0.tgz", "integrity": "sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==", "dev": true, "license": "MIT", "engines": { "node": ">=16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-timeout": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" }, "engines": { "node": ">=6" } }, "node_modules/parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/parse-entities/node_modules/@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "dev": true, "license": "MIT" }, "node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "license": "MIT", "dependencies": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" }, "engines": { "node": ">=4" } }, "node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "dependencies": { "entities": "^4.4.0" }, "funding": { "url": "https://github.com/inikulin/parse5?sponsor=1" } }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true, "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true, "bin": { "pidtree": "bin/pidtree.js" }, "engines": { "node": ">=0.10" } }, "node_modules/pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" } }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "license": "MIT", "dependencies": { "find-up": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, "engines": { "node": ">=8" } }, "node_modules/pkg-dir/node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "license": "MIT", "dependencies": { "p-try": "^2.0.0" }, "engines": { "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/pkg-dir/node_modules/p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, "engines": { "node": ">=8" } }, "node_modules/platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" } }, "node_modules/postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/postcss/" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/postcss" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "dependencies": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.8.0" } }, "node_modules/prettier": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz", "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==", "dev": true, "license": "MIT", "bin": { "prettier": "bin/prettier.cjs" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/prettier/prettier?sponsor=1" } }, "node_modules/pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "license": "MIT", "dependencies": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/pretty-format/node_modules/ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/pretty-format/node_modules/react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, "license": "MIT" }, "node_modules/prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "license": "MIT", "dependencies": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" }, "engines": { "node": ">= 6" } }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "node_modules/property-information": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true, "funding": [ { "type": "individual", "url": "https://github.com/sponsors/dubzzz" }, { "type": "opencollective", "url": "https://opencollective.com/fast-check" } ], "license": "MIT" }, "node_modules/querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, "node_modules/queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/random-seed": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/random-seed/-/random-seed-0.3.0.tgz", "integrity": "sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==", "dev": true, "license": "MIT", "dependencies": { "json-stringify-safe": "^5.0.1" }, "engines": { "node": ">= 0.6.0" } }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } }, "node_modules/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/react-dom": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "dev": true, "license": "MIT", "dependencies": { "scheduler": "^0.26.0" }, "peerDependencies": { "react": "^19.1.0" } }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true, "license": "MIT" }, "node_modules/read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "license": "MIT", "dependencies": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/read-pkg/node_modules/path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "dependencies": { "pify": "^3.0.0" }, "engines": { "node": ">=4" } }, "node_modules/readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true, "license": "MIT", "engines": { "node": ">= 14.18.0" }, "funding": { "type": "individual", "url": "https://paulmillr.com/funding/" } }, "node_modules/recma-build-jsx": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/recma-jsx": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", "dev": true, "license": "MIT", "dependencies": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/recma-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/recma-stringify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "node_modules/regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "dependencies": { "regenerate": "^1.4.0" }, "engines": { "node": ">=4" } }, "node_modules/regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "node_modules/regjsparser": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dev": true, "dependencies": { "jsesc": "~0.5.0" }, "bin": { "regjsparser": "bin/parser" } }, "node_modules/regjsparser/node_modules/jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true, "bin": { "jsesc": "bin/jsesc" } }, "node_modules/rehype-recma": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-mdx": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", "dev": true, "license": "MIT", "dependencies": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dev": true, "license": "MIT", "dependencies": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/remark-rehype": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "dev": true, "license": "MIT", "dependencies": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "license": "MIT", "dependencies": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, "bin": { "resolve": "bin/resolve" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "license": "MIT", "dependencies": { "resolve-from": "^5.0.0" }, "engines": { "node": ">=8" } }, "node_modules/resolve-cwd/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true, "license": "MIT", "funding": { "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, "node_modules/resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true, "license": "MIT", "engines": { "node": ">=10" } }, "node_modules/reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" } }, "node_modules/rollup": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "license": "MIT", "dependencies": { "@types/estree": "1.0.8" }, "bin": { "rollup": "dist/bin/rollup" }, "engines": { "node": ">=18.0.0", "npm": ">=8.0.0" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "fsevents": "~2.3.2" } }, "node_modules/run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ], "dependencies": { "queue-microtask": "^1.2.2" } }, "node_modules/safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "engines": { "node": ">=0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-array-concat/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true, "funding": [ { "type": "github", "url": "https://github.com/sponsors/feross" }, { "type": "patreon", "url": "https://www.patreon.com/feross" }, { "type": "consulting", "url": "https://feross.org/support" } ] }, "node_modules/safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "isarray": "^2.0.5" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safe-push-apply/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "node_modules/saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, "dependencies": { "xmlchars": "^2.2.0" }, "engines": { "node": ">=v12.22.7" } }, "node_modules/scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true, "license": "MIT" }, "node_modules/search-insights": { "version": "2.17.3", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "dev": true, "license": "MIT", "peer": true }, "node_modules/secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" } }, "node_modules/serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-function-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "license": "MIT", "dependencies": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" } }, "node_modules/set-proto": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/sharp": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", "optional": true, "dependencies": { "@img/colour": "^1.0.0", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "engines": { "node": "^18.17.0 || ^20.3.0 || >=21.0.0" }, "funding": { "url": "https://opencollective.com/libvips" }, "optionalDependencies": { "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5" } }, "node_modules/sharp/node_modules/semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "license": "ISC", "optional": true, "bin": { "semver": "bin/semver.js" }, "engines": { "node": ">=10" } }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, "engines": { "node": ">=8" } }, "node_modules/shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/shell-quote": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel-list": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel-map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/side-channel-weakmap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true, "license": "MIT" }, "node_modules/size-limit": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-11.2.0.tgz", "integrity": "sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==", "dev": true, "license": "MIT", "dependencies": { "bytes-iec": "^3.1.1", "chokidar": "^4.0.3", "jiti": "^2.4.2", "lilconfig": "^3.1.3", "nanospinner": "^1.2.2", "picocolors": "^1.1.1", "tinyglobby": "^0.2.11" }, "bin": { "size-limit": "bin.js" }, "engines": { "node": "^18.0.0 || >=20.0.0" } }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/smob": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", "dev": true }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, "node_modules/source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "node_modules/space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "node_modules/spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "node_modules/spdx-license-ids": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", "dev": true }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", "dev": true, "license": "MIT" }, "node_modules/stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0" }, "engines": { "node": ">=10" } }, "node_modules/stack-utils/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "license": "MIT", "dependencies": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" }, "engines": { "node": ">=10" } }, "node_modules/string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.padend": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.repeat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "license": "MIT", "dependencies": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "node_modules/string.prototype.trim": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimend": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, "license": "MIT", "dependencies": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" }, "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, "engines": { "node": ">=8" } }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true, "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true, "license": "MIT", "engines": { "node": ">=8" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/style-mod": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", "dev": true, "license": "MIT" }, "node_modules/style-to-js": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", "dev": true, "license": "MIT", "dependencies": { "style-to-object": "1.0.8" } }, "node_modules/style-to-object": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dev": true, "license": "MIT", "dependencies": { "inline-style-parser": "0.2.4" } }, "node_modules/styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", "dev": true, "license": "MIT", "dependencies": { "client-only": "0.0.1" }, "engines": { "node": ">= 12.0.0" }, "peerDependencies": { "react": ">= 16.8.0 || 17.x.x || ^18.0.0-0 || ^19.0.0-0" }, "peerDependenciesMeta": { "@babel/core": { "optional": true }, "babel-plugin-macros": { "optional": true } } }, "node_modules/subsume": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/subsume/-/subsume-3.0.0.tgz", "integrity": "sha512-6n/UfV8UWKwJNO8OAOiKntwEMihuBeeoJfzpL542C+OuvT4iWG9SwjrXkOmsxjb4SteHUsos9SvrdqZ9+ICwTQ==", "dev": true, "dependencies": { "escape-string-regexp": "^2.0.0", "unique-string": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/subsume/node_modules/escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true, "engines": { "node": ">=8" } }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "dependencies": { "has-flag": "^4.0.0" }, "engines": { "node": ">=8" } }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/swr": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.4.tgz", "integrity": "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==", "dev": true, "license": "MIT", "dependencies": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" }, "peerDependencies": { "react": "^16.11.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "node_modules/terser": { "version": "5.19.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "bin": { "terser": "bin/terser" }, "engines": { "node": ">=10" } }, "node_modules/terser/node_modules/acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "dependencies": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" }, "engines": { "node": ">=8" } }, "node_modules/throttleit": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", "dev": true, "license": "MIT", "engines": { "node": ">=18" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" }, "funding": { "url": "https://github.com/sponsors/SuperchupuDev" } }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { "node": ">=12.0.0" }, "peerDependencies": { "picomatch": "^3 || ^4" }, "peerDependenciesMeta": { "picomatch": { "optional": true } } }, "node_modules/tinyglobby/node_modules/picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/jonschlinkert" } }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "dependencies": { "is-number": "^7.0.0" }, "engines": { "node": ">=8.0" } }, "node_modules/tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "dependencies": { "punycode": "^2.1.1" }, "engines": { "node": ">=12" } }, "node_modules/transducers-js": { "version": "0.4.174", "resolved": "https://registry.npmjs.org/transducers-js/-/transducers-js-0.4.174.tgz", "integrity": "sha1-1YYsEO/0vj0zIqv2u3QuMPG7b8Q=", "dev": true, "engines": { "node": ">= 0.10.0" } }, "node_modules/trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/trough": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } }, "node_modules/ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "license": "MIT", "engines": { "node": ">=18.12" }, "peerDependencies": { "typescript": ">=4.8.4" } }, "node_modules/ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "bin": { "ts-node": "dist/bin.js", "ts-node-cwd": "dist/bin-cwd.js", "ts-node-esm": "dist/bin-esm.js", "ts-node-script": "dist/bin-script.js", "ts-node-transpile-only": "dist/bin-transpile.js", "ts-script": "dist/bin-script-deprecated.js" }, "peerDependencies": { "@swc/core": ">=1.2.50", "@swc/wasm": ">=1.2.50", "@types/node": "*", "typescript": ">=2.7" }, "peerDependenciesMeta": { "@swc/core": { "optional": true }, "@swc/wasm": { "optional": true } } }, "node_modules/ts-node/node_modules/acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true, "license": "MIT", "bin": { "acorn": "bin/acorn" }, "engines": { "node": ">=0.4.0" } }, "node_modules/tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "license": "MIT", "dependencies": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } }, "node_modules/tsconfig-paths/node_modules/json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "license": "MIT", "dependencies": { "minimist": "^1.2.0" }, "bin": { "json5": "lib/cli.js" } }, "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "license": "MIT", "engines": { "node": ">=4" } }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true, "license": "0BSD" }, "node_modules/tstyche": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/tstyche/-/tstyche-5.0.2.tgz", "integrity": "sha512-5XoNS1qIHr7w2QkpCx9WOJD69soaxaeqzY3DNOb+trLWjJowzKVZ9L7tSLWxXnwZQ9vKPTq4F41gUd99371aXg==", "dev": true, "license": "MIT", "bin": { "tstyche": "build/bin.js" }, "engines": { "node": ">=20.12" }, "funding": { "url": "https://github.com/tstyche/tstyche?sponsor=1" }, "peerDependencies": { "typescript": ">=5.0" }, "peerDependenciesMeta": { "typescript": { "optional": true } } }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "license": "MIT", "dependencies": { "prelude-ls": "^1.2.1" }, "engines": { "node": ">= 0.8.0" } }, "node_modules/type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true, "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" } }, "node_modules/typed-array-byte-length": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-byte-offset": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typescript": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true, "license": "Apache-2.0", "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { "node": ">=14.17" } }, "node_modules/typescript-eslint": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", "dev": true, "license": "MIT", "dependencies": { "@typescript-eslint/eslint-plugin": "8.61.1", "@typescript-eslint/parser": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/utils": "8.61.1" }, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0 || ^10.0.0", "typescript": ">=4.8.4 <6.1.0" } }, "node_modules/unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" }, "engines": { "node": ">=4" } }, "node_modules/unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "dependencies": { "crypto-random-string": "^2.0.0" }, "engines": { "node": ">=8" } }, "node_modules/unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-position-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unist-util-visit-parents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/unrs-resolver": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==", "dev": true, "hasInstallScript": true, "license": "MIT", "dependencies": { "napi-postinstall": "^0.2.2" }, "funding": { "url": "https://github.com/sponsors/JounQin" }, "optionalDependencies": { "@unrs/resolver-binding-darwin-arm64": "1.7.2", "@unrs/resolver-binding-darwin-x64": "1.7.2", "@unrs/resolver-binding-freebsd-x64": "1.7.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-musl": "1.7.2", "@unrs/resolver-binding-wasm32-wasi": "1.7.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", "@unrs/resolver-binding-win32-x64-msvc": "1.7.2" } }, "node_modules/update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { "type": "opencollective", "url": "https://opencollective.com/browserslist" }, { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" }, { "type": "github", "url": "https://github.com/sponsors/ai" } ], "license": "MIT", "dependencies": { "escalade": "^3.2.0", "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" }, "peerDependencies": { "browserslist": ">= 4.21.0" } }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "license": "BSD-2-Clause", "dependencies": { "punycode": "^2.1.0" } }, "node_modules/url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "dependencies": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "node_modules/use-sync-external-store": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "dev": true, "license": "MIT", "peerDependencies": { "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" } }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true, "license": "MIT" }, "node_modules/v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "license": "ISC", "dependencies": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "node_modules/vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/vfile-message": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dev": true, "license": "MIT", "dependencies": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/unified" } }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "dev": true, "license": "MIT" }, "node_modules/w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, "dependencies": { "xml-name-validator": "^4.0.0" }, "engines": { "node": ">=14" } }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "dependencies": { "makeerror": "1.0.12" } }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "dependencies": { "iconv-lite": "0.6.3" }, "engines": { "node": ">=12" } }, "node_modules/whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/whatwg-url": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, "dependencies": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" }, "engines": { "node": ">=12" } }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "bin/node-which" }, "engines": { "node": ">= 8" } }, "node_modules/which-boxed-primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "license": "MIT", "dependencies": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-builtin-type/node_modules/isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true, "license": "MIT" }, "node_modules/which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "license": "MIT", "dependencies": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/which-typed-array": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, "license": "MIT", "dependencies": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" }, "engines": { "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" } }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "node_modules/write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" }, "engines": { "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, "node_modules/ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, "license": "MIT", "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { "optional": true }, "utf-8-validate": { "optional": true } } }, "node_modules/xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true, "engines": { "node": ">=12" } }, "node_modules/xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true, "license": "ISC", "engines": { "node": ">=10" } }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "license": "MIT", "dependencies": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "engines": { "node": ">=12" } }, "node_modules/yargs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true, "license": "MIT" }, "node_modules/yargs/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8" } }, "node_modules/yargs/node_modules/yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "license": "ISC", "engines": { "node": ">=12" } }, "node_modules/yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true, "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true, "engines": { "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "license": "MIT", "peer": true, "funding": { "url": "https://github.com/sponsors/colinhacks" } }, "node_modules/zod-to-json-schema": { "version": "3.24.6", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "license": "ISC", "peerDependencies": { "zod": "^3.24.1" } }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true, "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" } } }, "dependencies": { "@ai-sdk/provider": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@ai-sdk/provider/-/provider-1.1.3.tgz", "integrity": "sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==", "dev": true, "requires": { "json-schema": "^0.4.0" } }, "@ai-sdk/provider-utils": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/@ai-sdk/provider-utils/-/provider-utils-2.2.8.tgz", "integrity": "sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==", "dev": true, "requires": { "@ai-sdk/provider": "1.1.3", "nanoid": "^3.3.8", "secure-json-parse": "^2.7.0" } }, "@ai-sdk/react": { "version": "1.2.12", "resolved": "https://registry.npmjs.org/@ai-sdk/react/-/react-1.2.12.tgz", "integrity": "sha512-jK1IZZ22evPZoQW3vlkZ7wvjYGYF+tRBKXtrcolduIkQ/m/sOAVcVeVDUDvh1T91xCnWCdUGCPZg2avZ90mv3g==", "dev": true, "requires": { "@ai-sdk/provider-utils": "2.2.8", "@ai-sdk/ui-utils": "1.2.11", "swr": "^2.2.5", "throttleit": "2.1.0" } }, "@ai-sdk/ui-utils": { "version": "1.2.11", "resolved": "https://registry.npmjs.org/@ai-sdk/ui-utils/-/ui-utils-1.2.11.tgz", "integrity": "sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==", "dev": true, "requires": { "@ai-sdk/provider": "1.1.3", "@ai-sdk/provider-utils": "2.2.8", "zod-to-json-schema": "^3.24.1" } }, "@algolia/abtesting": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@algolia/abtesting/-/abtesting-1.1.0.tgz", "integrity": "sha512-sEyWjw28a/9iluA37KLGu8vjxEIlb60uxznfTUmXImy7H5NvbpSO6yYgmgH5KiD7j+zTUUihiST0jEP12IoXow==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/autocomplete-core": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz", "integrity": "sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw==", "dev": true, "requires": { "@algolia/autocomplete-plugin-algolia-insights": "1.19.2", "@algolia/autocomplete-shared": "1.19.2" } }, "@algolia/autocomplete-plugin-algolia-insights": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz", "integrity": "sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg==", "dev": true, "requires": { "@algolia/autocomplete-shared": "1.19.2" } }, "@algolia/autocomplete-shared": { "version": "1.19.2", "resolved": "https://registry.npmjs.org/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz", "integrity": "sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w==", "dev": true, "requires": {} }, "@algolia/client-abtesting": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-abtesting/-/client-abtesting-5.35.0.tgz", "integrity": "sha512-uUdHxbfHdoppDVflCHMxRlj49/IllPwwQ2cQ8DLC4LXr3kY96AHBpW0dMyi6ygkn2MtFCc6BxXCzr668ZRhLBQ==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/client-analytics": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-analytics/-/client-analytics-5.35.0.tgz", "integrity": "sha512-SunAgwa9CamLcRCPnPHx1V2uxdQwJGqb1crYrRWktWUdld0+B2KyakNEeVn5lln4VyeNtW17Ia7V7qBWyM/Skw==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/client-common": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-common/-/client-common-5.35.0.tgz", "integrity": "sha512-ipE0IuvHu/bg7TjT2s+187kz/E3h5ssfTtjpg1LbWMgxlgiaZIgTTbyynM7NfpSJSKsgQvCQxWjGUO51WSCu7w==", "dev": true }, "@algolia/client-insights": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-insights/-/client-insights-5.35.0.tgz", "integrity": "sha512-UNbCXcBpqtzUucxExwTSfAe8gknAJ485NfPN6o1ziHm6nnxx97piIbcBQ3edw823Tej2Wxu1C0xBY06KgeZ7gA==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/client-personalization": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-personalization/-/client-personalization-5.35.0.tgz", "integrity": "sha512-/KWjttZ6UCStt4QnWoDAJ12cKlQ+fkpMtyPmBgSS2WThJQdSV/4UWcqCUqGH7YLbwlj3JjNirCu3Y7uRTClxvA==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/client-query-suggestions": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-query-suggestions/-/client-query-suggestions-5.35.0.tgz", "integrity": "sha512-8oCuJCFf/71IYyvQQC+iu4kgViTODbXDk3m7yMctEncRSRV+u2RtDVlpGGfPlJQOrAY7OONwJlSHkmbbm2Kp/w==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/client-search": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/client-search/-/client-search-5.35.0.tgz", "integrity": "sha512-FfmdHTrXhIduWyyuko1YTcGLuicVbhUyRjO3HbXE4aP655yKZgdTIfMhZ/V5VY9bHuxv/fGEh3Od1Lvv2ODNTg==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/ingestion": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/@algolia/ingestion/-/ingestion-1.35.0.tgz", "integrity": "sha512-gPzACem9IL1Co8mM1LKMhzn1aSJmp+Vp434An4C0OBY4uEJRcqsLN3uLBlY+bYvFg8C8ImwM9YRiKczJXRk0XA==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/monitoring": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/@algolia/monitoring/-/monitoring-1.35.0.tgz", "integrity": "sha512-w9MGFLB6ashI8BGcQoVt7iLgDIJNCn4OIu0Q0giE3M2ItNrssvb8C0xuwJQyTy1OFZnemG0EB1OvXhIHOvQwWw==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/recommend": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/recommend/-/recommend-5.35.0.tgz", "integrity": "sha512-AhrVgaaXAb8Ue0u2nuRWwugt0dL5UmRgS9LXe0Hhz493a8KFeZVUE56RGIV3hAa6tHzmAV7eIoqcWTQvxzlJeQ==", "dev": true, "requires": { "@algolia/client-common": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "@algolia/requester-browser-xhr": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/requester-browser-xhr/-/requester-browser-xhr-5.35.0.tgz", "integrity": "sha512-diY415KLJZ6x1Kbwl9u96Jsz0OstE3asjXtJ9pmk1d+5gPuQ5jQyEsgC+WmEXzlec3iuVszm8AzNYYaqw6B+Zw==", "dev": true, "requires": { "@algolia/client-common": "5.35.0" } }, "@algolia/requester-fetch": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/requester-fetch/-/requester-fetch-5.35.0.tgz", "integrity": "sha512-uydqnSmpAjrgo8bqhE9N1wgcB98psTRRQXcjc4izwMB7yRl9C8uuAQ/5YqRj04U0mMQ+fdu2fcNF6m9+Z1BzDQ==", "dev": true, "requires": { "@algolia/client-common": "5.35.0" } }, "@algolia/requester-node-http": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/@algolia/requester-node-http/-/requester-node-http-5.35.0.tgz", "integrity": "sha512-RgLX78ojYOrThJHrIiPzT4HW3yfQa0D7K+MQ81rhxqaNyNBu4F1r+72LNHYH/Z+y9I1Mrjrd/c/Ue5zfDgAEjQ==", "dev": true, "requires": { "@algolia/client-common": "5.35.0" } }, "@ampproject/remapping": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@babel/code-frame": { "version": "7.26.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "requires": { "@babel/helper-validator-identifier": "^7.25.9", "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "@babel/compat-data": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz", "integrity": "sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ==", "dev": true }, "@babel/core": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.8.tgz", "integrity": "sha512-l+lkXCHS6tQEc5oUpK28xBOZ6+HwaH7YwoYQbLFiYb4nS2/l1tKnZEtEWkD0GuiYdvArf9qBS0XlQGXzPMsNqQ==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.8", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.7", "@babel/parser": "^7.26.8", "@babel/template": "^7.26.8", "@babel/traverse": "^7.26.8", "@babel/types": "^7.26.8", "@types/gensync": "^1.0.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "@babel/generator": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", "dev": true, "requires": { "@babel/parser": "^7.26.8", "@babel/types": "^7.26.8", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" } }, "@babel/helper-compilation-targets": { "version": "7.26.5", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "requires": { "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "dependencies": { "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "requires": { "yallist": "^3.0.2" } }, "yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true } } }, "@babel/helper-module-imports": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "requires": { "@babel/traverse": "^7.25.9", "@babel/types": "^7.25.9" } }, "@babel/helper-module-transforms": { "version": "7.26.0", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "requires": { "@babel/helper-module-imports": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9", "@babel/traverse": "^7.25.9" } }, "@babel/helper-plugin-utils": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true }, "@babel/helper-string-parser": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true }, "@babel/helper-validator-identifier": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true }, "@babel/helper-validator-option": { "version": "7.25.9", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true }, "@babel/helpers": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.10.tgz", "integrity": "sha512-UPYc3SauzZ3JGgj87GgZ89JVdC5dj0AoetR5Bw6wj4niittNyFh6+eOGonYvJ1ao6B8lEa3Q3klS7ADZ53bc5g==", "dev": true, "requires": { "@babel/template": "^7.26.9", "@babel/types": "^7.26.10" } }, "@babel/parser": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.10.tgz", "integrity": "sha512-6aQR2zGE/QFi8JpDLjUZEPYOs7+mhKXm86VaKFiLP35JQwQb6bwUE+XbvkH0EptsYhbNBSUGaUBLKqxH1xSgsA==", "dev": true, "requires": { "@babel/types": "^7.26.10" } }, "@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-bigint": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-class-properties": { "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } }, "@babel/plugin-syntax-import-meta": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-jsx": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/plugin-syntax-logical-assignment-operators": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-nullish-coalescing-operator": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-numeric-separator": { "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-object-rest-spread": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-catch-binding": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-optional-chaining": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } }, "@babel/plugin-syntax-top-level-await": { "version": "7.14.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } }, "@babel/plugin-syntax-typescript": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.22.5" } }, "@babel/template": { "version": "7.26.9", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz", "integrity": "sha512-qyRplbeIpNZhmzOysF/wFMuP9sctmh2cFzRAZOn1YapxBsE1i9bJIY586R/WBLfLcmcBlM8ROBiQURnnNy+zfA==", "dev": true, "requires": { "@babel/code-frame": "^7.26.2", "@babel/parser": "^7.26.9", "@babel/types": "^7.26.9" } }, "@babel/traverse": { "version": "7.26.8", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", "dev": true, "requires": { "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.8", "@babel/parser": "^7.26.8", "@babel/template": "^7.26.8", "@babel/types": "^7.26.8", "debug": "^4.3.1", "globals": "^11.1.0" }, "dependencies": { "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true } } }, "@babel/types": { "version": "7.26.10", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.10.tgz", "integrity": "sha512-emqcG3vHrpxUKTrxcblR36dcrcoRDvKmnL/dCL6ZsHaShW80qxCAcNhzQZrpeM765VzEos+xOi4s+r4IXzTwdQ==", "dev": true, "requires": { "@babel/helper-string-parser": "^7.25.9", "@babel/helper-validator-identifier": "^7.25.9" } }, "@bcoe/v8-coverage": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, "@codemirror/autocomplete": { "version": "6.18.6", "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.18.6.tgz", "integrity": "sha512-PHHBXFomUs5DF+9tCOM/UoW6XQ4R44lLNNhRaW9PKPTU0D7lIjRg3ElxaJnTwsl/oHiR93WSXDBrekhoUGCPtg==", "dev": true, "requires": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0" } }, "@codemirror/commands": { "version": "6.10.0", "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.10.0.tgz", "integrity": "sha512-2xUIc5mHXQzT16JnyOFkh8PvfeXuIut3pslWGfsGOhxP/lpgRm9HOl/mpzLErgt5mXDovqA0d11P21gofRLb9w==", "dev": true, "requires": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.4.0", "@codemirror/view": "^6.27.0", "@lezer/common": "^1.1.0" } }, "@codemirror/lang-javascript": { "version": "6.2.3", "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.3.tgz", "integrity": "sha512-8PR3vIWg7pSu7ur8A07pGiYHgy3hHj+mRYRCSG8q+mPIrl0F02rgpGv+DsQTHRTc30rydOsf5PZ7yjKFg2Ackw==", "dev": true, "requires": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/language": "^6.6.0", "@codemirror/lint": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.17.0", "@lezer/common": "^1.0.0", "@lezer/javascript": "^1.0.0" } }, "@codemirror/language": { "version": "6.11.0", "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.11.0.tgz", "integrity": "sha512-A7+f++LodNNc1wGgoRDTt78cOwWm9KVezApgjOMp1W4hM0898nsqBXwF+sbePE7ZRcjN7Sa1Z5m2oN27XkmEjQ==", "dev": true, "requires": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.23.0", "@lezer/common": "^1.1.0", "@lezer/highlight": "^1.0.0", "@lezer/lr": "^1.0.0", "style-mod": "^4.0.0" } }, "@codemirror/lint": { "version": "6.8.5", "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.8.5.tgz", "integrity": "sha512-s3n3KisH7dx3vsoeGMxsbRAgKe4O1vbrnKBClm99PU0fWxmxsx5rR2PfqQgIt+2MMJBHbiJ5rfIdLYfB9NNvsA==", "dev": true, "requires": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.35.0", "crelt": "^1.0.5" } }, "@codemirror/search": { "version": "6.5.10", "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.10.tgz", "integrity": "sha512-RMdPdmsrUf53pb2VwflKGHEe1XVM07hI7vV2ntgw1dmqhimpatSJKva4VA9h4TLUDOD4EIF02201oZurpnEFsg==", "dev": true, "requires": { "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "crelt": "^1.0.5" } }, "@codemirror/state": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.5.2.tgz", "integrity": "sha512-FVqsPqtPWKVVL3dPSxy8wEF/ymIEuVzF1PK3VbUgrxXpJUSHQWWZz4JMToquRxnkw+36LTamCZG2iua2Ptq0fA==", "dev": true, "requires": { "@marijn/find-cluster-break": "^1.0.0" } }, "@codemirror/theme-one-dark": { "version": "6.1.3", "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.3.tgz", "integrity": "sha512-NzBdIvEJmx6fjeremiGp3t/okrLPYT0d9orIc7AFun8oZcRk58aejkqhv6spnz4MLAevrKNPMQYXEWMg4s+sKA==", "dev": true, "requires": { "@codemirror/language": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0", "@lezer/highlight": "^1.0.0" } }, "@codemirror/view": { "version": "6.36.5", "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.36.5.tgz", "integrity": "sha512-cd+FZEUlu3GQCYnguYm3EkhJ8KJVisqqUsCOKedBoAt/d9c76JUUap6U0UrpElln5k6VyrEOYliMuDAKIeDQLg==", "dev": true, "requires": { "@codemirror/state": "^6.5.0", "style-mod": "^4.1.0", "w3c-keyname": "^2.2.4" } }, "@corex/deepmerge": { "version": "4.0.43", "resolved": "https://registry.npmjs.org/@corex/deepmerge/-/deepmerge-4.0.43.tgz", "integrity": "sha512-N8uEMrMPL0cu/bdboEWpQYb/0i2K5Qn8eCsxzOmxSggJbbQte7ljMRoXm917AbntqTGOzdTu+vP3KOOzoC70HQ==", "dev": true }, "@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", "dev": true, "requires": { "@jridgewell/trace-mapping": "0.3.9" }, "dependencies": { "@jridgewell/trace-mapping": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" } } } }, "@docsearch/css": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/@docsearch/css/-/css-4.0.0-beta.5.tgz", "integrity": "sha512-bZy+gIXRZch0KNPC7MLoj4wkEcNVeEHBXOKJtonoJ2EaLw2vbO1PLGIXxtPgW7Ab7TvI0StkrmGuEQqE2q/1QA==", "dev": true }, "@docsearch/react": { "version": "4.0.0-beta.5", "resolved": "https://registry.npmjs.org/@docsearch/react/-/react-4.0.0-beta.5.tgz", "integrity": "sha512-OomfOZASe0mUCm0FjOijxjokYDPa/KUOs44gwh6z0qTQxqpLhHMxyDcJHmdfMzmpMba5juu8hC1mUtpDbFAnNg==", "dev": true, "requires": { "@ai-sdk/react": "^1.2.12", "@algolia/autocomplete-core": "1.19.2", "@docsearch/css": "4.0.0-beta.5", "algoliasearch": "^5.28.0", "marked": "^15.0.12" }, "dependencies": { "marked": { "version": "15.0.12", "resolved": "https://registry.npmjs.org/marked/-/marked-15.0.12.tgz", "integrity": "sha512-8dD6FusOQSrpv9Z1rdNMdlSgQOIP880DHqnohobOmYLElGEqAL/JvxvuxZO16r4HtjTlfPRDC1hbvxC9dPN2nA==", "dev": true } } }, "@emnapi/core": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz", "integrity": "sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==", "dev": true, "optional": true, "requires": { "@emnapi/wasi-threads": "1.0.2", "tslib": "^2.4.0" } }, "@emnapi/runtime": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.7.1.tgz", "integrity": "sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==", "dev": true, "optional": true, "requires": { "tslib": "^2.4.0" } }, "@emnapi/wasi-threads": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.2.tgz", "integrity": "sha512-5n3nTJblwRi8LlXkJ9eBzu+kZR8Yxcc7ubakyQTFzPMtIhFpUBRbsnc2Dv88IZDIbCDlBiWrknhB4Lsz7mg6BA==", "dev": true, "optional": true, "requires": { "tslib": "^2.4.0" } }, "@esbuild/aix-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.28.1.tgz", "integrity": "sha512-Svl7tq8k/08+p6CXPpRjQ1fKX+1odH/BQbb48fV6fj3CWHhsoIOoY87w1oHXm0qEpkIK3ZfVgp0hed3XBXzXMQ==", "dev": true, "optional": true }, "@esbuild/android-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.28.1.tgz", "integrity": "sha512-0k2F129Xdio1TdJfzJ8sy1Q47vUD2NnwdhiAf7drUN1EBTfPf4hsFCtmMgu/6m8JSzsBrlmVjudMBQqOfG8usQ==", "dev": true, "optional": true }, "@esbuild/android-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.28.1.tgz", "integrity": "sha512-34EGEbCIAgosYz6goLcopX6Mo7NyGv9tfwEM2/7Ce2VcVRk568iSvniGWcUXIy7wEDR1wzolcxcriFVrWYcwBg==", "dev": true, "optional": true }, "@esbuild/android-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.28.1.tgz", "integrity": "sha512-dbwY7ltSMDWsRatcRpCnES4F+im88OCUgGZjy52shC7GqHRE/cYlxNbB4Z4UpJswpcc4Qxd2oE/ufM0p61IKng==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.28.1.tgz", "integrity": "sha512-TZbWkQY7kvTAXbXUT7uVACR5cMHsDiSz9z7ZKAX/RTq/WJEk3QyRr0wZpNhBDX+/0CtdqUIJlOiodQcta6tY3Q==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.28.1.tgz", "integrity": "sha512-zfdzgK9ACBNZLI/CyHTOx81SyNbM6YXn7rxSgX97VjyiPl9W1i4Ka4fgKECEoFCKGpvBj5qArWIGgQjOwkgskQ==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.28.1.tgz", "integrity": "sha512-wG2EA8ENdEI0qhkSZMjfqrdY+ziCYCPMmtZjjIwOmXFjmyzEHn+UUxk5of+SYsjtfs3VpnlC7QLzSI5hY/rOAw==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.28.1.tgz", "integrity": "sha512-i7dZ9vQgnvSCzi/rYCXNgtF/U+eKZNJBzu3eTQbRgHnM7tNSizLOkRFAl3qzVc/Op/u5YkHHa4pf/3DOYHthLQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.28.1.tgz", "integrity": "sha512-qVXBOHQS+d5Y722GwJzJUtOLlX7km3CraOaGormF1pDtPd2C/l1SHRPgjLunLGe51Sh5YYWKMFDyV4SxgMQYTQ==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.28.1.tgz", "integrity": "sha512-yHs+0uc8+nvEAfAfxrWQKK5peSNzBc4PegcMO0EJ2hT71uA7vB8Ihg2e77R2P7SG5uYjPbHlLLmve4LLLRCf0g==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.28.1.tgz", "integrity": "sha512-d1z4ZuP0ajrfz/FhGT4vv278rX8KnPPJx8i5+AtK7TYbx9Le9F1hyzurZpkEyjkGa9dUGhQow4C1NmeGvqxN2w==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.28.1.tgz", "integrity": "sha512-M5sRjUVZrkm1OAPR3dlOYzNmN+loZKGVi1VUQGrwuqLcbR6qeAz+famMhjASeH3YVKvZz+zT1jlh/keC3Rj/lg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.28.1.tgz", "integrity": "sha512-mRObBZeHh2OxcBFPWE/FjylkRgZdYuiTR3vaTozquCGOH14iP9oN4x4Ge81CoIDYQrXmIxpFumJBu5MtZpnQJQ==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.28.1.tgz", "integrity": "sha512-slScBsMAb3GFDcdrCgLwZtPYRoH2H/youv10QiZyRjmsP48fznoveWytSgCI/R0ZcUgpc0ZhIUEx6LHts8yrfQ==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.28.1.tgz", "integrity": "sha512-kw0owk1o0GFETUJyW0jc0G4Yzs0BHZn0JDZ8JRT088vjJYX777BAs1fDGxAC+q831qOs2DTC96mNsG2opdfyyQ==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.28.1.tgz", "integrity": "sha512-/lAIjX8aYFRByhh6L5rYtPEDRqa9de/4V/juOXcta5frjvzXO4/sqEtyytse0g3zZFuWu5cDN0MkLz2qRDD2Ag==", "dev": true, "optional": true }, "@esbuild/linux-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.28.1.tgz", "integrity": "sha512-u/anNYF2mmVOEDwLtnQ1wOr3EZ9sTNGLWrsYGYwHWzGA3Si84IOkHXlbWTD1NB+9/1lcnweYKO54uhxZydNzfA==", "dev": true, "optional": true }, "@esbuild/netbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.28.1.tgz", "integrity": "sha512-oks0DYbLwWMmaakTsCb+zL4E+aHRVLom9IJZOAthMQEPiQmydXHkziYEsGYRx0uNV/IjEKGAV941JzH02pflqw==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.28.1.tgz", "integrity": "sha512-aeL6lAnN89Hz43Mlh1G8ARasbuoYvSITDEx0tHh5b7jJnHcssqgjy9Yx430GDpmCa6OyrKoS0aNRjKundRizGg==", "dev": true, "optional": true }, "@esbuild/openbsd-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.28.1.tgz", "integrity": "sha512-MEFJe5C3R8pwXdZ5Y21oo6m7ePiS0d9pWucn99O/wvyJZChoIQKrQDxKrGeW8F5+T0okTHesAmDeiHDTIq0V/Q==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.28.1.tgz", "integrity": "sha512-i/ZLIOafE0Z8cI/XANJAixoJL/uRAoS2xOA3rb0xN+KK0K177cMAsQYkzHtBrtMXAKuAc7HGgcWiZ/sRC1Nxgw==", "dev": true, "optional": true }, "@esbuild/openharmony-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.28.1.tgz", "integrity": "sha512-ge+Z7EXFNt2BO1oAMsVpiQ8EwndV9i1xXerAeTIK7AtPs3bKFXQM7nlRxDSIUIMeueR1CNXxqztLzdNeReKBJg==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.28.1.tgz", "integrity": "sha512-BEjgtECkL3vY+SaSQ6nzVfiALUeFxpawyp8Jmf5PtYhf1Ug40N1h/hxlhts+f1FvSvarEigdxS3BlSMI2PJLcQ==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.28.1.tgz", "integrity": "sha512-lCv9eK/H6ZJWbE7bh2nw54CZ9M2nupBxJcTsdk/QQnWkdSjKGuxmmH8/GWrlT1eMmZfn4dGcCjRte397WqfQXA==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.28.1.tgz", "integrity": "sha512-zvb/mB2bSCoJOpoCBgYKKpX6YM6mJBlBUVUtVj41DlZJVEB6/0CKlRYxP5wWl1C1ILiCoAU5wZZ4q1P3qeS6Eg==", "dev": true, "optional": true }, "@esbuild/win32-x64": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.28.1.tgz", "integrity": "sha512-bm4Mowrv+GXMlpWX++EcXw/iLyd1o3+bJkC2DkWXYVvgZCqD/bSj9ctZeAMC3cIxgjRVR2Dufaiu4YPxr5gW1A==", "dev": true, "optional": true }, "@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "requires": { "eslint-visitor-keys": "^3.4.3" }, "dependencies": { "eslint-visitor-keys": { "version": "3.4.3", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true } } }, "@eslint-community/regexpp": { "version": "4.12.2", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.2.tgz", "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true }, "@eslint/config-array": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.20.0.tgz", "integrity": "sha512-fxlS1kkIjx8+vy2SjuCB94q3htSNrufYTXubwiBFeaQHbH6Ipi43gFJq2zCMt6PHhImH3Xmr0NksKDvchWlpQQ==", "dev": true, "requires": { "@eslint/object-schema": "^2.1.6", "debug": "^4.3.1", "minimatch": "^3.1.2" } }, "@eslint/config-helpers": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.2.2.tgz", "integrity": "sha512-+GPzk8PlG0sPpzdU5ZvIRMPidzAnZDl/s9L+y13iodqvb8leL53bTannOrQ/Im7UkpsmFU5Ily5U60LWixnmLg==", "dev": true }, "@eslint/core": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.14.0.tgz", "integrity": "sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==", "dev": true, "requires": { "@types/json-schema": "^7.0.15" } }, "@eslint/eslintrc": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", "espree": "^10.0.1", "globals": "^14.0.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", "minimatch": "^3.1.2", "strip-json-comments": "^3.1.1" }, "dependencies": { "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, "globals": { "version": "14.0.0", "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", "dev": true }, "js-yaml": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, "requires": { "argparse": "^2.0.1" } } } }, "@eslint/js": { "version": "9.39.2", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.39.2.tgz", "integrity": "sha512-q1mjIoW1VX4IvSocvM/vbTiveKC4k9eLrajNEuSsmjymSDEbpGddtpfOoN7YGAqBK3NG+uqo8ia4PDTt8buCYA==", "dev": true }, "@eslint/object-schema": { "version": "2.1.6", "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", "dev": true }, "@eslint/plugin-kit": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.1.tgz", "integrity": "sha512-0J+zgWxHN+xXONWIyPWKFMgVuJoZuGiIFu8yxk7RJjxkzpGmyja5wRFqZIVtjDVOQpV+Rw0iOAjYPE2eQyjr0w==", "dev": true, "requires": { "@eslint/core": "^0.14.0", "levn": "^0.4.1" } }, "@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", "dev": true }, "@humanfs/node": { "version": "0.16.6", "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", "dev": true, "requires": { "@humanfs/core": "^0.19.1", "@humanwhocodes/retry": "^0.3.0" }, "dependencies": { "@humanwhocodes/retry": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", "dev": true } } }, "@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", "dev": true }, "@humanwhocodes/retry": { "version": "0.4.3", "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", "dev": true }, "@img/colour": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/@img/colour/-/colour-1.0.0.tgz", "integrity": "sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==", "dev": true, "optional": true }, "@img/sharp-darwin-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.34.5.tgz", "integrity": "sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-darwin-arm64": "1.2.4" } }, "@img/sharp-darwin-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.34.5.tgz", "integrity": "sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-darwin-x64": "1.2.4" } }, "@img/sharp-libvips-darwin-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.2.4.tgz", "integrity": "sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==", "dev": true, "optional": true }, "@img/sharp-libvips-darwin-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.2.4.tgz", "integrity": "sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==", "dev": true, "optional": true }, "@img/sharp-libvips-linux-arm": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.2.4.tgz", "integrity": "sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==", "dev": true, "optional": true }, "@img/sharp-libvips-linux-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.2.4.tgz", "integrity": "sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==", "dev": true, "optional": true }, "@img/sharp-libvips-linux-ppc64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.2.4.tgz", "integrity": "sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==", "dev": true, "optional": true }, "@img/sharp-libvips-linux-riscv64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.2.4.tgz", "integrity": "sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==", "dev": true, "optional": true }, "@img/sharp-libvips-linux-s390x": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.2.4.tgz", "integrity": "sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==", "dev": true, "optional": true }, "@img/sharp-libvips-linux-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.2.4.tgz", "integrity": "sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==", "dev": true, "optional": true }, "@img/sharp-libvips-linuxmusl-arm64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.2.4.tgz", "integrity": "sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==", "dev": true, "optional": true }, "@img/sharp-libvips-linuxmusl-x64": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.2.4.tgz", "integrity": "sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==", "dev": true, "optional": true }, "@img/sharp-linux-arm": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.34.5.tgz", "integrity": "sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linux-arm": "1.2.4" } }, "@img/sharp-linux-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.34.5.tgz", "integrity": "sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linux-arm64": "1.2.4" } }, "@img/sharp-linux-ppc64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.34.5.tgz", "integrity": "sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linux-ppc64": "1.2.4" } }, "@img/sharp-linux-riscv64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.34.5.tgz", "integrity": "sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linux-riscv64": "1.2.4" } }, "@img/sharp-linux-s390x": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.34.5.tgz", "integrity": "sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linux-s390x": "1.2.4" } }, "@img/sharp-linux-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.34.5.tgz", "integrity": "sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linux-x64": "1.2.4" } }, "@img/sharp-linuxmusl-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.34.5.tgz", "integrity": "sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linuxmusl-arm64": "1.2.4" } }, "@img/sharp-linuxmusl-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.34.5.tgz", "integrity": "sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==", "dev": true, "optional": true, "requires": { "@img/sharp-libvips-linuxmusl-x64": "1.2.4" } }, "@img/sharp-wasm32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.34.5.tgz", "integrity": "sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==", "dev": true, "optional": true, "requires": { "@emnapi/runtime": "^1.7.0" } }, "@img/sharp-win32-arm64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.34.5.tgz", "integrity": "sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==", "dev": true, "optional": true }, "@img/sharp-win32-ia32": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.34.5.tgz", "integrity": "sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==", "dev": true, "optional": true }, "@img/sharp-win32-x64": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.34.5.tgz", "integrity": "sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==", "dev": true, "optional": true }, "@immutable/devtools": { "version": "2.1.7", "resolved": "https://registry.npmjs.org/@immutable/devtools/-/devtools-2.1.7.tgz", "integrity": "sha512-Wyrl89smqtRNyx/7WHe2+VGSY1/KUVvQbs7X8tFQvksb+J0AHpZeZZaBLvU2MKxpfDyKZUVst9nhHoH0UeXVDw==", "dev": true }, "@istanbuljs/load-nyc-config": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", "dev": true, "requires": { "camelcase": "^5.3.1", "find-up": "^4.1.0", "get-package-type": "^0.1.0", "js-yaml": "^3.13.1", "resolve-from": "^5.0.0" }, "dependencies": { "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, "@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", "dev": true }, "@jest/console": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz", "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0" } }, "@jest/core": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz", "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==", "dev": true, "requires": { "@jest/console": "^29.7.0", "@jest/reporters": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "ci-info": "^3.2.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-changed-files": "^29.7.0", "jest-config": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-resolve-dependencies": "^29.7.0", "jest-runner": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "jest-watcher": "^29.7.0", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz", "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==", "dev": true, "requires": { "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0" } }, "@jest/expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz", "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==", "dev": true, "requires": { "expect": "^29.7.0", "jest-snapshot": "^29.7.0" } }, "@jest/expect-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz", "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==", "dev": true, "requires": { "jest-get-type": "^29.6.3" } }, "@jest/fake-timers": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz", "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@sinonjs/fake-timers": "^10.0.2", "@types/node": "*", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "@jest/globals": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz", "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/types": "^29.6.3", "jest-mock": "^29.7.0" } }, "@jest/reporters": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz", "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", "@jest/console": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "@types/node": "*", "chalk": "^4.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "istanbul-lib-coverage": "^3.0.0", "istanbul-lib-instrument": "^6.0.0", "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.1.3", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "slash": "^3.0.0", "string-length": "^4.0.1", "strip-ansi": "^6.0.0", "v8-to-istanbul": "^9.0.1" }, "dependencies": { "istanbul-lib-instrument": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", "dev": true, "requires": { "@babel/core": "^7.23.9", "@babel/parser": "^7.23.9", "@istanbuljs/schema": "^0.1.3", "istanbul-lib-coverage": "^3.2.0", "semver": "^7.5.4" } }, "semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true } } }, "@jest/schemas": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "requires": { "@sinclair/typebox": "^0.27.8" } }, "@jest/source-map": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz", "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.18", "callsites": "^3.0.0", "graceful-fs": "^4.2.9" } }, "@jest/test-result": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz", "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==", "dev": true, "requires": { "@jest/console": "^29.7.0", "@jest/types": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz", "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==", "dev": true, "requires": { "@jest/test-result": "^29.7.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "slash": "^3.0.0" } }, "@jest/transform": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz", "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/types": "^29.6.3", "@jridgewell/trace-mapping": "^0.3.18", "babel-plugin-istanbul": "^6.1.1", "chalk": "^4.0.0", "convert-source-map": "^2.0.0", "fast-json-stable-stringify": "^2.1.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "micromatch": "^4.0.4", "pirates": "^4.0.4", "slash": "^3.0.0", "write-file-atomic": "^4.0.2" } }, "@jest/types": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz", "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==", "dev": true, "requires": { "@jest/schemas": "^29.6.3", "@types/istanbul-lib-coverage": "^2.0.0", "@types/istanbul-reports": "^3.0.0", "@types/node": "*", "@types/yargs": "^17.0.8", "chalk": "^4.0.0" } }, "@jridgewell/gen-mapping": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "requires": { "@jridgewell/set-array": "^1.2.1", "@jridgewell/sourcemap-codec": "^1.4.10", "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true }, "@jridgewell/set-array": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@jridgewell/sourcemap-codec": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "@jridgewell/trace-mapping": { "version": "0.3.25", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@lezer/common": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.3.tgz", "integrity": "sha512-w7ojc8ejBqr2REPsWxJjrMFsA/ysDCFICn8zEOR9mrqzOu2amhITYuLD8ag6XZf0CFXDrhKqw7+tW8cX66NaDA==", "dev": true }, "@lezer/highlight": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.1.tgz", "integrity": "sha512-Z5duk4RN/3zuVO7Jq0pGLJ3qynpxUVsh7IbUbGj88+uV2ApSAn6kWg2au3iJb+0Zi7kKtqffIESgNcRXWZWmSA==", "dev": true, "requires": { "@lezer/common": "^1.0.0" } }, "@lezer/javascript": { "version": "1.4.21", "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.21.tgz", "integrity": "sha512-lL+1fcuxWYPURMM/oFZLEDm0XuLN128QPV+VuGtKpeaOGdcl9F2LYC3nh1S9LkPqx9M0mndZFdXCipNAZpzIkQ==", "dev": true, "requires": { "@lezer/common": "^1.2.0", "@lezer/highlight": "^1.1.3", "@lezer/lr": "^1.3.0" } }, "@lezer/lr": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.2.tgz", "integrity": "sha512-pu0K1jCIdnQ12aWNaAVU5bzi7Bd1w54J3ECgANPmYLtQKP0HBj2cE/5coBD66MT10xbtIuUr7tg0Shbsvk0mDA==", "dev": true, "requires": { "@lezer/common": "^1.0.0" } }, "@marijn/find-cluster-break": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@marijn/find-cluster-break/-/find-cluster-break-1.0.2.tgz", "integrity": "sha512-l0h88YhZFyKdXIFNfSWpyjStDjGHwZ/U7iobcK1cQQD8sejsONdQtTVU+1wVN1PBw40PiiHB1vA5S7VTfQiP9g==", "dev": true }, "@mdx-js/loader": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/@mdx-js/loader/-/loader-3.1.1.tgz", "integrity": "sha512-0TTacJyZ9mDmY+VefuthVshaNIyCGZHJG2fMnGaDttCt8HmjUF7SizlHJpaCDoGnN635nK1wpzfpx/Xx5S4WnQ==", "dev": true, "requires": { "@mdx-js/mdx": "^3.0.0", "source-map": "^0.7.0" }, "dependencies": { "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true } } }, "@mdx-js/mdx": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-3.1.0.tgz", "integrity": "sha512-/QxEhPAvGwbQmy1Px8F899L5Uc2KZ6JtXwlCgJmjSTBedwOZkByYcBG4GceIGPXRDsmfxhHazuS+hlOShRLeDw==", "dev": true, "requires": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdx": "^2.0.0", "collapse-white-space": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-util-scope": "^1.0.0", "estree-walker": "^3.0.0", "hast-util-to-jsx-runtime": "^2.0.0", "markdown-extensions": "^2.0.0", "recma-build-jsx": "^1.0.0", "recma-jsx": "^1.0.0", "recma-stringify": "^1.0.0", "rehype-recma": "^1.0.0", "remark-mdx": "^3.0.0", "remark-parse": "^11.0.0", "remark-rehype": "^11.0.0", "source-map": "^0.7.0", "unified": "^11.0.0", "unist-util-position-from-estree": "^2.0.0", "unist-util-stringify-position": "^4.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" }, "dependencies": { "estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "requires": { "@types/estree": "^1.0.0" } }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true } } }, "@mdx-js/react": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@mdx-js/react/-/react-3.1.0.tgz", "integrity": "sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==", "dev": true, "requires": { "@types/mdx": "^2.0.0" } }, "@napi-rs/wasm-runtime": { "version": "0.2.9", "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.9.tgz", "integrity": "sha512-OKRBiajrrxB9ATokgEQoG87Z25c67pCpYcCwmXYX8PBftC9pBfN18gnm/fh1wurSLEKIAt+QRFLFCQISrb66Jg==", "dev": true, "optional": true, "requires": { "@emnapi/core": "^1.4.0", "@emnapi/runtime": "^1.4.0", "@tybys/wasm-util": "^0.9.0" } }, "@next/env": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/env/-/env-15.5.18.tgz", "integrity": "sha512-hAV85Ckd9QR6RvH04MEKwsfLTksvFpO47j9xwtoIuvuPnlwecpSi+uZTtm8HirVbtlI2Fnz//xpcSTjFdyJk+g==", "dev": true }, "@next/mdx": { "version": "15.3.2", "resolved": "https://registry.npmjs.org/@next/mdx/-/mdx-15.3.2.tgz", "integrity": "sha512-D6lSSbVzn1EiPwrBKG5QzXClcgdqiNCL8a3/6oROinzgZnYSxbVmnfs0UrqygtGSOmgW7sdJJSEOy555DoAwvw==", "dev": true, "requires": { "source-map": "^0.7.0" }, "dependencies": { "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true } } }, "@next/swc-darwin-arm64": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-15.5.18.tgz", "integrity": "sha512-w0WvQf1n+txiwns/9pwIQteCJpZTbxzO2SE0FLcwuD4v0WEh1JPOjdyxWL21XwJsdpx8cFRjyzxzCS/siP7HcQ==", "dev": true, "optional": true }, "@next/swc-darwin-x64": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-15.5.18.tgz", "integrity": "sha512-znn71QmDuxm+BOaglihMZfvyySMnNljkVIY5Z2TCssBmm+WqL6c19VhtH5ktFkHa8EZ2bnTUpcNcmNSQsg67og==", "dev": true, "optional": true }, "@next/swc-linux-arm64-gnu": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-15.5.18.tgz", "integrity": "sha512-yPPe5MNL+igZUa+OsqQJisqSfh6oarIuA1Q0BDxljGJhRQyZeP+WRHh7rs/jZUGMh5aY0YdIjXZG0VohkKkUdw==", "dev": true, "optional": true }, "@next/swc-linux-arm64-musl": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-15.5.18.tgz", "integrity": "sha512-glaCczEWIrHsokFZ3pP08U4BpKxwIdnT+txdOM32OBgpL9Yw4aqx8NejmgtZQZOdstQ5f0L3CasIZudzCuD+nw==", "dev": true, "optional": true }, "@next/swc-linux-x64-gnu": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-15.5.18.tgz", "integrity": "sha512-oUfg2EgJmU3R0OCOWiokGFUTvZiPfXtriXiuF3YNxRoROCdgvTedHIzYoeKH34gsZxS/V7mHbfq2hpAHwhH1/A==", "dev": true, "optional": true }, "@next/swc-linux-x64-musl": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-15.5.18.tgz", "integrity": "sha512-JLxSP3KTd9iu/bvUMQxH7RJo9xKSHf55/6RPE4a6FTSZygGn7uvZbCej0AHXydwkggQGSD9UddSjwv6Xz5ESfA==", "dev": true, "optional": true }, "@next/swc-win32-arm64-msvc": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-15.5.18.tgz", "integrity": "sha512-ir1v7enP52K2HNz3tQQvwF+x7VNxBk1ciiZ18WBPvxf4C59IqdfmHPJYK3vH7rSxpuCVw/8C712wTXNAtEp+NA==", "dev": true, "optional": true }, "@next/swc-win32-x64-msvc": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-15.5.18.tgz", "integrity": "sha512-LIu5me6QTANCd25E7I5uIEfvgQ06RK7tvHAbYo3zCb3VpxQEPvMcSpd87NwUABDT6MbGPdEGR5VRiK4PPTJhQg==", "dev": true, "optional": true }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "@rollup/plugin-buble": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-buble/-/plugin-buble-1.0.3.tgz", "integrity": "sha512-QYD9BKkJoof0FdCFeSYYhF6/Y8e0Mnf+098xGgmWOFJ4UPHlWujjqOYeVwEm2hJPOmlR5k7HPUdAjqtOWhN64Q==", "dev": true, "requires": { "@rollup/pluginutils": "^5.0.1", "@types/buble": "^0.19.2", "buble": "^0.20.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "buble": { "version": "0.20.0", "resolved": "https://registry.npmjs.org/buble/-/buble-0.20.0.tgz", "integrity": "sha512-/1gnaMQE8xvd5qsNBl+iTuyjJ9XxeaVxAMF86dQ4EyxFJOZtsgOS8Ra+7WHgZTam5IFDtt4BguN0sH0tVTKrOw==", "dev": true, "requires": { "acorn": "^6.4.1", "acorn-dynamic-import": "^4.0.0", "acorn-jsx": "^5.2.0", "chalk": "^2.4.2", "magic-string": "^0.25.7", "minimist": "^1.2.5", "regexpu-core": "4.5.4" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "regexpu-core": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.5.4.tgz", "integrity": "sha512-BtizvGtFQKGPUcTy56o3nk1bGRp4SZOTYrDtGNlqCQufptV5IkkLN6Emw+yunAJjzf+C9FQFtvq7IoA3+oMYHQ==", "dev": true, "requires": { "regenerate": "^1.4.0", "regenerate-unicode-properties": "^8.0.2", "regjsgen": "^0.5.0", "regjsparser": "^0.6.0", "unicode-match-property-ecmascript": "^1.0.4", "unicode-match-property-value-ecmascript": "^1.1.0" } }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "@rollup/plugin-commonjs": { "version": "29.0.3", "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-29.0.3.tgz", "integrity": "sha512-ZaOxZceP7SOUW7Lqw5IRVweSQYWaeIPnXIGLiB690EBA3FGJTO40EEr2L5yZplJWsgTCogILRSpcAe7+U0Otdg==", "dev": true, "requires": { "@rollup/pluginutils": "^5.0.1", "commondir": "^1.0.1", "estree-walker": "^2.0.2", "fdir": "^6.2.0", "is-reference": "1.2.1", "magic-string": "^0.30.3", "picomatch": "^4.0.2" }, "dependencies": { "fdir": { "version": "6.4.3", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.3.tgz", "integrity": "sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==", "dev": true, "requires": {} }, "magic-string": { "version": "0.30.17", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", "dev": true, "requires": { "@jridgewell/sourcemap-codec": "^1.5.0" } }, "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true } } }, "@rollup/plugin-json": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@rollup/plugin-json/-/plugin-json-6.1.0.tgz", "integrity": "sha512-EGI2te5ENk1coGeADSIwZ7G2Q8CJS2sF120T7jLw4xFw9n7wIOXHo+kIYRAoVpJAN+kmqZSoO3Fp4JtoNF4ReA==", "dev": true, "requires": { "@rollup/pluginutils": "^5.1.0" } }, "@rollup/plugin-terser": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@rollup/plugin-terser/-/plugin-terser-0.4.4.tgz", "integrity": "sha512-XHeJC5Bgvs8LfukDwWZp7yeqin6ns8RTl2B9avbejt6tZqsqvVoWI7ZTQrcNsfKEDWBTnTxM8nMDkO2IFFbd0A==", "dev": true, "requires": { "serialize-javascript": "^6.0.1", "smob": "^1.0.0", "terser": "^5.17.4" } }, "@rollup/plugin-typescript": { "version": "12.1.2", "resolved": "https://registry.npmjs.org/@rollup/plugin-typescript/-/plugin-typescript-12.1.2.tgz", "integrity": "sha512-cdtSp154H5sv637uMr1a8OTWB0L1SWDSm1rDGiyfcGcvQ6cuTs4MDk2BVEBGysUWago4OJN4EQZqOTl/QY3Jgg==", "dev": true, "requires": { "@rollup/pluginutils": "^5.1.0", "resolve": "^1.22.1" } }, "@rollup/pluginutils": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.1.4.tgz", "integrity": "sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==", "dev": true, "requires": { "@types/estree": "^1.0.0", "estree-walker": "^2.0.2", "picomatch": "^4.0.2" }, "dependencies": { "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true } } }, "@rollup/rollup-android-arm-eabi": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.59.0.tgz", "integrity": "sha512-upnNBkA6ZH2VKGcBj9Fyl9IGNPULcjXRlg0LLeaioQWueH30p6IXtJEbKAgvyv+mJaMxSm1l6xwDXYjpEMiLMg==", "dev": true, "optional": true }, "@rollup/rollup-android-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.59.0.tgz", "integrity": "sha512-hZ+Zxj3SySm4A/DylsDKZAeVg0mvi++0PYVceVyX7hemkw7OreKdCvW2oQ3T1FMZvCaQXqOTHb8qmBShoqk69Q==", "dev": true, "optional": true }, "@rollup/rollup-darwin-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.59.0.tgz", "integrity": "sha512-W2Psnbh1J8ZJw0xKAd8zdNgF9HRLkdWwwdWqubSVk0pUuQkoHnv7rx4GiF9rT4t5DIZGAsConRE3AxCdJ4m8rg==", "dev": true, "optional": true }, "@rollup/rollup-darwin-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.59.0.tgz", "integrity": "sha512-ZW2KkwlS4lwTv7ZVsYDiARfFCnSGhzYPdiOU4IM2fDbL+QGlyAbjgSFuqNRbSthybLbIJ915UtZBtmuLrQAT/w==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.59.0.tgz", "integrity": "sha512-EsKaJ5ytAu9jI3lonzn3BgG8iRBjV4LxZexygcQbpiU0wU0ATxhNVEpXKfUa0pS05gTcSDMKpn3Sx+QB9RlTTA==", "dev": true, "optional": true }, "@rollup/rollup-freebsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.59.0.tgz", "integrity": "sha512-d3DuZi2KzTMjImrxoHIAODUZYoUUMsuUiY4SRRcJy6NJoZ6iIqWnJu9IScV9jXysyGMVuW+KNzZvBLOcpdl3Vg==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-gnueabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.59.0.tgz", "integrity": "sha512-t4ONHboXi/3E0rT6OZl1pKbl2Vgxf9vJfWgmUoCEVQVxhW6Cw/c8I6hbbu7DAvgp82RKiH7TpLwxnJeKv2pbsw==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm-musleabihf": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.59.0.tgz", "integrity": "sha512-CikFT7aYPA2ufMD086cVORBYGHffBo4K8MQ4uPS/ZnY54GKj36i196u8U+aDVT2LX4eSMbyHtyOh7D7Zvk2VvA==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.59.0.tgz", "integrity": "sha512-jYgUGk5aLd1nUb1CtQ8E+t5JhLc9x5WdBKew9ZgAXg7DBk0ZHErLHdXM24rfX+bKrFe+Xp5YuJo54I5HFjGDAA==", "dev": true, "optional": true }, "@rollup/rollup-linux-arm64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.59.0.tgz", "integrity": "sha512-peZRVEdnFWZ5Bh2KeumKG9ty7aCXzzEsHShOZEFiCQlDEepP1dpUl/SrUNXNg13UmZl+gzVDPsiCwnV1uI0RUA==", "dev": true, "optional": true }, "@rollup/rollup-linux-loong64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.59.0.tgz", "integrity": "sha512-gbUSW/97f7+r4gHy3Jlup8zDG190AuodsWnNiXErp9mT90iCy9NKKU0Xwx5k8VlRAIV2uU9CsMnEFg/xXaOfXg==", "dev": true, "optional": true }, "@rollup/rollup-linux-loong64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.59.0.tgz", "integrity": "sha512-yTRONe79E+o0FWFijasoTjtzG9EBedFXJMl888NBEDCDV9I2wGbFFfJQQe63OijbFCUZqxpHz1GzpbtSFikJ4Q==", "dev": true, "optional": true }, "@rollup/rollup-linux-ppc64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.59.0.tgz", "integrity": "sha512-sw1o3tfyk12k3OEpRddF68a1unZ5VCN7zoTNtSn2KndUE+ea3m3ROOKRCZxEpmT9nsGnogpFP9x6mnLTCaoLkA==", "dev": true, "optional": true }, "@rollup/rollup-linux-ppc64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.59.0.tgz", "integrity": "sha512-+2kLtQ4xT3AiIxkzFVFXfsmlZiG5FXYW7ZyIIvGA7Bdeuh9Z0aN4hVyXS/G1E9bTP/vqszNIN/pUKCk/BTHsKA==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.59.0.tgz", "integrity": "sha512-NDYMpsXYJJaj+I7UdwIuHHNxXZ/b/N2hR15NyH3m2qAtb/hHPA4g4SuuvrdxetTdndfj9b1WOmy73kcPRoERUg==", "dev": true, "optional": true }, "@rollup/rollup-linux-riscv64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.59.0.tgz", "integrity": "sha512-nLckB8WOqHIf1bhymk+oHxvM9D3tyPndZH8i8+35p/1YiVoVswPid2yLzgX7ZJP0KQvnkhM4H6QZ5m0LzbyIAg==", "dev": true, "optional": true }, "@rollup/rollup-linux-s390x-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.59.0.tgz", "integrity": "sha512-oF87Ie3uAIvORFBpwnCvUzdeYUqi2wY6jRFWJAy1qus/udHFYIkplYRW+wo+GRUP4sKzYdmE1Y3+rY5Gc4ZO+w==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.59.0.tgz", "integrity": "sha512-3AHmtQq/ppNuUspKAlvA8HtLybkDflkMuLK4DPo77DfthRb71V84/c4MlWJXixZz4uruIH4uaa07IqoAkG64fg==", "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.59.0.tgz", "integrity": "sha512-2UdiwS/9cTAx7qIUZB/fWtToJwvt0Vbo0zmnYt7ED35KPg13Q0ym1g442THLC7VyI6JfYTP4PiSOWyoMdV2/xg==", "dev": true, "optional": true }, "@rollup/rollup-openbsd-x64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.59.0.tgz", "integrity": "sha512-M3bLRAVk6GOwFlPTIxVBSYKUaqfLrn8l0psKinkCFxl4lQvOSz8ZrKDz2gxcBwHFpci0B6rttydI4IpS4IS/jQ==", "dev": true, "optional": true }, "@rollup/rollup-openharmony-arm64": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.59.0.tgz", "integrity": "sha512-tt9KBJqaqp5i5HUZzoafHZX8b5Q2Fe7UjYERADll83O4fGqJ49O1FsL6LpdzVFQcpwvnyd0i+K/VSwu/o/nWlA==", "dev": true, "optional": true }, "@rollup/rollup-win32-arm64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.59.0.tgz", "integrity": "sha512-V5B6mG7OrGTwnxaNUzZTDTjDS7F75PO1ae6MJYdiMu60sq0CqN5CVeVsbhPxalupvTX8gXVSU9gq+Rx1/hvu6A==", "dev": true, "optional": true }, "@rollup/rollup-win32-ia32-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.59.0.tgz", "integrity": "sha512-UKFMHPuM9R0iBegwzKF4y0C4J9u8C6MEJgFuXTBerMk7EJ92GFVFYBfOZaSGLu6COf7FxpQNqhNS4c4icUPqxA==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-gnu": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.59.0.tgz", "integrity": "sha512-laBkYlSS1n2L8fSo1thDNGrCTQMmxjYY5G0WFWjFFYZkKPjsMBsgJfGf4TLxXrF6RyhI60L8TMOjBMvXiTcxeA==", "dev": true, "optional": true }, "@rollup/rollup-win32-x64-msvc": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.59.0.tgz", "integrity": "sha512-2HRCml6OztYXyJXAvdDXPKcawukWY2GpR5/nxKp4iBgiO3wcoEGkAaqctIbZcNB6KlUQBIqt8VYkNSj2397EfA==", "dev": true, "optional": true }, "@rtsao/scc": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz", "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==", "dev": true }, "@sinclair/typebox": { "version": "0.27.8", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "@sinonjs/commons": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz", "integrity": "sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@sinonjs/fake-timers": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz", "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==", "dev": true, "requires": { "@sinonjs/commons": "^3.0.0" } }, "@size-limit/esbuild-why": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/@size-limit/esbuild-why/-/esbuild-why-11.2.0.tgz", "integrity": "sha512-VtoQbbkvFbF314LWEaEp1+IjG0DH+9w6nP//D6Gd48SEAPLoBgqk287mjYTF9WYxg9N5lo8KjpXxEFk4gOXNpw==", "dev": true, "requires": { "esbuild-visualizer": "^0.7.0", "open": "^10.1.0" } }, "@size-limit/preset-small-lib": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@size-limit/preset-small-lib/-/preset-small-lib-12.1.0.tgz", "integrity": "sha512-TVVQ/iuHbaGtHJrjur5s4XKYEyGk0nIwUAqhuzhKPbTyV9nYOH/laDelQ4vg3cGmm8sayRx998wxEdnwM/Yewg==", "dev": true, "requires": { "@size-limit/esbuild": "12.1.0", "@size-limit/file": "12.1.0", "size-limit": "12.1.0" }, "dependencies": { "@size-limit/esbuild": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@size-limit/esbuild/-/esbuild-12.1.0.tgz", "integrity": "sha512-Um6MVrX+05kIxI4+zk0ZByG9dA/Th1f+sfGc571D95BnCPc90/pl2+2OdsQuOyoWEbeAMqfcTKo0v07i+E65Vw==", "dev": true, "requires": { "esbuild": "^0.28.0", "nanoid": "^5.1.7" } }, "@size-limit/file": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/@size-limit/file/-/file-12.1.0.tgz", "integrity": "sha512-eGwDcIufnNnvJRzv3liDOn6MAOGgmOTUdpeGQ2KuRTlgIgO54AJH1ilvktlJc6PIjNfwpYY0dOGyap1QgM1swQ==", "dev": true, "requires": {} }, "nanoid": { "version": "5.1.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.11.tgz", "integrity": "sha512-v+KEsUv2ps74PaSKv0gHTxTCgMXOIfBEbaqa6w6ISIGC7ZsvHN4N9oJ8d4cmf0n5oTzQz2SLmThbQWhjd/8eKg==", "dev": true }, "size-limit": { "version": "12.1.0", "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-12.1.0.tgz", "integrity": "sha512-VnDS2fycANrJFVPQwjaD+h+hkISY7EB3LsPsYWje4lBCjQwwsZLxjwwRwVJKHrcj2ZqyG+DdXykWm9mbZklZrw==", "dev": true, "requires": { "bytes-iec": "^3.1.1", "lilconfig": "^3.1.3", "nanospinner": "^1.2.2", "picocolors": "^1.1.1", "tinyglobby": "^0.2.16" } } } }, "@swc/helpers": { "version": "0.5.15", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", "dev": true, "requires": { "tslib": "^2.8.0" } }, "@tootallnate/once": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.1.tgz", "integrity": "sha512-HqmEUIGRJ5fSXchkVgR5F7qn48bDBzv0kWj/Kfu5e6uci4UlEeng4331LnBkWffb++Ei3FOVLxo8JJWMFBDMeQ==", "dev": true }, "@tsconfig/node10": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", "dev": true }, "@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "@tybys/wasm-util": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.9.0.tgz", "integrity": "sha512-6+7nlbMVX/PVDCwaIQ8nTOPveOcFLSt8GcXdx8hD0bt39uWxYT88uXzqTd4fTvqta7oeUJqudepapKNt2DYJFw==", "dev": true, "optional": true, "requires": { "tslib": "^2.4.0" } }, "@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "requires": { "@babel/parser": "^7.20.7", "@babel/types": "^7.20.7", "@types/babel__generator": "*", "@types/babel__template": "*", "@types/babel__traverse": "*" } }, "@types/babel__generator": { "version": "7.27.0", "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", "dev": true, "requires": { "@babel/types": "^7.0.0" } }, "@types/babel__template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "requires": { "@babel/parser": "^7.1.0", "@babel/types": "^7.0.0" } }, "@types/babel__traverse": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", "dev": true, "requires": { "@babel/types": "^7.20.7" } }, "@types/buble": { "version": "0.19.2", "resolved": "https://registry.npmjs.org/@types/buble/-/buble-0.19.2.tgz", "integrity": "sha512-uUD8zIfXMKThmFkahTXDGI3CthFH1kMg2dOm3KLi4GlC5cbARA64bEcUMbbWdWdE73eoc/iBB9PiTMqH0dNS2Q==", "dev": true, "requires": { "magic-string": "^0.25.0" } }, "@types/debug": { "version": "4.1.12", "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.12.tgz", "integrity": "sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==", "dev": true, "requires": { "@types/ms": "*" } }, "@types/estree": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", "dev": true }, "@types/estree-jsx": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree-jsx/-/estree-jsx-1.0.5.tgz", "integrity": "sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==", "dev": true, "requires": { "@types/estree": "*" } }, "@types/gensync": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@types/gensync/-/gensync-1.0.4.tgz", "integrity": "sha512-C3YYeRQWp2fmq9OryX+FoDy8nXS6scQ7dPptD8LnFDAUNcKWJjXQKDNJD3HVm+kOUsXhTOkpi69vI4EuAr95bA==", "dev": true }, "@types/graceful-fs": { "version": "4.1.6", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", "dev": true, "requires": { "@types/node": "*" } }, "@types/hast": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/@types/hast/-/hast-3.0.4.tgz", "integrity": "sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==", "dev": true, "requires": { "@types/unist": "*" } }, "@types/istanbul-lib-coverage": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", "dev": true }, "@types/istanbul-lib-report": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "*" } }, "@types/istanbul-reports": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", "dev": true, "requires": { "@types/istanbul-lib-report": "*" } }, "@types/jsdom": { "version": "20.0.1", "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz", "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==", "dev": true, "requires": { "@types/node": "*", "@types/tough-cookie": "*", "parse5": "^7.0.0" } }, "@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "@types/mdast": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", "dev": true, "requires": { "@types/unist": "*" } }, "@types/mdx": { "version": "2.0.13", "resolved": "https://registry.npmjs.org/@types/mdx/-/mdx-2.0.13.tgz", "integrity": "sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==", "dev": true }, "@types/ms": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", "dev": true }, "@types/node": { "version": "25.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-25.0.0.tgz", "integrity": "sha512-rl78HwuZlaDIUSeUKkmogkhebA+8K1Hy7tddZuJ3D0xV8pZSfsYGTsliGUol1JPzu9EKnTxPC4L1fiWouStRew==", "dev": true, "requires": { "undici-types": "~7.16.0" } }, "@types/prismjs": { "version": "1.26.5", "resolved": "https://registry.npmjs.org/@types/prismjs/-/prismjs-1.26.5.tgz", "integrity": "sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==", "dev": true }, "@types/random-seed": { "version": "0.3.5", "resolved": "https://registry.npmjs.org/@types/random-seed/-/random-seed-0.3.5.tgz", "integrity": "sha512-CftxcDPAHgs0SLHU2dt+ZlDPJfGqLW3sZlC/ATr5vJDSe5tRLeOne7HMvCOJnFyF8e1U41wqzs3h6AMC613xtA==", "dev": true }, "@types/react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.0.tgz", "integrity": "sha512-UaicktuQI+9UKyA4njtDOGBD/67t8YEBt2xdfqu8+gP9hqPUPsiXlNPcpS2gVdjmis5GKPG3fCxbQLVgxsQZ8w==", "dev": true, "requires": { "csstype": "^3.0.2" } }, "@types/stack-utils": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", "dev": true }, "@types/tough-cookie": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz", "integrity": "sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw==", "dev": true }, "@types/transducers-js": { "version": "0.4.8", "resolved": "https://registry.npmjs.org/@types/transducers-js/-/transducers-js-0.4.8.tgz", "integrity": "sha512-WMzIHF9H1R9/oJHogF4m2pp2OkmWp1eHFDXyZY7L8UTcgramikok09SPFCnH/TJxZ70ke4ubTksFjIHLCu3OLA==", "dev": true }, "@types/unist": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", "dev": true }, "@types/yargs": { "version": "17.0.24", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz", "integrity": "sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw==", "dev": true, "requires": { "@types/yargs-parser": "*" } }, "@types/yargs-parser": { "version": "21.0.0", "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "@typescript-eslint/eslint-plugin": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.61.1.tgz", "integrity": "sha512-ZPlVl3PB3et/59Ne0fv/sci6ZXz4T4Hp4nTJ56i/Y0gR89ARb+KphojTq6j+56E5PIezmOIOOWyY+aWQFd+IkQ==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.12.2", "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/type-utils": "8.61.1", "@typescript-eslint/utils": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "ignore": "^7.0.5", "natural-compare": "^1.4.0", "ts-api-utils": "^2.5.0" }, "dependencies": { "ignore": { "version": "7.0.5", "resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz", "integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==", "dev": true } } }, "@typescript-eslint/parser": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.61.1.tgz", "integrity": "sha512-PJ5vePq5/ognBbrIcoC5+SHO5dfpeLPzP9FpLkzWrguoYQEeeSjlJpVwOpo1JRSTEi7dRcwNy4h4dzV70PqHcg==", "dev": true, "requires": { "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3" } }, "@typescript-eslint/project-service": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.61.1.tgz", "integrity": "sha512-PrC4JYGmR241lYnfhmKGTXkFqv8+ymbTFgSAY0fVXpY82/QkMw5TZPl+vGzuDDU2QYJk9fIDOBTntF+yDv9LEA==", "dev": true, "requires": { "@typescript-eslint/tsconfig-utils": "^8.61.1", "@typescript-eslint/types": "^8.61.1", "debug": "^4.4.3" } }, "@typescript-eslint/scope-manager": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.61.1.tgz", "integrity": "sha512-L2bdIeoQS8FlKAvONAr20w6OcLXeB+qiDKbAooS9A0Ben+iSIkBef0FxqwKWYqt5sa0i4KJtxVyVmhMylKzF5w==", "dev": true, "requires": { "@typescript-eslint/types": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1" } }, "@typescript-eslint/tsconfig-utils": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.61.1.tgz", "integrity": "sha512-UN/H4di+OO7EWx2ovME+8t31YO+KVnK0RRKEHR3kOt21/Ay8BOq3M1OMvWs5vNiqcFCYGYoxK3MXPZzmMUE+yg==", "dev": true, "requires": {} }, "@typescript-eslint/type-utils": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.61.1.tgz", "integrity": "sha512-GYRicKmVK0C4fsKgaACaknOUAq9Oa2kwsjnpFhFcS/5p4Ht5IP9OVLbgIgcK4SRk92nVHFluurg1lumD9dBcLw==", "dev": true, "requires": { "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/utils": "8.61.1", "debug": "^4.4.3", "ts-api-utils": "^2.5.0" } }, "@typescript-eslint/types": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.61.1.tgz", "integrity": "sha512-G+CRlPqLv7Bz1IZVs03x5K59F1veqL0EJUROAdGhKsEq8qOiRiZbI+HUojPq5l0fEGOKModD9br6lObhB8zkoA==", "dev": true }, "@typescript-eslint/typescript-estree": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.61.1.tgz", "integrity": "sha512-u+oQD3BqYWPc8YV9Zab4vaJElJuwOLPRc10Jm1o/qS+6Qwen14HCWwx0Seo4LnSn2wxea2Ik8DxPt2/FHmuhrg==", "dev": true, "requires": { "@typescript-eslint/project-service": "8.61.1", "@typescript-eslint/tsconfig-utils": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/visitor-keys": "8.61.1", "debug": "^4.4.3", "minimatch": "^10.2.2", "semver": "^7.7.3", "tinyglobby": "^0.2.15", "ts-api-utils": "^2.5.0" }, "dependencies": { "balanced-match": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", "dev": true }, "brace-expansion": { "version": "5.0.6", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", "dev": true, "requires": { "balanced-match": "^4.0.2" } }, "minimatch": { "version": "10.2.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", "dev": true, "requires": { "brace-expansion": "^5.0.5" } }, "semver": { "version": "7.8.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.5.tgz", "integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==", "dev": true } } }, "@typescript-eslint/utils": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.61.1.tgz", "integrity": "sha512-1+P/3Dj6jvtybE1q0HQ6yBt/gq+oKJyLdEv4HdnqasaEXRSYCAsD59mXEVQnM/ULNdQxbX77tdG4jPRjIS6knA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.61.1", "@typescript-eslint/types": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1" } }, "@typescript-eslint/visitor-keys": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.61.1.tgz", "integrity": "sha512-6fJ9MHWtK14C1DSkiMlHUSOmrVebL7150xZJBlJiL62jjhIA4JmOq6flwBgDxIdBKKdoiZRel+dfPD5MLfny3w==", "dev": true, "requires": { "@typescript-eslint/types": "8.61.1", "eslint-visitor-keys": "^5.0.0" }, "dependencies": { "eslint-visitor-keys": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz", "integrity": "sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA==", "dev": true } } }, "@ungap/structured-clone": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", "dev": true }, "@unrs/resolver-binding-darwin-arm64": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.7.2.tgz", "integrity": "sha512-vxtBno4xvowwNmO/ASL0Y45TpHqmNkAaDtz4Jqb+clmcVSSl8XCG/PNFFkGsXXXS6AMjP+ja/TtNCFFa1QwLRg==", "dev": true, "optional": true }, "@unrs/resolver-binding-darwin-x64": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.7.2.tgz", "integrity": "sha512-qhVa8ozu92C23Hsmv0BF4+5Dyyd5STT1FolV4whNgbY6mj3kA0qsrGPe35zNR3wAN7eFict3s4Rc2dDTPBTuFQ==", "dev": true, "optional": true }, "@unrs/resolver-binding-freebsd-x64": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.7.2.tgz", "integrity": "sha512-zKKdm2uMXqLFX6Ac7K5ElnnG5VIXbDlFWzg4WJ8CGUedJryM5A3cTgHuGMw1+P5ziV8CRhnSEgOnurTI4vpHpg==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-arm-gnueabihf": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.7.2.tgz", "integrity": "sha512-8N1z1TbPnHH+iDS/42GJ0bMPLiGK+cUqOhNbMKtWJ4oFGzqSJk/zoXFzcQkgtI63qMcUI7wW1tq2usZQSb2jxw==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-arm-musleabihf": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.7.2.tgz", "integrity": "sha512-tjYzI9LcAXR9MYd9rO45m1s0B/6bJNuZ6jeOxo1pq1K6OBuRMMmfyvJYval3s9FPPGmrldYA3mi4gWDlWuTFGA==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-arm64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.7.2.tgz", "integrity": "sha512-jon9M7DKRLGZ9VYSkFMflvNqu9hDtOCEnO2QAryFWgT6o6AXU8du56V7YqnaLKr6rAbZBWYsYpikF226v423QA==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-arm64-musl": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.7.2.tgz", "integrity": "sha512-c8Cg4/h+kQ63pL43wBNaVMmOjXI/X62wQmru51qjfTvI7kmCy5uHTJvK/9LrF0G8Jdx8r34d019P1DVJmhXQpA==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-ppc64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.7.2.tgz", "integrity": "sha512-A+lcwRFyrjeJmv3JJvhz5NbcCkLQL6Mk16kHTNm6/aGNc4FwPHPE4DR9DwuCvCnVHvF5IAd9U4VIs/VvVir5lg==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-riscv64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.7.2.tgz", "integrity": "sha512-hQQ4TJQrSQW8JlPm7tRpXN8OCNP9ez7PajJNjRD1ZTHQAy685OYqPrKjfaMw/8LiHCt8AZ74rfUVHP9vn0N69Q==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-riscv64-musl": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.7.2.tgz", "integrity": "sha512-NoAGbiqrxtY8kVooZ24i70CjLDlUFI7nDj3I9y54U94p+3kPxwd2L692YsdLa+cqQ0VoqMWoehDFp21PKRUoIQ==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-s390x-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.7.2.tgz", "integrity": "sha512-KaZByo8xuQZbUhhreBTW+yUnOIHUsv04P8lKjQ5otiGoSJ17ISGYArc+4vKdLEpGaLbemGzr4ZeUbYQQsLWFjA==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-x64-gnu": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.7.2.tgz", "integrity": "sha512-dEidzJDubxxhUCBJ/SHSMJD/9q7JkyfBMT77Px1npl4xpg9t0POLvnWywSk66BgZS/b2Hy9Y1yFaoMTFJUe9yg==", "dev": true, "optional": true }, "@unrs/resolver-binding-linux-x64-musl": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.7.2.tgz", "integrity": "sha512-RvP+Ux3wDjmnZDT4XWFfNBRVG0fMsc+yVzNFUqOflnDfZ9OYujv6nkh+GOr+watwrW4wdp6ASfG/e7bkDradsw==", "dev": true, "optional": true }, "@unrs/resolver-binding-wasm32-wasi": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.7.2.tgz", "integrity": "sha512-y797JBmO9IsvXVRCKDXOxjyAE4+CcZpla2GSoBQ33TVb3ILXuFnMrbR/QQZoauBYeOFuu4w3ifWLw52sdHGz6g==", "dev": true, "optional": true, "requires": { "@napi-rs/wasm-runtime": "^0.2.9" } }, "@unrs/resolver-binding-win32-arm64-msvc": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.7.2.tgz", "integrity": "sha512-gtYTh4/VREVSLA+gHrfbWxaMO/00y+34htY7XpioBTy56YN2eBjkPrY1ML1Zys89X3RJDKVaogzwxlM1qU7egg==", "dev": true, "optional": true }, "@unrs/resolver-binding-win32-ia32-msvc": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.7.2.tgz", "integrity": "sha512-Ywv20XHvHTDRQs12jd3MY8X5C8KLjDbg/jyaal/QLKx3fAShhJyD4blEANInsjxW3P7isHx1Blt56iUDDJO3jg==", "dev": true, "optional": true }, "@unrs/resolver-binding-win32-x64-msvc": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.7.2.tgz", "integrity": "sha512-friS8NEQfHaDbkThxopGk+LuE5v3iY0StruifjQEt7SLbA46OnfgMO15sOTkbpJkol6RB+1l1TYPXh0sCddpvA==", "dev": true, "optional": true }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", "dev": true }, "acorn": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", "dev": true }, "acorn-dynamic-import": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-4.0.0.tgz", "integrity": "sha512-d3OEjQV4ROpoflsnUA8HozoIR504TFxNivYEUi6uwz0IYhBkTDXGuWlNdMtybRt3nqVx/L6XqMt0FxkXuWKZhw==", "dev": true, "requires": {} }, "acorn-globals": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz", "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==", "dev": true, "requires": { "acorn": "^8.1.0", "acorn-walk": "^8.0.2" }, "dependencies": { "acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true } } }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, "requires": {} }, "acorn-walk": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", "dev": true }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "dev": true, "requires": { "debug": "4" } }, "aggregate-error": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "requires": { "clean-stack": "^4.0.0", "indent-string": "^5.0.0" } }, "ajv": { "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "algoliasearch": { "version": "5.35.0", "resolved": "https://registry.npmjs.org/algoliasearch/-/algoliasearch-5.35.0.tgz", "integrity": "sha512-Y+moNhsqgLmvJdgTsO4GZNgsaDWv8AOGAaPeIeHKlDn/XunoAqYbA+XNpBd1dW8GOXAUDyxC9Rxc7AV4kpFcIg==", "dev": true, "requires": { "@algolia/abtesting": "1.1.0", "@algolia/client-abtesting": "5.35.0", "@algolia/client-analytics": "5.35.0", "@algolia/client-common": "5.35.0", "@algolia/client-insights": "5.35.0", "@algolia/client-personalization": "5.35.0", "@algolia/client-query-suggestions": "5.35.0", "@algolia/client-search": "5.35.0", "@algolia/ingestion": "1.35.0", "@algolia/monitoring": "1.35.0", "@algolia/recommend": "5.35.0", "@algolia/requester-browser-xhr": "5.35.0", "@algolia/requester-fetch": "5.35.0", "@algolia/requester-node-http": "5.35.0" } }, "ansi-escapes": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", "dev": true, "requires": { "type-fest": "^0.21.3" } }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "requires": { "color-convert": "^2.0.1" } }, "anymatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" } }, "arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", "dev": true }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "array-buffer-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz", "integrity": "sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==", "dev": true, "requires": { "call-bound": "^1.0.3", "is-array-buffer": "^3.0.5" } }, "array-includes": { "version": "3.1.8", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" } }, "array.prototype.findlast": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz", "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==", "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "array.prototype.findlastindex": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flat": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz", "integrity": "sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==", "dev": true, "requires": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "array.prototype.flatmap": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz", "integrity": "sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==", "dev": true, "requires": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-shim-unscopables": "^1.0.2" } }, "array.prototype.tosorted": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz", "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==", "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.3", "es-errors": "^1.3.0", "es-shim-unscopables": "^1.0.2" } }, "arraybuffer.prototype.slice": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz", "integrity": "sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.1", "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "is-array-buffer": "^3.0.4" } }, "arrify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true }, "astring": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/astring/-/astring-1.9.0.tgz", "integrity": "sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==", "dev": true }, "async-function": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz", "integrity": "sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==", "dev": true }, "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", "dev": true }, "available-typed-arrays": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", "dev": true, "requires": { "possible-typed-array-names": "^1.0.0" } }, "babel-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz", "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==", "dev": true, "requires": { "@jest/transform": "^29.7.0", "@types/babel__core": "^7.1.14", "babel-plugin-istanbul": "^6.1.1", "babel-preset-jest": "^29.6.3", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "slash": "^3.0.0" } }, "babel-plugin-istanbul": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@istanbuljs/load-nyc-config": "^1.0.0", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-instrument": "^5.0.4", "test-exclude": "^6.0.0" } }, "babel-plugin-jest-hoist": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz", "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==", "dev": true, "requires": { "@babel/template": "^7.3.3", "@babel/types": "^7.3.3", "@types/babel__core": "^7.1.14", "@types/babel__traverse": "^7.0.6" } }, "babel-preset-current-node-syntax": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz", "integrity": "sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==", "dev": true, "requires": { "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-bigint": "^7.8.3", "@babel/plugin-syntax-class-properties": "^7.8.3", "@babel/plugin-syntax-import-meta": "^7.8.3", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.8.3", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", "@babel/plugin-syntax-numeric-separator": "^7.8.3", "@babel/plugin-syntax-object-rest-spread": "^7.8.3", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-top-level-await": "^7.8.3" } }, "babel-preset-jest": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz", "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==", "dev": true, "requires": { "babel-plugin-jest-hoist": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0" } }, "bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", "dev": true }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true }, "benchmark": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz", "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=", "dev": true, "requires": { "lodash": "^4.17.4", "platform": "^1.3.3" } }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { "fill-range": "^7.1.1" } }, "browserslist": { "version": "4.24.4", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "requires": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", "node-releases": "^2.0.19", "update-browserslist-db": "^1.1.1" } }, "bser": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", "dev": true, "requires": { "node-int64": "^0.4.0" } }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", "dev": true }, "bundle-name": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/bundle-name/-/bundle-name-4.1.0.tgz", "integrity": "sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==", "dev": true, "requires": { "run-applescript": "^7.0.0" } }, "bytes-iec": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/bytes-iec/-/bytes-iec-3.1.1.tgz", "integrity": "sha512-fey6+4jDK7TFtFg/klGSvNKJctyU7n2aQdnM+CO0ruLPbqqMOM8Tio0Pc+deqUeVKX1tL5DQep1zQ7+37aTAsA==", "dev": true }, "call-bind": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.0", "es-define-property": "^1.0.0", "get-intrinsic": "^1.2.4", "set-function-length": "^1.2.2" } }, "call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", "dev": true, "requires": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "call-bound": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "caniuse-lite": { "version": "1.0.30001699", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001699.tgz", "integrity": "sha512-b+uH5BakXZ9Do9iK+CkDmctUSEqZl+SP056vc5usa0PL+ev5OHw003rZXcnjNDv3L8P5j6rwT6C0BPKSikW08w==", "dev": true }, "ccount": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ccount/-/ccount-2.0.1.tgz", "integrity": "sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==", "dev": true }, "chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "requires": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } }, "char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", "dev": true }, "character-entities": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", "dev": true }, "character-entities-html4": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-2.1.0.tgz", "integrity": "sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==", "dev": true }, "character-entities-legacy": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/character-entities-legacy/-/character-entities-legacy-3.0.0.tgz", "integrity": "sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==", "dev": true }, "character-reference-invalid": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/character-reference-invalid/-/character-reference-invalid-2.0.1.tgz", "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==", "dev": true }, "chokidar": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "dev": true, "requires": { "readdirp": "^4.0.1" } }, "ci-info": { "version": "3.8.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", "dev": true }, "cjs-module-lexer": { "version": "1.4.3", "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz", "integrity": "sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==", "dev": true }, "clean-stack": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", "dev": true, "requires": { "escape-string-regexp": "5.0.0" }, "dependencies": { "escape-string-regexp": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true } } }, "client-only": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/client-only/-/client-only-0.0.1.tgz", "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "dev": true }, "cliui": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "requires": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" }, "dependencies": { "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "wrap-ansi": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } } } }, "co": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", "dev": true }, "codemirror": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", "dev": true, "requires": { "@codemirror/autocomplete": "^6.0.0", "@codemirror/commands": "^6.0.0", "@codemirror/language": "^6.0.0", "@codemirror/lint": "^6.0.0", "@codemirror/search": "^6.0.0", "@codemirror/state": "^6.0.0", "@codemirror/view": "^6.0.0" } }, "collapse-white-space": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/collapse-white-space/-/collapse-white-space-2.1.0.tgz", "integrity": "sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==", "dev": true }, "collect-v8-coverage": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { "color-name": "~1.1.4" } }, "color-name": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", "dev": true }, "combined-stream": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "dev": true, "requires": { "delayed-stream": "~1.0.0" } }, "comma-separated-tokens": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/comma-separated-tokens/-/comma-separated-tokens-2.0.3.tgz", "integrity": "sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==", "dev": true }, "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "cp-file": { "version": "10.0.0", "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-10.0.0.tgz", "integrity": "sha512-vy2Vi1r2epK5WqxOLnskeKeZkdZvTKfFZQCplE3XWsP+SUJyd5XAUFC9lFgTjjXJF2GMne/UML14iEmkAaDfFg==", "dev": true, "requires": { "graceful-fs": "^4.2.10", "nested-error-stacks": "^2.1.1", "p-event": "^5.0.1" } }, "cpy": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/cpy/-/cpy-10.1.0.tgz", "integrity": "sha512-VC2Gs20JcTyeQob6UViBLnyP0bYHkBh6EiKzot9vi2DmeGlFT9Wd7VG3NBrkNx/jYvFBeyDOMMHdHQhbtKLgHQ==", "dev": true, "requires": { "arrify": "^3.0.0", "cp-file": "^10.0.0", "globby": "^13.1.4", "junk": "^4.0.1", "micromatch": "^4.0.5", "nested-error-stacks": "^2.1.1", "p-filter": "^3.0.0", "p-map": "^6.0.0" }, "dependencies": { "globby": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "requires": { "dir-glob": "^3.0.1", "fast-glob": "^3.3.0", "ignore": "^5.2.4", "merge2": "^1.4.1", "slash": "^4.0.0" } }, "slash": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true } } }, "cpy-cli": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cpy-cli/-/cpy-cli-5.0.0.tgz", "integrity": "sha512-fb+DZYbL9KHc0BC4NYqGRrDIJZPXUmjjtqdw4XRRg8iV8dIfghUX/WiL+q4/B/KFTy3sK6jsbUhBaz0/Hxg7IQ==", "dev": true, "requires": { "cpy": "^10.1.0", "meow": "^12.0.1" } }, "create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==", "dev": true, "requires": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.9", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "prompts": "^2.0.1" } }, "create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, "crelt": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==", "dev": true }, "cross-spawn": { "version": "7.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", "which": "^2.0.1" } }, "crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true }, "cssom": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz", "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==", "dev": true }, "cssstyle": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", "dev": true, "requires": { "cssom": "~0.3.6" }, "dependencies": { "cssom": { "version": "0.3.8", "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", "dev": true } } }, "csstype": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.8.tgz", "integrity": "sha512-jXKhWqXPmlUeoQnF/EhTtTl4C9SnrxSH/jZUih3jmO6lBKr99rP3/+FmrMj4EFpOXzMtXHAZkd3x0E6h6Fgflw==", "dev": true }, "data-urls": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz", "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==", "dev": true, "requires": { "abab": "^2.0.6", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0" } }, "data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", "integrity": "sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==", "dev": true, "requires": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "data-view-byte-length": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz", "integrity": "sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==", "dev": true, "requires": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-data-view": "^1.0.2" } }, "data-view-byte-offset": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz", "integrity": "sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==", "dev": true, "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-data-view": "^1.0.1" } }, "debug": { "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", "dev": true, "requires": { "ms": "^2.1.3" } }, "decimal.js": { "version": "10.4.3", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", "dev": true }, "decode-named-character-reference": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.1.0.tgz", "integrity": "sha512-Wy+JTSbFThEOXQIR2L6mxJvEs+veIzpmqD7ynWxMXGpnk3smkHQOp6forLdHsKpAMW9iJpaBBIxz285t1n1C3w==", "dev": true, "requires": { "character-entities": "^2.0.0" } }, "dedent": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", "dev": true, "requires": {} }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, "deepmerge": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", "dev": true }, "default-browser": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/default-browser/-/default-browser-5.2.1.tgz", "integrity": "sha512-WY/3TUME0x3KPYdRRxEJJvXRHV4PyPoUsxtZa78lwItwRQRHhd2U9xOscaT/YTf8uCXIAjeJOFBVEh/7FtD8Xg==", "dev": true, "requires": { "bundle-name": "^4.1.0", "default-browser-id": "^5.0.0" } }, "default-browser-id": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/default-browser-id/-/default-browser-id-5.0.0.tgz", "integrity": "sha512-A6p/pu/6fyBcA1TRz/GqWYPViplrftcW2gZC9q79ngNCKAeR/X3gcEdXQHl4KNXV+3wgIJ1CPkJQ3IHM6lcsyA==", "dev": true }, "define-data-property": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "requires": { "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "gopd": "^1.0.1" } }, "define-lazy-prop": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz", "integrity": "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==", "dev": true }, "define-properties": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "requires": { "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } }, "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", "dev": true }, "dequal": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true }, "detect-libc": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", "dev": true, "optional": true }, "detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", "dev": true }, "devlop": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", "dev": true, "requires": { "dequal": "^2.0.0" } }, "diff": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", "dev": true }, "diff-sequences": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "requires": { "path-type": "^4.0.0" } }, "doctrine": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "domexception": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz", "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", "dev": true, "requires": { "webidl-conversions": "^7.0.0" } }, "dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "electron-to-chromium": { "version": "1.5.97", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.97.tgz", "integrity": "sha512-HKLtaH02augM7ZOdYRuO19rWDeY+QSJ1VxnXFa/XDFLf07HvM90pALIJFgrO+UVaajI3+aJMMpojoUTLZyQ7JQ==", "dev": true }, "emittery": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", "dev": true }, "entities": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { "version": "1.23.9", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.9.tgz", "integrity": "sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.2", "arraybuffer.prototype.slice": "^1.0.4", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "data-view-buffer": "^1.0.2", "data-view-byte-length": "^1.0.2", "data-view-byte-offset": "^1.0.1", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.1.0", "es-to-primitive": "^1.3.0", "function.prototype.name": "^1.1.8", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.0", "get-symbol-description": "^1.1.0", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "internal-slot": "^1.1.0", "is-array-buffer": "^3.0.5", "is-callable": "^1.2.7", "is-data-view": "^1.0.2", "is-regex": "^1.2.1", "is-shared-array-buffer": "^1.0.4", "is-string": "^1.1.1", "is-typed-array": "^1.1.15", "is-weakref": "^1.1.0", "math-intrinsics": "^1.1.0", "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.7", "own-keys": "^1.0.1", "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.3", "safe-push-apply": "^1.0.0", "safe-regex-test": "^1.1.0", "set-proto": "^1.0.0", "string.prototype.trim": "^1.2.10", "string.prototype.trimend": "^1.0.9", "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.3", "typed-array-byte-length": "^1.0.3", "typed-array-byte-offset": "^1.0.4", "typed-array-length": "^1.0.7", "unbox-primitive": "^1.1.0", "which-typed-array": "^1.1.18" } }, "es-define-property": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", "dev": true }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true }, "es-iterator-helpers": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.1.tgz", "integrity": "sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-set-tostringtag": "^2.0.3", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.6", "globalthis": "^1.0.4", "gopd": "^1.2.0", "has-property-descriptors": "^1.0.2", "has-proto": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "iterator.prototype": "^1.1.4", "safe-array-concat": "^1.1.3" } }, "es-object-atoms": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", "dev": true, "requires": { "es-errors": "^1.3.0" } }, "es-set-tostringtag": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", "dev": true, "requires": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "es-shim-unscopables": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz", "integrity": "sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw==", "dev": true, "requires": { "hasown": "^2.0.2" } }, "es-to-primitive": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "requires": { "is-callable": "^1.2.7", "is-date-object": "^1.0.5", "is-symbol": "^1.0.4" } }, "esast-util-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/esast-util-from-estree/-/esast-util-from-estree-2.0.0.tgz", "integrity": "sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "unist-util-position-from-estree": "^2.0.0" } }, "esast-util-from-js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/esast-util-from-js/-/esast-util-from-js-2.0.1.tgz", "integrity": "sha512-8Ja+rNJ0Lt56Pcf3TAmpBZjmx8ZcK5Ts4cAzIOjsjevg9oSXJnl6SUQ2EevU8tv3h6ZLWmoKL5H4fgWvdvfETw==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "acorn": "^8.0.0", "esast-util-from-estree": "^2.0.0", "vfile-message": "^4.0.0" }, "dependencies": { "acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true } } }, "esbuild": { "version": "0.28.1", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.1.tgz", "integrity": "sha512-HrJrvZv5ayxBzPfwphOoNzkzOIIlifzk0KJrGK2c8R4+LKpMtpYLQeUdjnwjWv/LZlkH2laZk+4w78pi99D4Vw==", "dev": true, "requires": { "@esbuild/aix-ppc64": "0.28.1", "@esbuild/android-arm": "0.28.1", "@esbuild/android-arm64": "0.28.1", "@esbuild/android-x64": "0.28.1", "@esbuild/darwin-arm64": "0.28.1", "@esbuild/darwin-x64": "0.28.1", "@esbuild/freebsd-arm64": "0.28.1", "@esbuild/freebsd-x64": "0.28.1", "@esbuild/linux-arm": "0.28.1", "@esbuild/linux-arm64": "0.28.1", "@esbuild/linux-ia32": "0.28.1", "@esbuild/linux-loong64": "0.28.1", "@esbuild/linux-mips64el": "0.28.1", "@esbuild/linux-ppc64": "0.28.1", "@esbuild/linux-riscv64": "0.28.1", "@esbuild/linux-s390x": "0.28.1", "@esbuild/linux-x64": "0.28.1", "@esbuild/netbsd-arm64": "0.28.1", "@esbuild/netbsd-x64": "0.28.1", "@esbuild/openbsd-arm64": "0.28.1", "@esbuild/openbsd-x64": "0.28.1", "@esbuild/openharmony-arm64": "0.28.1", "@esbuild/sunos-x64": "0.28.1", "@esbuild/win32-arm64": "0.28.1", "@esbuild/win32-ia32": "0.28.1", "@esbuild/win32-x64": "0.28.1" } }, "esbuild-visualizer": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/esbuild-visualizer/-/esbuild-visualizer-0.7.0.tgz", "integrity": "sha512-Vz22k+G2WT7GuCo7rbhaQwGbZ26lEhwzsctkEdQlu2SVrshoM4hzQeRpu/3DP596a9+9K2JyYsinuC6AC896Og==", "dev": true, "requires": { "open": "^8.4.0", "picomatch": "^4.0.0", "yargs": "^17.6.2" }, "dependencies": { "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", "dev": true }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", "dev": true, "requires": { "is-docker": "^2.0.0" } }, "open": { "version": "8.4.2", "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", "is-wsl": "^2.2.0" } }, "picomatch": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", "dev": true } } }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, "escodegen": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "requires": { "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", "source-map": "~0.6.1" } }, "eslint": { "version": "9.27.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.27.0.tgz", "integrity": "sha512-ixRawFQuMB9DZ7fjU3iGGganFDp3+45bPOdaRurcFHSXO1e/sYwUX/FtQZpLZJR6SjMoJH8hR2pPEAfDyCoU2Q==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", "@eslint/config-array": "^0.20.0", "@eslint/config-helpers": "^0.2.1", "@eslint/core": "^0.14.0", "@eslint/eslintrc": "^3.3.1", "@eslint/js": "9.27.0", "@eslint/plugin-kit": "^0.3.1", "@humanfs/node": "^0.16.6", "@humanwhocodes/module-importer": "^1.0.1", "@humanwhocodes/retry": "^0.4.2", "@types/estree": "^1.0.6", "@types/json-schema": "^7.0.15", "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.6", "debug": "^4.3.2", "escape-string-regexp": "^4.0.0", "eslint-scope": "^8.3.0", "eslint-visitor-keys": "^4.2.0", "espree": "^10.3.0", "esquery": "^1.5.0", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", "file-entry-cache": "^8.0.0", "find-up": "^5.0.0", "glob-parent": "^6.0.2", "ignore": "^5.2.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "json-stable-stringify-without-jsonify": "^1.0.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", "optionator": "^0.9.3" }, "dependencies": { "@eslint/js": { "version": "9.27.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.27.0.tgz", "integrity": "sha512-G5JD9Tu5HJEu4z2Uo4aHY2sLV64B7CDMXxFzqzjl3NKd6RVzSXNoE80jk7Y0lJkTTkjiIhBAqmlYwjuBY3tvpA==", "dev": true }, "glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", "dev": true, "requires": { "is-glob": "^4.0.3" } } } }, "eslint-import-context": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/eslint-import-context/-/eslint-import-context-0.1.6.tgz", "integrity": "sha512-/e2ZNPDLCrU8niIy0pddcvXuoO2YrKjf3NAIX+60mHJBT4yv7mqCqvVdyCW2E720e25e4S/1OSVef4U6efGLFg==", "dev": true, "requires": { "get-tsconfig": "^4.10.1", "stable-hash": "^0.0.5" } }, "eslint-import-resolver-node": { "version": "0.3.9", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "requires": { "debug": "^3.2.7", "is-core-module": "^2.13.0", "resolve": "^1.22.4" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "eslint-import-resolver-typescript": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-4.4.1.tgz", "integrity": "sha512-KHQnjMAn/Hbs1AcMs2YfJTeNoWsaOoMRvJUKr77Y2dv7jNOaT8/IJYlvfN/ZIwTxUsv2B6amwv7u9bt2Vl9lZg==", "dev": true, "requires": { "debug": "^4.4.1", "eslint-import-context": "^0.1.5", "get-tsconfig": "^4.10.1", "is-bun-module": "^2.0.0", "stable-hash": "^0.0.5", "tinyglobby": "^0.2.14", "unrs-resolver": "^1.7.2" } }, "eslint-module-utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz", "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==", "dev": true, "requires": { "debug": "^3.2.7" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "eslint-plugin-import": { "version": "2.31.0", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz", "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==", "dev": true, "requires": { "@rtsao/scc": "^1.1.0", "array-includes": "^3.1.8", "array.prototype.findlastindex": "^1.2.5", "array.prototype.flat": "^1.3.2", "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.9", "eslint-module-utils": "^2.12.0", "hasown": "^2.0.2", "is-core-module": "^2.15.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", "object.fromentries": "^2.0.8", "object.groupby": "^1.0.3", "object.values": "^1.2.0", "semver": "^6.3.1", "string.prototype.trimend": "^1.0.8", "tsconfig-paths": "^3.15.0" }, "dependencies": { "debug": { "version": "3.2.7", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", "dev": true, "requires": { "ms": "^2.1.1" } } } }, "eslint-plugin-jest": { "version": "28.12.0", "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-28.12.0.tgz", "integrity": "sha512-J6zmDp8WiQ9tyvYXE+3RFy7/+l4hraWLzmsabYXyehkmmDd36qV4VQFc7XzcsD8C1PTNt646MSx25bO1mdd9Yw==", "dev": true, "requires": { "@typescript-eslint/utils": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, "eslint-plugin-react": { "version": "7.37.5", "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz", "integrity": "sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA==", "dev": true, "requires": { "array-includes": "^3.1.8", "array.prototype.findlast": "^1.2.5", "array.prototype.flatmap": "^1.3.3", "array.prototype.tosorted": "^1.1.4", "doctrine": "^2.1.0", "es-iterator-helpers": "^1.2.1", "estraverse": "^5.3.0", "hasown": "^2.0.2", "jsx-ast-utils": "^2.4.1 || ^3.0.0", "minimatch": "^3.1.2", "object.entries": "^1.1.9", "object.fromentries": "^2.0.8", "object.values": "^1.2.1", "prop-types": "^15.8.1", "resolve": "^2.0.0-next.5", "semver": "^6.3.1", "string.prototype.matchall": "^4.0.12", "string.prototype.repeat": "^1.0.0" }, "dependencies": { "resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==", "dev": true, "requires": { "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } } } }, "eslint-scope": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.3.0.tgz", "integrity": "sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==", "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^5.2.0" } }, "eslint-visitor-keys": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz", "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==", "dev": true }, "espree": { "version": "10.3.0", "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz", "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==", "dev": true, "requires": { "acorn": "^8.14.0", "acorn-jsx": "^5.3.2", "eslint-visitor-keys": "^4.2.0" }, "dependencies": { "acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true } } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "requires": { "estraverse": "^5.1.0" } }, "esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", "dev": true, "requires": { "estraverse": "^5.2.0" } }, "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", "dev": true }, "estree-util-attach-comments": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-attach-comments/-/estree-util-attach-comments-3.0.0.tgz", "integrity": "sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==", "dev": true, "requires": { "@types/estree": "^1.0.0" } }, "estree-util-build-jsx": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/estree-util-build-jsx/-/estree-util-build-jsx-3.0.1.tgz", "integrity": "sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "estree-walker": "^3.0.0" }, "dependencies": { "estree-walker": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", "dev": true, "requires": { "@types/estree": "^1.0.0" } } } }, "estree-util-is-identifier-name": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/estree-util-is-identifier-name/-/estree-util-is-identifier-name-3.0.0.tgz", "integrity": "sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==", "dev": true }, "estree-util-scope": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/estree-util-scope/-/estree-util-scope-1.0.0.tgz", "integrity": "sha512-2CAASclonf+JFWBNJPndcOpA8EMJwa0Q8LUFJEKqXLW6+qBvbFZuF5gItbQOs/umBUkjviCSDCbBwU2cXbmrhQ==", "dev": true, "requires": { "@types/estree": "^1.0.0", "devlop": "^1.0.0" } }, "estree-util-to-js": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-to-js/-/estree-util-to-js-2.0.0.tgz", "integrity": "sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "astring": "^1.8.0", "source-map": "^0.7.0" }, "dependencies": { "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", "dev": true } } }, "estree-util-visit": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/estree-util-visit/-/estree-util-visit-2.0.0.tgz", "integrity": "sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "@types/unist": "^3.0.0" } }, "estree-walker": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", "human-signals": "^2.1.0", "is-stream": "^2.0.0", "merge-stream": "^2.0.0", "npm-run-path": "^4.0.1", "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" } }, "exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==", "dev": true }, "expect": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz", "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==", "dev": true, "requires": { "@jest/expect-utils": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0" } }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", "dev": true }, "fast-check": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/fast-check/-/fast-check-4.0.0.tgz", "integrity": "sha512-aXLyLemZ7qhLNn2oq+YpjT2Xed21+i29WGAYuyrGbU4r8oinB3i4XR4e62O3NY6qmm5qHEDoc/7d+gMsri3AfA==", "dev": true, "requires": { "pure-rand": "^7.0.0" }, "dependencies": { "pure-rand": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", "dev": true } } }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", "dev": true }, "fast-glob": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", "dev": true }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "requires": { "reusify": "^1.0.4" } }, "fb-watchman": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", "dev": true, "requires": { "bser": "2.1.1" } }, "file-entry-cache": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", "dev": true, "requires": { "flat-cache": "^4.0.0" } }, "fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" } }, "find-up": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", "dev": true, "requires": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" } }, "flat-cache": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", "dev": true, "requires": { "flatted": "^3.2.9", "keyv": "^4.5.4" } }, "flatted": { "version": "3.4.2", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", "dev": true }, "flow-bin": { "version": "0.160.0", "resolved": "https://registry.npmjs.org/flow-bin/-/flow-bin-0.160.0.tgz", "integrity": "sha512-hqb/1z7U9Jv+2hDdslAgdab6D4AUDrYIcF2zH/CKx9YgQtCeHfnzCcypzCNU7xmBm2+Mi9+1hqeB4OQX2adh0A==", "dev": true }, "for-each": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", "dev": true, "requires": { "is-callable": "^1.1.3" } }, "form-data": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "dev": true, "requires": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.4", "mime-types": "^2.1.35" } }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, "function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", "dev": true }, "function.prototype.name": { "version": "1.1.8", "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.8.tgz", "integrity": "sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "functions-have-names": "^1.2.3", "hasown": "^2.0.2", "is-callable": "^1.2.7" } }, "functions-have-names": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", "dev": true }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", "dev": true, "requires": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "get-package-type": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", "dev": true }, "get-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", "dev": true, "requires": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, "get-symbol-description": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.1.0.tgz", "integrity": "sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==", "dev": true, "requires": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6" } }, "get-tsconfig": { "version": "4.10.1", "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.10.1.tgz", "integrity": "sha512-auHyJ4AgMz7vgS8Hp3N6HXSmlMdUyhSUrfBF16w153rxtLIEOE+HGqaBppczZvnHLqQJfiHotCYpNhl0lUROFQ==", "dev": true, "requires": { "resolve-pkg-maps": "^1.0.0" } }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.1.1", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { "version": "16.5.0", "resolved": "https://registry.npmjs.org/globals/-/globals-16.5.0.tgz", "integrity": "sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==", "dev": true }, "globalthis": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz", "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==", "dev": true, "requires": { "define-properties": "^1.2.1", "gopd": "^1.0.1" } }, "gopd": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", "dev": true }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "has-bigints": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", "dev": true }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, "has-property-descriptors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { "es-define-property": "^1.0.0" } }, "has-proto": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.2.0.tgz", "integrity": "sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==", "dev": true, "requires": { "dunder-proto": "^1.0.0" } }, "has-symbols": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true }, "has-tostringtag": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dev": true, "requires": { "has-symbols": "^1.0.3" } }, "hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "dev": true, "requires": { "function-bind": "^1.1.2" } }, "hast-util-to-estree": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/hast-util-to-estree/-/hast-util-to-estree-3.1.3.tgz", "integrity": "sha512-48+B/rJWAp0jamNbAAf9M7Uf//UVqAoMmgXhBdxTDJLGKY+LRnZ99qcG+Qjl5HfMpYNzS5v4EAwVEF34LeAj7w==", "dev": true, "requires": { "@types/estree": "^1.0.0", "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-attach-comments": "^3.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "zwitch": "^2.0.0" } }, "hast-util-to-jsx-runtime": { "version": "2.3.6", "resolved": "https://registry.npmjs.org/hast-util-to-jsx-runtime/-/hast-util-to-jsx-runtime-2.3.6.tgz", "integrity": "sha512-zl6s8LwNyo1P9uw+XJGvZtdFF1GdAkOg8ujOw+4Pyb76874fLps4ueHXDhXWdk6YHQ6OgUtinliG7RsYvCbbBg==", "dev": true, "requires": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "@types/unist": "^3.0.0", "comma-separated-tokens": "^2.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "hast-util-whitespace": "^3.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "property-information": "^7.0.0", "space-separated-tokens": "^2.0.0", "style-to-js": "^1.0.0", "unist-util-position": "^5.0.0", "vfile-message": "^4.0.0" } }, "hast-util-whitespace": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/hast-util-whitespace/-/hast-util-whitespace-3.0.0.tgz", "integrity": "sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==", "dev": true, "requires": { "@types/hast": "^3.0.0" } }, "hosted-git-info": { "version": "2.8.9", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", "dev": true }, "html-encoding-sniffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", "dev": true, "requires": { "whatwg-encoding": "^2.0.0" } }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-proxy-agent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", "dev": true, "requires": { "@tootallnate/once": "2", "agent-base": "6", "debug": "4" } }, "https-proxy-agent": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", "dev": true, "requires": { "agent-base": "6", "debug": "4" } }, "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", "dev": true }, "iconv-lite": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "import-local": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "indent-string": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, "inline-style-parser": { "version": "0.2.4", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz", "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==", "dev": true }, "internal-slot": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz", "integrity": "sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==", "dev": true, "requires": { "es-errors": "^1.3.0", "hasown": "^2.0.2", "side-channel": "^1.1.0" } }, "is-alphabetical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphabetical/-/is-alphabetical-2.0.1.tgz", "integrity": "sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==", "dev": true }, "is-alphanumerical": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-alphanumerical/-/is-alphanumerical-2.0.1.tgz", "integrity": "sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==", "dev": true, "requires": { "is-alphabetical": "^2.0.0", "is-decimal": "^2.0.0" } }, "is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", "integrity": "sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-async-function": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.1.1.tgz", "integrity": "sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==", "dev": true, "requires": { "async-function": "^1.0.0", "call-bound": "^1.0.3", "get-proto": "^1.0.1", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "is-bigint": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "requires": { "has-bigints": "^1.0.2" } }, "is-boolean-object": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.2.tgz", "integrity": "sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==", "dev": true, "requires": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "is-bun-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-bun-module/-/is-bun-module-2.0.0.tgz", "integrity": "sha512-gNCGbnnnnFAUGKeZ9PdbyeGYJqewpmc2aKHUEMO5nQPWU9lOmv7jcmQIv+qHD8fXW6W7qfuCwX4rY9LNRjXrkQ==", "dev": true, "requires": { "semver": "^7.7.1" }, "dependencies": { "semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true } } }, "is-callable": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", "dev": true }, "is-core-module": { "version": "2.16.1", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", "dev": true, "requires": { "hasown": "^2.0.2" } }, "is-data-view": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.2.tgz", "integrity": "sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==", "dev": true, "requires": { "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "is-typed-array": "^1.1.13" } }, "is-date-object": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.1.0.tgz", "integrity": "sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==", "dev": true, "requires": { "call-bound": "^1.0.2", "has-tostringtag": "^1.0.2" } }, "is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", "integrity": "sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==", "dev": true }, "is-docker": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-finalizationregistry": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz", "integrity": "sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==", "dev": true, "requires": { "call-bound": "^1.0.3" } }, "is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, "is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", "dev": true }, "is-generator-function": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", "dev": true, "requires": { "call-bound": "^1.0.3", "get-proto": "^1.0.0", "has-tostringtag": "^1.0.2", "safe-regex-test": "^1.1.0" } }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-hexadecimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-hexadecimal/-/is-hexadecimal-2.0.1.tgz", "integrity": "sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==", "dev": true }, "is-inside-container": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", "dev": true, "requires": { "is-docker": "^3.0.0" } }, "is-map": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", "dev": true }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.1.tgz", "integrity": "sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==", "dev": true, "requires": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "is-plain-obj": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", "dev": true }, "is-potential-custom-element-name": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", "dev": true }, "is-reference": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", "dev": true, "requires": { "@types/estree": "*" } }, "is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", "dev": true, "requires": { "call-bound": "^1.0.2", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "is-set": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", "dev": true }, "is-shared-array-buffer": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz", "integrity": "sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==", "dev": true, "requires": { "call-bound": "^1.0.3" } }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, "is-string": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.1.tgz", "integrity": "sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==", "dev": true, "requires": { "call-bound": "^1.0.3", "has-tostringtag": "^1.0.2" } }, "is-symbol": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.1.tgz", "integrity": "sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==", "dev": true, "requires": { "call-bound": "^1.0.2", "has-symbols": "^1.1.0", "safe-regex-test": "^1.1.0" } }, "is-typed-array": { "version": "1.1.15", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", "dev": true, "requires": { "which-typed-array": "^1.1.16" } }, "is-weakmap": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", "dev": true }, "is-weakref": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.1.1.tgz", "integrity": "sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==", "dev": true, "requires": { "call-bound": "^1.0.3" } }, "is-weakset": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.4.tgz", "integrity": "sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==", "dev": true, "requires": { "call-bound": "^1.0.3", "get-intrinsic": "^1.2.6" } }, "is-wsl": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", "dev": true, "requires": { "is-inside-container": "^1.0.0" } }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", "dev": true }, "istanbul-lib-instrument": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz", "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==", "dev": true, "requires": { "@babel/core": "^7.12.3", "@babel/parser": "^7.14.7", "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.2.0", "semver": "^6.3.0" } }, "istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "requires": { "istanbul-lib-coverage": "^3.0.0", "make-dir": "^4.0.0", "supports-color": "^7.1.0" } }, "istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", "dev": true, "requires": { "debug": "^4.1.1", "istanbul-lib-coverage": "^3.0.0", "source-map": "^0.6.1" } }, "istanbul-reports": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz", "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==", "dev": true, "requires": { "html-escaper": "^2.0.0", "istanbul-lib-report": "^3.0.0" } }, "iterator.prototype": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.5.tgz", "integrity": "sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==", "dev": true, "requires": { "define-data-property": "^1.1.4", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "get-proto": "^1.0.0", "has-symbols": "^1.1.0", "set-function-name": "^2.0.2" } }, "jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz", "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "requires": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", "import-local": "^3.0.2", "jest-cli": "^29.7.0" } }, "jest-changed-files": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz", "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==", "dev": true, "requires": { "execa": "^5.0.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0" } }, "jest-circus": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz", "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/expect": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "co": "^4.6.0", "dedent": "^1.0.0", "is-generator-fn": "^2.0.0", "jest-each": "^29.7.0", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-runtime": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "p-limit": "^3.1.0", "pretty-format": "^29.7.0", "pure-rand": "^6.0.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-cli": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz", "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==", "dev": true, "requires": { "@jest/core": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "chalk": "^4.0.0", "create-jest": "^29.7.0", "exit": "^0.1.2", "import-local": "^3.0.2", "jest-config": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "yargs": "^17.3.1" } }, "jest-config": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz", "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@jest/test-sequencer": "^29.7.0", "@jest/types": "^29.6.3", "babel-jest": "^29.7.0", "chalk": "^4.0.0", "ci-info": "^3.2.0", "deepmerge": "^4.2.2", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-circus": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-get-type": "^29.6.3", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-runner": "^29.7.0", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "micromatch": "^4.0.4", "parse-json": "^5.2.0", "pretty-format": "^29.7.0", "slash": "^3.0.0", "strip-json-comments": "^3.1.1" }, "dependencies": { "parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", "json-parse-even-better-errors": "^2.3.0", "lines-and-columns": "^1.1.6" } } } }, "jest-diff": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "requires": { "chalk": "^4.0.0", "diff-sequences": "^29.6.3", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "jest-docblock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz", "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz", "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==", "dev": true, "requires": { "@jest/types": "^29.6.3", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "jest-util": "^29.7.0", "pretty-format": "^29.7.0" } }, "jest-environment-jsdom": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz", "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/jsdom": "^20.0.0", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0", "jsdom": "^20.0.0" } }, "jest-environment-node": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz", "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "jest-mock": "^29.7.0", "jest-util": "^29.7.0" } }, "jest-get-type": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true }, "jest-haste-map": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz", "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/graceful-fs": "^4.1.3", "@types/node": "*", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.3.2", "graceful-fs": "^4.2.9", "jest-regex-util": "^29.6.3", "jest-util": "^29.7.0", "jest-worker": "^29.7.0", "micromatch": "^4.0.4", "walker": "^1.0.8" } }, "jest-leak-detector": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz", "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==", "dev": true, "requires": { "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "jest-matcher-utils": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz", "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==", "dev": true, "requires": { "chalk": "^4.0.0", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "pretty-format": "^29.7.0" } }, "jest-message-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz", "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==", "dev": true, "requires": { "@babel/code-frame": "^7.12.13", "@jest/types": "^29.6.3", "@types/stack-utils": "^2.0.0", "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "micromatch": "^4.0.4", "pretty-format": "^29.7.0", "slash": "^3.0.0", "stack-utils": "^2.0.3" } }, "jest-mock": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz", "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "jest-util": "^29.7.0" } }, "jest-pnp-resolver": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", "dev": true, "requires": {} }, "jest-regex-util": { "version": "29.6.3", "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz", "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==", "dev": true }, "jest-resolve": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz", "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==", "dev": true, "requires": { "chalk": "^4.0.0", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-pnp-resolver": "^1.2.2", "jest-util": "^29.7.0", "jest-validate": "^29.7.0", "resolve": "^1.20.0", "resolve.exports": "^2.0.0", "slash": "^3.0.0" } }, "jest-resolve-dependencies": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz", "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==", "dev": true, "requires": { "jest-regex-util": "^29.6.3", "jest-snapshot": "^29.7.0" } }, "jest-runner": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz", "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==", "dev": true, "requires": { "@jest/console": "^29.7.0", "@jest/environment": "^29.7.0", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "emittery": "^0.13.1", "graceful-fs": "^4.2.9", "jest-docblock": "^29.7.0", "jest-environment-node": "^29.7.0", "jest-haste-map": "^29.7.0", "jest-leak-detector": "^29.7.0", "jest-message-util": "^29.7.0", "jest-resolve": "^29.7.0", "jest-runtime": "^29.7.0", "jest-util": "^29.7.0", "jest-watcher": "^29.7.0", "jest-worker": "^29.7.0", "p-limit": "^3.1.0", "source-map-support": "0.5.13" }, "dependencies": { "source-map-support": { "version": "0.5.13", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } } } }, "jest-runtime": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz", "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==", "dev": true, "requires": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", "@jest/globals": "^29.7.0", "@jest/source-map": "^29.6.3", "@jest/test-result": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "cjs-module-lexer": "^1.0.0", "collect-v8-coverage": "^1.0.0", "glob": "^7.1.3", "graceful-fs": "^4.2.9", "jest-haste-map": "^29.7.0", "jest-message-util": "^29.7.0", "jest-mock": "^29.7.0", "jest-regex-util": "^29.6.3", "jest-resolve": "^29.7.0", "jest-snapshot": "^29.7.0", "jest-util": "^29.7.0", "slash": "^3.0.0", "strip-bom": "^4.0.0" } }, "jest-snapshot": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz", "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==", "dev": true, "requires": { "@babel/core": "^7.11.6", "@babel/generator": "^7.7.2", "@babel/plugin-syntax-jsx": "^7.7.2", "@babel/plugin-syntax-typescript": "^7.7.2", "@babel/types": "^7.3.3", "@jest/expect-utils": "^29.7.0", "@jest/transform": "^29.7.0", "@jest/types": "^29.6.3", "babel-preset-current-node-syntax": "^1.0.0", "chalk": "^4.0.0", "expect": "^29.7.0", "graceful-fs": "^4.2.9", "jest-diff": "^29.7.0", "jest-get-type": "^29.6.3", "jest-matcher-utils": "^29.7.0", "jest-message-util": "^29.7.0", "jest-util": "^29.7.0", "natural-compare": "^1.4.0", "pretty-format": "^29.7.0", "semver": "^7.5.3" }, "dependencies": { "semver": { "version": "7.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz", "integrity": "sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==", "dev": true } } }, "jest-util": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz", "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==", "dev": true, "requires": { "@jest/types": "^29.6.3", "@types/node": "*", "chalk": "^4.0.0", "ci-info": "^3.2.0", "graceful-fs": "^4.2.9", "picomatch": "^2.2.3" } }, "jest-validate": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz", "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==", "dev": true, "requires": { "@jest/types": "^29.6.3", "camelcase": "^6.2.0", "chalk": "^4.0.0", "jest-get-type": "^29.6.3", "leven": "^3.1.0", "pretty-format": "^29.7.0" }, "dependencies": { "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", "dev": true } } }, "jest-watcher": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz", "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==", "dev": true, "requires": { "@jest/test-result": "^29.7.0", "@jest/types": "^29.6.3", "@types/node": "*", "ansi-escapes": "^4.2.1", "chalk": "^4.0.0", "emittery": "^0.13.1", "jest-util": "^29.7.0", "string-length": "^4.0.1" } }, "jest-worker": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz", "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==", "dev": true, "requires": { "@types/node": "*", "jest-util": "^29.7.0", "merge-stream": "^2.0.0", "supports-color": "^8.0.0" }, "dependencies": { "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, "requires": { "has-flag": "^4.0.0" } } } }, "jiti": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.14.2", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.2.tgz", "integrity": "sha512-PMSmkqxr106Xa156c2M265Z+FTrPl+oxd/rgOQy2tijQeK5TxQ43psO1ZCwhVOSdnn+RzkzlRz/eY4BgJBYVpg==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "jsdom": { "version": "20.0.3", "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz", "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==", "dev": true, "requires": { "abab": "^2.0.6", "acorn": "^8.8.1", "acorn-globals": "^7.0.0", "cssom": "^0.5.0", "cssstyle": "^2.3.0", "data-urls": "^3.0.2", "decimal.js": "^10.4.2", "domexception": "^4.0.0", "escodegen": "^2.0.0", "form-data": "^4.0.0", "html-encoding-sniffer": "^3.0.0", "http-proxy-agent": "^5.0.0", "https-proxy-agent": "^5.0.1", "is-potential-custom-element-name": "^1.0.1", "nwsapi": "^2.2.2", "parse5": "^7.1.1", "saxes": "^6.0.0", "symbol-tree": "^3.2.4", "tough-cookie": "^4.1.2", "w3c-xmlserializer": "^4.0.0", "webidl-conversions": "^7.0.0", "whatwg-encoding": "^2.0.0", "whatwg-mimetype": "^3.0.0", "whatwg-url": "^11.0.0", "ws": "^8.11.0", "xml-name-validator": "^4.0.0" }, "dependencies": { "acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true }, "tough-cookie": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "requires": { "psl": "^1.1.33", "punycode": "^2.1.1", "universalify": "^0.2.0", "url-parse": "^1.5.3" } }, "universalify": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz", "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==", "dev": true } } }, "jsesc": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true }, "json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, "json-schema": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, "jsonml-html": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/jsonml-html/-/jsonml-html-1.2.1.tgz", "integrity": "sha512-cLEJ3EvUskBRdkJlxPvEmGoPwdlCY1JM0uSM4fgjB91eIgRKyr4fsfvB89suuD1ecns1hsJJZDV80aqzHxdXhg==", "dev": true }, "jsx-ast-utils": { "version": "3.3.5", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz", "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==", "dev": true, "requires": { "array-includes": "^3.1.6", "array.prototype.flat": "^1.3.1", "object.assign": "^4.1.4", "object.values": "^1.1.6" } }, "junk": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/junk/-/junk-4.0.1.tgz", "integrity": "sha512-Qush0uP+G8ZScpGMZvHUiRfI0YBWuB3gVBYlI0v0vvOJt5FLicco+IkP0a50LqTTQhmts/m6tP5SWE+USyIvcQ==", "dev": true }, "keyv": { "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", "dev": true, "requires": { "json-buffer": "3.0.1" } }, "kleur": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz", "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", "dev": true }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", "dev": true, "requires": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" } }, "lilconfig": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.3.tgz", "integrity": "sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==", "dev": true }, "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", "dev": true }, "load-json-file": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^4.0.0", "pify": "^3.0.0", "strip-bom": "^3.0.0" }, "dependencies": { "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", "dev": true, "requires": { "p-locate": "^5.0.0" } }, "lodash": { "version": "4.18.1", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", "dev": true }, "lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, "longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==", "dev": true }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", "dev": true, "requires": { "js-tokens": "^3.0.0 || ^4.0.0" } }, "magic-string": { "version": "0.25.9", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz", "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", "dev": true, "requires": { "sourcemap-codec": "^1.4.8" } }, "make-dir": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "requires": { "semver": "^7.5.3" }, "dependencies": { "semver": { "version": "7.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", "dev": true } } }, "make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "make-synchronous": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/make-synchronous/-/make-synchronous-0.1.1.tgz", "integrity": "sha512-Y4SxxqhaoyMDokJQ0AZz0E+bLhRkOSR7Z/IQoTKPdS6HYi3aobal2kMHoHHoqBadPWjf07P4K1FQLXOx3wf9Yw==", "dev": true, "requires": { "subsume": "^3.0.0", "type-fest": "^0.16.0" }, "dependencies": { "type-fest": { "version": "0.16.0", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz", "integrity": "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg==", "dev": true } } }, "makeerror": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", "dev": true, "requires": { "tmpl": "1.0.5" } }, "markdown-extensions": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/markdown-extensions/-/markdown-extensions-2.0.0.tgz", "integrity": "sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==", "dev": true }, "marked": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/marked/-/marked-11.2.0.tgz", "integrity": "sha512-HR0m3bvu0jAPYiIvLUUQtdg1g6D247//lvcekpHO1WMvbwDlwSkZAX9Lw4F4YHE1T0HaaNve0tuAWuV1UJ6vtw==", "dev": true }, "marked-highlight": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/marked-highlight/-/marked-highlight-2.2.3.tgz", "integrity": "sha512-FCfZRxW/msZAiasCML4isYpxyQWKEEx44vOgdn5Kloae+Qc3q4XR7WjpKKf8oMLk7JP9ZCRd2vhtclJFdwxlWQ==", "dev": true, "requires": {} }, "math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", "dev": true }, "mdast-util-from-markdown": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.2.tgz", "integrity": "sha512-uZhTV/8NBuw0WHkPTrCqDOl0zVe1BIng5ZtHoDk49ME1qqcjYmmLmOf0gELgcRMxN4w2iuIeVso5/6QymSrgmA==", "dev": true, "requires": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "mdast-util-to-string": "^4.0.0", "micromark": "^4.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-stringify-position": "^4.0.0" } }, "mdast-util-mdx": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx/-/mdast-util-mdx-3.0.0.tgz", "integrity": "sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==", "dev": true, "requires": { "mdast-util-from-markdown": "^2.0.0", "mdast-util-mdx-expression": "^2.0.0", "mdast-util-mdx-jsx": "^3.0.0", "mdast-util-mdxjs-esm": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "mdast-util-mdx-expression": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdx-expression/-/mdast-util-mdx-expression-2.0.1.tgz", "integrity": "sha512-J6f+9hUp+ldTZqKRSg7Vw5V6MqjATc+3E4gf3CFNcuZNWD8XdyI6zQ8GqH7f8169MM6P7hMBRDVGnn7oHB9kXQ==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "mdast-util-mdx-jsx": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/mdast-util-mdx-jsx/-/mdast-util-mdx-jsx-3.2.0.tgz", "integrity": "sha512-lj/z8v0r6ZtsN/cGNNtemmmfoLAFZnjMbNyLzBafjzikOM+glrjNHPlf6lQDOTccj9n5b0PPihEBbhneMyGs1Q==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "ccount": "^2.0.0", "devlop": "^1.1.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0", "parse-entities": "^4.0.0", "stringify-entities": "^4.0.0", "unist-util-stringify-position": "^4.0.0", "vfile-message": "^4.0.0" } }, "mdast-util-mdxjs-esm": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mdast-util-mdxjs-esm/-/mdast-util-mdxjs-esm-2.0.1.tgz", "integrity": "sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==", "dev": true, "requires": { "@types/estree-jsx": "^1.0.0", "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "devlop": "^1.0.0", "mdast-util-from-markdown": "^2.0.0", "mdast-util-to-markdown": "^2.0.0" } }, "mdast-util-phrasing": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/mdast-util-phrasing/-/mdast-util-phrasing-4.1.0.tgz", "integrity": "sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==", "dev": true, "requires": { "@types/mdast": "^4.0.0", "unist-util-is": "^6.0.0" } }, "mdast-util-to-hast": { "version": "13.2.1", "resolved": "https://registry.npmjs.org/mdast-util-to-hast/-/mdast-util-to-hast-13.2.1.tgz", "integrity": "sha512-cctsq2wp5vTsLIcaymblUriiTcZd0CwWtCbLvrOzYCDZoWyMNV8sZ7krj09FSnsiJi3WVsHLM4k6Dq/yaPyCXA==", "dev": true, "requires": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "@ungap/structured-clone": "^1.0.0", "devlop": "^1.0.0", "micromark-util-sanitize-uri": "^2.0.0", "trim-lines": "^3.0.0", "unist-util-position": "^5.0.0", "unist-util-visit": "^5.0.0", "vfile": "^6.0.0" } }, "mdast-util-to-markdown": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/mdast-util-to-markdown/-/mdast-util-to-markdown-2.1.2.tgz", "integrity": "sha512-xj68wMTvGXVOKonmog6LwyJKrYXZPvlwabaryTjLh9LuvovB/KAH+kvi8Gjj+7rJjsFi23nkUxRQv1KqSroMqA==", "dev": true, "requires": { "@types/mdast": "^4.0.0", "@types/unist": "^3.0.0", "longest-streak": "^3.0.0", "mdast-util-phrasing": "^4.0.0", "mdast-util-to-string": "^4.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-decode-string": "^2.0.0", "unist-util-visit": "^5.0.0", "zwitch": "^2.0.0" } }, "mdast-util-to-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", "dev": true, "requires": { "@types/mdast": "^4.0.0" } }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", "integrity": "sha1-htcJCzDORV1j+64S3aUaR93K+bI=", "dev": true }, "meow": { "version": "12.1.1", "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", "dev": true }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", "dev": true }, "merge2": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true }, "micromark": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", "dev": true, "requires": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-core-commonmark": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", "dev": true, "requires": { "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-destination": "^2.0.0", "micromark-factory-label": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-factory-title": "^2.0.0", "micromark-factory-whitespace": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-classify-character": "^2.0.0", "micromark-util-html-tag-name": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-extension-mdx-expression": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-expression/-/micromark-extension-mdx-expression-3.0.1.tgz", "integrity": "sha512-dD/ADLJ1AeMvSAKBwO22zG22N4ybhe7kFIZ3LsDI0GlsNr2A3KYxb0LdC1u5rj4Nw+CHKY0RVdnHX8vj8ejm4Q==", "dev": true, "requires": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-extension-mdx-jsx": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-jsx/-/micromark-extension-mdx-jsx-3.0.2.tgz", "integrity": "sha512-e5+q1DjMh62LZAJOnDraSSbDMvGJ8x3cbjygy2qFEi7HCeUT4BDKCvMozPozcD6WmOt6sVvYDNBKhFSz3kjOVQ==", "dev": true, "requires": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "estree-util-is-identifier-name": "^3.0.0", "micromark-factory-mdx-expression": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "micromark-extension-mdx-md": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdx-md/-/micromark-extension-mdx-md-2.0.0.tgz", "integrity": "sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==", "dev": true, "requires": { "micromark-util-types": "^2.0.0" } }, "micromark-extension-mdxjs": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs/-/micromark-extension-mdxjs-3.0.0.tgz", "integrity": "sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==", "dev": true, "requires": { "acorn": "^8.0.0", "acorn-jsx": "^5.0.0", "micromark-extension-mdx-expression": "^3.0.0", "micromark-extension-mdx-jsx": "^3.0.0", "micromark-extension-mdx-md": "^2.0.0", "micromark-extension-mdxjs-esm": "^3.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-types": "^2.0.0" }, "dependencies": { "acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true } } }, "micromark-extension-mdxjs-esm": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/micromark-extension-mdxjs-esm/-/micromark-extension-mdxjs-esm-3.0.0.tgz", "integrity": "sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==", "dev": true, "requires": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "micromark-factory-destination": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", "dev": true, "requires": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-factory-label": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", "dev": true, "requires": { "devlop": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-factory-mdx-expression": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-factory-mdx-expression/-/micromark-factory-mdx-expression-2.0.3.tgz", "integrity": "sha512-kQnEtA3vzucU2BkrIa8/VaSAsP+EJ3CKOvhMuJgOEGg9KDC6OAY6nSnNDVRiVNRqj7Y4SlSzcStaH/5jge8JdQ==", "dev": true, "requires": { "@types/estree": "^1.0.0", "devlop": "^1.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-events-to-acorn": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "unist-util-position-from-estree": "^2.0.0", "vfile-message": "^4.0.0" } }, "micromark-factory-space": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", "dev": true, "requires": { "micromark-util-character": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-factory-title": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", "dev": true, "requires": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-factory-whitespace": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", "dev": true, "requires": { "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-character": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", "dev": true, "requires": { "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-chunked": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", "dev": true, "requires": { "micromark-util-symbol": "^2.0.0" } }, "micromark-util-classify-character": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", "dev": true, "requires": { "micromark-util-character": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-combine-extensions": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", "dev": true, "requires": { "micromark-util-chunked": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-decode-numeric-character-reference": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", "dev": true, "requires": { "micromark-util-symbol": "^2.0.0" } }, "micromark-util-decode-string": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", "dev": true, "requires": { "decode-named-character-reference": "^1.0.0", "micromark-util-character": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "micromark-util-encode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", "dev": true }, "micromark-util-events-to-acorn": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/micromark-util-events-to-acorn/-/micromark-util-events-to-acorn-2.0.3.tgz", "integrity": "sha512-jmsiEIiZ1n7X1Rr5k8wVExBQCg5jy4UXVADItHmNk1zkwEVhBuIUKRu3fqv+hs4nxLISi2DQGlqIOGiFxgbfHg==", "dev": true, "requires": { "@types/estree": "^1.0.0", "@types/unist": "^3.0.0", "devlop": "^1.0.0", "estree-util-visit": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0", "vfile-message": "^4.0.0" } }, "micromark-util-html-tag-name": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", "dev": true }, "micromark-util-normalize-identifier": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", "dev": true, "requires": { "micromark-util-symbol": "^2.0.0" } }, "micromark-util-resolve-all": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", "dev": true, "requires": { "micromark-util-types": "^2.0.0" } }, "micromark-util-sanitize-uri": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", "dev": true, "requires": { "micromark-util-character": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-symbol": "^2.0.0" } }, "micromark-util-subtokenize": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", "dev": true, "requires": { "devlop": "^1.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "micromark-util-symbol": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", "dev": true }, "micromark-util-types": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", "dev": true }, "micromatch": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "microtime": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/microtime/-/microtime-3.1.1.tgz", "integrity": "sha512-to1r7o24cDsud9IhN6/8wGmMx5R2kT0w2Xwm5okbYI3d1dk6Xv0m+Z+jg2vS9pt+ocgQHTCtgs/YuyJhySzxNg==", "dev": true, "requires": { "node-addon-api": "^5.0.0", "node-gyp-build": "^4.4.0" } }, "mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", "dev": true }, "mime-types": { "version": "2.1.35", "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", "dev": true, "requires": { "mime-db": "1.52.0" } }, "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, "minimatch": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "nanoid": { "version": "3.3.11", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "dev": true }, "nanospinner": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/nanospinner/-/nanospinner-1.2.2.tgz", "integrity": "sha512-Zt/AmG6qRU3e+WnzGGLuMCEAO/dAu45stNbHY223tUxldaDAeE+FxSPsd9Q+j+paejmm0ZbrNVs5Sraqy3dRxA==", "dev": true, "requires": { "picocolors": "^1.1.1" } }, "napi-postinstall": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.2.3.tgz", "integrity": "sha512-Mi7JISo/4Ij2tDZ2xBE2WH+/KvVlkhA6juEjpEeRAVPNCpN3nxJo/5FhDNKgBcdmcmhaH6JjgST4xY/23ZYK0w==", "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "nested-error-stacks": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.1.tgz", "integrity": "sha512-9iN1ka/9zmX1ZvLV9ewJYEk9h7RyRRtqdK0woXcqohu8EWIerfPUjYJPg0ULy0UqP7cslmdGc8xKDJcojlKiaw==", "dev": true }, "next": { "version": "15.5.18", "resolved": "https://registry.npmjs.org/next/-/next-15.5.18.tgz", "integrity": "sha512-eKL8zUJkX9Y5lE+RX/2YJoItVdGlIscyVyboeD9wSpp0PaGqjoA4tTpT2qPqz9ax+5IzGESyLSeZ/RCwbSZ2uQ==", "dev": true, "requires": { "@next/env": "15.5.18", "@next/swc-darwin-arm64": "15.5.18", "@next/swc-darwin-x64": "15.5.18", "@next/swc-linux-arm64-gnu": "15.5.18", "@next/swc-linux-arm64-musl": "15.5.18", "@next/swc-linux-x64-gnu": "15.5.18", "@next/swc-linux-x64-musl": "15.5.18", "@next/swc-win32-arm64-msvc": "15.5.18", "@next/swc-win32-x64-msvc": "15.5.18", "@swc/helpers": "0.5.15", "caniuse-lite": "^1.0.30001579", "postcss": "8.4.31", "sharp": "^0.34.3", "styled-jsx": "5.1.6" } }, "next-sitemap": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/next-sitemap/-/next-sitemap-4.2.3.tgz", "integrity": "sha512-vjdCxeDuWDzldhCnyFCQipw5bfpl4HmZA7uoo3GAaYGjGgfL4Cxb1CiztPuWGmS+auYs7/8OekRS8C2cjdAsjQ==", "dev": true, "requires": { "@corex/deepmerge": "^4.0.43", "@next/env": "^13.4.3", "fast-glob": "^3.2.12", "minimist": "^1.2.8" }, "dependencies": { "@next/env": { "version": "13.5.8", "resolved": "https://registry.npmjs.org/@next/env/-/env-13.5.8.tgz", "integrity": "sha512-YmiG58BqyZ2FjrF2+5uZExL2BrLr8RTQzLXNDJ8pJr0O+rPlOeDPXp1p1/4OrR3avDidzZo3D8QO2cuDv1KCkw==", "dev": true } } }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-addon-api": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-5.1.0.tgz", "integrity": "sha512-eh0GgfEkpnoWDq+VY8OyvYhFEzBk6jIYbRKdIlyTiAXIVJ8PyBaKb0rp7oDtoddbdoHWhq8wwr+XZ81F1rpNdA==", "dev": true }, "node-gyp-build": { "version": "4.8.2", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.2.tgz", "integrity": "sha512-IRUxE4BVsHWXkV/SFOut4qTlagw2aM8T5/vnTsmrHJvVoKueJHRc/JaFND7QDDc61kLYUJ6qlZM3sqTSyx2dTw==", "dev": true }, "node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", "dev": true }, "node-releases": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" }, "dependencies": { "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true } } }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, "npm-run-all": { "version": "4.1.5", "resolved": "https://registry.npmjs.org/npm-run-all/-/npm-run-all-4.1.5.tgz", "integrity": "sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "chalk": "^2.4.1", "cross-spawn": "^6.0.5", "memorystream": "^0.3.1", "minimatch": "^3.0.4", "pidtree": "^0.3.0", "read-pkg": "^3.0.0", "shell-quote": "^1.6.1", "string.prototype.padend": "^3.0.0" }, "dependencies": { "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "cross-spawn": { "version": "6.0.6", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" } }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", "dev": true }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } } } }, "npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", "dev": true, "requires": { "path-key": "^3.0.0" } }, "nwsapi": { "version": "2.2.7", "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", "dev": true }, "object-inspect": { "version": "1.13.4", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.7", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.7.tgz", "integrity": "sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0", "has-symbols": "^1.1.0", "object-keys": "^1.1.1" } }, "object.entries": { "version": "1.1.9", "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.9.tgz", "integrity": "sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.4", "define-properties": "^1.2.1", "es-object-atoms": "^1.1.1" } }, "object.fromentries": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2", "es-object-atoms": "^1.0.0" } }, "object.groupby": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-abstract": "^1.23.2" } }, "object.values": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.1.tgz", "integrity": "sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "onetime": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "requires": { "mimic-fn": "^2.1.0" } }, "open": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/open/-/open-10.1.0.tgz", "integrity": "sha512-mnkeQ1qP5Ue2wd+aivTD3NHd/lZ96Lu0jgf0pwktLPtx6cTZiH7tyeGRRHs0zX0rbrahXPnXlUnbeXyaBBuIaw==", "dev": true, "requires": { "default-browser": "^5.2.1", "define-lazy-prop": "^3.0.0", "is-inside-container": "^1.0.0", "is-wsl": "^3.1.0" } }, "optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", "dev": true, "requires": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "own-keys": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/own-keys/-/own-keys-1.0.1.tgz", "integrity": "sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==", "dev": true, "requires": { "get-intrinsic": "^1.2.6", "object-keys": "^1.1.1", "safe-push-apply": "^1.0.0" } }, "p-event": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", "dev": true, "requires": { "p-timeout": "^5.0.2" } }, "p-filter": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-filter/-/p-filter-3.0.0.tgz", "integrity": "sha512-QtoWLjXAW++uTX67HZQz1dbTpqBfiidsB6VtQUC9iR85S120+s0T5sO6s+B5MLzFcZkrEd/DGMmCjR+f2Qpxwg==", "dev": true, "requires": { "p-map": "^5.1.0" }, "dependencies": { "p-map": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "requires": { "aggregate-error": "^4.0.0" } } } }, "p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", "dev": true, "requires": { "yocto-queue": "^0.1.0" } }, "p-locate": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", "dev": true, "requires": { "p-limit": "^3.0.2" } }, "p-map": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-6.0.0.tgz", "integrity": "sha512-T8BatKGY+k5rU+Q/GTYgrEf2r4xRMevAN5mtXc2aPc4rS1j3s+vWTaO2Wag94neXuCAUAs8cxBL9EeB5EA6diw==", "dev": true }, "p-timeout": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", "dev": true }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" } }, "parse-entities": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.2.tgz", "integrity": "sha512-GG2AQYWoLgL877gQIKeRPGO1xF9+eG1ujIb5soS5gPvLQ1y2o8FL90w2QWNdf9I361Mpp7726c+lj3U0qK1uGw==", "dev": true, "requires": { "@types/unist": "^2.0.0", "character-entities-legacy": "^3.0.0", "character-reference-invalid": "^2.0.0", "decode-named-character-reference": "^1.0.0", "is-alphanumerical": "^2.0.0", "is-decimal": "^2.0.0", "is-hexadecimal": "^2.0.0" }, "dependencies": { "@types/unist": { "version": "2.0.11", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-2.0.11.tgz", "integrity": "sha512-CmBKiL6NNo/OqgmMn95Fk9Whlp2mtvIv+KNpQKN2F4SjvrEesubTRWGYSg+BnWZOnlCaSTU1sMpsBOzgbYhnsA==", "dev": true } } }, "parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "requires": { "error-ex": "^1.3.1", "json-parse-better-errors": "^1.0.1" } }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", "dev": true, "requires": { "entities": "^4.4.0" } }, "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", "dev": true }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", "dev": true }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true }, "picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pidtree": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/pidtree/-/pidtree-0.3.1.tgz", "integrity": "sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==", "dev": true }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha512-C3FsVNH1udSEX48gGX1xfvwTWfsYWj5U+8/uK15BGzIGrKoUpghX8hWZwa/OFnakBiiVNmBvemTJR5mcy7iPcg==", "dev": true }, "pirates": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", "dev": true, "requires": { "find-up": "^4.0.0" }, "dependencies": { "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" } }, "locate-path": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, "requires": { "p-locate": "^4.1.0" } }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, "requires": { "p-limit": "^2.2.0" } } } }, "platform": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.6.tgz", "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==", "dev": true }, "possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", "dev": true }, "postcss": { "version": "8.4.31", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.31.tgz", "integrity": "sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==", "dev": true, "requires": { "nanoid": "^3.3.6", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" } }, "prelude-ls": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, "prettier": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.5.0.tgz", "integrity": "sha512-quyMrVt6svPS7CjQ9gKb3GLEX/rl3BCL2oa/QkNcXv4YNVBC9olt3s+H7ukto06q7B1Qz46PbrKLO34PR6vXcA==", "dev": true }, "pretty-format": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "requires": { "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, "dependencies": { "ansi-styles": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true }, "react-is": { "version": "18.3.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true } } }, "prismjs": { "version": "1.30.0", "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.30.0.tgz", "integrity": "sha512-DEvV2ZF2r2/63V+tK8hQvrR2ZGn10srHbXviTlcv7Kpzw8jWiNTqbVgjO3IY8RxrrOUF8VPMQQFysYYYv0YZxw==", "dev": true }, "prompts": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz", "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==", "dev": true, "requires": { "kleur": "^3.0.3", "sisteransi": "^1.0.5" } }, "prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", "dev": true, "requires": { "loose-envify": "^1.4.0", "object-assign": "^4.1.1", "react-is": "^16.13.1" } }, "property-information": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-7.0.0.tgz", "integrity": "sha512-7D/qOz/+Y4X/rzSB6jKxKUsQnphO046ei8qxG59mtM3RG3DHgTK81HrxrmoDVINJb8NKT5ZsRbwHvQ6B68Iyhg==", "dev": true }, "psl": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "punycode": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true }, "pure-rand": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz", "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==", "dev": true }, "querystringify": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", "dev": true }, "queue-microtask": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, "random-seed": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/random-seed/-/random-seed-0.3.0.tgz", "integrity": "sha512-y13xtn3kcTlLub3HKWXxJNeC2qK4mB59evwZ5EkeRlolx+Bp2ztF7LbcZmyCnOqlHQrLnfuNbi1sVmm9lPDlDA==", "dev": true, "requires": { "json-stringify-safe": "^5.0.1" } }, "randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", "dev": true, "requires": { "safe-buffer": "^5.1.0" } }, "react": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", "dev": true }, "react-dom": { "version": "19.1.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", "dev": true, "requires": { "scheduler": "^0.26.0" } }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, "read-pkg": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", "integrity": "sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==", "dev": true, "requires": { "load-json-file": "^4.0.0", "normalize-package-data": "^2.3.2", "path-type": "^3.0.0" }, "dependencies": { "path-type": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", "dev": true, "requires": { "pify": "^3.0.0" } } } }, "readdirp": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", "dev": true }, "recma-build-jsx": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-build-jsx/-/recma-build-jsx-1.0.0.tgz", "integrity": "sha512-8GtdyqaBcDfva+GUKDr3nev3VpKAhup1+RvkMvUxURHpW7QyIvk9F5wz7Vzo06CEMSilw6uArgRqhpiUcWp8ew==", "dev": true, "requires": { "@types/estree": "^1.0.0", "estree-util-build-jsx": "^3.0.0", "vfile": "^6.0.0" } }, "recma-jsx": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-jsx/-/recma-jsx-1.0.0.tgz", "integrity": "sha512-5vwkv65qWwYxg+Atz95acp8DMu1JDSqdGkA2Of1j6rCreyFUE/gp15fC8MnGEuG1W68UKjM6x6+YTWIh7hZM/Q==", "dev": true, "requires": { "acorn-jsx": "^5.0.0", "estree-util-to-js": "^2.0.0", "recma-parse": "^1.0.0", "recma-stringify": "^1.0.0", "unified": "^11.0.0" } }, "recma-parse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-parse/-/recma-parse-1.0.0.tgz", "integrity": "sha512-OYLsIGBB5Y5wjnSnQW6t3Xg7q3fQ7FWbw/vcXtORTnyaSFscOtABg+7Pnz6YZ6c27fG1/aN8CjfwoUEUIdwqWQ==", "dev": true, "requires": { "@types/estree": "^1.0.0", "esast-util-from-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "recma-stringify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/recma-stringify/-/recma-stringify-1.0.0.tgz", "integrity": "sha512-cjwII1MdIIVloKvC9ErQ+OgAtwHBmcZ0Bg4ciz78FtbT8In39aAYbaA7zvxQ61xVMSPE8WxhLwLbhif4Js2C+g==", "dev": true, "requires": { "@types/estree": "^1.0.0", "estree-util-to-js": "^2.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", "integrity": "sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==", "dev": true, "requires": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-abstract": "^1.23.9", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.7", "get-proto": "^1.0.1", "which-builtin-type": "^1.2.1" } }, "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", "dev": true }, "regenerate-unicode-properties": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", "dev": true, "requires": { "regenerate": "^1.4.0" } }, "regexp.prototype.flags": { "version": "1.5.4", "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz", "integrity": "sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==", "dev": true, "requires": { "call-bind": "^1.0.8", "define-properties": "^1.2.1", "es-errors": "^1.3.0", "get-proto": "^1.0.1", "gopd": "^1.2.0", "set-function-name": "^2.0.2" } }, "regjsgen": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", "dev": true }, "regjsparser": { "version": "0.6.9", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz", "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==", "dev": true, "requires": { "jsesc": "~0.5.0" }, "dependencies": { "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", "dev": true } } }, "rehype-recma": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/rehype-recma/-/rehype-recma-1.0.0.tgz", "integrity": "sha512-lqA4rGUf1JmacCNWWZx0Wv1dHqMwxzsDWYMTowuplHF3xH0N/MmrZ/G3BDZnzAkRmxDadujCjaKM2hqYdCBOGw==", "dev": true, "requires": { "@types/estree": "^1.0.0", "@types/hast": "^3.0.0", "hast-util-to-estree": "^3.0.0" } }, "remark-mdx": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/remark-mdx/-/remark-mdx-3.1.0.tgz", "integrity": "sha512-Ngl/H3YXyBV9RcRNdlYsZujAmhsxwzxpDzpDEhFBVAGthS4GDgnctpDjgFl/ULx5UEDzqtW1cyBSNKqYYrqLBA==", "dev": true, "requires": { "mdast-util-mdx": "^3.0.0", "micromark-extension-mdxjs": "^3.0.0" } }, "remark-parse": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", "dev": true, "requires": { "@types/mdast": "^4.0.0", "mdast-util-from-markdown": "^2.0.0", "micromark-util-types": "^2.0.0", "unified": "^11.0.0" } }, "remark-rehype": { "version": "11.1.2", "resolved": "https://registry.npmjs.org/remark-rehype/-/remark-rehype-11.1.2.tgz", "integrity": "sha512-Dh7l57ianaEoIpzbp0PC9UKAdCSVklD8E5Rpw7ETfbTl3FqcOOgq5q2LVDhgGCkaBv7p24JXikPdvhhmHvKMsw==", "dev": true, "requires": { "@types/hast": "^3.0.0", "@types/mdast": "^4.0.0", "mdast-util-to-hast": "^13.0.0", "unified": "^11.0.0", "vfile": "^6.0.0" } }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "dev": true }, "resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", "dev": true, "requires": { "is-core-module": "^2.16.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } }, "resolve-cwd": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", "dev": true, "requires": { "resolve-from": "^5.0.0" }, "dependencies": { "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true } } }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "resolve-pkg-maps": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true }, "resolve.exports": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.3.tgz", "integrity": "sha512-OcXjMsGdhL4XnbShKpAcSqPMzQoYkYyhbEaeSko47MjRP9NfEQMhZkXL1DoFlt9LWQn4YttrdnV6X2OiyzBi+A==", "dev": true }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, "rollup": { "version": "4.59.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.59.0.tgz", "integrity": "sha512-2oMpl67a3zCH9H79LeMcbDhXW/UmWG/y2zuqnF2jQq5uq9TbM9TVyXvA4+t+ne2IIkBdrLpAaRQAvo7YI/Yyeg==", "dev": true, "requires": { "@rollup/rollup-android-arm-eabi": "4.59.0", "@rollup/rollup-android-arm64": "4.59.0", "@rollup/rollup-darwin-arm64": "4.59.0", "@rollup/rollup-darwin-x64": "4.59.0", "@rollup/rollup-freebsd-arm64": "4.59.0", "@rollup/rollup-freebsd-x64": "4.59.0", "@rollup/rollup-linux-arm-gnueabihf": "4.59.0", "@rollup/rollup-linux-arm-musleabihf": "4.59.0", "@rollup/rollup-linux-arm64-gnu": "4.59.0", "@rollup/rollup-linux-arm64-musl": "4.59.0", "@rollup/rollup-linux-loong64-gnu": "4.59.0", "@rollup/rollup-linux-loong64-musl": "4.59.0", "@rollup/rollup-linux-ppc64-gnu": "4.59.0", "@rollup/rollup-linux-ppc64-musl": "4.59.0", "@rollup/rollup-linux-riscv64-gnu": "4.59.0", "@rollup/rollup-linux-riscv64-musl": "4.59.0", "@rollup/rollup-linux-s390x-gnu": "4.59.0", "@rollup/rollup-linux-x64-gnu": "4.59.0", "@rollup/rollup-linux-x64-musl": "4.59.0", "@rollup/rollup-openbsd-x64": "4.59.0", "@rollup/rollup-openharmony-arm64": "4.59.0", "@rollup/rollup-win32-arm64-msvc": "4.59.0", "@rollup/rollup-win32-ia32-msvc": "4.59.0", "@rollup/rollup-win32-x64-gnu": "4.59.0", "@rollup/rollup-win32-x64-msvc": "4.59.0", "@types/estree": "1.0.8", "fsevents": "~2.3.2" } }, "run-applescript": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==", "dev": true }, "run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", "dev": true, "requires": { "queue-microtask": "^1.2.2" } }, "safe-array-concat": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.3.tgz", "integrity": "sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "get-intrinsic": "^1.2.6", "has-symbols": "^1.1.0", "isarray": "^2.0.5" }, "dependencies": { "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safe-push-apply": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/safe-push-apply/-/safe-push-apply-1.0.0.tgz", "integrity": "sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==", "dev": true, "requires": { "es-errors": "^1.3.0", "isarray": "^2.0.5" }, "dependencies": { "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, "safe-regex-test": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", "dev": true, "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "is-regex": "^1.2.1" } }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "dev": true }, "saxes": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz", "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==", "dev": true, "requires": { "xmlchars": "^2.2.0" } }, "scheduler": { "version": "0.26.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", "dev": true }, "search-insights": { "version": "2.17.3", "resolved": "https://registry.npmjs.org/search-insights/-/search-insights-2.17.3.tgz", "integrity": "sha512-RQPdCYTa8A68uM2jwxoY842xDhvx3E5LFL1LxvxCNMev4o5mLuokczhzjAgGwUZBAmOKZknArSxLKmXtIi2AxQ==", "dev": true, "peer": true }, "secure-json-parse": { "version": "2.7.0", "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.7.0.tgz", "integrity": "sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==", "dev": true }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true }, "serialize-javascript": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" } }, "set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "requires": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2" } }, "set-function-name": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", "dev": true, "requires": { "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "functions-have-names": "^1.2.3", "has-property-descriptors": "^1.0.2" } }, "set-proto": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/set-proto/-/set-proto-1.0.0.tgz", "integrity": "sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==", "dev": true, "requires": { "dunder-proto": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0" } }, "sharp": { "version": "0.34.5", "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.34.5.tgz", "integrity": "sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==", "dev": true, "optional": true, "requires": { "@img/colour": "^1.0.0", "@img/sharp-darwin-arm64": "0.34.5", "@img/sharp-darwin-x64": "0.34.5", "@img/sharp-libvips-darwin-arm64": "1.2.4", "@img/sharp-libvips-darwin-x64": "1.2.4", "@img/sharp-libvips-linux-arm": "1.2.4", "@img/sharp-libvips-linux-arm64": "1.2.4", "@img/sharp-libvips-linux-ppc64": "1.2.4", "@img/sharp-libvips-linux-riscv64": "1.2.4", "@img/sharp-libvips-linux-s390x": "1.2.4", "@img/sharp-libvips-linux-x64": "1.2.4", "@img/sharp-libvips-linuxmusl-arm64": "1.2.4", "@img/sharp-libvips-linuxmusl-x64": "1.2.4", "@img/sharp-linux-arm": "0.34.5", "@img/sharp-linux-arm64": "0.34.5", "@img/sharp-linux-ppc64": "0.34.5", "@img/sharp-linux-riscv64": "0.34.5", "@img/sharp-linux-s390x": "0.34.5", "@img/sharp-linux-x64": "0.34.5", "@img/sharp-linuxmusl-arm64": "0.34.5", "@img/sharp-linuxmusl-x64": "0.34.5", "@img/sharp-wasm32": "0.34.5", "@img/sharp-win32-arm64": "0.34.5", "@img/sharp-win32-ia32": "0.34.5", "@img/sharp-win32-x64": "0.34.5", "detect-libc": "^2.1.2", "semver": "^7.7.3" }, "dependencies": { "semver": { "version": "7.7.3", "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz", "integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==", "dev": true, "optional": true } } }, "shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { "shebang-regex": "^3.0.0" } }, "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { "version": "1.8.4", "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.4.tgz", "integrity": "sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==", "dev": true }, "side-channel": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", "dev": true, "requires": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3", "side-channel-list": "^1.0.0", "side-channel-map": "^1.0.1", "side-channel-weakmap": "^1.0.2" } }, "side-channel-list": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", "dev": true, "requires": { "es-errors": "^1.3.0", "object-inspect": "^1.13.3" } }, "side-channel-map": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", "dev": true, "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3" } }, "side-channel-weakmap": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", "dev": true, "requires": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "sisteransi": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "size-limit": { "version": "11.2.0", "resolved": "https://registry.npmjs.org/size-limit/-/size-limit-11.2.0.tgz", "integrity": "sha512-2kpQq2DD/pRpx3Tal/qRW1SYwcIeQ0iq8li5CJHQgOC+FtPn2BVmuDtzUCgNnpCrbgtfEHqh+iWzxK+Tq6C+RQ==", "dev": true, "requires": { "bytes-iec": "^3.1.1", "chokidar": "^4.0.3", "jiti": "^2.4.2", "lilconfig": "^3.1.3", "nanospinner": "^1.2.2", "picocolors": "^1.1.1", "tinyglobby": "^0.2.11" } }, "slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true }, "smob": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/smob/-/smob-1.4.0.tgz", "integrity": "sha512-MqR3fVulhjWuRNSMydnTlweu38UhQ0HXM4buStD/S3mc/BzX3CuM9OmhyQpmtYCvoYdl5ris6TI0ZqH355Ymqg==", "dev": true }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, "source-map-js": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "source-map-support": { "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" } }, "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", "dev": true }, "space-separated-tokens": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/space-separated-tokens/-/space-separated-tokens-2.0.2.tgz", "integrity": "sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==", "dev": true }, "spdx-correct": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", "dev": true }, "spdx-expression-parse": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.9", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.9.tgz", "integrity": "sha512-Ki212dKK4ogX+xDo4CtOZBVIwhsKBEfsEEcwmJfLQzirgc2jIWdzg40Unxz/HzEUqM1WFzVlQSMF9kZZ2HboLQ==", "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "stable-hash": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/stable-hash/-/stable-hash-0.0.5.tgz", "integrity": "sha512-+L3ccpzibovGXFK+Ap/f8LOS0ahMrHTf3xu7mMLSpEGU0EO9ucaysSylKo9eRDFNhWve/y275iPmIZ4z39a9iA==", "dev": true }, "stack-utils": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", "dev": true, "requires": { "char-regex": "^1.0.2", "strip-ansi": "^6.0.0" } }, "string.prototype.matchall": { "version": "4.0.12", "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.12.tgz", "integrity": "sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.3", "define-properties": "^1.2.1", "es-abstract": "^1.23.6", "es-errors": "^1.3.0", "es-object-atoms": "^1.0.0", "get-intrinsic": "^1.2.6", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "internal-slot": "^1.1.0", "regexp.prototype.flags": "^1.5.3", "set-function-name": "^2.0.2", "side-channel": "^1.1.0" } }, "string.prototype.padend": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/string.prototype.padend/-/string.prototype.padend-3.1.2.tgz", "integrity": "sha512-/AQFLdYvePENU3W5rgurfWSMU6n+Ww8n/3cUt7E+vPBB/D7YDG8x+qjoFs4M/alR2bW7Qg6xMjVwWUOvuQ0XpQ==", "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.3", "es-abstract": "^1.18.0-next.2" } }, "string.prototype.repeat": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz", "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.17.5" } }, "string.prototype.trim": { "version": "1.2.10", "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.10.tgz", "integrity": "sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-data-property": "^1.1.4", "define-properties": "^1.2.1", "es-abstract": "^1.23.5", "es-object-atoms": "^1.0.0", "has-property-descriptors": "^1.0.2" } }, "string.prototype.trimend": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.9.tgz", "integrity": "sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==", "dev": true, "requires": { "call-bind": "^1.0.8", "call-bound": "^1.0.2", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "string.prototype.trimstart": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "requires": { "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-object-atoms": "^1.0.0" } }, "stringify-entities": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/stringify-entities/-/stringify-entities-4.0.4.tgz", "integrity": "sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==", "dev": true, "requires": { "character-entities-html4": "^2.0.0", "character-entities-legacy": "^3.0.0" } }, "strip-ansi": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, "requires": { "ansi-regex": "^5.0.1" } }, "strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", "dev": true }, "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", "dev": true }, "strip-json-comments": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, "style-mod": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==", "dev": true }, "style-to-js": { "version": "1.1.16", "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz", "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==", "dev": true, "requires": { "style-to-object": "1.0.8" } }, "style-to-object": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz", "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==", "dev": true, "requires": { "inline-style-parser": "0.2.4" } }, "styled-jsx": { "version": "5.1.6", "resolved": "https://registry.npmjs.org/styled-jsx/-/styled-jsx-5.1.6.tgz", "integrity": "sha512-qSVyDTeMotdvQYoHWLNGwRFJHC+i+ZvdBRYosOFgC+Wg1vx4frN2/RG/NA7SYqqvKNLf39P2LSRA2pu6n0XYZA==", "dev": true, "requires": { "client-only": "0.0.1" } }, "subsume": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/subsume/-/subsume-3.0.0.tgz", "integrity": "sha512-6n/UfV8UWKwJNO8OAOiKntwEMihuBeeoJfzpL542C+OuvT4iWG9SwjrXkOmsxjb4SteHUsos9SvrdqZ9+ICwTQ==", "dev": true, "requires": { "escape-string-regexp": "^2.0.0", "unique-string": "^2.0.0" }, "dependencies": { "escape-string-regexp": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", "dev": true } } }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, "requires": { "has-flag": "^4.0.0" } }, "supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, "swr": { "version": "2.3.4", "resolved": "https://registry.npmjs.org/swr/-/swr-2.3.4.tgz", "integrity": "sha512-bYd2lrhc+VarcpkgWclcUi92wYCpOgMws9Sd1hG1ntAu0NEy+14CbotuFjshBU2kt9rYj9TSmDcybpxpeTU1fg==", "dev": true, "requires": { "dequal": "^2.0.3", "use-sync-external-store": "^1.4.0" } }, "symbol-tree": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", "dev": true }, "terser": { "version": "5.19.2", "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, "dependencies": { "acorn": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true } } }, "test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", "dev": true, "requires": { "@istanbuljs/schema": "^0.1.2", "glob": "^7.1.4", "minimatch": "^3.0.4" } }, "throttleit": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-2.1.0.tgz", "integrity": "sha512-nt6AMGKW1p/70DF/hGBdJB57B8Tspmbp5gfJ8ilhLnt7kkr2ye7hzD6NVG8GGErk2HWF34igrL2CXmNIkzKqKw==", "dev": true }, "tinyglobby": { "version": "0.2.17", "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "requires": { "fdir": "^6.5.0", "picomatch": "^4.0.4" }, "dependencies": { "fdir": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "requires": {} }, "picomatch": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true } } }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" } }, "tr46": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz", "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "dev": true, "requires": { "punycode": "^2.1.1" } }, "transducers-js": { "version": "0.4.174", "resolved": "https://registry.npmjs.org/transducers-js/-/transducers-js-0.4.174.tgz", "integrity": "sha1-1YYsEO/0vj0zIqv2u3QuMPG7b8Q=", "dev": true }, "trim-lines": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/trim-lines/-/trim-lines-3.0.1.tgz", "integrity": "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==", "dev": true }, "trough": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", "dev": true }, "ts-api-utils": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.5.0.tgz", "integrity": "sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA==", "dev": true, "requires": {} }, "ts-node": { "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "requires": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", "@tsconfig/node12": "^1.0.7", "@tsconfig/node14": "^1.0.0", "@tsconfig/node16": "^1.0.2", "acorn": "^8.4.1", "acorn-walk": "^8.1.1", "arg": "^4.1.0", "create-require": "^1.1.0", "diff": "^4.0.1", "make-error": "^1.1.1", "v8-compile-cache-lib": "^3.0.1", "yn": "3.1.1" }, "dependencies": { "acorn": { "version": "8.14.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "dev": true } } }, "tsconfig-paths": { "version": "3.15.0", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz", "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==", "dev": true, "requires": { "@types/json5": "^0.0.29", "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" }, "dependencies": { "json5": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", "dev": true, "requires": { "minimist": "^1.2.0" } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true } } }, "tslib": { "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true }, "tstyche": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/tstyche/-/tstyche-5.0.2.tgz", "integrity": "sha512-5XoNS1qIHr7w2QkpCx9WOJD69soaxaeqzY3DNOb+trLWjJowzKVZ9L7tSLWxXnwZQ9vKPTq4F41gUd99371aXg==", "dev": true, "requires": {} }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", "dev": true, "requires": { "prelude-ls": "^1.2.1" } }, "type-detect": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "type-fest": { "version": "0.21.3", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", "dev": true }, "typed-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", "dev": true, "requires": { "call-bound": "^1.0.3", "es-errors": "^1.3.0", "is-typed-array": "^1.1.14" } }, "typed-array-byte-length": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz", "integrity": "sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==", "dev": true, "requires": { "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.14" } }, "typed-array-byte-offset": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz", "integrity": "sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==", "dev": true, "requires": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-proto": "^1.2.0", "is-typed-array": "^1.1.15", "reflect.getprototypeof": "^1.0.9" } }, "typed-array-length": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "requires": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", "is-typed-array": "^1.1.13", "possible-typed-array-names": "^1.0.0", "reflect.getprototypeof": "^1.0.6" } }, "typescript": { "version": "5.7.3", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "dev": true }, "typescript-eslint": { "version": "8.61.1", "resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.61.1.tgz", "integrity": "sha512-V7PayAfJokV3pEHgN7/v03D1SpujhRfQtYLbLIiBfDDncdg4PAiRBfoS4cnCANK4jmAPncczi59QO3afiXUlNw==", "dev": true, "requires": { "@typescript-eslint/eslint-plugin": "8.61.1", "@typescript-eslint/parser": "8.61.1", "@typescript-eslint/typescript-estree": "8.61.1", "@typescript-eslint/utils": "8.61.1" } }, "unbox-primitive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.1.0.tgz", "integrity": "sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==", "dev": true, "requires": { "call-bound": "^1.0.3", "has-bigints": "^1.0.2", "has-symbols": "^1.1.0", "which-boxed-primitive": "^1.1.1" } }, "undici-types": { "version": "7.16.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", "dev": true }, "unicode-match-property-ecmascript": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^1.0.4", "unicode-property-aliases-ecmascript": "^1.0.4" } }, "unicode-match-property-value-ecmascript": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", "dev": true }, "unicode-property-aliases-ecmascript": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", "dev": true }, "unified": { "version": "11.0.5", "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", "dev": true, "requires": { "@types/unist": "^3.0.0", "bail": "^2.0.0", "devlop": "^1.0.0", "extend": "^3.0.0", "is-plain-obj": "^4.0.0", "trough": "^2.0.0", "vfile": "^6.0.0" } }, "unique-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, "requires": { "crypto-random-string": "^2.0.0" } }, "unist-util-is": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.0.tgz", "integrity": "sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==", "dev": true, "requires": { "@types/unist": "^3.0.0" } }, "unist-util-position": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-position/-/unist-util-position-5.0.0.tgz", "integrity": "sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==", "dev": true, "requires": { "@types/unist": "^3.0.0" } }, "unist-util-position-from-estree": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unist-util-position-from-estree/-/unist-util-position-from-estree-2.0.0.tgz", "integrity": "sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==", "dev": true, "requires": { "@types/unist": "^3.0.0" } }, "unist-util-stringify-position": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", "dev": true, "requires": { "@types/unist": "^3.0.0" } }, "unist-util-visit": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.0.0.tgz", "integrity": "sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==", "dev": true, "requires": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0", "unist-util-visit-parents": "^6.0.0" } }, "unist-util-visit-parents": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.1.tgz", "integrity": "sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==", "dev": true, "requires": { "@types/unist": "^3.0.0", "unist-util-is": "^6.0.0" } }, "unrs-resolver": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.7.2.tgz", "integrity": "sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==", "dev": true, "requires": { "@unrs/resolver-binding-darwin-arm64": "1.7.2", "@unrs/resolver-binding-darwin-x64": "1.7.2", "@unrs/resolver-binding-freebsd-x64": "1.7.2", "@unrs/resolver-binding-linux-arm-gnueabihf": "1.7.2", "@unrs/resolver-binding-linux-arm-musleabihf": "1.7.2", "@unrs/resolver-binding-linux-arm64-gnu": "1.7.2", "@unrs/resolver-binding-linux-arm64-musl": "1.7.2", "@unrs/resolver-binding-linux-ppc64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-gnu": "1.7.2", "@unrs/resolver-binding-linux-riscv64-musl": "1.7.2", "@unrs/resolver-binding-linux-s390x-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-gnu": "1.7.2", "@unrs/resolver-binding-linux-x64-musl": "1.7.2", "@unrs/resolver-binding-wasm32-wasi": "1.7.2", "@unrs/resolver-binding-win32-arm64-msvc": "1.7.2", "@unrs/resolver-binding-win32-ia32-msvc": "1.7.2", "@unrs/resolver-binding-win32-x64-msvc": "1.7.2", "napi-postinstall": "^0.2.2" } }, "update-browserslist-db": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "requires": { "escalade": "^3.2.0", "picocolors": "^1.1.1" } }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", "dev": true, "requires": { "punycode": "^2.1.0" } }, "url-parse": { "version": "1.5.10", "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz", "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==", "dev": true, "requires": { "querystringify": "^2.1.1", "requires-port": "^1.0.0" } }, "use-sync-external-store": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.5.0.tgz", "integrity": "sha512-Rb46I4cGGVBmjamjphe8L/UnvJD+uPPtTkNvX5mZgqdbavhI4EbgIWJiIHXJ8bc/i9EQGPRh4DwEURJ552Do0A==", "dev": true, "requires": {} }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", "dev": true }, "v8-to-istanbul": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", "convert-source-map": "^2.0.0" } }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "vfile": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", "dev": true, "requires": { "@types/unist": "^3.0.0", "vfile-message": "^4.0.0" } }, "vfile-message": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.2.tgz", "integrity": "sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==", "dev": true, "requires": { "@types/unist": "^3.0.0", "unist-util-stringify-position": "^4.0.0" } }, "w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==", "dev": true }, "w3c-xmlserializer": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz", "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==", "dev": true, "requires": { "xml-name-validator": "^4.0.0" } }, "walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", "dev": true, "requires": { "makeerror": "1.0.12" } }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", "dev": true }, "whatwg-encoding": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "dev": true, "requires": { "iconv-lite": "0.6.3" } }, "whatwg-mimetype": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", "dev": true }, "whatwg-url": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz", "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==", "dev": true, "requires": { "tr46": "^3.0.0", "webidl-conversions": "^7.0.0" } }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-boxed-primitive": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz", "integrity": "sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==", "dev": true, "requires": { "is-bigint": "^1.1.0", "is-boolean-object": "^1.2.1", "is-number-object": "^1.1.1", "is-string": "^1.1.1", "is-symbol": "^1.1.1" } }, "which-builtin-type": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.1.tgz", "integrity": "sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==", "dev": true, "requires": { "call-bound": "^1.0.2", "function.prototype.name": "^1.1.6", "has-tostringtag": "^1.0.2", "is-async-function": "^2.0.0", "is-date-object": "^1.1.0", "is-finalizationregistry": "^1.1.0", "is-generator-function": "^1.0.10", "is-regex": "^1.2.1", "is-weakref": "^1.0.2", "isarray": "^2.0.5", "which-boxed-primitive": "^1.1.0", "which-collection": "^1.0.2", "which-typed-array": "^1.1.16" }, "dependencies": { "isarray": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true } } }, "which-collection": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "requires": { "is-map": "^2.0.3", "is-set": "^2.0.3", "is-weakmap": "^2.0.2", "is-weakset": "^2.0.3" } }, "which-typed-array": { "version": "1.1.18", "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.18.tgz", "integrity": "sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==", "dev": true, "requires": { "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.8", "call-bound": "^1.0.3", "for-each": "^0.3.3", "gopd": "^1.2.0", "has-tostringtag": "^1.0.2" } }, "word-wrap": { "version": "1.2.5", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", "dev": true }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write-file-atomic": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, "requires": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" } }, "ws": { "version": "8.18.1", "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz", "integrity": "sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w==", "dev": true, "requires": {} }, "xml-name-validator": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", "dev": true }, "xmlchars": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", "dev": true }, "y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", "dev": true }, "yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", "string-width": "^4.2.3", "y18n": "^5.0.5", "yargs-parser": "^21.1.1" }, "dependencies": { "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, "requires": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "yargs-parser": { "version": "21.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true } } }, "yn": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true }, "zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", "integrity": "sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==", "dev": true, "peer": true }, "zod-to-json-schema": { "version": "3.24.6", "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.24.6.tgz", "integrity": "sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==", "dev": true, "requires": {} }, "zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", "integrity": "sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==", "dev": true } } } immutable-js-immutable-js-6a01d72/package.json000066400000000000000000000113451522056416100213140ustar00rootroot00000000000000{ "name": "immutable", "version": "5.1.9", "description": "Immutable Data Collections", "license": "MIT", "homepage": "https://immutable-js.com", "author": { "name": "Lee Byron", "url": "https://github.com/leebyron" }, "repository": { "type": "git", "url": "git://github.com/immutable-js/immutable-js.git" }, "bugs": { "url": "https://github.com/immutable-js/immutable-js/issues" }, "main": "dist/immutable.js", "module": "dist/immutable.es.js", "types": "dist/immutable.d.ts", "files": [ "dist", "README.md", "LICENSE" ], "keywords": [ "immutable", "persistent", "lazy", "data", "datastructure", "functional", "collection", "stateless", "sequence", "iteration" ], "publishKeys": [ "name", "version", "description", "license", "homepage", "author", "repository", "bugs", "main", "module", "sideEffects", "types", "files", "keywords" ], "engines": { "npm": ">=7.0.0" }, "scripts": { "test": "run-s format lint type-check build test:*", "test:unit": "jest", "test:types": "tstyche", "format": "npm run lint:format -- --write", "lint": "run-s lint:*", "lint:format": "prettier --check \"{__tests__,src,type-definitions,website/src,perf,resources}/**/*{.js,.mjs,.ts,.tsx,.flow,.css}\"", "lint:js": "eslint", "type-check": "run-s type-check:*", "type-check:ts": "tsc --project tsconfig.src.json && tsc --project type-definitions/tsconfig.json && tsc --project __tests__/tsconfig.json", "type-check:flow": "flow check type-definitions/flow-tests --include-warnings", "build": "run-s build:*", "build:clean": "node -e \"require('node:fs').rmSync('dist', { recursive: true, force: true });\"", "build:dist": "rollup -c ./resources/rollup-config.mjs", "build:types": "cpy \"./type-definitions/immutable.*\" dist", "build:prepare": "./resources/prepare-dist.sh", "build:stats": "node ./resources/dist-stats.mjs", "website:build": "cd website && rm -rf out && next build --turbopack && next-sitemap", "website:dev": "cd website && next dev --turbopack", "check-build-output": "node ./resources/check-build-output.mjs", "check-git-clean": "./resources/check-git-clean.sh", "benchmark": "node ./resources/benchmark.js", "publish": "echo 'ONLY PUBLISH VIA CI'; exit 1;" }, "prettier": { "singleQuote": true, "trailingComma": "es5" }, "devDependencies": { "@codemirror/commands": "^6.8.1", "@codemirror/lang-javascript": "^6.2.3", "@codemirror/state": "^6.5.2", "@codemirror/theme-one-dark": "^6.1.2", "@codemirror/view": "^6.36.5", "@docsearch/react": "^4.0.0-beta.5", "@eslint/js": "^9.27.0", "@immutable/devtools": "^2.1.7", "@jest/globals": "^29.7.0", "@mdx-js/loader": "^3.1.0", "@mdx-js/react": "^3.1.0", "@next/mdx": "^15.3.2", "@rollup/plugin-buble": "1.0.3", "@rollup/plugin-commonjs": "29.0.3", "@rollup/plugin-json": "6.1.0", "@rollup/plugin-terser": "^0.4.4", "@rollup/plugin-typescript": "^12.1.2", "@size-limit/esbuild-why": "^11.2.0", "@size-limit/preset-small-lib": "^12.1.0", "@types/mdx": "^2.0.13", "@types/node": "^25.0.0", "@types/prismjs": "^1.26.3", "@types/random-seed": "0.3.5", "@types/react": "19.1.0", "@types/transducers-js": "^0.4.8", "benchmark": "2.1.4", "codemirror": "^6.0.1", "colors": "1.4.0", "cpy-cli": "^5.0.0", "eslint": "^9.27.0", "eslint-import-resolver-typescript": "^4.4.1", "eslint-plugin-import": "^2.31.0", "eslint-plugin-jest": "^28.12.0", "eslint-plugin-react": "^7.37.4", "fast-check": "^4.0.0", "flow-bin": "0.160.0", "globals": "^16.5.0", "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "jsonml-html": "^1.2.0", "make-synchronous": "0.1.1", "marked": "^11.2.0", "marked-highlight": "^2.1.0", "microtime": "3.1.1", "next": "^15.3.2", "next-sitemap": "4.2.3", "npm-run-all": "4.1.5", "prettier": "^3.5.0", "prismjs": "^1.29.0", "random-seed": "0.3.0", "react": "19.1.0", "react-dom": "19.1.0", "rollup": "4.59.0", "size-limit": "^11.2.0", "transducers-js": "0.4.174", "ts-node": "^10.9.2", "tslib": "^2.8.1", "tstyche": "^5.0.2", "typescript": "5.7", "typescript-eslint": "^8.33.0" }, "size-limit": [ { "name": "all", "path": "dist/immutable.es.js", "import": "*", "limit": "20 kB" }, { "name": "List", "path": "dist/immutable.es.js", "import": "{ List }", "limit": "20 kB" }, { "name": "Seq", "path": "dist/immutable.es.js", "import": "{ Seq }", "limit": "20 kB" } ] } immutable-js-immutable-js-6a01d72/perf/000077500000000000000000000000001522056416100177565ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/perf/List.js000066400000000000000000000047121522056416100212330ustar00rootroot00000000000000/* global Immutable */ describe('List', function () { describe('builds from array', function () { var array2 = []; for (var ii = 0; ii < 2; ii++) { array2[ii] = ii; } it('of 2', function () { Immutable.List(array2); }); var array8 = []; for (var ii = 0; ii < 8; ii++) { array8[ii] = ii; } it('of 8', function () { Immutable.List(array8); }); var array32 = []; for (var ii = 0; ii < 32; ii++) { array32[ii] = ii; } it('of 32', function () { Immutable.List(array32); }); var array1024 = []; for (var ii = 0; ii < 1024; ii++) { array1024[ii] = ii; } it('of 1024', function () { Immutable.List(array1024); }); }); describe('pushes into', function () { it('2 times', function () { var list = Immutable.List(); for (var ii = 0; ii < 2; ii++) { list = list.push(ii); } }); it('8 times', function () { var list = Immutable.List(); for (var ii = 0; ii < 8; ii++) { list = list.push(ii); } }); it('32 times', function () { var list = Immutable.List(); for (var ii = 0; ii < 32; ii++) { list = list.push(ii); } }); it('1024 times', function () { var list = Immutable.List(); for (var ii = 0; ii < 1024; ii++) { list = list.push(ii); } }); }); describe('pushes into transient', function () { it('2 times', function () { var list = Immutable.List().asMutable(); for (var ii = 0; ii < 2; ii++) { list = list.push(ii); } list = list.asImmutable(); }); it('8 times', function () { var list = Immutable.List().asMutable(); for (var ii = 0; ii < 8; ii++) { list = list.push(ii); } list = list.asImmutable(); }); it('32 times', function () { var list = Immutable.List().asMutable(); for (var ii = 0; ii < 32; ii++) { list = list.push(ii); } list = list.asImmutable(); }); it('1024 times', function () { var list = Immutable.List().asMutable(); for (var ii = 0; ii < 1024; ii++) { list = list.push(ii); } list = list.asImmutable(); }); }); describe('some', function () { it('100 000 items', () => { const list = Immutable.List(); for (let i = 0; i < 100000; i++) { list.push(i); } list.some((item) => item === 50000); }); }); }); immutable-js-immutable-js-6a01d72/perf/Map.js000066400000000000000000000077301522056416100210400ustar00rootroot00000000000000/* global Immutable */ describe('Map', function () { describe('builds from an object', function () { var obj2 = {}; for (var ii = 0; ii < 2; ii++) { obj2['x' + ii] = ii; } it('of 2', function () { Immutable.Map(obj2); }); var obj8 = {}; for (var ii = 0; ii < 8; ii++) { obj8['x' + ii] = ii; } it('of 8', function () { Immutable.Map(obj8); }); var obj32 = {}; for (var ii = 0; ii < 32; ii++) { obj32['x' + ii] = ii; } it('of 32', function () { Immutable.Map(obj32); }); var obj1024 = {}; for (var ii = 0; ii < 1024; ii++) { obj1024['x' + ii] = ii; } it('of 1024', function () { Immutable.Map(obj1024); }); }); describe('builds from an array', function () { var array2 = []; for (var ii = 0; ii < 2; ii++) { array2[ii] = ['x' + ii, ii]; } it('of 2', function () { Immutable.Map(array2); }); var array8 = []; for (var ii = 0; ii < 8; ii++) { array8[ii] = ['x' + ii, ii]; } it('of 8', function () { Immutable.Map(array8); }); var array32 = []; for (var ii = 0; ii < 32; ii++) { array32[ii] = ['x' + ii, ii]; } it('of 32', function () { Immutable.Map(array32); }); var array1024 = []; for (var ii = 0; ii < 1024; ii++) { array1024[ii] = ['x' + ii, ii]; } it('of 1024', function () { Immutable.Map(array1024); }); }); describe('builds from a List', function () { var list2 = Immutable.List().asMutable(); for (var ii = 0; ii < 2; ii++) { list2 = list2.push(Immutable.List(['x' + ii, ii])); } list2 = list2.asImmutable(); it('of 2', function () { Immutable.Map(list2); }); var list8 = Immutable.List().asMutable(); for (var ii = 0; ii < 8; ii++) { list8 = list8.push(Immutable.List(['x' + ii, ii])); } list8 = list8.asImmutable(); it('of 8', function () { Immutable.Map(list8); }); var list32 = Immutable.List().asMutable(); for (var ii = 0; ii < 32; ii++) { list32 = list32.push(Immutable.List(['x' + ii, ii])); } list32 = list32.asImmutable(); it('of 32', function () { Immutable.Map(list32); }); var list1024 = Immutable.List().asMutable(); for (var ii = 0; ii < 1024; ii++) { list1024 = list1024.push(Immutable.List(['x' + ii, ii])); } list1024 = list1024.asImmutable(); it('of 1024', function () { Immutable.Map(list1024); }); }); describe('merge a map', () => { [2, 8, 32, 1024].forEach((size) => { const obj1 = {}; const obj2 = {}; for (let ii = 0; ii < size; ii++) { obj1['k' + ii] = '1_' + ii; obj2['k' + ii] = '2_' + ii; } const map1 = Immutable.Map(obj1); const map2 = Immutable.Map(obj2); it('of ' + size, () => { map1.merge(map2); }); }); }); // Keys built from "Aa"/"BB" blocks all share the same string hash, so they // pile into a single HashCollisionNode. This is the hash-flooding scenario: // with a plain linear scan it is O(n²) to build or read them all. describe('hash collisions', () => { function collisionKeys(rounds) { let keys = ['']; for (let i = 0; i < rounds; i++) { const next = []; for (let j = 0; j < keys.length; j++) { next.push(keys[j] + 'Aa'); next.push(keys[j] + 'BB'); } keys = next; } return keys; } [8, 10, 12].forEach((rounds) => { const keys = collisionKeys(rounds); const obj = {}; for (let ii = 0; ii < keys.length; ii++) { obj[keys[ii]] = ii; } const map = Immutable.Map(obj); it('builds ' + keys.length + ' colliding keys', () => { Immutable.Map(obj); }); it('reads ' + keys.length + ' colliding keys', () => { for (let ii = 0; ii < keys.length; ii++) { map.get(keys[ii]); } }); }); }); }); immutable-js-immutable-js-6a01d72/perf/Record.js000066400000000000000000000035271522056416100215410ustar00rootroot00000000000000/* global Immutable */ describe('Record', () => { describe('builds from an object', () => { [2, 5, 10, 100, 1000].forEach((size) => { var defaults = {}; var values = {}; for (var ii = 0; ii < size; ii++) { defaults['x' + ii] = null; values['x' + ii] = ii; } var Rec = Immutable.Record(defaults); it('of ' + size, () => { Rec(values); }); }); }); describe('update random using set()', () => { [2, 5, 10, 100, 1000].forEach((size) => { var defaults = {}; var values = {}; for (var ii = 0; ii < size; ii++) { defaults['x' + ii] = null; values['x' + ii] = ii; } var Rec = Immutable.Record(defaults); var rec = Rec(values); var key = 'x' + Math.floor(size / 2); it('of ' + size, () => { rec.set(key, 999); }); }); }); describe('access random using get()', () => { [2, 5, 10, 100, 1000].forEach((size) => { var defaults = {}; var values = {}; for (var ii = 0; ii < size; ii++) { defaults['x' + ii] = null; values['x' + ii] = ii; } var Rec = Immutable.Record(defaults); var rec = Rec(values); var key = 'x' + Math.floor(size / 2); it('of ' + size, () => { rec.get(key); }); }); }); describe('access random using property', () => { [2, 5, 10, 100, 1000].forEach((size) => { var defaults = {}; var values = {}; for (var ii = 0; ii < size; ii++) { defaults['x' + ii] = null; values['x' + ii] = ii; } var Rec = Immutable.Record(defaults); var rec = Rec(values); var key = 'x' + Math.floor(size / 2); it('of ' + size, () => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions rec[key]; }); }); }); }); immutable-js-immutable-js-6a01d72/perf/toJS.js000066400000000000000000000006331522056416100211750ustar00rootroot00000000000000/* global Immutable */ describe('toJS', () => { const array32 = []; for (let ii = 0; ii < 32; ii++) { array32[ii] = ii; } const list = Immutable.List(array32); it('List of 32', () => { Immutable.toJS(list); }); const obj32 = {}; for (let ii = 0; ii < 32; ii++) { obj32[ii] = ii; } const map = Immutable.Map(obj32); it('Map of 32', () => { Immutable.toJS(map); }); }); immutable-js-immutable-js-6a01d72/resources/000077500000000000000000000000001522056416100210345ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/resources/benchmark.js000066400000000000000000000175531522056416100233370ustar00rootroot00000000000000var child_process = require('child_process'); var fs = require('fs'); var path = require('path'); var vm = require('vm'); var Benchmark = require('benchmark'); function promisify(fn) { return function () { return new Promise((resolve, reject) => fn.apply( this, Array.prototype.slice .call(arguments) .concat((err, out) => (err ? reject(err) : resolve(out))) ) ); }; } var exec = promisify(child_process.exec); var readdir = promisify(fs.readdir); var readFile = promisify(fs.readFile); var perfDir = path.resolve(__dirname, '../perf/'); Promise.all([ readFile(path.resolve(__dirname, '../dist/immutable.js'), { encoding: 'utf8', }), exec('git show main:dist/immutable.js'), ]) .then(function (args) { var newSrc = args[0]; var oldSrc = args[1].toString({ encoding: 'utf8' }).slice(0, -1); // wtf, comma? return newSrc === oldSrc ? [newSrc] : [newSrc, oldSrc]; }) .then(function (sources) { return sources.map(function (source) { var sourceExports = {}; var sourceModule = { exports: sourceExports }; vm.runInNewContext( source, { require: require, module: sourceModule, exports: sourceExports, }, 'immutable.js' ); return sourceModule.exports; }); }) .then(function (modules) { return readdir(perfDir) .then(function (filepaths) { return Promise.all( filepaths.map(function (filepath) { return readFile(path.resolve(perfDir, filepath)).then( function (source) { return { path: filepath, source: source, }; } ); }) ); }) .then(function (sources) { var tests = {}; modules.forEach(function (Immutable, version) { sources.forEach(function (source) { var description = []; var beforeStack = []; var beforeFn; var prevBeforeFn; function describe(name, fn) { description.push(name); beforeStack.push(prevBeforeFn); prevBeforeFn = beforeFn; fn(); beforeFn = prevBeforeFn; prevBeforeFn = beforeStack.pop(); description.pop(); } function beforeEach(fn) { beforeFn = !prevBeforeFn ? fn : (function (prevBeforeFn) { return function () { prevBeforeFn(); fn(); }; })(prevBeforeFn); } function it(name, test) { var fullName = description.join(' > ') + ' ' + name; ( tests[fullName] || (tests[fullName] = { description: fullName, tests: [], }) ).tests[version] = { before: beforeFn, test: test, }; } vm.runInNewContext( source.source, { describe: describe, it: it, beforeEach: beforeEach, console: console, Immutable: Immutable, }, source.path ); }); }); // Array<{ // description: String, // tests: Array<{ // before: Function, // test: Function // }> // one per module, [new,old] or just [new] // }> return Object.keys(tests).map(function (key) { return tests[key]; }); }); }) .then(function (tests) { var suites = []; tests.forEach(function (test) { var suite = new Benchmark.Suite(test.description, { onStart: function (event) { console.log(event.currentTarget.name.bold); process.stdout.write(' ...running... '.gray); }, onComplete: function (event) { process.stdout.write('\r\x1B[K'); var stats = Array.prototype.map.call( event.currentTarget, function (target) { return target.stats; } ); function pad(n, s) { return Array(Math.max(0, 1 + n - s.length)).join(' ') + s; } function fmt(b) { return Math.floor(b) .toString() .replace(/\B(?=(\d{3})+(?!\d))/g, ','); } function pct(p) { return Math.floor(p * 10000) / 100 + '%'; } var dualRuns = stats.length === 2; if (dualRuns) { var prevMean = 1 / stats[1].mean; // var prevLow = 1 / (stats[1].mean + stats[1].deviation * 2); // var prevHigh = 1 / (stats[1].mean - stats[1].deviation * 2); // console.log( // (dualRuns ? ' Old: '.bold.gray : ' ') + // ( // pad(9, fmt(prevLow)) + ' ' + // pad(9, fmt(prevMean)) + ' ' + // pad(9, fmt(prevHigh)) + ' ops/sec' // ) // ); var prevLowmoe = 1 / (stats[1].mean + stats[1].moe); var prevHighmoe = 1 / (stats[1].mean - stats[1].moe); console.log( (dualRuns ? ' Old: '.bold.gray : ' ') + (pad(9, fmt(prevLowmoe)) + ' ' + pad(9, fmt(prevMean)) + ' ' + pad(9, fmt(prevHighmoe)) + ' ops/sec') ); } var mean = 1 / stats[0].mean; // var low = 1 / (stats[0].mean + stats[0].deviation * 2); // var high = 1 / (stats[0].mean - stats[0].deviation * 2); // console.log( // (dualRuns ? ' New: '.bold.gray : ' ') + // ( // pad(9, fmt(low)) + ' ' + // pad(9, fmt(mean)) + ' ' + // pad(9, fmt(high)) + ' ops/sec' // ) // ); var lowmoe = 1 / (stats[0].mean + stats[0].moe); var highmoe = 1 / (stats[0].mean - stats[0].moe); console.log( (dualRuns ? ' New: '.bold.gray : ' ') + (pad(9, fmt(lowmoe)) + ' ' + pad(9, fmt(mean)) + ' ' + pad(9, fmt(highmoe)) + ' ops/sec') ); if (dualRuns) { var diffMean = (mean - prevMean) / prevMean; var comparison = event.currentTarget[1].compare( event.currentTarget[0] ); var comparison2 = event.currentTarget[0].compare( event.currentTarget[1] ); console.log(' compare: ' + comparison + ' ' + comparison2); console.log(' diff: ' + pct(diffMean)); function sq(p) { return p * p; } var rme = Math.sqrt( (sq(stats[0].rme / 100) + sq(stats[1].rme / 100)) / 2 ); // console.log('rmeN: ' + stats[0].rme); // console.log('rmeO: ' + stats[1].rme); console.log(' rme: ' + pct(rme)); } // console.log(stats); }, }); test.tests.forEach(function (run) { suite.add({ fn: run.test, onStart: run.before, onCycle: run.before, }); }); suites.push(suite); }); var onBenchComplete; // eslint-disable-next-line @typescript-eslint/no-unused-vars var promise = new Promise(function (_resolve) { onBenchComplete = _resolve; }); Benchmark.invoke(suites, 'run', { onComplete: onBenchComplete }); return onBenchComplete; }) .then(function () { console.log('all done'); }) .catch(function (error) { console.log('ugh', error.stack); }); immutable-js-immutable-js-6a01d72/resources/check-build-output.mjs000066400000000000000000000024171522056416100252630ustar00rootroot00000000000000import fs from 'node:fs'; import path from 'node:path'; const packageJsonContent = JSON.parse(fs.readFileSync('package.json', 'utf8')); // remove "dist/" prefix from the file names const distPrefix = 'dist'; const removeDistPrefix = (file) => path.basename(file); const expectedFiles = [ removeDistPrefix(packageJsonContent.main), removeDistPrefix(packageJsonContent.module), removeDistPrefix(packageJsonContent.types), // extra files that are not in package.json 'immutable.min.js', 'immutable.js.flow', ]; console.log('expected files: ', expectedFiles); const filesInDistDir = fs .readdirSync(distPrefix) .filter((file) => !file.startsWith('.')); // There should be no extra files in the dist directory and all expected files should be present const extraFiles = filesInDistDir.filter( (file) => !expectedFiles.includes(file) ); if (extraFiles.length > 0) { console.error('Extra files found in dist directory:', extraFiles); } const missingFiles = expectedFiles.filter( (file) => !filesInDistDir.includes(file) ); if (missingFiles.length > 0) { console.error('Missing files in dist directory:', missingFiles); } if (extraFiles.length > 0 || missingFiles.length > 0) { process.exit(1); } console.log('All expected files are present in the dist directory.'); immutable-js-immutable-js-6a01d72/resources/check-git-clean.sh000077500000000000000000000004641522056416100243150ustar00rootroot00000000000000#!/bin/bash -e if ! git diff --quiet; then echo " $(tput setf 4)The CI build resulted in additional changed files. Typically this is due to not running $(tput smul)npm test$(tput rmul) locally before submitting a pull request. The following changes were found:$(tput sgr0) "; git diff --exit-code; fi; immutable-js-immutable-js-6a01d72/resources/copyright.mjs000066400000000000000000000003331522056416100235560ustar00rootroot00000000000000import fs from 'fs'; const copyright = fs.readFileSync('./LICENSE', 'utf-8'); const lines = copyright.trim().split('\n'); export default `/**\n * @license\n${lines .map((line) => ` * ${line}`) .join('\n')}\n */`; immutable-js-immutable-js-6a01d72/resources/dist-stats.mjs000066400000000000000000000046421522056416100236540ustar00rootroot00000000000000import fs from 'node:fs/promises'; import { deflate } from 'zlib'; import 'colors'; const VERIFY_AGAINST_VERSION = '4'; const deflateContent = (content) => new Promise((resolve, reject) => deflate(content, (error, out) => (error ? reject(error) : resolve(out))) ); const space = (n, s) => new Array(Math.max(0, 10 + n - (s || '').length)).join(' ') + (s || ''); const bytes = (b) => `${b.toString().replace(/\B(?=(\d{3})+(?!\d))/g, ',')} bytes`; const diff = (n, o) => { const d = n - o; return d === 0 ? '' : d < 0 ? ` ${bytes(d)}`.green : ` +${bytes(d)}`.red; }; const percentage = (s, b) => ` ${Math.floor(10000 * (1 - s / b)) / 100}%`.grey; let bundlephobaInfoCache; async function bundlephobaInfo(key) { if (!bundlephobaInfoCache) { try { const res = await fetch( `https://bundlephobia.com/api/size?package=immutable@${VERIFY_AGAINST_VERSION}` ); if (res.status !== 200) { throw new Error( `Unable to fetch bundlephobia in dist-stats.mjs. Status code is "${res.status}"` ); } bundlephobaInfoCache = await res.json(); } catch (err) { console.error(err.message); throw err; } } return bundlephobaInfoCache[key]; } /** * * @param {PromiseFulfilledResult} promise */ function promiseNumberValue(promise) { if (!promise || !promise.value) { return null; } const value = promise.value; return value === null || typeof value === 'number' ? value : Number(Buffer.byteLength(value, 'utf8')); } Promise.allSettled([ fs.readFile('dist/immutable.js'), fs.readFile('dist/immutable.min.js'), bundlephobaInfo('size'), fs.readFile('dist/immutable.min.js').then(deflateContent), bundlephobaInfo('gzip'), ]).then(([rawNew, minNew, minOld, zipNew, zipOld]) => { console.log(` Raw: ${space(14, bytes(promiseNumberValue(rawNew)).cyan)}`); if (minOld.status === 'fulfilled') { console.log( ` Min: ${space(14, bytes(promiseNumberValue(minNew)).cyan)}${percentage( minNew.value, rawNew.value )}${space(15, diff(promiseNumberValue(minNew), promiseNumberValue(minOld)))}` ); } if (zipOld.status === 'fulfilled') { console.log( ` Zip: ${space(14, bytes(promiseNumberValue(zipNew)).cyan)}${percentage( promiseNumberValue(zipNew), promiseNumberValue(rawNew) )}${space(15, diff(promiseNumberValue(zipNew), promiseNumberValue(zipOld)))}` ); } }); immutable-js-immutable-js-6a01d72/resources/identity.ai000066400000000000000000013453641522056416100232200ustar00rootroot00000000000000%PDF-1.5 %âãÏÓ 1 0 obj <>/OCGs[5 0 R 6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream application/pdf identity Adobe Illustrator CC 2014 (Macintosh) 2014-10-30T16:19:54-07:00 2014-10-30T16:19:54-07:00 2014-10-30T16:19:54-07:00 256 108 JPEG /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAbAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A7vhYuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KpJrfnXytoV2lpq2oR2ly8YlSNw5JQkqG+EHupwgFICm3n7ycl9BY PqkK3dwImhjbkOQnUPEakU+JWBG+NJ4Smup6np+l2Mt9qE621pCAZZnNFFTQfeTTAgBJT+Y3kkWC X51aIWbytAk1HoZEVXZfs12V1OGinh93zCeafqFlqNlDe2My3FpOvOGZDVWGBBFJF/ysjyOZZ4hq 8Je2DGYDmQAhoxqFoae2Giy4Cr2fnryle2F5qFrqUctnYBTeTAPSMPULWq13p2xpHChB+Z/kIwmb 9Mw+mGCFqSfaIJA+z7Y0V4dr2+YWr+af5fswUa1CSTQDjJ3/ANjjwleH3fMJlrPnLyxot5FZ6rqE VpczKHjiflUqWKhtgQBVT1xooAtGavrOmaPYtfancLbWiFVaV6kAsaAbAnrgUC0ntPzK8iXUoih1 u25nYCRjGCT7yBRhorXu+aM1zzl5Y0KaKHVtQjtJZl9SJXDHktaV+EHviAnhRN15g0a10VdbuLpY 9KaOOVbohuPCYqI2oBX4uY7Y0ikmj/NHyBLIsaazCzuQqikm5JoP2caKRH3fMMpwMXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXz7/wA5BD/ncrX/ALZkX/UTNl2Pl8WEuvu/SxbzmUGqoWFR +jdLFabj/Qodxgj0ckkVK/L7yreaPzC1zX9G0zTL9h6WnL+9etTczCoSR6/yx0+kk99pRj3NRlW5 /t/Z1WXlF8kWgAFBrt5QU2oLe27ZEf71tmAMkh/tn61TQvzC13R/LN/oVm/G3vt4p6nlbcv74J/r r08Oo3wmO+7UDtt/Z3/sSbSmU/XKDiv1GYDx+1398JH3s4kHly4D97MPJ4A/LrzxTb9xYfjXIdR7 /wBLKYA/0v8AvAhfJ/lfSNZ8u+Zbi9nlgk0uNLmzWFlUNIIJSA/JWqKqOlMkL5sMsgJcPK5foCh+ WXljSfMutS2mr3M8EEFsbhGhdVJkWVVAbmsgpRvDJEHoGuWSogyP4soHz15gXX/Neo6iG5W88pit W8IIv3cbb9OVORyMRQZ2OR67ft/033PQ/MXmL9O/kXFcyNW6t5YLS7rufVhcLU17svFj88jEVJEj 6SfxzeS3JtxzXifUV5vUJdWXiR+6CIByUqQamvh9JjyHwb8+05A8rl3edUPJlPnhzJpXlEvcLdH9 DN+9B5D4WkATfvHTifcYjr7x97EAGv6sv9w9L83/APkgoP8Atm6X/wATt8Y/W4x+l4/ocnlyPUOO qxXskv1pfq/1SeGONV5inJHjkJ38CMRfD8HKyishF/x7cq57bW+r8qaHYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXhf56aHrN/wCbbaWxsZ7qL9HRxmSKNnUMJ5WIJA60OX4gSGucwLsjcd47 2OeZ/LOvT65bD9GXMkDWWmRyMsT8R6dpCsgJA2oQQcYwLbLNAWCRvXUd6/V/ywv7Gy1OaJXvPTkR NLhiq7mNmDO7KvdR8P3nwy84yHBjqozoX069PJTuvLvmF/Jdqg0u69UaxdzND6T8wjwW/FiKdCVI ykQPLyc2eeJkZWN53zCK0n8rrq7j0i4nD2sMqt+lrd6rIDG7cOKn+daD265fHETTgz1UY2B5e4/2 FLfKvknX7u9ntbmyuLOOWznQTyxsqB+JZKkjoWoMqMCT8XJGeMYncfTXMd6GTT/PGm2uoaQlnexw X4ijvYYrf1klEBqnGUBqU/yDv3wGBB5MxljIXZ5Dly5V8NnoPkXydfWXkjzHJfq8d/qEDm3s1oWH CGQRqaV+Ji/TCRKPLqGk5IZJ2T9Mr/HyYZ5X0jzPptrrDrpN6LqawNtahYXqZJZkBPT9mPkfmMdw eXNncJAbi4+Y57/rUtL/AC+80XlpK6Wj2qsPRkiuJPRZ1Uq9eJjOxYA9euIxz/H9qZ6nANjfL+cP +JNfNVstL83p5X1rSjo16LS8a3uIy0MhAnhcKwBAAq6vU7fsjIiJBHe2TyRkJEHb3jnte6DbQ/Nc 9ulgmj3Bi+stcoZLf025uAtDMx2T22/oxhKqr8fJOXPi4zMG9yase/8AnH7r6Jv5p8k67Yaf5dtE tZrxo7Gb6y9sjSqkk8sj8BTb4eYB3wGMiTt1CMebGKs7VLu6iupCIml/M+88pXeiXllevpMVnBHa xPZCL+5uIBGFdV5NRFPfBEerzTk4eHY7VzND/fFJdO07zfYzlrXSJmMswkpPYJKQSezyK5H0ZIRk BVfj5Lky4pSMhLnK+YHP3T/Q+osx0OxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KpDr0cjX iFVJHpj/AIk2Z2lIEfi6rXRJmPchryGQ3KfCePCOv/ACuWY5Cvm1ZoHiHuH3KbWtFcjc7cB9OSE2 Bxc17Qy/o9BxNfWY0/2K4OIcfwZGB8Mf1v0BatrXgTt/OMJmxGLk61t5CzhgVBRt8ZyC4sZ39y1B eRxyRorem9PUoKg06b4TwkglA4wCByKNsLRTZzmQkOBVVHiAaZTln6hTk4MXoNoW1hlCyngxfj8A HjUDLJyGzRigaO26mltMVPRa7EHJGYYDHJWiS5FlPGY29NipBptyB/pkZGPEDbZES4CK2UPTnKBO GwNa5OxdtfDKqpEXltIkFqq/HRCSR0qWJpleOYJLbmxkRiPJUL6k9k8UqH0AihPhp0Zab/LI1ASs c2d5TAgj01+pCwrcIwATuDuK5bIgtEBIdGWZqnfOxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KpbqUbtOpVSRxHT5nMnCRTh6iJMvgpTwyGZfhJHFK/8CMlGQprnA38mntSquR8X8gxE1OKrcYp fqqjia8yafQMeIcS8J4Pi2trXgTt/OMTNRi5LYIJCzAqQCp3wykEQgVoW5RXQK3FvtUFQae+G4nd FSFhFWtuRby8vtEVA+g5VOe4b8WP0lQgimUSURuRWi0HeuTkRs1QiRey1LaYg7UrsQcJmGIxyXIk 4t5EKHi1CDTuDgJFgsgJcJFLPTnKhOG1a9MlY5sOGVVSpcW8ixwqByopqR7muRjIWWzJjIAXVvGt 2jdT6YUBdvAimD03afWY0eSlGs6EAJ37iuSJBa4iQ6J1mG7J2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxVQnVi4oCdsnEtcwbaZGLDY0oP1YQUEG22gIDEb/y4iSmC3g/pgUNa/wAMb3RRpcsF eJO38wxMkiC1I2JIIIqOuJKBEtcZRVaGh64bC0VWONljavUjpkSd2cY0FNFdQ3wmpFBhJDAAhywy EHt88TIKIlwV+DLxO+NhQDTXCQjjx2rXDYWiueNgFAFaDemAFJiXfvShUg0ptt747LvTSiQdF/DC aQAUTlTc7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FWTf7hv+Xf8A4TAyd/uG/wCXf/hMVd/uG/5d/wDhMVd/ uG/5d/8AhMVd/uG/5d/+ExV3+4b/AJd/+ExV3+4b/l3/AOExV3+4b/l3/wCExV3+4b/l3/4TFXf7 hv8Al3/4TFXf7hv+Xf8A4TFXf7hv+Xf/AITFXf7hv+Xf/hMVd/uG/wCXf/hMVd/uG/5d/wDhMVd/ uG/5d/8AhMVd/uG/5d/+ExV3+4b/AJd/+ExV3+4b/l3/AOExV3+4b/l3/wCExV3+4b/l3/4TFXf7 hv8Al3/4TFXf7hv+Xf8A4TFXf7hv+Xf/AITFXf7hv+Xf/hMVd/uG/wCXf/hMVd/uG/5d/wDhMVd/ uG/5d/8AhMVd/uG/5d/+ExV3+4b/AJd/+ExV3+4b/l3/AOExV3+4b/l3/wCExV//2Q== proof:pdf uuid:65E6390686CF11DBA6E2D887CEACB407 xmp.did:5962c3f6-6a0f-4199-90f1-c6dea6f71387 uuid:15bcb097-31e4-8d46-bdb6-d8c19fdf6524 uuid:1abccb90-0c26-4942-b156-fd2eb962e3e1 xmp.did:58fdc1b8-1448-3a44-9e20-282d8ec1cf95 uuid:65E6390686CF11DBA6E2D887CEACB407 proof:pdf saved xmp.iid:5962c3f6-6a0f-4199-90f1-c6dea6f71387 2014-10-30T16:19:52-07:00 Adobe Illustrator CC 2014 (Macintosh) / Web Document 1 True False 960.000000 560.000000 Pixels Cyan Magenta Yellow Black Default Swatch Group 0 White RGB PROCESS 255 255 255 Black RGB PROCESS 0 0 0 RGB Red RGB PROCESS 255 0 0 RGB Yellow RGB PROCESS 255 255 0 RGB Green RGB PROCESS 0 255 0 RGB Cyan RGB PROCESS 0 255 255 RGB Blue RGB PROCESS 0 0 255 RGB Magenta RGB PROCESS 255 0 255 R=193 G=39 B=45 RGB PROCESS 193 39 45 R=237 G=28 B=36 RGB PROCESS 237 28 36 R=241 G=90 B=36 RGB PROCESS 241 90 36 R=247 G=147 B=30 RGB PROCESS 247 147 30 R=251 G=176 B=59 RGB PROCESS 251 176 59 R=252 G=238 B=33 RGB PROCESS 252 238 33 R=217 G=224 B=33 RGB PROCESS 217 224 33 R=140 G=198 B=63 RGB PROCESS 140 198 63 R=57 G=181 B=74 RGB PROCESS 57 181 74 R=0 G=146 B=69 RGB PROCESS 0 146 69 R=0 G=104 B=55 RGB PROCESS 0 104 55 R=34 G=181 B=115 RGB PROCESS 34 181 115 R=0 G=169 B=157 RGB PROCESS 0 169 157 R=41 G=171 B=226 RGB PROCESS 41 171 226 R=0 G=113 B=188 RGB PROCESS 0 113 188 R=46 G=49 B=146 RGB PROCESS 46 49 146 R=27 G=20 B=100 RGB PROCESS 27 20 100 R=102 G=45 B=145 RGB PROCESS 102 45 145 R=147 G=39 B=143 RGB PROCESS 147 39 143 R=158 G=0 B=93 RGB PROCESS 158 0 93 R=212 G=20 B=90 RGB PROCESS 212 20 90 R=237 G=30 B=121 RGB PROCESS 237 30 121 R=199 G=178 B=153 RGB PROCESS 199 178 153 R=153 G=134 B=117 RGB PROCESS 153 134 117 R=115 G=99 B=87 RGB PROCESS 115 99 87 R=83 G=71 B=65 RGB PROCESS 83 71 65 R=198 G=156 B=109 RGB PROCESS 198 156 109 R=166 G=124 B=82 RGB PROCESS 166 124 82 R=140 G=98 B=57 RGB PROCESS 140 98 57 R=117 G=76 B=36 RGB PROCESS 117 76 36 R=96 G=56 B=19 RGB PROCESS 96 56 19 R=66 G=33 B=11 RGB PROCESS 66 33 11 Grays 1 R=0 G=0 B=0 RGB PROCESS 0 0 0 R=26 G=26 B=26 RGB PROCESS 26 26 26 R=51 G=51 B=51 RGB PROCESS 51 51 51 R=77 G=77 B=77 RGB PROCESS 77 77 77 R=102 G=102 B=102 RGB PROCESS 102 102 102 R=128 G=128 B=128 RGB PROCESS 128 128 128 R=153 G=153 B=153 RGB PROCESS 153 153 153 R=179 G=179 B=179 RGB PROCESS 179 179 179 R=204 G=204 B=204 RGB PROCESS 204 204 204 R=230 G=230 B=230 RGB PROCESS 230 230 230 R=242 G=242 B=242 RGB PROCESS 242 242 242 Web Color Group 1 R=63 G=169 B=245 RGB PROCESS 63 169 245 R=122 G=201 B=67 RGB PROCESS 122 201 67 R=255 G=147 B=30 RGB PROCESS 255 147 30 R=255 G=29 B=37 RGB PROCESS 255 29 37 R=255 G=123 B=172 RGB PROCESS 255 123 172 R=189 G=204 B=212 RGB PROCESS 189 204 212 Adobe PDF library 11.00 endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/ExtGState<>/Properties<>/XObject<>>>/Thumb 20 0 R/TrimBox[0.0 0.0 960.0 560.0]/Type/Page>> endobj 9 0 obj <>stream H‰ìWËŽG¼÷WäTN¾W�lŸc±‡ý€Æ®u˜‘±«ÿAfÖ£[¬dRAÓdUV&“ ’Á§ßžÍÓûgg~z÷l.OÏÿtæúÉ8ÛRäßœåo7æÓõãåéW¼þýÓ¥†lKÊ&ô€ß`ü±)vJ´¾eó¿_þsùù=wÔý½îª·½k³»úhs1KrÖýè¿Æ‡Þ„Öm)ÞÏÅÞ\_/|õzñŽŸ9ór Þ,>ÛX Goc“§ §¤�4Àòn}¹Sy›06‹UelmÛ«¡ÎÝ&~€ÑÿØ™c¶ÕÕǰ�rq¦ãÿB!ø—ù¸¿M¯Ög—p­j³ïÛm–`s0ÜÒÂ|iFl #À×ËÒlkÆ[XŠ‹Ãœ ¡†IñçB¬aüM¶òÉoŠ­I}ÓM³UÖë«á 5lƒ]zYÜv,„ßÁÜ—Ëy÷£Æ­vZ²Ç@I‚ÄRá9‹ˆq÷ȃ�QTßx4æ½m¼¶þ^/xH‹Æåsõa#œÐæû£wFqÑÎ^<„ËŽšÜsUÄ�Cœ¾Á{ä¤z�Þ¬êMúx8™ÎïÓù•®aYcµ�àØjþ»ÞÀ=…hC¦biÖð¾Ô‰l•ˆâ?7 ×À̰ @žf§x›i© 4u¤B̰8±YMU¤/ðŠìû�f f!U°QRVš 3ñxn§E�X–½àÜ�†;¸ÝÒ%„çwöö“|61Õ£½x48“ÎÌn‘‰d•ÎÐqaa|œþ÷6%U^†¢×0-Áþ~„ª/BŽ#ètý�;¨6· ØŠøJú­j‘ÈCàæšÊÍ¡`8q¯—¦! }¸*øº‰ ÈÂD¹^ºu€&4@~E÷ pvef¾¨¶ ®YÑØgl¯DvE3¶gFÅ‚p·ƒ™ŽàF;*b4³4áCöÝ6]'Z#Ä x^±òxlØ$9sÔ|ÊšbE^…0èåøHöCÌüìkÌQ*šªAO T¢­*'­:iÕI«¾ŠVÝ·ÏoH«îûÁiU´ÊiUò_@«ÆâG!(ƒV=˜Õ+­ª'­:iÕ´*¹ïG«úƒÑªvÒª“V�´êkhÕgÚç·£U÷‡ýà´*Z”V¡,6ÖðÐâ/ð`>]?nl+~ ÛŠÅ[&Ûz,«W¶ÕO¶u²­·ØVønl+ùÇb[É�lëd['Ûú*¶uß>¿!Ûº;ìÇd[RøTâ߈PV…�Ù#Eš§´`d_Vµ¾wpÀøúe< Œ tý¹°zÉ1_sÒ� @+ ²–]r¼RM\Ùf£PI œ+¦¦[±k5ñÁ|®·:j[½Ç›ÌleTiÝ©3A$MT^~ÔšÝd¹±võ„òuu‘òuõ�öáU¥ìÓჳ�hìãtˆà.´[Àî> endobj 20 0 obj <>stream 8;Z\u5n8N$$j;VR-9:UhT)'<$0@%\#iB&n#M&p=M`b5lXt>9a/<+@KdI>\';9_Ob?VVFp#qBr 6`>t+Opn?\"-,&u;UKhmW#jb?),s)kWS;mu=QT4(Es1c*Hs+$IogkoB7r@q*WQF\3 W#eMkTStuRhFE':++9f0-UJ(^KFgHU\Km4:!!e-hiW~> endstream endobj 22 0 obj [/Indexed/DeviceRGB 255 23 0 R] endobj 23 0 obj <>stream 8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn 6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 17 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 0.427 0.737 0.859 scn /GS0 gs 271.996 378.559 13.56 -40.02 re f q 1 0 0 1 289.6611 378.5591 cm 0 0 m 10.56 0 l 21 -15.36 l 31.38 0 l 41.94 0 l 41.94 -40.02 l 29.16 -40.02 l 29.16 -25.62 l 21 -37.62 l 12.78 -25.62 l 12.78 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 335.707 378.5591 cm 0 0 m 10.56 0 l 21 -15.36 l 31.38 0 l 41.94 0 l 41.94 -40.02 l 29.16 -40.02 l 29.16 -25.62 l 21 -37.62 l 12.78 -25.62 l 12.78 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 397.1504 337.519 cm 0 0 m -2.52 0 -4.8 0.321 -6.84 0.96 c -8.88 1.6 -10.62 2.56 -12.06 3.84 c -13.5 5.12 -14.61 6.74 -15.39 8.7 c -16.17 10.659 -16.56 12.96 -16.56 15.6 c -16.56 41.04 l -3.78 41.04 l -3.78 16.14 l -3.78 14.739 -3.49 13.67 -2.91 12.93 c -2.331 12.189 -1.36 11.82 0 11.82 c 1.359 11.82 2.33 12.189 2.91 12.93 c 3.489 13.67 3.78 14.739 3.78 16.14 c 3.78 41.04 l 16.62 41.04 l 16.62 15.6 l 16.62 12.96 16.23 10.659 15.45 8.7 c 14.67 6.74 13.55 5.12 12.09 3.84 c 10.629 2.56 8.88 1.6 6.84 0.96 c 4.8 0.321 2.52 0 0 0 c f Q q 1 0 0 1 423.2202 368.0591 cm 0 0 m -7.38 0 l -7.38 10.5 l 20.58 10.5 l 20.58 0 l 13.2 0 l 13.2 -29.52 l 0 -29.52 l h f Q q 1 0 0 1 460.8916 350.959 cm 0 0 m -2.7 7.02 l -5.4 0 l h -7.5 27.6 m 2.1 27.6 l 17.28 -12.42 l 4.68 -12.42 l 3.36 -8.82 l -8.76 -8.82 l -10.08 -12.42 l -22.68 -12.42 l h f Q q 1 0 0 1 493.0215 347.959 cm 0 0 m 3.039 0 4.56 1.16 4.56 3.48 c 4.56 5.799 3.039 6.96 0 6.96 c -1.44 6.96 l -1.44 0 l h 3 18.42 m 3 20.259 1.999 21.18 0 21.18 c -1.44 21.18 l -1.44 15.66 l 0 15.66 l 1.999 15.66 3 16.58 3 18.42 c -13.801 30.6 m 1.859 30.6 l 3.859 30.6 5.689 30.37 7.35 29.91 c 9.009 29.45 10.43 28.77 11.609 27.87 c 12.789 26.97 13.71 25.85 14.369 24.51 c 15.029 23.169 15.359 21.6 15.359 19.8 c 15.359 18.52 15.199 17.43 14.88 16.53 c 14.559 15.63 14.22 14.88 13.859 14.28 c 13.419 13.56 12.919 12.96 12.359 12.48 c 13.239 11.919 14.04 11.199 14.76 10.32 c 15.359 9.56 15.909 8.6 16.409 7.44 c 16.909 6.279 17.159 4.86 17.159 3.18 c 17.159 1.26 16.819 -0.48 16.14 -2.04 c 15.459 -3.6 14.489 -4.93 13.229 -6.03 c 11.97 -7.13 10.43 -7.971 8.609 -8.55 c 6.789 -9.13 4.76 -9.42 2.52 -9.42 c -13.801 -9.42 l h f Q q 1 0 0 1 513.6592 378.5591 cm 0 0 m 13.32 0 l 13.32 -29.52 l 24.36 -29.52 l 24.36 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 539.9697 378.5591 cm 0 0 m 23.58 0 l 23.58 -10.5 l 12.78 -10.5 l 12.78 -14.94 l 23.4 -14.94 l 23.4 -24.9 l 12.78 -24.9 l 12.78 -29.52 l 24 -29.52 l 24 -40.02 l 0 -40.02 l h f Q endstream endobj 18 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 0.427 0.737 0.859 scn /GS0 gs 271.996 398.559 13.56 -40.02 re f q 1 0 0 1 289.6611 398.5591 cm 0 0 m 10.56 0 l 21 -15.36 l 31.38 0 l 41.94 0 l 41.94 -40.02 l 29.16 -40.02 l 29.16 -25.62 l 21 -37.62 l 12.78 -25.62 l 12.78 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 335.707 398.5591 cm 0 0 m 10.56 0 l 21 -15.36 l 31.38 0 l 41.94 0 l 41.94 -40.02 l 29.16 -40.02 l 29.16 -25.62 l 21 -37.62 l 12.78 -25.62 l 12.78 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 397.1504 357.519 cm 0 0 m -2.52 0 -4.8 0.321 -6.84 0.96 c -8.88 1.6 -10.62 2.56 -12.06 3.84 c -13.5 5.12 -14.61 6.74 -15.39 8.7 c -16.17 10.659 -16.56 12.96 -16.56 15.6 c -16.56 41.04 l -3.78 41.04 l -3.78 16.14 l -3.78 14.739 -3.49 13.67 -2.91 12.93 c -2.331 12.189 -1.36 11.82 0 11.82 c 1.359 11.82 2.33 12.189 2.91 12.93 c 3.489 13.67 3.78 14.739 3.78 16.14 c 3.78 41.04 l 16.62 41.04 l 16.62 15.6 l 16.62 12.96 16.23 10.659 15.45 8.7 c 14.67 6.74 13.55 5.12 12.09 3.84 c 10.629 2.56 8.88 1.6 6.84 0.96 c 4.8 0.321 2.52 0 0 0 c f Q q 1 0 0 1 423.2202 388.0591 cm 0 0 m -7.38 0 l -7.38 10.5 l 20.58 10.5 l 20.58 0 l 13.2 0 l 13.2 -29.52 l 0 -29.52 l h f Q q 1 0 0 1 460.8916 370.959 cm 0 0 m -2.7 7.02 l -5.4 0 l h -7.5 27.6 m 2.1 27.6 l 17.28 -12.42 l 4.68 -12.42 l 3.36 -8.82 l -8.76 -8.82 l -10.08 -12.42 l -22.68 -12.42 l h f Q q 1 0 0 1 493.0215 367.959 cm 0 0 m 3.039 0 4.56 1.16 4.56 3.48 c 4.56 5.799 3.039 6.96 0 6.96 c -1.44 6.96 l -1.44 0 l h 3 18.42 m 3 20.259 1.999 21.18 0 21.18 c -1.44 21.18 l -1.44 15.66 l 0 15.66 l 1.999 15.66 3 16.58 3 18.42 c -13.801 30.6 m 1.859 30.6 l 3.859 30.6 5.689 30.37 7.35 29.91 c 9.009 29.45 10.43 28.77 11.609 27.87 c 12.789 26.97 13.71 25.85 14.369 24.51 c 15.029 23.169 15.359 21.6 15.359 19.8 c 15.359 18.52 15.199 17.43 14.88 16.53 c 14.559 15.63 14.22 14.88 13.859 14.28 c 13.419 13.56 12.919 12.96 12.359 12.48 c 13.239 11.919 14.04 11.199 14.76 10.32 c 15.359 9.56 15.909 8.6 16.409 7.44 c 16.909 6.279 17.159 4.86 17.159 3.18 c 17.159 1.26 16.819 -0.48 16.14 -2.04 c 15.459 -3.6 14.489 -4.93 13.229 -6.03 c 11.97 -7.13 10.43 -7.971 8.609 -8.55 c 6.789 -9.13 4.76 -9.42 2.52 -9.42 c -13.801 -9.42 l h f Q q 1 0 0 1 513.6592 398.5591 cm 0 0 m 13.32 0 l 13.32 -29.52 l 24.36 -29.52 l 24.36 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 539.9697 398.5591 cm 0 0 m 23.58 0 l 23.58 -10.5 l 12.78 -10.5 l 12.78 -14.94 l 23.4 -14.94 l 23.4 -24.9 l 12.78 -24.9 l 12.78 -29.52 l 24 -29.52 l 24 -40.02 l 0 -40.02 l h f Q endstream endobj 19 0 obj <>/ExtGState<>>>/Subtype/Form>>stream /CS0 cs 0.427 0.737 0.859 scn /GS0 gs 271.996 418.559 13.56 -40.02 re f q 1 0 0 1 289.6611 418.5591 cm 0 0 m 10.56 0 l 21 -15.36 l 31.38 0 l 41.94 0 l 41.94 -40.02 l 29.16 -40.02 l 29.16 -25.62 l 21 -37.62 l 12.78 -25.62 l 12.78 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 335.707 418.5591 cm 0 0 m 10.56 0 l 21 -15.36 l 31.38 0 l 41.94 0 l 41.94 -40.02 l 29.16 -40.02 l 29.16 -25.62 l 21 -37.62 l 12.78 -25.62 l 12.78 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 397.1504 377.519 cm 0 0 m -2.52 0 -4.8 0.321 -6.84 0.96 c -8.88 1.6 -10.62 2.56 -12.06 3.84 c -13.5 5.12 -14.61 6.74 -15.39 8.7 c -16.17 10.659 -16.56 12.96 -16.56 15.6 c -16.56 41.04 l -3.78 41.04 l -3.78 16.14 l -3.78 14.739 -3.49 13.67 -2.91 12.93 c -2.331 12.189 -1.36 11.82 0 11.82 c 1.359 11.82 2.33 12.189 2.91 12.93 c 3.489 13.67 3.78 14.739 3.78 16.14 c 3.78 41.04 l 16.62 41.04 l 16.62 15.6 l 16.62 12.96 16.23 10.659 15.45 8.7 c 14.67 6.74 13.55 5.12 12.09 3.84 c 10.629 2.56 8.88 1.6 6.84 0.96 c 4.8 0.321 2.52 0 0 0 c f Q q 1 0 0 1 423.2202 408.0591 cm 0 0 m -7.38 0 l -7.38 10.5 l 20.58 10.5 l 20.58 0 l 13.2 0 l 13.2 -29.52 l 0 -29.52 l h f Q q 1 0 0 1 460.8916 390.959 cm 0 0 m -2.7 7.02 l -5.4 0 l h -7.5 27.6 m 2.1 27.6 l 17.28 -12.42 l 4.68 -12.42 l 3.36 -8.82 l -8.76 -8.82 l -10.08 -12.42 l -22.68 -12.42 l h f Q q 1 0 0 1 493.0215 387.959 cm 0 0 m 3.039 0 4.56 1.16 4.56 3.48 c 4.56 5.799 3.039 6.96 0 6.96 c -1.44 6.96 l -1.44 0 l h 3 18.42 m 3 20.259 1.999 21.18 0 21.18 c -1.44 21.18 l -1.44 15.66 l 0 15.66 l 1.999 15.66 3 16.58 3 18.42 c -13.801 30.6 m 1.859 30.6 l 3.859 30.6 5.689 30.37 7.35 29.91 c 9.009 29.45 10.43 28.77 11.609 27.87 c 12.789 26.97 13.71 25.85 14.369 24.51 c 15.029 23.169 15.359 21.6 15.359 19.8 c 15.359 18.52 15.199 17.43 14.88 16.53 c 14.559 15.63 14.22 14.88 13.859 14.28 c 13.419 13.56 12.919 12.96 12.359 12.48 c 13.239 11.919 14.04 11.199 14.76 10.32 c 15.359 9.56 15.909 8.6 16.409 7.44 c 16.909 6.279 17.159 4.86 17.159 3.18 c 17.159 1.26 16.819 -0.48 16.14 -2.04 c 15.459 -3.6 14.489 -4.93 13.229 -6.03 c 11.97 -7.13 10.43 -7.971 8.609 -8.55 c 6.789 -9.13 4.76 -9.42 2.52 -9.42 c -13.801 -9.42 l h f Q q 1 0 0 1 513.6592 418.5591 cm 0 0 m 13.32 0 l 13.32 -29.52 l 24.36 -29.52 l 24.36 -40.02 l 0 -40.02 l h f Q q 1 0 0 1 539.9697 418.5591 cm 0 0 m 23.58 0 l 23.58 -10.5 l 12.78 -10.5 l 12.78 -14.94 l 23.4 -14.94 l 23.4 -24.9 l 12.78 -24.9 l 12.78 -29.52 l 24 -29.52 l 24 -40.02 l 0 -40.02 l h f Q endstream endobj 26 0 obj <> endobj 13 0 obj <> endobj 12 0 obj [/ICCBased 27 0 R] endobj 27 0 obj <>stream H‰œ–yTSwÇoÉž�•°Ãc [€°�5la‘QIBHØADED„ª•2ÖmtFOE�.®c­Ö}êÒõ0êè8´׎�8G�Ng¦Óïï÷9÷wïïÝß½÷�ó '¥ªµÕ0 �Ö ÏJŒÅb¤  2y­.-;!à’ÆK°ZÜ ü‹ž^�i½"LÊÀ0ðÿ‰-×é @8(”µrœ;q®ª7èLöœy¥•&†Qëñq¶4±jž½ç|æ9ÚÄ �V�³)g�B£0ñiœWו8#©8wÕ©•õ8_Å٥ʨQãüÜ«QÊj@é&»A)/ÇÙgº>'K‚óÈtÕ;\ú” Ó¥$ÕºF½ZUnÀÜå˜(4TŒ%)ë«”ƒ0C&¯”阤Z£“i˜¿óœ8¦Úbx‘ƒE¡ÁÁBÑ;…ú¯›¿P¦ÞÎӓ̹žAü om?çW= €x¯Íú·¶Ò-Œ¯Àòæ[›Ëû0ñ¾¾øÎ}ø¦y)7ta¾¾õõõ>j¥ÜÇTÐ7úŸ¿@ï¼ÏÇtÜ›ò`qÊ2™±Ê€™ê&¯®ª6ê±Z�L®Ä„?â_øóyxg)Ë”z¥�ÈçL­UáíÖ*ÔuµSkÿSeØO4?׸¸c¯¯Ø°.òò· åÒR´ ß�Þô-•’2ð5ßáÞüÜÏ ú÷Sá>Ó£V­š‹“då`r£¾n~ÏôY &à+`œ�;ÂA4ˆÉ 䀰ÈA9Ð=¨- t�°lÃ`;»Á~pŒƒ�Á ðGp| ®�[`Lƒ‡`<¯ "A ˆ YA�+äùCb(ЇR¡,¨*�T�2B-Ð ¨ꇆ¡Ðnè÷ÐQètº}MA ï —0Óal»Á¾°Ž�Sàx ¬‚kà&¸^Á£ð>ø0|>_ƒ'á‡ð,ÂG!"F$H:Rˆ”!z¤éF‘Qd?r 9‹\A&‘GÈ ”ˆrQ ¢áhš‹ÊÑ´íE‡Ñ]èaô4z�BgÐ×Á–àE#H ‹*B=¡‹0HØIøˆp†p�0MxJ$ùD1„˜D, V›‰½Ä­ÄÄãÄKÄ»ÄY‰dEò"E�ÒI2’�ÔEÚBÚGúŒt™4MzN¦‘Èþär!YKî ’÷�?%_&ß#¿¢°(®”0J:EAi¤ôQÆ(Ç()Ó”WT6U@� æP+¨íÔ!ê~êêmê�æD ¥eÒÔ´å´!ÚïhŸÓ¦h/èº']B/¢éëèÒ�Ó¿¢?a0nŒhF!ÃÀXÇØÍ8ÅøšñÜŒkæc&5S˜µ™�˜6»lö˜Iaº2c˜K™MÌAæ!æEæ#…寒°d¬VÖë(ëk–Íe‹Øél »—½‡}Ž}ŸCâ¸qâ9 N'çÎ)Î].ÂuæJ¸rî î÷ wšGä xR^¯‡÷[ÞoÆœchžgÞ`>bþ‰ù$á»ñ¥ü*~ÿ ÿ:ÿ¥…�EŒ…Òb�Å~‹ËÏ,m,£-•–Ý–,¯Y¾´Â¬â­*­6X�[ݱF­=­3­ë­·YŸ±~dó ·‘ÛtÛ´¹i ÛzÚfÙ6Û~`{ÁvÖÎÞ.ÑNg·Åî”Ý#{¾}´}…ý€ý§ö¸‘j‡‡ÏþŠ™c1X6„�Æfm“�Ž;'_9 œr�:œ8Ýq¦:‹�ËœœO:ϸ8¸¤¹´¸ìu¹éJq»–»nv=ëúÌMà–ï¶ÊmÜí¾ÀR 4 ö n»3Ü£ÜkÜGݯz=Ä•[=¾ô„=ƒ<Ë=GTB(É/ÙSòƒ,]6*›-•–¾W:#—È7Ë*¢ŠÊe¿ò^YDYÙ}U„j£êAyTù`ù#µD=¬þ¶"©b{ųÊôÊ+¬Ê¯: !kJ4Gµm¥ötµ}uCõ%�—®K7YV³©fFŸ¢ßY Õ.©=bàá?SŒîƕƩºÈº‘ºçõyõ‡Ø Ú† �ž�kï5%4ý¦m–7Ÿlqlio™Z³lG+ÔZÚz²Í¹­³mzyâò]íÔöÊö?uøuôw|¿"űN»Îå�wW&®ÜÛe֥ﺱ*|ÕöÕèjõê‰5k¶¬yÝ­èþ¢Ç¯g°ç‡^yïkEk‡Öþ¸®lÝD_pß¶õÄõÚõ×7DmØÕÏîoê¿»1mãál {àûMśΠnßLÝlÜ<9”úO¤[þ˜¸™$™�™üšhšÕ›B›¯œœ‰œ÷�d�Òž@ž®ŸŸ‹Ÿú i Ø¡G¡¶¢&¢–££v£æ¤V¤Ç¥8¥©¦¦‹¦ý§n§à¨R¨Ä©7©©ªª�««u«é¬\¬Ð­D­¸®-®¡¯¯‹°°u°ê±`±Ö²K²Â³8³®´%´œµµŠ¶¶y¶ð·h·à¸Y¸Ñ¹J¹Âº;ºµ».»§¼!¼›½½�¾ ¾„¾ÿ¿z¿õÀpÀìÁgÁãÂ_ÂÛÃXÃÔÄQÄÎÅKÅÈÆFÆÃÇAÇ¿È=ȼÉ:ɹÊ8Ê·Ë6˶Ì5̵Í5͵Î6ζÏ7ϸÐ9кÑ<ѾÒ?ÒÁÓDÓÆÔIÔËÕNÕÑÖUÖØ×\×àØdØèÙlÙñÚvÚûÛ€ÜÜŠÝÝ–ÞÞ¢ß)߯à6à½áDáÌâSâÛãcãëäsäü儿 æ–çç©è2è¼éFéÐê[êåëpëûì†ííœî(î´ï@ïÌðXðåñrñÿòŒóó§ô4ôÂõPõÞömöû÷Šøø¨ù8ùÇúWúçûwüü˜ý)ýºþKþÜÿmÿÿ ÷„óû endstream endobj 25 0 obj <> endobj 24 0 obj <> endobj 5 0 obj <> endobj 6 0 obj <> endobj 30 0 obj [/View/Design] endobj 31 0 obj <>>> endobj 28 0 obj [/View/Design] endobj 29 0 obj <>>> endobj 14 0 obj <> endobj 15 0 obj <> endobj 16 0 obj <> endobj 11 0 obj <> endobj 32 0 obj <> endobj 33 0 obj <>stream %!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 17.0 %%AI8_CreatorVersion: 18.0.0 %%For: (Lee Byron) () %%Title: (Untitled-1) %%CreationDate: 10/30/14 4:19 PM %%Canvassize: 16383 %%BoundingBox: 83 -268 726 -4 %%HiResBoundingBox: 83.2057291666688 -267.358072916666 725.64453125 -4.17317708333303 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 13.0 %AI12_BuildNumber: 18 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 0 -560 960 0 %AI3_TemplateBox: 480.5 -280.5 480.5 -280.5 %AI3_TileBox: 102 -568 836 8 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 6 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 2 %AI9_OpenToView: 57.5 -4.5 2 1192 711 18 0 0 121 293 0 0 0 1 1 0 1 1 0 1 %AI5_OpenViewLayers: 73 %%PageOrigin:80 -580 %AI7_GridSettings: 72 8 72 8 1 0 0.800000011920929 0.800000011920929 0.800000011920929 0.899999976158142 0.899999976158142 0.899999976158142 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 34 0 obj <>stream %%BoundingBox: 83 -268 726 -4 %%HiResBoundingBox: 83.2057291666688 -267.358072916666 725.64453125 -4.17317708333303 %AI7_Thumbnail: 128 52 8 %%BeginData: 12290 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8AFA8FFA8AFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFFD81A8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFFD04A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFFFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFFD81A8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFFD81A8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFD04A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFFFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFFD81A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFFD81A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFD04A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8FFA8A8 %A8FFA8A8A8FFA8A8A8FFA8A8A8AFA8CAA8FFA8A8A8FFA8A9A8FFA8CBA8FF %A8A8A8FFA8A8A8FFA8CAA8FFA8A8A8FFA8A8A8FFA8CBA8FFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFFFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %AFA8FF7D5252A877527DFFA8FF52527D7D4C7DA8FFA87D527D765252CB76 %52767D5277525252FF7D5252FFA8A85277527D7DFFA2524CA8AFA8527752 %5276FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8 %FFA8AFFD26A87D0027525221277DFF5227007D522700A1AE7D0027275200 %4CA852004C272727280027A85221277DFF7DFD05277DA1002752FFA82821 %270028A8AFFD1EA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF5928277D524C2753A1284B4C595327 %5228A828522752524C4CCB524C4C7D522E27537DA82752277DFFA8275252 %5227537D4C277DFFA9284C2E7D7DFFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8AFA8A8A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A87D272777522728 %27282728277D5227274C272827284C522752A8522752FF7D00277DFF5227 %272827A87D282752272753A8272753FFA8282752527DA8AFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8AFA8FFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %FF5928277D5252274C272E274C53532728275227282752524C4CFF524C28 %AF5928277D8452272E27287DA8274C275227597D4C277DFFAF284C27274C %FFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8 %FFFD26A87D00275352272827280528277D5228272727282727275227287D %52272860592727535A2727282E27527D2827592E27277D272752CA7E5227 %2E527DFD20A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FF5928277D524C5253277D284C597D275252 %285352275352282752272828FF7D28277E524C4B4C4B52277D284C4C5227 %527D524B52277D2852275252FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFFD04A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA87D0027775200525A5959 %27217D4C272784528427272884FD05277EA87D0027524C27525353272727 %4C274B27287DA1004B27274C52274B214CA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFFFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF845A59A8 %7E5A59858484597E848459848485607E59848485597D598484A97E7E597E %7D7E5A85847E7DA8597E597E5AAFA87E59847DA8597E595A7DFFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFFD26A8A9 %6085848560845A845A855AA9848560845A84608584845A85A8855A848484 %6085848560855A845A85A8855A8584845AA9608584FFA8845A858484FD20 %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FF848560AF848584858485608584856085848584856085 %84858485608584FF848560A984858485608584A9848584856085A8856085 %60858485848584FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8A95A8484855A84848584845AA984 %845A8584845A8584A85A855A845AA9A8A85A8584845A8584845A8584845A %85608484A960845A8584845A855A84A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8FF848584A984A9 %848584A9848584A9848584A9848584A9848584AF848584AF848584A9A885 %84A9848584AF848584A984A9A8A984A9A8FF848584A984FFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFFD27A87E8484 %847EFD0684A8FD04847EFD0484A8FD0784A8848484A8FD0684A88484A884 %8484A87E8484A8A8FD0484FD21A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA88584A984A984A984 %AF8485A8AF84A984A9A8A984AFA88584A9848584FFA88584AF848584A984 %8584AF848584A984A9A8A9848584AF848584A984FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFFD04A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A884 %85A8A884A9A8A884A984A8848584A884A9848484A98484848584A8A8A984 %8484A984A884A9848484A9848484A9A8A884A9848484A9848484A9A8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFFF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8A9A8AFA8A9A8AFA8A9A8AFA8A9A8AFA8A9A8AFA8A9A8AF %A8AFA8AFA8FFA8AFA8A9A8AFA8A9A8AFA8AFA8AFA8A9A8AFA8A9A8AFA8AF %A8AFA8A9A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF %A8AFA8FFA8AFFD27A884A8A8A884A884A8A8A884A8A8A884A884A884A8A8 %A884A8A8A884A8A8A884A8A8A884A8A8A884A8A8A884A8A8A884A884A884 %A8A8A884FD23A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A9A8FFA8A9A8FFA8AFA8AFA8AFA8AF %A8AFA8AFA8AFA8AFA8A9A8AFA8FFA8AFA8AFA8AFA8AFA8AFA8AFA8AFA8A9 %A8AFA8AFA8AFA8AFA8AFA8A9A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8 %A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8A9A8A8A8A9A8A8A8 %AFA8A884A9A8A8A8AFA8A8A8A9A8A8A8A9A8A8A8AFA8A884A9A8A884A9A8 %A8A8A9A8A884A9A8A8A8A9A8A8A8A9A8A884A9A8A8A8AFA8A8A8AFA8A8A8 %AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8AFA8FFA8AFA8FF %A8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8AFA8FFA8FFA8FFA8FFA8FFA8AF %A8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FF %FD81A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FF %A8FFA8FFA8FFA8FFA8FFFD04A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AF %A8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8 %A8AFA8A8A8AFA8A8A8AFA8A8A8AFA8A8A8AFFFA8AFA8FFA8AFA8FFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8 %FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8 %AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFA8FFA8AFFD81A8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8FFA8 %FFA8FFA8FFFD81A8FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8 %FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFF %FFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8 %FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFFFFA8FFFF %FFA8FFFFFFA8FFFFFFA8FFFFFFA8FD81FFFF %%EndData endstream endobj 35 0 obj <>stream %AI12_CompressedDataxœì½ëŽe¹u&øûÎü0 5ZǼ“[Ó N\ÜrK– ÉÝ�B:+,e;+³�•e�æéçûÖ"÷…Ü'"ê^=® ª2â�‡››—ÅuýÖßü¿ûÃ/n>}ÿ/�¿ðgsšþæon?<¾úøþÃ/OòééWoß~ùÅÇüèg¿ÿùÉæ³A£›_•OjÃÿþøá‹7ïßýòdËÙHå¿ý³_?>ž.ýðþÝÏO?û9>ýã›�oñù?¾ûÈß>ý…ýy{¾~÷ê#*­ù[oþÖ†Sø¥�O¿û ¼z÷ﯾøâÍÿËêä‹Çg—÷_¾ûôÍ»?]Þÿ?¿<ú…Kå”]:ý" ö¿¾ùýã]“³31»Ù&ü”Â/ä³�Å´ÏðíxN!Do]D7g›½ÍÙ�ÃgÞ½ýåg�ï>þîÃû×�_|qûþíû_üòtû×WïN¿yõ'Ô¼:ýß�oß¾ÿËéòöÕë›0Gñ“‡7o1Ÿ½úx²ž“só+ë>¹|ùæí§ÿðågÿòø�ÓÆOý'Òã?~�®Ð+çÇù“_}†Oþðøñ#^Ïãüþþï.ÛQàC)?ûçß?þé�¬&ôþ¼vûáý矽úðoüîé1™ÓŒÿŒVþññ³Ïßbæe–B1g¼»“¶Ô¶xig�cGÓšNuðëì<þû›Ç¿üòôïß=êÜ|øø]½ŒÑÿkÍï¿|ûøáß½ùˆ±%~4ë$üæý§�oÑ~ùþÃÛWòîRìúmðÇWþôøkþþí—e'–öÌñ¯_ýõ‘ åô¿ýüñÝßÿwcÌgYëxr'kgwÊÖb9´gOnöË3íúíš±›Öæ&ùÖê·ÞüéÍ»_Îv1ºˆ÷áͧëfw*ú?y‹3†ËÁÌn~é'³üädc±Á½ä�ÌæÇ��ïêc;Þþf³¿Ìù7À›Ü¿ûôöýg\Ò/xà°±ÞaϽ}ÿ'­[~—|ýËÏuZäïO°ú¿ûðæûœþAjÊ'¿{û%ªþîÃû/?ÿÕ»}?ýLéË| "‚ òéé·ÿò¿ðÈ…ìùÓ?¼z�ð÷ÒæüêÍç?²;¼Ü‡Ç“Vâ›ògû÷ùoß=þ+ëúuýôþÝ¿?¾}ÿù¦[m÷|¿{ûêÝ«'ù|éî×oþ5¯0=k‡løøñŸ^Ð#6Ûç˜éCšt½?Ñ`Sõüƒþðš»äÃéòáË/þ|úãû÷o—Gì«–w¨˧lÿãxÆï^}ü3(òã»O¿X:×?×^¹"úÙ‹úÃÞýö�v<޼6èG2¦ßùjcÿÞžµ|çè9¨üßå·¯Þ¾}ó§¯>ÿó›×G�9¨_ž·­û*Ûø¯ŸýËû·o¾ølݽ›O~÷êÃÇ7¯ß>þá¯_||| ͨkzÿé½+‡üÉ6øË«�¯ÿüë7ÿòävæ¼þë›wŸâ�ýáË7×zÿÙçäžNøó«Ïå ZË?,ÆOp léü/~ñÄ`ÓéònSÿw^}úw ØÁ¿{ÿöÓÇw§ß“ÒO»¿p;æÓåÓéŸ'S‹•NóÉåÃô_&ÓÿØ®¸Mñµ„Z¢ü×JâþÙ–¼”bæ]¹Ù” Êm-w›ro&óÐÊn`Û·)~S®D-“ü“mBÉòoÙ”yWnìe)·K¹Ø;”ö×Ý„?îå£;û°-Û©“Áµ¿)aS¢K,“þãò¦Ž¥þÿfS.Z¦ÿëh-¯­¦ß­gج꺶(Ó²¼a³ÈºªÛÕ-(ü—«Zvë;oVÿŸêR·Å¾,ˬÿr•ï·«�ÿë�9\k7íÚc]ù/W–kœ¤YåÜ­ðM-ûµÅZòŸ{)wÝ*¶‡zYÃuÍXt‘Ú’Íu±°@S]#®Õm-wRîky`i'‹/³]K+«êęЋ’™'/Ÿäõfy•;±­#L²e0„IžËç8HcÁ'Ÿ!Îþ‚rç°Ú6øá-äPÂnÂ%Ü…ûð€‰tÑÇSÌqŽ7ñoã}|˜0 ‹]R¤<˜æt“.é6Ý¥ì‹i9æ”Kžó%ßæ»ü€}b‹+¡Ä’J.s¹)—rWîËö‹›f?‡ýÌä¸/óí|??`ÓØnâMº)7óÍÍÍåöæîæ^v’à „K¼äK¹Ì¨º\n/÷—ì.;ÉlûÛpo1€Ûùöæör{{{wû€ÍfeÂ]¼KwÜ]¹›ï.w·w÷w÷ëâïÃ}ºÏ÷å~¾Ç³îoïï¦ûûûîˆLØC|À›>`ì7(xä¾ùÐý`- Vsùû~Sî6åvS.›r³+s+þW6%oJÚ•¸)aSü¦`N®–= [‰¯Ùý~ûs·+·Z&ùç²)7›2oJÙ•¼)iSât—vÅoŠÛ»)f-mʧúËvôÛŸÛM¹h‘“¹[Çýêí׬­Ö~‰öË‚¥˜6«±_‚ýÄï§»Ns7·2£Ó0™u w³·Ÿ±Ý<-Û²>kêfDg㦖YJ©%KIµÄZ‚_‹›äìÕ+SIÿ²ýõ½Ú³ÚÏEÊM-³”R Îö„ÿ¥Z¢”P‹¯EIo#ô  m-ïeý.²^EÖ'Ê‚pŒLû�Ló�lÕ,ódÞ¬ÌÔ½LÌE&¢LòîQÞ•/hä…îändÈYFdDöË=&ótëô«€Ž%P³ªæ@ÍÍ„�t�Y¾Ñ»ù+7„0‚ zÜ(7ìVüÓq™o@6ËœA@#©Çdq?`#Üaš. ¶s)oŃ[\ÜØ!w˜ÃK¾©.9ƒhGonqÑ?`ïÜab/ ð3}¹� ûÄß&3aßc�oq1Üà‚(¸&RŒ¸0<. ÞáÛíkqÁ¥2ãrÉ!áš ¸n.ƒ}�]q‹‹èR™p3%qGyÜU¼Êvè–�·(¯U^´—/bëŒ%•]ÚÚŠíZ+i‡¥—:ù7Þü³pÊ)€w�ýpåqÒ�tо¾~™l‡[ ÃÆÔ+I˜±©"6”Åf:ÚJ®ÞrûðGo +ç’·P”ÓÛn¢zñ*Âm&@žÍûn¹ìvY9¸îürÝñ²»áåË Çà+š× Lý° ¶2qan¶ÓÎY Ÿf´Kü!ÌÜ�üÉÓ¢g¥]ˆË-*õòæòÖº 7•ÜûÝÊ Kh¦G9c\d/tÜA›ŠX/€Fq¶4gÝ*+ÝÙR¡=:ÅähO�ž£E:õÝiüƇñ²°¿­¬‚LÙ‰8¹Š=ZâN2ªÒÒTi?Ê�ïdÔ=ÿÒî˜E@[8})—i'ØÝ Ý„þ;w¥te"õ·451s)a(~(î ÔŸi'éOÜ–I[þ½;, Ó"ißVaì¢ÒÙa™¯–Òä¾i#äkI/,«H·eÚÿ¹(ÖßÇâ¯Ù“q/,G|P¦6|ñÏ‘ìþ�~¾µÛ½h—U.µ±Ùwµ(‡Õ”MIQª,Ü”õ¤OUlnÇ»©EÖíßŸæÆ¡¶Ó»=°=ÇM¤Ok^T©–¸(VÝ�ßÐéù“‰ßµÄªžêŽc;�wÓF©µUr]�ãe§dU¦ôç³ì´l«v¦ihŽŽèò÷4œÌþއòÉ2 ã“úÔùíŽç´ÑA~ã3üÔ9þá�Ý·Þዺ•~FùGù‘Qþi\ˆ¡ }/ÜÆ\%¿Tù ·H?Ž#ï8·‘€n!‰4A¢¤"… #�Ê@·¢üQ9¨,r�¯r%¡[HA‘ƒŠ¨’Â$¢�•Ãñ RñŸ€ïHB* Qr* ‰=TÁú¢eßFÎ�¼[þ-±=½0„‹w*NžV×båÒ”3+"@±„i¡Ô׵ᱚ&UÿÝà-‹$üдa‚vDu œ;ÎeG#wqÚñ$,m;$kOp#Çð22q•||›ç¸J‹Z¶jªíÏ^-·Q5nua"¾H™ê/nWü®ìÕn±+iWò´SååNÍWv*À¹J¶ÛréË´è¼Z¹Êøó0–¶Ç¦íMÝé=«êÿ°øÃR5yc‰WJºZ]î´SìfQ7?UægÊÍÔ)”�Êå…Eˆû´Ó\?Uî^V¦ƒ�ñÅeºZõ5ÆKôëvT7f?]µXhi*LUh6õf®¥i?çZªntªªÒöÓhÃzlÚz4ÊÚDäÆÉ7-­êlÃ$J#-i)¹–²”¹–›¥\h~¦�@‘¦UuL�6thºB„®QŸkTgCi.¢Ã¹Nkž 1;¢R Ëô$M9 $Ï‘�éiºñ’Ñ‘†iK%¾6iØœ÷k„á…d`<ù×ÏñÓå{:Ç_I‡ºÓ¢‚e»Ue§aÉgù&pzic‹½€¨=ÖT‹,m²Q¬² e³ÌÞÑ6‹ËE�³^XQhó$üi³ÒÒN{/–ZµÕzr—b¯åm¶7ÂÓnˤ¶[ZoÉXŠw#n!§-†Ü ¨ÑÝbÎ5`ÿÈIÒ¦0TÞÒd’8R¸�AÍð5*’h7©²3»†ŸfAJS„X+˜¥Sãg}[µ'ɇüÄm?ˆy36 rëkÿ £ÐyH†¾<è&›‚a*DŸ¨Ìd6òFÈ{á/è"HŽQ¹ÅÑßõ.±êþÚl‰jQ ¹8S]‡Õ ùþŠ?ÁâN¯yÙý\÷£Þš=bUç‰~Y}nÄëfñ»éU̹úߨNõÁ%ó}uù�êð´cÑâWôB¯¢­Ua¡mu:Ùº�¬Ž'·Ê'oœOÂÂÏÍåN׉PõA¥ÜSšÿ©H;ê}ZD¡dC¹&b(ÌÜb³`bu5½ËêYÁi­;«ÏÎÎå§j�Íb/¿½²*’sU‡jk²Õ„òBW«ò2?+u%Y 'êªáÔ+®zÃÝU¸æùVCJ¬nêØf„�¾ßù_l\Œ'cU¼«'…_äÑ(2i¹4‹lZÄŽp#êETRw“$"ª®Âªú sÝTbU™u•ZEn­žÄêK, 7ñ$âkñµ °w;!¶c«Ë¥oþÆ"É6Yvê„Yº ߊ͗Ÿæ\Ý™WWææÂ\�—•ÒË �;~Úp#½^õYÔ`Q良W¾^ú{cúÍbLÏB¬ªA}.`µªßÉàôÚÓ‹¯]}Ëå·\íoc¹q NõÜÞ„Û»pëu¼÷;Þ{/¾Ç“2>Õ¶Þ{_ó?~ÂyÚ8=~-·G«Tù(Ò ÷§"Ô`µ™T+Ê´xØ÷>ö×ýì7žöµlí§g|í¯ïÊR-O�›ý´ñ³ßzÙ›e£>T�¤¾™öYö¬îÚYî:Ù»SݾI®ÂuûêLª´\�Ú†¾¯Óu»ñÑÍ�2Õžë.O",‹¢¤W(¸^êQ Ûþ^¶¾l~õž92ïöÁ4}9¶!»Þ,4„Û†Ýì#A†œiŒÃéEŽÃqú�œ%,g %#s¶¡%Ï…çøéj„ÎaŒÎ3ç'g:<<—�r=?Û3´9I;½ïy“‰“o|0vYdéBÅž#ŸK ¤<$èK1FämcAÇ¢ïéBHªÿó=�­Qœ¯h=çùŒW•ò; Ѷ•”fk2¸tPACÍU˜Á}02x¤/¹ªžðù¨õê4Ÿ«>/�ÁÏ•õ=¿Ó§È{äàA®1e³Á…Åï9ŸqoYÜ8Îejo¥ÿUI'OáŒï>¢ÂsUcb ÒFážcWþ÷ûTÕŽb&<™ñ9WDUý\¨¢œg‡‹—Ÿ`ïo =»²‚´œ9çe£ ¥òúr>Çh¶*ªï÷©_IiõågŸ=~ ÞJõhÕgnøëÆöny×m˜s^\j›/îe R¿o’:éSnhBL\$•¼È#k¤q ß kX¸ÕÓ&ª¸,^ÔkÀ·z\«ÿõuÉ>Šl/âÆ´‘7T°Ÿ7rÇ¥2 ÷M¾‡„/Þ…ÕA[úŸl“Hã“8$fqOTq¿‰ü—Æ…Ô Y•¥v5.¢ªbí5Æ)ª•% Wj™k©¼@¬|G\XžÅó£9ù->ÞÓLâ——²þ䥔¥Ü,å²–)ÝnÊê ³7‰nÝ¬í®øM‘¹›rXJÜ•ñ§te>(7S¾Êí•r÷DY̺ӱO‰¨P¾j‘�<÷m”1F~�’ÏKœüe=¥vïUäP^ÖhÅ© ý»˜19f)~uݘkœÚÝFÚù lªgâV¬÷f ¦�5œ¾ˆRó¦nç{Ñxq{QîÆº7©ïºÈN¼ãlnNöÑê²q#.uýÄ—ÙŠÌåE Ù4\ETêÔp‘­í–©Ú­(º-uј�»ªc'tÂ*¯º-2Õó¢Ýߌé÷ŒÕAcÞh¶n%jŸjåûêç»øfL�sF dõ€kN*W¬®n«‹ÛêÜ&k5uNiçÊ6Žl;‡��çÚ⳦2ßÞI­1¿½/Úèƒ6ú»ÞN^g‡Þf[é`ô:[Ët z°¾À�5{º^ór}²ˆ>Äncê[4}‹£oñókì|Ã>\Þ,‘“"MUZE�i É/«¬²ÂïCà7ÇÔ¾¯ÂÄV_…ð­ø½ß[©{:º�AƒÀÝIÛUÞžî½È½º÷bw© ç¼\vqZ„ïUo"¸[`qÌF؈ã÷‹øµDíOíÁ7ëϼ”²”õîZ¯á¸”°–©Jï« ï6’¼ÝJô¹~-[yWÖsÚHŠ·»rÊMWŽ~Ê$ät_onQ¨]/ 4­¿v%|å"7Ø4ûo£|u4…§ñ$„yêb˜GL…}$óWa‹¬PM Ó¢ݪDïë6]Õ¡;e¨ZD›h³ŠÞ´õÍu}tB]kt»@/Ì]Ä‘_5¢U'zŸï&9ñÙþs5faN›�XÕ£«‰xo$^#‘²ð¶qªáHj+v»�¤{¡WûÀ¤Y˜’¼¨QceÏ—¥‰:UѪ>ÔKîN´«·•RlC–4hIÙ¡º¤ÁK*Vˆ±gZ¢˜ªü¡ÔS‰ÜEt²7U/Û›¶¡M©JUHñ~Ù§…ŒÛƒØÕkÑ«-j±>OUüš7 èµ õµ„£öÆ>þŒq¦×ÂU¦á£û¯Sžò€7¥²sO9®¯î1ÑwÞ$¼šÍÎLζPÀöq¹ú®Ä�$èD}GçÝó=á«hþñÝ»WŸ=~zúSýèd>}¸zS {ÅEfÙ {Ùëø sñÐP*¦ênÞ»šïÁ:öNæj±WkýÍηâÉ´8–Ï{cäª* ƒ°ÕÞÀ5Öá÷/p™ô ªò㥨#OxÌOëû¼|À—:à d;Û»ùžê„ÛÝp·â5�”c?­Ó¿„}@Dß ÑÍôÂ}‡ÈI? ¸ xc‘ð!ƒÔÍ>[zŸ’Î9pnÎ9¤µ?Ü@‹4\>YF´ûì›Ñkc)6>F×qG³]u$õ¸×/~)³P Ò3/~"³ègïATYT„¨{›,ÞL‹w›b›EÃy·�TlÞm-LgTÌ58GBsš'Ó´¸2íݘªÓ.'VMÏ>g«ï¹Ÿ¦Eé£NM®JY¡ªZ€Nª¢ZÞV‰¨ýT¡oª"�๫NPÛ²†™í€0VÖ}™Yt-þ°„+%îËÔ}�^Tòõ2]­*_¯L_¡ñ�È:–éeÍ^^~êð Á“4ž/-TD9='|GÞ!¸:ñ<ËÂb¨ ze銿™!máæÈLl1[½¨™Su­¬‘�‹CåêL¹N‹e‹ÜG.$‡”C< :Q¦EÅ ú3Õ�x[�í÷54ÌÔè@[…ªæV—(ÁVšÆDn¦JYÚ¼®Ú™¦³YÕ9kìÙªþ±}™¶¨d;]’ßQ»±Ä¡-œ6«¾Xf®”UV¦í/*ƒ^j_¦ç|ÕòÒ_ü3½¼é˜¯QJ0÷5t!ŠÌr£­Á0U¥A?“~T�p"S"v^·à>S|X|îãóY TÍ{kœ:¤ �†47샘âC*ÒèH&V©“›%Q5~OKVz⪢h¥*±jQó´!,ígÝ£{º²óê�£…™"s�ظ+¥£8Ó Ðsäh)ÓS•_£Ì—HÃ|vG×âHÓä}N)ÌÙÍÆúÜ,á\Ñ2Ù´�vƇ¶–cä'Åo ¼¬ÙŶ½èÆKÙt`«ÿ1 ªšï‰�dý)Ú³Ýñ»šÖDE²g"Jœ|8'»âÐ=ÑbÿýŒ^£Ã¨ÌÙ»9|¿o±|?ç�ƒíÇßÐéÀ;8:øæt° $ÞwîÜw�[÷Õ"÷åÍÝPn¿ZÑnz×mþÛ<ó‚Ç#+™“ Ææl£ .ëçœ�K§Hä©FÈ*Ü`xÑ'ÇþN?šisĬÍT/4“ggpŒ.FWl žðX†_¸<ú›‚q`WA¡“­ÞºÕO×ãš(…OYßù»|оÇ�aVl«ü ¯’ËÄ}uãûê{� oñ5®®¯SsÕ}Î×6¾¶GÂ�‡³rpÌÄüDïÇoqìx¼{Ÿ©½Ò×q»}Ö%wS‹Uù¶ãaä S‹†yª÷¯àҺÙSç²q¶Üɾâ;÷ÕôG{ÝïözõtøFM¯Öû|�›Ô™Šax™$ƒ‚„“nBIW˜ï´À{ßÔQÝ·bdÔXw'‚z¡=W‡¬YLŽ—È~_+Vç,¿‰Q§²LIÑiˆa¼ù}�-÷Õ+4Š9rÜ0¹Ëü¦Ái‹áäąˆcEÃqÚ"9m‚—¦kÑKKÞ¤¼TZðÒ·å‚}|Ú^î‚Ýííï}dH¾«'È�ʾ Ö߃äå™R~óxZ)kåãÒ{Ú"¾˜° ÞŒö[êï›�òrxÌË|vAXl‹Û<Íå¸òƲõ†œÍzuZÜ õ ÷‹ç´Ù¸­_m_Æ�|a‡Sz[½ ¼ßKõðõœê®dH>F'û>¾° œ‡mTp�Æu„Çeð¸*×´„V6¹°÷¶€^½/wM¾`W å½ÛÑ9Pº©&‚kñµ-JÓ­QšúÜõñðIî h°åi+]�ºˆPW7�YÈ«®�h£Ó½¤¿›%ï�¿XÌ!ÕÐ3Æðl#yífQ={tq�w0(^ê˜Á�bcùl'IJwÁŽÁÞ³àßy#Éæ¸4uñ1_÷‚¼Ïχ3Õl%}®’ðð¹ËqÚ@Å.O–ØŠæx�œí šML;€�5>b± pØÆ),±JäüÎqû “Ët³§œDÉ[ãG6Á#Çá#iyÕ¼s]Vg× 6oÜa—¬ã»F {½øŽëlý9W×ÍÕEs sYÝ»©:nÍ:Ìjñ0»rÄá. ûØý$~cQüÅnÅOÌ‹o]ÂîÅ ,ˆÓ½è×åÅwk—,ºZÑGJGV1Á›ñh„Å<Å<€ÄÔ$àÓ7É^‘·/?�ìk�lä2»†“„–.)ð_"ÜFè#x/G6-�mC+Œ¦d¿’Õm=¸©˜wŒÜK>Y¡ XÁM’šר”¤O+ÞàŒ2ð;YþÆ€{�ÊRc9]"B�ᘬ0¸wBpÉ€D¿ËØá^ôÉ2¢äÎ3_u�§Ó¨T ÷ƒˆÚˆì™|Ë�ÅlÕ�J÷“!¤4ØccK�|7$ìÖɹÆÚé'Ï@¸A²#³õ`¯šTœÉ‡¡`ÓrU†8Ïr(œý8Æó�„»p$Û…�ÕK€âˆWVjò�IüÑ.E¦ýx¨Pd¼–\_y£ûÊ ùªú!»3OUës·h}ì­f­5kÅ6oÅ’êm›ém“&|ÚçÇìRcîÓbncHö)17É1·¶Ogñ}Yy˜¾Z’ÅçËß¡jƒâ};IM/õ»ÂãWî¾qö—ºÏ f°ýÛʸ n„rnäã+Lß’§"T<ʦ®»îà¡F 8QÔ…@Rb¦EI§ o¦õ9QÓщ¦AM–Šê¸F;®Îøcg¿XìPü•K˜J8,éë–éëõ[êP·ÆŠ3ÙÀ7[ ÍÞ \sýoÞ|ÞRЬà[ö'ÆÊ-Øÿöÿüw›<ÁlÒ(lƒ`^+óµ~~êð_¨É• Nã-¸‚Ãy­{aógo2øN˜{²ödìÉÖ“©W͘¦Øòóâív��ß0ô KW½¶njvÍ`²¦!òSÍ’R“©´Œ,KV¢5ïý’ñ~—î¾mùwºšçÞå*ÎÔ¶LC>«}ùî×ò[ïPUp·b+Èb'p;ÇÐRZžeÁfy:YÖ´$†J{eãήrÙ@Â5»Jƒ…ÛšVl1Sµ¯áø*ŸGþŽ\Ù82o7"k�óß{þO?{ù¬‚LË-§›ë¾½ Ø\Ñü’"n/iÎÓFÔ,�¨™wBj-UTù†3ü|/>-\Kƒ[Ët˜j°Ï¸g)g˜E‘Цêw½M×r»ñº~XÜíûék²É´ÿ¬h¥ ÿÙ¬Ç[ûñSäzu^•Ô)ób-ÜcÞ J—ÍÓ�H~[ÍŽüCsÅߤÃ+²Ã•R%ŽiAFae/Ìl䜣Ô)Óš)¥–KE$Z¢Üo°‰Ì‚OôBÑ5«ùÖfžvIco7 c�›ã�&н™vªlWÙEì½·¢¿¶bñ�0õÕêJôƒsÅßE‡OÊÓ•ŠëÌý‘̳JDÓ&ïÈZ¶Õ*f5<‘UKÕŒ�×Ä$Sân6ÙInw–…½m¡å'Y]KS5%TãÁÔ�%Ÿ\8çÝ{}§OùFFÃxd4Œ;¿ïC¿®þ^~1½òÊJúþïiÇm3#÷ÌK0•KÞûæ!ýÕ¤«XÜ!TO—5UF•‹ŸÑƒŠ¿÷63ÏÃ&Q阚gÞ$Ý'ç Kr7]Íϳjn6j82Õv�¤�{|N¥�ÃJrRŽm‰8¤³¥eeLf8¬Û Ömý�;¤ìïè šã‘ÑX\lKŸzéÝ0Ñ7½õ’A³+ñGsçK~ìÿýõÿÍNÿaØGü)î㧸�Ÿâ>þ÷‘æ£sŽO‡XFû‚XÆëÙSª$ÿ-«â–›÷E{ýEI&ÚÑYã­©ñ.)¿¥Ç+Kz¼5A^KKÞ’�wwáwBëwgà;{‚f²íöôµúo´Gó!+šãSñ¶WcUŸÈñ³‹W8„]yÂtt6Ý7 WÜ…Ù^�®];,]dmŸ#gíqPíu‚�äïŽÂõ;䥷ȧëeÓ‹2Âô™ä-®VÜ”ŸBuNÅ>7êGâgÊXÖ™„[ÓI=•«ç¡¿Ær5'xw |Û±ÀÿãÏo>>þçÓåí«×ÿ†#¸ûóûÈ­5ªx¿fv­iVoi¬úRýnIö»ÏÉаÔoé!x_aÔÝ&ffÏs= Ì6 Ìe�áù&!J·›Ì.£4}ý ¥Z¨ãHÜ«; ßw™µl°|í¼e“ª®ì”†Qk¢hÝ,+V,~ ³„)5qᾦ#A>�‡¿j¸ŸÒn¿,&lL*ôu£Âö 6kR¡¬èîçE[ákäƒ3ßVF¸é`#ì ÅV½ÝÛŒáml’2<µžK̰OËPMSùfAxý¦¸›¾~Þf‹l6Êt%ýÔøèÛãø+ßÿýuxdEÝšJ·Vè u›ˆÛ�Ltˆ°¿ÇׯA�Ó7ŒzÌ÷¸†=N_?î±ZÁ.ª®E�¿ ÎÆàêþâê»IøõÔ­‡)§¯¢p]üN›×i(½[!J§ªÈ”Ò¤ôîE0¥{�Ò19}³�IE¨Ö39}ý Iñ®¦ïMª^Õt¨Æqzè€ÈòVÙO[á§­ðÓVøi+\(üÖ¡ñÀÁïê ß•ª |òïßýîÛwß¼ûÓ/~±‘Û·Ó?|ί5¿{õñãã‡wèoÞþõ‹/^A”¯¿œæù<'hé)ù“ áL#;o<¶çÉÙtÆþÄFŽ`SÂ,#¿‘ÿÿÓ_ô�Güó¥üÚæâŸþ*þ=~ý_øð/˜“ÓoNÿü?ÍéSýæïñO{tÿ„Óg¨|v§_µj¯ñëMÿGŸööÿýí͇�wo^|óþÝ«=ýR´'{yÿþ-&ïWu"?¹ÿôÍÇ÷>¹¼zýo˜ìOþøæíã'¿|ýñç§ÿŒ/üŸø¯Ÿùõ?})ÝÝÉ'¿•è˜â¼Y²è�(k-N«óôuv’ô—n 8l‰rLÌ©BâöÉÕË�â7lt¹.ÇÓ?½’ÇïÉ[{6`g†½ƒXœb9{,º˜.±f†ÄŒi;ÅùœÀ0ž@ÏÎxD˜!YLâ)fæ€Ç´|»8Іlit�ñl±6§×ì¬Ä3(UFÝ †_rçÙ[ñç€/€ c\>…ù ‰‡iíÓÙ‚6á $áüôÆÕÞæ3õiÂŒy '�¶Y†�ëØ2ö…)øàŒâ¿æg £·oèòsgµ»ÎÏ@¬ .›O.âƒKŒ qÆ‹&ÌÄÉ;}%VÐgs •Çä@"ÐîPiñlMÃ^°M‹ÅáJù VO¡ ¢Xº›àûÛ1¢=X~ˆ¬ÀÚ׉KæÌÉ™1xYÌC:3màÉa=ì Š‘ÀÑß%سç\ ßðñZgö YïC,}lœ6 .E†*z¨á�Ò9H¸ães²{5¥ÚI:ÏÖ£±nñÄqØ2Ë{àAxD “ý™ätÆDaŠS´³v‚I‘…òˆò|ú…=ã²àºûrÆÖ¦dR°«°!°‚*0Xlîû„׃¬�„Gí; q·ÒkO6×Ù Ù3_ _8JìÞåó�eƒxlñÚ „Q~ìMLv ŸœHD¤s\‰¨(”ÀçA7UÀfÄ¥q ñœŠ¯›ÊÛsá.ªºÉSLXU‹ [BQÌŒ†ž}:¥p¦†ä0>¾@|à cþÔîpʬãîÁ�Étà9Ø£ÈÒQoŠ5ñÀÎFwø6*@ú|´ÜòXô–p°°¹Û"ñáÂ9·|a NÞ`z0ñ3f»`šJ8o•„B�¶Å¬b-q8qíë®ÂK�“ÁÜb×ÑI¬®8*&ÍR{Í®ÐsÄÀ±¥ôÄ[м ¢“�ž6é ;2éžÀd�êE#c®=×­dCRy•t±—{'›µ<Öñ,�D~_ÈËgG•89DM–í?ƒ+ãÇa#DgÁÉÔ2';uÑx¥ú¹ž ¼ø6Ôe ÖhýV§‘²¿ß<£«h#k§~_‰3<'~«{ æË�ckˑݼÏú¥~v–Ç\™¶6» ˆ˜nCÞ6Î8®§ìA�qŽ>;¬ z�ÌØoè;p "MP"0Ð=âõN3Xp©ÚÙÌé ²nä$|œÅ9€Àâ#™APr‹-È á2Ã3CÞ¨LŸOZÄ™\ªŒ'¬"‘L‘Ó�ÓÇÈ ÙÏÈ |½Á¿7`€yjw¨”tâ`qùsðz4êÈ RÁ €¹ÄÉMd.qO³»+óÞ±E¤I˜iÌ@ ö† vØgGuœEò­˜5ÆgâsÈpxaœ‡;go@ÃÙÛç¯ÛJƒëäJƒ½_¿ÆÙ‚Å‘V¯í3úŠ:0í¬¯Ä¦ÍKÔ=%syCGÖ*´·îuÖouï¿<åxÎv‡Ïžn>ÿa.HK‰ÔÐø‡�E<»­´¯‹Øb¼w0�‰ð6�S1î=�½7r�c-¶éR¡÷DyJ2ÙˆÃåæ[X]HÁsF“Lãúœ¾¢N»ë+ó™êÓÓøýÿŽ£«Ú]ÿNË·ºIXsˆy¦¼/D|6t§Ájãv›!µDºÅ‘ÅõÕ’¬Ž�ƒ ®V|ÃÐBíÒ�ç íIÑЧsT)F©È=fðÉ“'iŸ«O 5%ëgâ’£¸m€•ý-Õ᦯˜g£©ð»Jƒ­)0‡ôP�83Dc( °³è~„}'S@ZéÝQ…Îa9![$Ù>|}XY[]&dÐ?çÙµïôýÙ¨Ûc©‹W·Y†²øC ­pgb"¨ ¡Oõ  Žw&S'DÊ)î5ô£‚®™{Ú»D…ÉØBžî?ô!òt=�Gý¸ê‹öڤñô-úwj~]«¬^ƒÙPSNãX¨ìƒØJe_4ÜÜÃ;õ-ôIýÜ ýŒ«Ð�åÙuúñ /ƒ'¥~NÄ[�»ÃzRµ>ï6ÓìG·BvãqgAàá‚wþ…´#�i´ ݲ Á"Ÿ™°­„Ó=-úµ‘Z ZÅipOɯ%:ŠF’áÜÔù мIŽ6F�‰�É’ ñ"K6Óø×{%R£„—£ÞÚz¬Ñ±{"µÛD‡¢vߣŸ"ïr�H\h‡E²�Ôja´˜;×ËÞs‘<§%-—Š­àÈÆ8•ÔöŠîèËH³f�·x‹æ¿Ù»(R3Iƒ9Z¹"Ö…Þ»^Ñ�yÃ@è¸7ôA;^�|DYÜæú‹d˜áæú(ú@\®â–ƒ‡ø@zusKVt®ÇÎ�"�GÊh�΃ÜêIß >RF÷H+‚P8v�m=ÕYÔÖÓ ip“¤¸Îˆr®íì�¿dàêâ\$Gåb¸â8 W&:ûyô ´äÐ bÜÈLåT})ŃëG>ŽÍÜ9Ur™hÿÀ2�8ð®ï½+i˜�çõè±nô³ävÁv§œÍâÜ;\Šš�feªÙ˜†ið¼tÆS’{… }�.˜àˆ .bcBÖ=NǾ˜NœÊÄ2Í”Z£O¦<ˆ«Åy:ÜvΙtp°�+ê�39ˆ’é¯�)΃—&­þ¢9 Lô†+lð×§ ÑWXð¼š÷ÚÖqÓ9ªbÁÍs3Ð:0xp:rBTéavå+ƒ+'-"B™ˆ^Wª½mðé¤-Ñ3²1ÐÜ�-ßœ;© 6bê•æÑËs¸[žq÷d{¥í†ê{ì÷ÉË(Ì{à¤Z;8€ÒD¤ŒGã�î–C‹C§Ðƒ~:Gσ¡ -ºW:tååHD P*ÜqâeÞ�…Šl\�ŠlžÇñ�†G¾¤Ý ³; å¹Uºêf …÷ä!O óöŠ¿)MnA­ØžÎ£ã)ÎØ;zw¶ŠCÇÓõ[{'Òƒçõ ºa¹¢òðD±cÓµ'Œ.©Žú<êZ‡A׊C—Ôõ[Ã,õÏ{n²’ÈŸvÏð¶z;&ª'yéÓ �}MùËY½qrÕÊÆÕñn‡dc@ÞÁºaÔ#š­©·œjÜÜXpGå=>"…u6€dX¼:ºjK[x\tÎâxŠÑíL.n&…iRÅ8¸7ª+®ÅDî7›�,w¢î—o ®‰‘~yl¡êR_=fqyx臮©_ó|'|� Wò$p´|’\ÏêsA'ÝgW§ÓŒzj_©êM‘v9<ÊèÝ& ¥¥Cylí³‰Ü?6úÊ"CsQ*ýçǯ÷>ñãÆÝ«úÖ‹ÐQŒ¸Ýâ¢N£“=s…{ ØMYüäë«ô‡n÷_fsÂs«òãóÈ'�Ë’{#îb‡æ‚¡U3 ÞÍ^À3*vÉD4&¿[{¯XÌ2�¬~F›Å^@�·%lU’DÊób/ aMý N‰M;{Á`¯oö‚Á¼ÞltáÉÌ–.î–`Œ¶ªýÁŒ,ŸÑ¨�=µØ Úß[ó@ûl° Ї'‰ã1G@}`¯Ö×dÁÛ1 $Á›h—Î�ú—Èûû¨Ÿa%{óÀókÝ�“òè<*º×#óÀتWÉ‹UT/8¸Â£Ô«õù¸-"Tñ*uÇæ±Õòõä�u€SY¼åìcÏó®†2´8Ò¤´ê4òÃPz¥þøFGÆ�qfÆ~†5†òÜ*‡"|ÿîL!֋݃W¡¦žN@¢F¥2y®œóØ*«Î7ApÍȪû45ÔY&@˜$Þ)¥&*å°øelÑ\Ÿ$p#nÅ£~(pY¶ôÏÒÕw¯Ó®È]›Y­|‰ê±Y/¥ý(À+Ϥ% nÍèð6}‹æyµ›”±›a^‡¡<·>?ÆàÇ+#‘¡€Y$è0«r0ÑÝ2T;“‹gŠÅTa‚ÒéÅ¥b0W8;uƒÂ3øI<ÓžÒ+^’ LHìc¬®ðT/;q�xï b�ÞøËðAå¬DF‰{ 5Ý,¡à²-¢’Ýh'¢ðEûA ÁÄsCQ`üÆÃø» Ö æ^¡’‹(þÓJçié°ô­Ìò$Þ3|áíÅ+_ýŽ¨ÓˆºÛ<Áñ°ÛhüªÞL”Ò-[�§;$91=%‡+¹ToÜbÅÏÖÑ”P¡,á쪿n®Ž#„×�Ytؽ4]”ÐÂù ØGsæƒÎz &kZ2ä‹h×£S€*e~œŽ­=Ó¨s°m†,ù!œ¿@]ÈÓ‡{³è%$8¨1�!<¸…OÏŸÄN+ïh$£hÈ cjñÑ#$>Ã3ÏÁgÇ­ª©Ž–(ï¼X( ’%žmœ9�ÊÄgÂZâó fÊdƒ¸@ö-ôäúV‰3–óA+ /$^¬óéh,C‹î�ôIC+:SZQÔ͆6©q,NE ìV⓽S×¢Q£nn†~†ùÆòÜ:ýèÔ+8`KÄ�’°áY·3þˆ‰Ð­Õ·bDŒ`«½§Å¢’—Ó-.@»7‰gãª+&‰@z‡ñÌEB€� ,%Ê¢®ÍÂw×Ë'K’£¬–‚Äèaì¢, §U=ïfÓð:L9k¤ìøU¹Ð$HK÷ìÔ (… #fUÔª2Óié§ÄÆÙj^î´ +¥M ±†»oè&ÏÊ+DÂhI(Ü\µ¦3Qi5<@ƒ¬°SL:h¡ª“¦Ê1 ÈMý„ Sž¨Rà DJ™h^§ÙwhÊ\ÚtZÈ ƒ´o•½*{"å)«–|‘#p“X9Q3“o8¡˜¢IŠ´õf½Ìô« ÔZ=k8b$ùåQ+UY‡¦^x²Ô&�mâu0×�bÈ‚¼˜º:A2ÖŒ-Ú-©ñ�Î@:>h¥¾+ %Á5J¥9]W@Îè�QènÁ.t(ŽÉEœXãdÞ#Ýš+)®u É#j_Š¢]Tõ—dTS�W£ø©38FW8ØW*qô\&² —‹µ¶(´V¯Ñ@f!EŒ\GWkb%üXЖêÔ`©�w²¾4ï}§” /fñüpê§¢>>àðð¨åIõ"Îtl?Ö˜Ts*«Oi5ŽK×òõ;“¡Xql%1­ö‚Ô«”¾ È"ÆÝÒ%(ÂÓ¥ÜûBo[�!P™”�¢mŽì”ÏÛÞkFnÕ×9#v£¯Ú7²‚~às‘(V1eˆ�FÊ2Þ� :!WÁz2|÷Y:Ù]Ù$KR�Ý`u†Å‚„�ûõ³ÃF`“ fP ¬"0€Å* },¼a¸íià¶§k—p®²=Á¯9[Éw-”àbóÃ8™$fì'38�Ñüä�†Ò7è^HŸÓ7ŠgbgÒy‰šöÓÁ@h �<9ù`�^¨k¡&fè§ŸÛa(ϬÐ≢¦îÛ ¡‚"eÙA5 cK>;n5Wg† y DVÿð”…N̉AI}“ëŠ UÆ ›™Í�ú­¾�Æ…YưÒ{ȪKÇØ .%ÅL)×êÁP†Ý+µ'u­²jÁhÌŽBÚ�…ÑtJôÒñv|¥¾�>¨Ÿ™±›av‡¡<·JËzbkƒÒÂCµ£™L ”T+æÃЊVc}j²x‘É ÕjX(™BÜÒ�+ <*Ú%2.AÜŽnb_ÌÌG韬Áцý›è“†VñÉ•âÎVÏË~,Œ„£¼ÝÞ þ­wj÷Ú­í8­ýcž�ø¶Dtp*4�£5Â#1 „Ž”B]åJÇV� 5ØB©g3ÛÀDîUÒq�Úª°È¦S!CNŸà #ÙkjXpjÑ1µ0=& ™T3`†"�|ë1éб¨Ü§OJ|ÖÀdÄ*Ò‰÷)F¼,ˆ9 Z¥#-.'›–Ý)ΰÛæ¸gqÑÅxN”YW-~qáÀz-±½:©Ñ´šF -ƽêÀ¬8t÷ˆZä”ü|Q‹óŒ¿9Ïô¥÷#´$d¼['VoÛ§—¸ç¥÷ÀQü[ôñTË0"áu‹ºcOUqÀ{®J�W%’T’3ªNWÜÕÐâuÛz°¬ƒn:˜­ƒ¡ô-ú7jZë®UÑ Ò�ã–ÐŒÛRý9¾Hߢiaö2öÓO|À3 rlGû¡!½ÄË܉€è-åÛ‹Î: »p°xÌ™•š§"‘ç=ŒÖÐB-¤ ×A?€×:„¡¢{}ÀÐ 2é1e¬ÒL®û!du£í?ˆNjx•®E3övS2ôÓOæ0”g–dáè®ÅˆÏw¢~tËÌdø±Ò6¸ª—ì[Aü�F©ÁhR;³b>‘©¦Ã U~¨`èuá SŦ±…RSܳA.:fº:èÆÅ@ – ˆÂÁ†ý‹´‹}ߊžÅñÔˆQ}ÄvC!ta•ì†åà�úª Ñù¾=Ìä0€gWäÇhô ›H®£z”œÊî°ßDù€kJ”r1up$½‘ JLnf…îÀà¨z¤³�%”mQWìPáÄ¥_o<ãû¿‡‡£h 6M\É‹lƒ'nh¡¢´Æ�_ï1à¨ÍS¥]¢ÝÊ´˜mÓtf: W=t×J$' [ÙTN”5¢ G¢t9òCªéäåÐLœ=̃ºd<¾0%Ê<‚Èq�ЇÖcòA‹D[dbôÅbµAb&ÛÌÛ(ÄdŽ1Þ¤FüèAæ†*‰ïAæÆnzt8�F�þóÛÕۃ͌IE‰óMÃ>´²g ©íÁåœ8CSãE·qjÈ{p9Fk'™±Dÿ f~îÀåèœ*¾t=LÀ\ŽN¥ VÂÚd/8<=¸u¬² |\Ó7tØr “°KO÷F 0ë°åDS‹ÕMmŒaD™ãXEuË܆Äl^ŽèeŽ‚ôJÀå¸Y•»²LËcG”9²À–¡xÔûûÙÃÍÑD&A[=ÜYtyÇÀ?cqç"Ö¹£õxg<ø…kˆ74é�Ž+êÄ™K�ˆâE'+4縭}ÞŽíömýRwð¼¡E7n}ÀЪh¸ÏÔSC â€SA¼@ß@Ô¿þØÍ0…ÃPž[ŠE-ÙƒšŽ!К 6±a po}£1ŽDSÜu=FÄ®9´ˆŠ¼é Y-­è¢€ƒÈNàžƒ¡P›çØÂ{ÃÓ6´Ð'upoýtˆqcZ¾ÓÐj˜›a,ýô>³HËjöài<åYN0¡4#Љ•‚>H7œ¨îzØ6[xÝŠã!¨‘Aßú�+ØAÆ ½ô`sã@ÆÝ ½ž@ëDçKS1ƒ+­É#z�˜¢¸1Ð3úè…ö ô‚¦¥ïe˜Ù~ Ϯгʱçî*¢Þ òÝ1@àbD XxFÄŠ7`D þð‡ LÞ1àå pÞ!HÄ€ 7€D PzHDÃÔ;ĆÀõpˆf¯‡Ü÷Á!½bàÀ!Æ>ŽÀ!†¨�aft¾%b�é;‡èñúlˆ¸¯‰ü¶ ‚ßÑ�ülˆÒïbÁöë‘ ÈßÑàþ îßüм‡xóÐ0t‡8€:T”ÀC(‡.°‡rh°�‚À¸…pð‡HpŒ¨ê!1¶à€Þ0€ è =Úà!xC;8`7ôøƒ†ÃóD¿Fé õ1ZuÀ ¨ß¾ÐCb8 €‚c7=á8”±ÅàÁA«8a˾пÒ!„Ã03Ý ³ÛåÙUÚ²’;|¿C ‡ƒV¦Bl úàºaÀ,\¿Õ¡§a(h�g¹œq[Ðø5¼QßBߨ›˜±›~nÇ‘<·FËJ•- VN‰ƒl3©3áç o.(]+î<¦_?H�¨¸'„…ÓÌQÌâà$ #ꬤ`È Å17Ôë 3šÞý”é¬?è¬2]”páS¦>ÆÐ {›Æã­ isâq𨽠}-Êøú±vÚÏ@ûÊÁw{n ~¸«ÂöW…‡¤DÇy*eÔv­±ô¾ÄæØ06"t½£m[šˆO��¨á£ÐèÍÇ V€È<ÆÕ“ÇÌq¨_¹¸ÿÐléÆF¼�3żÀôṙq -º×iò¡•¦ÜF´ÏuZ3ˆ-u`íòì×ï¤ê?l˜Š+mÒWÔ¡5cÕ¾÷†$”“5…Í8¶¼É¼3¼P­§ >çêÄ­1$®Ú[fªÖ<•m‘I1?;¬Är‰VcF2§†ž“3i‰¢@Tk¹nã— e\æjØ nrÓò-Fû‹Ñ~Ä©�é?¯cÓκ:Þ§ÃCHçù`hµ¢E”ì_hùV?í9×&îÇCoEL“¼M¶«ÎÉ…È~Üö­¨xH‚à;—(½NÃÚñ³ªL�“8;Û.!ÅQ²Š$<´hW2s,òÞ+â0<öÃ5šÅÛ¬H>Ùq,C‹î�Ú�ÜµÊ _èF5>¯K©b]ö³¸2ŒïÔµhR\77C?Ãücyn�~Hq®ÛS.V·2Í£¨J5ñèa¿ÕmmlEãªDØž]5ÞXPOø4#ÈLõ3« ¶è׃çmë— U¼ÐñœÄQìwÛo™ê\°°9<¯oÐ[ûZ�C”U Å„ùF ö^^Öàë3uíà ô-ôIýû�ý =Œå¹¥øÑ¨�Èz¤š½ÕJ(c‰ÄJ© ÿVéª�©”£‚ªøIÂþ4^£úó=BÆ_.Fæƒ U†û3Dd~�¶wôus‘ û�†0´èÞ ©Ý»VôbÍw5ÝÐ0–t.„”aÈCvÛWé*ôÃL _o“8<ùÊÔÿxhŠXS ãñfÞªaƒÊÃ�[·ÉЊVî¨VîP…pK�lü~… �‰Ä/ BKŒ¦øY²„¡^§š¶2A/ˆVrØ�±<¾Ut£oÝj¥Ó+SJÔîöÏC Ú iE zyuß mÁý»�Ý ó7 å¹uø†QSgFúàÍ8h¡n�¥²0­h&…¢-þ âÌ�j~_oAN­"³Š�î‚à{›Ç*Í ¢ è*š\×Äq¦TŽÌFãÓÑX†Ý«4«ì¾öæ�ê äbQŸËýXÐBà”¶$§ƒwê[¼®“¶Ÿ›±Ÿ:­ã®,FÛ_ AüÛ@ÿ¡½ù "#ÙÃ��ˈX �¶=`¦Ñˆƒ{�SƈÿHi𞬑´¢êíPɲ˜ãýF–¹§ü1¨˜ u Ðc¨ð@Ü#Ž%fÊ#ÉС½“›G|1zȈ>«‡£CdÎWÐÄèeeœAÄ‚ £ø;, ÔÞ!bÆfæq° “ .�@a‰ae4Îm€Â²„ó‡,ÏgŠq#,˜(zªýy@£¯ݺfÈÒu¨‡³‚FB—w°ŠF@va]›f�®MÉ„1ÆV¸žŒb¸Dñwh`W7õÞ­£Ð*ºc쯵²ƒÙÂ.β){„.fNâ8øÊôÞL‚®2ãÝ SÐ÷ÏY+¯ÖÊ0k}N‡µµŽîªk}§þ[Ë,tϹ:wϺx~ÿ1‹î‚‹ u‹Z­i«ì±µ²à¤úR Ü3Ö@Z’óÕÃgÑóÑr½zÔ,*}Fˆ+ ÁL<ÈÉ¥Jw¬}.«G±"|ñ,TcF˜+sŒkeF +¢C ˜lůrTã]A­¢Å`Dªrõ5z\)¦sN镊z�꣎äñU¨9Bž’ä:ÖTÔ5¦P%‘ð¸R<£9†NªÔ7éA¤x¦`~ˆ…Þ”HWÈ(®‡#PT²Úù<® ºá¨PtØIiÄ‚*¹nÃ(+ Ÿ0Ÿ™ˆ$Ý”œ»ôéð0î©2/¡ ¼Ú¾ÓZÙ�)I6ä9Ž0Lä|8qâI]Èð%BÙY;>f­8€6Z+;`¤õ9¤Ò2¸@¦õ�ºÊuºÇ\�¹6Á4*+¦ÐÜÒZÙC‰ÓÐ(AöòH%ÈîÙÎGHJgî£#¥Vqˆ›Ô*{Œ¢öœÞ¨î©¾P_·Î@÷”«óÖ&ÖKš’+¸GKe6DŠ&—B�SòkD‹wsD¬ ö_"�&~ßýcZÅ6ÐZÙA µÇT,¢eHÜ¢eü­Í2 }_צ§ÍSU[ñv?%Z+;ü®ݬè (Xóþy(H/Ìߢ÷vÎÏY* xÖÊÉg}N´ŽîCh}§þ[Ë,ôϹ6wmrik‹þ @ÐRÙ£ò€¸ÌÞúÐ~˜ç+x@¸Â‚Ë•tý6ß?§U鬕{žå1µgÓÙgy�Öf™†®¯kÓsä¥ÊèÇt?™â¨±Ç c«ÀÙ¬ŠFÄH?€SGŠõ��QX`³+qW0GÅøÀ¥âb`©ì –çôàËèŽÆ—ë[�Ô?ùù‰þZ*›ï$éÛµ(êk¬¨¯§¿ýýã«ÝsØïûŸüñÍÛÇOþÇ›O?þYû�§¿ýÕ»� ÷áñßß<þãzûÅÕÁ×¶wo>ãøß<~ñÉ{üës­ýø¯?Á?|xÿîú¼´ñ¾ÿ¼oëéšH3B4ÜßÓ¯ú_ßüéÏ_ø®¿ÿ—ú®Ñ\í–/û»Ç¯ß}\ß6\ëšÿ¼ú DÖ÷×ï_¯ßé–ö~ú››_ùOîß}Z»Ð¿/�zó®~òËÓÏþþÍ¿?þ|ÒD[”tû Ÿ��7âäOÝ,ˆ÷à©5�Sh¬D®M¥eùÿ?ýeÐ~> ¦)sú{üú¿ðá_ð¸ÓoNÿü?ÍéSíà÷"ÆÈHúç,ñŒOŽæôë£VÃ[ýz}ÎSu‡½¿{ñ¹­ëvyõúßÞ¼û“n¢ß?¾þ¸[³§3/ž~+¿ù€ÆjÊ‚™B4};O(cª]Å×#5…V+FkÑ>¸Å©�*Ô(~ ‡é©y¢Ç#ogªclk)+ÜÈJ&½È4œÑè† fé`E£Ï «ZT:½Ð£RÁSäó%…ˆ@ñ3W$O·ÑGG‰ýQ´WÅN#à˜!;ó* ºävRïç$dKÆûÃ2”^Ó;z+ÎxR»è1g^ú²‹D„s&«ÆW–Tõ YÓƒ29Z·%CiX2é›ã« ÿ¨pVt¨ —ƒ fïf…oÒ™ôƸ~ö&w˜?¹8fæˆe]|Õm‘ÑdÐ*¡f_+¼[&LÀ¿˜ŠR0!¨/Ì�l©'6Þ�Pó:TȵT–déË@Ôʼ�‡cˆ¿"gB]Ì 9*˸6g¦J"Ü�š²‚ZzT”L%4ÕG`bD}”LË%yÐ*$+J&:vK?^œA±ùT .*»mŒ>GRW£ž9´E!ôe?Ù"ÈЊ ¶2W�V|K¶ÊòàØ¤y«Êsé‡ áø$§ÉtÏ"i�ˆ-5$'Ce€«>ÈÕD/¸#d>fLœ¦7#èAŠd(JÕà˜ªÿeÏØ:L˜Ú¨áÛDSC1މ)†Eç™| D`ý:^¢á!fòý Tm44ËçÌDF+™t¦��Jj¢—Ô'QEà g¦C£Ì!cZñ�èèa¨ViÝÓQQ-­îÂWR,¡TDïc9i�ýGi �Äšû–ÄßÒ²/y]¬èiù Àé‡ûƒGÔŠš�4¡Ñ‚ê¦Ú"h ɳ`ÅKZØ%M©´¢5X<…õI3³ŽCTT\vŽ% 81ÕøªÉd:( iâªñ�DdÂ;9AÌ'ž1æ›-|jØÃ�P’ �€2FmE«�Â…"ö“VdQ•Ò“Ld2£+ŒULõ ·ç‘f•¹e[4ú*LÏÉ·r rRMæÖ0ÿ"W™Éb K•‰FøÊ´ ÷�»xN\†ô$Çœô™®zRD¨:ßB±&XMè)ƒ^X3ã„-U†æ›"pžæ™I'™>SN˜“hÈjʤ$õKŽ�Q }Š ”›„)¾¬ôfúMºäy|¥E‘ Bj–¥…ÝHXÔX[ÐDŽÊ0ãö$N0ëÑ¢Pnˆ¼ú:ÌÑq*ðAá’„‘c #Æ&dšå¹xls¦e†&]ú ÓÀó&£#"�UqI �c“„JÐEÒ�ÐÐÀ9KȯjA=Næx¦ÛGh @Ÿ4ÉÉÒb#ÉAšM'bË 2�1Lì³>. ŒNä(RK&Dm‡@‚& œiïÊšK]aÁÐó’7§Þ©œ ñÇcV. 7ÏníŒ&qÖëΌ4ׄꂖÄK¾”’â"î=æÐ`l¼|šJŠÌ>0™ht¬$Ü™à@€¶ñ±(ÌIHô1ÑšƒÉÄ€-)âÄI}Íí¤Y"�èEŽ�%ž»Na3UT§HÆ·¤¨‚^Aä3±RQ‰P^”•Lè—€ÆEçQD²Àó�mE ˆÀµZ*€xn‰â¥;¼\uqdzÑ ®ßœéN‚ÁñyŽS/FQy y4©ÄÊB!·¨1Ü!-²Û&ì—QuD±búù�iÉŠÔdB„у¹ÐZÈwôÌ,j<Йó³@*MëìDÚb+I¶WjáK †Å¥×.Ñ•üŒP �^1N*�™5Ó•x*j°Eh¦˜‹&In!ˆíÖJEjÓn˜ï…aíàux¹±Ò×yÇ0¾µ·¢i×ð¹¥Áª=ÿuÝ–Ìe`Žv¼.Aɸû¸-AÛI/(~‹1W¨!qÁŽ$*HžU‡§ÓdëÐÀôêË êçjæ µ› s\“ôà9H’X" U®4œÓ �YI*ÈJú 'FÏ5]¹Ð@H®$ߢëƒTèsÀeѲ�Ï7�*˜ÐÃJ_¦¨F´;¼¢‰�ůøŠ‘PÈ�®œT¸Ð&�®ÒNÌ@‰ž‹ÙTàˆÙ“i�ØsÞº'�{w¢y’ Üó"õÔü›7I·¥"Ð0TããÔ%VY5‹ãf'×¾ì*sú6ƒ<ù&²39ãÑžmçÆ:EÍE±Öc5N!é>3>G3)j– Ck»à¸ÌRá¹Æ�°‚ ÎP"Ó •`¼¬TЉ9‰¼ TÜJw¹¢&ÝL+;+æ¹A¦$ሉ[Rˆ�?“hèèJ ó[:9¯²Nœ:Ü€œºÌÐKšÖäàf%ì®ó‚çTܪÁÏ 0"ÁËÄüÅ1%¥8Xèæ¸!ƒD)÷žk~Br7ãâcµ™“ÐÐú͘I®l�£5¤è€;–Ð+W¯rÅL#±ã�¯tgIÖÃYQš“ÿÙŠY¢ýèÏAq×%‹$.´«\G�<~Öò™ÏÌN“øÄ {ÝŬñw’‹ÍC™ÜePûGDâ·)¼ „L�lô•矈­Ž1Â’¶$™',¨l$0s–0z¬ô¢¬¿U¬ -­tÙ£F›‚,©$Óƒ5´^J½ô]Å�€ä,ÆF^=ò¹x†ò àˆdr†^“¡÷fB$W2ý6Cœd½‰©{�³î&‹,“|îjŠ å_ ,0™{c(\7D‡�Ê`Ë4,WÞ_0‚ s%ñ†ªB+¢ºª:…qæ­Þ°ï¨‡=KÞž&*ï…Ã'/C‡.¢ÕJ¸ÝÙ‹¹„¶\"øDL�àZñº*g<éV2d¥Âú­èôX‚)dVÔÍ\sLEš•§ÝӤÌ2·µ3I´™bD„ôY ­`Âëœx¡ôµ¡‡V²šHE‚=‰sé ·Jegƒ I5hœå>g¥8êÐóH\;¹â~Þ~n©ýeÂ3ê›Ù™mYL©£Â4“óôR9gý–€€³Â \£”Uô’ØµÈØ¡YÆšT|¨˜å–>TŽ~œ•¨>T*Y›,¼¬8‚¹ƒÏ 7^\ÅÃ�Z£úV¾Ý�<�+Äm7C&Œ[¡çeâ쯡ި¤MŸF¶èª¡i–�‡;ÓÉR H’HPºUhÚÓ^LÃŽ"bªá¥DÖo–º\ÍV˜sþíé &�pç°-H>(?§ÓSª÷íLxR!êj�Š„ÐäG3É�½œz_JöÍ$~0©ä¸^…©·ÿ”��¶8©¬PÃn¢ž ÈuA4`Vˆ—K뤾5‚�I¼êt8²còwLêˆO�4äÒ k´p@ÜÊõÀ@¤c�*Ñ管–GšÞ8�cRJ)V`GéŠï+ÖýÛª?±\ dé[E‹¦að†Â§ðÈQÿ)×Q¨øB„7 3àÐÎŒÂÁ’ýÇy �¯ÖB!Á�Y–›¤ÑT·+ù…,$ÕªqöuÓÅÖ‰ºx^¬¬Ìb*Š’žÈÑap¬�$dž.‰D†¢«h¾‘>KwrÊS¤—vHÌe¬(âiÉë�}fÖî(4³;SV¤…2[¯^ÈT# s¡fe¦�ÅUŒ›î˜‚@×SYAévôÄ!Tm½ *P"»egeöœø/e}Uº¸D¾j!�¤rÇ¡–TîT§µ ((!¢ˆ½ÅͰ~‹Ô³x)&æ˜=ÉuBõ¥˜ Å”H¶ÚÒ´»È‡Tˆà ÛH•)A™ÜL×7K$åÖ$}+õ€ÆÐNDŸ%ßdVŠ •†g™•^ìe¥Æ„ÏÌ¯ß’ÓØcÐâ&+ �䥻9KÌ0[Vêþd…pf&ó�çdSá�WšÝõ¨Ê¥!Y•–°é½'F_ÑËdl'Rh¡ÜsH5Ì„â`à¥2ëBˆ$s„Çû詼ãé�Ã3”­$Òæ6å®ÏÉQ>$ºÜ†®ÈPø™Ð8æ|!=Á­–Ç IEí¨OlÌëaÏ´²Rvg¦ *ÏÖt¸ò-+dçñ¹“D| nþ]Úš1wˆ81¢°¹/$RŠ`i¥-±ýqÐE8+eÞøÁ¡²Te·€‘Å[eÀÿSuÊkÑ›ªºÏtJnëa®b ¹3ñn_©Jš„צzV4âät† úŵÈ�¾’6ê`è ¦# _%êëÈéôÇ/0î«¥ï’ÄÓ< `5 °R�÷¬=gNfÓK `QUVr+PƉá"p£4—aröø ï«:1Q£*.NVˆK�) yC’égéÅ›°:‹¿5>wŸ½êòÄíŸs)¸M\©ŸP>K>Ù'ëýÜ/�³Õœô×u-£×ƒ(e™e]v|«æ%c¸Y�øÑD\|znï#I¡.iR™Ç¨:,ºª ’KÇœÑÙÒGSž‰"¿L•#C�iqITÊQ1Q’ófjX‘«áûG(ýޤ;�†¥;Ãë•L$-•.«Ý�bþvPz¡Å%«Õ‡ ‘+Q±¼“¬6¥dF¨«•H³Ä¥Ì”’E˜„0äêRM™\Zu ܤ „UÏLírŸlö‚‚¬y‚*¨‡0�¸pRkETU:ßë…CNÄ j¥£XEæQ/x£ˆ¸ …érbñRÞ îüI!N!Ìas?ްüÒVvHbòÉsÎ�‹ÊN(LÓ°C8JGA¬�ú³R¼­’‚ŠpÃs#)‘f©ˆÔŠ;« 5!b?î6Ú]l ­ÂõÒ2Ĭ ž ÂHº«ƒ˜�‚à‘ådffñÁ T7'±«Y2ydVêÞW:*ß=†IH‡y¹ëàt‡ î¬ë¢¹rÏ„q_Ø=*Ø7 ~&\jYÛVÔP0úâ“–ëEÉ j/ÄËPÿª‘j݉2‚¨»’L²üxù–äzÄt?¨P“Œsi&OI¤ÙÙ,Ç)ˆD$“«ÀØ“w ‡�jšSÞ âRÙ4”¬(”šÌ¬Nµo�/8'0™ |<ÛD·Õ0ÑüàòÀúC#jÍ7g9©˜Ñ@uQý¼éwÔ ¢i7•’À@mfNð}hNPßÍ®‚°„±Ù†JÚ¡£šàÀDÒÀåb¥í_\'°/N©LUI4Qï™ÿ€¯I³1m5̉Sã²SÅô�ЂŠp)ÉA"%ø"9ŠïZ!èNÂ×25rP¦a®ÊݲfªY’ÄT Ô1ï. ù…‰Îc"TÒ`ùõdrõi�ÆÿDw³ò'Ø"Âr@bP"Ó£|™yëôÒF=CŸ˜Ø!I/Q�×i3‘ØìEYJ6ßdæÂò^»`R!¶ÀŒ¤åAŽT ­…tü ÇC�`î+ìJR‰âжpÆJ ÁB&×èÌ�‰¤Z–')W®¹/Åu‹–b°–äËI v ‘T_OøÂè%9‰—<¹œÔ؉û®ªà}QÈW/©“²0ÎÔÕ°[ñ¤�c4)r3Œ„*ôA'þ¨�p)ãDŽæ$ðÁxëLÊÃ~ \èãC�P§š%=œDzx¶àN•4jsM$¯´¾Pû§<¿YJƒpHÀE�‘ ´­™h=‚Eé´löšKá©™¡&×X]i!Œ˜²­ë Ð1�/À0-«Ùê8ØH³“¯{žAI$™R�*�F=’JA##‡Ëè¾Xš5;�>ɪðÅ\Ð¶Ê í Yé‰ÞŒ de;¼œ:ñ¤æÝì$ƒ53Ήiç–S^îγ‡°n5Ž×I”÷¬`nD�Tß.IŸ«¶5âS‘}Ÿ#hYפ”�fªíñŠ^TŠ #�)Ê[ Ä,Ü%Ì¡'-Àu0ˆP\®C<$0ý’…L­3I˜Ú–Ü€æ\- 㙵UÐV@% [4†“nQ.Ìq”»¼fg 1¡… m1Ådæ••˜Up^ž$"-m�6k?Q†ËÓYtÄ¢÷C $­¤ ,Ò�W$.z ÔŠ™šT˜–»Žj5¯À™, Ñ"™ 2� ä%#)ê‚X5CIÝI>„ga0.÷mÐJçR]¤rÓàðÏÔ¸ÚZQ|Ñw‰â·5·{ÉÔi¬Ã®b]ÖnxŠø#Е”àüò4Ì..þÌÄ4RMK¦iÄÄ>G±˜*Sé$а|ÒKÔ Ã¢õ%·(¼!7*3ЃºQ§¦séœ&v ªã]fhÄ*ôW#\³òE”Ê™†£€¿êZ <ñ$ñz>.£Ë ‰&2=­ð¬Ä�VÈzŠ(LfC–~® K©�V’i”ŸÇÜ’²ŽöÆ<ô5Œ’@—÷’@�gɆ#y]ÅPEï­,ƒ#(«V,.Œß´5c€‘‘KŒ9ç�ùãæê)˜?B!}ÝÉÌ ‰j"ÁOÔí&£T5µò;Sés Oá[,‚'=@v–h¹æRÇJÑs¢ÒÐ(ÇÈÑ¢`@Y\Oü~�ŸÓÏRÒÐµŠŽI:£­{éLTµÏ �‡ž“ž$q¯„N¢Âð"Ä ÉÄ|Á V¬®¸ûÈ0Ü$sš¨$�똱5¥Zqþ?öÞfWv&;Ó»ÝêúšŒ[eÃè�£=°g‚P-\*AV|÷ŽçYLfæþ\“2à��38›Éd’Áˆk½?Šo…›DÊX×r8„Ñ2ÕŒ~…Z¦q°&nMD®t<ãTgð#d¸½–þ Oͪ‘q.óÑHš(Er†m éð%ŽàáNX=ãÉfÿ”_'s36O4�h ÛïþŒê ¢ÊÄè0ng =Üž¾«qÔ)¾ Íl¢ … ™Ë{¦’F�†�n^ 4ZÃc²�[Û÷�,Œ†k•l�ò\b™I+(5îSgw!9~Åq´pT�³Å4Å0·öc/Î[ëFýbÿ‰Êža™–RE§7kógÕ~D8ࡉÚÓü1ª`ë—V¤€þ aÍKb·%JÀ�*c9™Íü¸dм§éâ“(=ÐLÊ N7‘¡"î¿�Lôbu¢—î9%6Wõ`„_Œº ÷Ëú Æ2A‡»r�+PjÇÓ#­ñŽëØ‚„”\¼Í�iäÈÁ&YS~IYû6áe m¤CÒÛ¨¡j¯kçÜ!atZÁŽ=x�9…š[üm5®{z`f—yÐv®”¸¨äù>C¡'÷�,Ë|šŒ”ûŽÓñduˆ2—M¹Œ J‹äO§jß‘fIñÏß œŸžåá á¹b�಴^çýË¥Ç�%—0ô¬ù~³¨±£Š˜™V®•• jØAû€`°êŽÎXl_„nZCÙu$çÚ ó(f_ê´Åœr}A‹µõááØ'V ºªe쳄‘m³ògã¹B+ |%Õÿv¯1_–#¾îNj‡JˆÙ…ôå1â0�tfW °'Ã-L#‹áû‘ã´!§Í<ßÒØ�ºI�MM ôΪïÝn0ôÇŸˆ`…ë cu  n-…îK#ߦ!!Ú?¿F¥T…‡ 4ISÙâÌi´AKª¦·XÃû½Z^­!£TztÀAwJˆ6ƒÎ:7Ôó~Ðåàž¢š:*ÖGëCbÎ!1;òå  8[]>mÁÿS*³�ˆ|)ê²�@ è.(øÀWÍ <æ:»¥; :íÕ¦†3 ÷h8‹¡¡õqœìí¾ûŸML(=\Œ…ç2Ú)Ëæ»@쑟ËüŒÆï†x–YðÈ«3{!n Ø¿ìè–? øˆëïmDÞ=ˆÁßž+#›QèZ)äN,…czA-¯\7t•6çløN ÚêB{7qesÚ— ²Pé)|î³ÁïÂMÂCÑc�K-8„´>ƒý4 3ì Ú4Lhó‡=åéé^À�QàœÂ H„‹W,7ˆ�)Ó£ÿ3·Íó?P8 !FRƒ…d¬% Hi¤&òášv ‰ã* rœŠ*Yð6zELS Ë"XG}ûœv ª`Í¿ƒMA°7ÏRÓ-ÔÌ«{†f4ì½��¾-ì?BëEüf¿£Ž¬/â¸3~bpGŠÐhÎvìÑc‡PàS±†|ùç´Ø]rߘÙd¡ ò‡õâ2 ’J9ê|J6 ém!šDrŽ<‚ ÒæK¦�»½9o„)ζØ !ß~Há´ã“ƒ6µ¥-ËÒÈß×ë$ËÕж|¶ÐPN †*µ>—qø<<œZ|ç ÙÂ0¦‚K¡–W1´\©ŽtQRŒÅüp»QÁUÏ?é9ç/amKˆ,Ø?hcÌa&þ­ÄÅ¥¦­6hót—¸´ýKÝÜðƒÈw�OÍ- ËG U!ò|j‰ø¾ lòê_×øpˆ$¹7G:j'×RödïÌq ³! U~ú~Ö¾¶ Em‡;np” ¹A‚Ô*&<óý8¾'ãcQiލÛT®çró[Lmñç¥G@ƒŽ^¡ÆJÔ)Ô.bfí_yÌX÷z|êê+‘Çža®¼ØVž'%Sf'\†<Ÿµú‡]1•)fËvà=Ž%âLVñÏe%¼w´bÒû$¦T*¦ó§”®Îë��C�ʉ³ç뱉—î†åø|ÙÊ^µ@r�|¸,Þ9à¿FfÓ €gó*¯È;7€÷ê;ÍöÙv-n®9,Vlö(ž÷•Z5½4õ2»ŠË0 2³€(ñ© ²�νŒDœÍ—8Q)‘©ˆXèîõE¡‰¬4µé}¥ß<ÿ¹àâÏZ¹ïØèM7�Jh�À™Õ]½5yÎ曲7Ž1¨Rºd’dYl=�yÙ›E‰pކà•«Þw_®L!Î;!¾œÝÍN?P G…k6¶ÌH¼~ª„š)H$Š(’´Ò¢ö²Ëa~=ÍЋ“¡£Ç™oÙÜâ�rUO _7·t¢Ð~oçð‡¿ù º}�•Ù\v¼ÚS€)uÌÍI¯¡MaâSwôþ }Ò†–߇OÀRÞž¡é» @1Bʰ'�p <æŸv㡯XPÙfc0³¬Í’û$<7Ð4°j[S÷Ÿ;ï\!ŠVÑ·€‹søùÕðZ³B]¡ûÏàÔ²Õe"^ùÒs¥¹1;š\p½Ö?³•h³‘ÊTƒ?+ì:W‡¹k(#8j‘l+nb ±_ 3ƒ¿¸¼u+¹ÝŽš¤\”û½W­¸D‰f¶‘™§-Å|R¨^pÓ2à2œ Né¸Ë ²aìn^L¼ ™ÆF�}¼ËdÄ,/r÷xV×ûö¼ï> ¯sZ/ÛBÙ¦ójŠÇgD»Ê€¨‚-Lžu/ˆ?5úJ¤…™ÁP–x"CT¬� ³•ùœ Ld8¤—|>Þ24ÎиÚ(9LïR*…˜f½]Á=°Á�ì4óÄ`¾?®Ä¹#eç牌ւk$„5j ‡{ž‘ÃayÞm&µsCè©ÔEݵSVyE¶°~j¾GYØ�M¬3É ¾sŸŒJ'äK*&©Wn€LšÓÞ6ŽðUÃÔS!G`YåUšé¬Ì”+,m2ÿ•ð6“IÉ„‡™Ö$ì'\K€J¸wgh¯Ó™n¬R�,+-åõù=Qî ú¯W)¨ôƼý -�ʪœ±tñ»Œø��Z 9)]ñ7R^Üáw¸á_gÛ¿Â2jeséàžÊ"e7j’sîF‘•T¸Rú $é ³µcCĪašºTÜ� âbàîÂùF“â4÷²ÜKèÄyy�Kjšg·ø�_<]ذðб1cî’ýT�ðçî3¥ß.Ñ’#¦þ·vw RÅG¹Å H!Ø�ipÍÒ¢9ìRËqcØ |Ć´ñA:d× 2½qT2§ê¬®ReFœ33Žƒí2Øã'š£”r¶·DœîtÃ#’V#xJ¢uæK™:)D}•+|„ÐГ»Ó#‡%èfâÛFÕLú*g †Ïkü¥Ä| ‰ù§soqŸ.©.?CtÒ 5î×À á(0çµ:Є¤ÆÂÇ7.¯÷½AÄþõ¢1@óƒz!sÆ=Pg¨.÷€„Ê3˜· r™´Jª+ˆþÕ(Û"Ò�N)?‚´Á–" rß|´5(�LÝ^m8‹Ï6Ô¶¤Цy(�e‚lP¥ñ–8›¹ûÙ@(îmh^ÛÏ�¯¢Ñ-p]8D@R0'CHƒ†_‚A5x¿{[[±ËÿÆåÏ'\spö$ó�_£6E0Mºh/R‚ Àz1²Ìçݸs#àZÀƒqÆ&Qcb#ø””º¨.ºåxAG a˜9" ½Ÿ�< �ÐŽÏ%TÀß—m¦mmW9ÇûÕ‘9 3À3¤Ù3Šb§œÏê¥Ô1'®çÙæ²£v-ìüøÚ›‚ÛÔþ®•çúµS5-ºFïO†Dœ4¦9ÏíL͹®¡¤9'ײ´ca+è@Ͷ%2�†! A2¬ÐùëÎKrÌéÉÁd–Õ¼. †DhIP%‡Ó/I‘�§‡²œ”xA�ùE#f-úŠì¬éâìÁ×¥¡K�[£0AÝ‘²Is¸�]¸ËóëeZÇmÕÚ©ët¦jFˆÙÏýäª^‘ ��b$¡Ú*v²* ‚Gk�x Ò¯Ôø”B&è¼ÁW4ŠÝ§šòLëU‚º„s£Ÿb%²ADÌl`qçø.Žp}Åh ,hje'1ÐO× NNL ^Ú�–—Öv…,ŽpÉn\%§N<Æ'ªƒRÎNq.ÁZÊç�¨Ðëï9 „š‰K1‰ÑpuQb"Û&ðØ%}t£ë…‘fÿæ PPiŠ´ûᙎ�x^Á�^ÝÒ#"Š%Ç©ÊnÝÛ�´p™*†�¾ØÄ½¼•ÂRãiíØ:#×¢a³:iT½«dq>6 ͆P‹ž@gÇÕÉþCOcG�_ßÔPŠjþ¢¹:ó-ƒTLûH%¼&õ�èÅÒyo$3ha ~̘ÕÏe/&Kynq%Ìs·-ÙdÌ¿D�ž'‰úú@¾»é¿raf°´ÊÇl&ìQC€ÃÐÉ‘£F‘Q:�éX/ÔÃì5_•Õk„tÔé~‘Õ æ)”%'f6�+’�MngO=|ì‘ûÂÒN÷ሞ ëVÄõÁÄO:üÑ- ’dð@s¿Ûà ݬ(õ½(y~ôˆM%bæ/Íý§ó\kŽÚ–9D;iÂá ßÕsÛ›ÇF^†\”Åñ�#»Î%k¶29ú'Ì©RáF‰ ðü‚j&Ç’æeñ äN¨\buê¯Â§JcYmöêG|\‹ n„ âCá]eÌÇuEiT¥ ú�Ï~ç Ž… k="ÚCª\«ùŒ˜ÚéQcwÌÝ£/ñª4Z*Qt )!AÑ!Ÿ ~A†½óp1ÓU®˜ú¾ÜÉØ!£÷Jç´Rùu=Ö§½w/âÑ‹jH«bM¥* =‰j«)äwúPðEÆ�²N;»Jc¤=¹wx`ö ›Òž¿ÝO’GˆñIMÞŽm›V¸�ƒý v4‹Ö¤%Îù¹e BZ*´ Óù $خŊFÒÎ<ËC?Ôw,GÕ ´“:m·¬¿d} æ”�ÎŽ­U§´�“ÿ<åIÈ–‚Ðî§`óSðè k1 ZCl™5w¹‹îiãFà‹mŒL T"ë\z­˜¡@�“ýtád•I¯Ðдg¼¯°Ôr×M8˜‘’Ô¨‰U&®šUFöL¼!�LŽâv^´¥°áULÛ=!‡–g¤æ¹�šC— êcŸEs˜9wL§Šò³é7ëÄÂL2G àÓÝðØ\«À¾VW¸ö /•ƒÙxBiÇZ³Ù^¦@¾tÂ<>åàãßDçΟY™š�AÊ, Q]�pe6À¶ÓT猳‹¨ÅÝ¥º9ðFÅÙŽõì1<ë2ú#”–@&?cœå•i“Ü�„"dz¤6U¾yxâÒF»bÕ*¾ ÚlúÀéõ(+äÎg®»!°8Ì"ç«3!-:–ÔUØëõ…IeÓ‘@Ç¡wXh¹÷0ÉQ›ƒ=UÃÔ‚ ’údX|=VV€[sšfŒ”€«ˆwÜräG! Ÿsž})�±çc²š K©ð¾lP¬#c!¾L[ƆÅbbÜ4_~ø@arà8ÇA½ G|�¯$gÓ¡£Eeƒ¯Kcíd±±·2}�µ�(!¼°õÜô+ìñ=¢8¸£p|–ïªø¾ÂzË,¹8~* =øèElîôœ¨¬"3§¨Lês”€îzm%Ǧ–to†ÛUZrše\Åbßœ'(„ЀF{€ºÃ»"•ƉFqÚñ)n7TÂê^C��À‚‘ÑcEñµDf=NWc�›Ûë¹Ê.{k<ÉdC!ñĨ£Ï†¹uµ&§ûlÌ+—]–ºÏ¼ˆCŸ“3’’*W7�)¼â%]ÛÀŒ$&dûSy%°ŠYxÇ}ƒ¾üÝ€héÎF~6Ž �$Œ„‹¸ Ô.x5SÈçK ¼å*Û‰/R¥*¯µ´™O’NÚØ&1ß³iU.ŽÍ\z…Ç7Ù·×PqY@"”ªëW¤öZ€á°i€‹He6X�¢&¤9JÇã­˜äŒ1àîÙèÙªŸ`¡á¨Ï…Ñ“b~‘.Ëqp ¹{…b¾U,{æ²>7D��°þ3B4Ëœ^Gà£×¼.ß] ð†æ2É Ó9ÄI~Í“毼LIYü¦-ÓOøÿ�!z7·OCókBžJ#B×ç¶À_À��¦<çé¢a?ef3Tæ�q™^5ÃCÈ Á€� ¡M;#ˆámÉâ�/š_m_d€ lç4Ã_¡©¨(t,ËTr†H‘Ïjüù>Ò´‘j{œ£/TDÐÁÀ®/ŽÊ8CpN—ï-­WÔ‚f. 2mØ3ˆmЉÉÂç§L¤R,†Iu ¶õÞ.ÔI”þohêÿ)‹A­/�¼î±¼ÑÞ”°ë|åòÕ0t¦7’øežv™µê¢?JÅ�©¾§åµÐÃk�G˜öØŠFuËÎCI@-µ'˜Q"28zÒ„cEqÊb·ä&×’AŠe «ô‘IÕ8ÿœ¦^¿h,S<‡&|–< Q¡Ö|x4Ëœgã¤@ZØÅæ¹¾Êi_²…([eñèó‘1ÄÏp¹�³AÁä}K(ÎΈcIæ@ €ƒ2?0w0`ÔÐJ�fƒ�@lk‘bŸ­,ô¹ê[šVˆ"ü��¥À„ƒç¾r°�òÜwü ½þ�ç. ØßX ®õ„2+ڠЀµ'<“¥Ú–%)KÎäq+UÛšô)Nhìè´bÇe(˜2€&Ͱ’–΢ÐÄ‹dí•Ë-UÚò¯�QhõxÒ·,˜TËs›Ÿ•C”#³ÏöæZDcèy-9ðÙPÁªÖ€ÊyœÔ~cÿ(¾Gn?ÎFÙäüUˆÍTIú!Vj!p.’Úf—´ðïeié7øQÄ #ó1ʘ¿¼82�YÐÒq>¬p®¨£>å“e8Ôââ6V“®Í°'¯Ü¬- æØgÃ�—X¶ €Ï#ÒfyÅí³‘|Šß¥0/ªÁzÿ¶XšiØW'}­áÆ~Xv]ûã îLNÎÆPÍÒBJë�º}+ØL/ž£‹S‡8P” Tß³± S.pþ,F�YzmÈ´hût�õ7‚gF°ãW^u¤}–Êf�Æj„*!Ú@mq6ÌIÀÓ/=SðÝlÝN(0Ɇ×EõPNÇ砦ؚBÄÈ:ãü‰êìjØ­ô(ØKBõÁ«Ó)ã{¬ÕŽ}zJVõðMÇŠS‰ž™~óxm!²Ð)� í¢‡û1@¢««8RÕ§‰)ª`ù¤ñ7¯}G˜^(ÞÕîû$CIù-$`4á䮽Ä_²‹f7¶±q|óUÀ}ÂBÁªÄ9Ðwp/ÓÔ:»‹ú 9©'‡`ŠÚ··VÞç» ÇX1Í)؈‹°R”·)éû°`Š—ŽøÔW¨Ib¤H‰ ØP-ˆœ`Ž39ª²˜–4pWê…Å[ÖSÝ‚õÙ˜£1ËB"ïÄûÞ#ò$;–ìŒ Žµx\€…ƒ}çb»3×h:s3†)vY†Ò�‚¶¢æ�˜R¾9wõ–Éðî‘»Œ]V[/}U¤‡;§R­nÝ,È�"sÈ ®)˜ d§Ç XÌm‘|L`&ÃuCÝåŽî½Êõgñnk%¬uŽá&Y%cùj—UÔÓ(&z ÂÏ9¶õaÕÈ]e|¤Y™(-õ@FÇBC� ¢.0Ø¡¶®¯ûä6%YÌ×¾^šÞž[M•ŒÍi>2|Ô/­U£"ø{¿?üw—róÿ'ú�óœ¿þãßÿùÏÿǯ¿ýOÿùúÇÿ÷ú·ù‡ÿüþÃù§ý§ü÷ú¯ÿ0?gù¹ßÿø�ÿü/ÿð‡?ÿëÿõþßþá¿ÿ¯ÿüïÿÿýù¿ýëÛ÷^¿þö?üú_ÿ—¿¹þÛßü$6pþòù–Œ'ü3Ô�ƒÌÑ*æLÖð0Ò$¡Ñ‚P;`¾—[UàÔ-FPÿ]‚·ØÀù&5€ºYË·Õ`Xü0€½¸5,Öo‘Ïl�ð¿@q׿×b–u!>9fª§"´=ß*ä�Ðû`cŽJÔ°áØ Û‹2›Gà8ä6{·!8rE:iDe?Â匴·™8:‘OYWle«q8EÞ×g–d'Õ,Î;C+þÖN(©*.õP¦ý & 2ŠÉa°t.°ã˜M”ª½b6Aªüì¥÷ç¥UÏq‰Ú—{ úcW{ä$ˆ4AµÇ·=ß,ûôíu_p}åg‹ûÂEÃDùt¶/dÒ·¡}RÜ~ö±&Q!ìë‹�¾]ë«!e3«‡)Ûsþö¨½þmMO‰ã*¿ãHOÚ=åþmD�Öç¶—3  �óϾóUˆlþ¶›¯ÜÓÔ¾]æmhõgsùªåiùö”ç{$}8ÉWp×Ïòœ˜Vá�5·í#ÿ°‹'Ÿæ=þÉ%^NÅ”&’Ó§t’óå¿ ÒV?ãÍ–vŒNÄå§!ú… ,2äË}åw¶ûùEÛÞMÏ9Æ\°½ÎÉ@³œÈ-¿™†ëC5ß íÞ„”µÛ"œò7ÁÉÓ\)ÌÖ·!8$ë'KW ¨X’Þì¿‹BDívýÆŽUc›}‡Åá»ÇwÑ"àåñ]T³¹nkoþÆ…óéè}Ÿgy »€ïFÞ…}*Óóÿ;¯9zÛvS .¬áÖM@K:ûéÖmJáºMºS‹ç¾½¹?ãä]: ¢5!ÏÈï–Ü(‰¨÷Nܨ˜×Ònn¢ÖŸ§ï¶"åǸí¶Å<åt»lóD’žæÚìV‹R á©Í÷ ɸM±kŠíàÃ@[}jLœÖ±RbÔm»l��¤Ÿ6ÙhÑ*ҽܱ‘a…¸M±�Æ ÎùôÂÆ¯ö ÀÕ4.¤žõñçÐ{âax�%{xc+5Uîy¹[ó7Y»§©u10·—µïçy[Xß>œ«‹Jçí\=÷ʼnèpVW)Ò›O5øÆò9*÷T5(ÆmOÍ–€»þt¥&xkå6£f&ABc›QÓÌSxzPs)Ü£m= îBìvœ®ÅÊÓgšCËOZÎ,ŸáEm ‡éîÓÓVš0“«ÝnÒ0«Ho7iÜXñŸ&Ò£œdÃ<"ùªí­Ñi.o^Ñbc�Û,“èb6캽¡ñkfr~ZBãA‰ÒÅr‚v#–óm�A¨/òÃ÷žMfV_vÏ€Öz»<ó7ˆ¸§¹s"`›ãb{:§(�l'g>šþðoÎ"qÒ¶mÎÂHÒíÖœ¥¾›4ƒhIGÝÞÌ�XÖu¾Í�Èy½91S&Où>Z×-öö]ï©ë›ßòopkêö[f�‹'´–|dlË»»2º õaªÌFéè//å#øäoʘl…srsÊË/ùpš{º$³0¡ ·]’!�±PÜæÈÅMÎÓ/cÖ…Û™Rvi/+ä+L4Þ�•ýv@F¥Ü¶ÇéX«ÑcIaijÜ&ÇöÉéenL±.¾õen ˜¬><�‘}ª×ËÊxÿýt0ÞǶqñ‰•e>Œ!jé–­Ž’YÞÝýH¹]‰ï¿fÄûØö FÊ…³ÞÖÃk˜=‡/¥>Ëm4œ#); cÍ ’æé,|CÑ·µ0hXŤ·¥ð!û!�7+aÞN±µÛCøï„"€þØîÁ‡J|á&}O8ȹµÀ……Y0QUî·G°U¥Z߬�ñÚC%jYÏÁâx[3™ŒüîÌ*È:äÈñpÿÛø—Â|ÔÓð—{i0²�~ÜÊeš,§_rLŒO‡ßðŒ9_ƾÇò–Ú~¾d¼òx³ñ¥°SHº-÷^àÃjÈ…i/ó[Ú§W/+ ænÛ¢¡XV“íÌ‹ërÍùÍ�—µß¶sÑ'SÄzûðò÷Ð ïUçç4êø-×]ðSaŒ{1ÆrWãñöØ%Ã;y[ër�ƒ7Ú8ÐfÈ„=�t÷±íŸ ²tÚÌçã QFúEî€ÍXÙ&¹`혷7.í)¼roK\Žqó·n^ú�ÛpYªo¶·@Ì4³]n·ˆ~^ßò8&»m±¶nSÚoK[f67Ë”¶’Ž7úp°%`Wb#™JÌ¿ýj÷ßO›ÚûØr§­,~b}†¬; %Ï¿Ó<ùóGSZÊ�*>I¬¤Û”ö,K{¥�h¼®oSZ@{×ÒÛÙ^´g^@ŸVº†_^´|ŠÄʶ =yÍDo#@™¶§ë»­�ÎòíKƒ¥£VCFúË{öTó©rþ9q÷þ³÷,C%>*ËÃöã›ØÙ�'¯|Ñùí=kt èq´ô³÷,×›šS$=?¼gõò• ñëúöž  -°+îãGZJåYCà¹î¯âœ®œVyùÈåpùæA«!) $,órnýò µ×wúÜ–¾Z�™Š<™O Z´xáJüƒm8Ïæxð¾¬h}à Äýú¶¢õ#‚Éd­�ܾ#i$‡ßa!ûÓŠÖb»Ôù€²úaEë`¾”%–~¶¢¥”m ~¶$Ì—-Cà ®>—-€�ŸV´ñ†¡(u̱GÄö“­ ˆ½sXæüt¢ÕíMÜ>s¿iù¶¨'^8©�?;Òr‘\|Ñò[…´Pxù6¢õJô©GÌŸiõ'#ZAçÂô/j#õÛˆ–¢�¥§…úx3¢µ‡sf*Ëböˈ6àííÛÖUÜ2¥>ýg願æL¥äŸ�hõM½¸‡Tð—-é~kCÖêz;ÞœhM‚73£µÈŠûɉVÓt‡Í-oüÉքäeññ§o#Ú«b.Ð~öŸEØ¢Áò�Å^.¥ôm7;αNÿe7Kcqzó›õ3ýÛe–/¹çÓ\–œã�Aÿá)kFœ *>™OYn• óžQ3L?zÊ^×oa<üi%{‘﵊ñá K�ò,?ûÆ’­?Jû¶‹â‚Ë·K, Û`öËv�F9Ê·), $^¿Ü`£âš6�EãR7²OïW³ÑD|`ð(ü|y¿ŠúCÐÞ¡ýgïWïxrpÆù´~ulUjæ�oýÛú¯E��OÇ×K-­º�^É[È\þ®ü]ÚÓÕ•#ˆZl3WNpDN[W �óͺõ>göΑÇËÃ5jqŽŒ˜V·‡+³´ ·ýÀjâúÙÃÕe¸©zŠ_®Ž =„’ò·™«ÏɪG±Ìþôrµ¨·€¢©ëíåjᱡ.)·—« ø:ÐÀÞùiæÕm'�yM%ßf®QYŽâ!�×mæ•íUÀíz3såNo![§Þ^®Êt €L6ðÛÔ•»$û¶£ô éÛÔ•¹Spáœ;EmSW¥˜ê€Ã’J)UŸ ©8¢”ŒŸ¦®6ªCd¥ºoSWaeÇÈI¥ë6u¥AÉg|3@‚>]]iÔ"¶ƒšªçíêjƒñÈ�‘Wº]]m¨ªüÎ%­Õ7WWùJ Ä)Ø»l{WÖlT@˜æÁGÝö®¬bç²Õ¤Ë?|^ƒÓ”§ )›åóê§Œ9秬&-Ÿ×Ó<1Jž�pyóy¥1�ŠƒÎ“CµJŸ×/&Tø¼žÚtìkŸ>¯4͇á9nŸW¤Øwxñ·Í«ÇAär¼–òfóJ "œ}¹»B’÷¥jˆ�¦sÛ¼‚¥Šõ|Æ#çš ¶¹*�jÝa!‡«Ïv~=õ®$(MÇ4�¹ÖšŽ»5�cïöt~�F‚•ÙHNp;¿ú5Y…LÆíüJC‚—¶àÂÓù• Z Ìæ¤Bf;¿†‚@ 6†Ëù•�‡^Иiļy¿†ÌÛ�ùÒùö}�_¾Bô<#¬1nXˆ¥2ì`-Pn{:ÀÊ:Uú ¡¦ÑoXœ$fCR/,`=®ŠHbIëoV°6 ¸ãÅiù¶‚ r«üÚùbõ˜J߬`½J ì³ÇÈ9Ê©_^°ÁjýÁ–½j6¬ŸdL»°_Õ§¬ûb™PL*bN?<`yt²>(—ovØ›,¬íãŒ0àËú•Ƴ¨‡(ôåKé é#}{ÁÚÍS:œíúÙ Ö^鈆[ûò‚õJœOÎ#ÐÖŸ^°�³åqÍØPýìˈ'+ïü§¬´[ˆU+€on°ìÁ€™™ŒÂöXÝ?¼UïCËSu‘ŽÛWO²OÕ^£`z÷aoÑ_Æ©ûï‡_ê}hÙ¤Îkœ³ÝQz{adºQ/a9Ûo/ÔÁ:sŽÛuq?ŸÞ§|Ælò²< Ⱥ�N‡*?éÍàtþÁ`Û×TXHTgô5EĽ‰§�©Ž‘zVâ>$¯Û½”Úk+ož¥º®óö,åo`@Ûª´‡+èÓ ´ „³|I©Ç’Ûv¤ÖgS{³!m²çmCÊk8“ŒíPOQ†º�†±Ç¸MGÙšzÞ^£-|îa1ꡜngQ>¢Ûå2Å‹@ðÏËPO“ÜoQp}.-ÚTAñ0TÏÛçÒD�TcÍWúö¹4«¯£ÖËÞ’Ü4H�íj‰‘üƒmf)%<•7K4(¨!lëÊð£·Û±²+=Rߌ*9–ÑZJ@B&QG…Þb'÷´¥�¥kÛQö°³Û.”Ý"Zz3Ÿì8¶�|{Nö²WËi’0‰ §Ád§LFœ³ &{‚pYÕX²­úÆÓO |JSÛF²EÕd›G*��RíÃ3’c(Ë*’3\˦qò[PïÓR,+�›¥„Õ©9ä~û@rå, OHèËÀâ·ý£Êt)Ý®�X%0?ÝÙᤸ&aA5µøz;µqÚ›§#©†ê:î'Ê ¸·ƒ#Ëoy7‚�•·üÁq“KÝ6�8ÿ�Ñ}º3¢"äk™2Ö}¶#^HˆO FޱsÛŒ`Y�¶i"Ø`m×Ö‹µ›h;.Öü£ÇgPÄzóWDðŽ2ùöWÜ{®í¯3zâÓVýS¾g»)BžÈ�]rƒÁŽÂØÓD‘c¼:Û;±º˜ŽÛ2‘ëÈA@ºQiЙ–S"Щþâ1 À˜K³Eä—^‹¢ �‰½,v› "§„‚×ÓûðZ›Ùí}¨†W\ö¶/äïý-ÛµÐâ¨bEí“mZ¸«—Û«’<~ O‹BTVÌ8,gB]z¹ ¯ãçéCHµVéŒù;3AUÛÕ³¥Ú╇·Ù:!u/¯l®‘í|3"´ÑÒî ¬ÜF„§&gɆtÞ}ÅÜ%Ä7©ùÑóiDHã¥$Ú¡œæmDH4sÄÈрп�×ì*N«C|}Ã2 ¤AUè>aæÛ€P2(ErÞÔ˜ž„„„AŸc…4ŸÛñY)“ur Û€p¡ÓF ÓB¿òå¢K8\‚!Òn·¡%«Jó™bÔ½ /¸Þ׿žÿà%¸áúVºÿS4Vù¢ŸnƒTw6¥öi2HÜr®jÁ—·à¥FÔ,Þ,i köå$ÈéÜÑþd ¨€LlÍÞl¯k1e?]þ"%ü;&�A@õŠëˆŸðùñó ƒ¦ù ‡¨¶O“ÀoÁÃ$Ð=xLkš9.çÍ$Ð >¸º9a"IñëÓ$Ð,ø’:ù²î3/ùÜAËp%·•G#ž¢ãÍЭQ6V;Š™šßû‚V‚ úf $vãϹ?Ëå×—% =)uv.ßÂOO@Ï뤓TÞ¿M}4îR…º½M¿Ž?M­"� Äýê\eô ÖpNîèÔ�ã6®�ÊR}ï–€Öñ³Åˆn÷¶¤!%_!Nk·7 «$ja•7k@#àôr¤ê©VÁ2´Ý¡Ä4¬o#@/ß§9×�+¬e(Çû LSäˆU –ž:”,(CK¹‡ �ξs>"o»�mp8%Kívtñ V- ÏåÍ Ð¨?~vAküv¤AQ¨Ù�ôÂ]N€4 Œv9Ñ]×› 9!ïYGßN€¢bÍÓ@«(· ³ý�°�KÑõfhªÈg]§Þ†€L �Y·` }r }®üf¨”èYyö2 ä•C�wuÜ&€”.×z‘©¾™*7[…ýÍŸómHÉÙíýP‘ …7@ªJc³£­ Ò ø`¨¨¼<=™¢�ƒŠÁÓIHG£žÒí¨ßŠ*Ùx¦t;ò D»š7o€`YÙoã?'ãeë¤\dAÎø÷›¸‰»�à!œ­Ô—ÞŸ"¢ kx ­çíüGÉÚq]��ÿtþ£±hŽrð®µåü‡–¸SsÅHyQtõ)u‹uÏwªŽ7ç?}(L i”nç?¤±ÃÊ·ñŸÇ5e˜ƒ‚9ùiü§`7óÎl šíüJÞ‡v•·óŸ§Ó!e~Í ×žÆ§|D,Ø2Îi`ÿ¡nEâ”v¹�ÿ´³ðkæ›YΧïŸ(‹óZ(‹qݾÞ”öÀ™§°mÓø_E~‹KÒžß~§zÒE+¬U€9Ç‘ôù°7»?5ž ¦2aÛýù)or펷m÷ç÷ ÇŽ">qÛý��qñ¢f@QtÛý1:5h˜˜ÇË%çφ§Ýßwã²ûã""%Š{ ¨eÜwÊZi1—JÔGžv€�4+mo//@ð$¶Ëßý÷ÃÜoÛž~§ ~SQ n{ú}½ˆOO?ÑH@ÑZž3cI·§ŸzTÀÛ”¡›ëÙöô÷ ¬ô±îÜÃÓÏÆ+^߫ij�©˜CÒΠcæx{ú C[Ç›…í$ ®þ #»¼üÔ¿¢Z�ô[Çåågol 8®¬ÐÃËOËJò¨R¸Þ¦~ÂC @Y?¦õÍÔϤõ¸^~ZïàrŽX÷zL'Jè‘û.?Xù9?¹`“뛕ŸN‡’n*®o+?Ž·˜Ì­L;o/?b7r\'Г§—�¡Oœ³¿¼ülh*@cI×o/?޲\ô|šú9 ³„„ÞØî~B¡$ r­âÖÃÝVM"!$K_‘ŸÜýIJŠ>Mý”Trüs—oS?]ˆ7‘F}sõ' pœ$r�ÛÕ��]•ʤ,ðéêÇ»X4?‚d”C*ýÃÞ�>Ús6|AD`øûÙÃá6—vYQŸFöúÍ‘ƒÅñƒÑŸWSÔqD¼nmàžFÒ„|¡Ù—Àx½ýÑ#ª s;Ð×7mýs ˜2afø°€á‘¯_*½JÞ/q¡7Ç?é*fú�9uõôtüûjûrü3ü†bþú6–¿ü›ãŸO~@’šO¾/äÕ—õ½âõE¨ój¿¶õ au1ŸJ]9‚7ë??*!k€l¿~´þ³—㽯E:x:ÿ…�ÓZ·JV~8ÿIjqé½DÍþhü'‡ÈÕeØë›ñXb�¹ÕHù¸«/ã?õ“� ƒWöiügõ3 *HSôoã?•ƒ`Ñ×”z¶<üœæ|h —¹ßÊ�Y�ÛÇ®õ�/Ÿ¿»á'{¿W㇫ßE>ïŠêÓ››ßï¦6þªY”y£õÉxš÷…²Ýy{ö‘1¯¶­ú(n¶òîÐGÅ@¢Ä2ækA*¾ýøFÈè½ÙðÍcæ¶u¨V*OÛ�ªÎpß=²uíù‘®�Ò6Ù“ìw¾{ë!�£ôlä)� ÅuÃJ�â2§O=˜Æêú†qu«¶Íæ‚È ?ýò8�yÛäQ±9ÆmŽ™\פ‡'¤dÀžÛ�¿/PAË �¿×zZái]ˆ¢Ý²Âƒr­vø¾4X›NÝ/7� éö»ƒT¬ëR4Á+©§»¸kj‰ËÔ.“™ ´¼ì2ŠCovDÎl¡¶oUÕ0} »:gJK¶tÛ›U½Î7{³rèv»š§°ß²ª†èþéc&à°çÛ¾ ùO^œåZÆ€Üó4+ãØ±\ÅXS0Þ¼Õ›,[?ß,ɶœëv"ËªŽ¥m@ÆŸ‰_õðãnÖn,3ôBMUp_V�.¿™‹!v¡ÜIäËǶCJƒ¢ÚÓAL¦vª·qXȹ_·_МÖß\ÂR m¡mÆßçh·'ÏðøÍ ,Q?êË ]äZ¶ñWuLo~_Úå®cØ|Þ<ÂÍ+Ä!æíO£¾¹{U„›�r‹š°6o//2Ò$úž^—Riç˹«(4ô2ìbÞŠaôòéª!¹{ût�kÉ\ö\ …r¾™r1‚7¶tjÙÛŒ‹UÑŸû0áBð „žR2bïÂB´�•ýÍq äl}m‘áŠ/Ñb()„ña«5šŒ·›–üžþ²Ñ‚:Vò»{9¾\^¦Y¿0ßVYÀdÎöî�E ñ/c¬ß˜vûaÍ…¿„ÐË+Gð²Ý¯ÒZ™·é•jVŒ¢‡×ÀÈÖo‡+vW5LÁÂÙ Šãü0´Â‰·Ü>V &Ž©˜:Ýÿ©Äñ°­ `Ï·]õ Q¶Û¯êPá)ÊÛ§ŠÚgØ=.£*„çî2¨úŠsÿšA4Ó&!üÓ� `[¢³°å›·û@Ó)R9P ¶×J_d‡¶Å”B{åzs–bRÓ´nÍ;‹1ÛGŠ¿û»{TM!¼M£€ŠP×Ü^QŠfRóyXDÕ"›»D…βé÷åñ„Îå+܆Pã¼á0#�᱄a�–?]Ÿ8Æ�ÜfO—†Äi{<áÿ­·³µ4V½mè^©íÕø‚§}Ó`n‡u°\›ÂL(ݾK}DuøiÒD¶™øbk#H Û’iÿýtbÚǶS_«ë¶Rêªv¾û.Á®ÈÝÞFUƒRÍvYºÿ~˜+ícÛSI?©«ÜVJ})>” —(์“U_³�“YÕõŒkˆ8n›¤.\óe‚ÄÐÎñ™»&ƒ#J‡Û iäX·(÷иÛùˆ„¯B¸KÓ¿óËùÈÄøùæw4–¶ê¶92e;ÚmoD&µ´7S#“òµl/#/¡[ìZ€˜7ç¢-V»‹Æ ä/£¢±^Âý‰†X”Q/•=ž·-Køy,L…\€ñ�:îCP©‰Éž¦Cª ôë6ÒNªŸÛlHÆpz³B%¸âvb Âyý2òîãg¡¡nrý¶ºö®æÓ5H�„:~v Z®W_.A\¿ŠCÞ@0ž ùɈó)–Ùû|¹™û4ºÏüƒíÏØ�e÷3,ØÖÛÌgOOs(©·ÛÓgœñ ¾¼xzYzä?Yù´±ü?©Õ^bÓøGÆÒ(?ûõ >‰é—M�²”ðP?íyú >]y:t¼«|›ñ0K‚äûòà™ !Iÿƒ÷N³ºÑ¾-wÚ±L>�vÁÎëXøê´%§úå^ÒÍò„ŒÍ—�Ž0ÌòëËD:ñÖ�zçåBÃêË2§\± ú²Ê‘�×~pÈ)Êýúч‚ò¹Ýyž~8el“‚œ2bJûÑý¦ž±è}™ÞPœ¯õ¶ºÛÇá(»mlã^quF”G�Š¥Ì¾‡pÚóñó¯))€¿_¶5ENf>Ýj ‰³?frþÁ¤¦¤�zÓä~²¤‰ò¸�h>#½?ü£Èÿ߀æÿ%ªš’�­S‘lÀè!Ï]Â’Æ^J=Ôá®óT«wCdûrÔõåÌ*ÖØã Ô@²V3wzz½)láùç(z!BT�!²H¸ñÍÉU´-¼¬�pþbržalMsl³©kWxbͽU[ŒÇa&8Ÿ‘Ê16@¨�A©8¦éû‡†hغ¿9·ŸF.sÙ¬ÄÄÊž‘T¡S“Y–S1žC»”ò®öðœk°(;%ŠzÊ`÷4¡–1~ß{�= ã=„ÇU~Iô¸(äà;ymðŒ¢�À3pá}‰Ú½N« ¦'X+拼Èëqˆ¯L0|¨b¦µ{� Ü3B=­9¼âQÃ+ѽ¾Â¸`§p.8½÷µ3ìs‡¶”S’>ŽYGÆkÖU�ú´!Nê�š¦q»©xÙ/²­X>Îùq®´Ñ«ÀÀ„„€ç!cÉ2—¬æfzU´¿z†Î›NqÑh¥nÍ™³+ÈšBôI×$àH�" ½®èmsöu¼¾§‚V›½TM³W%ÞjsëE”9Ûã ¯„];ßT´ü:šë¤0YíAùžkE3ä®Ñ‡äç9)ï :"}3‹&Ï!ì2W�ªE$)±nò#tÀHª£üSÅŽ5Ï‘6­•ÀÞÌßVÓ)¨ï nâdI+äøx'=µ‰P�k¤@eœ,6X� ùDÖO»5hT­¨Ž¹ÒC´¡(5p�)0°rX7ú̹%‘rGÉ+ a_À ¤7F),šÅ¸a Ô|l'ÙÞ”ÚW­ãeô¦°O: � ŒÊM¨×­˜EØÏmR¡³ÐÆ*(1æÉу}YÚ——(^6Åb·/r_ŽƒstÉaÆ&Œa†,ò©Ê\ 0_ô(ÉñAÄÛí΢iþ ºzœÞ<ÓýM¦-ÙVÛÔÇ:¼°´ÌÕ7W®$BÁT–UƒpèqÀl;‡9hzˆÎŒó�PF›÷¿"\Êû×ÙŽPLÂ) ɦ¹ómÎ$OfŸÑtW@~]åçÙ¹í ¶Az ¼2Îæ‚0MˆPVg…Ìü_#è i+l‰¯¨=¸NάàZC @ÒÄÌÛöÌœ·�6Eª¨5ÔÙ ü��²~¾�]†§A²ŠdUè 9�ã 9 u44†i>_î‚–i¹^§GñŒ^+范^ ,q ÃïIŽódÜ/gýq“Ţüú«¬ÞŒ»€‚Mð²ižÑz‰_«®ç|³ÑÓ¦¹¢„SåžàOL d®s9À—Üóá+sy SåDŒE´S–"œ¿2;Å#Ú7L‰'~�ä¼Y ¹©‹8ÏGÕ3Šå¼®Iëç:'bо† =;d¯úù}©…a¬oy…‹~Å[[–·þGê”uw §â³Õxö@ø2NqàZ5¸Z_Ä[.<‹û»¾èd�W÷šžG9€¢Oæ|:¿�4¢rSô¼Na&¦èzRë›J(ª•ªì�/®Ñ¼téÔkšÝ×Á“FÁ¶Æ8/„X[¶K?nU£3Ö… ¹G–Ôz ]×cʺih^zX�[€8F|¼tÇ¥�=ƒ"Ÿ�ÝðÑIV:Œ§”íŸp›¡�çHÑËådN g¼WÕySáªÒ£ÆqèÒE ÇñÓ‡N,8îó+|@¹ÄÍ¥Vnqþ¨‚ YŠ–ÁüÔJïÓ/}à ÍÑòqa\£Wp)Zß 2Ãó*Utûx�6èÜ7²Šâ± ±æ­CjŸ õ$œ]wý\Wá´z9ªÖNŒW_y[˜XŸ‡Z ,B™`p½O¥ÅûÄ"?ÍòWKz¾ˆ+ ½PS˜ËÞܾôÊ'c{°»páZ`nÄÃ-s/c†ðZ:2Ëv˜[¶J‡º¥�é$ö|v\M'¸ü³S#ää1ÁÒÅéè10™Ÿ§¡òLYgL$¯½"Öü²R`ÄÝqBAˆ°Ç�)ä*T²W^žÊs¹Vª—¶1çÒÊçÚ³xtlX�8Hê!2^ ϵóõ ¹È3o°9»44沬FTY¡÷¹dï+2¡#âN‚^âÎ�ò¨-B™†×ï¿ö€,Ï^ãm¢�(Çý­ä¦ÔŒ#NVÌãIN×ZPg�ÒŽp? Ìel.zuÖ¦Ùk®®çêEdž/Ô´Æ_‚ìa�+@Ð�ˆÊÄÇþ’9Á´è!5`öW¿Ã¿Kÿtp§�0æ®0—ô%?Ö.·ÍËNñâTwÍ9äRÑ›?@«¡ݳóÕy­Z>Û+B:Òœ>l³fsâJÛNîxZCwßÀùîñ¦Cf'ìLf˜ ˜�§FudõüškÃ×—*©,C¯Ó2å<˜j(ãmé@$%Ž˜í�éÔxça�_ #Ð]CŠ-!#ºí˜ß,$©î´,³»ëâ›g åÀÜÉvƼ[!D¹U™Ë`~Ø£¿§nÉ9-ã\/Þ8lT�†$$„·oøUÙË$’°+=Xb²™¡“Íun­àïËŠÏÏ…aÁø-Kë{Îê½lk˺tqæÑÉà´f¸äža½Ë¹ÉçiíeX6d2Ä�•ë“�=”•ðÅ#ÌQsªiAˆUŒp�w:³SÜ`fx3ì>çF§ÕHe¶š˜?DÞƒIë/Ù’8æõ²ÚùûËIª]±â«[Ö:òðˆ`Ðt¢?­FÑÏó¦5õ1é5È>ÌAŠäÔî‰!27уµ–èa>·»c ÊÏØþÅ\jÚkçŒt>½P�^D§ ëߤF =ô)G—1Œé|cé£y5¶¾—êùZÛ$ðÓÖPDß ùêJb°×Uà8Ãýàrg[B$ŸßTR”D.ÖÎù“F9bï«9f½Pžìß="Ý€®5ìåý¼òÃy¨Ì3—!z(£_–»G½‚ÐRsK7žz– Å Î-§¨õ£;džQ®œ —Î6_ãÊÚ„>ÉH‡�à__‘z:£“¯‡õ0RSï=Sè3u Ý»#æ¢z\k‡á=;%n[‚çÜtF~ìq7 ih�/:â‹®­l£ó£ÃÞC¤å²®ìNÂÌ]ÝozˆÌÇ`z£âT"ÓÁ®��j.wW1¢ÙQÕõ”Øà.„—R`XVä�OfN{Á§‰4×ÑÝCª©ŒÄ~C9½–ŸzŒp›“v¡²±SwÊð2_EªHu¾Æu«˜2qwã4~œ ì¢O®B™ì91I¶ZýXfÞ¾% €H@h(™P8›ï…/‚Ê&¾]ˆðçè¡'Kî‚öU‡pÈ#żοÅÅ>!ŽauÙ6}aJ.uŠöÙp‘H� Yå¶„©ø$(†¯[¢ÙãØð~Œ^äE`ªk<ËJ ?nRÛ¬ §�QAÅÑ…Ïzo$EøJf· �$’ºê-ÃK¯a[I±>êÌa‡õü°6P"+“–ÚãÌ0qíÑÜPQzÚ*zÅ]ª}Ø+ö‰£): ßw¬¼Š(5…Þ–‚AZaº—¸Æµh–¯;Õ÷Œ’Å…  -• SýГ¦3ƒ“,㽆ÄʇdTC7BÇÔâN^yif’N fç9¼8æÒA0/ˆ•*i ‘‡Û.ÌØf^ØÐ ¡Ç©~)Irê>G}¾ü} ÝŸ”©FʪúEÔø�_¬X˜W—þ:ãÿ‡S 3}@–8þ�JXŸ±f²!"2›!ѹ�i„вn‘3gvØ ùdæã\S¦ÌìÆ†‰ŸDGÀŒâŽè!g‡œ¸3Ôi2»³Gß~"§Sž@ì`c[Àn˜mAŽÓ@Ô²ƒ”.ÔQ)«2(˜Ì‘çã‹ÔÇÍÓbgÑÎ�à,çŠ ‘»Òî«­}u%—\}Ù(‰²VÀC7$…ÂJ}Hh1²Ô1\ 9˜ä0Ì[ýƒ×\Áå,�om¥rl¥Úkµ±Zq`Ì=4xo§v5es»+üî?td´AqàþpÒðaä='Mª_ˆäã³ ÍÓ: û颚ÃòÅj+½5÷ LGñMÁ÷™£ñŠ<<†¢„îþ´Ÿç±Ä u…[/24¡[~„ÜwÞ!è@)õÇq�Rœ„@#éR–’ Äœ�۹ϓÖy´•!²Mú4ÅFBz<…ôø‡ W—ÿ8GÆy.�s/)\Ì\6è�?±SB ó¨®iÊtÙ#vbþyÛ$36êr%d '̘áŠìR#Lw#Àæù�Ã��<å«åb—p¨ƒÑKAؤ·[† i˘Deœšd×y’›Ù‰L®‹ïÜ‚¾ž“^_vUªP6â“sí"�«f,–7g  ?€F¥Ù¨:Ø‘¾fóïè1÷dnUëµTlæÀÓŒØáw¶˜rŠ”bκ*”ì7icƒÍÚe#4§ï¬§�—BèR%ðX¬õ>‹iEPY§öáKÕ”tŸ5 ÜS…„döÈ�}õ˜‘ÁÁ>ÌÒæ¾C_½Æ*~ qˆµltRìš#ÓHÁ,"ì( ÷C†ÿG{̈+ ‚�µr•_'YxÌ ®µÅïÕW—utüÔCÆ:ÿgcÕñ—Ûì:.Z^%¦5På3­G¶ü0O!ý}-/‹zSA¶-N\ÉXL›°XÂvz J8¹Ô¦²Ž± ƒëN3bLç^vÁõPh,FÃÆéiP›MŽ;G+’38Dtan‡ÈÊÄæuŸ5w˜Zìpu#e´çù4Ú2¨Î­¾€ ã~”Ð\ا¢‰ «ùʸxû朳áWšÖ´ÐjÁúCß`œ!è àÆ©´é ã[ e�Þõ€:ºà±œÌ�¸×USØ`H¯M]†¹wøRnò dYûÉ�‡J9›hU$…b¶Î©8<3Ìtϳí–X¹b§Ë§Ñƒ��SS}Õô¤êýäK†=j޶ŸÃ%ªèê÷hˆP-@!­›(7D/|ü�é:µ)$÷2S}‚‘["ú‚<¨hδ='‡]_ eDÃj,ÌRxš˜¥\1¿Iw—ƒ¸íç¡ñã�Pdž¸k®A¦°…5¤Ýf4ݯ]b�·�ø“Ü"YÓXµÃ‘&ÒR%3ý‡^Gì]órKI±AC­.`N;–ñg”ºâ¢j·:ìôbók^^œìÖŒ¡5×D×_]3zFBì1‹Î„óa}êŒ7ÜNb5\ï™ .‹�f™¶lñqǶeæ¸ÌŒâ7 ƒt;_ ÷M3Þ~äÎf�Žû P ¢×Ðc“lI‹}´ï:<åãÈ+shü×ÃF4/¤Ê²Çú‚Ø„ÎÇŽo4“gÔÎuȵWF9½†=[ˆ¦,™•9ysÏcúL1}2Y¡ïÛxåDÑ(6‹äw¤ç,^ÊW/5š�k“DR·;sG®õ›â…iŒ×#$_1B®±xÔ] ðà¹ݘ8æ°—KK¯#iz¢Þ©=TôÀ¥á ”oÄ_˜¦° 2A>{„ °^ÊìÏ2”…|š½æÇBú¸ëjØ-/—%D\–DË¶åŽØçÐÏeÉÈä�‘ñ€pTÓKר…5çF#ŒL^6~“ï\[þCÔ#˜]” âÒô¢jî¥/,ÖMêf_!'m#¬¹~…¤bJö᥼YéÌØê†ÃK�)µN0ÃâþcZÓýtΉ.IÅŒ|óüÎ3Ú÷àtZ ¡1o:0茇J+Gª)~‰W0ÉY¶y:Ðäef¯B2î'Òk ,UXîa–6{ cb⢌˜H@V=ê—4`Æ=>�}þÞ¼d×��'¢ØæIEl8ÎË´l4Vè¡�‚wlöŒöúÀùX2 Wá©§3¾)óz!KmÝ*.X¾)�¿çˆQn�¿ÌYêX«³YJ8(€dLÃæÆW jBéiÌIÈcž˜ï7/]ɺ›×2Ç:ÁYG2SÓBeoå#“žïÜè\ J™|³M™¿¨æÜ,†Ò7dåBVÔ}Zö 3CeXºiåЕç‰/!þ€�$BR¹ò=¼† c rsW Ù’Þò>hŒ†#P“ó‰Ô#Å@s‡Ë@¬­ï{vü¶Jáèá\ÑkD¯ÂÖ…âä˜ÉŠ/ …—3Ä?PÎa»Ê^ü”cìÚ´½ˆÙA �tO®é#Ñ«AލqÌra ͇ç1 ÷§œ»áê6ìÕ?ÉÖ?xr½é$‡Z@ÊñÚ ý, ØÚ¹&о& àG8�,ÎqèœÁ¦Œ0ÈT_Xgì2ãÂô-[‘q3$8…B]áJ>%flÚÓ©”È/P,Ú"Ï11ã˜a�~m(JøÞlT/aB¡¥T¥“Öb�”°hY>œîTÍ´E�3^8ñœ2Gv&&²/?|6(ãôÈÃy{”8[ü1÷—º%uÍ�s¾ßÒÖƒ¸%p2�‡À›?Îë®\b½ø1Ý ö¢ò_²šúç ½ Ùü²^ö—%G<H”ÓèqKmk¦LC­#Ãb›¸ v PŒt�[,UûYc.fõä#ÍsÛÝ4&‹ø£$QÆ�L@Qi†Øü¸v4Ä ü؃ØìѤ#AµFv¶ðšÑáÚ^XtJH-ÍNhÐÚk�€›�6Xœ†t=Ù(±!Qj.¶3�ñ5�èÑÈ‘2X;„Ô@A€J'%Р|%�g‚�fÉ"›F^ Ò¹f àn†-ˆ‘–ã�VhFù(­Ï†'h-”òÖW3w‘k8d–»{SÇ”à)÷öÜv ,{€ã°Œ,þIÔ PÇM¿Sƒ¼ã¶¬^-PR�M%ˆ¥ €vQËú´†ªô@L9z Òh馂̒i1 ß/㺚ôê5¾©h�{¶wpíð›šøRÒ ,"Àò‰¡�å±±’Æ,rFCäw’¸³cM§ÔѹNNS¥Ì¯0©*ZûéTr¿<¢`FZ}óÝkÁê?ÛÀl¢»®~\‘œŒ(t4{šOèoõ—Xš(swW÷„{BácÂÅøš \#Œl/Ó˜ôФ¦°MËñpIÿÛÀêDó�M ýh�GÈ–qþv­ÍÕóÐ[ Ð|'ÓRÄSÇùµdäQ\Dר–Ý_’4(²Çc]›z±r«à»pá<ôtÚë:Ò‚5_Á¡�_2¸B±Åp®Î- v!Ëä &¹Ä Î+ìçu˜4BôÏ9vÞÕê:~¬%£ÄØdüXSXÐøÔ™—tZ"“ ß:5°lþ|­‚5ê³��R²“ÑÔÊ{±è±X°Ê.põcc½ ¯Å%–Nq,v �,Ű¿“3ÔD:½œá†A‘ìi�Ÿ¹`ÍCu=cY´ZK�Ku^ÈÉL±ê^×U!‡\t:i�d”_Ö54…~Ù A£ŽNÑ0ô9-°€ÍÅ‚Šb[ïb?þ*6�æ�žˆR¹~ÜÁŒæ.‘— ¿€ÀšyDì.i!{àô¢–ÄØÃ+/¯_ S…$“h¾á­ôåyÜ͹Zܪ9xjM{z(±G®Yãaìé7ÕméF/÷µ³×)tG7©Tã †xZñS2êIñS. b³&µñSÞÐãØŠFÄŸVT²(�D)AC' ‚¿kM*)²­s28ˆlÅû^ âS”øªºÒÖ„v³€8Ï´#­)ù™�­`¥23�³³ÃŒ/ìPVd¥ØÁS[l’èE¬YÀ‡EH3@U‘Ûö z³‚”ö GâeW$z _«!~@éÛ;Ã]<‹ËÜœ´jÌDÞÆ¹0ඈšÉHñ±4¢Ïéþ8ïw�±Ã>�¹sÍ:EWØ5öù# žg5ÏÃË**yŽ.bM�$c�Š:æ„�š°¨Vùÿ"’©³™;¯ýCÁfª1­^—qÝIåi.4p2µ"»¯ ëÇÌ¢Úc\u…Á¼asœå=oh3×!>¾{UccÔY>¹N€½³Ç(®Ü$î«�c_ÀŠ¦Ê¼Us†+¿ÌÙ5Ù¡-RªgH.Ï÷ƒ<+�P4¶/‰®Kë£ûf"„"D›ùˆ)$âµHf8J=h‹z°¤´H½0ÙŸqÈ ßc8Þ€$Í'I•—�ýüÅUÕV^éAä`¹Êé YçÞ%y—O]X*¼ªøI ±ŒˆH1â¶QzZ“Ú[œ&³eþŽçòÁíïætN‚cÊøsM/¢ zé•–�6o*O€/®<pBg0 ,)® 'ì4ç>ýH«Gü€¹œm•ªº øíÓR¢¥MvPY»U²0ÙÄ{ s””÷ ª�GLFŠty^ [¶ÛΖ E:Wv›2›�"ÛlO!R²k&Û´6›s˜¶!šT!F'v�-EpèpžIAº¬V›�®@$Œ”]Â[ ÁËðæ(©Er`'«"w{ž¥ ;¬JjF2ê‚Ôø€J¤Ö\ÆçGtP��G�ì½kÂå=,ßÓc.¤¤Æ±·mrI“§©¾}èè9mÌñã˜Ò3kD\= ,Ù rÁ¶ì/§Bï¤)�¥‰�¹ý šaM+[ºJðŒÍ™¢\È‹[0»«„¤1YÍãT¦Šz ’>M»Ùâ0’â¨õ†( &èh;n=WÊ„ïmE¥§‚„ü�õŸõfCòx®×… !]T�âì GèOÙë ì´¢lÅ^—c,ü€½,Æ? p½GhT”…×%9ÑTVÃuù�ìCóDà@ !§Ðbç!8¶ts@�Øhjü_JÿÈ8bÒnX7ìÅ…êóÕ(ñ Pb=c±RÓ¼�Ÿ£nÖ•l9€z ŽîV4¨ó+e§~öp+Š’O„Ì#ÿ¡-;m}ÉAÇC+›ç8ÇB÷>$ŽZÐl‹dvrè›i™"�ˆ_É/-�‚a�)w&ªèw¶@”BNŒ\€˜æJZ¥œm�ÛLfòBßšñÈM²Å©jZ¬^áFäkcãÙ.Ïéó<‚×%P£¢câ¹7\ ƒ8̸Ÿ©Ù�H—€=L6ø‹2j5 ØÇŸ@%XŸ�ÁžcVbÌg�È䨣–m?õ"RÖ!gî]Ò¤.™*©¸+>;`àD@BÙæ±_�”i8Dí!BKÄïæ­bCMTL¢¬~Ç,Ë, Oä1Fÿî£.–òûã)ÌAeCäx+JkÍ�Iìg�ˆ2ó¯aýÑ uÐË~ >07%¤þ±™óFœÅó�@@ÍåM~^½ *]HÇïó�XÙw ¤×eadî"ã4M@ûœEeŒ°üœâÎG«1–_¬® ÂÚ‚zu±™Ê÷×4I=³�ÄgÀon.(æ56@gl€:;pz@¡Gó™�“k…+tÖÕ#E�›@2Êbd’ا „ü—v,¬£»>dg�.�5/öao§xXØ©"èÂ|’6^ˆDp»¤kQŸSà–¥ë£¨)jö9vèqG³<ÀƒŒ¤®6jÃ�$*Û�ŽÆÇjòû¥�84ùÐìú"Ñ 2�—s– ’^�0`<Ý‚.©Õ[˜±_‹§N­‘ 6RgñM!â1—ù'ºf¿)ì+úXTñpXóRX·¹”MNƒ“.º¨9 f¸‚]ÎLHïLU#ˆf‰Àv˜Ãk5Ó˜vÝwÚxcÌ¥õ/pCÎHßéÒ�†Ç! tªTByŽc±y)t(vÌëKýY –}ÝGd·è%¿æà;Î^ÅÄç�\Ì7™~ˆ(†Ä?‚#Ä—hÈñgÞ`1h_²»ÕøÕ«(M¦%‘|õÖ¡ße}îz|³VZ³GjñÉ`—à‰—_ ÇåðVX>`½Ö´{ª¿07ºY” 2hbÏJÐLãUÃK«‡³›Õ§¾DKâ‘,›ðªÀi/ÏÒÉÍ8’V ’8åm¡•ð#p¸ðT™K- ¤'ŒõÛÈÛâô˜u·W ñþ¶êØxÉé;ÈoFtüe¾_ÐO©² „@Ý>^´¹`ãΰ4¦ˆ Àá &¥4:œË=À¹ Ñ·ªÏû Iiö˜“ù~ð›`DÚã 3½Ï� bAÌ_qD× � ê)⋽Ï÷:ûÑÁ#(¼ž KhÍNp¿û¢„9Ò(°ÞÛ@{`$)FÏy?8®cáYÞzÄBKô½å˜ÉõÓy®¾*„.øhèÈož¡†lèÖ´ÞÈËF°Þƒ¥y�ìW —w9Ø~ÉF¦ÎháHO5|z'¸m³‡Ztk§†A|E$z¸QkþƒóÂÑ”^¤+1‹Ä Èt |,ƒjöhéŠó‡\ãå,ëÉàÖ7QK'õy uX£¸Ÿ1ŠÏ]ZC�È»¶ÛÃÊÝwÖö'»Ô�»I¿«p½®Ð^’òÀ(½FPp òbåZˆ±,ä‹ça¬mâ-}Í)Tgyê1¶žÁ²V!7–D²‘™®ú=U°nÖ^ZK(ƒŒáQ°Á`%é7*g@�B11ÀAàÂ6"A¹9ò3fÃÒ]€ H¦¹Ù÷<Ú] `œ&*¤÷®l¾£uhö8…jqŽòÒ1ÐÉ”÷M:\Zi.£µÐCÐ <A18‹;EWÉ‚‹T ñÅcïDxZjRÖqÑ/‰ÊK3Ô‚"˜=ì_¸Ñå«Ò¼Ä LQsÃE*±¿ÅÀ¨RÞX^äR €Ì‰¢rÞ»,de >óîõRc ãNr’¬ÁЇdÍÙ7–±F‡hj6”8Œ ×ØÚºxå�Hth)×O¼®Þý3$˜•º4�(GLàlô”ÙT ?GÔþÓ Xy•î¾…áBüükï�‚Ð…;„s§=æ´€O„2pðú6z�†ûíõ×óåÒ~‰Â©·…áŽßÊSNlN¢T<”€Nä4e°(ZÎö:„f-¥‘Ö––ÒLZŠô ¹J€ÌŸrÄ•1:Ž,ȧIaû<¾k*¡}Øa}úd)†B)zâLë:çËa<õ –¿,ï†ïäl®‹â2©<Õ Ä͉X?w{tnüÝÚÂÒ¾êH-­jÓœˆs’ÆTùŽ9{�Ô ›a¢Œü¨L„â®ÜÈqs—††�ïq/Xcv£kmxKv|´ lâ§Äî)ðÇG„÷àÌ^A1Wkÿ0-u¬/’œ9;àÖMû‚îÏ ­Åq•E>F-=Ú±zÜos^‚+s¥è@ ˆbŠsšz¢¸V˜YšïìQ"û#š�Ú,óåª9¯'ñ‘3c«Û¥¦ÎYIÔ¹ÊuwÝ›òÞÇ †Bš!dsR¾‘š†)³R tR ìŒÅ¢âÊ,Là QskÊÀÄO>C?ô\ÌãU° ý¥Œ!Ü»Š7>£Wõüsäæ8�ª‹³GÅKüÇ/BË�E…|¯‘Y†k/å¬Ó0Zø²aFÿ×�镬#OûÐR‡×ËÝ/:'‘Õ&ƒ˜ÏV¢8~ Ú¹,…(â^¡ý¥>&à²ù¶@ž1’iê´W[r†yÉžûÎ×µjøTû’"Œ:Ë�ý=Ü*ÌÝÝ·R„yI–�Ä�Khi†,¢ùg‰×u¼nÑXÊîDœZB @¦ »¬º.á]‹]Ý3œŒj\$AŸœ¸…N5cj™n}^¹h÷úÀ�¸.“3¤ÜM¢Ãf­u³¥-‘>„pÉõÛ�œ¾Vý¡/0Õ|!GI¡})k—Ž3–ªÞš±`¹—×4R g ÃØw¬SCûm6ö0E*Q›{µÖ«Kßr°®Å§«ïûœVR I<‘ÏØyŸuuP8|†�{¯6;•@ÞÎɢ؉ʌ[B”{QÆÏL�§q;Ú®(×ß�Leô “H�q‡Ó×¢Êô3ØÛT�TVCöø»{ŠtqÖ¸Âr™ÄAô•€iÜg‰•ö¹%00UµB‡t ÌBU¿†É¯ð4ðñ�ŽÅLOQ¯IÇà¢Ø€1p–âʦé‘!òå/€„ûÊv5ž03 ;LØh _ÇM{ª¦%jÍæÒÒ\±ÁcìR¸øã‚ Ë'ÿŽ^KSD'g‘,øòp½D%äCP¬ AìÄÚ:"DR´o`g{Q‚u½ÎJzj*¦9]05«ùÄÔƒË i® ›¾.Ä2³ ýô"é|\ 6+és=<sT�3¤Ûc¦M�æ4rHc‹î+ŇîÝ7ýC²rÜ€ë-þ ¾\�”+ò‰ôB10dCzPñ‚V kLƒd|õpÕ.$/Té^¤ÐÊj·S$DFnbâŠ+†èZ‚J[Žc¦Ûª€Ö®Úö¯¿œˆÚ �¿Šë¯ù6··ÿ7kï¶«[r\é=ßaÝPàÖÌœyš—RYnË®n B»[‚ah±ÔMCÅ(ÊB¿½ó#"ÿUkí"}AA‚jçÌ•ÿAÁïŠüÛnÝñäÔƒ/€ÅŒ)&b5ïòs¿t%d¨$¢^Òhhë• t'8äž)ΘÚ ÛLÿ’D­É}›}ôô$ô˜‚»9u¼ê6\ˆli§Æ˜²—¾ ¢tp™é'=d 1ÛIòÉä¾¥Ô�xñ#ò1M@H©4²–3H*Bú“ön5ø6’镜ˆÓÄ)¤/OÇU*€7bÁL«¡u~™FøLž„Ü0w˜ÎRúExæ¿TJx÷�gŽ*_¤ƒ€gPD¦ñîê!é•m:=L /þô ×> ã©VàU¦ðzeöÞ…è’$Š {Ùw¦êvÝ»�" Ù d$(.ç[Ìz¦€Ïå�àë¥÷ìÕ�:»âùBpÜŒ>ûµÞÞBæ´0û¶’5æNÞ�[†Ž4`BDILù>^Ëù0ÄÚt ?ddõ4²ºËd…|¿Àâîn:–DtNß±q�-óG–ßZN)H¶Tk«)ø ÷Wò¸0ô4‰âÌ×J¢U*Õ fùZ ½ï«»ööMÖ±þ¹ä «ºš'ËzÎ`ì–ËÉK"½ðQF JT J;Ü(ÁԜŔu~`ªB_ªY<—Øû—–€;°7ïkÕ•Pv0(0¨È^Ã!°uÇöÆ‚iòÅ z†»Wi+°&Š‘öö#Š# m†ËQ�2”ó ¨³  ÏæðS�8=ÁˆØbˆ’‚Ï8 ùmØ…à3@rÈ^è—Å�»�×ñŸúYì=ÎÉä’£ÔÛIêuz£®}yï�¼®a¾ÃmhÔýc»$¨‰8HÓz/°um–dŸTý�Á 'é§²Œ´jìtÖñdÑžªËKÖŠ!°NžGÄÈYYªv–.ÒC›.‰ƒ�ÁròSö%Õó•?㌠(å]¦™f{¥â±÷®Ð7níg-–«]¾&±rpôÒÔ¹o<M44¨c@[E4sä –LY%í Ö�…%T!:ö”_åZöLÓ8vHKÉ1.ävI D«�uc‚á-F¦à,7¿•ãh%¸·zHŠôòF¨ù #±v�ž¶�U.ß Ä>`%uò®,Lœ°X¬t(aµMNeßkh�üÓ?té® '{;fÑ=‰'dxÄôéSºï ?Éã÷'`ìh\Æ�9/°_)U‹Úƒ/&§ ©M­ñàà.³/­PñVa”^ׇzôÞî5ôÈHH=)LÏ2cJ÷å"ß?Ԭ拠†êØlK§îUš”ʸ�«"K­‚^,Lè$êFìk¿rs,¬0œZ±nã衤�vµ„ÿÈ×,>ME ·wábKéÏy¤8kwo¬ à)³¨‡˜äejò´(üR‰ziq(ƹ'7)ö FÞ�‡%ý§¸Ê"£‚4Ï øÔ«ºT*ç9C‡ô�cÙ´º¶å»©¸Aû–ªåÅ•ì X)Ÿ{x‹< ÎIRpý4ÎÉü¦±¿ì:õeïImͯõÀÈIWB°œ�?özz@lw˜E*ʉÏV×L(³ºÒ÷çYLhý[=ö\P’AÕ°ü6er[ÕB"¬€¼§C>uÕ™GËú³ì5�…î»"Ÿ�w„|ãUï�Þu潕óÓŒh?ÈT<êåÕ±¹æqP¢zäXWýÂ^Á=ƒlº³3Î _N¤îÉB3å;'ÑätìÔÌ¢zˆ]«7]á êZÜ2z �D¡\Ég)‚áY€â;5ÌV¤ì)+#€ýî òÆÑ»Ê� ìLì“c�–6œ©ƒr ZÔ�ç€òUCª‚Ï÷¾cgC/H&uèxâÌr+!ÆMR=_v›Be*£-HŠ=HŠ‘ú£™4zQ’°”DUö|¿±Ýœ¯ÇÄ"¥‘Ô¡˜yëã"c=ÅùéÔ×C�Bù8\!^¤}Ë9jÑ&gJ”’ G·G=P£ÇØ81 9ÐL1KlÁ&ZçY˜~ÿ„üfnÅÓïÏzwk ËäFj*ú—&9ô°š¸¨ÞœGnŠmúù¥sÔ”ØêU$DAÆ»ZÇÇ©²ýâ\ÅéÆg* gIïá ºúKõ™`¹ßˆ¥üŽfˆ·(¦ŠMHÁ–ƒ± ~ �·KTþ½*“ e~šÃ Œæôı ãØÖFîÓ”@ ô!ÑÛB×gå†^ôæ‰ÝÂ&¨ àux�5x� EZ‚ ‚x˜YÍ#ôŒš4¼§—Çñ!A²,ð#ÌË —|ø$ýuˆêžùª5nàš#7 JA°U}Ä¿‹‡r)Ø7¶^�[xb¿«ºcÚgʦ‰0ö½Ÿz•àa£%r‡d‰$L÷ÿ‚ò-ÑWÁ9„v�äqêíµ¹5^W`b•Pü%ä�jÈ;-¿TæˆØã·ÔKœ¸ ìÔ(©]¤_¯ª�4z=܉˜*û|•LmÎ�¢‚b¥ Fœõ°QMm!±ç@ÑÉ€TÉhŒ±†‰Dc¦-™��u¥Ä1-Y%듆‡”`š×iXƒ˜Î³�B¤ì‘ç4ÓOĸ€%Þ!U—³§L˜û.…šÀ ‰ˆ8AIÔí—¨™}9¢òÖùxmY¦y£NŠžJoS}èq`-¥¤“Œù4ÎU?¦bÆ~Ž-ùÂfŸzÔeœ(Ú–TÜϽ†uá†rfTÕ§öŸ²%ck=œ%àÛM†þ)°Òˆ¥¸0ÉMÖPÖwÚÈV6¥Øbî=˜ªP¼8‚’­lt£�Å��W>³*–ˆ\ۃ˸×{1F¹5ÆsÀ(µEåx¯$ªº«~q Ö²TUØ_¬eCWh5–îDÀÑíßm÷Wʲ±Ž8u¢:œcA�UZèߨ“>ü)SÈtzW»8ÙS/¸ÛÙÚIù‘-_ ‹Z:Ô¤%8F ’и¾:<ˆc÷¸l›ýá,ÝCˆ¢çD#ð:4Àëc½»Ž¡Bäuɤ¼¸–µ7[Ð7„Ô’¨Êh[[¿t�¬f$žIP`AÐ@½ÈàÜЮŒr‰ÓÓ¦^L7j ìU‘Ã`w%ò:êÖûo»áHRObwß‚TB«$¹S±Žž¸‹Õw±¤�Gp`j~ŠZÎ&ðOö(²Až¶AÖ¥1tPtJ=ý‚jÔd—7l…#öâôÒã-!₸ýsoiu"§GÜ€¯+ ¼ ”¼©¯t2öØå+·c™<ô½ñs��ptÓÉ‚½™^!l ]‹,º£ „"Ïѽì§]e c4æbÃ3…qkLǨ~!Š´Ç¥òñ2�–}ê«J®1A iµ÷¨W¨¸^·01¨A7óP(&iÍo–ãŒ0‹^X,ï“›!£Á‹†ñ†¥�;…¡‚Bbâ¦Ï€6�yL•;Öè³YzX@NŠ6�7\Ãv½ä]…×(09Ñ«‰˜/ܨLyò¢‹8u\à˜É>í²(«=r0ÄšVJ~’Ó'ýãa¸óìpSû¯G�þkÕM0 ÖëBlŒ‘lè�åe'kîhA$¿Ê¢ÇŠ=©|¹okPÔ³`´‰?µÉêW²à€R”¸vž(B×.ÉÈ¢·P™D;V’äzLÖà˜E EE@L4<¾#c±5hÞ”±Ë\R? °gw¯X’º %“1ù…�KhcO­|{ê9Fé˲á"SÝF¯H¯‰ÏDü³eVx àrÔ¶×¹ íëSËŠ‰B¢Ó¢kr§=ãe­0á¡Fô”¸©&TË[^ƒk†íŠh8˜~Íè ö0¬TÍyÕ•YÞ¹1ÞqWÑ«¤N¸Ú€²åŒ”ÿOM [ åTœz’ÄZMbUØB}ør…Ž_ˆ¥LƒXn«†«2ƒYgmí+¾dÕ%çÃÿGdÉsù}Öw“$Ë?�G»�\¢T¼ð¦}¾Ø]y¤) •h|÷0['›ÆÖ¯/ý|ïŶ]x iƒ!6è\qYô\çO ¢•0zm)‰&Íïä_~æ(VéêeÃ"I#îo‰iÈç'¹= ­‚å>6íÞ=¤î(#³æ‰âWÕS/5Ož�ゼoãÂýöê¯ou‘^!âVÂOŒðm8Ýõ÷�¶�Rî¬KÔÊ´æe�Ê{ ±oŠ”Q Ö0À“¬Æ¾”î°Eó¸ÓZÜ,ólØê‘là­�üx•B™»ÙDô)uP�#"ù¨R›³¤w“%ɳDp 0ûŽÍJÕ|1C4ô�ka& Wž^]¦è/u�#óÍÝ£7�v‚q�Ô×5쯠BñîÑžðPu¥˜Œjª’·ý„ÄŸ}J·âÈ�(Å}m¶€5¡¬�™”ožn¡úhFœ<|G‹8Ùo²�lÓË{_5$σ¶) 3¡§ú‹Œ£9ØÛ°O‹Ú"{Ä•Œ¸’î€QBª›Ô¦Ùc3ëi{ÔÇœ•c-¦î™~“¡[¬jb îGq¹‡A§{Œ™¯Á{èA¨Q£—üÖöùˆ-»{$6½6 5®D 0»}XaZ¡‰Jø“F*2=�¹Ã=E±—‡ê¥ˆi?“ê¸\ÓÊsÉ;\Â9ªÕ.é'xÄŠ[&Ôéf?™îpÈÇæþ2äÉ�çe;‘ìé%Vy±f¯Þ¹LO¹F(w•ËF H-T�Ô‹<$½FØ‚üĽĴþ®—ÃÕé\�Pn·)Ñeã}’S jX¾ò‰éß2í|Šÿ¸ø(×)è«FóŒ'œÑøŠå¿`‹2…Bì{ /›&O¦¡*k\6ãý%›w[Ì¥°áF;Â&aWl'— UØ ’¢Ü¹†E2'À‰e…„½¡ß§¬6½„Å_Ó¦vQ�ÞgK°š¸¬>0ÄSBÈÆ;CÏ…NÐBÁù<+¶%Š©ñ§Ç�(B ,ÀM¼QÖ´À*R4ç–æ!M,ŠÈ«K ³Þb|¼†ŽO„Äm9$ž [$T�R ‡d¦å4ù�Q‘)=㱜â”ó�Bö=íIÌUÔ®.W˜Ÿä® öË”ä’=T‚Á¾­¤ó°{ÂÞƒ`_éœ; ÷ôzB5A{vORm‘UJ»m•rç¬y¶Â­A¡>ùÔkS/Phôº£×媛õ4aNoïÌÁ’cÎp™I—sh÷¨«›×ö”×qdGRrØ·WÚуšR‰ÔŒ6¸0 .O‚Êíéi?¢'<oÝÛGÙ§¦˜3r3#&Ë.Åj1’lÆJ2}g0SàìÕr§�é-G¾Ú­YÎ~즠ٌQÎQ(ióµïwdhò›Á„ÙóŒ^tħÀ‰ž• Vïm˜6º, ¦Í�àÙÌ�å´êú?D6r€^Ù½š&zAúe/$öƒàcMB(Uáår•Û�ê ë--cB‹šçÄ¡’ò?7joD”�zs•‡Õ%öyP}³“^{ûã™Ò?i^ÖªBˆò ugÍà|JÇvÁ¨ì&7¦e.t²lLT™Çȫ˛…÷Ê_¶Ð×eX˜ígð–LY÷ T%ÂÓË9š.IÃn´�jÜ{ÖÔm‘ãæ£·Øu³Ùê®ËIÕ¬w ¬«è!í#vh÷+–…~yâ§ÑkL&"¬Â\ï)Xî¬ ¥ƒ`«ÝC{d”%‹ÉrW¤øæËƒXP;œAbpͰ_VCÅ/ÏHÇݨbŽë)9¾Ñ,m­¥ ­ýv^M„œ!9Ñyk?PLb�ªÜÀ@Y< ‘-°ø¼_ÿ6—ã2w Ñ É­eçgúÙw¯�ñUö¢dß ÔÅãŠ)9�>W`o æYD˦òå£^Ž¥µ´ �#ýë§ 3,ì�~(.-÷°{?þDÉWD ëù%m–d½Ã&ç šÝK:œ"®,Áò`°µÏ㨇x8ês¶T%Ù›Vž˜„Õ.�¦®ªüCVº€ûY¨È‹åPµÊµ�=‹ÿÂbC{Cm=«=¼•^±õosÆWÆA-RryÊf4“?!R)ÖîûSÐãzNLò±Ø�Jv‘366<~ƒ6¡ØÔjŠM±Ü�jclÔ@îêáÄÍ29)}~G¸KQ¼¹Ão} $?´_¦¿ÃuïYgùØKÏH±:sSˆõIÁp_f¿Bˆôó¶V±•æÒ„ôz;jзÊBȺ½˜bÀ(l½”¬+˜7YÜZT·}o]H{N°Ü{Êb`L¤ÎxKVúˆÑë¶<·(Þ‚ñiï zƒù¤Òh@ÃXY$y¡,=ôön#½w�®ÄÈÇþ¥i—ÖŽ_]�qBN³5AÏ�Å�ƢɑѸŠG�>œ}÷„E 6«#2Aš¢žÛ9È'êêÅh¸eeÄ’¼ß½>Øj+ß./[¿Ì"ߣ0µR4Nx0‰}V2bêÕ¯œ%óT•ùÛ튟”c!� ¡RJǦ´Z�–¸¬­ÙÄŸí³Ãé.ðÆTex˜f–{„º“ð%8ŒüÀ’Ü'åâ×^ÛçýÞj¥y–½Ñw4±ÈÒqIi HEQúAl0@˜ß”‹YàËÚ7’/@ß|Ð71=Áç`W �Šà¢®âûŒ_ƒÀeÞÛ&èx»Rs±{h "Oµõ‘*Qu§OóR¡½^G MHΪkdD|eÕ”jèÀkF�¼Nvy¾3½XöcÀIàQ,P€—ÞÁfË”¿Ö’„”×ÝÂóâ±ç…”;85‘ Ø™/ù‰*@È4H‹b¸]i0Y¦Ù"£®ˆb/œk&¥×Ÿ(+ñ®ÍàNmtáiîÁˆ't(¢—8ÆË+ヹù%�§Ô#â“Eý»™Q…‚˜­D$O©I ‚T‚ô�Xº^à&ˆÐ±7¯¹ª­Jq¶°eÀQô«NùäÐÃV@r¾UÍ<»9›ó;Új5`åË'!I¹v)¯ªU~'‹|¸:ØY²9¾~*bŸQaY0|’õ<º´Ëfá)(;þ”Ÿ}Ö%\cqFP«¶ÓWÖO=üdŠëÙli HÈ#KT— ˜ˆõ_ËeôŠ}nŒÙšà¢Ïî…áðç^Q‰Â%ÜwH–lÇ!V)dÇõ6¸¿HÐ\±Ä M9uš·-§é½*�Kü[­n —•qáÐ�é¿–¤ÉL:;»�eÁ‰@¿ÜGet™Š‰€'ö2¬"#Œ�Ú’Zò2XrÓ.bÊ€ÿ]ÅXzÁ8&äz~+½¿d‘.Ùê$µÇ[<ã-fzUmNa]¸Üé�·—-I=|êQCòãßë83~êU¬*%‘x‰\ܦ •¸ÏPÔ[ ¾õ ;ø™Ä�IÏq¦Žf±…t¸ ,«DD›6¨£ÆºI0[Lv3k \ô°´€QwÐ×ð¡Zé¾!jž„»sá¼ÒÅ+H @¬Z1Xæpð‹,FDJR¯ßžgO¿òe¿òH/>ü“y~G¶™»J7î¥ó…±³¬),�Êî!IAáÊ´¦ÀM`yèÁõ¤”e¡×õe¿“z#ÄÊlW‹æW9/�R­³þØŽ¬¬Àÿìöu'wÃ�µI}Ô xªq[G¶„6.r #‡±á|â9qË”²¿ªÐääed|F•ªØö·ªÀW£x�½œ×äI?tªz€0dlë&àÎîti½;H#Ö¼Ü9JÔ ö»´ê)É�Gð¤¢(ÎcLAŠ/Ù×ù‡¤XÝ­X]ÛWÞÚ~…eäŒÕ‹<Ž4aCáj¼P?ÌX$`ih3æ–€0?ŸTßNOê$4«e¸"p¡iá¨^ºR ½·úö³ †oþ„Y éëý)ú™qÊÛŸÿå�?þÓÛŸýÅ_ÿͯ~ÿûï÷Ûïþú_¾ûÛïÿùû_ýþû_·ÿÀ£|½ßøÕo~ûÝ7?þóÿîÇüî¯~ý›ßÿûßýø¯ÿü“ß}Þþìß½ýÝùÅQ ü×_|M0°¼é�câX¤ƒ�b ’(wŒg¢Âs¡°¿ *dèFJÿJp(JÅøM}þ3D�``ù‰\ d2­\ä Ë-g˜Ë~™ª ¢¦ÄN± …lž¤ÿJÒ¤Ør*(nÆyïŽÐeõŽÝˆÙ>%´�ˆ§Ð—ÞsÂþH†4?ײB)¡‰ 2AR9à KÛÁrJ¼R8cHA»¦ýº±°Iøo-Ãiг¸˜}xË¡¯“PšET‰d{8Û¥ý &äoò6V&,0\Ú¨@+}X�¼yHF²Õx’œÁpéVDR·‡B2'!HÈsÛÒ}Zaª ¸«½)0ÄA£56ºO0o¥³Ï�¤¥a•rFÄc :=Þºô.ìsæøbYÆŽ;¶ÿjØÅF&. +¼ì&d¥Y ÁfïÐt NÓž÷¦LF~-3“¯ƒò’‡'ó¦ZIñ'¨Ö›…´šùÛ%øÛ+†»yÁmj£8~D‿º½JD‘²‰ä[8°_ìa›Á%׌Ɯèá€ð‡å 'nìr÷�m"Ú›¬xZïÜQ[Wðí¿H7bt’ä'—8±½@ì—¤¾‰D¦³½ ×iR£oR…l6”¹CÕ¯ ®ï@YUÀñˆ.`Qd6úØ`ð¬{‘eî¶""×R¨>îAŽƒ¶ÆÊiñW…ª‡”ÿsXœ°…Am2^DŽì!9jr• Z-L R‡(¤tic<>0äÇê¯÷�Ú}&sHŠqGÜ,šÇˆò£$ó¸¯x|‘ž­‡+.‰"‚„ŽM€ÿq˜‘@¹eYƒñó¡}è‚¡¸, @UÒÛ>‘rîaBy+¸ØóçþÔ'+ä´h€²õØE -·¸b<jéë¬È{„Aß�x,öUåMúz ×¾z ýî7ëï?>Pt©ûÓ‰�¯%ÕKøý‰Æ@�¨ñWÍþš¨fÓ,i05?~…•p`¥Å#2ácøeô)ÀzÜSÉk!b ã ÔÏÛl¶m…ãPÅ ß+‹o›Jj+¸á¶êDâèmuðÇ6Ò”þ!t¨MÎ7=š=¤”µg�qE¾Ÿ„–óÃyò¡Ù�Œ|Øí?B�ý‘Q¼)ôæSìý\ Yf‘[=†vwûý²¾5ØÌ{Vv|sÖ8 ‹`ªÓ`{Ï(´-¶zXlí;‰­ ”2À§¯{âÞ?#KÄ ŒC/çÁêòÜyŽîŦºš.Ö$ŸÒmf"4 oŸðuÐx(c“ð¯Å»,=ÜýóëˆÒÑ‹äÿÎqy«h .™ŽGÃ(óûï©!zu…èÕrÁç²UdT¡éq¼?”Q©l59„Ìtc!äU4 endstream endobj 36 0 obj <>stream ¢æÝÖ8Îûš{ô@á†Ò¯ñÂYé+�êúû¾/YP"pKF·î�×Uß(\Õl> ð^¼”Ïé?¡Ñ$D Êé*#éQ€Ÿ.¡ð.yr²(”³mžÈºÜÖ¼²Êqmvû¸ŠÅUæ~VÂÕMfd)~õuÀ[ê%•·�g��gKe$pKN!p¼1W­ï²©À¶uÙõÔ͎ºŸXýâVí Wñ_ ¢A/Wª/ƒØvàøïÇ7êÃ|¦Ïg¦ïhÓ´[Œ%ö¨&íçö7錭*òœ—¢Â€¸=<†t›Ý_ξ¨ ‡o9'¹H�.I÷ƒûÄ5ö§>Rdð¶È`D/›¨ÔÕÀ„1ß (5CÎBZñàT©*q¡ a›q÷´r} º„�…¸Šû ¨K�”5ŸÏbUÚW()*�;púöúF.\8é%79]ìx‡Ï¬ tÆËä2‰ØEÍv=iL>茥ïS°�¾ŸXèþë[vÎÒ D KAÆ’H)«¦m²ZÍ]t—zе÷€­¤!ÝÿÝw¢)Õ-�¢öÛzˆÈéæ*^÷HrŒ(Ýk�‘Ä«ìeêÀ9#Qö½b; 0r²Xô.�]|`7ª/c¥êaâ²”¡Ñ$x­BèºâÂF�2Z`­ÂÜgâ%­V‘ñîo ©.U-«Ýà»TÝ='çtA4á� ò÷^~º«Ë”÷¹ô|ï$Ó‚7y„^M’Ó–µKb§oM•Ãh– Þ~ísé—=*z³7W–šL‹S@mÉÚ‹‰”¿êªŸr Ï#%)�s`öPãT]qþ ì¾~«Û~CÞ‘bN“šŠŠÇ‘Q}\ðCe€FÚq5óו“Ù7ì‚úÚÒ¼û?TFßó©ˆÑûs¼,Ù+êtö|%Äxz¼A¤¶ÉÁª¸Yq ·”®ÝhKùõ�h‚!¬ðE`.Oñ%¡f�…w—ö«èŸ®À«Ëv…šÜ¾[„¥�У°Nðއöã ÃðÑÇA£ÜÁ””Mèep�Ì*a3ñÝõ}§05Û9Òx�¶aKÚÛð#Eƒë¥æn€$HË#üª›„ïDX‚·Ý¶[ÄçÞ«khÛõÔ±‘ä‹üx°µøT�Z $½Ü} S> o‰ÏïV–Éo<Ô›ÐAWÙúÿÞ…iSÔß  €~¿]@uk80‰ú ä=d®z�¯Þ™}¬2pErõýÊ�¥ê¼F»<Úˆ·}P)4o¤­î|+ô˜`pp…=‡sàš†zJ ×–¸s+>ô–„§{¿4{8n©¿.לö)€”{w`…ýÙýqv×M%, ®„CÂêgÇ@]åõn¸¶Àu¿ê»¡KÓ' ê “Æ u{x7µyhÉgQÙ�I÷ÒJÏè‰cãDþ�­¿Þžv?)HºIHœ=ÕeúI}2 RpÝn.„?ÐÛÔ‚S Ù*¹d\ˆšR��(.‘T¸Â¡´*ìÉŒ(Ýã÷æòø\vééªþ­\-bö[¡9…òØÐßè�A¹TU}Õº$¨4(êÜAdŠ/Ê~2tX‡ChsûѰè¥D}b×'öŽ#e…åp¤´¿œœçŸøª°ÇÔ²Áb½ã-Kˆ�¨èÈù²dÚs5“ì%µÚT±$‰œGÓ„=¾,ȱqmª"Ø Á(¹}{v¤úv+@5ðý’cOÁæmäpЧ„”"^xvß}Ë”/’\-øî"”ÒOÿ¾rî¾(…~u@\n‘לRŸU·n¿ Ô'ýÈŒ°�bểþá€(r–’5œJ͙۟�‡³¬0©)ý‘(}»y�BâžúŠ2cš«1•´ú'eð·°ÌÇr¸ßɳô·[øX+_­ÅrÏ ·$q̤¹C3;¢ö—r bu²¶ýrûK(R®~?�ò|> 8ÈåýùØEò²Wûœ‰ÇÝ%Û�gË@éè±8¦\Ûq Ê™ºaC—¸A¾î‹Hr?ÕâIµ‡ùË; ¼GîLجO{ÇMÕ-½Ù0| +“fþJœÂJðÔ{ÔpöJ;9Üàš�D¯e¹š&ùK»uÚ³ÞMs_sb?¤ÐxÑnB�Ú@5ô ÙQî—ß“¨@úCña¦4̃4A wx?"íË×Õ†]Ø t½½8Ma€ µ‘Å®ÛÅ.eO¿¨¥(W+ä…×aìz�Û^Ž¢›fB¬OЃ¸DÂíÃTp¤Ém°’U¾WéE9Ö6ƒé¢°9üW·ß³gEì€8·GÄTà•ŽÀÙÌdY–ºã²ÓŒf güÝ{wÁ[&íÿ�¶ùV�]/øšòÃ>Š>s ’m]“)wC3Ø[­ñË=ÑÕJn·×÷Ø1R¤àFèÙ/$ÖÔIÔ­=7|aµ|Ln•7… ¬•��>œƒ_�ü22Ú:.!ûßòj…õÀw^�™‰ŽÞjy/éa. _Þ"-í*vÃ^ZÞ~)ø¥˜ú¼¢ãÁ9hMnPSUt^+[ðPΎ‰¤bm{`Ç|)ÞìXnw •êHIßyļ íBæWuU¾„oüŽVážï'<^�ã ‰(MC·3 ,%ë+ìOY;¾n‰jÑÌÁìÁq—·ÕGDßG¨fá!ÃáHÍpIí¾´7Š“ŒgŒò+R“Ú±XR8‹)°æ“j#ôúD. ±ò~›'-%¨ÖëÑ$q NÓ_ätöL9d;o‘(G1””’ü—šj?†ž˜›ð²Û&Ì6N{ÉÁº�UH¾^ìONnfk ªÑ¸íÃéÉu�PånÈØz ¡;lòV‘%à•Ba)ð½”}{OcîtCeWÐ;É{æ‘ ^Á¥ËAž© FWìÙBmU<}±ÑºÄxàÛæ€+Zw€…9pÅšÆfqÜö_“É"¼§ö¬79œ,ßJåJÏþ!vi&¿ßáÛ°ÃÚ|Àsð–è°ˆEV0-ÂgŽ— ùÑð©#.¥lGª³¶svþrj@Ò¤<±cÑ[Z¡áî§et-Â_Ô°½TnKˆÉXC8¨w‡Ý.Œ>¸xˆêÁ�¸æ B =Hœq �¼«¡¹M–$³£Ü­0uÚ®aV¿â0§F((”KD¹�”qob“M1™ì£(Ü`ã´¦¥dÈæþ/ü¨ðŽ�ñã�سºûñà¸\ƒ«%1êý (<jr»$~É^›ežöÇ�Œ(©0ðs¢BøK› mçÛÏî÷3-Àb¼TL˜¬¶®oo\9ˆ58–¼,Ì•<�*Éáj^1H Ôœ¤1VaŽM©†Nᡇ E擼šQtbòTj{PQi¡Å0� CšH]I²+¨’Psé=Íù Ë«!VY‡ÔÁb¡¬›ÇyË“{Ä\¡í¸Í7ÕCe )!9–þP˜Ùí?¥˜ã[íÏðbîùÊPÖLÙÂ\nŸVq;“´_à ]“ˆ°¬šq–�è·ÈÝh™Ýø1óG~ ÕÍ!Y–GÏ͈/ÊODbéIžaÉ5HÒO®{ð¾ñèBê…Ù‘V� H6+LœŒ�òÊÏb†{‚’†*©Sô„}E:·-I‰ô"SjѺ«·t×SM2y«R=XaÄ?Íï¶ÅÐçõÏHU‹[^ ÙH4-$Þî8™Ç4"äÅB’¢Ùk¼{K¨ñ˜ÌC½ˆûu‡Ë P<”‰ò„”æ:$ªŽÞŒd/Ö#ÿ’Ì™ÈOÝ:Ñ[%m8^KFOl§»_r•SöHãZIV«†î å3Q¤Ô«³È\—šªDBæAùġܫõÍ„†ä9j;Vª2£Dç•ÒF¾8%n�‘©–‘)N.¡·—ÿK“V·­ú·u6¥Ú ¼F¹F9ë6IÕ<Ò>—†¤�­ý;�Wø.ãH(’Ë"9iÀ—Ãú²*9pãýGì]ÃvàÒ<Üc�á¤ö{à‘ÐZE1Þ; fõZî%wzˆ³ñµ$V’²–Pîë2´'ÑÂÉ „y³C÷%ÞDL¢@Bµ#×"ÁC€´÷¥?¿å›†¨DºÝã&AáÏT�\X¹Ó2˃¸bœ%àäþò˜„í‘\0o@�ÏCà M�iqBöAÙ[B’Þ�¬Ükuš?–+¦é‰bœ´é–=0 H¦ Jqì‚0ì)Vî–7R`’¨>tI†÷£"EYQ ^q�C¨bTúV XÒú Ü$nå .F?e6l3µõÀšßøwžj—r(óƒjá(ÔÜcrÜ[Ò ¡<º=ö VuCaÄ×Wøœ‘¶Õუƒï¡n7ÑsÞDgV Ô'&ó( Á>¤îõ¡†U2ð®¦vºîPäãõ—Aå\:õ´MÉïô½V(Î)zGM`Oû:@>8ßžä}/Ò¹—¡KJÿûyâr€’ l#ŠY& רéwŠŒ4硦I1S@æv`BbùRn%Z�ÀÖ@0'Ñ�‚÷~Åß‘†0B5ÃÌ@Á|ïb©zý $¢Tù!VÆÛ¯¢æw*sÃ#£+¡S€E2£ÍðD¬¡7\ž%t»Šä±O‡ýåÉ„2 ÙÆP»ßŸ §Uþ¦(³žšæÝì^€Ò‰J~ÆHÖ£ªs*—-NiRÄBP�œœx5aý¡½iaY‚ µ…2b¸aƒ1‚u©]XtÇ+&¦Ä~Åz˜Ü(ÒRW+øj‚Ueá8ЪX{dRq.R€C†³5Р±8Ù)$ª‘6=—$‡‰\7“‚3¡< s³T°R Û~9¹¨UBû¬…™Åt–’5iõjšˆØ�›A!Ñ÷&?’åóNHñTS5.r‡’Ó#*dïáJöt>žèQ£ÇÁŒ`SŽîæ“Ô¢N{”f¡2„ 1žº±! Dn †[çÑJYä¨qÈÚ;‡x8Ť×FD5¥Á)ÖÖóì Mê6ËLÏ}VKÚna=�’Q¦Eºü½ß“k¼4 ªÔ§/„3LÝÛŸ°V ðÌBÑ�Å&[¨Ë;”Ë–,Äp÷�¸µÆ�óó=!ä/ ‘Ñ@·w3ëP£ÐùHùEÐl©90˜�GÚ…S:ëôè²lÛ«ó0AÐ0ÌEÞ‰BðÂb–¡�;ÖBº¾ì€Zìw¦,¶òâ˜:dBÉ3‡ÄG°´R ¹ßEß×m�¤�ž¨XÁ¡†‚C8¼ö*÷0Z\Rtô½ÇQŽQäM°3u/ÍZf°j–åå Å[]R¾yìI¡C°'•~Ê"cjcŸªv~T‚ Ç]D‘Ü÷}©‡5X 9ß~�XiŒš Ûú„Ds]‰_züçV훈ëùàqdêJ–SœðÛŽT®$…Jùnâç&,›˜ªêA¨t~Hüz]k„Ì÷2ßË~£xçTJ÷/©ºE©% ©— KrÛ¹zÉÈÙ?@1LÜ…½ºÜÃ\:$çår‹–N"ýv‡T­ve{޹žRÕ.u¿ûžc„}Z9ÛHW”L²Óæ%Ë«¶’’w”<õ5ù,ÓE¼ëžÌ«‘ŽD+B² ¢ CR k�«ž¼ ºŽ•�×i©ô"²˜ó0B�‘Ê[GÐÃÞ=¤KV x óð&Jéãü’äcè%0ån JÅI²S{Ê óA6 �'R¢bˆ’b½²Én\=ŽG²4šªšÅq¬XåN›Ö}ãnñøˆ"(¢í(â¹Âþù'âJ†LŽ€LŽÔs]¡ Á,= ûvŒŒÖÎeYOÂ!¢�!öŠÀ¿@q8—n«âp »ì––¦T¨š\q&r-¢°ár”Dæøê®*äW¨�Ïu,é[]°z¬ΫŒzxMqIzI»„MP —øà#.%keÓµ²0ª7´)‡äú›$p ÐÆèá+‚x¶Î3q¦�¸„íàž¨I/¡[=ÄÚ¹sÃ8�ž¸#ùÛ…Ö0-G)t1Ñp$ÝîQ‘;Œ©tÏG¼^%ò°TBzR‹Ê�äâ‘­Ò=Ë6öøÓù[jóèº9"S�#áÔ(Í+œè*b ýò@6G#lŽ\‡ì&>�k]�7-wN½`DººÐëéN¡p­ÞF‘m‡+‚±WïBw�»V×”ZUeŠ¢/C(맯ëø‡-èÀ \£¤£�^zOêaÕqv¨Ž‹ôñG³Œ'IÄÆ:EìÙžµ�[Œ=;Nç#` Q2�b‰ 8¥M,+1¸Î;ܘa³k«™}Ç]À…bBø+t­ÕöS’4=£ÛÛ¹‰)‰þ(¥Gìj¡!À(ÒaÜa ›2t!¦4eCÝ�+�ñ6 ¢v_^Ñ­¤¤9(þ8n9ÜBx«pɼKçG€Û{³é«z Ðù܈—¬[9WP¥Èvž€@y�€„•¼öƒØpó¾nЬײ>¢æf4¤î\LÀ£ 9‰¯ˆæ)óoy¶´yð"Cžbx—yœ?9ÀiN<%žçóA¼„QI `-ÖqGV|ï·> ¹%(ˆ\@(œpð 5‡»`•÷Ä)=QM·Þ¡Ã8@ABäÊ.ýÇŽT]޶¿–êƒè së�—üüW£Ú’Ÿ6/¾c™DàN™šAöžølÙVe–ÀTŽDŽÏ)ämŽÀÝ}< ý9娧}>¸X�»uzD‹�<ì9ЃúKe¶…hàëàe~¢8“·²]R{9Òn™Ý%:�xõZÈñÃ=×ø¡OÅ®|ZÀS¹ÇeJ´õ%•XAñÏk›x_SH_е{‘_XoXOy"�=)Yõu™*¥ƒš|T€Z#Ø!ì$©‘S›Eôüûì‡�Æ}F3�ø §|w×98®}lU3Tw’—¥å�ê ‘Åô¶„ ÕŠðÈ·ñœA{nRT½„½ÇuN²™=‘n{µÃCÓQâ‹Z»ë…{(’7:PüùÚM‘=àžˆ&€©–tTŸ™ÀÇʬr%ðCò˜-:õÈvƒÑ…4Å5¸ÝNèÑ®„k—À?8ªÝü‘yŒh6\nÈs@BÓüŒÌf!�Æ|h'¸A)ù²Îî§”b W`”Ö pAÔ1k ÷Øt=‰š¾ônßw–tq<»ßð`×f+‡âH}ˆí¢».Œ¬è¢qN5*Š=Œ�öA8WnN°Œ&³Jb!Ü®¤‹ø(Æ{s¬.Bƒ£Ý·òšú†ú€a³@Õ!Ñ ™¥í`ß5`°Àfá•J0ÊIl bÌ/é}T˜AÅÔýbÎ,D©¿™’п™­åØ. Ky4€â´3ƒ2„‰�p x†.§ùX—¥Åuûð°åÂЬÝ(Õ# ;ú­:ÐÃÝA¢½|¹¸o³HìÍ9 +oÒüíþe}ƒ¤Ãöûýè‚8ãüÜsºOÀ2$î*ÝúKªF3AŠÚKHþFÚîÌÏÚõòZʶ¢‡xýÕã\19BMæö7èÂ"£Àn‹opaZ°üü„,En�F<ÀŠzòf¯$e$('º|ÄXÃWHšìÓu$8ž0Áž&Ó0·ðÑYç¹�Ôgí‚­ýhJõäÝîRùe£$°<€×î T&RµE«ÆV+¿BÐ s VîIP³�™èŠÇ\Rùµã¯HÄ^z¨D�ÔiÃÅa­ð1¶àNx ¿ÏJŒ9š¹ƒôßUõ|)ýJ&‹ ¡dîo�ú†€¿L&„�»—ÀÆ>É¡g]n;yð• 8”WX4Ì2´/ØuM¹�7S³ôB!ÙÝ™ÂTq.AyÊ?º½ú&6b’Œø¬°`Ü‚Wô”b”@xojÙ‰ì¹Wò_ ,$’ÑÐCcáËë_Px�¢=G]A ©°°›÷ ‚,Á€šžÊ� í?¤8k˜±ÑIœÊ1‚«3œ§ üÀ]ŒP¼ÁÆŠx¶X p8€ ëç§X{+Y oÃãØ¢toçæÂ|BïÙñO6$d÷·±“00fmˆÐ�GdU݆½w’��ñe–�)w%æ±-m¹„€îã›ànô@±�’Z©ð[¥A6=_…¹˜üÖ8×,ñ@¼ë“,=êdÃ-H Ñõ]:zý’.xâÍ7Ưsž3âù€˜Áf¤H†'m…l�J/êq¾ìZ|^@^…½.í�h {¼g—Q:¦Hl¹/ˆÖCUÍ(Ñ‘’læ�ˆ}»¿¼žJ¿Ÿò ⯈삌e¸#Ù¢ ñAsB‚'ƒ&OÌUªŽâ:X�D½¬õ‰�÷8“Õ‡^+BÄö\5VWIŸSå•÷/ä#mÝö©Ø¦‡’r¶%ØI¬ÍòùC7f„ØÎK%:j©C(¶‹Ršpw€ÒìaD$Â`SºäÕÆ»Ç0vrä¶-I@æ´ek2läBÖÛs4^¯%xÐÒý®”UÂÓBR£dŠº¾,¥VÁØj»P—\$Nû.ÎKà¢-2¤ÆOe‹›-VB¯ (X·H³BH9_³agÒ8ô_[�ß5’M\Õž®È¤Ô€P“®¨6¹€ªŒÜžeÙÓ-!x†¸jI ßm÷õÈØ^uMØNÔ5û2Q΋%ÒæNB9$à:…㼬¹¡+*÷jªÐCN/Kì^·IW g(±Öæó´Ä÷Ž ‹— l´OÍŒ(�e Ü\äl<}¶K™–å¼.•&eùµ¶µ'œ‡ w1~<=°:%4¾íšc[ª%‡›˜®Ö¥bþ&9;’˜@°…\ß›Å4²[<ŠÇøl©È´Ó{Nó>Q©ÀAoÔw³ ƒòL@—e�9"Bá]0²á(û&uØðÒ‘wö¾Lh„bà,ãõFÌ»¤ë„y»£F s±¦â—4A®äÒn†ÓoJCÝ6{ /õe�/$”9C$ÿŠôäû¡mÆ%–,Õ#1&tìZš5ÉZï/T4¡+*RÍÖ^àzG`˜Û$€ òUŽÉÔŒÊAUJPöÞoÑ0¼‚vGà×·Ko­¥³ Ø©€prÐe›7‹BØ£s0Ÿ¾å"º?>²q{‘‚ ƒ4 YÙS�ñIP_ÜëÛ^ Æëdoƒ¹5 :ÚS'z¥Î‰Â˜?›Sü~Ÿ©PÄ¢H¨…X"BÓEÒlsʬ>ÂTÖCI�š€g5Šºãy? QÂÒC [©¹&êáJÐ쉀‚§9ï$=W“ž ·ÜÄK:`H!  µ.Ë™'¥ºN@6îÁ¢*Ÿl§è%×'8»«c™(�y˜K¼C辚Ã/��H€Pw[QNn*É$;z�¿áw$5{8ÈÍM¨Ô9yFÍÜ3Ç”"›áP »=eÀ}T5K$Á‡XÃbKŠÌ;Kø§°ŠÊQ™§ìnàÅÍ_ImåkáÜ'€¶'�j?¬0­Fx®É`zÎ'…EzÈ ¯ a:>»’:êö\Ù³%•µoœdòÙ‘¹º€JºÎn)R6VrXÅöá†é/é!+œÜ¡pRZž�g4‰’8çºïûௌ/˜¡¿(-’¦ñ;+ÄŸYÁÃG‰èLkÁŒ"ÜÕ½èKn`~E7 KïÒ¼U±nDl9"W¨‹±î¶ã;.Q³Ú*Ÿ ÀД|m²5Ï—Ì£=™Çœ�+èè îK“öl·…õö\-dá´?B*‘í@¦CÄð§9q½ƒqéjŒ8LJ²¯,Ô„ëù€dØ–Ì�#¨(á»nß�‹œÃT$bÕ›f]GÀm¬ÈS"5Ã�ux‡ÅàjÊöÍÜ\æIR÷zaÔ$®ÙõUñ96n—,sE–ä�‹HÌ;‘½àNçË©Þw…ÜÌ ì_.ëèW9å.†ÍŒÏj¬C©æ'µY }2F iš`á n•`8¼:Ñú>ª�(çgQ kÈŒp.Õ¼-G­›^ b™‘¯®É±„†i p01˜ µÁSŒwvQY¹j eï,BØÁ"A)#�uÉßʽ¤�Ó$ƒ#YêP&BŒÓ…Ž ËW>N@µ©%OìóIt»©1ÉH7L=Á?µËÜÀtÏH˜)‡)� ‰4¡vÆcreçoZ0¥”²pôÒçIbtYމXúéýh%JŒÒ*Å#[ƒ?ŸËûa­»¸g^¹Ccšo˜á©^>cHDrpT0ØÅ]i%X¿$äö¾®–ppüƒ‰€,"ÿ)”.­—ÁV"?ñ~þÁ»…ϯ渾_û`³ 2;H5Å^E;†²ìÂýØNÔñ“Û–EµIð‰jU»2\±•,†@¤Ê9¤0NÎåõ xm“sG" IC%¸„‚ºÚéä¬v7-EÜê¸ö¹dÅþဧd$§ æþÊŸ”Oš|e—Hù‘%(’üÊgŒë°9"’;¸A}¿$®‘àf÷ÙÃ;dogDo¸"û-c¿!I:¨À™âˆË�ÀKY¯mQÌG�­ÝKú.¼˜r »ÂN’ ~ �‡Võà3¾ª½Á'‚sþü/�P¯1±�2-þùpPÁgM�Pè+Äüî�ÃîA&M7óI¯B$Ç4VBK�.(Á¨…;�Rø=v„°v÷S¥®ñ©Gz£|? +â¶’@J1Uži4#ÞЛ&dîbè-Nõ`f«�xP c„ÃJ×)ªL·5D.âB””WŸ6¦=×E�‡vY·k/‚$eØ øJe­F¼§èöPˆMîîžß‘Fó/óE6¢‚ÎÀO##q^±î'Œ™Û;V½å€¹d6ŒÆ6ÉùöC¢�a5Bg²T‡ÿ bê5bßì>¿çȧ ÐH™k=™nÚ¯„4ÑÖ³Bêèz šyyAïxX—ËÚ²ÿìþs½Ä�DBBIšD„ÖlÙä(ß:!ÃÁgëî»Öp�µö”7$*šk‰ÑïUt2zð‘¢N¥�å˜ùѸ1¸‡ƒßFšç…­Öݡռ¬âÕ¿Þ"¡QrG�Û›À,¾ÔŽ8¶¹“{¶hZë�/ä^Ú©~XäåHíëE¡òÙÃŦ=RÂ&³.ù3àùÙÁZ—Õ TߦÎ!ç>Æ—CѪqb~àB3µ…°}õ[g(myÐwó*wÑÇ:œ’¹$­²Ÿ)§Zü>ì•ín S’¤¤�b�‘z—á ŠßŠv ]®àà®—ãÿ°¼ÜÏm:ÿ#¾ñnéõsCô ©ÚºuØ`óã8DÊB€ÞU‰–°Wæ!:»Á%`Õjz÷ÐäÒ&8ÕÑ&o_$[‹æÇ-³“â²~/Ý F;3n[­wê¾yã1ŠÀâ­§7êžkº½BlçDù¢å%õ¨Ü2Ms/ aî9QI}xøb™Üš2=Œ-Gª¾ :Èïü±ÿH@Y°ˆŽ@K`t¬³ â&”]ëO{{@]'Ì>Ù†‘óylìe?¬ `Óˆ5}q*Ô£é@: ©ÚSÚÿ ’g�ì¯ýQm Š‘ý¯Üq®ØÔÊàÅ®fù Yõ�Ø‘-H3cÐ…O „—õl˜èÑ%l# OrQQúæ²põ˜b·_3•làÓÒºŒTtÒ’{\@ŸRAQ¯å¿’â&eæåí¡•¡ö^Sœ :\"Oiz;(g¸š¯ñe d@ÖYO3 VìiùÇ’·ðÞÔà%ñvŠz˜‹U|ü©«[—¼È<þtüBªQZ;2’th]²Ð¼;\Ì«bÊ~òÓ�5]åëéiB÷¹Wu]i+—ñ{Ôû:qÒÒ3²¶ń۵YUÉö,�¾ñçþ%eä³X”Òü4N�Dꂨ¯x¶k¾;€Æº2;X¼{N´qõZAÇÄ<�Núú´šLCÌê2e»äeùq¦’-Ò­&âäg�â¹ü³Ñ[�µdb6‰¢Ô/"^@¼ Š“,j#¡ì[w0®|JͲ¼cåLÕƒ+/&�ß9/nd›ÇÁŸ…C WôTñí×Û9ÃËIŸV¶(¤IãÇ›TÙÑ` ÔV$­Ëk¬å ÛOƘ*6ŽÇ:ñ-b�ËÆEþ¥jì*Š6W7 _$ù’•uÍkºæuY¹]%�6 öž¬»"ƒHxz9²û&¾·›ŸÑ©úšiyjˆ†�§X/†0áVÞv`_éíR°¹)lùﬓ¬“»ŸECæšC`jSe$ØJ¢G�™MÅw¸?l'¡Ü=Fà~½_ßË®°äôxÄEìÂÎä/Ù:âÜŒóV}ñúй†Ì/É9O“]¸V\ƪï[4D_1Ü–Yç¡=/Ó0¬ìß¼x’íâ‡ßVGÇ+Æ uœoUnê%—Õ¾ßÏ¢} œBg÷×iå _b“f­–ذé+ç0AæA“»iú3C]»°½F %~áýjKËÔWî] «<£îØŽ ü�A³2¥‰ –o¯`‰ÜÙŸ%ÅfJs·Ks]²o;PjÎ�w:uT’�;™šûX§‡(^±ò(mxuÃçãÖ0åŠ]·ÃŽ¥´·}¬?)ÒÇq¿Ì¬$��"TˆxÀv›µ¥„Ÿ¬ŽC€^Ú§ÖlvômºñždÖ¬±�”yÓQ’/?ö*ÁÈk”ÍŠ!tŸñ€šó7þv8Éâ3¢tµ_™D ­Kíæ~å5Õ˜MöÎÈ«U5j¨j,¿zv€_àBlaäÀm¸šÆèÂ=@ˆ±ù�²ú Vp5°"œÏ\uæÉ㨇=:$‚2tjA+Þ�‹°C==bªƒ3;´åå<|)ìÀgMŠ·µŠº¼$¹Ñcņ‡FnÎ*º"ie£ öY¡GBÙ-P¦ªÜi]6S'Ù‚êÄæN{V¼Í×…è 0i– ©bU·½v-«’O=GÜhyó>öˆ ¼@8Ÿ*]_¬tbw DUJy S Še—E£×Á0:mÒ3/ÔxDyñüƒ!êýö³©Å?i“wÄO&É$0±z‡…g.¨Ëê�úß•üž¯L£MÓÕ ôXÔB«ÍR;6bª³9“Ô"›Ayz…Xé.j@å�¥ø ·˜ñãdŸŸt/ÊK—ñ'ú ÙÛKNÞÃ@š!´1ï™tOaYÃ�šÉ¦¥ü×F›2þx:P}@`–)—Òsrûûñ¡R ²òÄBú0z8f?’–�î]²t3Ý7 ‘0Ñ£$¨uu j‘Å‚»ÓMÁ|+�‹tÅ ýIí ÚVPǵ—⢋%¡åq' ‘À9ª¾tîJb&å‰)×Ô–£YØ‘_hÒè  4­Û4$IžAš_·o¬œ‚ùr÷¤•ÃÉfLu�ý­Í/Òût]µKÛØŒœßׇ¼›Ì”™Ê÷E꿾مÑ\lã«0VÜ/í-b‰M‘Ö$˜ÑTÕ¼¾{Ää#œÆÂIJ�¦Åb²,‹§„ß!°%•À[í®Œ·@uSÐÇñv I+Ñ­Ö^1;‹£€¦�,—4'N‹[÷@_ ›`ç�Ù¤v&s?©ïÁEcqI­è½d�ƒØÛ‰ @»3$Y:ïIв2¡ÚöM,ØsØmð:U,¬Ø¡�(Ÿ˜¼F¶cxS�Ç0ö‡�=ÁòxÕ†ÿÀÕx`*¹3q:A´ã\õÙÿî/á ”ß¼!L\öÛ)þDX()à![¤¤TPç û a’UàŸ} Q.b†û€¡' ¹“'‡YÉ71$iî7šážH­³C*vœ€ãºÿJÍÃ>ƒVgL©H=É0›®ƒ<”„Ývü€ZQWägøµ©L“—ßÅþ>04ÄLõµ“¨˜h6ƒk,TÓÀ¶‚cÑ´t—O í¥„"?{y.¢–à”±ñFÔfµåÁ�Òs2Öœù·CÄ*&4f™ßípFîX +$C7]£ÝÃP©FòdHú<ˆØ×¬ j¡ÀqK€�¥`á~bF»_P—�2ŒEyˆc@$J›G»°ˆ”q‚hAjk¨]"™kÓ’=ƒø~êh‰ ÏÖT2Ÿ¥ÕnØ÷~«ºé&Âî·êzOvŒ‹­WJõ™Àd‡v/{‡PåöŸàó´@?êå`Ň~¦u'²ñý@Hê¥O_�/uÎF’ØÒ`¼]5®½ô9ÕÕJPßph¹ Õi�JËî%<”Ø…¤˜nû8 ¶¾¤Á‹œµª!³¤±º|)—þíS©Ð%劅‡ª±µ:ùJíxl±zé t€v ËV†\·Ô[Rí2á\J/qÀYÛ¬ù´'Ÿ ç¦?ÂÓˆû´oƒOÎPfáQä9¡Y¥…#é€ –Jš-h ’Ø%;�ÄîžÙ1SÓ 6Ò(c/Ÿ»«n»vþ#¬+ñìLvä-pÌÐÁEÕùâq‹ÀɨÅ‘['$Åñ&ßX�ˆfp÷Öæ �ÿãáÇÁ.ÿOäºÌý.ùÃàµS"ÒÝkªÿÂu)²>óLþ{i4'öÆD„²!à,�ëc‰`“� å�õæoßB´Ò³\Þ ·Zž8¤ÉœƒÙ¸k„J RHXˆf„Z©Î©GŒ[jƒt>~èL²‰¿2’f‚¦h‰?†jÿÁŒû_“ûnZ,ÿ”*é¼íË÷ß§ta€Á?EÔïdÿºC`CÀ�6C€Ú¯¥ØîÏA¬´ý† Ë]+nÈahžª›ñ±2æA8t$[ÒenÒ2¾ Ò BK%.kg¨(ºPI�á@k·ÏBÄ]@•iæÛ/Fp¼ù"éXkûìöŽ+xJÜbïùÀŸºdÛõï!-X²ÍR%GÉ:>/P³(iÿ»£À'óç� UÉ‚1©L™¨÷öƒ²“TÌÔÄ!4»TDâMÛÊ!B”Ñ¡‡áå†61l8P}‡K e‘TŒo?¥Ô¢¦P¤±Ø3Ünò"0^ÞyA‹f´ ¼q'sN02} Ià¡W…^$¸ì^A�(Ü+EE°¥ ì\?áRc_5î�qX³¿a­C¢¥Û'øt¦Õ,x·uÕd{PnºS׸ ­~Éë‹¶ô–5n·e�o5¯¦/Š~H;¤”b©Ox»xQ¿OåK�k@oK_zDªö‹ôÔ| Sswlgˆÿ%¦/4‚7QŠ—ïðRäI¬"JKó NB³ÃòÏÖ‚GàSÊ­_„¦±Ï.&·¡�H \]Ñ›ðb‘è €fýcCz±8,|5;¾Š­Z@Ø ãåÒÝlø´Œï¿ç¸H;ƒ}E‡(ŽÒè%Aà™eÓùPNƒP!+�HŽ]˜-_G¥‘ây˜ËMŸ‰_.t²:Ü«ŸËü)s ¬ÆJt„�1†&ˆ¨}ZuJf¨D¤©*ÐK›�²)M¨E4›¯àý>bÞ&‘/íêÊ*¹ì;Á☣ÂlöØX‡ìÔ
êØsÆ.×û5Ûép�uƒ�›ý³;Y®¥ß1е…R[ïy\{dù©ŠV“³Œð\Ô0£ˆ›÷-Üï 1:MPma~è·¹÷p} <š.¸ßzÍg}�Yù·æ®’°r·­'onhŒwÂ)¯šuJWÔ]ËRŽ%`²‹tÐA‰f5yNvg)³ ºå}éÀ �ÿnïYtyJÄ€O(9ïƒ�Y …L[÷~ø+:®(*×LŒ—n+KšÂCîyöNdÚìÒÊ­¯ôö‚QÄï0_üãmg®Ø|<ˆ˜†T5Öciþ½–½PËÒ_°’ÝI*¸ì´y…s/ñë×[*•œkØ1W`èW¸~óီõbÒ{>\lL¦÷KÿúçeUÃS'²gyPoŸBœ½U¹t[–THp{dsÃÔÂt9Óé©ë†éé.ä‡ýS@<ÉFÙe!L½@=,@—g\pŠ!‚K'Ùâȃ:²,?É nÇ­®‡î4Á#ì×Û¹Y¿âå:DwØ£ &[eƒÍ¶@ס§|=¡¨>ìàÚhœ<;8ËÖWÚ‰‘0]Ûቼ9Åh(º²Q‹m()9 ‚¡BE‰u•t&†O¯ä<%‰à¦¿B×VŒL˜^’ðm® c§˜×ïi†­ËŽe�·[V(…ÍÝ–ÊÙwßü w+Ò·øS ô3ã”·?ÿËü§·?û‹¿þ›_ýþ÷ßÿî·ßýõ¿|÷~õ›ß~÷Í�ÿüß¿ûñ¿û«_ÿæ÷ÿþw?þë?ÿd¼çíÏþÝÛßý—?0²”ÁÁÞ#ô½gà?ÿÛïõ“bà÷ÝúÍ?}ÿÝùͯÿßüýíÏÿú·¿ÿJÇ¿ùÝ÷ÿïo¾ÿ·}bÿô/îú•³�¾ÿÓo~à~óý¿|÷¿}ÿßÿXïo¿ÿÇß·/ùþÝ�¿ýýëüŸ~üç�}?+ýÁ+ý_¾ÿÍýo¿ÿÿy©ûã¿Å¥öëg‡åZÿæûßýÃ÷¿ýýëbÛÏ ÍÿûÕÿ½ODÏ÷Ûÿáõ7í_ýâø‹¿¾¿û«ßþ:†àß�÷üíßìwî÷ûµûå/Ýü—ßÿ×}WÞøÅügŽ,ùËßýë¿ü·çÏþ�ßþöW?|ÿë·ùï~q½ýÅþ¿¿û·_HÅå__ÿ¯¼ÔU®·ÿuÿÇÿ³›þí­½ý‡·ÿóÿºÞ~Í_ýí/~‰ Òß( |Ñøa7Ïa~¾oþöCóŽ,±þöà ?Ó|ùíëÿ÷_°C�ä@î®°A. kTÀXë’ý¸H ;X¿nô°ñ7£T¢d”l‡($b‰ñ(A‹ø„‘÷â4jx×aÏk÷«Äva¹çòñöP3yê·hDÅW� 7‚etc¡<÷M €O�›—�÷/~îÛ_ü£L—÷˜ucÅy>–êf ¾onD«(~’åÉ�XÄ®;Ïc’Å‹,ø)D#;_qª D+ýÔSž× …â Ö•ýà¤ä;f;cLtôÎ}x`Ç=«wôD¸9~¿F©ÊèWêëÏ—|‡u[€ŠÅ)ÍÓH‚ ®)n8,*eZ¢¹ß=O¿�ë'`ð¯ëÿð¾ñ£¡BB�HÄû!šQîŽæáçKãÌç…šÓ[ �=NËO‡ÌßZ_mòÄÿã·Öy‡]ú¢qÇ�þèžg½¯�žßäsž¾Ñ³ûyLÄÿúûyb(Êúñ"ö¹ïãÙœ�HîDº©Ñ¸?�h¼|³º• ¿É?G§ÃÍ#nÎãš‹w<øöÕßÿ£O§CÎW³„êòùj½Ûˆ§Ñâm–ðÞúƒ�H" >À'×sÂD>tÆGÙÙqEã™dãH#ô“=[‹[AW^{·²åÏAWv0�+?éw_:Í9µ��ȶœÆ:P_½€¸2Yo–|IºdѬ¢ª›Ëã[)-ˆÏî)þ²h+†�Ú`4¢ëÆ¢ ï«?s!Šçw¾,tò¢¹\ùjƒ¥{‹F€Ä~vÌ_ш¥ŸÝ“wHåùr£m}/ìeÜX=AÙG8߈K@�hŽÇ9ü´³o~�ã«—ðz{P�ð$VóåuÆ÷½·F-V‹Ç¹7�'¿j6nÌ ùã°ùHÙç8pgq+CFÂÍÍ�¤$â1ÝÙÖk<£ù”˜N~Ò¼PƒÊ¿¯-ûkПž€Ïlá2:üúà¥v{áus‹7^©ªlÌW±ÒÓ8âÛB�Y§¦æå³`€zú®y~¬¾àý䩽ÂxŠeÅ©Q™»â­¢8t‚œºz<lÀß²ñŠçYãsã+ìW~.¾ö’êÞiðC6ƒ€Œæ©›¯ÆY¾ÒX{6>ñ³¹æ¡æ ±/gþ˜¾™¯žA¼WÐÔVÎ ¤$}jò»c䉱3àekÑÖã£á«»ã½zÄÈå§ø$�ûì«ýt•ù|¯LöªžYó {M�=>™zb,²ñÌÍL¢9µÖÚÎÜ~åܵ7»>9è‡_ݰüÃWš=‰~hìýíïóžï:šÏ<,Æà�X»Îý½r�‘ðgnº_4Êø¹¸jEù!›)|ùß~šhY<-Þ©>}/¤³uå:-ÿ›_ds½³o¼”RzŽÚþ}>ƒ<5x+#gªuG@„�üÕr-Îüm4¯Qb˜…‹O4Öü44zûê¸ñƒè�R¿zÿÍ#0¹-] �ýLn|_nì÷¹çjGs}ú9µÓ·žyt½KÍyØSfüóaŒ{ßy-?ƒÅZþÕKÈk£yÍw?÷C6_¯ÅêÖ][‡s‰Ðv gÞéÒ~“ÍudßzBNb¢@j4Þå ðáÄ<.€”ýŠXEñÄÑ\®› Å…ÑxßñAÏK”cò€Ïo¦škÆ@©Gß 'm¶¾rïãÀü9×9Ñhx¢»h«ó}Äö3SE4߹ɤ@—}#ra€3×ü\8󊌖lŠ’ðÕ+x} 6½2>³�o`‘Èt3›±o£9×}>íóbŽ+óâ«ãÆŠ ¯gð»o¹_Lš_ûÔÅæñÛl¾Ú|÷Hbˆ[â¡ãí«ãæ °ùù ëéÝ:xˆ-�'°~àš¸Q.vn¼Þ½Èhº¹ö@Z€1Àù¾ê•�ÿAõ›¯ŸØëKR<^äX@>¾ßZ@¾òÒÿýîû“qÿóþAåhþÇUx“ôÔñËѼW¦’Ík½¹û“¸(O4Þ_껌�ù¯¶µ¸×Âÿº/yWžh»êŠ_Â2ïü=á¸S^ˆ–ŒÎJܤc¢ìx4¶¸Õjn™±X×hÙ·äzc¢±ç7ù\±e[õýG…¨ÜÏ^sˆH4Ö«d¬àh%îýç¬Ï}DßJ!ÙOaÆBܾÈe¥Eh^Ï×}ç¼Ï”ì{ÛØvåÏyÎ¥qöì{ßñÊ d£>w>rÈ’gÊh­EÏQó šÄõÓsŒv¨Å7‘W2î,ÅÌž™—¶²ñWyט\×y4Tì|]ÀÎ[ ±òDÖ›^Ðúî:å7�[ß½ö¨†F_e—b†ì%x½NûÑ  sÎ|Çãõ °—çêeVB-'0XùÎÑ”N”¶V,߯áüâì5m™Ô„Ft<ßÈ–3l›ç[Š[ðsƒ^çúg$õ÷mfsWÒ‘ÆWb^ŠèùŒ\��;É^©ºØ�®òÚ,‰äXÙÎÒWòK(±ÆÉîÛým4ß%'ä§x6—tQÞ„’ãR ('/Xâ�ƒ9^ËÌH'qÆ{I’eIžÚí­Ç‚uýdaUY¸ùù5Dô¸ŠL·g<ïÕ—¼a2®HO6/7Ö»œà¬ø9È"“2%_e˜yýÎfÊön¬g²ŽD1�¯I½¼3@Sx—Œ$g9 0«]6÷6Š~âί‡£­fÐãü†F(ùÔfu‹Æ+×ék}_æy˜�çEØ…gŒ �¯\®/4ð�uÞ2Ò’ßFók�ÍðÏp�wìÎ+-?”Çt �_Ä^%jþùùÒ#ÍD¿\E€ßçìÁŸŸŠÔã™]6œ¹‘ÉÏÌà3Oät�9h[ùÆ“}¯k�Ñ«îœ'ç‡E @B²Åí"�ûm´„ÊÝÚ=U\Â8œ;ë—?�Öæ¹Ýy]ÓØ§ˆWp�´ƒ5ŠÎŽ´ƒLò”²Æ™m¯x�.Qò3�éú’$`¾HL1À 'Û¸æ7ƒŒØQº±ßý¬"~ d“ïýsgH.ÍÅ3¹xϻϲ•“ó%PZæY�êSc[yÇì(Ôžã>ŽâˆÏyªpc.ÛoïË$l�'ÖONPäy邲3c¿rõx¹ò3{äÊOcÍê lªèy�/WS �(@d°ÚŸ™R&ÌùÄV<ÐÆíž×0ïÙk¬Œ í‰ž«VÄ’ôϰzß¹ñ¾ò¥k9«ñ÷g’‹ùU0):A]É¿U’°uŽÊÉ)ã;y�ÈPYç#õI]_¤sW~a—kqñÖ{ ß�óLËJÒFãÙYïÏ£žúÊ7C{,7¶²ÎgsÀGôÝב´ynV�mÄDud\]¨y`Z\7d@hÏ+À<Ñ̃g!ä�ý6šïzåž•�u6_¥ž8)R°qîâ2ZLêÌ%äY¥¿Ý3•³�™ Ši5r¸í'Ñj&ί(-ìý§:J!?§o‡ë4f­‚&ã4R7§V o£¹œ› ´ëÇĆàQ’ —yÁçõ)¬üÛõÊy¬PI£ø42Ý Ì»æœ¢„¶ëäx‚±EÆd‘ã|2ù‡_¸Yª»nŽ畟á�ùVÖø“ö»F&lIæåÎ òšæfĈl6„wÍ5Å/æ�çã^.žDóAdD‚À�ù!?‘à[ý}2ie†0!áú±Z#I…&–c€uþ}Þëëü8SÞ<³› wô=¡ ž(ÑX{NÏz·r€ëÎÙµV—©òSg‹25¤�ÈÑF|èçòŠ™žkv§ëã´ý =óX½³xÅß�×»zço]°ñ¬žµ¬ÿŒš·ãƒ\©%ÝäÆv"gAþ@ŽÌû,·Ÿ_žA^t¼Ü«�L›¨yæbvÅ«Mu�³œ>ÑÖ¤àì7•Z=Ùä“®®�¯e¬:.Zœ\Âó®‘×õºÝó9Ëv¢±Ÿ�ÊŒýÍ-&Íåm®K8¯ÏHçâÆ÷ ”sÍXl2Íù{_I}ÚˆH²£"jÿ=EîuîÖUóïO2£�vÛ™®î9ίPiõ²âǔՎ°Êàh,#§Œ>#v ¹0£qÔLÞw”c Õþ¼Û÷9@VþÅH¯Ùw~º1ð„O ØÏvá¥s¹2@£å ü¢ö+¼WVnj}4ìye¼ãûïÓûwÔwi<[ûWH„ÁÊ“étqöìX'ïL;UôñWÍL7Ï÷\ÖÈÆþŠd¯Hâ©ï�›:eؾ�æWÈ#E«l~e–jõ}ª²û–ñs5�lÚØDÏ;N¯˜i¬³�„Ó8?f�«dßQ£1Á[ïJnžï›?7îÉá?GߌD‡£7Þ‘˜Ú?6îl,³æwó!¬”§�=¬žØÿ=Ovð æ0v>ég2¦˜?×ùó’�÷Éœü„šG‚ã¢|¡Æ³àÄô7¤K‘m-Á*GžüÕ•9%š 13S¯ÆyŠ %›ž‘óä8�ŒËɵ•šW�aÛp‚Ã=<9_›m5Ÿ9©”¸,öÕ'‹Ø½\�þ¾óän»�ƒ}vÇÆ�æ êD§ÒR˜ý×í “˜y\ëf€;g_é:¹qœO£Ÿðf´w ¼–°Vdìr Ô[C#*o1æ•3ߨí1]`ÿ6šgàŠFÀa9żüµZ̺ÏþJÑwŽZJö3*Ï4ßF\U}‡,–Ö”§8I>kË=NMØi?™ÒRλÆF;sCº� gm'yæÃË,7*¥“ËËéô>3F! §É×nlgæ¬P‹ÜØO€ª*ÇAž· zS>P9�îO³OëÝÅkå¿æó½¸˜Õ£pwÐ+-=OY"CzR8ø”lê<˜ó¦®’7EƼn|Z~VxœAW ‡ Ö¿ü Üude™Æw“ó]êk€¸¬è\}óúËU³±�˜·¾ �Ío‰Å¯« Å|s¸ŸLà Å� +ünU�¾wâæ{3j¿÷³}FÉ=wI]H ¼5X´|ÍóΩ<KhÎ8nÖ¸5{‰9#�û9î«.¦=sðé_gÔoy‡ÁíïJU—Ëã4^ç d@÷KapWK÷ï@¼Yµ†Å`€ ò×r 1Þ™[±~º·ì¿¸€¢|üØsgÐY�É£qž-Q}Ú ‡Œ³M~ö‘¯§ù®ç¯O=ͯσâlÍÅ“z¯gù¾CïW1µÈÞÑYÉk0³7úŽW]Éy„ÇJžprhŒ¤.ŸkÞ…û]1ä~Î ÀµÎY.¾çÛçây~æ:%a¯r¢Ñx�ĸ?ì P9¢–U45Ïœ*€Ùß×<Ï‹�:ÝÙˆg­~J�úácJßYÏD=Nã)[ܳ½xS´lЈ¶ÐI%D’«_vsM­ç&^ïîåö^©c�ØM¥n~)¬ÖŠeUõý˜ª„_‡É2ì%u¿Ì¬5Ÿ}O•I’& Œ³ÞÔÄ«¡æ×õûÜ'Þõt=3U_/hÛz¿€xùnœÅ¦fߌâD2œ}½æïž��ôä’Ru¨L°wsG‘Y‡ŸaX¼ÊAäš áDÍ®œhiŽTžq¥ëuò«öù÷ÃæxUÿîw‘Úœ¤Ú‹Œ/:Ç=ÐýùneŠˆ›Ð“3@Ô9þžÔNÎhÏ‹T¦ _¼ :kïS,e’Øs€Ìµ¬×y•žiÍòúbÌÔS†fÄb5ïs¹W6få_áñ`æ­)×Êõú:|‰yQÍÉé@©›\okDêãK-%ì9ä•»· F}z¼Ûƒ(8Èˤ”B޼®dlüúTÍ—¦©Vnç~õzB·•|GÝ¢`®V=‘ºqñ[óÎØ1C´á<Ó j_8uîLî²z#Úï –Ÿ$‹Õé…EL¶™3ZÏ—#"0ŸBä‚ ÷£NÄ)¸üG\ÿ:�~½ÂýŸaØeœ8X¦½EËw¦Ü%÷V×¹‰¯ºžö7IÇ>ðÛØueòsOͼ·QØÁ¸7*‡ͳœw¼çí5­Í|�ë'Ÿÿý *‹\x£ñɉµ·™ü±×W»ÒÈJîNìÇúœŒÈ^ÑøÔzF}w‡ (fÓ·Ñ|_9_ Z›ãžyíZ+ï3#´õnÜûìkÆ”ë�•ƉhŒÒÈ€IÔÏO¼#4®“´YÎæ¬ÎÔþÊÞð÷íü}d»qô|¸'Pý 5/šKî�®àE½ë;œìqã:£–uî+ñ:±FßçEö|%’�gfXþ}móýWêÆ\0"k•�絿OXþ¸üÓÞ“Ÿ”¿H.Ò¼ Ò/¶t靿“Âer-uÍüHk6Ö;_¹úÊa!ÿœÅ4wx4?I4NŽC\ó|L.'ÒX²ç+”áçør¥×ç>¯¿{õÊ3™«� sü¨¤þ>Ü7I[ŸKéY#Qs²ß•¡È4Û‹D¿_˜“§{MññúŽzÊ…±|{\Är’šømËÊ•Zç�w�å”Å$NtC i|qÝŠÆùd–fïz×àÅßzb»×JXü‹§zæ2w�Ú"}Çk’�å>{2ˆ´-Ó¢õÉ›ˆ­èÉ€j'âw½”ÌÁ&‚¨уÑÞ1·ÖÙVJ8þÐ(�x ×^sUŒoˆÔìÙX^AÍà”×ǒ㮕ôºñªqô”õk†¾{Éœ÷@,þ“qÆGøç"cGÎ{$y5³pä÷σ|�äFýîFfÕà‡hÅTJ #‰ƒ}½+|ôÃjLlÐ�%zΚíSc¹J’gõçO_ýÓ)Ä2¯w,lA9ܘ;¶îå1(5ÎUqËàɧ;£¢2q>… YÐØï|g^ò ô $j÷:øm4ç&�ÙãŒÛ{=SJP� ó×éY_ãö£µ ¼@Ž›;מDÌÝ6c¿ÔMÈÆ$á*ü?%ô™7,ùáôLãñ.ÓóÉ;þªoRšïçÓÉ{SOµ|œôµì›S5cÎL4Sð?ŸÃšóô]©²Ðú}P#)Îí •„CÈ—±V B¤ÁúYa9­óz‰½�dÉ¡»C4¶œW3qû5¥7Ï•YVAM*ôˆW2ºù…è#Î^[¶“Ò7¡yÝ�±ëùtEÍJ4I’5ºKH1@Ééþ€oî»tçRs€q�É#jÏBÌ«¯rÊ£ol5X1Ö�ÉhüéÇU=7Y#šíÝ&L½‡mgycÿšÞòÏc…)_ssªX ÿ:3õ±ÿqcæ¾»uݸ® <$»’àËšSâ“§ºjF=&eõL]‘vªl«^øõB[ͼW5ªl³[Ô¼ *ý„3Ý_e4Þ§1&å)Š\N:UºÆùŒX­`®÷ �lάþ+LÒg ´Ȱ–óŽdÏå¶Ì]\‘t£±æN%#2FÍøõÎ}%¿ÿ¤RÒÊGÓvXà—F±Í $êuÐ^ã]4$é·ÑÜïóÝLvŽ“väÎÅ‹ô¢HèyäuMۜĉåF`¾‚� r›ØRygJ4¾bÊCWTó8Ñ ¦Çn|Žä/*m?/=1®³àíŠ^r©‘áX4žž³‘GC»åyÍš[¸ùY¨ÎÞÑ·ü9UÜצâ¦yŸ]OÍ·öq¡8¾G×ÁY¾dr’bsz"þÒÞ °òk˜ÅÛ 81áˆ2�w9NÂO¯“ízés­G;lS~ù‡„(dðæ.ñý3E[VÏŠ2<Ýä9O2õ­€�ãœÁ>Û¿ÿÅW‡ø¥´WÏ$m�¥u‚'7ªíÜïUº'Ë[äûShc&Ü÷«â÷»¬¥ä…ÝØëŠbùÀ  RÍ'w’%oõ=êYëÎi?åÚ;ìP£ï«Œ�¿ð›{¶“ã}aŠP"NJ't«õèH)䯬êjËóB}·À#v§§Ü˜ï�¦$�½ö\…e‚áúÁæ*nJéˆ~HDýdÅW?Ù—Ôª[<æ3s´Ü7âp&”„¶©ï‘¡"ØÿÏÑ·�ª‰’�¿4˜¿dRU7¶’Ûd.3~lúÓŽ·Ö»B±¸oÖ�^Ï^YÀËÔv prííºò ÆIN¶™¨éÂó¤ïžd¿½ÏX®u¨Ýp† ùƒÝؤ4¬W÷ÿ�°¯‹#éÚ� q÷lŒd㊠²7"ØL{Ü‚»»»»ÄÝ}ãž’ 1â¶úÉÿ—[§fº‡•ïÞÝgHÑSÝ]uêœ÷=çÔ)w5Q{X¥Ê½¯ÊF}µ²5¸"Õ*Iª‚8P…ÞØTdMªÑ5Ý�„íwÆPÜ^Œ^éÁ&5e¿ªÆÖTe± Ú¾ ÂG¨ ôECªŒ¢Bõr±„Ÿºü•‰©Ò­�™êö©$§ÄSp‚†žàb2Pé|¤…à\ÁAÜUª¯‹ÁN8qXu­P8B¥R”�B´†EÜ£«t¥«š•~'èU=²*?œ�a$Ì‚z_\k*2©úL…¦Úà¥|/aÂMÅ� ЯX+S(ŽhªÞ�j¤,£lT—QÄ€MÙ�žXŠ l±ò^úb�ºèœ{"¾�ÔD,ÿe v fP¹žá2¤¯DBp¡±Pfï+¿¯'²q©ð}©žÀu T5±L�ÄýöÀÛdj$nÇ“*w"/f*Ò%Sa‡—‘/ªžAIoMq"�P°ÎD —¦8›Hõ`p↸™×RQ^-웃º¤‚Äê »ÙðaLe4,>4K…Û QS1!FÑPèUØ) U*_eç„™Ty‹a£¡@+L•šL úbAø:Þê(ª=¼9“ªYMB¤zªm•zb¤T*Í QˆŽ©8Œ²_=1«FªÞb¬§¬ä¦¼™ÒÙŒE»hhh î@_ô´¨JKA£T/¡*‡®ž˜ã Uª@¡õúÄså›é+½¾J¹‘Š»X�DŽ®ª {cõõÄ(�‘¾z­ÚŸ(}Ñ5wIK•õÌT»sõÅÚ‡ºâ>Xõ¦]©R[lR5›¨|i¢ÔÀ¦a|N’êÝt…ÝÌzj´¯Þ‚nÔ‡ûèJ•×®ZáÁ¤ÊzW°«ÜPô<âõ¦ì@]¸WªŒK¨®5±Ê£€÷°‹. œØ t` -Š´Mµ ^[Vrܨ Ê‚Ôß7wfJ…â’Êf=C ¨¢$Ð(ÕÕå^O¸—à—*ËSýš¨§×ÀD(‘ Û' e‚* RµÂT•æÒïSÕ§¶à~¡Ðƒè$Ta\Bªn E¨K˜ ! Ü,ª[œ+¨|.eÖ¶ò- T5C`û¶0·ÊâKøÈCQè„¥‡®’s¤}öŸÃ!�"Ó“ª*,ö-µ¬Úþ¬\ðöˆ^hÆuQTªU,K�Õ¤°Ò•¸MMõÕS¦¼ .DNp*�²_ b‘F##áZ©àž2T•ÿÒ3R��à+†Fu%XáþÆ}PzªjWzÆb-©2HÙ�qŸ<=å¶r=±Ò®TY/PÙ(ì[Uqe&}Œ.¹IÕ¬v¥™˜ªjR@£ÈG…úÛ²nqÕ±|«®TY[ E.+ÖÈ0CžÀ6„¥¨g*º‹T™–ФNYÐ×KÉHÅÐ(¾‘ðuCQ2qUFu5±¯2+7êŠñ7©�ð¬&ÆÆ}ùîŠï‹#eÈ Õ 0¦ªÒdÀçÅøŒºÊ�®XíDª¬þ¡l„#ÊU7S�4`)ƳD䃛E"¨ßÐh¢X¨ u@£¨5Ô#«¯'¦(‹Îeñ!|ë©Ê³éõÍà1U1#Ü,ºMuuÅkM Å‘5ê'銊#¡u]JlÔ•�úÆbuNe^~V]5F5Q?�ºY:p¯¾�*wúâ+E˜¦/ÖÂ× $“mÕÓšŠnf}ÕèæhêŠåìôÅ;RåvLU£¡4Uª—€žT¨Ñ�úB”ï ݤjVÛ©‘¾Ð�TÔ’‚~B�Bù@C¦†b¿Æ†"þ5®”žTUòK¿O E]ÍM¿ODPÛú"Ã%Y•Mê2¨xÿªòëà¥ÖŽë)…”iU áϨËc@³±¸8Õ÷ÒJÊ-fÐ(œ> *¨-|__„‚&†âµ kã&o©µ n€ XŒÐ@Œÿ±1¨ƒ�BB ‰>×ê÷îBE}ý>XÖD¿�T˜Šár¡ô*úú„\xV„X¤ºV Œ‘˜ž'Ôœ4k�)óV E*î\ĶOø¶Ú©’v \Z_’‰�XÚM½þéT5ó1a$oÚóT5‹›– UEdõõļcå=”�84¨¾RÍ¥u…í¾*ň¯мèë뉽©ÅØzâ.Ecå(Õc‰[e �…þô »(›y¼…I˜7SSÁóª …àFÑ[£Ú°‹E‡®¬¾ê/¨ ØÀÍtE (5Y®ùf(Òa5¡âT[çp£¡@��2nP§‘°¯^Õ�þ_o&¦ùJõDžú§1€ÁY ¦«’í¿PNO¡YLî5QaÜ(zk•é ¸Ñð™;"cS—¢rYã› ÙC¦‚ýWʧ/b4U`HIzE*k,òÀÿÂZõ�ÔÍÆúâÍDÊd¨~…?ÓnáT¸?íËøŸÙg „à…Ý º·Sê‹;5þvSÆ_7W¨«µYlêøüÍö'•[]NÓJO±ù¯UŒõûœò†á妿ïc“xÎÛŸŠNç¼ÁqɪfUòÞŠNàJíªF±ºAŸšÂQ‹p©¡±ø}±ò‹jëÆßU½N~ûSÁáä7©3 Äjœ¨Y]¾K¨g�â†v¡„ÁßbPÞ<âÎgÁ@àf±Ø—�PÀÃ@d§¢ ûïÅÔ•ÿ T¹åøûb�¾�b½¾üñ¹6©ÏCúc-7á<$a£14K…„V5žS4!¬&662Rn¨ƒÔQ±ð‚Ê)¤LhKUêš É·©&§\s©å©j6ßPØ�fd,îø0V¦íªŽüB4¾n,”ÒW¥E‹Y ÆÊÔ“¿½ŸãlT«ÌD™U«>ÒI¨Ž¨ò6üñZÕ¡ÿ�:ŠBðÃDLé„F£>W.þûcoþö±6‰‡€ªë®êC…áP]ñH•]Å[LÄÄÂ6Õÿ6�¦FBa&• Ç}ŠðS¨ò×û Ga(&–¥ÓÎVúH(õ&TQW6‹RªöãFA°¥B½ã>Õ1Äó þævêÃrÿt½øbu^LîÄç+!ª ~B£±“Tû)þî9„ªëeãZÕÿŸ‹¤Y<ÂÉX,V%6÷—^ÕGKªy¬žúh)#‘AáÒZâ)‘R¡6Ö“B‚2Wí¥ýk·‚ÔU–DRþÁH8CU µâÅ#IMÄòLDÒ©* �{ßD]éô¿?°ºf”p Ÿ´oazÕyBó`Âë+W€ÒpêŠO¬'�Tf[¨`j î^öˆCñÑs¥*PŠ®m]=õöõÆ7áäP=ÑEe¤.ùó—S[#uz™¡pÆlÖ7Õƒ—Êõ®E±B‹¾pŠÈßt"hO£>‰Rõ뉲¥ÊÂÜBµ>u´úMßÉ&ñ=5âÄU%…ƒÃÔ[ßÄ=P@Ø@®ÖÎÅÓÓò±pêÍßv+Ø.S±äµÊûï©j6� ¹~BÝH‚èF*½ckÐø�Yu­:,Ghª¬¡FC¡×?=�€QuûÄaðî"OU³úè[¼%LÈ QŸEŠSˆ7ý}'0Ðòa¦:óæëPä~›½bƒ‰Íšm+}ü\,ìüý}·)W::»nûCó<ù¶mvžŽ:¸U5χCÍàØû áz=�Þèw=]ü?‚þa†~qCMA:zº:›uX^WǾd5l1²  ŽÐ !3« /kl gT°Â-›þÐbç–â—ïóÅ¿mT~w<–7¼�Ôf­«‡ã7Ê_ñ«YÙù¡·†BO‡Z7léjÇ@W{ÇU›é�:Ô–a¬Ðü‹ñoè1P—ÂÍxÈVDö½†Ëÿÿbø‹ê ªhÑ ûê™à‘B‚— ›=?Ùj;»ot õ�Œ £6 ^¿�”¬YµY²a3)ÙlíÐÏ‚tÖ€Ïff«†¹Ü®ßKû~›Í�ú­ßÈHÖ®¶’˜md%V2—~ÖŽÑý §¨2§Èþ2§ˆþV�Úœ�Æšæ’eß­—lXKK¶îý¶(|4¶ÈÜ5ÖšQ’Õ+,%ë×ZH6˜Ó ÞEÃÊÑOÛÒÎ[Sî7Xæ–4ØÜ1T{£•�d³ùV‰9ë¦amï¯%sL`e¬µÑÒßÛÌ’G}XKÖ,Û€~ZI,ig Ò9b€Œ÷ÓÜ´É_cI»ö#œBúsÛb‡ò¡YãaÙ1•Óèè’I”kÐÊ5pã;„ó‹Ám‹ÊùeŽââʦò±ӸȒ¯q•:|BÅt.¼`"ç7”Øê£Å¢k™ðòI¬Gø`Æ%d �7‰Ë9¤ËÇÖêp>qÃÏÈÁ´GØ øÉº…b½£†°øØºé\DáD®Îǹdœüú+¶%ç}Ñý2F3þi#IïÈ!ŒOòpÒ1´¿5áÐOF(úÉY{ j«»ë0€tðѦœ}ú3®hGßþr…ƒ†•œ–Èí<4ißÜQŒ_êHÂ5 ?áì«M:ùkhli÷ˆAœwâp™�“†µÌ¶Ÿ5³µåØŸrGïï:˜‹È™À¥ïšÏÇ4L§ÜBZr®ýHûmÖ3n(~÷”æÙ|XÑDÆõƒÆ�…ñôMŤ�â£j¦²ñÍ3è¨Ê¯È€äá”jÏC‡ä�%�cZòÛ4­ì¼4iïè¡tXñx&²l]ü’1† J…Ç$*"SöåŸ1’rèÏù$�`½c†Â¼6îšm«aÁ:iXðÎæ”#’ENbnéÔÏÂÊ®ßF NBp~ZÖhÞå´‡†…Éé&V²ÙŒ“l\/“XÐ.Ö¬§¦ ½a�Æý{“-Y³z“ÄÂzk?¹kÌ@Ò5i°Ü5e°lk°¶ã¡a.sêgnn'‘)Ü4­îf[¬%Öœ›å—3ÊÒÞGÓl3#Y¹Î\²Ù �£]Hf[öÚ?wå™8TFyiX²– Í èº «Ì%r[$‡áýá9䌫†µM É{k‘NÁý9·˜!¼gôP6 y¤MT>ÈÜt6<<½-n¨ ½/z 68o,Y=™�­×á¢J'óAYc‘<�ç#Ê'ó!écA~h� A„kP.¬ò+4¾“Y÷°A|TÙ®ø‚)›Ê��Êž×ÐHvèmÁƒh�À�œOÊE|Í >©þkEbõ ¸7ȼMhÁ$…OÄ0Þ7xœ1–Ï÷aüâ†Ëí½´H;?m¹ƒ·¶\á¢Iظj’öÛ´O$ëîу)ß($3y‘¥SøˆÂIŒüpÖ)­ƒäá\LÉd>ºvœ=–ñˆLºøõ§ÝÂ2þ©#Aö çmZ”£�6ï•8œ F²˜<ŠÍŸÀ§ï]ÈfZ•Œg<£†P^‘ƒAι¸êi\LÍ46µi6—Ü:‡ )Ïú%�d<†‚lr1õÓÙ¤æ¯é’Ë&LÅ�ï¨Ì=sé¨â‰l@ÖhÒ'~¨5�æÉ剞ÉslÝ46©q&S>• LIo‹Ly† bCGó±5Ó途‘´[Ð@6(s ‹äæ�´õÐb�<´éˆºÉ´gü ÆQcír3¤#×J¬H´Þø@-+Æ[SƸ£¹ô×’£�㦱y #Ù²‘’XÊìúÉÛ4)ϰA„cZóöý,ä ‰ ßuÕ�mõÕ¢¢ÈíC´IÏ䡤{â`èÇBîÐÏ’tîgÉ8öƒw`Ü"Ñ�…chç¸AÖ¼¯&Üé? ¤ú³î±C§È�x~Ü¢Éy/M�}sÙÖ~2ÎK“rȺ%‘qÞšÖÒ£6^Z¬[Ü.8oï›9šóŒ¹‡ ⃳Ç)B³ÇÓöAý ‡Ðþ´GÄ`:"w<“¾w.›¶cŽÉšŸÁœWø˜Ö7iœ9–óOM¹ú ݰ�Eãð�^e“g¢Ÿ³Ø„ÆlTÑ$&,í�4ŒôIJyD ¦¼Ðè�-ÆÉ'šOdo&³Ñ哹Øò©HWŒ¦�ÃÒnÁ¹ ¼±lTùdERó.iϘ7.¼t’ÔNç’·ÏBø`*‡t—º}6—ypè&.uÏ<ÐE|Pêh¤ SNÞÚ ca¶`\ýо±Ã¸°Œq¬_Æ(&$\4ôØfÐ'hMLâR[æ°É;góñH–¢Ê¿bƒsðúaüGРCáY@B Ç3�£á�`-q‰Ûg²™‡1YÐ… È¢“ºlBê£`"àø�‹®ž }S9Ç3q5S)ŸØ¡ Cl4’»”–YXS›fѹ'–òÉ­³ùˆÚ©Š¸†è^`-‘ÎAýï¤átpÎ}h¿”´_ÒplÓCŠ'ÀZ!·¡±÷ LyD Â:éZÚ;n¨ÜÎÍŸ‹¦ÜÆë:üÜ0è;ŒSÀÒ%d€5¥ègEÚõ£\‘]p‹L %müµè­¡h½‡d\CH/Ê9W À/Hþ‡Ðh¾X.þ(wtôÁXG�ä×;y(‹ðY<‘ JE£~å ȃµÉm)CÙØíÓé´ƒsÙäCóØ Âq¤½¿6�t)¬X“6€ëÐxcù (Ï"ù°âPß”£`GГ”­�6Á;jÂz‚w»Ì¥6Î}ÉycÈyFá‚ÒÇ(ß»p<Æ€ #ƒ‘-�B˜0¦| –g$ðw˜{ЃøÚ âñ€…hïØ¡XG…–MbƒsÇ‚ýlsȇNä"Ž ÉÏ…¤�áGr�écÀƒl€ŽÂö×É ÒeXÇŠ,™¶æ� IÍÇ×Íàâku„A@Ãz…uÉeŒæÐ³Âºá‘®Jj˜ÁÅUMƒç„±eÃJ&‚ò±;f2){ç°±åSàA6`‘�˜G§ïŸGg^@åŸ\JešGGTN¢#J&®˜ ?AgÂulêÎÙtlÃTÆ/kèB�5.®~:�d›,:§Ï¥ìžÃ†#]ŽÆÉ×Ðý”Ò?¾ Ã舢 tòί™”ÖYLXÉÀ ÷ï¸aL`ê(,¾Hf³FƒÞÄmþñÃän‘I{¤û^ÊÄ¡5†ô1è.,w<ë•0Œ,Šôéî7Æ> KИŽRlCöÙW­}Æ=x;x†ìÓKñÚBt#^oèo  Û0™'—�å·L©¼3KÉÒ«R*ëØ6$w,ë•:œ«œH§�X@U>þžÎ¿aH{f7·=í®É†Œgs.fò�.esŽ.Ác—Ø„ÖjÅDÊ9haë«x�õDø2Ík²_h=ráe_)âwÌ]z‡²uÑdœ�]¼”²g.U|Þ€E:dÉî .8m ›¼c“qpÌ#à Ù5˜o�&,­a4¶qCð˜ õóXˆÙ3„óŽÆ¥�Æ: æË7}$Œ% :Ý“AúÖ¬²±€û‘œa™É:¾˜É@zÉ)ð<èYØ´]sCÒÈþ“h¾°ÍÛœ>x•}x!Yxb)™{d�Ö‚ti�È(’‡u%þeަÃ3ÇÐáJ=J£#^Hg˜K¥îŸMÅÕN¡³‘¬$Çïç“<ÛçÄ�3édß‘> ="É]‚ûË�|0Çbãk§Ó9DZQÕS(_4ÎQaàùhß”á´WÚp*¼`ƒÖ—Øú5í�>t*é†ì+ºÈ.c[8�½‰8È-�Ƈt�dmë¥)s Ò] ¶‚AëËgòö¯-)§~VÈ–›sè'â*ð»%í©a…ø—ŒC„1·újc{ ö#õت𺔬ºõ “zpí—:‚ €u^0–Bøÿž;†IÙ3›Ê>±�Nh�AE–O¤"K&Paã¨�±TtõWð!"k'^éÃdAÚ” £„[â`:( å“2LîÒßJᥘÄÉH;… Àùe�fýóÆ`9@¶ì#‡øÖ—I#ÙmÑC˜°œ±òê{ßPµÝ+0ÿv „m"š_yõÃoäÕÝßy§±±µSA>±H¬×¸�åÀVˆL]ƒìÖ�OÀ‰xþÑû#<;0?à>ªb ‡æ��ÈVÚYd_d_@cÌ�džƒŠ,–A¸Û!„!Àþ3ˆ7¸‡ ÆXÙNZÕŽ0 Ò=È.¢õ 2 zˆFÏ!|Ö ¬)ÐÏLRý 6É.ú~¶ä¦™òªG¦²ÚGßÙûç‚ý¦œúÃz‡ûÀÚa‚óÇ2‰;fPHÖ°�³ó×"´a�Á¸À=Iß$4Wˆ3Ûxhg¤�½#Бˆû+uhå$à²rÌõ`mÁú„ñcCRGƒ>¥‘�¥]ç@6‰tGëÀ1¤?�ì1å…ð’OÚ/k$é�æ�3�1ÚB†¸ aÛ|I€ áÙHàíV´3â!nȦ#.æƒî~Àg0ÏHg�MFXx›~h¬/°Ít0’Sß 4‡ÉÃ@÷>$íܵäNÞZ2-lüÒGÈ]CúËýµ-8´/·f}6 Ðß¹-aa e|�ݦiN:h>ã&³ñÖ¤]ÐÚD÷žN»F dœB€ßáºl,⸠hާ%ïšMV?ú^^Óñ^_ Ç¢r'ÊëÚ¾£ZÞ›Évýc�uÍ S*©]_ö–ÁТq2G_-KšëG¡w!‹4¤ó.éÓÙ£å¾ÚàÃa¼"‡À`|¢†‚ÞÄ|8ª|(ˆK—!nQ2U„0�wÄPÎ+x0àO.,u ð&0aå=Öæ ˆk#ŒÔŸDØ”ñŠÊ!lš5éE„1Ðï�ˆ÷„f"œ^8ëZd³�}‹±È=ÒÙÈ�Ekn�wl)ƒ¸5¬AÖ=裂 †TÓ«õô®g–ÄŽ§«˜ôóï䀯)W„!ýâ‡QA9£ñØ#ٹܺì5á6¸é�®] ~!ŸÔá„KØŒCŒ¦}3Gb\Yƒ°x“`&03ÒÑpÂÕtÆ$“(ÿ¤ä¶ØÁ°Ö@6±ŽEk�¾?‘]ذv£æ]f¢ üq! åú DÿöDxo«†ŒvÒ ÝcƒÞ¦‘Nÿ‡ŒuÑÀ˜é&ºr2ß8� )�ÖÒÒ1ré9PŽxµ%â4Ö6KƾŸœGœµƒî£\�ì:†÷Gò¦ |ÝŠG²ÇújÊY´6AœBûÃ:”Ùúiá5†t,ø-Aw"¾§…í¶ó‰Ã8ÿÌÑàŒ ¼Ùêi€Ñ°®Š¯�F]�ÒE祀ñ1gD—,=g@î~¶™:ðÁZ¾ï÷MDá]C:ªp"¬càqæÖà‹pÖ c«¦Èëþ@æžXDù§Œ[D8 {#ü„q+Ècl½~doÁ÷¤ˆ©šXô7í‚ùúÎá¿Ä÷#™}¶ëPdcA—±˜¯'�æbª§±éûæ³é»çaþ]5•‹¯ž8|†\XÎx>ñ´&¸ÈüI/§6~MÔÞûž¨¼iBeŒ&È2Ÿ\1ƒMožK_“ÛŸ­"š^®”íxµ‚¨¸aBç]ÐG:s&ãž<l-á6@î1€ -�x•,»aLç_6¤#Ê'>$]òñ;tÈòÛ¦D}ç€g™¸ÆitTíd*²F‰ÒŽ/ Jï˜ÒÕ�—3µí«˜ê{+ÐØ‚nÀv%¶r ðRªø´ÂVó±]Š®üŠIØ®ƒñ1ú°GÒ9§—P%×�̶È$à˹ؼQ¦äëH®`M/'ƒ ð œñ'ð¬M$÷àçí�:œA¼…›è:p¯|+ÒŸöaý�Ó1áÛ…”Œ§ 1¶f¼³F‚^¼>aÙÖ-�IÊ-~0ã“=­MkÊ^ƒv�Äø¦�d¢‚l6žZ€Cy¿$ì«ã#оß.öwFLäÒ÷/`ÓöÎã€z" ˜0°U9™õ�ÁyGek¦É«®Ë÷|6#öÚ"k~¿œŒÈògÁ¹k€_–p 8Æ Æ¯s¤'0>þ[<ûôÁ‡”¶{>ö'aÿOÉW¼ÂHðËP®þýðõ€/á Ä׿¸aàç�MüV 2:œõFøéIÌ¡_gR÷!þ؈9ðÌ×½¢‡°H7ò ;¾¦óŽ,�÷d“f2èw¢öîwtæþyTXÞX:ñ— ´Qà_¥‚’FÒ¾hl�^¢3ͧê§cþ„¾Kç_BÅ·è0aõ_„ù;Ag[HÖ½\N•<0¡â›¦�]d«&QE'tåõO–É*¯ÑÉÛgP�9£ 7dóÎIjÔ�uÀVÞ_AV·GÔ¶O_1†÷œœ‹�ΛÈäXBå[Âd\ÈÄ5LlO#¹Å.ûÌoYémCY}×·À«Y÷¨ÁäV/màëðu°“7�¸¬kŒ¥B Æáu€æ°èÀÀ€…)ŸŒlX…’¯¦�Ä>F¤sÁ^P�Å�˜Kæ�Y¤]À•ާœ‚Àß™°²‰°¦aàÓ›cÖ�gнd[½´ÀÇÊx"yGú|d2Äáa½°Îaƒ &ħnWñõˆ!à¯Á¾B¤Ëèä–¯±�¸›sÀÖ?z8È&~<ĉé袉Dñi]rÏ‹Mì‘Ñòv[=ÖŠÌ)ví=�´CÄÞO 8ã—;ì�xtXîàç›â�r�i£ùÈ¢¯€¯ðñõ38dçy¿ÌÑØWãW=¸2ö—ûÄgC¯Cøô-øU|}p,x6ð- 1™Ê¤¶ÎFÜy>æÍQhþàoˆ7cp>Ð5™{§g²Ž.�HT\7¦ò..¥²ûƒL'Œ$ \B€ï|€OhçÀ6ñµ3‰²«Fòª;¦Tú¡¹¤wöp°ià»f·!î·k³Kì4æ’Ȧs)ͳÈÊ+&d.â•ÈfSàöA6%PéÒé\僕lÍãUlÊáù€1@�ÈКGzk0^×È®Q…Èv•ÿhD•\2¿Æ·a`ΈÒ+Ryã‹e²ŸWZ5½øNàë€yhL�¯ƒÏˆuGkÞ3l0àé[&ÿ¸.›P«ÃÅÕMG<øk&®t2`Pz[ø`ì¯Ihùš,º`@eŸ\Dþ¨Oe[ˆyâJtìŽitÎÙ%dÍã_—Ò^¹#°Ÿõù:�wx ›yh!øß§ÃZ ¤äë°^¢_O…ãkhANlb·Ïäbʦ`¾n‡ø:²ïÀ‘±ß9¹eæËÐæ9œÉØ9�IÙñ5ö3�Í=S ÛúÈ‚Ùß%§š_m�Õ\3%3÷Ρ]ј; ,î„pë­Ip¾š€0÷G: Ö&<ç‡ù:`*à�`@†Ù ,Ì×±? É“}b1›±g>W:…Å|=óu&uçxFÌ×Á‡|xèP¤‡©üãKÉÒ †dÞ©%à[?%æj—b®]>bbL\å*sÖ…Dͽo膮5D]÷2„IƒÞžëûl=b†ÈŽÀ»Xˆ1Æ–O‘W]3¶Þùy³cš¥qes¹„´óÑÂøÞ#y€ôpxÞ´ÆÑû† �µñ#&¦q`bÂôZ 6]?�­j_ÁÔv­‚÷£<⇀ ¥œÐý2G#Î6�É9´ô*Uß¶’¨D;ûö¹?cÓv͑״}'oy¿Z¶ó§5²Š{F`"³Ä=sñ5:¼wÂp�MÀ6lÞQ]ªôš1U{oUyã[Ðø=‘M¥‹N N´˜MªÕ]ÀÔ=Z͵<±„±!K/bùLß;b4tÚ~ôÙ3‡Ê>·˜ŽmÕ!¼’†ZB|Tîªú•‹kÔ�y›~ Ò-b å7Dnª ±Úq48Þ�}B?øüGº‹Cºô"øçAþè‚SzØo�5ð(�{xÝнVVwÕ„N­Õa*§±YˆGdìš§@ºs&°ÿ _«0ÿcüKÆÒˆ‹6·Ü¢Àì ¬G° âžÜ6d§‘¬a=˜=Çé€Û»…áõ„}è1Sèä=³èÌ# ”ú Ý�#ÆŒáÙãÙ Ä‘?Àq#Àø'èdÿ`Íb] ºì?`ÄËÛ€ßþü_�c‰US©âSútι¥Øá=ð<ØIÎ'u¤Â­—mÚ˜·'�f’‹¦R­O6aû\=~“%/±°à$X¦ žƒÞƒò 8…õv0¯"©n¼›Â/o,‰øã1b¬lÞYC>qÏ\a:|¤ˆ�Ï3¡e&Īج] Èò[&dõío©‚cKÙˆŠ¯àZ.áÐŒã äåmÆDå=S2çøB*±v*ø«pŒp7Âë3Å'¡õ�t&øfA»"{‡cnÒïLSÇ¢áå q[À»€‡xˆa �B»xjC®ø‰€óS^iðÿ~G|Xæ¬mníÔÏl >O Â7iá>ÀŠóÀyÖhí’hÍȶƒ? rG)â«tÈŽ'jïÏù¥Œ„cà¿D˜Šª¼ÿ›yj øÀhÌȪÛßÊ›ºWÈ«îšZ7v}8 |—ooY·Abaf.‘!®nMØö£í½´ù„jÐ »ÚbÎK,7±X>á^¼/ZÏà—t ľˆ�ƒlb^í�8Œr >,ø=Ò7àGaBrÁw3“ÍÚ‰0jë\.ñ'ˆ•{*}]|JÓ>¹aÄe±|C| ðZc\"z–`¤³½�ü"¹ä½’‡cÿØÖœÃ ©ÒóRì·÷UæVР§’wÍ[~gÀÍdpÖh¹ƒ·䆀~†¸*ë‹äÉÒc«ØÆ‡Èðò àKÙ"sè'Søkb™?dxö8À÷|@ì˜.¦`²m\Õ ÛÈœI Ë8¯¨¡²q„í6-�Eâ@Îa)GßþØ¿[7¸#øva�ÿã߼³°Üy¥=Âä�֓׿^NÖ÷¬ .êa@òbǫհN逨a‚õËa=T8ìØVÊ=p äð§FX{ÒÇÀ-LˆÆ‡Ë™ôÖ9àd€ .ææ’-›,$ˆ÷÷žñàÃÀýŸÌá -YW�õëHÉêo6JV~¿^²q3%_«µ+âa¡åã© ¤oƒ³Ç@ ú ó�ù+²™à/´f\4€¿a_ ðrÄ#ؘÊ)`3“ƒÝÎËÆ"þŽÆ…*8¥+ozºJ¶ïý´¦¤穹þ»Uó æ’²ék’–öhœÿgæƒØí&3R²i#!¡]"*‚ ƃ¾ÆþI—à�0ß8®a¿MÿtòÖ†±b=�ýA:�ñŠB8b=„±EáI)[qñ;¬s‚¯adºð´>UzÁp&ØÙA¤ÈÒ“úØg™;ÇQªt Ž z˜.<¦G7?1“# zb(ФËSëg±�÷×óÍÖÜŽædSÏZyÕ2¡e:¬:}Ïyå%„ýÎ’·M©ªG?†|‹�[l$[X/ *¦i*•wv)ø¡ø´�óø¤ªˆ΄5¤ˆ+E|4kàZEdö$à‡6Þ #(g4NýI[WM‚uÓÀxbÂÈΓw¾¥Ë®›ÒwbŸAÆžy G0ç +™À%íŸKÕ¿XMïxcF4|\~i6~÷×Ldõd²¥g-Ñбs^d3€/A~ú@Üé‹‘8/"´`ðrðWþKÓü>4Î)x p~È`ˆ}2I;f’E·¤tÔŽ)rÏä!dPÁhÂ?o$ȧ窱n�¹dŪu’ ë,%æ´އî$ë.#j .>,kÙgŸþ˜Oäׇœ/�QÒ% ?�¸4¼;WgUxYÊ!Û†}ï¡Ùcqür9bÊ&¯”×µ}Oo±�lyµŽÊ;ºdFÎlÕ`¼µ9Ï�Áœ³÷ÞÍ Y5•ËÛ·„)8©Ïù§Žßš5ZOäž ¬ÉG–Oæ! p£sððµYÉy µÕC‹ ÊÇA¾ä\$6Í]òŠõZ7lÙyS¦ð’±"¶^æüï,äœ!�Â%×ÎD8d±¬ü”.µ§ÛœÙѵæ—²óÔº¶òÎ2¾õžSw5]zÞtÕúØŒÎÜ3|—8$${,ä�þ 1;*±Y‡JÙ7‹*:§OÔ>ú�izmƶ<3'Z?¬“ïè\N§´Ì‚á5@æÒ_î–0ˆL=:G^÷ø;²ªó;ñ2ÐS|ZÃl.gß>> ¶ïÈ–1y{1g ¹Œý 1<€lÎíAú抬¾þSs]gYw9Ì/øžÉÂËú»a£j§°IûæÈ«Ÿ|K\Ñ¥RŽÎ!sÎ,Â:*óð|*ÿœ•±{`:ŒÍ!xÉäªÐåw¾£«,ÎC†•ŽÞñzà=x}–‡¼=$Lé9¶®}=Õú|#è¡¿·›!³O/$C«'�ù£å¾™Ã!amï­eIÙö³Dr „B8­—™ ×´¾Áñ"s3B×�n\ȧY¢HÚ1㿌Q�¯AV#[^sw“wÉç3@ÌéW!ÖËÄTM¦w€ù‘—_–RE'õ¸Ô}ó¸Ð2ìƒä)Ëgð)�³ù¬£K!§C‰iê¦bß;ø�SGa{déWÀDZ# }ZÓ#pŒ'$u4øÁÁ·ÂW¶­aËo~¯äìÈ~‡A~Ç�|òöÙà³g|"†(ãЙ£Á@‡&�¢svͧv·ofε9(NÝq§Ó�Ì߸n“ÄŠ“à\¶†Û«ù¦ö-ÌŽ‡fòÚK& S¨æ®udñu#&®i:ŽÞ|îÅ“#€ÿÇcÑœ"N5â¢òrÄMçötòÏWÈêoCæî™G%6NWÆ'¶O%ürG’ÁÅc©ô³ ˜”“ ÐZƒyTVó<ðyq UÓÁfbLþÙÒFTée°aàÏ㈫×.<•É?¡§ë¬ Ú×`~Rßµb&TþY]*õÀ¢ðØ"¢²Ý”J?µ€ŽªŸú[^vÝ�j|µò~¶X‘°•Ê<ƒšé,ä5ÀýsŽ.a+î-g:בùWô`@vpLÈ qjˆ¥G_ØCÄ‘Ø}í„Ý©‹^ü‰6«]oWÀZ sÏ/¡Bj'P~ Àk_Âq`¿ì‘XÇÔL•W_2!ž®y7CxÐlõ&‰¹Œ—X±È¾#;Ïm‹¢;‚p:å0ô;ï›…óŠÙ„Â)`»pìrË çÙE&ëÈB6ãØB>¶iÄ„ÿ¦a F ñ4—�+:ð�"ÙGŸ„Ø×ï5ˆ (Bºø„¬ò¶1·S‡ðL,÷H‚dd •t`6“}hp:¡q•²iàgesÑ;ùxyû“eç¤`³ù¤ÖÙ€ýÿ*æ´éÍs¨ê[˸škÙÚ«Éí�pü ü+ Cåõ/–3»º,É=káþà‹„µBÕ=^Áîï¤ ¯1ð!YD¸m“½{>ðnÈÝ…¼Cºà´•}h�´çkÈ`sÇÐŰügŸYÂDÖM¹}ÜŒjê^GgîžËD×L¡÷̤âк )KDŽ_ äÂ�a%㬴!fÆ [8ŠÝÞ¹‘AX|OrÆYòa÷�|ÒÈÎvÛ'òÖ&펰øãA&”¹jØ^4‘Î=¾û)�¾`’öÍf¢ •9ÀS³#ž�st!—1ëèb:kÿ|œñˆ£l Ò†8Ä÷ 6> ÈUàêtp^9â�8ç6}ŒÓ<ð)‘žþpŽ ²‡Àk@o`œ>‘•“y„_ÁWËÇOå2v/€ü^ªäŒ!ÆÌ «ÛÛ̘ý�„¬éÅ2œ£°-a(äBŽ ö;VÝÿ|&Lb“ÖíÀ‰a}¥ì™‹sþ@ïŸE2…¹ä®Ä”OÁka^ð‰Sydzñ ÊwŠÛ>ƒ*8´DÞØöƒ¼ê¶1™¶w6Z2r"è ¢±t úwùUÿ‰«š9œ\üö¸o¤;AF D”_�ÊKÏëa¿IJë,È?2È “ydUuù[>}ÏœÓyà�»k'uÿlbû›ÕLóûÍLÒ‘¹8¿}0.Km��8ƒ›T¯÷Ç:ñ ´¥€_ðÚ€8*pJàÝáeàƒsú ¾¬‹ô]=âžó£œÃ°Ý‡9&=‚âÜÖ¨º)£îCø'Ã1PŸ”aV¶Û4�'YÙ8kÈÝ–ŽmÑaroî`"§`Ûì? ÇãyMŒÃ¶…á�=}¥Ì—HÀþ^|à­àKMÝ7ó�ì£ !ï Ö3è>ˆMã•×?X~üN1èÙ2÷Ï£s‘üž3„kèœ#‹PÛ|àl�F–ýhD6=]-oyº |¡TâŽétÂvȳ_�¼ú®)“}Aû¥ÑÚ€|=àÛçfí�±by݃o‰ê¦ @¶a¿ä‹ >1©{q¾,Ä Î > ÈÇ!K®’­o6ÈjÚMÿìQ„½+ΕŸ"Ä®a½3©æ±5“YÿÌÑ\XÑDð¡50Ç�" ð¾û.€˜ÆàÂ\úÎùØöcþQ5ÿÝ=aí–„?8GÝ5v0䢀Mfã¦Ì©·÷Òß’µ�—&øŒåÛ¢Ë�CûË!—Æ+n([?•Ê¿¤O–Ý5†µ · ÐB¼^ÃéXÀÅ�› ¸ÇË"rÇÓQ“ /…Î;¯§ƒ’I`Sñ3CRÖé%dñ=c¢ò>ösH·‚\Cž¨MBÝט—þ�©Æ¾O6íØBˆ)*ý;f±é;çqÇÓEWŒ0fZ8pžÜ‘…�_ÙK¬bk§�¼Ðùç ÈŠ«¦Ø‰ä�ë<6ëð"¤ŒÉúG+ˆš[ß’E§ôq Æ;kûl섘ÄÁgœT?ã'dψú»?�åç¤8nå•<œÉq~6÷ÐRð§Qç ˆŠÆ`û‰Š+Fdùcªè¨.èe¢éilë� LkA6{Ï|Œi‘͆œO&ãÀ|lû›{ÖËš:—Q)Í3àZðÊj»¿ƒ˜™wEø‹¼ªÍ”i~º…l~³ž¨éøË}îñ%dÙ5#¢æÞ·Èf�†8*âdžàóf“vÎý6‡K?¼�.8¾û@ž­¢wwXÕ÷¾!ÓšgBÞÄc·mÚØÞ!ŽM4¾ZI4¼YNÜ–Â8‚~„Vªàš\2– ¯™H'ïþšlx¾’mêÚLÔ´}‹ý�°¯ 8Ä<ƒ¿ ~‡Ä)—„Áx¯Jìž™\ôöé�CqwdÛ—àœdÐÁ9GŽ8£‹1Gü:aïL*ëè|y)º/`ÖЊñò€‚QDdíD2n×tyñùî/ëɽï·Xïþe�ìè¿·µ!.}ÞJû@“;¿l”·|YM4\CïmÍ�îræ/>öá~ìÜF�èᨦ7ëèòßÚ¤ÔÎVx†¿Î]EcFf@2‰>9gtéúÎUŠ�� »Ö{ìÖÆ{r»†;VlÅõe ƒ|@îXET5cà•DÍÃïÀ?Ãæž3€¼ ¢öáwH–�1çDØžny¹‰j}»‘j|¿†ª{¾â&ð!«ï}‡õ\c÷2²©g�¬¡ëyùì—¦sO.ýI4¿Xº…ªí^ŽxÅj¶åñ�3.}ßìKÅù¢çƒƒŸtòžÙdÁé¥dé-#yÓË•Dc×J²¹k=ÛÚeÎ4wl"ºWÊëž|Ïþxvyõƒo@N@®‰†Ë!w„ÜùÖŒÚ×mÅé`¨C/åÖ�ï~�U=ûFÞúÛZêÌöúK?új�'w¦Û™:òŒbö¡º–?ØnCè’±ºÐ÷žÉÙ£�¶ô‘W‘[�È¿¡+/ï0±jýiyìÍŸiwç�=´,Ãïj—“Ío7ÈZž­®Äf�«ŸN•^7åªï¯fŽLJ˪îéJYñ5]Â'mðn²®{™Íá6:’M¿¬%ó®ê²IGç±g—Þ¦ª/Ã1­´“‹Àc§chàƒtÁu#°¡‡”Þ6aÓO-†üEãc ¶ñÍðAQ)‡ç þ4‘Œm™JÆïœ.O:6Ó¢ò±žÅáÞ5²3ÿ–~ååWÿiG^þÕIvë·Zßëµ'ŸýÁ¼y™J=ýEÞëC_yïc§¸w'ž»ßÅœ{çDžúÈ’g>pܹ'ŠÓ�[Îíè¶´Ýñ˜`kŸ¯e3O/®h_=“�Ì�dë—<Ú&¡y6S±ãóRÀfHÞ~€8ØGjÏ sjïKúèsš>ú”¡Ï¼ØÊž~ìÌœîÄî~A-×5O¾•5½ZNïyaEzNQhå‡>šËþ²…ÚûÙ’8øÑ’>ø‚$½¶¦OËA樼uA.AÆÈ¯Ö2MÏÌ ^Ë´¾ÙÜ¢ØÙN(öÞg¨¦öµDC×rÐ}t#Òµ]Ë f!o|¹LÞüv¥õ®O«É�ï7�{_o–ø¸‰Ø÷y3qà³9uòƒ‚>óé�74qî3O_|ëÂ{µ•Ý�Þñàs‚9öDÁïÞJÊ‘‡^Y��ÙúÈ/›eGÙ"?õI_úì,»ú[ù¹_æÎ³î΃Û‹7mOߨÆ|  vvo¦ZÞn€g£ /‚-Àvá#âügž9ú†§>¬¥‘.غû¦-]û|•ÕVOMKû-¹wÖpˆ…Ú\¾¢8{Ï›=ôƆ9úNÁí{Áò­Ï~ç’iì6c[Þl¡›ß˜Ñ'Ra¥ãé´CsÉâ›FàÿA÷”~aSÑ:Ï¿)e·¿0c_n Þ¬²nýy…¬êƒ©Õö_¿·jý÷2‹«½r«®^wÙÛÿ æ><Êf>¼J“·ÿìEtÿB½ÿœ@¾ÿ5Žÿt3×áíáb·ç{˹��sØ7/3=Orm_Ý-vy~¾šü �#GþøËVæÒ7îæ“0Å…_öàS^q ÝÖîØ]Ï­.…Ø�¸éÃ~¨�·ü¼FVóìf÷+kűvzß;9QñÐüà3fZžnAzÈB±ã¡ÌnÿG›½À7ÉÆkh�…¦žuä�§VÜÑ.[öü#7þ|‡§ìà¿6ÉOü,#OP0WŸû0—^»QgÞ)Èïiæì {úòs7êÒGòêgêöêÖ;oêÚO®Ä•9?þj#»ð3C\ùbGÝ}íÍ?¿“Æ¿¸•Î>¸A�}iG|+#[?m�×=ÿ^Þôe5¬êpIÁqǺìèÃ4Õúl£¼¹gÓòÌ\qâ¾3È·âô]wæÀSŠÜÿÚ’Üݳ™9ðœäŽtÚ1gžÛ{1“ü¼™Þ÷\N}a-?ñš οW�—~q¤o¼ñ¦ïöøQ·^{Q÷_úSz|‰s9êØk lqîK~)“Ÿx/cw3äå.êÉÓæUW²Í‡[…ܧŽYw¯·U{¯ÑñS õ¤'Œúñ�#±ë˲ÙÐð²‰ÀË ¦‰u9Â¥`À_eUðp±Õîÿ¬bŽöðüÕ{AN'ÏñU�ÖR¹'Yïûm�|ÿ¯e~¢ä§>’Ö­ÿX!+gd]óë7lݧ Š–§r»CmnŠ«×Cmî\�Ûzëj‚í¥Ûáܹv~˶¾°ÄXeÇ»uÀÓHdçèí6 LhÄEì˜*«l7–ûÝB~óW{òÝO1Ü—[ÙܧÛÙÌ——ôï¯Ó™/ô/ïS©�ï¹�wrÝžµ{u7–&ßË®,¼›RîÒ³¯”øøÏXî}W®óË#¶onsoŸfó/º2ÉG=Ah<½©?9Ñ>9ÊZ~[)oü¸œ?ßém{ån´âäS7æâ[gòÈ'‚:ýšãnu†Ø>½™ÃÝéŽ`~ìödo>óã¯?åo·EÙ¶]Naouðy³×ys—:}é =Nä�¯¶rçŸ y¼ïÉ_¾íÃ]yàƒtž�eÓëo¬3�̶ªh×·:ðÖX�îµ$®¿wfŸ?IV¼¾›§xߖǾîLcÞw§qo:³Èg/íoÿ¯�õíÿ±•ßþÝIvÿgWòåçæSG:ÿ¥-ßéõñrîKWyÿ¥/yá�‚ÚóÎ\^pM—Ì»¸”(ydDìþ¼ÚسN6î*ÎßõV½ïÈì°Qi³·9ØfG�xÎѧ^*äg^Óô…§Nìå/îüãmÜ©g®ìÉöòƒ¿m–ÿhE!ûK_xæÄÝ¿Á>z«èz�f÷úz‘Û˃5žÏv׸¼:RéøþB9ûña:÷ô~2{§=„¼øÞ–¾õ̇î~kûæZ‘ûóeîÏ÷U{w7V<©© |TYêÛYWáþ¬µÔæã¥<êÓÛDYûïVÇÿµü?œ_þ6¦y:Qÿr¹ó£½ãƒè6°]²Ø³Ó-ê?QW>¹Ø¾¸–gÿüR±Ý£+™Ž=gÊz.–1m]á²ë¿Ùm9Ò»Â:éìL+‡ðþ›Íl$$é¤ÁFï�Á}loßs±ÔóùþÚ€ÎíÛ]Ÿ¯±yr3콿›`wvZ²GÑ8ýx+Ðöñ¥ ÅÅû~ôî. ~ÿSô ý¢3Þãyk9’¹òê[I¥·3Ë@ß*±ùt¹€ÿr5ÏþíñâˆÇÅX&[oÇ–ºS²ýVB©ww}�äÖñõÑ×çûÊùr¹ÝY¯.”RC­Žõn"Z['«yý-•xj¹ãçõ¶§ÛýùS=®òæÿY-ϽµÄª¨m‰ì쯔âY[†SÏÙJ—§ªlÞµ2O;â¹WOÒ¶¾¹Q¿jË¢nöxÊ®|±±>ù/ Ù™7uã™uÿY€¬ýWêõãX˜‡W§JÙ‡w",�þc�yÓC‹–�¦[ÿ{Ù–K½­ºþåæù´¹¢á^|yõý„ʬö´ê„öÜÿîú§×GÊùŸïp?=Ëa¾<Ïb}–åðæx‰_g}•Û³]¥vïOZ?ü·‹Å�­¢öülÎ}†ìüÇuLúñ…tÞuÀ®Të›�Øæ~Ê3{þÛýTnÓüXÆ×=7£«ïÿ@”Ý0"v~^Ç]xæisÿN<ç~4sê­�¬å+eE7—Ês¯.¶*¾µT~ú“œt'Áåå™jç×g«=w²Ù—íÉ6ŸîvÖÔ$=Ê®M|”]S×W‘ü(»�z3•|üÜßîÃ�⸎üúÔ'ie…ñeÍm1Å­íQ…{ïG¡÷-I½—Qšu+£$ë~Zið“ò²­o�Ñoß&’·?xQg?Úñg:<ø ÞüÕ‡AÜ™WúP7Iïé¶d?wfXê ¥y•êÙ½«Ê·{G�w÷ÎZÏî}u|Ïà òæOîV·ÿ——µÿÛUþà?næ×z-6Ÿï]kÞøZj±ãó7ì�g�[ßÞ,uxs¾”zú6‚ºùjuû…ÂÏ®\S—µëå&öH»‚¹qÏ×¶ãÇ ×ç*^œ*q{~¤& «q{xgqEòÃÌ’È'¹E9’‹šïÅxYtéQHþ�ΠÜëmaWî‡ÜnÉ{ð0$ïú÷½¡·oG»UÔ|'®$çNz…wGc¹Í‡‹yìÇöLû×§Šå�ÿÇÇúT¯qäÿXS~µ¦Ž¿cÙ=[™�Ÿ-¨ú_Öp;_‘Ôá_IæNO ÿ®+‡yõ4™~õ2‘ÿð(Ÿûr/Ÿüø6žùéE†âÃíÛwŠ©§¯"­ÏþÓZ~楜½Üî¡èº•Êh˳ýp­8¾=·.ëIZƒwˇWgKùw×Óßœ-wy}°Òùõ¾²Ð§EåyKµE_Zp¥#$ÿbgHþUôóÒãÐüK�BóÏ´EEë®áA\éö»q¥u÷âK“d•+¾\Î5¿ÓËXÜžo½³wsø#Ëû°•?üÚž»Úík{ûf‚mÇõl»7‹Øk�>²Ö�«äMïWq­]2îÄsGþjg wÙä ?Ûóí�’²îg6Ä<,n°{v½˜¹ôÌ]¾çŸfÖ5OŒe;^K�zÇ2]�ñ�uõÏöÕÚ¾»Žtá¥2Û÷7‹¸_žä9¼9ZÖUZSý(¶¢üQB�÷Ó–:þí<ºçqœkÏÁª„®ìêÄ'™•�b‹÷¶EÂçàƒÈ¢“hž.Ü�(>3¦âÌÍèÒƒ·£‹+î$–¸½ØUÂ~~šÅ¼èJV©/sën-V¼½škÿæL1ÿ¶3�Ù™Íw?Ë`Nüî@ìýÏFæìïŽö]wJ|»Z¼º[«�_,ßúî\‰ÃÛ3eÌçiò·ÿ¥Þ½‰gmËqîÙ_jÿþD±å‹^wËîOÎäˇáÎ=‡+âží´y|)ÅübïÆ--¿J·džš¾%´v´yTíØ-u]z–÷þÅï^E¹¿ÚY‘ß™PQù0¾Ôéõ¾bËôúo~Õk³ém/·ñC/¿ñ}/cö¡—Úü©×Þò—^_Ë÷п¶%Ñ¿µ%Éþ9zóÓ^nSI×\‹#½ëˆkÿvànv‡Ù>lKw{z¨&êaI}ɽԚæ»ña� ü›YÌ“ÎXúñ‹pöñƒ8þ]G®oGSmL[QM؃Šê½WJO\‹) yR‰tö٠Ň{…öo®”9½>ZØ]Û�ù8£!¶½°ÆãyK9õÏ×)dOOó¦éÎ{…NoŽ•{>o­ 쮨(_‘ü8³šùÒ�A¼þ)‚èù5ÜêQ¯ý–ë½[6þdº)¿bâÆÜ]S6Üì]aõê·mìïrRïg–7ÞŒ/Fv¯xïõøâä;YEž]MEN={Ѝé'oè‹_‘w¦;{¢]_¬J|˜Ssèjlñ…[‘EG¯Æ•¸‡¾W|úZLñö‰eޝ��}½ìkÆýÌŠÓ7¢‹/ߌ,hE:ëöƒÐ¼O]A9ŸÑç:Òu‰�3Ëeÿú³ái¯•åo½ίö•îèˆ.¿Þœª#¼øhGxInWrûÛÝlö·Y`í>]-¶þð�À�g{—o‰Ì±ÎÅ[sµ­¿Æ÷ÖœÄd¥™Äð›$F¦+%úF+$º†ßK-—è™K–É£ú­‰85jMËÿÎ_û¸w-ñó‹˜è;EÛ/¤–îý1±¤ðJFiÅ¥ôÒÆ+‰Åù—³ÊRvðêl©`Þ½M·y}¿ÐåùÁ „‹ªòï¤W7\K®Ø~+¾t e÷’*çYwþÇÝæó¥‚í÷cK/ ýv¦3¤àÀ³�ü/B éw¤mÞõEjR4~cö ³]?ën8ú©ÙñÞoÌÊÏYnå*™¥³T2sâ×�ñ³Ð;Œ“ “ ‘ • ’ FŸè_$c%:šã$³ÆèH–[J~°-Ð\|v芪OS×võ®³ø¹w›Õ。6Îå±ï^g2�ŸØ®7ÉÜ›Y®/÷•§´eWV]K.i¼œX¼ûjB1Ò‹%ÍW’JOÞŒ.þñVd᎛ñ%HŸ½Sü㕘Â+·¢ îÆ—–ÜO®ìîÌî}í�ÿóóÐÚßßûeyôÔnùg¯û꫽ÒU‰?Žùž í§÷Í*ÉÜ9:’E‹çIÖØùhlHÚ9Þ,¡yì×0ÍÙÓu$#%Ã%%$Ú-ü¿6z/Mô?‰†êßZ¨e(zëÁèªþè_š¸m(úÚ°ù]}Vò-‘©±ú@ïBæýõ„âóYÅg3KŠ/§—]N/)»‘RRq%µtû•¤’—K]Š/9w9¶øØåØ¢“㊢µyàflñ‘ë1%×îD¦=Ȫ¢éIg~z’.ÿýK\ÐÓ²ò‹ÝÈ? Ê/ëŠ)[ÿºwË÷6n’y“æ!9�žžmz* ü07CО´ŸDýüýÏÿià·�+a†Iô…~—ô׎þ5N2qÔ"É©ƒdurÛx«�Èn|ê�F:Ê‘{ß�åþtwEë¥Ä’+—c ›¯%”´Þˆ/A:¦ðüõ¨‚Äû9voOå'ÝÍ­Ù%±Š:g¯½Â>{}?Ž‘È�ÐÿëÎQõ�+ÿküqÍLÆÍB3f …éhmáÝ î¯•^ô·²6ÝìÞ¶ã\eË¡ %­§/´œºXÔvêj~ÇÑkù­g/¶~u®¨õüÅÂæí×*š GëÚ¶�T´ÖÞÞÒ²{×]·s›ö�ä7v�”´ˆ~Vnò8¯\á^vÐØ9r³ê¢…+ÐdÕ ÄµÈ»øÏ6§J®¿±Søø¿ŸÃ˜%jâŸ�#solª�Ïá{ãñ?ìUõÐdd 1™›º!›U1hEH¿ªÇ#¥õã·¹!o>¯¾ZØX{½²%öùîf¨‡÷µ@^u%νš+ðÇÍ÷›[£_7Á÷‡o4ÞÆ9û£ûõc¹nF]׃Âö°wÇšp~!sN¯gi6ùÿóÚ«ãÇ?žëŸßƒóUûãgcç­I®Œ6¾BÚøß2{Ç<ê˜Rûã\µÈü3™¸ÍsˆAŽjxìWÚJÞ(3"žV—|g µéÊVb‡ �ûšï_,ÚqãrAëC<†�®ìxúUQÏÓù;îßÊm=¥ Ûg˩˅-;®–µø~TÊ—¬“£IzFdnýW~ázüyžÿÕç¤õǘjâãÉùOÀÿpL4´CÓçHÐ\§4´LÖ¥²f·ÒÒÿGedÄã[ºÏT´<[ÚzöBQû•K…;n]*깞ßýååÂöã— š{/—6åÞnl†GÑhm3ŽïM­wŠ›Â_Üî3¢ô�?géÿø<Ƽ¡yÏjÿ0¦*üLÿTÿ3P™Œ&©Y¢ *&xœŒ°O2Ç1~2Ò˜…&¨ÏDújÖÈ@kšlâ…æ­+@Žë/h8_R.âÞ^ÊÃyKŽš n׵ʾ©úp¶6öéÎ&ìcšOc_Ù‹ÃøÈÉwaßzùzNÓ³§é�ûqÍ™ñ¬±ÅÿWe„Gÿ7³WùÈÑd5ýÿËØ ÿÃWÂׯ ˜§zØ+Á9™ŽŸ…&ë/CSŒ‘™ÑJd:É™.GÆz‹‘ñ¸EÈPg!2„ϵ— ]ü{&ÎhæÒpd´GÍmXi#x¥ŒŽ|r°&îî®:ÈÍŽœ)mÞ�cß‹¯Šž]*ÝùõµÂ¾·×Jv}w«pçû;oïçõ>»“³cd$¯ ê.—ÛÊÔþßøÇ?ý œä)0^¦VÈ@Ý5�"D~?Uͱ/™†&©Û £q �‘–-2Ö]Š&[¸¡é68÷óÈGK¹•å|Ÿêªê7þ?)Ãø7òÚÏU6öEyǵ‹…í·.´ßþªpÇí›yí×.ç·õUAû‘kÍ—°?=w-¯¾ßr£´Éõ¥ÒyÞ"çÿñ¹üé7ÁGhÏ>î�ÏÇ?¢õÇçñ8šjÌ@Sð8™Ù! ;df±™ÏrG–ÖBdf-Ff3…ÈÔÜMšî�,æ°ÈÖ·­Ê}®çtE¹HöÍ™¼†3µÍ$oùjkóÉËM87ki»^Ò„óÌV¨=]Âù ÎÅnÜÈm~ðU~óWWóšñ96ùý¢ uˆÙ¦j½ÌÇÖ‰ÿôy�ŸO<ƒ:ù|ÌŽÍAm’�L@“T'#3mdf°™O^‹fÙÊÑœ•ñh†]$~Ä óyRd>ƒF“gShò4šdꎦLñ"?[$jE«óè¹£ô x§Œ{r¤<ñv_ÍŽ/ªšo~YÒñèBñŽë—Švàß~ájnÓ77óÚ>Œæ´½¿ŸÕþáAN×ý›y; 'õùM)·^ø?3xÿHŽ6á�ìq,æÁÜû™þ©2Ñ4Cæ:³�™î§)Ø�ñ÷õpÄÖû™ª2Õ²Áþ��Î"ì7í�¹ÉZ4m…¬—Å Ùk3ÐL�B4˵M[—‰,Ý7£©îYÈFÔˆíTu¨x1Áé”r®à½r=ÿú«¼�×{jŠ/6Öqbk×Ý/K{^(¸x± j†m·*Ú7=él¿Œë„G·²É:¤ôûsåN‡”³ÌÌýÓ±\�äZ�#â襎c™ŽöýÖÈT}öóÓ°EN"¶i„ÿ«šàó›Ž&ëX##�éØ7âÇÄyÈÄûkde‚¬F¢éKbÑÌ5ùhf@#šîS�l#ªÚ—=ÐY{P9Ãõ±Ò çÁqò¯Ï”&ÜëßVw¾¦ùà™’¦Ñó…-�ð¹Ý¼˜ßpúfNã7w3ë~x�ÕùþYVÏ­{9]Ý7‹{“j+Íø¿ŽÙXü_ÿéKÆra-*#o•1ÜwïJ£ž¨�{8ØþíÑÆ¸'{ÚûÎoiï¾°µ=þéÐŽ�ï®7¹î¤rÎêž1slzk´rûk‡‚[ºé'ǯ©¼mà|\9×í�Ò9ðe²ðeÿÓÕ²�wŸoK~ÒÙõÔä�kž„ÚõrAË—×rGnf7<½‘Óüa4¿ûþ�¼ê§§9®ù7ŒÀG€ÿglSë�Xö ™±é8sda°͘ï‹l=“� �‰æDÖ£9ÇÕm+®h.­¼¡µ¬äÊøEé§ÔåžÕX^vK{yÕ3Ýå�t—ç^¿"ãâ8Ç’Q=—“J[—ÊÕëö+­�jŸ™¸+çx>Pzú>RJü^*¥~O•¼ø£2=í^[#ä,p^{p¾MÀ‘·¿ = ù¾§<}ì'‰ äà”u|šŠõœ5ÿ�]ª’1¿>ÉçÓ��É4wdj#Ds\’ÐBª - ÊÑ"iZ³W;ö¾þê!¥åº³x|î(—»ÜQ:€ÿ[UýÐ`Eô Ú"i²S4«8ÄíÕXS0¢¿¶â¹‘sÛÏn'•Kq~âåûe°è·�©ÜOW‹}ß(y¯ê›–~ÍOm„Û¯ÚÐG~ò7ߤH¿üe=}ð÷ÉÀ¿8sÃÿ(=ñkwúÇþØ[¹âä½hÙ¥çɰß)àª2ÐIV­f¬ößÇ=X�™f8~:Îõ—¢©V"4}~0²¶�E³=2‘­¨-ðÚ„®‰Fóíh4g�;²±ñ@ VðhU­²2åä8‡ÍWµ]úÿu†Ç]¥«ÏCe ÿ[eõÓ¯y‘_ﯗþx­\üË/’Ëò}®ä¼ÿºÀ§çõß}J;ÿ¥PpSɈF•!’Ǹ'r¸oý¢5ìõ¹é÷_W3>dˆn(å’;¿mà¾}QR|w{×èÈæí%£µ­®Ý§Ï°ZñOØ¥*Tm8÷Àó Ÿ§‘ÎLdn¾ÍZˆ–zÆ!{ª9Ð9hUl—ºCÃ5ƒu_)çyü¦ •7J8]@ýu4+ðß~Þ(ùû½LÑïO3þ®Üàñ«Ràù£Räû«Rî÷³2œýáu‰ÿke°WÍ% ߸F-ÏÈZM¿ËJñ-exÀðï+…ù{'‹O(™Wï b^îëˆzu¨=åIOÌׇº„þˆ �Ñ`ëÏ,‘ ?¢ÙÓoeÂþ–{lêÒ™9w©Óþ«C�ÛTS{4ÛVŒóÜ-È>î¼ÆÊʯõ{•¦ØöVzý¨¤ýþª ÷ûMáó«RæòTéè|K¹Ìý�ÒÝÿïÊõ™›†oå7¶�5Ü«m”~Øö<Î)í=O(í¼n)=O•!¢×Ê$ɇ߳e¿Ü«å~úf‹ÿ ¥S@PŒªó²•ÈÇÃA%ìc¤úŸ81 ç—H³vZÈâë øüãÖÌž¿ûòÇ?у?z2Ŧ‹³M}#kÆ-X*Dæz3ÿ�µ ÿ°M5œgák‚ š¹œGvAݪ«k_�ÿsû‘Ì—Pá¯Ê8á_”‰?(#|c_ð@IÜRR~7”þÂGÊ0ÉeVà·ÊXÁ-%pFé%lzi+,9l)è{c'ý{óî»ñ÷Ê ÑKeŒßðï+„ǬD;,§‡~ôb>ÿȉÛn.¡êÎ, ºÎ®`ŽÜ”¿&“ߺšòèR5êÛ®û£Û0jÏÖ|µˆ=þ” yz®ZþæV�`DÉ.YEÿ—ç¥�ýâ5 4q¼%2ÔŸŽëèåhú<_´È?ÙÇP·ßr[wõ��êzG¹ Ï'�×9å¯Ò3¦^q}Ú~GMýÎ+=ا·³b¾ÙשøxiûáI±äÝÛÍ—•Ae³© a½º`ã&MA~©¾_Ëqk¿«Jþõ“RîÉóaùá©Þ") ÍPîý—µÔÞß¼%‰µú’Ð, ¶ááJþÈ·RÙù§qÜÙ—aÜÕg±²#i�{>¬•ìýÅ�|åJïúÞ�?õM(}ñ§Pß3J'·�{t¦ÏYKêì< qÌX°H‚¸JçܳÜî(�|¿W*T&û½Wa-â¸KÿôKýËÇb?ì¼7¬tòD+– €Ä�À£o½¤O®å'=ìËxÚÞþöx ýý‡BÁ¨’÷ÙýýBߊ –þŸ+�ç•}¯– NÏ~þ›ýÅ×,õÙ»@É¡¿ySimFâ d5ß@ ¢±jD' ô÷ z-™Îǫؽ¿(.²:hð!£øêffðÈÕRÅ™ñü±¯eüð 5ø­Õ~s¹¸jÿ ß”f]¸ßf¬®GÖþñ€±4™8M�çŠø&¢Õ‰ƹ}¦œïý�’ÁõåzX£óù äü^+yá}e°ÿÁqô‹ÈÕðö F^®b( F¬“¥VØ;›o½¹†«>aà'BöÓ§ Ç™æh5<æNA.öˆj¿h'=ÿpsú'n½´„N©š@öŸ¿ó#{¢crµ˜° MÐ’å{^¹ó½¯=Øú³K™¾×®²ýO9öîëMÒ«O“©Ýs£êÏÛŠ�üìC_þÁ~(‚½8ù÷êwPoÎö?ª\'l{½X8ðÓJÁQ¥{àÐokÓ: V¯vB‹¬¦ ¥ææHâå‰Bã“´#7çN Ï)Ÿ}b�G~rg®¼Œ–�Žæˆ?ÿ‹H|ä/>âýu—T�-É©2¤êvϦ=�=šg¾ <ô»»¸êÜlzóÀdIX®¦8,UC�¬Aú^ö¼Ÿº�tñauæ+j¹±XT}r– ÿ㊀®w‹} Ž›¸ÈòU;)Ðl›§Ì_‡f8‡ »Ðzçm÷M=+m=/(×z^Ä�£Øï÷}7Û£ø€‘gJ³v@á.“ÀíCÓ«û,…�g úØ †¾sמ�KeõM¦SÛŒ¸ÌîÉLî^K&kŸ_¥çåê�ÜW¯E"¯DB$“‡¨J!ªLQ‡¹¸íòqû¥¥â—ìè¶Ï—Iv\XNí~ëÊ}ÉÑ_~Í“}•[;§³…=–ôÐOùé{‚FF Ãn_¨ºy=_~ñÞ&ñÞ�îÐWAe7 R·èøNòØzÖlmX™Ú‚Uš¤g…ŒÆãzס6‹È9ÿòD÷§J7Ÿï”,ýÓ÷Eôû¿æ‹.(ÙÀ}Jga^‡qàz|-SKõ$õ§çÑ%½–ب3ñ¥º )èïäŽ<–Û£€uîˆgcH¯ÑŽ+ÚcœÑ0™ˆ‘þy öLq§Õ>²œª=nÃTžÃn92G:ðÌ'lð®œkqä²·M‚ ¦úÀºÿ• Óy5]wz¡d÷÷®òá¯Ùw÷ªOoUîÿWgIQ¯¹¸sduú#ôôzEð‡+Mܯ�+Å¿)3EU¦âxïýJIyS®ôNžè$Ež²õ*þ��°OÞlæo½JcNýÂIRZ ÜÖy#¡(‘�Š/l¨ªS6>b9Z9k>Z;o pqFÁ²0µðÔ<ÃÈ”<£Ð¤ü‰Š¬ÚÉt÷W«`Ÿ/òQ0uük5ü£§hÏëµ’ò~KªjØš9ðJûj%û~ñµ½\&éøÞžÞ÷¯~¢ÖÑ%ôænS*>[‹Éjœ$î{¼ŠÙ÷Á�þà!ê].ª¿0WÐÿf…ð¸ÒCxDé0ü›ƒß¾]á·WiçqIéèù^àó¥Ìó£Òßç‘ÒÏïšÒ7àœÒ7𺒜Uúúm;måŸ�¯–¨š æãí‰æMC.ööÈG€èð4M69_44�#|QhŠ:ø 6§ÏœÂ×–®Ø9�è�TôÏ–çV™² EºlFë$IïƒUTÏó5LÙ.+&¿ÃŒ)h1“`_(?{;6ôæ™2úÌ·2Iù¡â¬í†téÑ™²SÏÃåwnÁ>HŵkYÌ¡÷bqï3¦lß fSƒ¡¤úKáe¥ˆúøS.äEÞ§•«=rN¸'îÑöL;6Á#e�®÷QårÑ÷ÊtØË'º£ (4ñò BîNþøœÜ‘«Ã:äâ° I³´Ø½/øáÇBzà©“$)_[(V èIÑL’j@z÷ÄÀcJOqÍéÙ²$UQX–†$8]]HoPuvtÆóoZ‡ó:µr¢dð[g˜7\� hf€n1š¨®H­6–Õ~±Œïõ¢ûFœ$ýwײ;Ÿ{�„âà]¹xø�+]¾ÇŠÉk�Ì– Lƒ^/è�ç¶î´}ž°¯ÎäÄ?êLz²»;ôúÅ"éîwlõ— ˜­gæR»>83'_ñ⾫%ûô¤¿ñ§kÏ¡sꌩüöÉ¢œîIŠCÓõ׿2vy+ÒU=¨x_Y–š€NUõ†«HR[ Eëô�× ãŒÐ$\7-2œŠ\W¹!WÇÕÈßW@tˆ’`J£F¸8I[&J#b5h|®ÀQÄ—éƒî–<¹PŸOÊÑ…žanðžŸüøh˜ìÐsUa¡$«Û„jº²D4øÞ‰.=8X]BY¬*…mUzüe¨ìðs9½ëw¸ŽTÃÅELQ¿%�¹ÝˆÝ2<´©ïÇÿâxøg÷À#¿ºÿ´V\up†¨d¿¥8»s’$¡LÆÅøcB)‚Þ|lë&tÅñÙÔ¦*}°{ªìÐ è+¯ß¬é‹ó0�I¤ijLA¿ÝñÈ‘í|æºÙ gDô„?¥%ûÞ{@oÓ9ºŠÚõÄ™|æ ýâ4ö)LA·›¾ÝˆN¯5 77KšqœßóÁIÜ}oeàÞ÷N’£ï…Ôù× æË×rúÜÛ`îâ×QÔñ÷bÑÁß<èÓ異}u¡âJuü¹ap’ôoÑ{~ô–Ÿ~¸!èö•BÅ�‘\æì[¹ðØ¿yˆ?Wj®ÌôG¡¦3Ñ|½iø£òðc‘(z³¦xÃfÍÀ°$u*"]S¬Ø¤îäâŽÖbÿ¹v…#á±Q)UúLb¾Ž($RbŸ�¦-K-7$̨èL-.,A��KÓ­~è±Pv豌9üm UÖaAgÔŠ:2»^{‚®!“^mÀçl7eºÊO]‹ »zº0úîg ÁgFR˜]ï=¡�+:8ƒiºoÏÔ�Ë–÷YÑõç3µ‡æâ{#†> IïÓÕ’Æ3¶¢á÷Nе,ìùf¾|¯ïü¸FÔxÅVÔÿó*xÿtFéIBŽSudŽdðƒ3µë£ èfRÕ‡fSŸÍ’4][,êã(Ü÷ë:qZ»¡g@Z6g1²5ž�ìg.B«/EnnnÈÛ/¹yáØ†ócŸ@ù0ÈËC€¼|„H– &Éh0íAð/У Z‹ õÇÒaª”û*B•ðãZ/¬àúžºÑýÏœA³›J,ÐaªöÌd÷> �•‚í²ƒÖ\~ûÐÄâ÷=�H�?”óǞ˘ß ¨ÁïÝ©=?yBOÝqÏ®!_XgFWí²ï¸fÇ|ÈŸ~.>ð7OQÍ9IÍÈaß[ûÀ¾wŽâ²}Ó„á9B>IÕG®" MW§·ë‹6dk:,±G‹¦ÎF«–» Ïu~ØoŠ0"A^¶e¯�¼ûš‡´íÖZà®�èŠ$ (`áaæ7˜A¯?è¾ð•;gC)ŽS™Ü&S¦¸ËRÒýt½ÿ£/5ü½]÷…-»¹Ã”ÁЋgÓª IO^nû’ß4~µ„è V›K5ŸYL7œ^È” O§+Îïzµ–:ü]sø��Úù“+µåˆ5èeˆÉjf½ª(8S�Š©Ð n�ýsb±hꉃ35@gôéõ…ãÙÜs¶â˜ Õú`Øhþâ¼b*“\=�NªÐ§ãòµ©Øìñ É–°–ìxì@z�ë>·•ôÜt€ÞJÿ‚äÇï„óÇËgGø ×Ó‡¿ ”´ÝXÆâØ/Ùöù\èM„þ5æÂ×a¢áŸ�Źݦ┆‰’¢ ñà/Nâ¡÷.�ï`ÛtïùÉ´À$Qɰ¦!�…«�–ö‘e¢Þöt^ÿ”Àà u—Õ¾hõä¶Ê Û¥ˆi$–…©J"pm™X¨K'fi‹¢’Õ�AI4^ÂÓ4èŒFc®êÔÐô]WEZƒ‰,*c|PT¦–” W•Geh) ûg°#«@ë ´1èÜ6SºbÏ ªÿñZ¦÷¾»ç¹ô¹rÕ{m@O�îâ,Ýw_Ìz*ïyë,Úÿ£ }ò#½ü$^zæézvßk�xÏc'vË 5›ß8™ª;2Orà£7é]>ùF&9ü;®;î/§5Pi�†Tßûµ’�wëèækv’Ê#³è¼.3qùÑ’ô6#gçd¿Ðy¬ñCÀñÖ—XŒ?âØ#VD¨Í�ÒÝD£“‰Mš©Ä.±ßdÛ2ƒ_{Rý#kø´’‰\b–_ÒfI7ž^Än?µ�nÂoè{wñîo×qíæÌæ:c®ôàL`mÐYõÆlV‹)ÄI6¿ÍŒhêlÆõ`:ÎÅ‹wMcóÚ̈–dfã$:!K‹N(Ö!z;•ŸÛ��©Û ¨¨ìq 5Ï�>|Ш¯ÏÒ„>iÐÛã*�Ïå«¿XH'ëRá*â öLÅépyÝæ0_ÄÃ߻м÷¤v¿q¡?¸KzŸ­á¶œ Úî SÀ ¼t�5Ð¢ÛÆ4¬©¡WžÜà öðs {ò…œùü9'ÞýÞ™Ùöù|Ð�ƒ¸!iûjuè�?uàoIóõ¥TnŸ¬«I2ZŒèjì3ûž­�‚ê¼çýã çÚ‘bžk¡qjÔæíF°6 鹆nººŒŠ*ïãÉã:ÈùùòˆK©œÈm˜Ú”\ñÀ4|-M¸ôFc¸ÆâØœñâ Mꢰx5`vÐ�£ŽÀêM iõÐ<®î‹¥ ­zŸD㺠h�-m+Ä——‰ûŸ¬ÆóÑ‘i9¹„m¿´’îYÅï¼ç#z æny2;ï¸3{¾ó¢~À�ú:ˆ¿{/Kñüz•âÁ•迹x6ƒ;þX >—Ém™Œç®³ï­ôâÒûó癹{Òh­ý:$‰«Òez¿ua¿õ}1ª oФâØLIj«!ä¢.Àl B oCt#ËöÌ&<ƈœq|RõDÂzØÜdšòÀUÄ:ÅñkQü�ûbÐ…aB£ð÷Ë&‚&:½÷��x÷[gÐ6£ÚÚÃø‚0 ˜X\W&•ë3=æL޳¸¾`±¯`²›L¸ÌmÆLv³ U€ë£ÔmLêvCfS�_¤K'•êÑ8¸!„*‹We3ê�¡¿•xïL ¼t®¨g*aÕâ:§ýš=ðÅ€�\^`3�Æ›Z24\˜ý_ûñ'žÈdGɹýÄP#€f4¬� ¡ª}6ly�h=ÑMç—‚ö °Ah\'Ñü©á�žâ¾ç«`΀†ü™ä|]®¨Óòj×7¶ô€5pwq-50€ØŠÝ3ÀFACƒŠÏÕ ÉÁ'¨‚æ»dCš¦$&o<]8<Ïm'nË‘9Â0ä¾Öùòˆ KÕà‹wLqÐbâ t€�ú„Lb¹ž82UÃÓ—Cþl´ ¾– =š®tH²:hɰD?{·5ÑR��[†fó³øêCó‰VJå¡9TóÙ%„)²ó•§lß*ì³KÑ‘'Τ„¹Á <ö&zx¬¹£OÙåG‰ò—7·„¼¼X½r U";x�…¾|à1Hš¾X(Á5ˆdÇ {qÿwk$Õ_Îm(ïê,D«ç¯DÞ¸&M'7“Jtý€G,OP†¦¨û 塧 ClX†&hO…·_ð ê¸èF´ÓbŠu@+ ¸% ¡ÏfÔÓRÇAÜ–v[zôF Wr1èÒ�¦Õ~~søƒˆ9ò“X¸ë'G¦ô°5hØ3Õ8§løb1›Zg(‹P�\�-Ûo qêjqh¼:hûS·è�F µ©v¢8>ûÌ"6ûº´JCô&3Û'K¢Ò4üýq ”pt’ c Ûp¬`í‘-!‡Æ§À1àÒŠ&ð›+Œ@—Î 8¨ ÅÍWì›zu8†9�idíšZwÀ-"šQ©5Æ cZ’þGk�/@X°ÀSm<· ò.îÈs2tr¡®$8Z� Žã6‚Æ2Ž•’£+Ù´Vc�4N5�ž‘‰Pa#3ÇA asÛÍèÔŠ  8Â�‡Ç‘ë̳Àà ªDg£¨Ïbä(BÑ¡IÀ/ÂuŠ Ÿ_oL,ˆçÀa¥ã²µ`�LÈǨâAEž¥Élª1`¢²Æ‰¹¢SÄ�V~nƒ)W±k&®Û×�n"»ó�Ó{Û‰k8±„hÞmû̘�Àî“í½/ ýò¦ˆ3_díUmÈÆóË`ŽJÚ/ØA,ç¿|Ê_}ž}zPÃŽ+‚}Ù5&­ÇÇ &¹f¬UÑYm&P#øIÂTœVû!‡9+‘û:$ O×ËÕ¼qíêê%Ĺ4Î!¥Ñ„¿-”„¨€&7èOƒ~)hÿÓa)b:J•ݨÁgÔ3Uæ€Ý&ºùúrùþ¼|ï3†¯ùlÑ.,éœFï}åËŸ|DŸþ xHéAo9:‹Äà“eµO¦Ö§hø E¸³ÐW 8QT–¦§·�_$œ2œ°Ùu8¦çi›“ŽˆU]L«ÄöšP1�˜Ðu>ÛXjÉD6Ï¥¼sà€v‘tÛa[¢ËŒsh64QƒèUÕ[$«9h º\À¬b£4A§Žm¿âÀ×ìŸú†c|Ã<]Yò–‰Àë¾ÝuÝ‘í¿ã ¹h†nv~«9è`J=–*NÝÝ =ø�¥;®­„9 l _Kংf*“Ù`ÌÄ•éHÂ7i+ƒKm ŒM°1˜—B.T…Ú�¡IXB%½VÌÆ2}Q0ÎO°¿í_×z$–§Õ�Ö»¬hÈšðfŠÛ-€ûD˜®pþ¸n­t`u‰qŒÞ³që&½Áˆ0 º-eålˆž¬s6_Ä÷�zÈvßJ{îy°M§—‚]òø÷Ì!ž3mW²=7�¡”¾ úŸ¬ãr:ðuj0¦Œ¤ë±µçGМw?s · Mçó:Íá½y»yàùÄ"&¦T‡ÚP (�W¥"34©X¸iÞ×<®È~örä`»¹;ƒ.g¨Š0$V�N«7d¶îŸÉ¤Ö€N>èSaÿ ûQ æ�¶×{×´˜‰oJÎÑ•tßr$ú?gÞ†0'�R�/�9Æ$Vé㹡ê‹k/ÿ@� ÒÏ]%�炟ôô” //Þƒ´ZcàNŽ0™!ª wHÉ�˜U-o¢��­Ë%¦kQ!›4ˆ¦<ö‡\çåÕò®ó.üöÏ�]3‘) ƶ^u`»¯¯Ý/.·Ö„äZm—WÒ½7V‡A^Po.+é™yÕá uHw\v�í¹'¢¿õd6–ëKBcÕ ç¼lÇ é¶¡ùÀdßú0Co}I¬xêL´˜ÊöÎd£Ë´Ù˜�m¾¾‚ïþÆ�ïé#ï¿'¸#’î¼ë ú‰x./”uL•ç×M‘Ö[Êö^wá»F\±mÚ“œ ç6LÙ®é8ÖÍ%zzñúÀĤ»¯aßûrCoýaÝÖIAš)ë›Fâ~2öÓ[ö΂õ&oxª$~‹�Ú`H%VëQë35lˆŠó7´zÕ:÷„¨(`¹ƒÓóÄ t|É5Âu­PÄ":"N²ú³ö„�¶©Ú�°iñ<‡k!õc[®¬äó[¦€Ž<—R¢OÖ;‹w༫@_š�©�?ŸJôú½0GßÒ¢½?º2YÛ�A“Q Ý€cÛç�ÙT=tÒÙ-‡ç€ov"èÒs‘ñA¹ÍŠün+E~‹%Ô`t(øñ _?$á‚U@�â&èm�7è ÓIDrËÐ,ië…U\ûõÕÀeÍQ€íWœr½Ö ¥)î:¿œ;ô„’ Þò Å­ˆQ#L<.ÁC7YéÀìW™�‡nܾBvÛñùtj±hø³)ÅúÀ:†�lBžäæ°öÀï´Ígˆ' 3Æ” Og7÷O‘DnÖÆŽA—�îûΙm¹ï€mÈ j?>«Ûœh× nB4Æij› \ ¢Å]y`áaƒØùÌ“~" ÚõHÌõ}ãÎâMØY8fÎPvû`gIäá„�%ûv–dø{W¨áþV€Er¥1vV)a¶MJž°)žèÒLýg°½?ÙY²ÎGn|Ï37bÇxŽ‹Ø8U ¶-`ÍÃsdÀjØ\; òiiQï4xO\Tž‘=øòòŽûn|ï àÐQðüXU1®Bø-À ¯Ø3| ÑA¬žÏ5ž¶“vßu]]®ÿ…'h<2]OÖá˜Gtç©úÿ¤;oþïºóßzÈ�= »|._¶û¡€­90—¬ç¡d÷4:µÞ�¬+Ö[À´œ_kᢈMê uÌã¼⺼ÿ¡Æö[AÎIxÅÀÁ&¢,RU, '¹Ñæ^Ÿ¤ \$«txЦ4ÛMz­1hŸKw?ó'ì¬R|mÿdgU; çw‰z²ÂV ÐŒ•gá¸÷;‹�-Õá<ØßM‚h.\••㿪ƅÅi€Ö2«À¶¹ìµÚ�ðñp#k")e¨è êÀgMo¢{Ýrv9ÑâÎŽÓðJ(Ÿ¼º ìº)²­C6|ãÅ•hqWÍþ•l÷=äÈp/‹ÉÆ9S|‰=¦ÅMøC£ŽDg˜Ï s ï»ö�-hÖÂ~4Âï�Û¬5¶œIŠ˜|]`GɲuÆØY –잇¾°>È¥;K�„à™¤�NÜw^Ä!Y\ºöì¬ÉÀÎ"z¥²³"²Ç+rz¦JëÎØ)ІgËp<#:ü µ ·+«c a(fUÇR^Ðd Zúòlì ñ¸J£‹uˆ}×�]ÏÇñpÂØó ÆžŸÓg šÕ`ßl¶ÕôrùÖ�ÙAÝ#>!;î�º©ÿî¿ëÎÓêÎï}*ú?uç¹€î¼â$ì½x!…˜ MYÎ iÁÀ4ITº&¬IH6lÇmª5„ܬ*TE@«H€£V¼×š¯¿µò\>«w Ä?`ûÑá›5ÅL°ŠH$EØNÔ ‡ucÉÂbO+5�å·YÊÓêÆxm0ç·™Çô?q.¬/ŠqÞlàœ |%ÈÏÝ‹°³ÄœLEÂü;;k:¬AL(P€»Ç—HUˆOòˆÌñò¨,-yt†–4bÓ8>2s<øh`q>u^ãYA›%øO6!S â=á]àk˵ž³ÆѧßTiy« çúØÌ“5�²—n;h+­:0�0ÛJ;¦1»îzÀÞX+-n.µÖ�Á¯ |3®ë®3䤰(�Î×–ÅæéÀ¾ÂÆ*éŸë-„ý›×oÉlÚ:� KP','3IŒü“�Õs×…ï¿çk)²³ ÞJ7m7{泪��Wì,à%Cmö쬢1v–×ûÁ±ê_©µ“øðTM˜» á/ÛXc9ø\yQÛTÂ3ÛÜd¦ÈÙn†}àdˆ|Xæ8ÂÞÂÏJÛfϽõ|>Ôñ²Òž ¹M˜}�k4]p�w_p *ß;Oš]cºÏÀ{&,Ø-g3»Þyðƒß @GرÀÆ#ÏDZÖ˜ö/ì¤[wÍã®'«+ø°÷¼ü) øU± ¹H¨a=;@,CÀÄæ°Ï`ë..�\’O(× † ?ùˆ£ˆR“gU™(JvL:Ôå„m q§ü€ ¬lùþY a{  f¥ö}çÍ5œ[¼y`gÀ^I.HØY†C °³°�ƒ"ì,oü÷ðØïòMUF²Ô¢‰A±:ÁÑÅzÀhäÃ5Ùð i<ŽŸÀîÂ>™¯˜ D`¨‘µsàšuŽ®å:¯¯¾«4½ÑD‘ßgŒ ¾÷–;äùpŸr*Ðæ&|­]3˜ÞQgˆ-„‘PŽóŽ‚\:>Gàrô߯ùÖˆ‹"·ÉB“¯œÑh”�ëúÊAùàm‰bï}©t÷s! ÚÉwì ;‹ðÛ÷Φ:.vÛ~Ó‘°³rÛ��¥æ sQ– Êåï²­n¦޺‡°³äÀOvVÑ;Kþ�쬄?ÙY©ã˜ h5ŠÅµ¥ çí�ó;>‡%è{r`�ÉÓÊñül4¶y>®;ø(üüà j®\*È÷ž_}l>ySç%c:Ç»gÊðµ”Æåë>Yô¦qÀü–f·™ÑÍ—–±Ã¯}%=OVÿ� ŽRƒýå4~@­FꄸMãé�05?o)Ѹ&�È¿ ¤�XªÊo®1†uDˆ?P¿ÁëÂp§©pœÿä´šq5ŸÍ^°¹}=$È×[‚ ßf£Ó°?®7“Uî±–/É+qÜæÁŸlÁ>×2|FaþÁ~+jçSg~×3?ÂÎ�ôØ -ñ¿³³Òÿ`gmÒRvÖþ…ÒºÓv²”ò‰bIˆ ¼wàmýRyVÃdYíÞA%½3ƒRŠßšÔãYÍ“‰{ÇUGÂ+Àq¸4DËx„MÞ8™ß¼ç^Ã3!²×Vó=£îL×µµtûùÀ€'ka°?‡Ô2=Vp^\ÃKAKö=Ê*Ž..©l×ý¾é‹åAi¥FlX¬ºbC–6®×,¸¶ë«!ãp-;Æ—cg1„�u-¿ó•¯tèY ìA†ú€°0 téÈÜq¢¨t *ºhüŸì,X_æá+mé�%«9`++ÜnNâ{a‡·}ß|i×vòŠÃ €])MÌÕ…½b0ÇaÝD^ÐmÅ6ŸX:ÆçøÒŽpcÊ:­àw!vH�ÇUsl±|ë¡y²¼ífà‹¥ðüÐhuàoçžk?mÏv?p‚õ5rÏX‚uØ÷6M–¥Ô†sl!aÝ+ »¬øŠ>k¸Á@írð×”-ë³bc²´Äl„ª$(\b'ÉAÓ?³ÆØ×ƒE�¢P6l³¦<®\ê[yÖöÉÀ<ŸÌm;4_ÖÿÀŸè ýŠõ9ãÁçsÉåú )y‚šPª"„=?8ö@.qLžÛ5•ÄH×gÖºHŠkU`àÀúæS¸ÆpŒC…c(ä©õ§ì€ýya¢ƒçà ׄ}'Àû‚ `ÃõFä!lÓ±Å|óeÈá¾ °ã�‹œ¶þÄ"b›À–É&±h6ßyË ì“ëí÷ëdý÷}CïðöŸÀ¥ø?1R•p Kz¦ñË'À=}&!GîK1 _.¡Û®¯v–|ø1#Ùù ØYì¶ýs¡çƒ+Ý3ƒËë³-k†¬9Ÿ™KØYÀ �õ¬*lŸåýøœðù;«xŒ�Å7¾œm¿°bYoÅ1_ž×nIrMì÷�Ùù0ÓzÚŽ¯Ãç]Þ;�/í›NX󥃳d�§–s­çW®-ÜsI)3Päáú~C6\÷ˆ3ß{Ç�îYCïÀ¯U{l>ðì€ó¼'Y剅òÌ63&2Nƒ¯Ý?Ö4dûîÑ�‘µ��§NT祄ï„k,RkT]Àw\[Ë·\v„pPe1Úò´Jc®ç¦kPßm!aÉl®3�\€ÆõP ×ëlÛŒÃÖ��Gë$#œÓlmyn»°» æãó»-�¹Á—îž=&d�©hÈš{…õË„\m>)_ò0€Á¶$­>8îgÆ{|¡žNò}ÈÁ¤e‡ç°­×aMDZÚ?˜ß¿Yìã€-×êQâ‹Z-€YMú\ê//'¼ ÌjÂ@•gTM" f<6�‡òõ8nã ò}±�¼¨´×ŠÅמÔFÀÃÍÄç‰íô¦»·íÈXÓ�~$“U°}w\¸ xu‰ˆGpÿŠ0jò¦ÆpÞ ‹+Ö%ë ÿÀÎbÏ.#u[a»_wb äã’®»P¿K"35%8ÇgÓ;L€•&-ÿƒÅ‰ë><�§q²³Jº§Ûˆƒ9Õv†0ÖeÅ»¬Ç^·o*Ø©�C]½gWwÄ–m?g�mÌ�kÄh6:W‹’'©Gî¡KËÎ!|r¯˜T�Ó€³kÛÐKÆ×�µƒ{V„yk˜`å'æÉJöε¼ Ç ößpMçÆrK2�gË«>³»'c ëMÀã*ê˜ k×|ÿ}ì¿rÉz|t–š¬!M«ŸûzØ}/äI¥» ØöÑU„Ùk„;}l1Ûuc ×yc­lËž9„iÌ[œó‘œµúà\Ø_>@ZÐj ,¶ùô2z×SWªýÊr¸¿ ÷›I¯cl‰‰IUûç�Ÿ‡\JšQb@ò”œæ)òâ.+rOûwºýÜrªùä"¸>ÀY‡z^,�S~aªà¸B|^Yìa™C¸ApÞ8$1Ï{¶f¿ ‹ós\·,ƒ|BÄaÿ„óP&*{¼oØ{Æî~æ @Ö­wÜ^Í6�_sâ[9`Íö�%ì½Þì qÖ® îïºê >•Ü›‰Pƒºb,¼>‘ {2`-8ElðF ±(hŒ‰˜Õ2˜*pNpoŒ‰Ü îïã�sZ)â7b»€{ÌéÛŒÆxæŸ/”Ví› k¨prFir‘>abá 9¼7yÙÐiã™°>#-Ãö‡ßŸ¬üÈ\.£aì‰`ãrµ¥À±Ä¯þ+§s ÄI)°ìrt`ý’oør90�?X[À†Ëj� u6¹�œ‹ÇdÀË«;d ùáV³½t§5®QŸî�ƒ/',ž®ëŽÀ.‚ç�zjUl·�‚î~º–Þqwøªë É�øòÁ™TX††D¾Q j àVAÎL86k;Ž3M¦<Î?yØoU±g–¬°ÉœÜ+k:¾„í¾¾–k:o÷é™°M·A…Z�cYÉN+ªãŠ=¼>¹_“ƒí!¿ËæW:`EoßoCu_s¤Ú/¯ Z/ÚA/*›­|L6.CKºeç,‡ƒ=$…{fðp �+Ô‘e´˜«P ,mœ�rÕ;±=0l×\ºpï ü 𦤉™:ìÆr}iZµ_Ô�}T—YçÃ5©7ðóà_Zà+B�b A µ Ô»pÝ!O‚û­¶Y.>S‹Ø60¦ñ5“uO…½<||¶¶ âyãÉå�¯O êAس%+°†½0¯à}Àýbiz« ÔÎà¿!�$ÜôM•†dϰàÓ·ã8fLâ<ð^±Oá2M€éLx°_1·ƒ0»e�ûçÖh7WVñÁŸ/!œWX3Áy(Ìqnû‰1ìSìãç X±°ÎŽç˜4 _»"lg¸>�¼l×@˘Æ/—À8BNÈt|¹‚¯Å¯�Ï“ðÄ€ üaXç�uòôrr¯çDÀg“î|è}tL:ηa/m¾n[‡g‹ŽðÊà>]V¥1ÔIÀ®ƒ¹M®ø‡mGç“ýÀ•ûfÂ~Wà&ƒö Âü"9¾¶à¯äù]SI\ª>lK˜àøœ¹­=3ˆ�V춦·�šOWŸ˜Ë¦7C>GÎ ö½tÞp„ùD[Q‰À  }½VòÙ7ÜÐ7þÜàs_ºvÿ&*MúC ÿÃc7 8=8Ì%ó؃ åúä}“y}|‘òÓñéøt|:>ŸŽOǧãÓñéøt|:>ŸŽOǧãÓñéøt|:>ŸŽOǧãÓñéøt|:>ŸŽOǧãÓñéøt|:>ŸŽOǧãÿçcÖ,÷øp·�”=ÖKo–³÷ò üµ(dcJD²^€Þ¬ EÎÉ)nÑa)Ñ ñ!ÉVŽð-Öß�òv³r´²ñ ɈHZd4×j••�³÷’ÅAø ø§s­à_]¼p©�Õ"QDH¬•ÍØ‹Zá[ ’££¢ãñ7Åa!±c¿º ?ô(x +á-¸$oÚ¸^’‚Ÿ?öM—üœÿôm*>>$."ÜŠ|× Ûjù\½ÅVÎøÁ¦Á'z›ð‡%V‹É?6áƒ?Ù€¿•fµd±•¿•T¾Ø*~_¤gko¿d‰•½þ/±Â~ñÂ+Ǿöû‡¯WŽ}ôûó÷ÿ÷¯Ç~?þ?þ<þ�4vi=¢c#Ç>%góÇu¶™‹ßë©·È-"5:,ÂÕŸóµbô¤V¶äú‘7ŸüÃ{pX¹pÙb{{+¹ÕüõŠ¥pvëÿÉgÀOÿxÖVZÙáw°d%¹RvVäôfÍ"ïlÃÑÊnÉŠöz¬·¶—7ƒÜ]ý‘·?ƒüÅá*B&Jþ|¨ª€ Q  SñDªxùòÈÃM„||¥H$Y¯"ŽÈÓ„¾IIdަ$2[Sžª!”%©º; кÕ^ÈÛƒCtŒJ€"I5@£êáÃ"7ç@äå!D ©&”¯WElÔ IT£â µ%Jµ™¾¢ ä/E #%KQ—D�§«û‘¿í(ǯ!Fîë¼ñG ä¢T¡�ö¼ûù“ß ä¢UèÈ MÐF‘gVO $E~ÇTè͇ÞY¢û[ =Ô¤Wfc•ô«B¿1ìe†þNyqû4è]�þJ:4I] ýÖ ¡›¥ Z³¤g³öÈbèó„ž4>.G›hZà�Ò ™ZÒDÐ<©7}*¢u¿=MëÓÇó‘5ñ%úòdü÷7U‚Æ “˜£C´"25ÅУL+T(i˜*è�Vž¤=ŠÐ‡ÌE$k‚ö¶ˆâ«Æ%o3€þ:z“&•L4i@Ó‹‹ÉÖ‚þKÐdK‚UÄ|¨ ýý1øü2µeÙµ¦²Šá¹òü¾iÐÛ(‹VaÂ6i€V9÷òݳäз»¿ô™ÂõLÞj@4‘r»,¥E»§s¹S˜MeúlJ-þ~�—QgÌDå�”Ç«�,—˜§K48rZÍȾr¢�Sj@® ô"ä·N�Þ(Ø�Oö¿ƒöþ;tPŒÍ«‚Þ¢P¥ ºÜ ë,ŒTŠBT|…2Nbèuàb‰>¤¿ŸùÁK‚ U,�S“àó¡Ãð5Å_ƒ¶¦»›‚~UЉe¢Kµ©èrmIhºh� @U‚$Š j ¥é FÐ�Ín¬5 KRóñç‘‹§ùC¿lH†&_3�KÙfÀÆ•èJØU`>*RÔ¼ñïy»‚Öo° hÁû�#qPª:#OTg"Ó5eòuäqyºÒMeƒrëÀæ¦I³êL`ÿºŸ/~ªÒôíÆ²œæò‚^+ÐF�§UƒÞ#ÑÇʨ0ûábÓ´èè4MÙæŽ)øúšKAç"·ÕBÖtÎAZwÊNž[c¿ÃaÛáâÓµ G�h�u‘¾û1�ƒŽi`óA™õfФl=yrºŽ<½Ò4ˆÆÃÆB}Р`B6j€ž!èÊÐAÑjLX¼Ñ™ŒÉÓf“su¡?S‘Ób}Ã|J‘¾42G‹hå7›C—,½Æ˜�ÍÑfÖoÔ�/ÒÛƒmŸŽŠWg#’4@CBšŽm#µÌzðåûçKkŽ,”§5›ðq¹:lBŽ6Ø9ô‚¾ô–�¾¿ŒFÒ7[¬ ¶)Ëï�Ft´š/­äÛGVC_$—;¦=Á$éŠåx,°=�^ælÏÐÏ[Ú?´.>[›ô®d–Ê º¦q›Ê'rÒÆ“Þè£ÅãFúû"c5¸ìs.®HGÈG¨z8ù`é�D žoòTuŸ¨&ácðX¦¨Sø!â7¨úð(À—câ(âÕˆMDžóa*BJ�@¿Þ迲á¹ã Ÿ‡‰+ÓM?x!®ÈD©]f|ÐÍ¥6qQ…Zby²ü й€žfiL�èL�ñÙ½c½Ú _ ü$6&c¼tC‰ŽD–¨&–a?” .ÝP¨#Kß>Iž\e(‹ËÖ‘ÅdhAo«"³Æ„ ƒÞ‰LMè›å²·‘Þ3Ðà€Þ{<>Ú„µ�Ç�èý¤WËR* ¡—‘hó¥6N"ã”Ý4™¯9¹z'¡·z[¥øº‚¦ö½Ð"/Ûk#ßvb©|ëÞ¹2¢ ±s¶<zìóu‰Äþs¬ûdì3¡÷ìŠô¹â±bc2ÇC;ØŒ<­ØzaI?3ôªíœ½B¤ßuS™±7ì—å©UF²”rir¾ø9x-¢³cžUCzQIßøÖ]³ä%C³`®ÉJwÎͬ±~ÁAkÒoVÒ7M–×iÚ=ŠÂÝÖäo�NBRž.Ÿßa½k¤º¬†z¡Ï$·ÑŒß\7‰è ƒxl®6áÐíâNKè}ãsêL¥› 'Àü�Xð« %ï•Và±{„þì3À>Aï‚�ŠÓ€Þ9Й»òñ ?M( ‹mÑ‹Fþ~ $áñó±O¢Ã’5$òHUð?DÇ *}ØøfIÈ5:"Nz©}Ȇ«2›5™è<-ÐÉ…¿ zõ`ctpºôÃÜ‚ž+Ò'•P„ßsÕÎ/¡DWšZmúE ÓÒ”CÐ ôvóD”,VU }8QÚTp’:è}]U{‰®ö…à#d1™Ú ¹ M.ž¾´KÙ ÙZÐã(+ﱆ>hð`[| ¶O<ž¤�*¯Ít~ ?—‹ÊOôÈÒ¶“žAEéîÙ¤÷�›,«Ål,/èž&+˜‰óKÐ(’m˜%«:¼|“lË>ðEò´-† ­ÅF&j�>0< ·à£7Žƒ^WÙæÊIÒ�•|FÝ$Ð!ºf �ñ0» úØfC/¤¼ÛôÙBŸ"ž?DKŽè¶á÷ö�Ù`QpN0— ÏUZudéám8· ú»  ú¦ Ÿ!Ú;y;,áµA�zXÙ$è%Ìוæa»ƒþ7°Å-;g‚Ö³¼lÏ,yv·%ôïã¿e s z¦øÄR}У'=ô å»±TŸÄôŒ&S˜+L<¾ö ›µ¡÷�øTìkA‚ IÄã·žè ƒ¯#ïÆ?úÎáz€žº˜U¨³��ÆqaC®6èÕ2A)ê\h¦&è4�Æ�ý"%‹V…üz!Agt�@ÃôàAr¶ßÄ2]¢+�Ó4™M«0€^j çTDº_® ZVÜÖÃs¤eGlˆŽ\XЇ})é5Ås2ò:ÐtûÝÔjýð"ÐUc#T‰Vö“lp’-�ÓùÆçqú‰@l:Éeqy:¤ï”œwƒ ÉÁG¦ãXž‹sÂü6 bÏ 5ƒc~�ünZ“ äB QB|Tf«é)Äñr;C¢É’ƒó¸Œ:¢ñ´©d¢,µÂˆè)aÛEâo2¶è3 s(§ÙŒôtƒžUF¹¡¼¨gº¬¨Û ú�I_$ž¯0/A·úaÞ€ž‹”èCtN…÷It@ïÛ!èç‘^È‚6Ò÷¶ñï=¯m@‡4­ØÊ#6 ³ Z"Ð×Ág’Mèm,賄¾UÒ�‰m ´(@‹4\Æ4Ò°/Ç×Û—ø~Дe“‹õc£lÈ4] ¿r ð{|b¡ô+HÆ6›ZmH4á{)EzÔ†œñLö} � =ú…xŽaLz÷Aƒ,¡X4õhìÿ˜˜�ãàÚÀ| ¾¦Šx/p|ý_¬½\UÛº6>»Ì-vw' Ò°Öšµ ÅÀ•î�îî;À•‘îFBÊÞá>çÌÿxîsÏwïýßïÜßïƒßÜÀZl™sŽw¼ïó¼cÌç�®žÙåqÃÏ”¢sxºÏ-Ä 7âù†Þƒ\ØFè÷x=ónülÖ*öÏ[�Ÿ‡<ë5™µ‰›Íz?ZÍÄ5ìcCÞneOLÖãAž6“Y‡Ê‰ï®†än€gÍñ½sÏXÏóƒ.ÖN?ËÓ_Z¢qµDõ ÍG±mô\©ëÕ¥�« ï0FÇeAS ã¥+ ‘¿E„rĦtb/{ÏEü,'GÀAø™V4Þ# Y�ŸÏ†çpáž ù�uXžqšÏ³bmÈQ0^ç|¦Â½AÎÃúåW&Ãà3g”³ &#,| î›ÀÐ\4!±-âéì »± Ñ‡=†@WÆq\74F€Ó{y<àO±�× à3àÁzé0§0W@\a¤Ñ �:Ö’K[‚¶�U°èR�Ï Ö¿¼6 çZT³Àócˆ{”³‡õý²–²Áy„XÛÙ} Ö€|úr+“Ñ}ˆÍi7 ®¶a�Q¬cî9ð5Ö¥=ï: <ð½G±q ¸ r'ÔkðºnAŸB¿¹úB^“©ã6c0L`:ü"0.°O\€µ«Æíœ£á÷®¯¬ïzÁc }Æy<Ì5ˆMœcÑ\߇¯¨.h¨i0î#«QÀŸÁ§vxþ\¾ Q-`MeX3§ñ�·Y”S ÿ‚3¢ü!]Ð¥°Š’Csi hýÑÇíÇ’ˆW N£Ï7$ „&#°N%zrsÅîQÛÑ E |´ãIÑ9YÐúM@ÊÔz4ÌC�Ñù‘xŽ¡ }KÈ�ˆï�Äõ×y÷IàÁ}ÀÈÀ;P­þ0ÎU mþrÖMÍàŒˆã‚¦}½]‡¹3À'oýªM…UlŸ˜ÇÀãôøRì‹ þ. #G=ZË\¸2juýmÐ\Ü ñ蜢^VbTo¡÷$uŠ_Xò7h#¾>Fl�ðè·îÍj”¡–ã Z1 ©‹ùºçtоÅÞ>×Wbþë¿@ìš°p,ô Å6�rëÐa�Fû�9/{¥-¡’*÷a/¥K¾Ó Ÿ‰õ$ö©@ç&µ‰ÖäE÷F|1Z´q‡ÁóæŒ,è Q¾…™qx˜/¢c6ã`MHâ•þ“¯ÛM€~ î¢\Æzf-Á=BànÇ,Ç€¶7Ħúx?=&¨ˆ§é�Ú¢MR*ëƒ:hèþå1Áš:Ž¥�19?8�ð|Ðt¨[»hй‘~kSb‡X tš!º¦,MW¬í ½¸_. X¯ó§–ßd‘5âu@¾ÅºXÃ|}p,87¬ é·@蕽 qçU˜7; ñÖ´š�{ Àù ×øÝ\ œ^蟻r"[²ƒ ~µ�ñì1í6•Bü�9n=ë@º§-|»8ÆÐ5i1]¼|jŸ{+hó€ÉPÓ w-:ƒ¸·KÎ"¡SŽÔiÌ%QM]4ðO£ƒ¯D5´Øb Yðœ_*q\õQbƒ x�Æ€<þ •Žç5ªkLª]1¯·3‘X;ã[›Xy3ðoKÁÕ�x�{ÿâë€y¤èž_Ç^fhΟ¶�u9Q¾†<Ü(rKR»$/DáºSì|ÖóÆ endstream endobj 37 0 obj <>stream RÖïÁêáü…þ>hóf´ �­4X?Àq#Àø+Ö3¼»æ,Î¥�;¡þF@¼\а ÖúGï?Ç¿�×ã€+øbîGœvœxû4XxM•žBsàø™Q˜·a�‰ðLv£6®—ÁcBBèë‹ S°žcZâ¶ã§€ÓO�‰9à1×&ýËcÂÔnì°Næó­÷+D»°ÖÐ#EœzžnY‹±¿‹Îjð6£Êö0¡yÀ~ô”Y߇«É˜šàC5¬Ÿ�´úUx�p7Âë°f9Jâ�æ7ʙЛÅÚvà«ll…×ÜÀSD˜Ñ¤A¥¾Wf·Åz´�(äðØ€½Ð'ÎÏœõž„ûð=⣗GéñMGhªÒÐó”�mê„íð™€}|4wi4çÁ úI°gpxB‚ßp"è1 ×GƒV0p ¼ÆýK„©˜¸ª½"¿'뱟ºgt|Ù2£U™Œ¯ØÅOkÙ8 z—úoëªk`� âê|êŸ �`íJWOBh‹p|ÂßÂ^QЗ4½ˆ{3°v±‰y5èk¿8zX"à÷(ß@´÷€‡€ž­Ä;{è°âµòÓý.É•ŒåXÿúrð¬aÝâ‹c1@s <‡ ÿ):‹âÅ¥ä¬çdÜ?ƒÚx{«à¾ý¹á½,ä)ðGAµúÎØGý²ÿtòˆùHØ‚=(λþ‡ÇDJ�Š(­Vƒ¶�‘ÿËcB ½ ‹cú�¶³ßƒÇŒ�Øé_=&܆=&P�Ã(n¤Vˆ³Ë=7÷œ“wÄ>hAÿã_÷›KqÜ�õ™ y¼WÉ”%:¥K™}µ ÷û-=§PW»Â�xÿà9°>|¸eá7ò"ø‘R§‰ƒ»µˆûàÉ ½Vþ ð‹‘`è›Áü;€�±V-ðWT3¡_>xØÓz�ÀËÁ<PÍLu8/è_Â}Á:¡m*‚[ýhNm�mð˜ÐÓ}qÃpði–OGàÿ i�=&4iB[‹"Øãvc¥àå�ò5îO¿<Ưk˜œ…¿šš�‚{%:…êøâžµ›@»ˆóÆa�·‰b_íÅy0'ô:Áó+ìéf&êåvÀ™ »c ¹�Žz¼yX¿4h6^Gu‹W€uT¬÷–·‰ÍlÔ]ÈÛ°†"µB¹Ü+e©(­ê�$³‰/¾Ú©Ggt©‘ñÕ;±Çš'¬Ï�åd\ö˜ cËva� ÄŸa¿…–®!¡+:+>Kà;}(ì³í¿¼[°Ç„˰DŽø_=&Ìÿò˜°M��¥D'e0Þ…5aTçéØò=ltÉ.áNÜ3ð½±òæœ6‘òb�Û+˜”΃ìÕ^M*uPúÒ"×ëK„ö óè¬.5ðoÜ´´�/Áþ0t`ïÍsîSñ¾ëÐYÀË¡\ø/x‚þƒšØôòXÉY¯)à�kŸ WK‡¿ÛÆ:\�Ožöœºðԅ੟<ñ uU=BYE�ÐP7 ôØ“x=p'�\«úµ ‡=,>~F£1Ÿ|¸ö|AŒÒÇ-G³ˆKõ‹SÊÕ™°ÂmbTÛpïÝ:`&^ÿƒ½N ›¦@&×ìcÓ;5°ÇDpîZˆòŸV?=&.Œ•`�‰[ëA£_|ÁkôÖøh>Q°÷aM‰}Ì< ì…ÜxìòèµñH Á>5R|)xÖ¶‡=îK!WA¼â<zªÑù»„a;¤Î) 0žÐ/ È)bϤŠ‘,ˆy²‘¹Ñª'¼Ú¢ã ^U8ׯ•+J²+yÂ䪃lTþvÈ Lvƒ&h:Cïï}TßœUÀ€ÚÝ_ ö˜¨ß/ÌèÑeµëQÙêäÕf%öJÖRX㡎;Œ·Mžt÷—Çß¼WŒxä) øAÞZ/q ™�ë;ªeÂà›k…¡Ï¶Š}o¯Á8ðªxoÊ÷0VtBÉ^ab• ›R®B§T(ÁøBï™+Ü k7"ðËö¸µœLhÜC…md®ä.§Ÿ­Å9Êïþ*ð°d|¯/L‡±9¬CÞÿ·Ì¥lLù^6¡Z 8m%¼Öë�÷àùXöí¡˜F½Ø)J®;ÄdwhIîÕKn¶ 逧khëyÚ2d:yÎo2¬AðMÌG0F# Pœa@óe1ä5!šßЋ‚õ"=MŠ€ßÃ>-J|¬—z\]†ñÌyßi°_|)D‰*Âà‚-x?¬Ù�oéϵ^ðêÿU2¦pþxxLˆ­£qz°çHê³Hr%m™Ä?wìéÆ4É pïú@½¦á»}Ô\à㸇š»<¦à5+¯éЇފ$®FUSºo˜³£úmû;x¦/ƒž=ö«ÄëÐ~Ó¡ž�l`Î*æz�ŽðEÍé“r3ð„ÔR×&ÀSïeK-;(ɨÓ^­Õ$“ vbOHðàŽ(ÙZû }�×#À¯ aèÿûb Îf"ë¢d ⦇‹o4QäÕeð˜_sÆ=máðúDúê|ÐTð^g|ž¯ÆÖ30�òÏ\ =/±[üBì1á>ì1!Šz´|$°?ÂþKÄ\R°Ÿâ©X£½Ï&W+³©uª˜Ÿ¤´(Ú ø�OöøäÍÿ§O^Z·*ìûÑåÑÃZäxŸAâBìk€¿Z뱕J¢Ôfu:¤h܈¼&^=°– ziPGݪ£ŒŸ¼:+yTs„—óA政ž±J’-}àšÀ—ð:ðù€©8;%.mv:µMâ]áAÍƒÚØ¯”'BõÕyñû R¨#àIjf9ò»äœ?ÞW,r ›�õ•aíö–ÁžT… Íì›·F✱Ö„ÿb_7X£„õ4–°W ràðã[¸MÁ½þããD–áˆG__* ~²òön�s{ð CüÕ?k?Cì²Ö¾¸¯}iBã!ð»:$ÌN½(Øïcx9XÞÈÂyŠØÖOkêÿô„„±%³ZJ–5*,¶fîµ `�JGS@@mÂ| z;à p5øÜÒiªàÛI'7)²á…ÛEÞwW‰<²–`�^Xó· “‡sÖ}^ƒý� ñW¼.䞸üÐ�OâÊv€OuÚmàú*ì%…ê?ì;O#ì»äqc ì?BÖ.BÇÀ³õBûäy�€›1­ê¬ßõØÒýÆb🦬"gRöa³ ×{ah›ÈYü£–£`ÍLˆj9à(Qz³–aEè=‘Âc2°pö€DuüÑÀ+ú™¬ÂÐ�‡˜´Þ«†{àà%ôpîS |«B‡°á=ÀS³#ž�÷èÂ^FÿÜuàa€÷Áz¬£¾4 Ö©`}Ö† G{ÄnÉ x_9øAÀx�ù u9p}ú¼GÕCà5X÷rpF8ìãæ�—ôj%. ľ×WÃþ^ž«àS’·|—E®©Ã×ä’¾ˆ ½·žL«ÙOÆ—í ½o.£­#gÁžˆa#ô3öÊߊ½ˆìCäA‹ÿÛàÏýß»«¨˜—ÛȨüM¸ožTg½'CûVú=X þ⟫ñž>Ø{aîxÝ^F¥÷föë=¬ÀûkÀ� p™Wö2Ä6�/ Ö߇Œxš‹Û¿à¹ë¨À)�wÛFËÃ�÷ô‡"|XÔðRŽ’£-®L/pàIàYJžDXÚ9KATºp‡Ð>m>®Íg]'áõxÉ)YŒÃÎØN£zˆõåñ~ 7ÜïÅx+ôR½n­À|# w öBq�}àhü½a¯ª³ÀoÀ›Ň80o“È/wŒ-¬YÃZ=ö¢€>&¬_B¿öøBŸß-s1î Áš)ʽx-zXðÿ!œÁ^¾2 çQð\‚µfˆÑà‡±ÿôÓa�Ë=u ö;ƒ|òd«(ôÁ&àqÃýĸ…à+Ïd¿×$ÓZÁRx1p:sÖaœ3Â1ûÀGV5íbÈL|­p=ˆ@ìB~�Þ6…ò)™R­}|MNèÜÀO>ÅOØ‹­ØW;ðÁZôÚ*àl°? ün茶ƒdV› ôB÷« Y·tØg½2¡b—0àå&Ü—Fsöë߯8×ÿæJX+Æ~ï owAn€Ø†ç=`¿ú7Ö ½nâý²°¾ë¼ÐÓ€ý8tdÑV:»WC�X·Kx!`erï•„ž"¬]Ã|zÝY)²Kœ‡½^lÂgC¯Í�exÈ>?7‚×þ/‡ÎÄÞÐ(¿‰}®­Âµó�øùø}3· ìI|à=ê'œÇÃ^è£ Oï©79;zK|ó²Ð3&Ï8Œ'�Y�_rð=a�S0!›éèŠ0ÀÏ ñz>ʱ€‹ao.ö´ƒõ2» 9ðŠ‚})lpþ¦á{9j*>g؃äÿt=Q¹¼h1ŸG¹âö‰º%/Á¼ð?øˆ N,òÎ[kŠÃý€«KÁcKì›·Ž /ÚŽ1+à0ë0y|à}rÖ`}aT/q^pNúâ… ÉßÞ^¸‰âÝוà7 >=àqžetø“Íx î·ú2Ü„5!Xw„ž±GÊBŒŸP=£R*öÓ1/¶áu«³ž“Á; ÖùEA÷6@?� Íß­Øã>¶h;ö ÏÝy™ŠCy×:T½³P;± cZð­ÿ!ß;«píÏì:$ÈhVd®d.‚ß…þ¡ ©u/¬IÑÁE›€¿�ñ5»„™mºtfï!*±i/Žû ‡à!·�J¬ÜƒjÖvÈÃ°ŽŠøñVèy‹<®-…ü5Gìs úpî�‚oõõ&}*¡r7í�¹{G@¯êä™Q¸Þ�'LZ÷*µW‰ -Û÷ò#ìaeBßl¡/GÎdlg³ž×—ЩD-:à·Žû�ð\pXó< ý׫ °Èw�ŸUq¾±X옾ö�a/!ðü€=É�ƒsŽx¶c× ¬ÛÍÅŒî*2 ý]À¬Ö±r¤eè4Ê>i6í’³�Œ(ßB^ÿtˆ¾Ù¯Ë¿þUU�ûC—zõÍ�*øx˜Î`ékŸ´È¬O©ÌAUöv_ü´å˜äUƒ…øuóæQ—˜ÉèUgcÞî1¼’´LzÚvô%ðÞUtÏÀCÍÓÂÀgÙ”féµÊ8»Rt8­’4N-ç‰bK±ß±eÐL©C¾ÇÀ+©ÄڽП½Øû2¨¤Ú½à%„9'ÂölÖ{m&ûƒ“Ö¯Ê$w€u8Àÿç¹´VE_�=Ýñš–÷ãµP�q¿ó¨õhàƒlhÉv¨¡‡D•íù§*xöC@½ü&!‹7¦ ¿™ Þýí0¿’3¡Û¿Ø {ß{1mŸèªlQÿ)¸wÒÊrWqU�ƒðEŸ)ýdPD?‹_4ž’>­?mx¯ÖDšQÇ“ÄרJ’1)-QîÙãJ?]Ë$µ+‰¯¶]m DIj"¿§ë�+¹&,–ØÍ1:ï9ÝÐ-s™0 ÖŽó±ÿø‚Â:ÔGæF§ssÀ€Íí`ÙÜ6!û¬ó°èiÃ1a~‡©èz'Ee ªQ‰�{ÝJì�N{¯ƒaÐ’÷õÈ»_u™› ¨»ƒìÝNš¾×Ãgµ‰D÷[Å’¼º#Fù¥çE«�˜ôN5AJý^2½GJsLðë�—côÕn5aF»&¬× ³;!6u¥×ê(éÍ*!“Q§F¥¶(AîcÓPþKjQ„5 2í½"™ùá?gè }­_ƒ¾Ù£CÞÔ¦n}Ô¡î|ÔcHÙg}(ô²Ô‹�öՇ㢼îâÛèïvP¼F©øaëaöa›˜¾×̓3ÿÁWAîW]òÉgš-øxLPüw#òÅW¡°¼ÝR\^mgôêíE£§oÏHîVK™k­:LÖ 876¬`+Ô\W>¢ò?J„¹½6u@�E¹àðõR#6©C…wø´¬�‰åHð´„µPÃÂb+éóJsѽ^CanŸT|«S$Én§$×iaZ«¦(«W—ÍìÕd}¯�,ÖûÞ :¢t;ö% +ØøEä…æyHé6Qz§¦(í½�Ú«ÂÏþ¢,ˆØÅKÿ¶�—ýCQ¿˜#y-œ™àß—ÅõÂ�no²îËYªõ‹ÓÿÑ�îÿæ"* :òá~ÄÉŽ›1âÁ†@Qï{?iWc�QwEÄñŽüICµº�búõ×ÂޓâÒFé˦s¢»mé�:#㼊Ӈ_X?*µ߯•’Y_T‰í»…×»ùÒ¼ºãì­>’Š­Ýý?è ³ÚtQÒ—^­ß®>jx³V |“NëTe!2ºÔé;mŸ Šþ8J½þf(xùEH}2f*zÌ%åÞ’Îw>¢ê ;æù{cúî�=¤A&wì#3>„ùÀÜï¢Ù‡�bq^‹1{¿‰e²ÛµÈÌ.aV»žôQÕ1ˆoéÓ 3á�6†¾Ýc@_ïÒÞé Åš�…Ï:Œ©›_5É»uØ[$•ÛÉ'õPT~¿”.øz”}ÛkÎVt�gÞõœeªÞ_`ª»ÎQ/ÅL^µ‰zÑ'¢î¿��úÂû­Bº°åÓØf)ìnñ4x&j ´ræ¼:Δjú|‘iì²a^÷¥r>iС¨†ÚFÏ^kš8—#\ õúU¼ÐÚu¼ëWævI$Å•—Lç_’Ä׫1A�Öòo}W'oÓ¼üÌ�Oi~öoÊ‚˜¾íüÄo»EÉCÒ¬6Òø^ÍIiq‰µay‰ËáwÅnFe¶âu§$·[D¢ìNŒU®ö©O£Q�cÓ4&Ü.¶»º@W·C�÷«>YúÍ„îûì$þô.@=2ôÍF:øÕ*²~;uý£¼&zÞdjø²ò¢4¿Â\š[uTr·ÉPú ÆÄðn�1ó¨CÌ>y/%Ÿõ°ìË6SQaÓYq~Ãñ“ö¢Ç�&äÝï:äÃAƒê/û²ÝT\Ue'ª¯u–¶T{÷”„Ÿ|7ñtûõÄãÝâŽö¿Œ ÖúˆÛª›|xa×�c2»Ì9ò^™Sdú;·(óÖ”h ŠÛ£=¹‘':nÅHªƒÄ­þGº_F1MƒÖ¼×°Á%[»2Ù½Z¸æÞo“o üw½�4ÌlH’;4Ù„ªýTôÛíÔµ�êâ—í§ «Ê]%åUŽÂ'ŒY¿„—n ƒŠ×ñ"Þm Ÿ‘’úr·ãïŸ%ëy/í*½¯ó4*¿Øœ˜èQ�ä^�˜\ãëY�*i+õ¢:.¼�pi IñjôŽkr�άqŠÈ®s»Y厮7Ò«Ò7Êÿ�o¤•wÔåÆ˜èÆ³>¸Óeg™çƒÆ’gM§$/›Ì%ŵ—ÄÏšN°÷ZiöF«�èc³/ˆ³f¿v{�n͉?×z5Ù¼õZÒéÖ[É’®Z_ºô³¯ìoAÝ�dõßOê½áôuò95½´žmúW?î½m¿xøCiÔ‘Þü(¦íƒSÚ}†)ë´@øù„8£EŸÉy¯-zP'¾­ê3)_UÅ׺iæþ7ZXÞuQÒ×(ìnód»ß»KêCÄŸ*CèÁ®ÂÏ�¾Ò�²P£¾ê¦­Ûžÿüw>ùì=)*¬;%myç%¨ 6xáZ”ìßè�z¡5ëê‘îçQ’¾Ÿ£½ÏcŽ÷Ü�;Ös+Úº-<&¸Ö=ê^�}DI½uhQ“UÈ«f«�bôµ Á:¤ Þ:äY�]x.šw©Õ.Qé.QÉ•®QžÕþ1ÒO…AzåœP?´lÿ§,¼?(ç –Üï1·ž3*+u3j* 0î, ½i¶dª�ý*âì�øQÇQIqóEqªÉ/¿˜Hêê=ü«üR�j#R�ÛK"„ífä�ß5ù‰�;×¾¨1OúD–fWËæä”Sí·’ŒúJP.,ˆ6ê/ m >Ò›eÓ•˜PïSï–hÞ–•,xÌv5¸œèºïÖ�àÞèWïq³Æ> Ž»Õöá�Ñ8½¬°‹È/uŠ}Vêu·Ì1"¶Ü=òdgN¤èc›¿°³ÅSZ[sEXØqZ\Vo%z×d%®¬µƒ¹Qzŵ_”o¥o´[eH¬sMHlR©{Œ¥_"ÝýÁÙà5Çç5s'�£üXá[â�^âe߉â+))¤Ê;é$:7jpÈIç §£÷šÓ´~·€ûtó�Ôàš€œ€ÚÀóö[¦Ý¹ÑlS¥�°²â‚[}H&Œ/«mÃoÖ:„§W:‡ß«³ /i² Mmrˆ>Ö{7†úµ×Eÿw ÿ§yß¹Kä÷ONFO‚jÂcý«½câËÜ"3KÜ#íª#£-“#Ï5¦DŸlÍŽ�~(2é}!ùÐ,yß im÷>úõuóïZÂç¿5i)�<×’•z¶5;áØû»1‡û^Dùð,Zø±Ó›üð›5Ó×ë*úVx¬ëv”Iÿ£ƒNÎÌ uèý¾ÖöX×ýX—Æðk† Wô^qZºYß¶éú=Y¨k�4]Ï!i¦nrË&ƒÊ?DT_·ƒY÷µØ�f·Ø¸Z×(Óž[¿qtº9CíœXk€“hõsBÍŽÑâL ¾rç ~p–ì·ö{�ùå‹£N'ÖŽlY¡ÿ€S§Þü8".mµ1ª­ñ9Ùv/Ñ¡62%²Ò+1³Â5Ö¦96UÒ[í/llvf:mE Õ.’¾¦ sMIN5á‰6Õ± 7‹Ü¢½q ·jŒC9ûy¬t 2̤·(Ú´'7æbkRª_ƒoªs]X⩎¬æ÷ž+tW—ƒ°·åÎÊ0ÓÞ¼˜ÓÙq[ccc]c=ü„ŸZ}©žÏvT×7[^=g¢[ÂéjÝÚ¥;[+(g¾F)§Ìëþ~Fôku W•_LZ©kª{7K\#<ËýÃO·d„›vÝgÝÙÆ6Ì«OGQ?Æ6w9žè¼ï^˜x¯Ø9âå;ûðÜb—¨;o\Ðÿëñô�SDú[÷è£Ý¨Æö—„A}õ­ò‹}úÖ1¢°Ô>4嬲jëà¡–K�ÑQ‚r�{ƒ_Œà��NmÏà;gy¬ûVÔÕ&ǘ’–Ë!Ošl#r›l#ƒZ<“Eß+Dß«ý¡Gð~»¨õœSÒµš¢~Ü\ö Ñ™}|1±ó€&±u÷~bû®ÄæíÊÄÆ­ûˆuÛ•ˆ�ÛõEÒa„ªÝ“iªY[¥ÖÀ©Q_:�ËCÃÓ_zEÝ|íVä[à•VäRè}a‡³ÍY±Â¾>†=UaÇ;îÆ"\Rî“�úÆ36ý�kT ѕ±€óøÍ73üXš^åõå·gÍV¡wÚ­BîtZ…±?š¼ur>mÓ³Š˜ª¢%"ÖÌW �”#rÄ|b1 èûÕcçæ.#b;u©«ìî½4±|Ú|b1ýÖb’¬1Uf.1{¤1ìrBaÆzbñü­ÄªUŠÄ6}sâ€wÕ¬C/¸=:5œPÐý§%õ†;"|óÙܨëmDö÷˜¢7aoJ ËmCŸ¾uOªt�Ž.÷ŒõªöOt­NHzãs�©kDÜÛ+1aï¼¢÷=� »~½L÷÷¹Ø5‡ÆÔµ\nl»„æP<ù£ßU³‰Ó;”óëúC7¦kZgLÕq¼'§ðVA3çËF�Ü¿oÓ|ÈíÖŒiX®Ä;A,UØ@,ž½„P�[Š®a1‰˜@L$ÆãÑ1ý$OÌ$dgKg(vû�Be•.?Ÿ¨?´@­…S×ÿÂ�áýÊY¼õõø ›‡ÜD-½žâÞNÿïoÅ\© ˆ‹ã™Vèq½Ø-åÅÈÌ"�¨Ç¥Ž¯ßÙ‡]-u�Dù8ây±SÄë"§°¢wa©®Q‘Užq­­¸ó�/ÖI¿öŸ÷?Õ•¦û;gv°˜Û¦âþzÆ>±õˆM»UˆËˆµëVªÆ2×ä4Ý2gªž°‘]¶P�˜JL&ÆcˆQÄHü9 ]—,úAÈüüy$ze"ºêñè·F£ŸdñkÑç/“V7‹ˆ=”ŸÌÁ;Üa‰[D¾Dìs¿ÈˆBŸˆèBŸÈè·W"c‹¼¢Ò‹<"¯ºGÞ+p�|Qè‘Wèþø•Kø]47ï”:G<(qŠ|Snæ]íÏ~íò~nô!ýär©-:æU+ªÁí—B¢[œ¢õpºû O+ç¬Dq8�?œÛtV2ø*`l& Îtñðþþ�ÁW¿ w`1fÄ4ôu21Zf2úi1{ÚZbý¶#ÄAÏ9Þ ªCœ#ÊQGÅý­þfm×c³ Ü#‹ �Â2߸Ef¿u�D9&,¿Ä!Ô½*0ÖøÃ“�Š 8ˆÍGÅŽáwß:EÄ–zDšudE mógoöulŠ«yoÖê®÷;wú`Ôëù[öi g¡k‹Ï4:Cø~º¦™(⦣ïàûÿåjþóÇ|uÿzÝ#Ð'ŒÝxôïÍBsqÍþS„’oû,Õ›ÜjÝAî8ÛõÁSÚYhÒö<üD[NÔåºØX«ú¨˜W¯–E1 c[ìã˜ûÊ=êe‘7È¥� �#›J£»*ìÃÅKýпgªÝűúýÜ)þwÎZã§¶[×”˜†Fèÿõ\£ÌÏ;ÿõóžÉ�YF,^¬K¬W»Lìw©™¢Úâ>UØZ–%%¼ô�ºóÚ=úi¡sÔ“ט'%NqÞ:EçºD¿t�~UàüÖ'Â¥*$&¨Ü':°Ò+*³ ñ®J‡ˆ›åNáIåîQ¼¯œ¥Ú+n»ªçí™Ê¦62Öo'fËLÁ18ŸÅÿs2øþËâ8…¯ÿù†#q4z ž{Ãópþ^‹>' ¬:‰˜MLµ”˜'�X¹ÇŒØnœ&£ÖÈ©‘Ÿ»Œ{䔸„–úF�jËŒ>lÞ”¸ x%Â^‘>è«M]dô‰Žœx=ç�sx%Âì�uV¡ÃX×*$±Þ%Ö¤?7á ±òå�1 æÌþÿ½÷#Ññ¯×ú×kp½²?ß¾îÑøÎŒGwh<úœ‚gïpFÎA²?¯užrS7«w™»OÞ¥v“['è嬎¶Ý9W�ñÆÇáÙ¦ÔȺׄwEÎÑ h KœZŠ]“[Þ9%ÔU8D¿zã�â3êI‘KTB‰g”Ö'Ù¤(!fMš�çÖ—þ·]ç÷×4î瘎FŸcñõOAŸ¨&NßJ,Z! V)]"¶ˆGìËäè|æL�6ÝòJzáu;ß#:ÿµkì›B—„ŠB×”òR§¤çE.±yEΑ)E•á‘p¸VF¢ú]íq¤çv°f9§µfÅæÿõu gCY|βÿ2¦#~¾7½;}N1›˜%»€˜2B�Ó ”“æ¡¿�˜1j1eäRb²ìbÚ¸µÄl¹CÄjEgb÷ñ×£” ¹ l_¡#Â-¨@Mˆt® ‰,÷7Ì<Õ’�rLäS”+SP�\˜ü*Ê­E¥ö­-—Ão"ÎiÕ¥ó�;ª–ö~ùM 1[vòÿelˆÿ’+áç¿êÌÓI(+Á5É�]FÌž¼…˜;s71gÆNB~ÖBnú6bæ¤�ÄÌ1ˆéÖÓáûñ›¹‰è÷䔉¥›�; ³eæp+õº¸¦Í·N×\ lvï…Gdª}íÅné­…�o]RûÞº_ýPá’1PíœÞWç˜ÒZmŸP^ë@%·}Šìÿ›üøW„ëœã%?J�˜6Rý4�"T~T?eæ¡\²�˜5r%1cÌZbƸuÄ̉›‰Ùó‹V"ì§æDlf“Gl¦Êìñï�¦ó…3ö¾vŒ}éyÿÙ•¸·.±Eα•Å. •eޱo‹œb‹‹�cï½uŽ,Dùôå[Ç(x=ê�G„J§¼zƒòÿúZþÊ›�#ÆãÌ>æç÷cq÷óû©håG-&æ¢qš7c+1_n+1gþ~bÞ2UbÁ}bÎ>1g©>!?O•˜µHƒ˜¿‚!Öi…{Ú&)½á6ˆß¿p {‰qK±wäã"ç„Í¢bJÝ#ÎŒîq§á„ÅÞ½sˆ¬/vŠ,.qŒDסý�;¼Ë,Hfɖݨ¶Ný·¯ òäXœFâï‡sàð�ÑÈb–ÌlbÎø•Äœiˆy³÷ËÖIˆ;Ï‹·š¢ÃŒ˜·ZDÌ[L³—“Äì…zÄ,yUbîÜCø½ ¼hb¯cý$Õ÷œºn?wÔ¤ùÞóÊÔ€„g~‘eÏÝã_»%”º& ûºÄ!â}™cÌ`•}Ì@�mì`½}b]™c`RÍœdÉ6ƒÿÕ˜ÁùOÁmÊOô8\ó`î ¿7 ½;��=‡˜7a1gâjB~úz”›WrÓÖ¡ù·‹˜3}/!?c/1sÆ~|móW󗈉ÅN«4}ˆ­GîÉî Ꙧ”Ë­•QLês7 ¶›‹8ËtýˆUl<±ŠJ"6™<•ÙüÛ,ÅrnÝWzùRQr°{qX˜oq@ø;„½jе=|çõÕ¸òR‡¨Žr‡˜žJ‡ØŽ*ûØ‚b§è µñáªo¸=s¦Ìý·Çí¯ùù*ÕLYyB~ô"tMsQ<ÎD¯OB{òð{2ó ùq+Q>Dc7aÊ›[‰yrû‰…‹IbÉ3bù~+b©š ±LÅ™X¨hM,Pµ!~Qµ%Vò‰�†2»|Ú§(=áVé pÇ…=ÅŽçK“Ü ÂCŸ=ôN¬yî‘ÜðÚ#½ À9 8CP…O¬es|lâ �v¸)úøòŠÒnÙœ9þíZ>c-Àˆ¨z�Dµl‚ÊýKù‘‹Qž_ˆ"rŽÍès¦Œº¾EÄì Kˆ¡ÜˆŽ©« ¹™(ÿ/Ñ$Ö ëM‰E›NK÷9KuÉEšþÄ:ÓÛ2;<ë'ì¿Í-Viâ”>-é|áq¶6-(äU@äíîU¯\¢ѵ•8…=-³_cò©Þ6~ Õ6¹¢Ö>1©Ì-ÜàGïÅu"«ÿë˜ càÿøù¯\2Œ…ǡњ€æÚL4†sð1SöB~Ê&®"~Q&)h ëP"æ,TA¹B‘�›�òÇì(g¢y†æÚü9{‰ys÷ 䕈ù‹õˆ+hbñæÄJUb½ …Øp<µ¢Â&¸¿Ê:$¾Ô=òP?GmÒ¶ø¯m4¾žI¸6O%äqþ˜€1ÿü0äË™£ 2ÍGybú(8ˆ™“×siK>¶x1r_Hÿ¬}×¹…ŠÏ¸•€'s+ö&ÿmÎ;ƒ{¦ír®˜¸ëòã±û|+§)çq«ÖsÊŸ¸súŸ¸³Â/%žÆý�‚Î5ÇGŸNXó1p×"ç¨çoÂËËìÂZÞÙGV9%Õ½sŒ#¿´Ø«8½›9òû¿›ã~ÖrˆO@Æòcæó§­'¯Ñ"Ö©[+)kb…i(±Ö>oä:Ÿ7£7û¾·ÅýÍØ —ŸŒÜà�?j›gÅøm~­·ù4NÜæðvìv«‚1»Ý«&xÌ­;PÏíU¼É-Q l•SÉáV¨×sêZ�œ@»ƒi·pBþwùRmL8`¸®l„��ªCcôh}BCçz’-B*÷‹@Ïýö\Eá¥KVìûâR�äõYòÏV"äªò+õ‰,ˆõ¤'±–¼Bl…[Ì®Ë¼÷·@1�O5·í@5· òßÿ†iÛOdÉnù[¥‘#v�¾>jŸsùäý>m3”c¾Î?ø˜ÛŒðÉ!­_9#Þ�¡‹ì—7­^NxÈ¿l�vdËJýà’•Ô½?õ…e½DÏ¿§nÿ©+Hÿ›2›óÑÃïÆìÓÏÆÂÜ>‰ôqí qaÛ9Øï¤[Â(‰ýegÊþÏuú!0Ó¦�]„°þfâ±h�±dÇ)b¹š5±ŽçA¬=dI¬ßw‚X³•"V¬U%V®T#ÖnÛIÿ;/<³Ë¦dü�´¿/V«áT48�>ΘüòÝÑ´óf¨èóÛ+üo߬ŸØjµq졬ßÖj&÷¬ÕºÁmÕ)çôõÊ8šWÅ šϲÍõöìûZ—#}Ï¢Mz^F‰>vúÓõƒV¼wœDPýã$ÛÝîîVœXUnì^­’4´h±Âö#.e€µ!ì�æºÎ–óæm'–m1 6«Ÿ&v�îÄ.ÊžØs*qä®°·Ó‹¹Õj?8ž>7t^ôé©3ù[•­Á?¾žüQkÍû³ÅJ÷î¤ÚwNOý3ÇÓúÎI´¿rG˜O=î:=œÑ¡€ÂùZ§ÃÇ©›ŽÖ.â4ùÜÝœ?wê;]ŸÍÈÐ]Îf7âŽu݉½Ðœ–lÖy'QW_‡`Ž˜�bB_lç4RÌÓ>±~Ú§mj–‰–®ÚƒyÚ÷1�Û/ò;ˆåëøçz;N¿µÓ·sòîNÅÞÎCŸ9Jû7îˆöî¨æwN| …Û­\ÁmQíåTuþàŽ[ׇGäT8…ÇV¹F8׆‹†^ºBEÅžÚKn‡úCnë¡ NM¯…3æõp‚Á?íÄßjÙ/ï½trJº†f2Ê[všjªD?bù1e›È�kÉÄüíô½:QÞ[±¤¢Äθ±Ð_ø¤Û˜M:È„Uí`Š70y-ŒqËKIoE€^9ÇlÚCý·×5åÅ)²ó‰©cÓ'/BÖÿá:]m±cÑ\b÷ÒyÄ^8VÍ%Ôì ÈØ‚­¢W 'é§],?ºpuÁo ÞžÓ¯�÷D›9Œ£M¬Fƒ–¬0¹KU˜Ò£Æ„æo¦S{TÄ7[X¦¦ÇRTÒrŽÌüý újÿÞWMªhè(ÝØwQ¯›;¢VÅ)+z—Mßu,]vçñì‘{�g�R6Ë£vùáU—'3e]G ºÂ^§Úвï«�ÎNQ?¦g£~ú—�z8Uƒk?ö\Š›¶w¯±Aa.±yÞ¤ ÏU�vá3õ.zMÐtËš¥æ�?g¿‰§ìÚ=$1k’1c,∇®Ü¨G(;MUmáj~àêËGWjà7'ÞkŽ1¸Á)ë;ÆÍ48ŽîåE�I‚Ч«)÷”(Œ¤ÏxLMA%UBmÛBWQ•2føY!¬çš½ÄÈ*l¶P�OBï ¼A»ÅÏ'cË·‘�y+iß»+¯{+Dé­š&Y56º|7k4 žÁ ýo­ ÒºÐñu{©�§ë™U$9�´øC­¿´¥ÂÏàæß•®)óøñå[ȧCŒaK©�Ñà›ö{“/ÿgÍû�»ˆêÙ�.ŽÔÈåvj\Ιª¤w˜P¡ß´–iîµVt]¢Ÿ|c¢§TÔ ôyÆ~FÃçÙJÒïÉJM¾„عl ±õB÷€2a$6‘=rÑqºéLJ-œ¦JmgSIÅ{`Ÿ¯ðq£™×É#s>«ó²{ö ®¤- ýr–зºô`_­àÆ75^LÇAÜÇÔ�¿kó¢«6Q6Iòä»q´mø,~jÓúÆ 6™3¨ÆKªÚÆ }½J/­w»~§¦�;¨›óc—ö�¿o×¾ÎmU+äv«pºš¿rbõ!NG³‘ÓÖ~Ëié¾ä´ J9V/ŸÓÒzª sÖi´®‰¹¬Áá³²šêÄ®Õ ‰;všzºuäÒhæœÓDÐÐðá¾0òcŸ:�D÷–òÉX„õ@|Ò–Kü䙳®«èY‚”ú=drÛ>Úóªí7‡vŽš#@¹P’_yêpÙ OêE·XpåÎb¾mðtÊãÁRñ“¶#’êJWØ)}ûÖ–¾3Àç§´î¢=o,¦-æ üŸ¯Ô/âxäÐÀEO¹½jöO¦©šg�W¿”;EíBöD�Ü6ÞGî2ìåãUs&ºÎYr‡´ U%tMª„Ê.EâÀ®=„ÀÜvs½CW˜Ó¤O¥·( ,œÆëó¥<“Σ„„ô¬ý$x�¹Ú ax³TŒŸÃuKU AF‹"Ì9Òÿú2ê‚÷dÒ:h:˜»ž?‘¤6é³lN³žäYÅ1Q^³D’Ûp˜ÍФã;ö ’:÷2iCª°çSô¶þïöïj¼´ŽÝdð“Õ‚°Gkø¹ß´ Šþ$uª¦êäëvqÆhÜt4ns[t‚—j›¸ŽRTÔ#Ôõ%„®ä²,ïbäTU-±o‡ ¡uHB¨+iJk·êû{ÑÏʨ©ëÊ{ªº_�"DRYãs¶“�\S—»_[ÏI\CçÃ3Žìµmã»ÕÇE÷Þ‹ù×>«¢å(÷«¿Ò?* "J7‘—¢gðÏúO\ýSIRÐz�¹ÛGãg]läáyfÒûÆbÒ5a.å’2_àsw‰~JÃVý»?T ®U4ˆ+ߨ—1¸]÷Ú×]º¹Ë–pzU“”ü�Ñ~ðÇ=�«sôœ¢fèg|ÛEå P±í[ôíbflf .…LÓ¡´}±cÙJb߯í„6šwÔ Ç±ð,héI.ùÌ-v2ìÅ*§GCt¿N$|P/dï¶ÒÂ[Í|:»_ƒ {¸ŽvŽŸÇZ‡ÍbRæÑvñ(߯Ï!½ÒÂ<ä]P! »ŒDÅugɇŸy¼ëßTøYù×¾ ~ Ù’v aAû)þõï|'Ó–“IçŒù¼ÄÆô‹RIkÍ•ÝØîý|NO÷§ªÕ¿VÇ1Oþ€î B“¶�ѽœ4Õ —Sç<]®+¶�á™ØŽ]©O�”QÞ­ŒæßBáê¢ïTAV·2Ì]Öphf€n1sØ|¤ô¢ÿLqà³-´ªCTj¹’ ­f?“Ñv4 ¤·k$üœ^êJ¶í=›qO_ÏzÁóñ¬wÆÐç1)~a¦éZ¼EsfÒáÒWQf¿.ãÿ|-íýbyuP™~Ü%ä§¶ïÜü¬NÞíÕ¡î® ìÿ?öÞ2:ʬÛ÷­($!Bp îîN�@ˆTÕãOUbÄ…¸»w î†;tC7Ðö¶ÒhÓh»½¾÷>gì{ÇÝwýg5½ß3Î8cÜ/÷5F5tH%UÏ3×´µæÿWçÄå´LÒfvŽ÷.»0Ó«þÓ^)ƒãÜŒÉæ®\”™‡šnáÅ'šð4Ó'wÔ©spÙá©™=bœf<«›V8ÎÐìÞ²G³{óVÍA/Ò!öÒû™q†p ââÄ–ŽQ‚"¬xöYÁ1F;@wË—ç ÇfŽÂ̰4ôè€áÚýõÂK#Wÿþr}zç®éãUÚ¡ßvòEçgƒÕå­F˜sÌV•kßR/¾4ðÛ‹ëÈ5|°BÈï�Χ֎KOÍ…v wý7¯kÿ±×çâ?÷ú\ú÷=>§þ±]Wq~¶¶ðìt]FÛx}t±î‹øcÞŠ³ùÌÖ'ðe׿s °{®øÂlÌ•ê§Y{°<ÌÝË Ñ+IBnï4¾õëÍbÛ‹�Ð͆žé ]|ÎëÏüæŠÙ.¡íþnà™ 7ôb7æÅyæS„ÜÎibrí8>¹z,ŸÖä¤?ÆâüðŸwê:mô9ýÛNý•ß¼¹÷~4 ïþhàïüâ'}ðmwí7�öüºò7S´gþÇ..²Èî äoæík�ù-~øïn†›OÂ|ï}œgüün–pûƒ÷ÕÿÇU÷ÖyzU}õV/éǵyƒS¼+oÏÑÅ·ŒÝ½—Õ k·h¶®ß­qÙ¼_sPh†9KmD±ÍÚùË4sl�4síÇi–Ž™¦ÙÆòäW¾¹]³”ÚK+0“g8z}™Ôò`›oñ©E²_´¥V/kDc¸%i‚…_4FÉo˜*»¾Fèþx»¾ûþ–K/Ãý×µ>X«»øw7éÂϼnàå6p„¸òÑà.ðõ7—síO¶p�O¶ˆý¿ì§µ^}a¡PÚ?‹;qw�xî•�pù•÷Vxï{ñÃWAüÛ? ,&næ †§ë" l¼øpó}®‚Æu§—Æ :÷¡¹#ù¸Ú1|fßèFñÁÙ#¼„Pæ;¢Ìù# c™-Ì سúÃå˜[NþÙC,»¸€‹È¶áâ G ¹=,ž_`ùàñ Bj“ÉGV_]Âu~¹Eè~±K8ó½‡xö;/~ø§½¤·}þGOáòO:Ìi軟oÕ7ÞZ¦=õÛNÌ¡–Å™oáÝߌºþ¿lÓ6~¼LÛûÏ-xÿ|JÑh}t¦�Pqi�~èÏ.ÜÀ_vA7“«¼0Ÿ+»OÍš+5Ëœfk6Ì]¡Ù²rµfÏž=·žš=ûYlcù±»�¤q÷4û]½4ûݽ5ÞÑú”Gh¿`FZ‹ÐúùsNË|dNü¸ﯗzžïá{_¸@³›‹Éµ*†çЧŸ{ÎÝW`»bÙÐ)§e 4±ä3_é•kO òÕ—ªpîg/nè¯{¹áìÃLßúh®¡œW7™¯˜£kÿt­pþùæ7�ºsÿsŸ¶êÎB}ÕÝ¥Þ=¿lðéùu³®øÌLïÀL+o9ÖÜ]hæ}(Ù’‹©uІeXoZµA³bÆ|Í–u»4ûv`~S§#Úðjéé…†ÎO]•æ/·ƒ»:èjõF��— !fNÃdÌúC÷E.ïŸ�9RfYM…‚ŽéúÎç[ø³ñàNýÕ•¯{g™˜Ö:Q`OèÅ‹I•Ž4“—Õ2…ò›Æ?­"]ÁŠ«‹¸c·Vò 7— ŧfñeççê¾ßÎ]üÙS¸ø“7×ÿ�Ý\é¥9ÐËÐã,¼„ÃæZ¿TK.¼ÌÎÜ™ùç˜;hêéüR­ ³ýGþpÞH1«kªXvu!wâ«õ°/hþ²¼b†W9š�-sà#sl¹ˆŒ‘ÐŽ ÏÍÑ·?ÝD3Èuo-Ów}± ³•,þù®=”¯>5oß�–ßr˜¿ø³�¾ùó5"‹ýúš·a6ókÂûßhOýÓE—Õ9Qß0FŸß7M7ôo;u'Û…|‡Ùæ.Ýð?vA Lg…ž†—hN:--w×h»¿ÚÀg÷NññK±ÜµÕC³ué&Íž-û™]j5ž:^£SÌõA¬¶ŒÉÅǤÛjCâ,Á $�—À$+>¥ÑIª¸±š>Ðu5&5LPCRFú†¤Ú(R ¹!$ÅÆ˜×;[l½»ZOÐÆà³š'òeó¹Þ§Û…îÇ;Åá—î˜s•*O/„ž ßûÌE9óX'\x®Õ ÿâ¢=û÷]üÛ¿ ÊGÏ¢”[Ï‹g~ôÒ ?Ý)–Ís'qu—ëÏýÅ�f—ßþIÕ_ü¿XÝñxµ.©a,—ÔèÈõü¶]ß÷ëþاkõå—æñÙ“u%Wf듛ǹ¸xj6,_«qÝv@Ž'X_:û“Å�1Èœ4?ŠI£SˆHÍT²Kæ7ņ‹Ë„¡o÷q½w·ÉI…c¤˜t;¹°y:ßxs…X{c9ßÄ~ßÉ¿îÕ þ°CÊm™*¤Õ9IEç炵Á§×;‰éÇ'"NŠ9Í“IS'�ÕƒÉ,/˜)f7O&-ÉÔÆñ|tº ]`Gz;åo-¤?kÇr!# 5�×`UºÃéÖ˜“†ÞžT~m‘\ùÎr>¦`”hæ©óÕÀž¹¨|;)»s*Ö‹îÔ_wëÎý¶�üi7ôç½úîÛ¤Òóó¡í�¡ï›ÝÐXƒößlÒ°æN~¿OzuP¼øR/¾ýÊ ¼õRÒ þæ"Ô¼µºsˆúæ?­á.üz�;÷77ý±ÏVsY=“ÑWÓ§ÇW2ŸÙóbr®íÑ&Ì�CÏÚ‘:•­µC‘\Zí8ôô½ßlã›>YÃ…Œtß'³:ÈUsÀCÖHñåc¤Ò¾ÙЦ” úf²k9AJntÂ5ÖEdŽÔù&Xj¢,ÀìàÛîo«š@JåÉÅRÝ;«¡­½OÒ¸Îí� íQÒÒf±B×úÑ]ï³­l=nŽ¿½Jlùp#ßqw‹ÜÿÈÝpò+�Ô÷å>¡ÿÁ^aøçýüù<¥ßúÊ¥_~VaüêãBÌßûp;EºöT�ϲŽObkw­pæ—˜ÅåÏþ§‡.ëää½ûxÍö ;4úÈŠQB÷»Ä¡Ü /ÆåöLÑ—]�«O<áˆ\Ôu˜­¾èÛ�ndñð|â1eŽ�c+Çë!­i4åÁU±ÎxíÓùÜcta„C!ìëÅc ‰ÎŸþÕ]7ø‹ ´Í¸æ'p¡Ef�ÁêÊØ!·kª�Ïâ,«/Dæ+„Œ¦ Rj�“�ql—Ëê£Äš±Bb­£�P7VŽÊÅÇÙó,ƒ‹ nq@Õ(s1¥Þ ó­\ßo.\ß7;¡ã!åwÍ VQ5«sZ>ݾøxàò‚Í�!1±p44\„³ß�¯?SÕK_¤³_éP#@3½Òª8³P,ér†ÖßôÞjhÏ€ ³:‰?õg7îÔ_öéz^nÁš�†™þL\Î()¿m:ònà§=bѹ9àîú°Z5@bÙàlØ(44¸¨,O­>Ášïú°$k}xöH>ïÔ ¶¶wJ¥—xzhönß§9à#k¸€D+¹ }tÄ¡$DåÚ��}B!¦Ä^œhµÏCÒCÍØµ˜í!hºòþq–Ð’I?{pi©àÏÒ“óå²¾yrå…%¤•R~awìö*bŠô¿O=ópùÃÐàë·âý/}$õ=u#= v¯¥+Ïõ£¯c ß|QêÿÍu˜•ƒV‰zþ‘ˆ¹|ðôMï,׳Dßþù]ïÏÛô•ï.І�Üíâ­Ùºd£Æ�ÕÐt¢¸[8êxĆhsïCñ–^ÌohÄ€khO¶¼ïîÛúÁÒN /°ƒV¸%ÐÐSêœø°ÄˆÛ†Ë÷Œ‡®|.Õ¿½ºtÐTâZÞ[#\ü³V¸ô�÷À?6 Eç@Ã^¨d9eÃ;+Åĺq>j�r=±øìÄYÔÕºCQ–Ðö玔ÚC#�K¨£‹Êf>3ßNŒd¾.©ÜQ†ÞdjË$}H’ÕÁƒ,ê% t’‰±Æì +ô9h ±8dbœ¶NÇ@JÊ-§•�ƒ.#>8¨Ðâ–ËÎ,€^‹a.&�¬�Ùк·ˆ4£«œ c­}ï×ÛÁ ,xª�wÖ ï’.½¤ûÀÇå�Òû…Zp~&n#4–Y¬Ô·ßß(&�pòR"Í}Dæ… 318ubˆ˜Õ2™O,ííI i]`$]0Ï|üÂÌIg#¿g:brOoYÃе¿ˆÕ)äœúÉ`b!žƒÃÊGfØ Oæ-‡›³ÁL˜n-$T�BÒGè¤pÒ)’ •ŸÕ0Q*˜ËêöÐMû¿Ú/tßÛ)5\_Ešw5——�Ù vŸzú±þлï'Ýz'Å÷ì}#iC6¾·kTßòþZÄrù݇äO^FcN5Û!e¶²ëÔঌ¾ãé&nøï®ÐœÐu¾ØÄ—žœ%g·MÅ{sÛãÊÖ“¨‹츰\%Êœ N±æ"p-’¬Ü¼$VóìÖl˜¿N³iÙzÍ^èr2óö�°à“ê…£gç ‰Uc¡-Uâ'•9ª™u`÷�ÏÜËSÑ@÷‰ølЧbþçQó -$u?Ü -fòMq™£ô�_n&ýŸ[¿ø oÿMáÚ¾Ù æ˜SáÀÖ†¹«½úðØ ß÷r·¾ñÎrøÉ}ûôšýû½4à]Ñ=HªvwŠ8N`2ýÍ¡wìé�|ÈZÞ¤�1JŠI¶áü¬HSžùC©í£­†Ž÷vɵo­€] ÁñVÐO|²Iìült¿¤¬ê ”k5´‘ïþ|+8 †Üú©ja×,p —Bë�oýh“:üHËý°O8Râ ?aIœóâöÙJÍÉ%àŠC¿¸ 'ñ Xß÷Ü…´˜ŠOÏC‹mÅðl[Ž­?-»Е–ªn,ãÛžn•ëïn€V8j¸gè¥A›Hün1O™¿3;¦ˆÙÝS)_¯~w¹Ôþr§ÜýÍ>C÷ó†î'„®{ÛÁBTRªœ¤‚ž™Ð2„ŽÎ3@ßXÈí›N9GùµÅâ±ÏÖË�ßí‘{¿q7ô>òòë{ Uúz@?‘­ååJ~ë CNÝ¥þêj±û³]rÇÝÝÌ67PNÆr¡x`‹u‹HO/ªÌLL¾óé6qè7éä/Ñ·@ŸzÐBqÏLŠûqÌO—žž‡þŒ�}j†>ªÔŽOlpäb*í¹Ã©Ö^¢¿™Ë¶=š­[vh°'äÉ…˜�å-0¡ëÙNèøÒ5bu­·VÔðA‘V`T¨õ·7-¡Ò‘Ø´l�ãZ¨}÷ˆÇ?Þ(çŸy)¾Ð�ú�í,ïÊuP¢SmÙßg�^ß…_½„+¿ðÚÓß-¤×:A“ÑK c±ÍÄ9*Ç@'],½¸¾ìDèÒKÁQV¾YǦs:��9ǧ£ãÁ�ûšy8¨ÑK~fÐcD܄޴¸¡7ÌÅZ‘þdéÉyʉ÷·H-Ÿm—š£Ä€‡ö+Ë¥²î9ÐÒÔu¼·NºðŒS‡{ËÐâ6†[ӆݿ“_ˆJßwæW7 }OöHg¾òk®-á ì¡á/Æ8€uŒ?Åèl;äæè=HýÎÐ|F<�ΘPxj–˜Ö;Eœf Æ‹c ËÇ÷üì"¼‰Ù�3j?9½s*i×õ=Ù­ïz°5/˜Yè‹Q®hhlÞÐñ•+´ÞÄž»Ä¶{ÛÁ>�gŒ×¬¡ëËú¾¯¶A'=ò¿¸Î%§ç/¶º¾vz¾ÛÃ^¿ºÆ´ª‰RÀ+¬{ôœÔÚ««„žû.êÐCoß¡G‚Òù`/ßúù&0[¥úKË u'ž™CÜ«’Ë‹”¾<ä“ßy ýÛËõ|³]*¾0�úÇ%'ç�¾Ý©W^Æ«÷‚ÔËÏ|ùÚ–Ó>F\Ý.¦tj]V‚»î%6ƒ¢”Ð4Nf?Ÿt$ÁŒav§CÌìבÞ1Ø*Ð/4T^]i,˜/%TŒUbÊÇ(-“ÅŽÇ;Ôî‡ûÅú�תéµI ñz×GòÀ8“~ggq'X^vþoõú“@ÒTËëšþš�…<ŠW�0i!Å@S´u">¯!«s†!¹~"4P�Y'¦C±–˜,ÞBŸXx©Åcå†�7¨í�]}Ûº+-wwË;¶ØÁ˜~lŠ¡üêr0¾|ãÁØH¶!6{_†“·X{r‘tî+oå½û¡ÆÛŸEC‹ÛÍÅ]ãy€7iq÷Þu5 ÞóQäz>ÙBZܨ)»Ÿï`5ôjh¢Q�ä:p‡XnÅò_b/²:ƒgñÚô†ÂÞ¹ˆõÐ Ž^šÏG–�Ò$Y¡î¿DÉ?5KÉ==‹—%§ W€få5—ã¶tR”9¸|°µýÑ^cÇ37µìÚRä¿z)È̇÷77À¼«�Åe¡þ*Õ=r|�#4.Ùõ¶×Pí`׫ý™‡Zvc9tÔ±‡„8ÆÉ¡æ¢¬•_0š48�ß\gè|ìæÛ}ßš»ÐyïˆëcþìØgk‰‹�Ù9ÚÁ|Ç«m|ýÇ«„â+ó…ê;¬¦º¸P,¿´ˆxºÓpãnpÀ­[‰†›wkÏüe7_wk¹PóÑ 1­ƒ|,˜sاó:§£¯>ôïÀî{_í÷Äm¯»fß^æWµËCýÌ^óæ 1ùBp´â"q³b+Ç‚•‚þ;1 B3l°îÔøÜÑr‹ƒÐX….7±³˜ÿêy¸O9ùX >qè;w}7ËcÀÎ:\`« H´[V/EXèÅpsèq¢  ¡¹v`œ�¦ì¡$k‰4msG‘¦òÑ¡¹2ô¹Á€H*783Æ®¯‚±Blã˜bâ ÎõM¬ï•í¦Šr´wîk-n¥lp>wòÕ>ãÛŸ†ø}ö^–tå•›qßã­1qšš'� DZÜåç~ ÿÅ>ùÔ3oß�¯uRÏw{E£‰�Åb6q†2Z¦€�¥7;Kýv–þÔ_w£>Äþ–çŽr%;«ˆXĶ‰Ï¶›‚Øð¤KÛ7úϰ½×ì,µíë=r׋=dÇl�kÅHs=³-°æñ¬†´êñȧ•üî™xORH¶�”1|yCëã=r÷+Wpø¼>Â\'š¿Ìð²áùð1¤ƒXuj‰Ôxs­Òùp/tu¥ÞWû ñ(t<ÛÁbéÎsõÿ‹îüÔ?tçû~p5\}ðÑ�uð‰—Xunõ Áy(œÉ'Ö;R_±êêRáø{ëÐ ×%XBëXfy9⺡÷‰î9Î[!ç$^18¸`"ªÁæ:5�r=Òæ>k .ñjÀƒŒ·V"™Ý$W;Aû\|q�ØYEìÚ¾fgU€�Åò»˜\{5ïÄ4hÆÒYÜû��%FÙiY|p�^ÃK�æ¢�ý.ßCR@¤´–E#³Í0Øk¥#ññX£žH|ñh.4Ì|&hz“îõñÛëH‹œ-§ñô�.^�oFÝõèÉ…rã%hq—Ÿ\þ•:øÈ 92ö²„ –3EÚÉ¡&-nâµÞßL:³`>Cçï»úÂ2hÖâ<ñ{#ÓlL}àTb|ÃsF�¥FgØ™ØY ÓÅá'èJI`g5Þ^à™$�§ ûnà…!©‘ɶ¿³³&��Ez¥¯ÙYA#�™]3”º[k�ù§æ«,ž‘Xž-q»Ò[§C1½Ü KCnÓthé2˜/d÷U -°#û®»½¯gñp´éõ¹¦×göL‡f5ì[Œf¶š\2Öp´o¾oç]wÿö‡žT7õ>üCwž­;ú¹ö×�ÿztç�oãìÅ+1 M5³}š’Û7S’l�ž„>,m„”Píˆn–'wÈÌ‹÷3Óƒ£VpzŽ\ÿåFä¹rz÷Ä?°ýøÀ4k�àg¦Õ*f'–Äa=R8šXìIEcÕœæé†¤:¯ kþè¥ÅBï³=à¡¿¨cyØ2àœ{yè5öî'v–NRÍôÂì¬Yè!&zy5ž{µ,¾›#>‚RGBÒm ¡)6JPÂ98u$|4XÜħÎnœ¢æ6O‡ÿ£Smï‰wÁ®­tâÎ0~HŸ>¡Üy«Êr}æ«M76(5ç—)ç³­¨u¦0ðÐgoÐ+…·”Xí(°Ÿ ¾™ÔñÐ9)z€JhŽ­‘m‡s#ÄÆ*ì�…~ ±³{§ GGsÑ–Ärb1“bäkvV×Ã]rï£ý襼fg!Þ* µã`Ïrz¥xe`g�—ŒÚì¿ÙYù&v–‘Õû~–ˆ/ÆÄêñr`¢5Ö.4üÕ#UŽÈ�às ùÍ3ˆg–Ö4Ù˜Y;™ùÀIˆr@êbo±×û&ÕLÀë¡·þ¯¯G¯u͆æ61û�k4½¿ÉÐùþnß’Ó‹•Œª Ð}ï™X°¥çç ¿ºÊC?{AGìX°ñèõ,v¢ ´¼³V9:0ßÄ]�³+üô±çu�“5^r�ùA�¢ñ–‚ÍP;¢Ÿí©S5`bKÌgˆu¬B.)G—Øûxûk4<µÁbaH¯˜`,lŸ:êrb›"[ˆÞ±`KÎ΃†=ΠfåÎüì&5ÜYÞ<ØYž8+)ùšƒ�¥$�v³qø'bg¹±ßÇž`¿*Æ©‰ùc|#RìüB ìÁh”c¬ÅÀh+%ŠÅO°»˜O–Ëúæ‚�†õÎÁ5k»¿]jûlø®JrãcN�3r÷—{‘çcŸ9´¹‰Ox´c¶Ð}ß±… %,ïÈmŸ&%³Ï.Gï=–oÝÝeÌjšfϱóKiœì›Áêúò¡…†¡{zãéÇŠ2øÒ›‡vrëƒ ÄÎ"~ûéù\ë‡ÄÎ[¾ØL쬬°³,<°Õhs)g`:´º‰M}t˜ØYð“ÁÎÊ7±³ ÿÊΊ~ÍÎJ!ø†Zp"«-U–·#ç;>§}:ô½Áß@N˜!©„­ÏÆ©`+ÐëYÝ!‡°×û…Yp| ¸TȈûƒ×W^]BO05X^bÒ9œ«²k©DæØŸ,4a˜ßJFódþ؇kÄS?z軞mÿ�ó ±Àùrž=Q«Q�™0’÷°8à¦h´<«Éƒ2Gà{<½9�ÎxÈ\N«rBñõ~.zàNs�,ÿÉ<1Yªº¼¼ °¹=\õ7½ù¶šÄüqýdµ|x!X¾”W²¸-ß”2ŸËj9¥Ž˜8oÅõ?w‘^ v4Ò#Rlt°³’gg%؉�uv¹Rws­_2F§÷7Ã{o{¥†ô†Ijõ饾…Ýs}ãó‰oMõxú±I¤ÇÞúÉfâ°8. iÙƒW@lòÆIrZ-˽NÍE[?Ý*wÝß+t|º�oyo=ðÔ Ãùªeºœñ¹¤†wVCKçÕ²+KÁ%U{ÊMï¬óM*'DXÃÒmY½6Mjþl+r0‰Õ²&¾¤‰�%;ëñv¹ÿ{åä œAF}@,Œ˜ÜQ|pÖmH²š?ò5; ý%0ˆ¯TÚ=O­:·LÍ«�Jñ=¯ÕYª=³Dixw­¡ìâR°+•˜¬Q8+†5޾‰!·ÓYÚCfb@šµ!²Äõ­!½v˜'ðÉRÍ…%jïWI{‡3GÂçKq%ˆ…œ!ÚÂ[wÈÌg~XìA.…8fÈê˜A1’Å5âì¢çÉê6œOC¿ÔÄ/š#Ô¾ mý ¨¹„Æ·W‚C`H=6‰ø`Ù­Ów|‹[É?¨•WV(¬VýMS¸ÊÑÄ¡b1yjý�µ`¿! & <,—€@®‰s'`þ0cf0®7uÈCĦ«+åcmB®ˆ}°ãÁEçG¬¿¾‚ll™ ŠEóå¶/wÂ>¥Þ÷c¿Ní}ìá?ô@–˜ÿ—Îë ø‰ÁæÄ�.ìš))�=}Ü!:ÓûRBû«øæÏÖƒ�e8õTÐ÷¿Ú v–Xsvf>¤¢áÙRvÏ4hY Ôs¾µˆØY`… ŸUÁ쳤—}&öyÁÎ*0±³äco­[Þ߈AýVó Ù-Ó)×d~ÌäÉ›kå:ö¹KºgÉE=³ˆ5_44Om¼±N:ñÞFâÚbÏ%¾x¬1›Õ`ø•�\(uÞu‘»ìå»ïnãÛÙϪ¾º<;p>À{R˯/7¤6O‚#­äê³KÐÓPÏ<â‘Qo£ïùN®íÃõÄwb5ÕåW–Ê­Ÿn—�´y’—Ö_Ã-%ÿdkô|ÔØ<pPÕð[CR¹“ÔõÅnßž{ÞÄ’I«›€\€gõ��7«×õ̶ƒ #ô�Á£A_ƒr0âœfزZ¦�Ý…šOÎéœæ†\483&ÔgÊ?9G„½¢�e+ÇæŒBF fKJåù%ØÏ Æ{Tž½˜Lù>r0¥øâñħ›ÑQŠzgƒù�ø-2¶®+êQò‹ù'¦�YMs.õ­#^Pj%1P )ã‰ÁÌî òP¹žÅmV£!ß'Ž ò¢¢ng‘]{ª�ÀÃMeŸ“ÙéïLw{©æÒRô4Ô‹_«†‹÷�bσ]’o”¥^+k°EŒšœ†)Äøç yXdÁ(ê'ü ;Kl¼½†ê¶¼–irÝõUÈÇõ7¡~×§ZëYŽ/&·N+M)ù�ÅÉê>¶ŽgJ¯ÙY…�³À6’°¦šoc]-˜cú¹=3`T ‚C]9¼@ª»´Ll¹³�ÙØ&©ñ6å,Ô³ª<¹?ƒØpÅÌîÙïC.@¾ Ü)¶FÅ*VË÷<Ü¡œ{Èóç¾óà:ïnÆ;칫חӹɔœÑò¹G:ÿ럄_»pþã`ãà}¡ïÞ.V¹à=éYÓÙ½dŸ�]ûÒÞy8ë&…d�TŠÏͧš¹åÎf%µa‚Îf.°œšÖy}Îàn‰Ì~`ãz1Ô\¯÷e¹¡N£Ó5BpêäÇø\‰?­C_‚Õ“#tœÁŒXžìw)¥½sÀ·Âù%bUÞXÎÿ|˜#`ÊÑœ«eÑ‹C"¬ÀÚÂõTªßZ!V]^‚^>b´šeÃb-ÁQƺR|~ñQh¯Lª¶™à¬¡·�Y2¹îöZìYó=LØEÉõÅjáéyàPr»œqþFjºcÊ-i Í7T\^»§{�~x\ù­3л–{»3ÿ½\ŠËµ—CÓmÄCqVJRýxœëÏ|ãi8ÿµ¢ |í%¶ÜßBÌôˆ;}u¥Øñù6©íóíjéðbšƒyËr>ÊY+Ï/ÂùBø%÷ÄT0°Äc7×ðÏws-¯Ãþ.ö›iÖ1¢ÐŽbRÅÙÅðóÈ¥””±”§d›b(èp¦=!æßù–;ë¸co¯Àõgõ¼N‰4¿‚˜*,®�Ï+îÀ–Ä Âçfù#ŶîŪ³ E–Ÿ³ºe ò ­ÄüËC…�Œxß8{&¾Ø �¾uû½­bÓ{k°¿Äò¾9b×Ó]8멞ýZëß_K¾:£vrVü\ò1ì^âì%xO8@q½+ÔýŸ¸À§ÒÞ´�ê^ÄXü|!(Ú g2Ð §Hô;b¥Óúš˜ˆéÇ'�©‚Ï„½1!8Ìò »Ëi�|„Ùö˜“kÆ™xæo-W*Î,B{�È•¸|bb±� ïÍP|r�Òxk=ú3J1³?öþÔ’K‹¤”†ñ8!FfÙ*)àX²Ÿÿ•Ù6qRË>:ÓýK¹áÝu`?¬-°áÒOLB�MûÈYìþ‚A^^Ý…eÈGˆ[ f{QÿV£Ÿ{çðåÄâéøl3ØEx Õ{¨U™Ý"‚ï|¾�o¸>O©`¹¸Jˆµ5—ñ=Ï\Ôá‡:pb°WO¬¯Ä2G:{‚^#Ε�](³¼|cü?ü¸Ë=·é;>ßÈ7ÝYM{:É,vÀvØ3ñ�[§Ò> ú8;œql²)Gn��s\ÇÇ”;É%Cs¹€+½áˆj p«�s€ '¦×²8Ó4Qfù§ŒóVeÃóÔ¼¦©´WÖtm•ØùÙv©é½ ا2­½¤03î0‹e…ýÎ\ëÇðói¿&“ÙCNÇT¬1©¨Ï™¯=»�ëüt3×òÑzîÄk1‹*FdØ€�)F¦Ø(¥ýóˆ‡3$yóå0C#óìÔ”ãÁ*TÀÒfù¨TÙÏ|è¹%°IVs�ÂÞü xSJLª�x¤ÄAIª'ç÷2Õ1�ú|¬f¢zƒ½×|i/­ÆGÇi�G£6A½‹ëŽ< û­³Y)*Õ†lŒivÍ”üÎ8Ë#Geتˆç�o¯C¾žêAœÙR‹úæàìÖÞö‹•äP;Ã#�$nzB¹#�9 >¹Æ‰Å1'Šóà½2Ÿ"¥6NÓ™xÂ8¯˜ÕJÌn¹8·èѦ•�#Vùà·Vç=–‡b�Kµ×MþìSæãˆsV,úìl�)IìÚå3;cõ ò"Ø «�Ö�ï®Â}DN(´¾»^®f?ƒ}Nâ‰� þ0ú<è“'—Œ¥½R–�Ϧô?9ˆ9:!™åÛ8K[Ì®ÛÑSóÁ¢#^öéÒË�P'�]‡µM×þ¡æÊ:\~f.λ‚›!Î b}QŽÀ®-ü•!§cťʋˈ Î>³t´k6ÙiÙà¾æÆ¾òú"1¹Ñ ù}6œ{iû|3Ö1¶Bb¬À מüv»þòwžÒÉïJC/=øê³ „�$k̇ ÿc÷n8=,,¢õö`t‰½oZ××VüכǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛǛÇÿÏ�yóöFîñ�÷·÷ÛÏsq[çËþ_ë$>(ÎÞÓ~žï —¸ø=¡ñ¡ÑQþq)Λñ%ñàÎm�ófç…üS‚â|Wú®Zé»Èy‹óB7ö7ö öÏ‹œ—²ï]¹|õZçÚ ÿç…¦ŸêÌþÙÙ+.4$4Š}QàdúÖ-ìi¿lÃú «–¯^µr�ó†�×,_»zÃçH|yÓÆåkVnXÿ/_ŽÀ—Mÿƒ/›¾á÷/ÿ÷ù?|ù¿Èa{Á>ÊÞÇ~“óÂE΢`¿ÒÙ%È>Öt-\C#‚6›þº+ˆ½ãß/ ûÆUÎâ>û{‚C‚v”<œEO{Åy¥3}`Óœÿx{Ø/ܰrùú�ÎçUì¿ëW³ÿ{û–×/úý��ÎkÙï_µ‘ýg%û+^¹Ò~Þf½‚Íö{È×=Z�»‡¢Ñê›é‚²­1æ¨δÖgXk­¼ÕXó½.^š[÷kÜ\%�'næiŒ5÷Ô‡›»º‹š=.>šý®ÞH y›kƒŽXùøÇXp‘y¶ú°"[¯ T+­¯æ ×! dŸtñ–ú ‚Z¿dK_úÝî>ö3tš½;ÜØŸZ��bޱQ?pÀ�¾ÇG 5ãƒS¬!ebH­É"cNë ŒÒcÔ•dz#rí0òL£-G*Æb¼ãÁ8zŒqLCAËLŒš`’?k©`<’'é¶�†¥ËêK+1–‰292Ó–$(ØŸJXª�‰’ú‰�“"i|?F�'�”ƒ�X£  qì÷'”;B’DˆÉ´#i„ TkFŠy£§˜CŽÒB`¬F 16,ÅYC*[ËIÎ?ÂBŠ«‹q>4Áš‰# HpIá6—„„ªNïg¦“™‰ÇgŸ?:ÕVͨž¨–�ZdÈ陉Qd5ÔLH°‚´}ö’ÁyŒÙf?c¡¸žqGÇ’„QVÇt%p–”Õ:EH(vã«Ù×ëÆI)uNBHÎHC”d[¥˜ìQ$™‘yb2'Éš¢±tM0:�sb F™p|žŽ«Cª�ýÞ7Ü‚—üÌ!�èm1‡Œ6d˜½|‚ͼµþfÞª’K:Œ&H$çxð€¢9œÁ~½ã£:%ÒBÏ>À®)ûHaîÝs@ƒñRȺ ¡E¶\h‰­þP²¤»½ _êå¯ÑÃ, }éî©Ó`|Z(ÉÌ6‹ÇbdÞPvv‰Rui¹!éØ92ËNŒÎ´…�cŒrD¡1½”Æ 4æQ0 ¶©ætÏ$Ù«cn”[înÅ£”e’ŠbóGé ì^0{ ÑãxfÏ¿-ê� )¹EeØÒ¨Ij¡£!·c¦”P2F KI£${e÷�Æñ‚#¬¤Œ®©Rd¾�·dîºÓ�ùHW�V`ëÍ�h©•c,ôr8»—ñ–{jå0󃞲ÆÓC4!lŒQ$”ÄÖ|€™7gÔ@nïr­b`֌ߑţ Á‡ŸãÍšù!f$£Ì>F–¥Ä†qRHž�Îg�ßY Œ +á¹v�… û†Q=Óh5ä&�;ÃSF*a…vz5ÆB§2?êm©„å٩ɵã qŽjd†�žbƒQTcjÕ)£©Ös•2jhT ’•g÷Ç–Ðì>�‰ˆ³Ò‚ÍáHv $yì¾YïfÁEZbôÙÃK¯ñÍ… 4k!4Û²¶øÝ�—‡�ñ~ÉVõÅÚˆ�5Eç³÷\1ZÄç‹.¥$VŽƒÜdu y¡ÄW9BÖÏmÏ> §F˜+› ɵåüb-!ÏA2¨,ö’ ó…ðjxª-$”¸‚Ñð��Ã2l0’¨–tÍÁØ2ülKgöÉî'�=e7O…,Æi¥�ô‘$–TK#~Æ¢Áù4*Í~|²)/蜩÷ÍeùÁtH ©¥}óÔŠ‹Ká›ÔÒ3 á‹ I¥Ž�ƒc¬hl‹­ärè‘MUÓÊÇ+GÊÇÊ)uã!B2d�2@<ÌhÂØÙ|Œ.ò™-a,c…lý�ôɬ±÷{Hm˜I'|&¬%Œ¥*—–ÒÈmÃ�5ÇÂøÆœ�Ï�TNvûtülȇcäTŒÅè_Î(%›ÙÆÕ`‹¥ýs!Íl(žgÈ蜎q{ö»&b-aÄIŽ)r€|<�¼Cz÷H‘Åô”¦‰X+B»öÑi¶Õ#ŸÊ|-d8ÿvÿ“,0|½oÜöŒ‰ãz@þ\'Í€XCY\˲…¼¬ào)Jµ†¬$ñxæ95Ôù F!‹&HÎBþOÊuŒÌ~cŠG‘ @fÓ$1©l,FŸ9– pAÉVBTÉ(HOIG/.PŠ/-$Ù·€x+‰ùR ekÒy$a¿ '&`|] 41Èœ¤˜Ÿýb­xC�I–›}ÄeŒqÓè~D2å�jd¶�‰Òçn˜@9 |d2‹åY,'ÌižFö iöï¸÷ðƒô½IM� AR„|Tê‰É4Èâ7r;ÜC’PÉdy\JÝ’dJ(£&–�#ù#fðQã˜Í`,>k(óØdÁ†üTJ‰£!¿k–šßéŒñ]cdëë2“Ûú�üŠBrm3ð>I&òÔÌ!wG£‹¹Í4¦ÛøcDµìüBÈ&C‚J,¿´²Ø�þÀ"þ„Ϥ‘JŒ"æöLǘ)�O2[ƒt¤Ã!¹b’4c¾œ] f_ãàû!+ÆØ£øäH°`¹üž“g�ñB²�8f³‰•Ž$™ˆ¯ÅçÛsa™#…æû Y‹‘ú<¶Æ˜?¦Q{H†EØC�gþO?2×OøvMÇ£X¼`ñU� ^x²�i”½‡ª›+hm±¾‘Öû7øä6rÅÛË…æÏ7‰µï¬ iáÊk‹i|1ºÔAJk�$}k±Øúd›T÷éZ)²ÊÁK ?n¡¤ÖOPª/.“ë®®Àh8]»ÂþY¿‡ŒI?ÉòËv_XübëQM?1Ř?0¾ ~Gô;l $Ê—J óp{�Â|lS…¬kòÑq�=¤ÑKv‘Ñ*»ß°HLÐ85ÆfqMØú Ù– ÉQ9v?%)ø(ܯ¸²1¸– |É�—8`IÉ¿ÇXäý…Í@òKÌN_�åã½Ðè2Ë!%ÿv¿(æ#ö'—9¢Î‚4ÉGÖ\Y YlYe6ª¦Ô’¯¤gR…£”^1H øQHž�Ôù…@ˆy�ÓHž#®Ð�>_lñhŠÏ…'gC^þ²¯eæ‚c©ÆRò;gJÕ×–büXŒc÷/$k$îÞdm0š ܤAÕÂá9RL™|*dðð;hä<×¶a¢¿ÉjØ-¤¶…ÐÐÁIVð•ˆ2[ÿdŸÅ}s|Ä`3-‹å^*û“Õ*ø»�i®eõ—^5a?HáõjéµÅ�æ¥ñÖÒ‹ �-€$�2'±ü˜þ^3N.93O¬zk $«ÅÌæIÀzC#¦48‰ÙíSðä3;'…Ys t¬ ’íbl‰=�Zc´9rRzò¬&32ÿœ69¤v”øÚqd,V >ª¬Þ  ¿¨l;9­Ú‰¤:_¸PýšjC1‘Ý_®ýÑfHéóµ7–BæöI> °Û>y5¤Þ�[±š`| ‹[£aŸÈéþGÁbr~ä �oQÙ}€„ÅY_d_à‡)ç`¶Lˆ’Ìú 4ÊÍòŠC,‡ )ÌV7„§ÙR.Âb§ôû×IVRIlýÂ&á‡hdø÷×`½`MÁ?ËEݳH®Šý½·âþÙÀP@Öœ¯:¿ñdXïø=X;�(€LŽÈl�â䲬°ÎHJ�ýNÈòëYÍìa�šQdñŽV£õäC['£–å|c©Ö£t¶>qý””RG°+…²šƒÅ$!œ­ƒ kžÅc`µ`ŸÒ‘Ê1@Gà:ctÝ[ÏjÞÏ ½$ä…xo‚/êös­Âê�0sÈÛóC}äg¸ÏÌg!&³\ØF)»´ë ±°R\ùh’'e¾ù¡ànÉÇXêc-))Í…¦XCò2†ZV—›dý,Ñ›¢ ìx¿KoÔëJ”…—hŽz õ®›Þ7ÆŽ$Ëêt)4c$$õ ˜\Vã°{„<­øÔ< ¸Ž§[i}Á�eÕLâºn‡~uןú{ußn‚&ÉõÃSÇëƒâ,}$Õ 7¡éýµRí«¥„*G.0Î =ÈR` ȱY£à7©ΪG…ÕÒ'¦AFИÄr‚˜ŒQjt²-òO5­tê S oŽ5Eµ«µYŽd 9ÈN’Xn ) ”Ú �‘–„ä*“Æ“¯e1 ˆÊ `÷Ìg›äø†æJµ×VÈ$Å\8š¤à�êï¬ûØ/�zåü$YP’v‰)�üšdd�äÛÑ@מÙìy|'â5Ш-„öýð•è Å–:ð‡ÓFP‚œ ¡ÞxÊ 2;¦“Ô4Ëq •B>ßÇòj  HŽ5¾h´•k‹µÛ$ËÖ‚Šz²¸àæê¡Á}×û¥X¡~VÖ´~­€€¤´^ 6—Âslá·%æSÐÿ€äåŒÌÈ�q€ŒDÊñ l-�€4Ÿp8s$ÇêjVÓxë|5>r€ÉJ²¯Ã÷‰‡™í¥[C:õ:¤Þ9%ÎÒ|�ðãƒS­±õ~G,i�1‹¾%|'«÷,)þQœ/´2}äȨ;X¬ž��|¤(ï¬#™#H| fd5.$„Ó¯Š~ÓqçþãßðåZ`5°ŽQÇy錄1޲oBÍ[KÅø’шE| ûÝ�HAÞ {ÌívzJeñ½'cNÛLä¢ðß� fõú5–å�[AÞ‰iæËɇBÚ¸T¯;Bª–Pe§Rý›Ý6]ÍoŸ‰<=C5­z‚!µÞ$«˜Y7™òåÒÞ9|ç½m„>J*‹~&É?·ÌRÊM¯ãû^íæû¿ÛExÇ–O7JµwVCÒP/…X Ä š1X"ä«Â‰O7Hu®•2š'!?BÓGBv\hþbßýl;Iª±•Õ9UÌì0åG¯/�ßÝ$µ?Ù)w>Þ-·ßs�\‰I²�Å•ÜÖi¨KIº’•ˆK@ ô9S~ÌžJùÕ%RõÍåâ±OÖ»{ê5èeÀ.zèMõ:³+¬)Âp°ºŸ$äÃ’F"ßPPs²ú Òg´6™Ý£Ïƒ~‚Sê ³º²äèÛ!ïå1ÿ�f�š’N� ’(·–c*ÇÀ/#ßAO²í°Iȸ˱Uc€>׉æRh–�wtŒ˜5¶ yG䡆#EÔ«ƒT3z»Ôį̈Ÿ¤–�7Éy Œd9\bÁäz$]Ÿ?šd| ;fpmŸlàÎüÕ�?ÿOýà¯;…Œºñ°?o5Ü}YHr#�õ" w¬sæ'(?‡LTnÓ4ê飇tôô"ê'QÿçØH‚¢/©e½¾ôRX¾ÁêuÈ¡7nH`1ùcÚñI&¹!–¿2?I5T)dÿÎ-nù>IÜ¡^�ζS ñX00‡äÉH’¨g6ä!Ÿ c1­ÖIJaõKÒѱ诊IEc Nx›òK‹€3¦ú rÓ5×—¹'§uOA.ˆû…8!U\["t}·S<ö`£˜ß?qQNo›,6¾µ’ëþzð]Rqß,1±Ú‘c1/�å9E½ÎXJë}¡ýñV¾óñ6©é£ $·û(²W²k'Éu–wY!’OƒtdôQÃU½³×[ü‹µúîç[HR,<ËV8m…z]D½Ž8Éò&ôð_ËÛS.•R?žÖ»7ȵàC�#cËG+i-¦z=±l õ™ÏE¼€”´\ra�PûÎr¹ìêb9éø18yþ�°ì½ÓZLºìÚ¨‰'&@ÊVˆš( ÈÉÌߢG¦g5<Ö‹’fƒ=!Cißïõz†ú5Ô+d¾L*šC=BÔn! # Å Û”ÑÇû Á7Ý\)œùö€rå©‘úy$o_#!¤àì‘‚?ËAŽX¢¦“�Ô8"n2N@–f"êsìM©ÌI ²ÊðŸùݳ ÁJRœèàz嵓¼æïÒ{J*«ëXþK2V¦zÝ5ÞI8æ¶N—K‡ç±ÚyÕÍYìþ™$¨ÆQ�5|MÅÙŨéåÊ«Káù–O6ˆµï­+‘ûæ Æð¬~§Ž ÙÆÂÞYÈO¤�ľù�³ùZ¬ŒXvi�S倘†ÞµÅjï¼S³äœSΈÓTK²˜3à΄VW²˜ é4½kD0Rjëƒ]JÇ“Ý@… Ç€.Òæ´®Y\Xìj~½xì’ú£ü6­e"î0 @QêþºKÛÿíÖ×õ:r#»¦¨× -ÎÖ|dš-Éh2+×]_©t:«y]3Y<ÒŠÈA!ÇNý`‰ï¬«Þ^ ,"°ÎT·±Z R…@ O¶³z}�]3šúûJôõºT{y9Gè¿!OÇZEdª×±^²í OOûkì>ÂN|sûf«9'¦Q½îÏêu`!ؽ¥¾sñÐ\ª—ñµøL¹üäB’7BŸ‰�Ãóäîû{•᯼åóÏ9qð7}ÇÇ› Ê®y ËŃYž£ÄXðjœ…Iú”Õþ̇amâ=@âõ:r*Ô�ˆ$‘¹*ô3ÐObö W½µL)?³HÍ;>M¡z½šêuH¾â=R½Ž"ê Ôyð¡Ìƒ(¿³ø2ôÖѧ¤Z�å¥T«CR½†¼Öi"�GÌò÷6-Çw½ØÁr‚ådX§Ô³�ȱãŒA„„Pþ $º”30Çcµ²§ücGBÛ+ ̧×NB‰I³ÃÚ!ÜHNï äļüš ¡´=v‘;ŸïÆçƒD8b¨Ì~B…#dÇ �¿ ¼ßÊjìª+Ôs% ¹£§æs·rC¿î¦Xh9®Yá™ùÆügCL�l¹ IÿxƒØyo‡Øúé’¡Ä焌eã[k$ÂAv:“”g×W{Ô¡¯}pm„ãï­%û,;»{4ÒÑó Hj­êÖ2)wØ™�.åƒýQ.ÔþUÍëuÆ}DLB_CË IYÎ?Õ { &LGÝÚï®zk½7ôâYÎ|—Ê|;ü"I¯1û#ä!úF�»c6Œ¤h QÚéü¢Hˆ*“jû°4ZOÔCÏi™&Ÿ™+U\Ylò_ì÷CJ9czÕH›aÿ€jhV!' ?I~ðâ¬Yò¥ð�ˆÿÈX]nd¹ Ió³C}NßO{‰mÓ!™*UßZAýˆÈl;äó„Uˆ-cŒ`kàp”Õm„„hœ.}€âG2��··ª!›Â~N8¤¿Óm�§·ô;b2�ølÆ×HˆàŒ‘&YËw× Ï,PXî"¥¢GÊj"ô< †fŽ¥òÔb È„ö/¶ˆõ×VY‚ï…ü±T~}1×üp°Q&¹ëÎéèWÑòn–¯cÏ >ÊPÄÖ7ó™èÍ’0Èþ)´çˆÜÿÔ�ïùÎEdµ-ÉDz|²�ð)@bà¬úD¨ùÅè£öÔÀßY=¬J¶òÒ›¹ïÐó4›M,ÎèØÚØšºý$œY@„#ð¨‰Ðc`_·†´/j Úã@ÿ’åTbëý­JÅ�å„`×Lhûb ×ÿÂ…kûr“®÷ù6äiè]z³|ÛsŸ!!ô¬V×ñ !œá°wåéeÐøPÈ>ñ»턾dp"õf°wÛ¤ºr˜‡G ‡¥ ¾gþ}Hå¡�ü¬áèðȦÒ^y¤©×e(éŸOrÕɵãM2É#)`k ˆ ô?•hf¿Ì. ÑÅÔ?Cl­¾L(êÛÇ™ÎVHðSÀ™°X�¾3aÏ“+¹ÀKœ !dÄ‘üÿFBt?Ü­ô>rÒ›'¾FBè�ñd3èC¦W�G~$î�šó¯Hˆ‚Å8B:0»1¦°($m¤gMý…Ü®™¨ ;ÀÖúï”ÿž�Kv]æ?T*×ýãN¡û{¡þ½UÔïO(Íü°ëTJȵÇþÖ¯J~¨a"áiXlÃGâ jj Ø€º‚<8ßûh'I CÒµØÜËÛKãyÀ[Ãê~3Ô9Ø@=ŒÚ��­p€_>tÿ>A³g³‡f×¶ý TÑkÕ…åÕ<Ø^ôͰ‡…Ÿƒ˜¤eQ¿²˜‰~!°u„à@/u9°�@2°˜‰œq5/ä*q]HÖ³ÿåný¹_ÝØšZ$6�^n�÷5ÃS'H QÿC‚š�î‚æ€¯‘gŒ4½Áü5õ''�Äý¦}�€(+ú38Æ ×J‰`ñÛè ;>$‘üå o¯SZÞÛJ~9'z�@t5Ü\-¿³y&dqOá„ão¯6É�ÖL¢}Ô‚6g죒UúÞ¸5ªy!}�z çÃØ“P™q…cè\DjýxÔåè¡VGý „'ò?ôÐÔà䑆èÒÑ@Vaïò²Bãç뤬�i\d±dÜùøÚ1°O­j¾o¯—Æe÷>�Û>�—Fû¡È;…®G; 7 ùrô°t<ðC±ÖTOT__�3_°Qáp‚µÄji|vµûî>±áÃu*‹mÔ{O­r¢ý?œåÈ�lk¯3×õp›Ô÷­!!j¯.…Íp !R~GBÄ�4âÜrHê«ñ¥cÑ[Ó±õÄãì Ë5 ™ÍS 8 …¼1$yzmZΠEXªIµãIŠg. ûçÂWÁ^ÉAþôÄíMrÃŒ¹ÝθŸè¿Ÿ¢wΆ¤±¾ùÆJñÌ /yà¹î/ÐRäk[ïî0 ßÓÊ]÷÷HÇo¯‡o‡Ÿ¸C‚½K:9ÓòS‹P þÆžÝk$„HHˆ¯¶Ëý?º+C¯¼øáßöqÏvJ%Cs±ÇÃΡ?œbÍ…ؼFBm϶ª¬.ƒŸ2ßP}n¹!¿nÅwËäÚ³KåúwÖªåç—PŒ|€Å:ÛÃü=î•ÐþÉV¹ãþn©ûîn¡ûË�¸¿è= ®ÆÞ�¼uѹù\û×[øú�VŠ%Wç Õï,%Uqy�“bùéùÈé(7Ç>ò}à çJÍw·Jív¢æÒŽO@Ý€ýzÔ=´>�Ëãܳ ùø­�J×ãýâð7†K�ü g_ÈBÕÍ%BjûD!¡Î‘‹«pÀ„. ÆÒGô3óavŠDdy[/³á×d¶¾Ñ‹Â~‘—;¯Á÷V…å…†²+Ë�Eó(Ÿ9R>ç5€‘P:¾Ü-×~°†Î3`ϘÑß÷z�Ö.÷‡kþp�Øøö* !ÔÔÔƒ@gŽŒ…ͳ %½ó •WWàL‡)§éšN½wô�KÇR�=óøÔãÔÀDn|ÑhÚãI)uD½CëýJógÛL5;‹ßi8ßqa±¡¸ozö„—¤}è Gô€p”ªO-O?>(ßzh¼q7G�}4@ÓY¶ž/öú{Ê�ܹÎ6ÂÈì¦OÖCRÕ´¼ËÐÿ7a,XÍ–V7û¢\3«MY®žyÊs߸  ¹XØ;Ó´?Ñ7�?R3¨t±ìÝÅ„„H­GuTåàBô¼Ô‚¶™„„(4!!”ão­ö�$óYîoH`õ@^·3á×X�J’Âìߥ®.RÏã½TŸt?wÁž °=ÀÚñ ÿ ÖnÚX»ÞöâÜ�§V0I‡Ó9ƒŽ™ Î5à÷C½åÞN¥çÙ>¡î£U¸°ÚZ{©¨ÑÑKCR5†|qNÇtH© =/wÃÞÝY>è¾çáEµ ‹ï,ΫQ™vFÄ DÃFÀ¿â*é\±RÐ0�ä�±w„³e8óÃ⢠)åòkK ¹ý³°'„ü—0lØ£Äþ »—8+Ÿƒüø<5¶`4õúgÙ( �¬Ž>=W©½±þ�P @’gÆê×Ê«$Õ Û•RË©¯Ž¾‰±ýëýÀÓËYíSQ“ …ó>¾ÉµýbsG«éHÿw„#î-7ô|�ñúA~þ)U¼ôR�}ªƒîz bÕkèíáXuy1°´Bï7{�Ùºžî�?\¯½¸H)šCH]ìù§5LD�NŒ.´§=ØABð¬~¥}¡ÂŽ™À—£žÐ·~±X9>²À–‹(±c62M,º08hBË´³ZåÄ ù5qçñjÏ/NÜZ‡˜m(ž‡Üïu•jÚ²Áùbûç;ÔŽ®Jçƒ=BßW`í„×X»SÏ}þw¬Ý`íp“ÖúGÌI¾êô"B?±ø�s‡@&©èÌœ>PÊhšHö_õÎr9³k*ìþµ™ØÿbŸTqz! ÏÌ.šO9æÄg6ŒG¯ga„´cãuA VØ3“Y,G¥ô=ó�Y®ˆÞ'‡˜ã<,ò>B6²8œÐÆègJá,÷@?6™`:«F=p ?k®/£>ó@¢ÊY ¦3¨S�³³:ƒÎèâ,cåÕe@Ðù ì7`åP’ö©°¿‡½!ô(pVA-èr¦såÀ7`¨°2–G%W�"ãGÐQ×�L9|jF<3[§ý†^­!¯iºZ~z1Î÷Š@8"g†­ö=tþTßÿí:£U0 g qF…úŽm÷7£g zòí¨‰±¾JÎ, 3ðû¨g«€®`µήä4O£µ ¬dݵåÀ$+ù=¦Ï”×7K¬¿´œë}¸�kûbƒpôìýlàtП)¿¸ˆo¾³Ž;~{õM€�Š>ê€>2a&+®,ÜPvf1�éÃ9pœ]ÄÚ)=?�ïûi�<øëA¹èÊ:_|ò²Òáy¬fXŒ Éå󺂭ÅuÈ_hm`5%êîôñ¤3ýõ,¿A® NvûTì{bÏO I£¸�{,D$�¤³­Y]Ó°G‹Ú‡�úøø!¶ÄènÔI@Œra,—Îr–k>[‹¼CÎì�F±9:ßžöã ”‡E¥Û©,’<�—( ~/ýԭ襖ž[@õFÕÕ%„.ÉÃ9pvÿ�⬋³¨o€Òaö¡V_[¥T\]†{‹=kìÕ:}Lì_¢_ˆ3¾èó Φ¾öL™ï¥½|ô°ð:–gHÉ%cÉ�‘„½fØhíõ•„ @?û\…=sO]wc­Reê8S?±u&0ðâðwî\ïó@8ʉՎbt–Þ3Ëc¶û*#¦%Ö9ÑgÅçaµlþ½mžùS®ûÁôUè3å°÷ü{ ³Ÿ†[k ƒ]}e)ûÚ"Ôl8<�Ðÿr7ôr7z¡báÀL© Ïç¬ÐëáÚ¿Ü$WÝYE}i¶6p^õ6幕gb¯˜ðìíŸn‚o€mcÞçEØÏX*—ž¥ó²Ø_À>/z8�#ûh­0ü“›¾ãñ&9¾j,Jg%ÑSÄÞ5Ö»\za¡’Ñ1•Ð,i�“Ð+bk`íeÖÓÜíý'×;Ê™ù7µìä"ŠýT´M£/°“ŠèIgÔCsmq}4½o˜éL}@´%zK:ßh ôŒ¹¨,[.$Õq`J¤ÜîébÝ«…_nÀZ~ŒÕõæ:æc‘ãl.!è°_–Q3h'œK‘jo¯2]ƒc“Sé=ã RåÍåBÓ½ @ÇR=Ï|+ìçD} ºæP]ŠüØV+G¯-Áž¢©00H,µüÚ2©ñ£õ”³"Km˜HO:'we åAè ³xI~!·sìEª»½(.ê_2»g×u!ð ÀêIĘÐxc5í¡àzWöÍ£ž ö„°ïˆžqQ÷LÊŸX<㻿Ü.4ßZGûVÑÅ@�aŸ_©¹´ý4±þö U IßòÑzÂ÷5^] ¿Ì·2?M±ŽÅÀ£C,fŸYD9-0À•_XD±ðûýúþg;Ä’ÁYø^ôõ�/¶bOJ¨ýhê®íá&yð¥§0øÓ~¾ãéV²ûšë@¾­ç;îma1k=ü0öQY}¼=o¥èä\øÄµìò©þú ê�3}ú©7ß~o³ptp6¡Ы ‹²¢x„Kï»øžŸvŠõ_¬Ãu„ÄV±þã5Bò1'1½c’T|zŽÐóÍ.¥ÿùAàѩ߈¹.Ô ØóD>Œ~Aþ€3öÅö4«’{f¶šÝ7gÈýDÎ$ÃW_eyÄ;+)çÈ?ã,œ�-V^]Äg¿9kjË.¡~,ŸÙ9IÈ;5“kº»†;ý·ýÂÙ_=u§ÿ¹Wõ?=ù÷þÍ—ÿே„k¿IÂÉ¿ypCÛÃþy¯tþG�zóyˆá½'±êûϢķ¾WÅþŸöIÍŸnñ-éœgŒL·C_‚ή²kä#[§ äêwVJÝÏvO>áý‡ï)‡zïqþ=wµJË';OœPãdÌj§kŒº’ïx´ý¥æÖœËà;mú‡jN–ÛKC߇ö{Ý+v}³ û&xWD~®÷ÅHОçÛ¹æ»Ô—–jÞ^ÿÉ~»¾Eì|±˜G`r`gjÙ¹ÅÔK¥ó¢Á�áO©øÌ<¡þæ áøçë¹þïvñ½Ïw ƒÏ÷+ÃϽäÁ§€y亾ކ÷ˆþ Þ;×þ`3ìvÍ÷|»gG„“?»‹ç^h�Š/}ÇézÙ®o{µ™þwWñ�Ÿ|•O¾;"ýéûHõ�!â•W¢|Ž=Ù÷.>ö•.<×+ž³×½â”«Ïü¤+?ˆ|Ý«øºOWrÍO7j‡ÿ¾C¸öƒdxçq¸áÚ£ä2†S�9aðg7ýÐ+ÔJ@!á¬�xü“Mjûý=ò•W²tá'½Øò`³ 3:4_ìz¹KßôñJ>ö¨=ên¡ëÅßË}/> úÿé*Ôþi%0¸Jù»Ë ÁÖþdíi}{)â1õ;ƒR­QJõŸ¬G ¥<äø•²ËpþÅØûÄ[éýÉ =(±äò|V?Mr‡¦ ù'grE×f{·>Yå}ù¿öêßùO=çß ÜŸþ§¿ðá¿ë?ÿ¿éîýW€ðêòOß•Š/ÿ–%Üÿ9Vúè×\;ã½»ùêýÇYò­_‚…V„w~SÕ[_Go~é{éQ€±ÿ±ÖÐöp¯¡óÉ~±ûùæ{¶à¾òµ7—Š�¯vª/|üžðJç7®JÅÍå¨ýòÛg2k&û)vô-œ'7`ïø6 ñÄ>â£xæ[/ñìo>ÒÕo$éêKYzçÛCÊÍ'!òío‚•ÓßòüП]ùޝ·èûØ)�ùV+]úFÙ=ä.ýÙ‹»øOOñì_}ø‹ö‘.~+—~ÔIo½T”Ë/TõÇ�~·?;¢\à'ö}ëªïþj+×÷£ {î„͉µï¯„]ÂÆ„�\åþWîØ¯•‡¿…mzO>æ�gïËbÿcW¾çùNø>©—ù¿Îç;°gÁõ~·ƒüùÿeí-À›jÖ½ï©áÚÅÝÝ]*ÔÛ$M²4R/(ki©;P×TR ‚(î¥Pw7¨ þÏÞ{}3‹ç9g¿çœï¼{_×›\‹¤ISÖÌÜsËdÍï¯%È9Hä 7zM°ÛÃÆøÍ�&øí�\òÑ�”z:ý@…?ÿ(¡^õÝï±Ý‚m,èÂéûÍRñƒvKêA‡˜¸ÓÃGkÌ‚{_M„…_9ØãÏUôñ�ðíßͱç_iº²ó¬¸²ÖÍüU©£ù“Òã’‚Z)™×nBæô s£bж¢XÀƘá/>JèÂ> •9¤KA_`y­ÌœJëÒæ[Ú+™Z�UF”è»P³7o�¥ÏªDwúÌè©øæ{‘$·—ä5tV»¡(§�C]í3¤‚­A’VÔ¥;+YÙvVF4¦hÊ_Dá<�*Û&Ê~o(Êú`@döi r¿h “‡vñ³¿íãçþ8À{Ë`ü6樰ÿ�sâ¡Æ0z¨çÖðåÞþÅ™üèG ~󑌔EX÷ß•麑(n õ}‘v7G˜÷TÉw½H‘4ÕÀ~¯¿ZÒE}GÄeÍç¥/[N‰ :$ÒÛ æ÷«ì-_9[<,;)¾[/År¾èS;wÓ×zÒû ‡©›.¯ß…ÖÿК1�ÓÁ�~ˆ'½R/´¸Ukcv£^ŠêM"ë½…lár·q»ƒ/.l3½h<"yÑb/,øÝ{øEH<’Òo»NÒE½GȧRâá E?{oE½é:B}²!Þ"+úN’åä»Ïvxñï6øëof—_h¼ø“YÕë 骼$y_$ª­r#Ÿ}° ú…D޵»üé šäÝn‚zð^,¾ßfAÝm¡ÈÜN#ìj·6�ÓÉ•>¬9„ì[ú¤ê(}»ƒ$nõš׺MèÛ]„ø^«ý´Ë¿ñÕ+øhBÝìÂðÂ÷ìa/Ž¿”E_m¨Ò>ªªû4YÞ{‚¬ùp†¬í>…?“÷{I›ðç"üî!öpPHßm§‰7mÖdsÇYº§-Ðl¨O¾°Áó?Ñ0†º&ÌDuúN“õå0/Eñ­Wñ£ë×ñ¯ý]›.ì–HÞV;Ù>zá$InÔ%#®Üü®‡Ýúf$|ù™Ä‚Ü_5…‰Û©ßv‹ÒG ¤9˜Å�º#Ò·%.f•%>–åoýÌ‹*\ÅÏŽInµ‰D¹ïMÙ\åÊ€ªÓç¨ì!˜n»]™'LjØ!¼ÿ +ûfE |ö*�T„ÑŸ>S¿ôÑŸZ‚©¯ƒÉáAñpeÄ‘Î\Ù‰ö¬øÀê°¤˜ª ‰‡»oÆãÿy‹Û"}¸'7ï+—‰û;Â$ïÛBˆÆn'ØŸäë[êåˆ�0ç»–5¬!yÑê`^\å)}Ôq„~Õˆ¸7‚“OzÅâòVgó޲pqe»ýºÝ^TÖyZRRë"©¨ó0¯{sATÞ~Vò²ÑAô®ÑA\ÔzŠzÙmK¼î±¿h†öXc/ySqR\\{ú<3Ó˽»!÷–ñå ›ù·ÿ¡Ã˜â%ƒ‡D]Í�ÒÞªHé`]¤¨·õ=Ø~IÜ×Jt~pTüÍBPñ‡9Vñ‹­°æ‹ñá£=Ò$ùTeÛû Qü©-œ¨ùpŠxÙ'%¯p±èw‰ÈWð¸Æíøµ�Fè5ѳ[³—ÕŽÒUÒÂIA‹™ô^�•YA�ù°KL=þ ÅžöRÔË[Ñ›–âMÇÅ�;íD�Þ[aßM°Ã|Æ_êe§­¸¦ÆMÔXï-m«½dÑ[{äCAª}çµÔÃ=÷’l_&ІëƒÄ5�¢ÊgâÕ 9UÞy’j¯÷6ï{k=ð"áh×͇ö¬¤³Í©IŽ�Iñ§ZÓåG;sã͆‹"É‘~aÃ/Çø~7Aë?âÓQj"¯« ðŒˆ¼aCêÊ�!òm(v ½Ÿ-àe|ÜN�6ÿ.Òª«HfÑXbÓý4ÁºûU]׿*,ùnÁ¹Çh ž-æ[»Ž214a«(ò¼±H\ØdeÕý*Þ¾ëVÚÙÖìl»Ž©fÍeA(®Q·ÚqQ^«©¨öÓërGó¦¢`髚ÓÔµ6žäV‡ùê}«ï±®ÜDhs‰)åñÁ! ÈmúîÄ™�¼‰–|ziÕÿ@æÖ$cm2·Â;îN…W\v¹_¼C{F‚Ú­Moaœ]×ÍDÉPm„x¨=Ôºçe<Ù2ì¿Ïã¹ßõ„©½{HÿÇˉ+_ôÍŸ4œ‘<î¶Ã®þq‹(_Ï�­[/|ö�”vÖÛv?K:üþq²Ù@] ÝÑâ+îi¾dÙW'é© %˺í…ÅŸÌ�~ç Ÿöádiç1²¦ó¬°áÛa²·É�‰uÏãxQ}¥›iá¯zÜËõ[x9û8wà1Fü¶ß�Øw\•gVû&¦Ôø%…6\JñkˆH=Óž‘jÛ{/Qò¥&Zü¹3œþÔ*úÖjÝ÷ îtkFò‘Îüx‹ÁG1‚ú‡y·×&¯አ;aœÖ£ƒ¬¡"K¶ Ü•Ìí3bcîÝ }æ×:0³«MBIz—!•R³O(ÝŽç}Ô¿ì´7«©ô•TÖxÒ�û-„9¿j cË6`o×ñeå°'#˜¤±Òïð‡§)‡zŸ%K»+ÃDÍF*c[SSÃÒüÃRÓë|ä��a™’޲‹DS׋¡R™OKTÆÅæK 1-¾ Wë¼d¹ 17jÕ~%Ý¡=/;ýfº¤»>˜(û|”_ñ7‰°á‡Vû÷#Üw Ïä£ËÍêÝÆ»òq·¨´ÓѲ¿,ÞºïE<ÙÑïF–õ'+ÞŸ„ù³�ør�Ìÿ`,º× ¥K«O™·¼¶ëº�dýþqÜ‘®{©gÛ²²][eòÀú�8÷æˆØðÚÀØ«ÕÞ²Û�î±E�ÎQ•­N%u磋k\£+œ#kë�#+áÏÕµ.Ñn1÷+=b¯VúÄ…WÉZ²͆^EІB¬z˰¦?N 3|üÞ?äíoòÁ€Hô°Û’ÎûÈ#3¾êˆózòî7‚®ìv” ´…Ó=�TÏÉPc”øSu1ÜïK~,ªˆ6¨•‘=î‚g¿ °§0Ñ›†cÒ¶ò‹’¡ºHó¡w2߆ˆôÐæK™gÚs®X÷<‹— ”Ùô=K<Ü[�t¨÷f‚KGlbd½ü�:wYI£Ktq‹sÔ«V稷ð±¨É%ª¨Ñ%êi�[l!œw™µ>ñÙU>ñéÕ¾ñ�µ¡‰ÒOo"¸• Í‹®X%Èc4é»Ã"ñý!KÉÝ^+ñÛöSæe~æ-%aïËbEïZO s‡µ±ËƒÚâÜ6¡øa—�äm«£¸Æä—_¬$ �¡5!™^õ²L‹Î]Ôy»þ›¡ µy‡0ï‹.ùx@D·µúžmMÏ8Öy3Í| ú¢óÁ²Xñ׿Hë¾Âøómñ©)�ÞòÄF¿T‡ŽœtÉPy$ÕÝäc×]�ì×–âß"Ojô–ݨs�AGA­{ì#8N/«Üd/ʼäOË<ã *ÙÀ8~ˆjíö´{_�ì_žzç­·ìe¹{lá[ŸøÛï|àg}dOÞyɲKýlz`Œ,‰Añ5¸&Dþ¤ÔSö¦Ì=:ú¬ŠZ—È‘6§ð�ð(�¾Î¿)$QøûG/ƒ†oú�9{¨çfü•ÏÄ’¶sQ�[\e…-®qm�é¢ïUa¢ïµ¡(ZŒ¼• †~u4zÆhpÜ#&ëvP:h~FqŸ@ vj‚­»÷ƒí»´Àæíš`ãÖ}`Ýv °q;À<tÜOÕÉùÛ*Ý&FÿòÞ˳2:6ûåÅø¯ýãbŠƒãåEAñYÅþ²¨7¡ `îp¢5GNô™õÖÄî*�ü(9ª2(%ó] <»Ü7>æ Õr”ç Zÿ~ÔìcQtv�wüKèßž¶:GßîtŽºýÞ9†úÑrÉ$ÿÓ6®³l摬™»,Vž€`.P³á±>_=f6Ø0{ÐÒ±›¢žÔWi÷^,Ÿ:̳àoÍ•f€)гÁLå…`î˜å`¡Úz°xîV°jÕ°�ç´.ÕL×Îì1©chaÏgñwŒ5ýyw©,÷�bñ;�˜we1o*]£Ÿ”zĦUû&$TÊ/Ö†¦úÖF¦¤½ L¼ÅŽ©¯,©ôBbLùÅË�'2¬û—sÄà€�[ktbCÛ¹Èæ§8‡’±ƒ¾†- W?ÿ—õú×U ].O1ñ¼3Ã(¬t¡aþ—�…ßfø€Ùm˜Ø´\ƒo–.ÜÏ\ÎX Û0LãÁ0ŒƒÇdø“:˜*MKÕ‚ ;LÁ~óh%�sÏ&h&�ÌÓmcôx_˜ãü_³¡ç‘¢�ÞºuÄOÔÖ(î{j÷áfâ…º°¤äw�qYoüe×ÞúÉ _Œ»Zÿ¨ÌSöºÜ=æJ™oôDzgo½d¯‹½bŠË=b2«|ããj“ÚÛØ^‡¨/].i¿ ž=Ö�Ãù�9zð-³MÛÿµÚ>±‹Â¦ÝÚ`Åò…`íº•@Ç⤢A@Þ C¿«ÓtìÎ+-[°L“À0¨eö®Û¥ï @ñÏŸ•á+`«ÇÁßRb_›ïó'®7‹Àzå[çæí2oÙ½¯¸w•n1—jC“©¯ÝAôçæ ì—O>N ‰¯Úa îtŠJhóJÐïe8ûÌŽ€•³VB;T…ç�Îm4<+E¶hlÆÃ�©øÏzÿ¿ÞÙÖ ßD=0ŒV˜ '�QŠ“àOÓÁÌ©kÁúmÖà``Ý þ0Œ#Œ'ôQ6âÁöУ×ä¹EþqÅo¼b®¾ó‹Ë-õ�ƒ>&æE‰G´M¸Ü¢ÿqT@UD²Í‡o=c J½dò²€¸£]9qô/¡Ôo­Áž­IuÎFÄ´{ÅrcìÆ¿ž»eŸ1X8a:lÃöüGÁ3DÏ'Â6Mƒ§ Ÿ¡ç ÿ­5ÿõ¦À¶îŸÛ­ïhìÆÁ¿7ÎÅ5û��àÎé:7˜Õœaæ0ÕÝ(}_nÕñ,Ö®#?þ\ƒ\îÜŸøêÌe¡M¢1”¿½�Ʊð•üËb/vÜ�/}ôÆ;®¥Ì3¡»Ê=Vü±,þ=[ãn†â 2Ç߃rFw7ÇL…#ôÿú†Ú¨øg� Uþì³£—�Å‹9`½î9°ß§n²N/£�ªr=[‘‘ò28þökÿ„'o¼ãù&>.ñJºWê•ðâ�OÂÛ—¾ ¯Š|â"Kƒd>5Q‰•A áÕã¯ÖÀº«ÚCv£Ò+6­Ò?žÿ•9«ûŠÙ®xkš¦íyÅ ë·ƒ™Š“YËžÅÿisŠlÿ+±vŠÿk~Zâ(øþhvîýœ‡ ìsôÚx½êD0LUY æ¨+÷Û-²u›]ìs�‡EßðüŸØð²àøcWãP=ìÐ’�ò2TWÂÜ+.>žoˆK°ëÊ—¡×ó˽c«aÎÞÜàý3×uŽJmô‘[ Ê`~!Ö<5zÞ¬™ÿ¿}¯ �në_¯¡ö*ýùÞÏv�b{fì¡qð>™�½?=êO¤ôg[DzóoÆ”Í`õ®£`÷‘[*º7˜uÂ>ÆÙ¦ãnÔ©ÚìÙ»K¬žhÉŒk(òM)/öNh‚cØ\â�ÒöÖ7½­Ü+¥¡Ê#áÕ;ïhŸñ�‹}âSJã�Fɦ0}¢;·þ'¿ðïÞþjçÿtCmû瘎‚÷1lû'Ã;Œ‰ª[Á¢B°Jà l§*ì»ÊÌ3ùÌØÚ´Ü¼˜ö<(þÖ‹€„¯}åïÞø¤T½ñͨ,óJ{Vì#¿_ì—Q ó¨Ž�C‡oMxŒï²„Z?™uï­HÃJÆhÍŠÍÿv;~zC%öœ•þiLþ|o|w<¼OU˜ ¦+Í“fÀqRƒ>iŒñ €šÊ20Yy)˜¤´L»Ìœ¡Vð»¿VÑ|Ãl Þx¼E㊠qÞÕQ â�•¡fÃ/Â�µ]–A÷úÊ F�¯A9ùè[‹ËÜeímçboÀšÓ¹=6Þä;c£›õaùC ˜©4éÿ26à¿ùJôó_ñÍÓ‰Ð+¡6©�YfNÚfOÛ f©íêÓw€ªÛÀ´‰Á´Ñ€êøõ@=· ̘o†&XºÙì0ËU:˜Ï¬äv3v¶­·Âìë®D¡ÜìÎó€¸û:ßúe·¿ ¸ü¾Ô's ÔÿJ•Ïå¡Zïì�ÏŒöZ÷”ÊJÏTTwiU3Û'+ý¿ñ�ùAÔ>”§ ñRWY¦*«ÃŸ&ÃQD‘ÆOÅ9З,Ó•WµÑk�ÚØu`Ú„Í`æÜƒ`ÑJ˜ûéz�ÍTºÂ6:SqOhßT“/ŒÝ÷ÚSþ28îîÓ I¥E>òªboyõ[Ÿ”ê Oyi±—üí[où�Rï¸7П¾,õŒG¯Ç—È´»ÍÕ4ÿí¶üå7‘�ÇzöÑ>Ãú‘±>ŸÇQ]e1˜ ÇiŽÚV0wÆV0kî~0g™˜·„f-€YKy@}Ž˜¾ÈÌ]A‚uFQ`�GÇD�wÌñ‡çž1ÏÃãØ¼åí¥¸GÅÞ2˜›Å'–ùË`ž™€j�Ûo`þs±òr�¸Æ·^qoK<ã`eÆßË]G#—lÙ c딹]ÈOŽa=ƒ2ûü§ü9DZÙÈd0]q&˜5n%˜5u˜3s?X¶NVì<oµ…ÇQ0gµÌYŒƒ™Ë10sLW׳gë³ïmà'€½ž�u>0zœAÆÆªõ·ḛ̂”§!qÏü“š_û¥”½ñM�1^þºÄCö¡Â3q¸Æ=q¨ÁU>ÜèžÚPᙂrRÃŒdÉ6ÓkÌÐùOfs´Éf�?cš{?ß›ß� fŒšæŒ_fMX ÔU×Cß¼ ̘ºο]`–ê^ ®¶LSÛ϶mîJs0w‰,Þ`V�­Öw”vEôNÕ(dVj•1Û9™C‡šò‚Púì…¿¼þ�Ob3§úJ÷¸®JÏd4çÞ7zduÕyft5»¥¿«ô„µDP´v#³oÙƒÛ6¶°ã‡â™ªâ, ª+$8¯Ôàœ›¦´¾¶L‚c8j£—€éÖ¶m3fm‡ö© m’fo6ó¶;€EZ`'¬¢’Á*< l²z¢¸7ò×é*™MÄ@Ù9§âôHÿ·11ÁoÃbËaîUÛö Ü3þŒq•eñ]•‰½Õò®wyÑ[¯„3õɱ:ï˜=³&Ïþ—Çí¯ù†ü=ŠTÓ”Ô�ú¨E°M³¡=Nƒ¯O„{ÒÏ÷çõ±+¡?„c7~ô›[ÁœûÁ‚ÅX²å(X¾ß,ÕõË´½Á‚.`žÎy0_ǬäÇ‚�f—wuNÖx̬â1‡éÞ·ž§ËÒÃüŠb£Ÿ>¸”Z÷, ½éu@vQ‘w<ª"ª‚äg[“åŰNh®rc×!E_^иÍ,›5kÿË•Ù\ åˆ0z)ÃX6~!ôýK€ºòbèç@‹œÎÚ¦¼OSœÛ·Ì¿¨�_}#<¦¬3¦Aÿ¿Ä,\g®·‹6K÷y�¥œX°È0¬³½¥¸#°qüþ[ÌbíFæÁö’÷ÏNÔgED½ ‹»õÜ_VóÊ'¾¶­¢È+æI…{ì‡:—¨O�®ÉCí®éUõî©i~±¦?ú׉œÿ¯cö3þÏŸÿò%?sá±p´ÆÃ¹6 Žá,ö˜¦4¨OÞÀŽ•ú0úË9ªëà�bÞ0wöN˜SrÁ¢µX´Q–kžë9a`=![?UÚÕ=açCf¶æs@û£Åal¹ÌQª0àPûÍhû¦œëž{±ö­¹òÌWåi¯/É�·å¥Xô—Åy7ÆfVU��¬q‰J.ó�ÓdðMÆ'ÿ×¶�bÛ3‘�ÍS€:ë?Ƴ9ÿxöå È_NS™s�¹p>ªUt,Ó&­³�%`~|ò¹ò¾¨Áéû®1 ³ê`#£iú‰9ÅûÄœ ¿”Z >Œ8Õš,CõªÉQ®ùÕ®ÅÞñÏJ=b++ÜbÚÊÝã†k¼ÒÊ=“°/mîÚ^åjÈG ÿþ¯ØæØ?c9²O”«�žæN]¯1ëôN‚•¸ Xa ÖºßW^ônÔæàò±[üß�Ùpî±ò�*Û«Æm iŸ°-¨yÂ6�Ò1Û�‹Fïö¯™¨õˆY§ÕÈì=pƒY¢Þ>C;ŸY¡×Èè53Bã.FdÜÆÐ‚æœS}b,ÊYP»raîìU�È%xÀÀD ž†äz�~rýoÍ>@;),Y±ï±KEvÌ�_Ÿ®óá™`Æ ¾’Vh�ë±@°»6ˆ¢À–£×”v„7LÚ›ÇÌ;ðŽO-³M«–Ù…üߞЦ©Ûír”6ˆBÀViœÂ.ûk*û¼+'íêPÓLü:÷à#f3ÌOô�~aÌù?F©/%~F} ­Z1Ï8®m%/²d%~ç]ÑwFôìÛaüÖaöß4©ü˜Š|· ž|¶  $ÒGõvâ7§ÐõNœÆTCª4Mé�{h=Í4Õ1‹`®¿Ì_ȋ֘ƒ%;Ž�åº.`?¬Õ? Öï³k¶â`ÅZ°r¥.X»�Û±P…�g�Þu¾dœVÖßëÖ1Ú†MŒ©Éc�}ùîiûþF´èséÁ·oÎÂÏ?\�:J?ç×µ†é½k�®3[M*·‚!ø5Œ…°eøÕÚèN}¨÷±xš`Õû2^ôñ}(Ñ8ìÌ/g$ÂÚG¨žN¿ºÈÔšÊó‘þ5á Úi#‹/Üþ/Ø¥"ªÚ`îçl§Úø¥`Μí`ÙS°YÏìÀüÁ.Üì9–ª¼+¦tê�·ÌjÝ ŸÇŒœ}zâ�ýZãjú�¯§…¿×»ðÿhsæüÎÑýÎpõ>3|£ïŒÄø+cM~êõ7éeÌõÃÞÌ5²�«g>ʸ˜1T1Öœü?vò¼®Í<`L‰î!ï£]דuß–ŸiÍJ?úþv*‡gHë£*dôóMâüfœ|2 æe}Ú¦{6uüÒU{Ø:íºM‚ã6_}X¾NóÜ‹`‡ý+•�Áï'íÎ`Ô¡ííÔÿÌàÆ¿2ÖÆ?ÃïŒX«�Ù­YÅlÑéctL~g»4ÆÊò«¼bå5¾2ïúðXÑÈK_´†bmO÷%³Cï³U¿ŠÑå¶1ü^æ¤pø7ñ·úpêˇ‹& ŽÙQEÍ-;�¡®@û(ÑuŒXV«ój“Èõò\ññè©´×ý%DîïFôýa3<ç³áws‘À5GÝÈ6lôÚÍ<0gâÒÿ¶ôŸ¶©ó,˜cM^ –n£ÁV³4Žá]jÈÿüÌÎKÞwÆž÷ ãÀùÄØµ@_ÐÈ`œ*3.gLxÍŒ•p˜q5íaŽq«ŠóœÑçɺÖñü æq3û¶ j~·!û½g~sÔ8ÿ�í¼ Â…ü”ÆmxÞg}âá%H¬Ø„E=_‹¥¾ØNÜi0Ý/KªJÜ,šß„Ò�{,¨´‘ƒdLÍ2ìíò~iÑö2TÒWÆ­dÈM{ðÿ±]ã _œ¬4L3¨NZëèm`Ñj#°ÁÄì8vSyÇÅê {oþ}¾v-³Î'®þKfŸ~Àsu}ûÌqÆÞ÷Ô�_1ºd[µëÑד¥#o"ÈáV?áàÀyN1ÃåÇ©sOVæž>;Šë0É8þþãÆ�îm  Z;Üy æðE€cé¬Ì»ö·ýصB‡ðIBKW2¦i'}§G$~ÕfO½è²¢JÚ�‰Ë+�Ls‡÷ ¯}ÓÁrºµñ+uèÇ,ñ¢/–FÏ�ƒ§sÇ/Z±Ÿ­³ÿù¦ cÆÚ B°‹ VÐôx1ù`-£aô‘‘š~fN1fÐ_‹y0îâ_¾ùâßFüŒ¡o08Ÿ7u§†ؾkà8œQ1½7 /j-õ:Ù‘“éÜ&O·¸�öáÖ0´áÕ�ë�‚^Ï3yÈhp_1Nf÷f^̓弇?ôñ§ïIìî ©ðöo˜S¢šÀì”’‘©`ÒcJ,' ñ÷½3æÉ-{Èkß8Ò×­NÒâ'AÆÈቋãM�“T�OÅMØkr ,šµ•�ÑJìzºÂŸv©¦(Á¸6s X±CvJC4âûfk>gÖj73û e¤ÂÜð?ºü¨ßšƒ-†_Ä¢ïþ¨¡¢qÐ ÷Í{õ›˜,9.nlõ“T¶{Q÷‡ÅØù´FšFÀ`÷.@ H€®ç'Wnå=þ‡/¹tÿ\ð$´Z˜X´ËÒ%î „‰õÛ„žI3©€ôùâà¬å”¼r¯YN!}[áb^Y }Þxœ.|/¦ó;ùXNÏAL^±Mrc±Ñ™¸ èû¶iÊÙµƒ¾¡±œ1e˜¿Z¬5r{nŽ>x—YcÐϰ¾<ŒÖè ‡ʸ—¡y Œ¹É­¿í6¶ñP106úÚ`Ê7f®hyÔu‚•OÆr:¡bú`ǘv,š v/�ö¢cÕl «µ`ò¢­¢WMGˆ'Ý” áÍ&üLÈdöúóüAcöšè£c +çQˆ%K§wëнºdô‹ÍDf¯¶øFEÖõž•´�®þv‹~µNpç«!^Wf˜Fæ-2 ͜Nj½µ”›Õ¸•›×¿[þbæš9wLT£\Òf׿®×çÇC&êk�½û߯+>ˆ%ŠB©…"á›4G�X¼I ³Y�òf+žøp‹0åõ6ìê€6y¯‹ÂŸ½§Ùë*/%/"}ÒçáyÃz’'õGÌ*k|¬ª_‡šU”yIŠêÏ ®�è }˜[ì4®ãÅñ†~9Óu/½˜µß*Pií LŸ¸¨��õ¬CWnäM¯â):mÌAÃ~†Ä¿|ôŇ~õâ¿fHÓëŒ&Ï3išéaØ—Ž…ÑOVãþó P&ŽL@LA  »màÐ4y”Ý+IJã|s—˜;Ç̤¹ ß7…~ƒðKž‹É+·aá÷WÁ+È‹wVˆ²Û ­rê$TBånÊ-b:ÚƒA„Þ\�gukÉ {ñ¨'ë…W?jKòßâþúPi[Uˆé�¿k }3æ’+·`OFH³¶² óáw2ê{K°àãÂÿ•q„ñì¸A7ƒ2; ÎåOÑàZ=ña“ä–µdkßyºªÛ‰xü�žI˜zð€àñ-»G#èéJ,äñJC�ì\¶ì_½p´4�¹ØJÉÚÑSÕöŒ§šåI¯)R×ð™xÚÛ=è:_úQ³9vÿ=Ëÿ¬ÇÏíÝ/¼�5 É_BÜìæ¢ëj…׿éò»¶“>îÀ¯ÿݘŸP³ ?Ÿ¦ŽwK¸ÆNd¶ì!®cùúü´šmüè׫¸Y}Ûy÷]Þæ 'ÿÇ.ãëßn|�Ùªû†Ù­7Äp aÄz#Œ‰a3cl\Êq^2F¦e Å}ÁG©È·rUšŸSæáG5wkÂù·€ùîmüBîBÂ3a&韽íõBûã©K—— >�ÕÛçîÇ[ò’O¶^M³,+ò]ä�¡ÏÖ—ž¯Â® k�ºiAfç^á�ÏzXAŸ V°w�š†yÉgòÝÓ¦ó‚n/àF—®à:_U3�žSÔÅŽ+‰]•¸¸£¢1ÏZAè¯Ê?5Ió,­¦Ãºiƒê| ½ç ÐÞ½˜qY1Wh®€IŽ*±º8'/NÙSÁa[‘þ‹ôxà$ÄÝ’œò™DŸtŸ€ö S9õÆ’û5VâÛR,úõz¡kÚ Lön?gH¸µiuñÄÇ1h«¢û]–â‚ ~å“êG,¦há›5w‰T#/æ/Eì@ìÁ�)÷þ/:¦_uLï|?hšÿe¿ äÖb¾ÿ�y·äéÂ�ãѸ!ý1ž ½ùÐÖgàA÷—cgC&!»Ço/FûJ‡Ï�2‚y˜!W„"'%Â;k.žÔ¼›Ln×@ÜlÄ3byBm¸ðú�.ÚÛE$×ìÁ®´jb9íÚh¿8} á�6—<©†Ÿ ŸŠŸ—MÆÁ8Ÿ;¬!H«ßizmHCxoˆ‡½ê•Ïz%øËsªèý!ìþ�€ë‡.þdHÄ¿þ«f0Þ„²Pà™ŸTBû·ðÜÏ’'MG̪ßùHË+=ˆ^á?t7ìÝR=Á!°V})X3q|œ t�IÀ·;?Jpäü(S«“ʘ͹QéYe -°úÏýÛw³zlØ™�I„ƒ×x¾…­"Šô §qbÇ ª¬f”�ËXÊê„2mï4±è¼žøv‹˜(è1Å“æâÎaª‚ì¦ÝÄ•^=Ä5$Î…N¥Ý#Õ‰ì&mÉãR[«’'>vuwcÌŸWž!® é¡=h”ï­Å„¬avoy!s!ýr#~{ÌVñó¾hðãË6˜ºÆ©ò}®Îæ…¾X"8#Ÿª­ë…­{ÀÞíÚ@s·>0á[+ }–üc�c·._–Œ›–NTk§Ìû`þ�ò+3ïôE¢È;О<É¥ë(yí>³ÀüU´ù e¾�¤ô¨2Ë"DZg¦ˆ|cæPq¶ïö 3jöÀ\zARíVAÁgêv?.¸Ò±é(§‚'#Ý<úÉz,¥i–Ö´‡¼< ÏÎõðÛ+‰‹—a •ÛÈ›�¦ÄÝN![âU·ù¦ÓÔKÀ˜¸óË�'8æ7–‹UÔÓ%€®pçÞÎ{ ~*r îž=q£p[ÏÑ\ÂúŽãŠøé˜©Ðæ~ð³í[!ò†�È ‚Ø1ϱØ)ÿ „w&Œç·a>?ƒp‘ýô‘á…k°´ª=DF»q½Ûˆ¼ñ�‹çöé°¼í[½ânŸíÓf´íÆ>_ÇÏÒ@û€P-‹®ù&ž I—Göñcß­ãg}݃Îw˜,<á>–¹³B˜3¬‰]ÑBÜL,ôör,èî2¡¬t#?«o7ïú÷'¹ªÇlY±¬›¶ìXºìÙ¸ê`¹_ôО0<©~êCÚ'jre‰ ¥t+qkÀ”~Òe-¸ù›?ìåJaXåZ^æÀÓÌÁÝ‚Àë xÖî*<ú¤¢¡ÐZ�gyNsˆœÄ?â6jצ`Ãüå`Ï6- wÀúM@‘ˆ /¾xm¥$­TW”Xµé®!âò…R`Ê%«‡é3 íõGÜ:øòr´�Æ�ù„‡L�ðK�'LkÛƒß1Âò?êâQOבç“Ô x ^<éªÊîÉó�Ïf󛨷›X®`Há*,îùF<æÉz"0tk©àJ÷~¬ ŸCôñ°Ë_´±‹w– ^_zJ‰KVä›»(cGƒÆ›"Ýúg¿ñˆ©'0wQAœ=ÄÄûŒ!=Òç�A…+±„ÆíȾóæó‰S¡“ñ“A“p{¯qØ1·1ˆIúß\"LiÙÅîAŽz¸N˜^± í­„ñÏLr¿Öš.l‘H_Ôœ _7Æ úM…‰å[Hû…W¡½‰hÿñú½?ÿ«¦À#M]p&fŠÐ7{® 盆 oH å;Ð6µ¹_´ Lxè” ZÓàŠ­YN‹¼r ?£qî™5ÛÔÜYYk¯Ø»v8¸GÚ%p8ˆ­…6°¶tð™€;¸Žã:¥Œ4(YÆ‹µ“ î;� y¼1}×Uê3C|ÈyŒÙ!—±"ÊZQrÈy¬Ô'k1™T¹±ž÷HTǃrcY-û‰Œ 2·Ãís¥B¯­Dká� QqëqÑó¶Ãäõ^® ·Eƒ¼˜³„ôŠ�‰EÝY-¼9bÀî]~Ô'ü뎆ͧ˜©˜S¬*–9´_˜=x�+Ý* ¾³ ÷L�%¸po±ð\¢š¦&ìX¿èî3HÇi} ðÆ�ÔF‘e~\e�Ä1§Ñˆ™ÊÚ%ô›dLÁ:"ç½–U¹�vòŸB9¸Ž§ýçá±O6�‘�×ã2øÿå}Ô\í9@yËç磦Q·–"­ Ü5z鯎â$é•8‹e꜇õà9˜‹û]Y@z&ÎbY’.±Óñ®cñ~ãYÞNðÕì£cäTì�ÛhÄšGŸAûð£JpØuÚ'�x{TðýUtèÓõ¸ƒßSÌZ�#0Èž±ã¾ã)Ï´9h¾ò?j néaWû´°œaaFû>êâ­åˆíŽ8Dv—6b¬!öžø“a�åuëQ9�&dA‡�|Ô)!vP‚«CšDÄÃ5ˆ;‡â†0ñíìö  vó“�0®l3æ‘9 ­« �ãÕðPè33Û÷¡K®ß…ö�#ž?bG Äp®YÚ+aç#ÕÐÚ€0«k.+Ù‚òc¨GÃ:HÑ€:<…º˜½±))¿ì°/gPçb§¡>s#0;«Ì·:®„4;ðäšÝH«1�D¡y«©¨§›[ñ>YƵwÖÄeYÚ0V’Š·²Z÷Âù¸›ˆ´‰”¿Ù‰§Vî¡/×JòTv•q¹V‡Èí×Çoõp¨ÇïÍèºzWiGYˆ´ñ�?ÚoQô™ºß"B>—ðˆŸ çîVâú€1Ú‹‹ßøa$ðÈ›¥£‡ƒý;¡}È"£G‹Ìé1@|1Ì;s¶0¨p©Ð1A墺ZH³Õ ¾ Ë� Ì]Îê1Ú¸�¦O†NaµÎËf ¦<ÒUBzx(ÖIï—¢o6†°<_œ‚˜èøµACÁÕMÄ6Ûv ñE,:¤Y@ƒuåÉ “ïô9„/Œ³°¾ ¡¯ Üd3(—ˆi„[Ü ÌÖGŽS ÇHUâlÔTú¸ïüdÀDÆ`¤‹‹tCXPñqEÒ9zÚߊeibÙ]ˆãAù¦ÏgµŠÂa�#/Ý�ôÅ�>ÒåEÚLˆ1D:úOF âÆ{cúA«X|§YBÝh 1£ÑÚ Ë ¹¾’¼�¾±žp٫͈=ƒ´ApX'áùÃXþˆž ³cš3ˆaF!ý™S^(ßäy(oÁ®ô$n.Aº»¦°–A5Ò"ƒ®.F6ŠØq�±¾ùEÄ|q%<ê9÷ÉŸç¶uñÎ Ï èì×Ʀ4À¬Uh¿”ùˆ#Ž8@ÄqïñH ñ ‡ ¶Ž*zF0!í`_ÌCì!ÄtÅ-N)#– Éò³¯.aY*èñbÞr:({z{ ËJ ¾½‹{±‰Õ¹Ü­'¾ÞˆYÝ}cgûàù‹;å6Tv‹Ë£€cMÝk#ÄÅÍ’®Š‹]EQh¯b•ˆoÕ“h_>ÒcÊž®ÂD˜R¾C�Õ¿OúlÿHÀmMØ»f'0€5b:±qó¤ÿc¤G,9¡È³<£lĵ‚~Ó �VΣ{ÊZþÚÐ,©è ËN;ê7±¢�n bè“ÎQÓð#Ž£QÜ–Ü­–ZÞ+?JE?Úˆ¸tˆ©„É_m! †ùÄ�/Þ•/»‰€‚%ˆaO„œ2æéFÒ1JÍTl£€r=2ðÆgQ]-°<®ŒØþØé‹#;>EpÜúLßñ¤=ôuNÁª4âMºÈg 9©˜˜À(¤â$³kО�ŽZ{ÄKÆ¡Ÿ§Is‘Žåä;™>¤†¸Œ¨]H±¸é ë+¯Æ0ÍŸŒ¬+‹ëé±Ì(ǰiˆcˆX¬æýH_€Õ‚Ezª±/· ¼‹ºÓÁŽ~Êg‚ÐÜN 3?öS·1–a¬¦Ôì$�¦qEöЦ$ô�„�ië2ÅÒC> w šÌ3³g5¤Ööl? Í3Só#Š,gÃ7sŠ(Gáðh€[žTAúE°N™A{EÏBšX(ž#VÜÞm,Z'ãÑGaŽ  ´vEœ ›Jr- Ž²œ" ±ò=bÔ© +KaÝ~qÉË�úDFµó`˼‹¸»iv"í>ñµ¡å³×gmž?u6»Q#eÙ�±¯¶ 9*”¿ÞŠb9ý¬Ý’.é8�öé¡q\ s èËŽ(N10>¦Ï%N…MFkU¸kâ T# ­4öƒ]+v�&€o}NE qP2€µ«¶>æÒ0‡Ù±úÛ<¡…br#þ4â—"ö?nuFE€RÄ-O«ÐÎáÓˆ�›+�DÜ&<®l›äF#-¹ÖNÐawײìBÿäøµn#úQ§þäÊô6£‹_¼·Œ�;HŸÌU>;|FŘÇHwí«GpüC®£ô øùEV§ æ¤[Œéžã�6'nsLq1Y½Jh_ˆ ÅЀ°<ªLŸ‚6æè?…<ç’gÒ¤G€ØE¢ˆ‚u,—æÐ¤¥ƒ Ë« /Ü »µq¹�fiwbâÔ‘òw»è°kß𧾡çñ©‹S�^7Ò×ÀSËv“YµÚ(7CÌPV7Û+aâ`Šn·ˆ¤�뎈n5‘xRéN4‡‘6ûé¦"f*á3�°/´>«‚´2(ÇVcÙš—<ÊR;â<ŠÕòÏXHœœÄ7‡ù ôwˆýKÀZ��åNQjˆõ.öÍ[ÂêÍøÉç"Ý'VÓµÖ-ˆ•Ž´º0F ½-âô¥ÉĹ5VÃÀ;mžøÂÍ•,O ­sÆÞß@gÕ芯6ðDéõº¤ìÉfd—4<Ðwæ(ž‰E;Éô MTŠr:9XVëÊ= öSÌ4¤)#LmÙ…å~ÖEÌ AZû.übÞ"Ú3y:7ƒƒºp>‘€80;â=ÖTt\³u…C}á¤bÀ¥`Í£ v,ßv­Ût4—ÓR�gqL wŠV%.ÝXJ8†MEœxÄReu„�‚TÅîQH»o*Ò3çrDqŸX}6ħ‚þ]�‚bb QuÚˆÅÌú¦Sî„iU»YþÏó âÑ'–ܵiŽ!“àÜP4‚µ—‰)� âÙÚÂØ—둟ÔÓ}}.@zWì8…OCºS¬ŽÒd–Z("Þ±)&ÚR±¼YFô · ”ù±˜ÅY–)ý!•\¼W’úJ‹Ž|¸Ù5a{FñÁÈ„’]dZÙÄý¢<Âg°¹VbñN<£|/Òa�xGÏû§/B:’�‚µˆuˆ'ïçÖóñœ=âô…IBËcʬÎy`ÊbQDÞ¤;Hæ yFl¬ÏnÓdYL�×–’v�ãÈ£žã08ÿøp<Wš {¼OnÙKGWî@¬8¤£†Æ ­¥!6yõƒ«y ý éž:›ôÌ˜ÃæëáÏÖS)tF—ž$£ÍX’ÑdL¤WïGZˆ"ç°i”_æÄ2D=t=âÞÙóØœ#øþj2®l;�öá �Õe(ɪçšg×òE—ëŒ?Îåõ"ߤù¯¨Ù¢èÂÍdF™�Z© ms›“Á܆¼²ƺU,OïxÐ$¤‰‰§µì#s†Œ¨¼´n�ÖIšÌ\ÀÆýSÐO_¼¶ ­Ïžùó…Ç/ŽÇcT1‡Ð‰Øa—Q\ÒBAsßA°wÏ€¾â`‡�–;b�é­ˆãËö¬ky|à6ö*H£Býb«�v6T•Õ¦…óõ…8»Æ˜Œ·“öŠŸ�8òÔÿIìz§_ Ì»¼'‰N¸ŒƒÏç³¼¾Ûƒ\âÞοöY›p�œ†˜Œ\ÑÛ~êgC§ N:y±`ò H;qé)Ûã*fqs¥^i ¥^ñóP †["?n¦`dl„”¹â1¢¸‰x[ˆÅ�xøÍI–?y1o™(áõJ^¶é²"æ(«�د0¤‚2– –¦ õÕ6êv+&ÎiàшÅ-=ªÄjÚÀq1Ï« EÙµ†Ð¯î&²›R×ydÄý5¸£ßDÄð'ÏøMBZÇè‘<á9åæhí�ò»¼1ŸQk¶Ðöü(¤±cÆÄåÃ3û5Éø†]І¢Ú�vM›Ã²ë²›´…éµ»QÍ‹4³Ðº»�³Ù¼$µQ±ÞÈÌv-2¹z?Ò> »�Aº~Hk†H¯: Ìn܇8¡hM„õ¿¨Ÿ/\[B¤¶ï—¤7™ÂÏk#îƒô|˜:euZÍ{´æ$Ž,ÜDdÖhŠsêxf9õ„(­VO*ß…4[©è;ëëŽò¿¾„Õ½ºpw•(»ÇˆÎûÀ#.ÒÁ2»öS�·—±ëÇò–°|»üN®´°ÚF|·Õ �,ZÏ~�q*j æpqªuMa ˆt×¹ÔaÄA¤ÎÊÔhø÷YŽ$ÒŒ�vÇ')ë XÞ1ÒVAüBIháFiÀ•åÔÙ�©"‡à)"7ù,2µá€8£NŸŒ~·Uì©Î²�Q|E¼ëÓ>“�Æõ§v–ó²[]<ñƒ&k–©æ“>ï/í,”GáâÓÐÚ+Qˆ)š¤ŽÚ+ñH›/9­Ž¨R�„yˆ‹b-«¹ã-ââ³Zx.�Sé˜w;Ä) ºfÉu†"y¥«å}2p’Ô5n¶$¸p=Òø2;ƒ46Î�eu°áyIœ²¸ÉȼUÔÍFžèU��ôEÙ Äâ6Ð4cü'‹;«RWrµÚTt¥ÁË,Ùò¸QM™ÑvÖЛsÕ#âÓÞ“0K˜[Áü—Õ^„uã bÓKü³–¢X�x�Ä¥;Ëqûà +'T÷ ý‘oþ"‘÷µE¬Æå…k+P®€˜Elqg5êCd[ê¸"ÒåCö/N©×‘¦¶ˆƒî¯Eù¯�²Q0Å-7�æÒj€q™ˆ.dëúL„*b\Âþ…t Å©°¿RZ�ÄA�×#Ž:ú Å1Œ¶S$-NªˆÏøMfœñO¶IÒ Ì2j8ˆ¹‹8ÏHïˆþ,®l+«‹àž6±ƒñÔÎ}xô»MDà½åDøKXS¬$ƒï¬Â®´hHWÚZ=î(yRy˜}D�z¾žˆ(Þ@žOe},ÒœCßÓ‘>ióкÒG@ü;¤ÝAfuDº':†@OúU>óPs…¿ôæ$¾“Û*(.²ºY'C§"­´þÎjع�EóN|Æ{2ã b¬".7«�ýWf�ž(¯��|dÎCaÌc�vÖa¿q+Ge¤-+¤Ž) É£ŠˆÇ-9á?Ibç=iœ°LYK§QË´õžÀ2•/å,¥Ÿi@8NA:ÜHgFšÞh‚4VXmc‡ÀI¬n¡ßÕ¥fŽ¡ÓÍ�{NBš*¢KYKÿbq‹‚®.Çò:õ¤�J™—½ò îuÈf òÀO�¦Ä™Hˆeqß\Áêa#?p¹]�Îoå™]iP™tH£Yí,³Y�!7ùl¤�%”X³ÚYâÒÎæÔFõ!ú~‹cŒ±¹ÒOí¬V+€Õ¶9ã9iS°Úð,—6{>â?#ÛûK;KœÜ|�No?ÈÚ1œã|Ò^Qm iͣψ‘VÃùðé(Ÿùf,@çDòKÙ¸�Fúò’¤†ƒtF§.Ò=À¡ÏS�Ö ¬~ Ò Ê]Ž| ËA Ë_CÅ>Ù*J«ÓA\]*«S1‰ÔÖ0æ±Üy,úÿàÎÏùî|v�®¤°Ýʪø¥—øj— »¹Š]7D:þWàŽÑªìºbXáZ"þÕ6´η9«ŒXÇ4ÌËQ\—d5qј£ë­PÎÉê#\¤‰(¶Uˆ­Ù\�es>9 é"±z5HÚúÌ(‘=´›sáÓû\tµÝ„ÕÎ €}û—vVÒ΂ù�ƒ÷D±OÂ\ÄŒ•¸Â¸÷§vy,`<æÁ&…§¬I ü¿Ì,•(+{ÄZ&¥Ð6� { Ueõñ`c×DÎNÆìŽ(#}&Äôf¹×ñ/¶±,n¤³ã4:ÌN\˜‚ôêÌÜ¢f‹/å­¤c‹vRˆÅœ·é_‰¯ÖsQŽŒ¾Ë"Ü`ÎtÜá6þ§vVÌ<2·É­RNH;K x\¤gâ4ét¡ïÝ�^ŠCbûsãþÔΚ‰´³X^é_ÚY6nc¤îéóEQÏ·J}ó—‹a�xëÿüyTÇ‹Ò#æ6«Ù‡r Ùë]’´×Úf®­¹…Í@Üg¤÷ÌjÁ^¼µœ¸2¨KçôsGiÇ"m<öó0v¢5Bþt«èÒ•å?u×O)#­D¤?€ÖÑw^& ¸´�¢‰@x”­ªÑz6G H›‚>ƒŒ*Ú„rIúÄ…‰¦< `bLcÒCJ×�Rÿ”EHÕ嬶)Š;n®Dk¬ì…ËÃ]S€jVìz¿ór Ò›GÚYt­$e¦ˆ´³„¤�mù'V;Ëþð@Úï’³!jbGß)fǜǛÛùMD�´µÃ(Òú„Šè8ŒŸH» úd:({)Ò@DjìÚ9Ò5K®ÙO%—íCú®¢s±3¤^™ ‘F�Q¥ƒò|ô=Ê©››Õ'¼”º˜È¨ÑD±…ÕH¸óÔ9ØF¤Ë‘U ó­J-©‡l®ä¨×øÿ�½÷ŽŠ*ë¶G� fÌ¢¶ÚbÀœckÛmN ¹ªN¬D@’EÉ9KŽEΈ€9çœE‚(QÌÙŽ_¸÷þx{îÒï~7¼ñîã÷þó8J (ªÎ9{íµæZ{¯9­}2GZ�¼>¾jвªN¦:Ð$Š•f p'ç7,¦ÚYT¿ýÀ$yþMª�Åå=XJµ³‚ò �¥m„¹(¹iñ!{Ç€«›jSﮦÚYJè'C;+\£�¥ügí,·¯ÚY;{²VŽÚrŽä–ÁíÀ¼ÐŽ)~oèo“@ L¹+†ÌÏÌQÐV OòÁ�ü½µ“¶\±¥t©€¨îþ>ñÔtú€¦Á%žãʉ¹—¢kH_ªOæèÕšßb@îHEÖÍùÜþWF²’Ö¡(·vÐÆþry W£y‚«W/…�­ö¦�"c¡ 9¹]`O¼ÆÄLÎXª6k ~ICQGDüAþ†÷E ºÓò-ÿæŒä“NLƒ^´¹�ÖÉ£�2x›sÜEüqúH)¾z ´|)®$q[€?‰%>—ä2‚OÕüÃ~+yEÛJaoû&ª�ŽtŸÞ–ÿÐÎòþ¢�åÕ[Eµ³ÍÓ.,�vÄ ´”ÙtùCok¥JÿŒRò�V‘¥­v„S}kš�ûg� |ìùw—R½‡ KC¹ì¡W@µÉ3G~©{퟈8Èåß[&”Ô¯e‹îý¬È»¶ð´†ý94—)ÑÇuñç�Kû¥¸“3 K*ím2ÔZíŠÂÙºtW9ù÷!ùÚh>·f0OrY�¾¤F;‹¥ÚYM? /ŒÄ}íæØƒŒü€ja¸‡öSØõ´pðÖ‘;†÷úª�…ú4¨¾Rl©�”tx¦–:ŠÆ÷°|}>õàt1ãÒeܱЮ݃úa¯æ8ê&ÊÐb}.ëÌ<�>Ç¥T7&º@¯Eì¡Ç•tjŽr÷ÑiRpêHøb¿Ù±;ô· sÏç]XÌ?^�ú]s‡–`hñ½êÒŽ´¡TÃÙ%ŒjݫŠô…¸² X¿`‘»i–ãžrÑeúœ³oKÎNKfµE ±“â_púû& 5ZÇ1æ›»q¶~=”®1ý‘ß*ýSG@ó>™O9:]*lLy�±V±5°|>ïÓ±P®tÓ6³ÜÜÍ {~Hì–BS}Oc$‰kTg5O’·aê¥ý’ª lê9pë/FÎÅfž›¥oÖªœ?qÇ*:Ÿú)ñäl‘äªÐÀA}S£)œ4X£CEb(pjúùÐ~ š(Ðà!XþXûN  ûB�4ƒq¿¡Q©OͲn-Vĺ ´ã¡‹�.ýÌlj›Ð–  ±h’Pðpì“/µëuRy“‘MUƒÀÿ ]:Scè'ÚkQèÈ’±Âö˜XÓǘ°n�}°.Åf\š«È­Yí,åþVVñt´³¸”CSÑóÁGU�çƒËFƒËš¥5çËS©v´BPÏJ öSN®‰\/´³"4ÚYBÖÙ…\Þõ#h½•Ä|epÞŠ5‰ß‡f ð0›sa��F®;¦tœU6ŽjÍGUH™çò9×~ º¶XsÙ=HLòhøÅí›Â×®JÖ*JkR’÷J>5zvÐù€Þ“f–Ò7w$kïª#$šŽš†t𑸈Ö6ö´­�Ü\Dõ�HŽEs�ø“3„ü{? Ù·–'™ZØ0 ÕÎî¼�wÔ|$�°þÐA•œ}ú(wÅåK¬¶*«3£Z2~izÀ ’™›‘|]Fl›U2Ð0BÝz4¨kP FuNú(ƒòFC» 9ŸR<šBTåxô˜Ð:Sø¾ ìõK· >‚GH?à0ªClIL<2ëTã}[˜.·Å›â}`01úØd.çÞRÔDĨòñÐüFüæˆ�ƒ¶î+òQêÃsFC³šö¹¤ßZHõ‚|©ªÒ'aÕ`&c*¤“¸Mr4à}ªc\UªÏ‘{Os#èáú’ë$vúEÓ]—O9>5 éX³¤ç�¯­41æ‹'ÉûÈ<ËÕΊ,m#s*÷2ÕX—"öNмoÙ÷°š B‡:±z2Ÿv|&—wu1±±%|æŠYhÍ*qßT¼Õ†‹&vO>X€ú6èN‘9Ê%‘\¾¬q¹x¸Q¡8üÜH^\»{ì°æ.%œ™E÷Mú„ ?²´9s×ÉþôywÛ#wìU•õæìžºU$Z‰s†/’‚ŠÆ�±$×@î}l¹öºñÁ½ÄèÓhΜwu©è›¡g©rÒb ¦¦Öa{ô¡»Åû��Ë8G-™ÌŠ`CKÆÒBŰö¾=��q]lÎí…¨K�|²§¥\Ù�jy’ÏcË'@ß û—¨&QâùYŠìû ¡9M9Úç@rYÔ¢8hmá~ŠÉggsI'¦£–�Í9õ–+=ºCGkèbô‘ÉT…®õB“ª`,tÖPÛF/™�veÖ¬¨æ!j˜°‹˜3Ó¤ÈСV†–ècÿ ¯¾ªÁ–tUMR&œ˜ »§c�zô¸Âó¿GíZ(o2$þ{ïª+8ú÷æ6{ꈻ҇a_w°ÓDy¤Y÷6›ryõ?RÍÔ¨îô©9\ÑýŸø‚û?K±Õ“©¦94o 棘5ñÈTì/„CsFA‹Ëº0_±·mµ<ïÎB¬ïb½™ö:ºDö¥1)áÐ4øy`)Ñ'rÅ)�Yß)#Šôéšñ« åYçfãþ@gù¼¥èªý ª©Bâ õyÑEØÃ2™êẠ~¤1‚Ì{.éÐŽàs’·Ìž°à‰"8”uè‰óÆÞ3®²}4¨[Ö-ãÔ׿c. ~qñ{&p%-«°×S:ÔÌré×P_�ªÌŠ÷¥>†Œ%ö^Bï ûhÜCí yÑÝ•ð©tmÚÆNy/b,ÞŸµsÓÁž Ô¡SÄYo×±´°Òh"úg�€¦ ® kc¬½SwcÃ�ÓŠŒ°�ØÖ˜½S†hôÌÏÎNE k�ÀŒ¢gxª‰Eb40ÎM½o²˜yyê3b4±?r~RÌñ©¼OÆ0ì‰à\ƒúˆ>б$ïÿXðâ¤-{·À¾¨_ —BóˆêAk Úpþ9#�gÓuä 2¾Ð ƒ^^ÚÑ™À#T·šíQHŽBõ9°v_NµxŠj–B»Có=äªÄn�� ¡(nûYQØø#|ž˜@°t•kSŽÍT”µ®”ª-¡ƒµzªõµ3n0Ý{‚Z#öÅšÂG\ }cü ÿÝ岯ŸdE÷P¨¯Î£k:Þ$vÀvÈÓèç�¢ë€¨G`ïp@ÖH FÎÿûäEw(vbª&Êm}tdÊíÚÈ% [ÌM8Î?•Äõp�àOû­âª ¤0õ(ºV¦>=—+®ù™W_[ŒuzÖ6°‡)ïÔM¾•Ä²È }yþ�Åxº^Hì!¤hæµG_‘zhмøÞRyÞ­Eòœ Ћʹô†>&çêÓ[Œ­0 úpØCV=^p"1Ô5¬¯ä“=Z…"´´ å+ˆ=<6Ir®~X{ƒ�Þ”èîÛ—ÛÓ_Ü•8D/'>ªh4­ó‘œ‰æäïp� /mjdÁ˜[Êàhä&Èwqß�“°ÞÊ›å·ùö¦¶ �irÏÄðâï±—GØÐGB<Ï<·xzZȱgKŠÚ3{70¯pX/½sô�;ÃGRÝt¯øÁtÏ´à½S†’86”Æy轟ÂûfêAÓ™ê c¿bP>Õì–€} s‹­_ܪÕD}ðÙ¹Tç5‚C1ÇùÔ3íSâã¨Î´bQg'sLÜEî]8±3’ŸÁI4ŸÍ¼4ãLÈæ_Z$$“÷ ×IõÄ  ýaÔyP'÷ŽD×J &‚>›XñÄ}t¬7ÁÛØKMîÛîý“ EGõʰNç?y´ë0·é}€H99�îŽ?8û]¡› BìÄü¢�Ü[ø+eHÑ÷4.%›I5ÁÉ5ó»KÆS;�«œ H9?]‘xf*ç�9xŽ^ö½Ü_ŠùD5¶Üu n±ïÙϲÏMø}Ï�ùª#Eò¡É¬Ã®èþ#cg�¦ÒùíA·˜þô¼é¼>=»ëÛñíøv|;¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÛñíøv|;¾ߎoÇ·ãÿçÃÀ`í¶-klvØèrt Vn\hE~¶°Ù¾ÃÎS×D×ÀjöJÏkmw8ºm³ñôÑ_Ч8ãMò�kô—êOÙdãcçi5Çj‰ÕTýõ§¬Ü8wŽùòÛ©ú3ÈKçÌš·@¶…��‹þÍ›ê“_ë›z::8n#OZÚÚ¸Øi^ú#yèÎ\¼hɳæÏY¼Hñ’¹sf-œ·`±¾ëxú‡æÏZ0oñb}<­ùOk^ðŸŸþÇ›¸ü÷ïí¢»U—Õݦk®»DÊT}ŽÕ•ÿÓwä~ü€û±ÊÓkûV3›äü·iž\eG.à?<=E¾m›�«Ý}ú¬>yZÑTÝ9ú+Ƀۅoìt½È—¹úsè?·ü`H¾q"OíÒŸ;GßX_TÎÑß‚×[�³]F©?—|ò¢y¸¶­ÿ£×ã6|ù›/_~Ð_@>}îô.-ÐÇŸÍÑ50 ç#]ª¿`î¢E‹u¹�}6ld™µ«�™�Æ,cl¹¥›ë …‡±°YËTnÓÍÄܶ›±©}· F³n�ch$2²­Ý,í‚{ �SfØCfÐÃbËN3ÉCkíJSfù² ÌÆu ½¥Í£ÉÇç áÍq‚k`J®A¾ŠN¾½Ew�¯¤Q%]ÁëÑ\µÕ»—`¿½‡j[d¥'ù|¯øÁ [aÝûRÒ;ß–h–V¨ºÉE[--�4�Ý⡃fI4Dóvž=@n!ç¹�‹6ï™2�B G¯ OJŽr1Þ9 7AAk)³îf)lîÆ�hÀ™\¿›o) y¸·ª2¤l,š¬Í%Çn¬­—H#èµÇT(Ñ@¼•¼^q?=w¢äLAEcÄðÊq|Pþw¬WtnG2y>mï“6”uée®Ü¦ BZÞ=¸% ÌI7¸S2ž¨Aôž )"$ç;4i¡1€nÄ ù…•³¶‚·Öñ£™ÒA á ˜65·ïffaÓÍÈLb@&e‰¦ Þ…Uoc5l�1hŒµ]µeäz¶äž’ŸAò¹vÍ&�³ ¬e£úÈcúÈ6{뀔ÜĬ¦6ŒLå¤ ROCK�áÜöäAæ¶Ú†Æ³j½)cŒÆ]Ÿ¶¤üŽ”Aœkd?ç¦ñ sÕí�äuWƒtغH˜p [²´ÚÙ�Uºwgí½{HN!}•®ÁýD¯è�VAi°¹±¢š6ÒËÈõ’sнS‡J�…£”¡¥ú iPîJ âIJÔå7öûìê­pÜÕCòËÿŽÜßQ"7‚rFKê«KÄ´ó ”AI#ñžØ¿Í»7š%(éJx%Ð�-ä�…Í[ù¦�Tyè*=½û*½ã‡‚Œ�’Mlë2 Öf»ˆAp£°rÔfm·éPÂKçà>œgP?4Šª³G£�YØÞ_´ìMÉ�B²F¡™LòN*¸öa·nïÂ1ÚdDl_á°­;gç¡2 Ñ›ØÆÎèA PÆš.&Ÿ¥Ü•¥'¸õåÜûÀÎÑ ¢%4¹ÐDŸL=ÚÀáѶ)…”Ž¥„^Y7òj—¡A“Ò�`°áý,•d,ˆ=ЦêÄžÑXU>$T¨n[@ÚDã9XZ4–÷ŠÈ;íêE›dÐÐKÆ�6Ú»èð%£x×ð¾f‚�Öº†ÄG®c,X2ß”;»[îÚ2Á™ŒåŽîrò°œ´ŒMÆÄˆÓˆó¨¶iS2»]dÎÛv3“«Éâü@DËm ê‰Æ"Ö5ºÈñ>fò-ÝÌY‡n” š\š±ù�Cx‡°Þ–JOm|7Ð\-:‡öá'4!jšÆA¤ !'ÎÙ§—èÙW&¹k[JÄ�Z¹u�ÂúJީÔž ƒ%×€¾’³Oo4Ùª|“ôx[4qøö@/�B›à@2>}¨èJ<ä�0TÚ7M•”$pgæ0:NêBÒ¹ÙhâD“9šlEr_A®A|/a”Ѧ(SÎÌSî>0U¢$“”höéG} ñŸš†dⓉÏDìŠ6Ü’±âœ}{¡¡6£Ü1M¹´±M3áãÑ´Do½¢Q{#~Y¹3aˆ´#f�è¢ ?‡÷¢„_sÿ$ÚKØwï5PFî3À\“¢*&‚¼KÓ¸X5�6¾E–�•‚ FƒDHV9�~<‚û !ù£ÑDG¹£ËÇ‹hVDÃKPæHÁ/m%61¹KP*ˆCI” Æ  OL.z… Àüa-ü*HÍp® KØ#‘ˆÏ€}‚xƒspÕA/`W†ëLÃM È©d±Å Æx“Š‘ äï‰ORØzêÈ”öZð?”PÁÁ»'ì¾Yf㤭°s펦n#ScÎmÑbíüz°ŽÁ½AØ‹Ïq>lLaí­ƒ&fÌ-4ц-·prÎ 8\Ÿ[d?qgâ)�0d⎤Á ,ܸf=#—\´D49„ö‘[{tñ%x%±—\_!9ûöùƒè1¾$ªœS@o4[J1%Ð� ÿÛœ‰}’ñ¤ ]Á¹£@8„FaÞÁ¿%FÛ•J›UQ•“h87É?{¤�•¢÷L$ø` È’¤Ø=R±ðMRìÁ)ðEÊ]±ƒAòÅÙ»ëІ42€-Çí=Ñt+ùÅ·Ç|Ò†�à„¬�¤ñ0@�†ºIhÊT†[BÃ/&Éü¡¤v”@Žœ ìÁ7CdU¸&Ì%4ÜŠ ÇgÐf⌫óÑh†Æ84pÏP àÂ1xo££™–ó@ScH?1˜Øñ`‹±A:­Œ®6P�‘ù¬á˜KhÞÜ£úƒŸ6óƒTx{TÓ}ÔÃ1WØmäÞ»ùõA"õ©Äׂ�BnãNÆo+%<†¯£ç�ñ ƒxÜ»[rªn�àI\p êâ\ÖjGw~³oF�ìOAü¢\rÔ~AS&?@02];àA±ŽŠØ¯{t?Jp¨Á튄¦n9Ár;ov[L?�jñ»�M£�O¡„v¶;txâKiÓ+™“VÀu —„ýzåè¡1ßoœ�%M ~’³öÐQ(í4„ãäZ—Ñ NI \¼)”\ƒûÒXzÝzÂGz“XD0aHîhjÏ ½!¿ÇØÃÒ×îRë �,…ú(ßœ‘´¹‘Äo`;Œ!%‡ $8Î'M�’MyE”vÆ ¡ÄNÄ6à£hüõ$6ƒ†GøXÌ¡À¬‘´¹ÄZ>1ƒ•á%ã¤ðb}4&ÓM2_1/A ‰†DÌˈ”¨¢à{œ'%@ñ6±CùѦÌÐ\Ú€ ÛøGómÜ‘) „¹| ¿Aj‚K|…Ϥ͢h² -ƒZÚJl ¤ E™Œ†¬�ørr/ˆ} �ï¹-ç¡KÅ>¢÷M¹ =�-à÷÷0]4NRð$6»3q0%ƒÄs;ÂuåN�½X[âû@Æ ²€02Lj?¦$ Cs‹Ð¹Ÿ‚ø?Öy{OÜ<àKÈ=¤ÚF≯"þœ½{kš[É9$]˜MçÉàé|#¿ƒ/¶ÎÍbsï/áR/Φ¤É‰§§ÑÆL·Øþ¼_þ~÷Ùi\þ“Ÿø´{ xפþ¦ðÓÎÚ¢oºž˜|l¦�vj6šÞ齋¬bäQGkº|éEÆÕ‹Ä/2%ÿœïTá{'ÂWÁïpÖ[µAîDñR ,®Ì‰�ƒmJ ¬õÞ=„Ž´©”Œ#pm®%ã ymGC0î ™”†`!a[H_4ÖR’ø(Œ—gÜ@ÜK>�©ÇôÇ<⽿ÄXà~4¾Âf@úb)b§_ p.´)›`HžÄ–Œ�ùˆýÞqƒ‘g�t�c¦œœÂoÚŒKlTòI¥¾’>v% æý†@¬~d.TÄ þèdˆ4paÅ£)ñˆgdz}Ñh|ŽÜ7Ä9ð ´E“¶ÜÞƒæXbxñX>ùô 4Vsždü‚za p~ ìAÓ-„T@z*EVOàÝãúç‚àŸA›éCpo3†óð›$€Ý‚Dœu ém Ñ û]:𕈙ÿÔ>£÷L0çì»Y�Xn*‘¯$WÁ÷漫–É¿d’FЄ’=|m°�== ¤Ã´q7öØ2€ìŽ6iï"ø˜~Ÿ2Dˆ9hÀ%��2n.0wË °Ãùd å‚ ¿ÃCX<"O l‡h‚%Éà p2zÎ#Fb$*7-`RúP�œLEü·½_O`�‰;R‡P; ±ñQ"ùõ— 'ÜÜWðKJI*ŠÛWÒüÛÑ·7�‰d|å…�–B$@‘z~ìaŸÔD–êÇWƒÄØŠäßÃ×�¸5ö œHÇB$fó7€˜F"ãr<gI|H|�¦˜ƒØ2_ L×£Mê·Ð8D0%ùt!yƒ³_ŠEHìä¿4$rY¹•Íõhs=™Ÿ¸¢Oì`*À@b,ïHr“Xg2ì|z(H<†`ì“ßž8¢¸ÏhÊ7“‘\EaÝ µ$àBœk…¼ÝEË‚w yˆ“ˆû `DëÀggⳓ î-ÆŸ†ù…Ø r[Þ3~%^%¾ø�µqî.·wï.ÛâÑ�ƃíqäŽ>=@æ ‚F ’—k ½º£6Án‹è«°öên†|]ܦmÊnÑB>†| ÷Mfå® rJJ†KòtÞ1 È©ØnBIŽAÆ8-z¿ÄäE-Ëèü‚ J!/i\ÆU½3”íÿËZË¢gK@òI…`ƒ¾™ÃdvžÝÍy©ÄéXõõ|ê�y¼WÒ`ùOÔp@¸�9 xõƒß¤ùpP:j($—Î ‚DÕ.‚ ÜúInÞ}€?%¿Ø!Èg âvÌ)š+�\›`¤ j¡¶rÁ– 9òIÕAW(§wÆ0êkIÌ‚ø Ű{â³5DƒUùÔÓ³J29€’À¥_]ÀU¼ÜÀïj®ØÛA O)i�{ôàkJ�»=\âôÞÛƒ]wÁw"^Ct¹ëB^_‰º�GlÅV¿ž‡x¥†pÅ�Ec(‰6Á8 �¡>¯#¸¢ ”hvGÔv[hÌ5Ø&õ±d.HÈ÷ñ•Ä…�댌»ÌÚGù3s5óg§@–-ãíµxç�>ðÛ<ñ)¨€Ì�bFâ?T€ Ã'[�Ì¥ž d·ö’“¼Úœä4f–VŒ¹`Û�f’çáû¸­Ävíü{€ù:Hì墧6HAN¨°÷í�y(³ÞÞ�Î1âcQ·„ï$ù^wÿhœ�Ô… êÀÈÈ;H¬þ�ú*�ld^]H œ@^‚œ‘ä¸ —`<5掾·”þs“"ãá†`#�3µTQ�V̀ЎM9;ƒÛ3±H±…|6È_€[a�¡¥úÕ’H¼EíIR0Xþ$È$_ï)y<"à~�gˆXN}(Hk@îKóõèÁ á¥" q¦Ðü7¸`Œ^885CÉ/YOé›®!Œ LIñrlùEqÝOTÔiWü Ô3)±EtÞ81®r2«¾³P±çéjEÅóUT¸2ïÞ|êÕy kœ£û!ÖB¼GîЂKÀ«lνÅ|ÚÍ|@îàCÖÑ¿ÕÙÜK¥­?S²Xˆ‡�â‹4a÷™i\ví¾ðÉ ¡¸iµPX·D,2FWBóG#/¥¤D ãD\‚¸KÄ}Š�ÉCŒ?5�O¾0‹Ëº»ÈÐDÆ –»06’iòubW˜ST`„äý”ßiW/à 9'ÉŸ@êFç&±{ÔyPOàÝcû $oá:êvÀ½òÍÄÚúõ@N²*�+ñ^[ î‰á—�wP!=lõ‚GÒ@ˆº[r¶Z¼cPoÁs÷@qKP/Ø&ˆ+�C•Û£h­$Ô¨íÒzg@ú)¨y +Áp;#ëQR–á(AqdÑ÷ò‚»‹å?*Ž|4‘U¾[Á¤ ƒý™IÎZ¨Ë‚l8÷Š’Ócž?Añ9°BÕ£iM5¤Ý¦Òz­ÿd}²SÔe@"- Öç…Z Á$_ÁjãJ/S�ý²Ghˆ”~%~’æP± 4<<BBÀû”¼ùº[p_ä•{'Pâ5J¶T6D” †93ç—:”÷!ùˮ݃P_åvE Á9î‰?>BÍ4‘vÊ™YüJ¿Äx!Nð §§³%ÏWpY ?páß#. þ#¹Ì³sä¥ÍË!LÆGïÇíL¬p"1Ï‹àœ¨r}Ì1¿~%[Ø´LQÜô¯¾µ˜Élƒ}DéŠÁ©#„´£³ äÂ$J R: ‡Kº8 ÷[–ý`�¬´íGJ–æÔ‡Ý즃|�C¾Ž8Ipjø_‰û)–òIFç`-ø```aÎ#~€è—§É×wÆ ¤5Fâs/@’-Ä�̦^œ%Ä�š&ìÊÖãì½{â÷T0ƒœ›Ê/OCLî�´3G$½²ÍßÙ¦ â#�ø[ÔÈd$‡Ç|üzcMH»çK¾ÐõZ+$¾Œ�®š@k„Èݼz‚d¶) Ž÷EìB¡¾0‡=øl“x²E¥¨z³d¾_Å.xûà^¬ Á ¶Û»#§¶§ FÜRä€pg8òs¬MIÄ)9£á?ÃKÇ�\–’Œ¢V€ûVH‰C¿� ö}I^Gðü-%èÒäëºÈ±pn”œ24Œ[m@rç©4o"ã§!×Bk ÈùàkMCN/$žšŸ¨È»»˜K½6›Kö‡MG T�ü�ÛêÛ“RF–�>ávö´ /¯È¹½‚9\Üñɬ{RÄ4Ô®Åm$÷Û?NÙ¯�8MsIÓAÐ!76…ä•$fƒN&yhCü YR~Ã*±èÉjˆ cÀ�@¤ít^“¸Æe�Ø•{}—uƒ’R|ë—7c�ˆlÊö~ZeQñlÙ×|˜GEî)òu*šáL漫_JJü­�vfŽQ¬/…•Œ%yð�Fƒ‚hžÖk ¸”yu>—tn!XMó6’+�„"GlÑ“ŸI¾¾�wK@ëû¢Û?òu>õÄ,ˆ7¡þœŽ¹ ¤É×1_‚û‚xŸ®¯‘q„�X…î/…䌦ùº É×!xAÆ–Ö�£«&Ò|Ïíì/Äï›B‰›Pg¢bÕBiýZ±ú±™p¤MÎU¾Ü(+º³„Š]8’{¾…`q{‚sDwm…ä©­!u%¹?ña˜›8ˆ _¦Bþˆ@É endstream endobj 38 0 obj <>stream Ÿ@Ä…zêIÄ„¤³3ÅøƒS¥°ìÑ"Íדi¾2[œ#Í×QCD>�<>”øa<²ÙW@˜ µuÔ)i®Fp)ÍÕAˆZCXþhbNÄ*Šê–B4OQÒ¾œ`�ØÁd˜§´fëÒW®²£bâ?‰]@ì�Ùû½¹œäʦr†µñø"v­+z?ìŸ:b¢»__Ì*¤Rþ=0±Â~M#v!4­ŠÛVãú@~ŽÊÙ“Ï÷J B5�{Á¯B8E‘Or줓´æJÉñvïŸ$/j\&¯z·Ä¼–€‰pÏ"NR…é+Ý#úÃ6�m(ùbö�Å\qÝr.ÿÞ�”`× ‚Î̳óy*tY¬OIJK¯‘ªšÍqoØìk ¨}ÆšŒ5~÷‘É”D.éòL>´Z_áÕÏë£rG-øW)¬\㈘„ºëÐ d¹r_¬-hHÒôèzwÒÙ¹ôÜPØAp8ñ]ñíð‹”TŽØsDÝD~Ħ P’]*v[¬ÿ±‹xˆ]$i„ÿá_ü hþ± žä¢Àææ&*Š�g08’{‚ø¶FýäΤ!t�¹½“�O´†’7š�>8‘O89Mã¿Èçƒ$˜Ñ?I¤mX? 94É�€ èWJ¬xl:æ,õ¥ð�ˆÿÀ$/WlCEÈï�ŸÓ×ӵĂ1 ƒå“/Ϧõ×à¾ÀóT0Â#v Ê…Ì�­ÛthÞFÅ.2ÇpÕÍ›hüð†Ø…’13“jSXÏq©¹oàI}» ± \›ê«Ø…}@/ aç¥Êȃ“E‚]x_ÔHIN„šgDÕx*4“¸DÖØÂ?ré§gCŒ¯±3fš<·q1±4DÞÅcP¯¢k ÀݯcÍ >JEæ7ñ™¨ÍR’=<ÛøÐ57ˆ›-eÏWr$·¥Ä¸��>bØ+�:r~Îm·.­?à{’Ëì¼uL-í»®eQóÔ‚Ø·ÂÑ¿'/°À’Ì]–ÌyˆR¢ž„= ÀQ§„ðr"ÔÈó=@ZŒˆ®q ~I0—_¿LL8?‹ +�{Æ<øQ^ѾR^ðp‰eyÛOÀi¨]š¼m²~#»�‘\ÝRñ± }ø¬]™˜*óM"µO|­B]Ò~'­Í`í¶Iój}nÝÙ5,ù=ñ7¨£€yˆu•»«'ƒ–®•»jj]ʘŠI”ˆÛ;u˜†@yg/ŠÈƒø꟢±_b—J·èþ´~†Øš|‚Š¼Ðº½§fo?¡ëQw¦‚îÞ‰ƒå[Ü»coÃØþïb¥�«ÅòGYÿÜá_Å.dªÚÔfP‡ôO|± Œ�òÏb± ã¨X±•É�üzqvž=h}!´d,rG*¨@æêïÿFšHíÎ-®?üD`奯V°¥/V²é׿Òz¿WôÅÞ—k0Oy¯P]¬?aþJÔe §Â;$¶rÎ;{arjˆÌAÄ ÄçŠòG+(¹;ÈZ‘ )¶j™š™2&›Ì’÷wCžƒõäÃÈý ýá!Œºa=ˬYjĬúiqXÔZ-!R–«AbÔͰ†…÷¦¤¹È_IÌD½‚|T\µ@äå$…؉™ÀäˆÈyAĉûB K+:VË¿ÛHæÔBˆ}CìÂt#ˆÎ­ºáaÉò Ä%‘ÿƒ\›Š]²Ì&#Ão 襂¨ñ×´>¹Õ»Æ›®kØnÓ¡_íÝup¯D ÐëÐWá°“ú!Š-2Î-ó®-£~˜µNˆ�e\˜Çe_]œ HŒ)|›}nž†H5e]G�(ÐÇ:*%žÌ8=—¯l6„Àü6ÖPT>Ä—Ç–NËë7(+[,¥½ÏLÙŠëä ?P± 2Oø¸ƒ“äù7¨Ø›÷` » ù3ö[™X1&¢›Ÿ €ˆ:üŽ**v¦»�þYìÂý«Ø…WÖÚQ[!:iQ¼‹5açÙ¼Úùœ»Kx‚;iÍ þàøšsúe —¢ŽLæJŸ­á÷¾6T”}X‰º´~`‚X8Š­z±Br4ç©7ò%ì#*ê9�î‹ðM†¼õ#äêÈ!N ü‡šdïÝKé;b\Xûq.›y!´w´Ü5º/ê;RÂ>-$G­õkM™•«×3×›3¦¼]îdK-‘.ˆÙQòT@XÉ£Í'’ÏÌÞ/Ø(»Õ«Ori\»TZ»žË¸¹P"±�ÖÞ}“†Òõ?ìå!m¹¾¼¤ñ'~ϳ�Tì"õÔ ØŒüb>_Ä.vôRR±‹Ã³  툄ښ%™O ì=!XS˜;J‰½PÀ�Þ=Qk³�+n³KwiWê0J²�=‘á«`¯Ô�Ø5çÊ!ãÆbUh©>ÆõwˆbÀ§HÑÅãAÖ,Ë=?‡;Øn*ìm3ÂøB4‹úÚüÚåÊê: ¡¤~ Ÿ}e|WýÄäÒ¨]Òý j�ß?yòo¬Ù}»à¨ØÅ㟅ŠW†bÕSSEõûõò½­+ø˜ª‰XãQl ê)ÛêÓCîÑû«Ø[кL"yü”Âɇg)ÃÓFÓøNb™�zh†�~q�d:ÅÁÀ$vн=Äßc¬ØÂ»Ë„¢úÕ|iíj¶ôá Œ/jÏlÆÍyX»!Üux’¼°ùGEú­9\Ì©IlòÅÔG%œ˜ 1M.þÀ$`:ŠÍ±¼!ˆˆÊ‰|ní2¾°arÖ/[yÖë‘÷Ðù,�}{Ä&„ìË?ˆ%M¸êN#åñG6ÊCí›ta:ë[8œõJ,÷Lè�5K[÷îæœu7sb§ÈA8‚È|¿&�ù�ZÖ‹L  ^Gc.TÆ�œ¥ŠÚk@ñÌöøAد� ±èáj!õÆ|ºŸkvPý²Ö ÑPÁb|ä¹7r™çæBìBòÍ¡5Ô°çH™;NSn L<5{:4˜¦d ­½£´3v­±f‡|œÖ0@þ»#j]ãñ‰Œ:8j+ÊüƵbnÍOšœ�Äo?ìï8:M½Ç5{*œIס£qJ>yÿTî@“±p¹q‹ê|­3Ä)�Öob nL÷²•=X£¬h2ö>2”ßø�ŠSB \}wHÿAÂM×# œE0êÿ�’³ù¥éa]TžKrS‚Ã¥ƒ- ùÞΕ»€À:Y>V³>±gŒb{Ê@ˆÀsq—¦Q± ߤ!4�J¬œ‚š—Q0–Š]DjÄ.Ä쳋 hAÅöWz‘| ¬TŸ Ë‘<•’%“ßó% +ù²¦µ4?)m[‰5A°O‘ñûFÿC°¯üåZìû1±`5¤ètŸAÑXûðù }Ï«[!–µ®gÓnÍÅ}€íÐ5!ˆa-9:jiˆ‡$G7)lÎ_sSžmÜb±ÿÍJÌ6åÊ,Χx8Hý‘k"_¢ëÀÛ“R_R4$ñlYÇjØ»!Áƒ†k6QáT ‘Äwç¥m�}Uˆ#Guöê ÿ®ôL¤ûŠÅˆŒÑ”èkGØ[†=?$. ‰Ž?=]Z1kBÀ¿T`k”X_!c‰½bð9À”<"ÐZÿÖ Þ¢W&É£LSÏχÿ£"[„É_OQjØ.ïOëꨛ¨ ›7pd<„ ÂQÈIP‹Â~+ïÔáÖ¡$ÿ=JîÿEœc+¯j[£:óÀÎúæm_îx‡ ëTƆ2±‰æk¨í@œ2éÄ4î²å�k! Ê–´,ç3o.w›*FUM bÁXó÷ËŽç©K×`ÿIìBAòWº.Y4ÂìÈ'dùC0OáÑGîÓ—ØÈh.ꨄ®‘ƒ€Œ[ŠÌù^ø*v�8�ýx©Gf²9—"f+£ª €ý¾ÖWiNW9‰+¼¿\*jX'7¬a÷<þ‡`ûU°o›ùì{²‚}؇IçêGÄ)ñ}Ò�©TÔŠÄì;„¸€Š:8{ ŒÈ¨‡SûOº8K,»€?@nÆU´¯çL¦â”‘ÇC[á“5T˜1 µì…aý²†YÚyé`ÍL ±8JÜÓj$¬ˆÚ“\pÐÂ~Xà>*FIâ„Ú ÚŒz&ïL°êñ°I/Í^5Z‡¨iÊ™™´NAüÄ^…  Ížä)Àì$Ï {t±—1ñÔLˆ)ÐýAXoÀ:Êæ]:X§ÂúÖ†P£À^)¢DŸî+‡0Öà ‚Gp”wòÖuGOºG†ÄCä5”€>9#�ù£ j‡Z­2L=FŠ?0 û{9ˆS3ÃV÷4BØUVñl9Ý£°-¢öb� ­;Ô/EÍäúÔ·#'ÆüŠ98™îùƒßG>›Q’{`ïJHîh:W!˜™vz Åð2Í5…íÇ¥Ÿ%/oüY^ð`1»û�ë›5 {"4BKäg*DueE LQúÞ B}&þØTEîÕ…òì+siÝâXn»û£ŽL4N΀й2îà4º§ûÀ±ws'öˆ�bÏë5Bå;c!êädº¿Â`Àe±Õ$g˜ �*Lò 2¿Ð¹�uTä”È»ýs†ãA÷ô§|¬ qŸàÂQX÷ÄšçàGã>ƘuñîE÷¶•ŒÆ-rň:gë±1º%GžñT¹ÁÒ¡UúBJÍà!°|4�Ínáºt=^é¢MqØ6ÿ¾‰‡”èžî—ˆ õ^ú9È[QK�=<™æI§¦SQ–0ì'ã¿{­HœE~‘ bRòé¹b©™[¬Yc­žŠb Ž‰õKÔ ±ÇuþˆÊñ´.„5Sâ{éZ>jXø;‚3xï˜AÔ�Bü kͰÑÔ3s¨êéXçŠ,›@…×à¯ÓÎ/ÓOÎE§©'æ�…À=WýÜP^Þ¶â”ÂÎäÁœ[P_œ3Á1?AÐV@LÛ™6”^+®‡ä°]øÔ¶ÄŸÊK–£®B¯)„œ„íSˆýd\^@¾“OÎ ÏMEΆýaÞa+:ÖÈ«:V£ÊEîËGìÑÇ>+Ôzä…—IWçÒº4™د‡|›âÜÄCS°VL…ç ï-�o€m£ßûEÈ{ÌbÑý²X_À:/jØ�ÃfÝZÀV¿Þ(+jZ"ìH¤°u¤{%QSÄÚ5æ»{tŠP4ŠŠÎøeŽ@­ˆÌº˜NûFèÚ¿wúP*RMü›·o*�ý4ÿ(MïÑ—wŠ¢ºGÝ1´ö¢ Ž&³rÒì©·uëŽÚ’¥•›6jÆòmA}ä¾= �>´t —vc›óp1æ„ÕH^¯eI|,p1öæRq=¬—¤èA´ ûRøÔ+s5÷ k$b*=gìAJ¼0‹U×-†(.Íç‰o…]cŸ¨UDÉš—ÿCЄäÄâîÓÓ±¦¨©ì�±/)þôL>óÖ"ŠY�Ã|3†ÓÝ'wr:ÅA¨ “xIýBhñ÷°>íÊ|ˆŒÑú%±{r_§@ø‚A[�x›y~]CÁýNÜc@k‚Xº#jÆQ¥c)~"ñLQúðg6÷òBºnåÝ"nXçSŽÏF=�K¿2b±ˆýм[‹¨0aæ©9ðËŠ|â§i¬#1pw‰Ù§RL  !Å�Jcå‹ ²ŠÖå\Lå8¼õCYqû2¬I±©·æ"‘4.*;LØÊ×E-˨ݧœ�˜Ý"EQÝ�$f-‚Æ:*É� æ-Fí›ÿƒ˜#Å�˜Î§Ÿ™Mk Ð>Ðb¦(¬[Êî®OE,P«rÚ¦CãÄiÊ_®R”½^Á¥?Xˆûÿˆ=¬\ú�ù¬wÖPοh}`[Ö¹J¬h3†ð;­7¢¯ 9Ö<�‡Q/ß«�u@nkDÚ«zp¼¼g,ö�QQ#ˆ�`O2|pò)‚#.Ρ˜#ü >qh<—xjª<›|.0«ožžÜ+}�"°x¶¬\];_~àóöÐ;Ë¿­•�ú»‰âÚïVŠŸ6³§ßóì¾ÏFòªÏk•ÖòG^YJÚ”מxH×[·qg_H\Åëõ|î½­bŠ T®þ}Q— {WÉ=ƒ˜%™§“…ä‹søÒÖÕª}O6Õuâæò:¹MY­…˜ww9^öJª *¤÷y¥¢èÑ2ÔgÄ”Ëó±/CQühD�hÎI°=_õ|Wýƈ+·–+é\…u< ÄDý\yûrb§em?Ëski]šO97þSQùl-| Wܾ–‚�Iq‡§ÑZ*Ý/zl*ü¾òÑ Øô ³Ùìû‹äÏW)ÊÛV±•mÄê6S¡²e,å%Í?áQ¿Á¹Ë –ÂN`׊²g+°w„Ý÷Æ�;Ünlîøs¹eùÛŸeO—Ê«ÿXÇ]|m%Þ}¾�¿ýÂUºØîÀ�|Ê ‡Éƒ¼Vy¬ÉŠ?Ú&�¶‘¿{*OµZó'_rŠ´si÷æÈs[~°¨þe9{ú%¯¼Øä¬<ýÈXF¹¿IÎV¾Ù(«zº¹Dž°×€Ë¾»D*¬_#œ|*ðG_˸¼†¥ÕªI\IÇ*™úÎ…Çn]äÝlIûr« [¬Ž=²c+~[Ǧޞ�_1þÒ,*.Wød9]ÓÚ}nâ1­wÚùö@>ȧß]„JqHöƒĸó3±ÿEUþÄL,½5(.æÄ$’?�`C«Æ°áûÆÊ£N�7Ë2×ìD×ZÙÅ¿ËWWÊoÿÕ†½ù»½ìþ¿n¶¬ë²eŸþ ¼~Ëu|bëßxð·Þ¹àÞ©êjÃ¥ú¦ áò[{öü‘½ø^’.7»¨.ãÆÄW>R\ù¤N½Vòeï×ñÄl>PcÍw®¶ØìªmnëÕâšX µºyÛGu©Î]<þÚJ8õV%~&*«Ÿ*”ûšY¡¼ÝP¬zmÂW¾6äãÏM‡X¿ûødV]³ˆ ¤fÜXü"Æ’yžV³PÜóÌP,¾‘-{½Ú²úו²‚÷K,öüþ“Eõß—›Ýî’[´u9ËÞü‹·ôþq’ðþånyÓ¯nŠö_}¸wŸ"Øw¿‡)?Ö¤lysBíÔy(Wúð$Y|ýJìõß6 7^;I5Í~ª«-žâ±¥êh“µÍ釮›¯Þð±9[ã!�x¤’WýºVVôt©p॥êtÓVþð[¹"ïÑÔÿP3ª:Lˆ2Sí}$³9Ò`guè‘ ù&[þl-[¨x±ž=Úa!�j³¯Û±·ß;p^{p÷ߺsw~qTÜú›�âúïV²«¿ Š[Ÿm¸‡¯Ü•�µ»•Ïîlj ¸KÏmØcodlõÇ�ò’ΟäŸ×`>p'^°ü™g’tºÍ†?ÑÂsÕO�ä•/V UOMUgë`ߪ �…£{ä•9{à…±p´“•N¶Ú;m‡~3”ûdÌî”+N=³”Ÿ}¥P\y§boüfÇß{íÎ?|±�»ÿÊ�«¾ƒkx᩸üAâN¿â›—ߊŠÏeò³ïd‰v�½Ù¶…kîð^¶E[½¿Ÿ!}lI–µw¹[4uÙ+Z~ÙÉ5¿ð㮿µSìÿ¼‘M'1Ô?gò2¬iR_Np)âêUé�fZø·Õ©Jåíº]öç®ìR<^Ç¥œ�ayø�õò#¿É®þÂÉÏ`-«ÿ²R–ûv‘eÑïKÅ’�UUr›ã�NªÛw}­jï†m¾;ÂúÆér“‹òH›(V?3§XeïÛõÈÓXçø=ï7L¸H Ø;F–ß´XvúO3yÍï¶ìÛ_B¤Ï÷“¤�’„ÏÏãù?_Å Ÿ[âùßÞÅrÞEJjSœžV«ÝÚ˳£ë’ò3Æän}q8[ñᯡһ¶‡ç'ó¬_ßWKo:’”ÏÚØÇ/v‘ûéÎ]ÿhÏ_ýh'«úc•¼üà å•Vwë[ƒUç:œ„koؓ܅W’t¿ÕǺ£&Yªm®·»Š5O·+ï6ø*4Y7ÞŒï·{)¯>vïÏʼâÕRË„“yMó,ŽþŸµºÌwß9ˆ�ÍѪWSUïSÅW­»…wí»¥×­‰ìÓçþ–þÕÆòÁ¿XËüi/«ÿÕ‘}þ)@øØ§üܘfÿêL®ô¹-™­îÉ^}­â¾5•§ß™Ã¦^›­Èz¼Hqà“ž/µØ[]­Û©ºòÐ]uªÞNy¬ÅJu²ÑÖêX£ w¶SâÏ?WÉ/¾âù«öâÍ7éÊ“mÒù§Žâ¹g¶òcËÏ|°àHüå¯>µ—êëÄÇ�BUm »m^ÝÍtz~¬Èõé�¢­/OæÛ½»š+~x'uÔG‹µM>ìµwÖüý§|û£Pë×w2·¼½’ãÜy¸Ð½½<ß«¹(çãülÏÖ’<ç§ÕÙVn¤rßDÊšþt±8ó7cÔ¤íiCÄ�ʱŠÒçËÙ} ù½ï áÛ»d¡—Æš•~ZÄÝú¸ÕúÙ�TÛÎj›Ç·ì^\ÌÙòâZŽÐØæ/»û‡�ÉÉ®•–Q—Æ[lñïalh۬½–|hœtꉭí‹kÙ®�GнZ÷ìqì8SdÕ\‡¸ÆiWˆûZÍÅSä>]¿¿ÓúÉ�xÕµúíü�63å‘~†ÖîÒY�Kl.·ð~Tvüƒ„Ø ÝëãYVo¦+?ßNµ}sFðDMm²úAhÖñ!Y{îGd»·—æ(‰ÝÚ½:•åØy8Wù¾!Ezßž¸ååÕl®åƒ¯Åé®MŠê?ÖËŠ^ýÈEžŸÄîýuƒõ…¦Êó/å•ÿ²Fžr–Efã,Ù¥ß9ÕÓÆxû—ò·>;_`õ¶1Cèh —^6ïÞüú^–òec"WóÂUv볕广™É.¾Vp÷žºpõO½dM¿oå^= Řlyy>[|T`~ê/ëM+Í7«ú°ÄäÄß—›Üè2²hû›“kGe^Y]xna}D~bÓ”¢í¥Eö¯Næ*­O—~yš,|îLš¸åõ™¬í­¥NO÷gÛ¼;—aùèï[ÍŽþm5wðWSéÔSç?¬âÎLçSïÎvåª_ј{¢C)$øï@‡Üªò‰LYÒiÈÖÿ¬È¹·H±ïÓzéêSW«úÚpem}°pþ��¬ê/«d™5³å)·gZ¨ïÏ–_ø(W>®�Øúüb¡Ã«KªµIâó¦h«�µ™;[‹Š¢'G>N**i Ë‹~œT¦ì¨‰eŸtî°yOÖ’VÛ¼;'£%<§²1D]Ý”q¨>8“\oVl]|vâýø¬ÄúÝÙÞ͹9›ßœÉäß¼‰d¼wã.}°Q^lqQ^mqWÞ~´KºØâÈogùƒíæâ§ÖxË�]¾üo/c]Û÷x¶ï-qoßWìÚ~¸DùâQ<[ó‹³ÅƒUÊšþî(oø7'Ó;]fÆWºÖ™–¿Zh¶÷ÓRñÞÓ�›ßÔdoy}%›ëxÀռܯ=xæAð³£TÑfÆí¾I<Ù¤îÕyZ·\�wì<š¿åÙù,§Î“E^må{ü[ÕyÑ�²›S2“¢3+ëBÕGfÞxì“VÛº+ån£_ú­zÿôM>© �|RkÉÏu ¾édœ® ʬ¬ ËJ®�Ëso)ϵz-UüД`ûê¼Zþä_<,ÏwY(NþKîèï–Ü™·¢xöÅfaß'3®ô·µÒ¾—,wâwV¨}±Sù¶-YxÙÍ¿|©|ÿ8Mú\—Æ~x.üò,^õþAºõÛ5×ñ2ÐòÒ_-åŸËÅ›M.ª¶û±Ê÷�©Öïï¨Ã›RJ›w—íh¯Ú»åå¥låÛ»qv¯/ån}u,ßáÕáߎÌÜÔG‘ÙÇÕwû¦ßjñI»Öê“v›|½ñÄ7íÆcß´‹�™§È¼+kËÞó0,»¤.<;º!1WõùfŠim—`–þ`ªå¾®•‰¢túýfå‰W¶ÒívOë5Ö-w“lžÕdŠwZ=dÕVË+Þ­–ªÛdÒÙN;åíÖ�Ò-“¯þj«lz•XŸPòH]fóô®Z¸ñÔY~𯆖EÍ‹eû~]Ç�+ m­á^­%¥.O[¿½K|á�ëw5™ÒoÍ©[^ŸÊökË.*|š—û8¢È½£ªDùþ~*ÿâI˜ã‹cmI…‘Í yù�CÕ‡3ð8Ö˜yŽŒÓÕ‡ê+5!yk‚³�=VçÕFf9=ÛŸ%~êHžµE«5Æ7;]¥�}Äû->RÝ£Ì uM ±ë„ìøºøœˆº´¼ÐÆ´¼âšÈÜĺ„"öå›Póë]–­]N[‰J~W�w7:gÏÝÈìÀ'YľЋÓêw;‘sS|øb|§ËØôz—±¬ý¼·këÑ²ÔÆ¤ýI�’÷»?=\aÿòTßRç'Ô=Üñ8­ã„ÇÕÿÌC�‚2÷Ô…fo ȼÛâ“^Ö”ãðúX®âÏ×afoºÍßýW‹?ºvÉÿøbýþ|JPcf^bÃîÜ‚Y•w#³²r<šK²<›KsœÚ«Õª7·Sl__T+ß´¦*Ÿ·&)ÛŸÆ gÿÜ¢8ôoFÂ¥?ílÛj³<ÛªÊÜÚ« žËÝüörÖ–7s„OÏvËßüÅ—{û:\ü½1ÙáÅ‘lÛwgÕæÏºœÍÛ?:°Ïù;¼8‘Öœ¹ÏêÉ�Ók]F&U¿/4I8?ÖÄ·x°iPñP“’¶¹æuo_9¿Ü——Ö‘—ÿ(<ÛþÕaµù_ºv¿ì²Úô¦K2zߥ4z×%¾ïâŒ?vÙšÿÖåiþ÷./þ÷Æ(þ�Æ(ù¯¿wtI›²Ú&›�ìZ¯¸ó÷-RM»Ÿõ£Æ8§ŽãEA�²J³êb‹*†çùµæ•)_7$ Í­¡ü“gþⓆ0åÛ–Ï–Šâ�ÆÌ"¿†¼ÂC·"²ÏÞ ÉôiÎ'>ûRžê}]†íë[9ö¯Nåîl/.Kx_Ú”QäÒY•ËýõU ûâE�ðº•øÎº û×§s];«ów¶çåå6‡çE?I(>·Ç+^ý xñ»¿Åã.[“»]&F'>.Ù”–7Â(eÿè�5]+-^þ±Mü³!9¶>!·¼&\MâžúÐÝputmb¦k[E¦ý‹ƒ™Üû‘|ó?îÚg;ÇøÖÁŽÏŽD>J.:~;T}õ~`æ©ÛaÙGï„‘¿ S_¸¢Þs/2Çî%‰±ïîf ¾Æ×'ä]¸¬¾Y˜^M|ÖƒßÔ�m»’?‘Ç]âë"Ÿ$äÊþö)dcG—…ù]^/gïm Î½Ûæ�v¾Å_}ªÅ?+¥-ºDüãa’øGC"â¡ÍÇÛjË÷Ùit©k…I`Ê€õ[ݵ×XïÐúÉRb~XeÈ,Xú3³hÉ*fÞ¢•Ìœ?13­`æ,2e–˃º­ 8?hmÕ¿N]÷¤k�â×g!Áµé™{®Æfº™•q+>;ïF\vù­HuÚÍÄœ‚ÜZ«ò„·oâ¬^Õglí<–GpQAZm\aÙ�è¼=÷ó÷Ü�S•œgÙúoÎVŸn¤ï©;JüÛÅVŸô£O}ÒŽ>óÉàÿÞ²Ûxÿç…¦>ê�«�Dfúh}f|w=f,£ÇŒf†0ß‘‡>ù~Z¯ï˜Ùß0«V‰ÌF)@k½*\{é2–™4h43ŠI^5’ÑÕÖcj}ÇŒè®ÏŒî5‰Ñ2‹?z3uêrf¡™;³jwý° —»~4nìd/ÿÅKq§k‹pçwë÷ÔÕw"soÝ Ê¸S”q³Ö?ý½ ÌâºðœœÚè¼Ø†Ä¢ð†ÔÂâ;ѹG蘆«óïÅäfÜ�ÍÙüö‚ZþâOoöÝÛ°€Öôܦ6ïÔæŽ])dÈÿþ.ܰ¥ËtÃþ?gm:8ØÐ·b qðq=£¤{ú†û�³ñÔ¿-4<ÓµÔ0÷ɤŽÌDýÙÌø}½‰ä†1ºL_¦Ó›éCÈOÙ¡Œ¾ö0fâ}föbsægëtíÞ—ú­,ø8f][×z³_»¶YüÙåkõþrªøöU‚Ðú1Bl{-½~–èøüpnLcR~Á�è¬ò›‘ê·#ÔÄ/fUÞŠÊ>W¬¾~?0coMxñÇêK·CÔ×o…dܺ”Qö0<;«>:¿½}gR×+÷´_;}‹ÿ|·=ÑåEi†É_»œ×ÜîZ¸:òú�Ÿ$ßns—®f&OÒgf̜¬µñÐÚµOÏ0¢rèZG?mƒ±úÌ@¦?Ó‹éÉè0Ýé?r]Úä_7FëËÏÝÉ3ýÈU÷!¯êA~Ò¦Ïõ#ÿ¾×�ÊÌ™'2?*´Öíš.¼»¡¾’¨Î»”�¥¾§Î¹—•s/&+ïVlöž[QY{oFf¿žuùf¨úôÍÐÌs×Â2�‘¹y´&T}ònHÖ�Ú€ŒÝ ‰üo/â„_šãä~ÛÕ‘“{­�Äà§»ÒrÚBr6¼ê2ùÉʉ™2r ±ÃÁäüqn=ÉYiÑ«ÀØô%œi7æßüþ?ZôjðJÜ]¦g·Aäk¦‡VòÓ0fÄ ̬…[˜5Ñ�zHÜøØL|”�ô®=ѹã@^õ�Ȭ[7C2*ïDdUß Ï">&ãÊÝ ôÈúä<›7çÓ¢¦äÃ6ÏÞθ5%¿ñ¹WJF{H¦é_»\×d_=ÿ§MŒ~¿aäzÑóïAÎßë’kJ,n0ùßwû/WóŸ�nôêþùº»‘»>äý†‘¹8ýgfEüÓakuM3ùе•ñ&Zõ¬!Ù¶ãR¦cÇþl寮<ŸÇÙ¹×®,Klc˜w;6ãxêZdöÕ[!tÜàKÏÝ Íj© Îyñ00SúT“@ÞÏ~Ó‹.Þì]—‹å]¾ïw­[jbÏ "#ôûÀ5j}¹#ø_çË=ÓëiÀŒoÂÌZçÍüÖ8`í«® ŠÏý½§^�Ï>z=2çÂÍÐìó7ÂsÏß É?y/$çÊͰœÛWÃs®ÝËJ½§«OËM©�ËI®‹Í®¬'yW]�úPmHfqmd¶Åo]^ë®u-Z}dèJ{?­Ù³1#´PìMÏâ?Úœ½ÿÚÔNñõ?_ƒÆ{�ß÷¤sO3»Ñïñ\/ò¯/ñªºÌf�ÎDfÔð5Ì”�™E6åZëš»ÖÉydóúlÒþ»a™É5ñÙ.•YȇÝ[ʲ�Ë�Wì•G¾ú5eå8vîWãùý÷C3ëfonòI×`]Ÿ´¢Çay¶ïN© ¾�Vz§õ3rÄÿë½ïNÿ|­_ŸÃõjù�æº{Ð;Ӈܡ>äß:{5Uヴ¿\ko:ÿôÎc¦-qf–:ÑYw¨k¦ìu—�]lj4φ=9ê;»©ºµ”e5Ý/¼+4ç Ãæ»¡…m·ÃKÚî‡6= ʹv'4‡Øgöù[aÙ…w£³�>v)ç.W2Ãt‡Ð¹õßù…ÿíñõ:ÿ»×Ôû˘ö ÿzÑë@þ‘˜8x3n²Œ™ºb3_*êöSe×ã_ºìíZÇ_ŽË>r%*çÊõð¼;7à Þ /­­ )¾t+,ïô­Ð¬Ò[Qê ºÌ,<Â듳H|Wç4D¨·¼:’jXÛe4}ò¼ÿõuh¼¡6=gíÓn_~ׇü¶/ù7¨Ûf˜öf@7=2NCˆOEbüXfˆŽ3 ûD¦¿öfPï̽ Ì´å¡ÌÒ­×uVÞìšÍ¿½Lp‹šÄÄ„¬Ðº´éSm¢Õ‡+É.mjâc²._YJÂ| 0ù^â[oÕªÛÛ¼3‘œÓ§=3Ûø�.»uåÏ'ýh¨dFh÷ÿÿæ¿øJüü5^`žê¯„kÞË€Ñ>óÝÐ¥ÌÈ!?0Ç-fô/d†êÎa†öœÍ î;‹ŒïûÌeôú‘×é­d&ÎÛÂ,¶ªÖ^³¿kŠé‹.GûÖ#I®�{Ӏ͎_ŽÊ*$±ïéíˆ=í7£*žÝ +{{/raïB÷¼m .mo,¬­ .BÞµª®kÑíÿ;þñ«Äõ§`¼†ëè3ƒº'? £ˆÈOâ§Ö(âKÆ2úOa†ôœÁ é=“Úo3bôfÜ‚ýÖ…0óø’n …2­_2þµËVx}=8ïj|Ö‰‹1ù÷n„å=¼šWw;¬°îApÞ½[!y·o‡æ¿šu“øÓ«÷‚³ñ|öý(õêή•Óf¯ü__ËW¿ чzöž_¾ïEýHï/ß$ã8\g<ó§QC0£õ0#GÿÌŒ2XËŒ™`ÆŒœ`ÉŒœhÆ µ–6n#3z2ÇÌ4Jc~ êÐ]q§k¶ôürpÆåä,Š[nïÎ:w+TM°YvnM¤šàÌäGoüB°ØýûAY�o‡dݾœE®Q½é÷®ÍKœS´&Ì_JbëÀÿñuÁOö¢ž¡;ý^ã5s°E#˜aZ#˜‘}¦0#ÍfF�ø™1˜©d&ÿ°�¿Àž<œ™QÓDfÔx3b’œ1Ö”6|-óÝwèïf[ä0Ë‚ë®}ÞµÞä]—�mëñ÷º²¤Â‹ Y.Eæ7_�(¬¹^Hb|Þõ»Aêç‚s?Ôæ¾oòÏûð8°¨éAp!0©áß»”šÿ¯Æ ç?€b´_У&æaîi~§K~;ˆÑë1’Õ×€Ùo3|ð,â›§2zƒf’ù·„9x3|È2fè�Ÿéµ�žbÍŒž 1ãg»2S ã˜[Žk/Iy5hÅ©®)«jº™|êrpx²/ôҕȼG7Ãr›É8=ª Ìê¬ .Àœ{ö8¨¼³1¸´³9 äNm0É%âÒW?îúÉ`úÆÿµmj®•¡ã‡x6Xk$3X›dHd^ !sn¨öXòÜX¦?Ãä1¤çfX¿äÚæ1z#û\IlÒ„ùnž53f‘;3nUc`’ÀLå ˜©Šbf®í­e©¶¼¶k.û¶Æ{×­’ÔÈÛñ·“2ïìÕH®íÌýàìs$ÆÕÖewÖ循 Êë¬Ì»q;$gÇ£‚̵wº~9à»ÿñ¸}�oð÷ˆTCµ‡3Ã{Œ#×ô±Ç¡äy]±ÿöÞ3¬ªkÝûžT¥ª€]ÅÞ;vA¤—µXköUè Ò‘ÞAº¨(HQ»Æ5±Æ5ÑØ»¦˜5;m—ì}ÎzÇ�쳟÷9×yÏ—÷›3× Š«Í9îq—1ÇýûÛöþ›ñf°ÅDâÉØYÍ ~s.3|Ð2fÔŽqžËŒ_–ÅŒõ\ËŒs/fF-Ïf=r˜‘¹ÌDU33x·ñÂêý\Ï&)ÞVɯþT¸æÆ®ºÒ+M �^×z÷ãò]/—w]¹R¼5ÃÆ[ÕÍiOv4_%u£[ytRóÃÅJ×£†qC‡Îø_ÇrSšk!G$ÑË”Ä2+'âû�™Á¦cˆŸE,r µM{òŸƒñ r~£™!VÎŒ½ÕhâÉ£ÿdf�ñÿξŒÓ´PÆiz3zV3vi36°‰í[ËL‹:bìRñÀjÙÃ÷ÇW’Çë¾<_žx¯scý¥º-GΗm¾}iíÖGäÜ>¿RÔxîóü¦¯îf×ÿùAîŽ7Ïrwݺ—ßÚöyiSÐoߦOÓdýŽYoü_ÿ×ôæÂd´¬È\s c8”>LF2ƒûÍ c5ØÑ�Ø 3ŒØáÈÙ:fäL‘ø”@føX_fð07fðhOfðÌfÔ"2ç‚ê˜Ù±ÇLæmzl³¨Ç0tùmÃl·ÛåÏÿˆ‹zÒ³®úZMãŽO*·ß¹ýÉ¥‰�n{v·`ç7÷óÛ^?Ìßõãü¶oïµ}»kI›}žÎN þWãfòoþ±×Ø’s!Ù‡õ$Æi¤3Úɇœ‡+3t”;ñË™ACˆÿâB|&™gd®�º„>lã8Ø•1FÁ8N˜1³c˜‰k™él;3cÕ)ãÙ%·úΪf¹èŒaä’Î߆­¸j˜íõÊ `|–üòtEù寯�6lþâJy×µ«EÛÎ^.Ùª¾ùk˜âcƒoÐ R_\ý5LúòEIÐ׆xÏÏ Ë\«®Ù¶ó?žWol³ Ù!¼¤%Ͳ¡‡1È8 ê7•Nâñ¸YQÌdÏ,fœK83n’Š3j)ãHüåp»iä�˜7‡1lÉ)Ìè©3z¦†ï–ÂL¬c¦ ÍÌÜU™Ì®ÿÚzÁ‡†ano ËÝ¿2¬|gˆR¼6ÄJß}_ýìpCüÃîmßœhв¯¹ãRUsÛåuÍ O{v†~wcKñƒ¦Ž[·r6};»~Ç�²-ÞßøYþÉÿã¹™Ó󱡱¹?3˜ú+šó[ÑŸÈAà/ÌI2‚ÌÇÁŒ�NŒƒí4fèh?Æy9É�“Ï›.­ÿ~àÒ†QË?2LD>¹üŒaÂ’]ÿºhókû›^ XX|Ëza晾K×1Àí”aÒÊ· ?R”6$Ê?]«ýþÃ�)OvlF=‡š¹æÔ®W‹·~|½ éæçy�O?ËßòövQÛýÏ [¸Ÿžæ»}fÿþ¿±M‹ßc9ì™ñà>Ù¦3c¦ø1Ó¼’™‰|63!ª�™šÊtZõ§æ³×f1§ìÓ¾32ÏšÎ(¸`6¯â–弚gÖóªYÏ+¸Þw~Ö•>‹ÊnÛ¬8c˜¶â�aÉòCg× Ï¹ï7Lðz`ðò{d`ý_4þO ²ú�!3ãÞö&ä,8¯}$w.ºÓ°]!(Ÿ€ xºƒOeþäO¬¢ìȰår†‘ó„¥ÿƒ]Ó1ƒ_8˜äÃC\™A£<˜Á•Ì„ÉÌt®‚™ÊU234õÌœØ&.îÛ.é18.¿@ÆçŽaÞŠ;†…ð‹k˜Óm2CSÃÌÕo1ZÀliñMÛeÕÏíݶÿùZ§?s/FûÉóìw ¼frÕÖš8˜üÏqë!˜iv}G“\63ÒIÅŒžÂ8»Ä1ã=³™iªrfªw3}i 3e.ÏL˜êÁLœèÉL�/3ó¹Z£©gú,̹f¹¢ó?ÆxÞ5¸û>4¼6„r?ýZõå¡Í�×+Õ¿ü’Åþø[®ßsƒäÝýש¾»^Mõ;h˜pÓ T|nT· ¡ìã·‰Ò“ùÒW÷ÖF¼þh[ø«‹[5?|Y+|>3nN3Û+žqáʘ…|>³8®ÕtaãõËÿd˜ìù›A¥4¼[£ùó¹bsƒþóç5ìßïe«þñ4+ðï†Õž¿^?T~¿tþ?"Ä?¿* xeñ®ûd„_|“…WÔsÿ«_õ-CDàþ,P¢>m¾~Sûò`Kô×G›SŸtîŠýòhk 2€#bÍĆó³´ûñâ¹×ZeçŸçy¦µZ��´˜ÖiÿÝaKÆmä`fü45És«—øKf Öi»¨Ý0˜ØÞï ¼ÿ_ þ¿"}5hW<5,r»e˜ãñ­Á#àï†UÙš6ï¿UÔÔ|»dsñ½ MšwK°†âKlÏó¢ÁÅë´a®÷-ƒ§â©!TõÊ�̾ýGžö—{¤Ÿ¾ª 8mp Ž5v›³€ñõô`ÐG‰}Œ\çW¡ñÒ,MîîÚ„†rÑ)gaßßýäSoƒùÒãչ݃ý¢êúL�­d†ÛŒý¿Ö‚þË6MHžEr¬~™±ódfnp›ñ’ /íáÿVþHçK˜òWC¼ò/†¤À?"ý_ðÀÀÞ2pþŸ”� áì[CnÐ7†8Å-ƒxÞà­Üürš²ì˜£¢ãÛ¹êÛ�¾ÿ®Xýƒ!KõÒë¿ÿó•Õ'�T;Ìã{~ô>|'©·>‹«??•k½0_8~?HsêºVwëZ^è£Ojå³ß„JmïVŠ�·]ĺ?ÍO=CŸ^¬Õ}{«NqÓ ÎZÌÿ·çeIüb?“Lÿ¾ŽŒ�íhRGÏcFOöcfd3.q‡M]ª¾°^rø?Fºß1,&óIá}ѰԻüü`ïøKÿâƒý/<ŧ_äÆ~up‡þÝ'Å·OJÙï_ç^5(ë· V$®2U¬I3W•Ûúo=åìÍà+¿zR.=yž¯¬<6ÒG¥aòL•þ¹Œ;ð››´Á– Ë5.��£Ñ^z/]x.]{§ýìfFо·ËØ¿xpÝ_»ó{~ð�Ï~Æ_ù)Ìï¼Áuåš}V£',£uö¿v$fL�Á2 ¥õFnú­¼cpõûÁ úÑ�âÿÆLüµVIâ.ÿÓ/%ü/ïJý‰oðÉé°ÀÕ‹™¿p˜”jtâµ·æÉõ¢äçÝYO›wE¼>µ•ÿáíZÅmƒì»÷‡é~Õ—>4¸*.;¾ž­l<7^ùáoÞüG_ŠÜß±GÿæÃel·W§˜ø± §�3¡œ$ð÷‹Û…�‹~ Ô_~’¡¿z?CÝþn1›Xe”Õb矲ÅzI@ 3zè\£MèzºÑïviÆô7!qmÈf‚ Ë,Ð×¹nýv˜ÛyÃT÷G†e¾5èÙß¾Êãÿñ²TúÛ£õ¡o/4áÞŸôæy™ðàû þÓ_"¹KÓŠ×Þ%h<)ÕÝ|V$�z«årÚù¹ù1>‹2¢Zd°ÿ]µãæ\åÙÿôRî¸>C•¹Þ}Ðìö+³¹}o<…ãß«Ùí÷æ±…-C¤ò]#µë;ÇKÍ7—w?ôú<;äæµrýù òÉ/µòþ*®û›•\óçóÔ5‡Æø¥n±Æý6SºvðïÆrPÿIÌÈÉîÌT¿$fIÒá>+?0LñùÎ �úrÖè|ß$ÿWYyßp䟋ü# Ì|üCow5¤ a$.Ä8,6×:|mûxyÛçK¥ÚÓÓýUŒËèaÌ¢±Ã™%xLÆx®pa¸æ+s5—®Î}-©·}2‹O­éG÷Ÿïÿޟ-°³ÌÁ’•w}í!·¿ò.Ì:^¹k=•Ä»¯Ò4מ¦p{ÿ¶’k¸4M}üg_þê»HáÑëtÅ7†ÏÛ·åë>·[Ýe²`Õ>Ó%«ö™¹Åîïã™yºŸÇÚ³öÞû~ž&¼{[‚½8E÷vr¯Î 8aX®Üþj¦²ë§Š� žß–e´ X²Ä•™á4Œ™=|8Ãz{1a É–Q9#ò+‡¡O,èøO§/c´·oç«?ü‹J}ü/¾êCõ`kOŒgókì¸ú½ãù£Ot�æùþÃC]sq<ŸÓ5„ /0W‡§›±1)f´ïeß+EÈÙ/’ƒ¯<ÌàοU[?›©ª=3NÑùn~`ë÷3}‹O Z¡-2žéªgÆ“ØAÓõÌ7¼û®NÚvs‘”·q z0„ÚÃøÎ¯W;î/áëÏMg÷þà®Ûÿ¥ ýî^­þé­š CÿáÆ–´Wï¸9‡;÷N ~z£:äí§›¥_¯WÿfÈVýÕ�NâY‚Ï×Îç¤a�Oæþþ®Š0ÆK»Ê(`Çã©â“osä[_gg‘ØÔmV.÷a”ªP†öhT4‘«9;ÑW­cŒ›Â,›<‡ \áÆ„hÃM"Ò í¢R íÃ’‹úës7 áÛþ´û|å3�B¸S_ª¸ý?z©ö½ZÆVv:r5û�…Ã_+°¯–=ø‹§jûË9lË.üÁÿðWm»=‹ÏiÌ%äY¹MÕ� ßúsûßzªÚnÏS5\ž¤èüv¾ò”ÁSyܰ2pÿo ýþÇ|ÿ†¹žŸy½1úþÅ õzgð}dð÷¿nð ¼hð ºa� ~þÏ9$™†'™…%šøúx1 '�bV¸¸0¾Š@†�È0SЬÁЄŽôETa©¦ðb~ÇpŽ\[¾z÷hÊ©î¯+¨,&–X‹YÛ²ís»ž/*ö8 E-C…â­CYâ u¾ˆ ûü|þ-[ytŒ:w“_~b¬öìóÝ�/J°Rýz®pô�ZÝþl¡PqpŒ�ÖhÇÖ~¦°/zÙÀÒÓeTÛƒÅÎ5žŸÁïå£ùà¾F>ñ@–Ž=äÃOÔ¾ï}¸ÆÓÓ„âÃ¥ìÆ�RAûp!oñ·;†rU]£0UÞ¸sŸ|¢ùÓýDîô�*Õ�_ÜÕÝ?,W÷ü´B8ý� ]{‘,_y§>ðë 6u½­�VnËï¡j}ä"œÿN¯{v·2æ›Ó;¥o®U^0(?2xný~j@á©Á+c_!Ù80³­ÐIƒ—ºîÜø@m²±*<׌ É4Uò«�ݹ‘ù7ƒYNò>}}¶û7Ì›@)ØÌ p‹Å°$S}z­ƒvÃGsäÎÛÞ|ÇMW¶óî2q÷so0 ôGîêÔû¿uç+÷9 …Û†ˆe]£Ðë…þxiÝngðyÂÿt>?áqÏŽä'{ÛÂn\)Ñìý>P¬ýxª°îü$nÏ[7áÌײºãÅöÐ�^ܱoøºcøüz®¨yˆ*¿m ²úè(EÃõ Ь½ö>úLcO.ÁÈO›k¢àÓ�ý•FlúV;Õšz[·å�̘>öÌ@R7Ͱɸ/^ɸ/ZÂø)(‡XÁ†qºXª‹“\Õ_gÆ“s…þ‹>¡ÂÜ-]ÊZ[99ß=ÃR÷=Ý©ÛáÚ£Ïõ\ÃåélnÛ nó§³TÝo\ùò#c Õ¥ÔÆsÄV5§^†i�=×ñ{þì�ëÈ5^™!”t:òÙ›ìŪýcÁäN¿ Rœú‹GбŸ=‚Žÿº2hÿOËÔ5GƨÊ9ªóv d+¬0.~ÐSjôæ[ÄWŸÏ¥ÕØÂ£cÐWª^•cîGò0_…Ža5&Bqç¾åÑ"qÇ3Wp³Á3¢<¡cOyöàOôv ;n/æöE(n!fn²ç37 às6;°[Hœß÷ÖUÝvoAÐ�7®ì‰7JîÒ+½ðñ+ñuˆtåËhîÔµêÈožü¹7ÕÁ¿®àâË­¤P#eH² ú·ø}?úèÎ=\üŧkõŸÝ,.¼Ö)Oþ§§úCC ¢îÓ±^êhfêà±Ì›QäçÆÓ_dT19æêÕ9æAáɦ\d¦¹ZŸfêºÂƒYFüç²ù‹¨—Zc+$Y©B£Œ+äÄ Kmz¥ÕŒŠÉ¶�ÂMåø °äžÇJíÑÇZáØ7A\EË>«ÎNÝõp‘°ç•¸†Bfí9Ó`¡ë¡»îìõ¨ðkçÖÆÜý 1äüÍTaÏ/ô I%GÆ›ï»u'&‰•N|Ãř†£“Hž0IÕó“«jë�A¹[ìTk÷SÖ^pV§6p÷ õÂÜÅÌ’ùîŒÛ"o&@a„>KU\…ÅÜñÓgKf¬�=3µÿf)É?�_ï­Ùt|zòtëNO“šï, ®Ø?II4U±2#êcM)‹Z©åý5%�Ã¥-§çíŸ.cÛo/&¹ô4Œ¿ºåÎ\õ±}¤£ßñê=Ï—BGAHYߺ |ùéÜ·‹¹¶‡‹Åݯ½é\ßpt¢Pµ{4·íæ<ñð‹ áƒ,ÆV¸ôu¨øÉ‹HþÌ+�ÄÄE\é>Gu\©…‚�5öòOW£ç>¦¸/Ÿ²©?Ÿß5 Ü(>ª°�Bˆ!¾#Á˜_Ó8€ØÂH¡”<6|2}+BÏ[?±úØ.®Ð‚K)³Š;HrÃÉ)\Û­ÅBû³ÂÁ¯ýÄC_)ø}ßzPÞö‘W�ÂߪѧÁ¶?]Â6�Ÿ¦ÚÿÆ}@¨e±ç[øø�^½ûÝRUÓ§ÓT�?/Æ÷ç³Êû±‰ùBÍñ l÷[7nÏ»àfrµGÇsÕŒc7_Ÿ©êüv‘òà¯ËÕÍv^�¡Ìœ 3™ic—±3˜Å3g3+W®d|ü™•Þ$¶‘üØ7Hb|ÆÛSÁxû*ex¢ ›Õhö ü z´ÁZëOäÃ�9ñ=\¤1Õ�Ûvy¾Ôñt%ßùÌ Ìn.©ØJ¨Ù7V<ð4Pwø¶¶+Vw;KEÍÃÀÄ’>`5§êä“ϵÂáï\÷ܾŸ¼ÐÆ·Ü[ˆk(¯­Ê×ìqVï¼>W8ò:H>÷2B}øo^ªº‹Ùº›S•¯]‚:¾_¤®88J‘o¦”“�}Ù#eX¦)—´ÉVµ:Ï|á,fÆÈñÌây+¯åþÄoªhD‚ ¯­:0Q×vÝS³ýÖ2è®�C^¡ŠÕ3A �¡z˜E�CÑë~÷xô‘’80R(عږ�/²äâòú‚)–vfw>^H{�ë?œÆîú|!z+Iü Ö�º!Ÿ|¬Ó_¸�(_~¸Š?ö]»ý³9"‰ýìÆ'¡7ýkÂå/ÃUûvS´ V§6ögKºF¨»qU÷¼Y�|‡Øæ õ¾ŸV€ÆF§˜aMC¡�0¦œ–æ›sTí\øÂÎaA!Y¦+–ø1K¦.dV.ö&v©bÕ<£Ö†³‘¤¶LZkÍ'åZª¢SL¡AI/f|V“ƒTsv*˜>àºê3i£³úGg[h¤c]t–…~mç±åæb°žÀÆà ¶æ«÷�á:/Úﻊûžû¢ÏUª=0´wùÌ·ZöØ?HÝq¶:£q—ÑdÇu¼YÆv}¿œßr}.»þø8¾°u¨ºòÄ6s»½›[ ã2}.ã¹ÔŸ�Ž'´¾Ôjò“ĵ>Ò˜2?Ê÷RF§—ÑÌTj—ÄoŠ�Ǧ Ý_zq�7—Êeý¥¤\+¹l»#ßtn†¸éìt~3ù¼ž<Ô{¿Y.7rê¤ò#c¡µÁç68ˆ¹[#NŠEÛ‡R¦N©3I.^ºg”X¸}(eIf7 äs-øÄR+ÊÛYÿáDú3}Ó.:¯Xóx úðÁ¨R¯Ê5GŸ4x{ÒúS“äÚ�¦óI¥ÖA\„Q :˜�=s %VRaÛpÌõþÜÕ‡ßxq{¿]Áu¿õ`ÛŸ-•ªŽŒÛœ¡ë¥;k`ñÛ{Ö\Ï×^R÷‹ñØsV<óB'|ø\Rï}ã&lüp ¸sˆìö?ÍáŽ~Àþ³»åÆl® c(ÖÕØ¬­ö|-ñ™Ï–"‡àvÜ[ˆþqðüÁŽTkÉ\ ‹7ár6Ùcm€í|¹”ß|m]Ú××K&u�'ãï'3RêúþRU×°)¥Ò®QäZ’2›p�Õqù}ÕÁi¦ªðhvð;n/‚V˜@šÚžÉRýG³ÁÖï“2®‹;G�=JYÚ$V¨[®ÎQw>YBæã"aë™Ybó' øÖ›‹åÝ÷|u=ÔR×-/a÷aßwÞü‘o¥³_ËwïåêŸß¨Ñ?ø´ ý÷¡W.dI§kàs…‚­CÈÜ�+|í�^\þÐo~ꂞ¡^<³Ìe9ÃÆ×X í߬»¿ñ_Œ+îÆVŸ˦o³C.깚­Á ø6”Y±o<ÕcŒÌï#'×ö§Z9›�)]%èá!ÖéO]�–ßWƒ #„E“ßWô�?ð½¯zïk7°Í¸í]0¾`ÑA³@ˆ#uer¥­P¼k¸PBâ,©/Dâ+„¼Íƒ¤ì�BÞ–A\1©�Ò7Ò7Ù iõä„k>¹Ü†'1º¸Ð ¡: Úc1«Áý­\×7®ë¥+8RÉ®‘T«h©sš¯»@_ úxÐå…6CbzY?0\„C_ú˧ŸhµÇé¤CÔ¨ÀŒÆÚ eÕœ(Vîrë‰ß|i6Ø3ÐáI�ÄïëÃíç¥îx¾s 3 ú3)EÖRÉGä-ÜžoWŠå‡�¡»DjÔdЫ÷Ž��‚¡Á%Xªtð Æ`¾³«3ÌÙØÂ¾üÚý#ÉÜv•ªŽOT†3˼ÿ ™áÂÓÍäÒ�#ÁHH(¶‚ø„BR¥�:*ÝÌËObÄ#r-ÁÓ•M1KF¤üì½Î”¥‚ŸU=ãåê®qríÑ)”•²þènË…YTSd÷×^Úƒ¸ð>‰‰:}>5ôøg‘R×cÊ£ c-�x*h¯>JÒ½ü¼*ôå•zôÊ�U¢=rOD_>ôØÍMgI ÂîüÌEÝùÝR¶öã ªÕå}Ýݔ̒) R€éDãfr™µ?ôˆu‰ÆÊ°TS?E8ñ›áŒžeöTDóeßà–++);-¶Ô ¬(è–€¡/fÕ;ð«Óû në>øBvâ³X©áÌLpéÀTâš/Í޽U ÇR+÷ü´H(?æ †½PKrÊÆ�fŠéõöAÚH#äzbÅ!gÄYÔÕê°S°ý¹5U6`riú« ‰Ï,±㉯ËXo'ƒ7™Ý<„�Î0  1�•p’©Æ±'èXaí‘KˆÄ¡^�Ó–Ð1�2JúÉ9Õöà2â¼ ƒ ·\}pxu$†¹õ2²öŒëºE”•^çŽ!Xlç£eРZ°ÐSmº8y—tü9>e­5cÂ…Äõê6‚±Lb%»óö1c›ƒBo$ß(D‰QÙ}CÄ‚æ¡|zu?ep<Õ�VGÄÓëͳ �ÕÆ”³QÒáˆ�%P)3|X²ô‹H�2H.j M,Äsè°òñyX'SʱÆ$G0b#rÍ…´ºBtnµK9EXù�ƒ¥ê=cIݾÜDq÷o¡ý W©ñô,Ê¼ÛøÁ4hvB»O{à>öñå´Èóeº­§lȦKs0GÙæËsËå�Ÿ…Éמ'¢O5<8®BH(ñe«M„ŒFw�Rêúa­ŠÏÝ>5‚?näºÄŸY8aã±<€QEdš©uI&>¤vu÷V’\šä�šª¿­dC�ÀäüR°ÿùðT35ṁ­1“³685‡'À‚ÛÄo¹1Owè�¬;ðL�ë>˜JÙ…e;Fñ¾ö“ϼæÏýE :jðä«NŒ£qúd¹ÍC¸U©fþJÝYôÕCN�kîå£bà©NÉļzÓ -¡ÍÉGÆ™‚‹Iõ*‰}� ¥PËŒk*§K/ë/¦�¹TØ2z`i6›F¹Ì$‡Ã’Ì(¯jÃÉÚº#ÓÀå‚f•“hN�ØüéB¹îÐð {õ ­µ)Uý¡× } ¾õÆ"±óŽ;r30C©nvѶáà`jŽ>ÖèÏÞ]­9òPä[®/À†6G®%tSÁL²„ø +6"Í ZRz#ÕØ„�a^*¥0#nu–9Õ*kwÖTتBH~BüØ¿©õh,Ϩ·ë][ÒãLõfJ›G@÷‰jºâüIÝV:´ºÔ$F@oKX³®Ÿ�ÙhO5 ŠÛµ•‡'RžÖ9›NÍ�;o{j÷ÞWjvÝó7Ÿ› »”É÷ÌÏ…íWˆ»>wC=¨é~Èu>Y.å·�ëÔèM¶õñBnß�ž`N¨Ûž-ä«zFË…;†ã»ù¬ô$óId„Ør+nu±E�&Á˜‹Ê2çâp-2Ì|©yÜ—ñó˜…Óæ3nàr†)CãLøŒ;aÝ¡±BzÝpâÁR¥:ÂÕvÚüzh÷ €ž¹"PÀûDõÙÀ§"þûQóÀ’ÚﺃÅL}SJ¾5Ûvkåÿœ*œù³†Ûñr4Ç„¤[27ŒýHíÄ3°A¾ë¹;Ûtq:ü¤—Ëx{+è]Ñ1ÈØàÝ)ªãMf}¨1xÇAœ–QËaÆ`ySFtbžµ””iÁ…¦™Q¦<ñ‡ÒŽ«Kt­—VÈ›>œ»¢RÍÀ·][(¶ÝXî—T°a͵¶_]À·¶: ºâ†áÚ²]£¡ «96¬C¾åêBí¾{*¾û/aM¥-gJuÎ+vŽÑlì™ÝA±ûµ¯ÐóÚ�Æú®§n”ÅTq`¬Sa)ÆZrdþ©Èx€+-Õ��Æïx¼Dn¸éVtÔ0fXK›HÜû•Õ<%þFÌo&¶§ùú†�§K;Ÿ»Êí/½tíOýuíý…]_,ƒ¢&«ÎA*í–!8zØÏ¾±PÜåHsŽõ§&‹[nÌ—Û¾Z)w¾ôÕuÞS„tÝQivßõ?‘Ìåéš’–‘º¢úaš†“³Åö+äÖ›îÄ6]hNFr¡bÏhë&Qž^Bµ-41ù¶ÇKÅî7~RÏë¬[`�Ö„jÚ�q éù\ÔtÝñ%~u‘Ðõp¥tð�RÜxj Ÿ^j†¿˜Zj ­cü ­�›cíA*Ýíæ3â 8cBÙþÑbNç06*Ç{$fô—�ïøÎMÜz!±!'Ô~rnÛpÊ®ëzèÎ5/4³°.F×áÊ»GÃæu­<Áz;ž­w|± Úòª¼¾ÐõƒÖŒ°ëÖr¶ëÁRpB±&Bý/®såg¡õÙ2Ý®G>BÇW+ÉëÝÁ}ÐçÔ –ÂטaÞcÍI»éä,¡ã¶›¶û®2¸ûž i»ãÁ·|¶š­RÃñi`ÝIe�©îUå“4]ßøÉ=_)…Ýöà:^.“*ŽŽ£ëÇ•=Δo·ÿ…Bò‹HíO‚ùMW¦Óû)õý¹¤*kÔºA¤„îºBZe¢”¶Ù^&ïO9’ÐŒ!v§£�ý½Õ”w mð uµ'gêË÷Œ—Òjh’Ö÷×ä5[ï/×¶ßõ>�«ÍÝ4˜²�_Á»^³ÖgÒïÚYÜ6’—y©Ôž~A™jkw9þ¡�…<Š×®!þ0ÞDJS´e0ÎWWÐ6R—Ù0 T}Á6Gð`k©æ‰·àâS-¼ìŠrã§.Ú�÷=ƒwÜõÕ4ßt¥ZÞɶúÜ-ÃtëON‡ÆWp*462-¨6ù^º¬^·¸©g’tø�RsévŒþÂ�D°¸}Ü|™@¾—ÅÝyÓS·÷‹ Ížû\ǵŔÅ�š²ýérRCÏsõˆvM±-Fr+’ÿRíERgð$Þ€M¯+ë‹X^ °îøx>~½µ:<à uôK4%ûGkŠŒ¦—•& W³ˆæ�OÆ5„m©¥cèòÁþµ;ïyè[Ÿøh«OMEþËJ‘FA|¨‘€¸Í+h5�¸,4œ¤u�œºÑŒKr½Í¡k¨m%×kç?mõÙéà¨ãâ'Ç‹¡ÉfÚÔÒ~”Á¹õÜ<]Û}ŸàöÛ�`î‚ó ½#®‹ø³-7æR]„ü¶á`ó­/–ò ŸÎ*NŒ6\$5Õ±‰âú㓸=�]ugoF…Ÿ?Ÿ®;ws•êà;w¾þütaãÕbN+õ±ÐœÃ}:qm›#Öõ �þ´;ÄÎ+¡{âãáËxy¿ª’Hbô‡Þœ.©ÄVˆJ4C\¤ºYɵ •‚õwªa“g�y§M-î'ב8Æ*¸ÜT;‹ø¯Ž»^šžû*0øÄî¯|Ùv’Ç@;kU©¥:<ÝÚ²¬gбÆàqëËlu1ÅVÐ8¡LÙ° s‰2m‹­)Sy]÷X|nh@dTô‡7tfô»@c…j'UØRÝÂÒ½cƒÓk†$ÚBSE³®sì,nMõÞñ\Ï /ý™ëÑ!7.H'^°ß•J¦W§iûèQ÷úè6üÀîg^òþ'Êà=�ÔRÇW"‰ÑT;‹Älª3”×< ÚY¬.‚jgiÿM;‹Ýÿƒ;êCÜß ôçh®Ô«�UNµ¨¶Mj¡ ´)¨6<åÒv�ÿ¶÷‡v–vÇ£•ò®g+©“9®ã�Yb[КÇk´ÐjÈÙ0ù´¦¤}¾“]h!Eæõ�¾¼®åþJ¹ý…'tøh¼>ÎX-FQýh†WïC9ˆuû§HMçæjÚîz€«+u¾ðãQh}²œÄ<Ê�çþîüðq绾ñÔ�|~õb‘vïC…Xwx]7„ÎCÙÞQ|zƒ]W¬;9UØziÖÂU‘i¦`Ë$/G\×u>T`Ì±ß 9'Õ+†.4µQÆjmÍõ(›{U²9t‘¨^ ô #RÍ5ñÄn278€}®Ùû,€jg•“kû‡vV ´³H~—Tl£]»m˜±º\÷~×ÎãÊ­T$XÉ2¼a,êÈg‡™Háñf`-‹zb›«a¯µvT�Ä1º&’ZÑ�‹Ym }&0½)÷zë…y”Å �-§ñN¬ì½ºà¼úaÚu=å¦+ $°¸×÷L€þ•vï=rdÜËòHΔPf%Çô²¸©þPËíE”3 Ígp®ñ½7�f-ö£QýÞø‹Þuàlªñ¡�-²†v”61ϪW;«ÑQÜ÷ÐëƒR´³ôŒR=“Œ>ÐéÂ}7è…!iã3-×Îí,Ê+ýC;+2¯¯>×HMýù¹ú’ýãµ$žQÿêµ–T·+·eÕPÌ]ïK]ñfG°ôuyÄ’qÕÄ”ZQû®¿0¯'ñ°_ïë‹{_Ÿßáf5ì[L$¶šY9@·®k|pÛMßÐ�wiÝÔy÷_Üyþîü�§ªÿ›;ÿh¸óú3Ø{ñBƒ˜ MmþΚâ®Qlt¦9Ö$ØÕ9}¤´ vˆñÐÍ äÂŒ|ˆ µÒÎríÈsåÜöaˆÐöã#rÌÕBˆ‘J¥aˆ�˜RÖ5eý¨{FùmÑvG]F}¯^æüºã“…Î'+¡K„õE5É{ -�s…Ëø{xSí,µ¤5b…ig�Æb¢"PÏz¨H|‰2F|ÒEf÷ÕEçZèb²,4‘i}ä¨ì¾ðÑÐâ¦úÔ…MôÅÛá?ÅÄl Ä{ªwA®­´í¢ 4~(Ÿ>m½òV-Éõ‰˜¬Ý|ÖE³ñÈ4MÍáÉT³­¼e”°ç®'öÞ`­,n)}ƒ�@ÞúfRë]7ä¤XÔÄYjã ­°o„jc•uŽÆz Õþ-ìtÒÖõãÂM©–‰™4Fþ¡�µëî ¹óž7ÖRþÐÎB¼Õ¤m²‡=˹µÐ+ƒvô’Q›ý—vVI¯v–žÔû!q¦ˆ/úô åˆtsÌ]0üµkêì�ÁçêJ¶�¤zf9›‡êó7 %>pb‡žÝ‡jo‘×gl„׃·þï¯G¯-ß5ÌmªÙ‡\cóå…º¶ËîÁ•&kòê�û ½gª[ud¼°ç{O¹û;8²ÐŽ…6}=‰�Xš?š«Y·g|¯îzŠ)´¡?€õ@Üó àdF!G¨5ŒRŠ2Bíˆõì@µ–�&¶D|†XerI9±Ò&HÊø Œ ŠôÑ&ºÜšAú²�£¡ƒŽºœj›"îTžˆµª[yhöØS€š•;ø��Ôxqôæ¡�ˆ½’R°1´³XAbhg‡¢ÚY>äóÈÚﺴ{mzIÿà¸,«�˜Rh4ÊIæbD¢™&�ÄOhwŸ,Ww�…"4ÔèÚ9tÍvÜ^&í¸±ú®šÌ¦Aú¢'hTÈí·<�çã>r*°¹©>áºÖ1Bûm7Ī‘PIòŽâ�#¤LrŽÐåèü‚ä[7Wè 6�ÐÅY…d5 Î#uýúî/Xý�ûÍÞçJìä–;.T;‹ê·ϵ|Bµ³ÄæÏQí¬‚fhg™øa.j�¥¢=Ž`uSmêuû¨v–úÉÐÎ*éÕÎÒý»vVâÚYé}„àN$µ¥–äíÈy¡_´Ó|oèo '�˜.£’ÌϦáÐV ¯'u‡M^²Ú„ã#Œ K…œ�êþàõµ'§Ð45H^ÒË9Þ;VK®¥&¾ÈŠê“Ťõ�æ·&oûP~Ë'sÄý¯üØ]OCÿ� ‰6Áþrž­/nâï£aT<©É#óûà9�JŽQëÃŒåœ:¬#"þ ~Ãûb ºÓ\Éò· •ê>˜ ½ hsûy²ŒŸË ßc2ˆ?nª]¿o"´|i^Iâ¶ RE|.©eä¬zªù‡ýVÜî§nòžgþT; Œô¸, õ¿´³2×ÎJ³ÐSí¬CÓ5õçæjS+û«ÙP#|wèmã^©.·qˆvÃ�©ÁeícƒSK¨¾5­Çs· ¡<ö–k‹¨^‰CÐ¥¡,{èPmò¦!rÎ&’{í‹8(¶\_"ïºí!´^_Æ7_š xº†ý9´–Ùå„ó’?š –<ö=j«OL….©vÏý@yóGó‚3ÊíÅð8Sýê\KR¯��¶ßX‚L"µl¯¾d¯v–@µ³î/“wí§éy„=Ȩ¨FR±5UÐG�iÆÅ”ôýC; ëKРúJUíã´u‡§i×nNãûÚ'iÓÁ)šÆ�çêª�M…v¥&©À{Å0DZn¢+ns·œžÝ«Ïññ\ªS±Ã ÏEìÐ@�«îäLݺ£“µ…›†Âkðú°SèoAç^j>ç"¶=pÅú½ç-Áâzâ{7ѦÖ;P 縵Të^¿¶ÕI®îpÆý µË‘G®©XÑá$ÆæZ¨ÅHc68±“æ¿`úg×9øyŠL�*ÌH Ï1×ÅWÚ¢¾ÕånÍødiãÑ)ÚΔƒŒ{«òûÂçK)•¶ˆ…œ.ÑD©3Rbω=È¥Çt­#iŒ$q�êìbÍ“ÔmØŸ†õÒ^ý’ngaÓ°õ]Ps MgfB‡@—½eÕ+lqDÜ ®h¡þA[{b††ÔªÐÀÁúf¯¦p�]¯‰¡ÈSÎÎ…öòª‰ ’KÀ? ׾hþÐcÍ`\ohÔ!7Ÿœ)o¹º¹"î«@;º(ÐùNÏ ¶ m™<‹ÆË;n¹Â>¥ÎWÞ¸_§í¼ïÚ}G–ˆÿ„.�"ú‰QÆTºl×(yMe?ÜÓǘ‰ù–¸/%4~<‹ß~c>´³tû ìî®ÐÎ7š„ž©|ß©°cXÖ]s>?‰jgA+ëY5Ä>+;É9‘ó…vVi¯v–¼åÃybóåˆt½•Ä|]a³#Í5‰ß‡f òaaÛ¹¹r=9ïÊöÑryÇhª5_Þ=NÛtvž´íÒªk‹{.©ô…¤>€†_uÏD©í¦›Ü~ǃo¿¹”ßIÞkÃÉ)гƒÎôž´ëOO×eo*DÅ›ÉMÁš†öà=y]ÛèzêÊíød>Õw"5­5ÖŸ˜*·\_&o½ºy’BÊðútS)4Ók>Úäµ¶ÐAÕÆfYê2Ö;H»>wîøBIµdrê!àI=¤$õ:Kl[Ð1Ð0º1ôh°®As0ªsšg©+hí.Ô|rQ›#47äò½cÐcB×™JzœEØ+Ö/ ,åä"käaT†Ø’¦öÈÜÏ ï kmĈLšï#ÓT› n»¾k"šòÎ1ÐüFü‰�ƒ¶®+êQêK¶�€f5ísi¸:�êe×R T]VÍ@ªÁLÆy¨Ü@â6©Ñ�ïSäEåíN"¹ö´6‚n69Ob§¿kºÛH�OÅš†öØ#­îØm½Øqg…œ`ʪd÷¯¨FMQã0ªñ�7äañ¥Öt=áß´³Ä¦ shݶ¶y„\zòq¶õîBÔïlT¶9Kr|1³e´Ò4•¿kq’º�ÌãQÒÚYem£¡m$aNm?O5Öµ¥{œ{ß·c$ì�ւС®Ý7Aª?>Ml¾èBll¡Ôt�æ,tͪ¶gÞƒjÃU»'Ÿ‡\€ú6èN‘9*Ö‘Z¾ãîrÍá»<ø+?®íæ"ì±Ã=wmÍéétßdVQ?ùð=uèék«£N�M ?òi”~ïí ¡ë‹¤rÃw†/Ò´:’±$ç@®}Uç8ìu“¢ ûj*�§5sóÅEšìÆAjýjc�äÔTÃzm—t·Db?°qVŒ1fÙ`’ªµJÏQÙ}�㼄mš‡u ROöQs:#ªåI>KSÕé }+ì_¢šDµg§ó[?›ÍhÊÑ>RËb-JŒŽ3ƒÖ®§fÇ3ĺ¦`-1ZŒ)°àtɦÐQÆ=tMÅ‘ T…Þë…&ÕŽQÐYÃÚ6zÉäú sqÏŠjb vQyz²¶ìÀ8èPëŠw9aÿ�´ùbonIçQ÷x]ÍÓ`÷t¬±Þ=®’–‘X»–;ïûÿ=]J)¶‘cr-İ3MFÃ@ìë¾ Ôy¤Ñìy¤›o/¦š=XC ºÓ'gŠ­Ÿ-•v|¶L[µoÕ4‡æ-ÉùhÎZ{döÂhŠ· ‡–¸åÜ~ÏSw®ùÓy¸¿‹ûÍ´×1®ÌŠÆ¤šC“áç‘Ki²ÊÐ<%Ë0]i«½'Dü;ß|q·åÌ \謣žWkâ�¡_A5UH\¡>¯¢{X&PÝ œ7ÉiŒ ó^¬;4Q$ù9©[æ ŸPIÄ?‘•Þ›�4AÝ‹‹÷"Ͱ'káÐ)CÖ˜©UÁ½šˆ¹[‡@Sç„{cBÔjÓ_’Ójy ± ÜcÎÜhß«gþátMÍÁIXCÅ=H䌚”[ª‰Eb4r$|7]EÏMÓùùXŸÑTû#ßO[y|’”Õ8{"ÄøKMt,ÉûÃåï†8©�–}b¾Ö/åÆ�çAóˆêAk Úp¹Û† Î¦÷‘ ÈøBƒ zyõG§!¡ºÕÐl/ßíLjªÏ�{çðåT‹§õÆ"há5´ÞC­Jì94 ø¶§Ëø�wÃçijH.]%ÄÚ�ǦñOÜ´ûƒ{õTë+½ÚŽî=ÁZ#öUš(U�¼úÆø;üt—;î.e[?[Ào¾8›ÞÓÉ$±¶CæX¯¾qËpzëØ;œ·ehoŽÜ2û¸ÖOiî$Wv�å³ÌXÝÔЭBÎM81w‰3›Ë$ÿ”±ßªzß8íÚÍÃ齲ͧf‰m7–I›/¹à>½žo®�Vq«H,+Ûíĵ|ê‚÷§÷kò‰=µÇ“Ê»œøM‡&rm×qÍWçsÛ®ÌE/ª—g}L1>ËBSµ{ՇÒµûÆÈ«I �_k¥ÍÚ:Z…hi“|TªÝM|èá)°IRsYãÞü ô¦4IÙVâšJ[MF­½\ÒI|TëºÎGj&Zo�×áA_Zá§b‚Ôƒ<µ ê]\wäI¸ß*›•²-¨mCcš\3MIÛHìå‘ò,µˆçMgæ!_�žêAìÙÒ–w9cïæ¾îk2· Bí ÿ�<’ꦧ­·£{Ž Ÿ¹Ñ�Ä1ç¡÷J|Š”Ý4šÎTOû Z¨f·¹tn±F›SmOµš¨þpÕyÅš ÉC1Ç¥M§{ý´O‰�£:WЊÅ:;™cš ríJˆ�‘úyl�Ô@s„¦�ga‘ -Ï—7�÷ çIõÄ  ýa¬ó`�<³r½WJr"è³iv? @��Iòm쥭 ×mÝþñТ£ze¸O—»Þu´ë0·éu€Øxb ݼþàXìw…n"4±_ó‹æäÚÂ_éŠZGÒ¸T{lÕ'ç,­Û5†Úiõ^g~ãÙ)|íéIbf“ò9znØ÷²ã³E˜OTc+:É :᪞/—±|(õ| u?÷ã7š Dg˜£?ù»qÐé!q`��ÐL¬´¥ß›ÎëS3 ï�÷Çûãýñþx¼?Þï�÷Çûãýñþx¼?Þï�÷Çûãýñþx¼?Þï�÷Çûãýñþx¼?Þï�÷Çûãýñþx¼?Þÿ?ãÆy$D¬ M µ½mƹùÌ &W…®I�L± ´<Ã-%ueLxjLbBhJ–Ó"üJ ðç|V:-ršèš™<3xAð$§ÅNÝ|fÍ &/ ÿ:Éi*yêÌé³ç:ÍPE†Æ9Mì}S'òÏNŠ”˜è˜òKuxh\dïS“‡Í4—ù æLŸã2{ž“ËÂY3§Ï�¿p–Süÿñë LŸ=oö,§8üº÷/øuïþß¿þ×›Äý÷ïg³ÊF°I° ²Yè4q’“(ØÌtr‹´I1q‘‹zÿ¸"’|ã߯ yâ,'ÑËfÆÊÈô˜ðH÷ÉÏI ´Ñ8ÑÓ�Iþ›Fÿ4ÍÅeÖ¬}µ9N:§Yó8ÍŸMž ®úß<ÿöûK~ÿ±Ài.ùìY Èÿf’?Ò—ÛŒG¿Fq‘ÓÜYóç»Øˆ>–Þ>ãáÀøL€:ÂH)Dã ‡+¸P£À p£E”‘·ŸÌx®T1¾~FÅ®2RGš£Ã‘�Ê7g£òÌUéfJm²±‡›‚Y¾Ä›ññ”˜@>Ö(PŸlÈÆ{úŠÌJ· ÆÛSÉ€~¦Ô­2VE®1 M2áâ×Z²«Ë-‘Ùf~ª`&@Æ€ø¤O5e#Kû¨B2Mý‚‚égûéÈ{¨�å>ä§Š ’¢�Ññ€Ýéþþ!ô9ARŒ•eЉ.»v hEú¢–‘è¢G—+%ôÆ[¡Û™vµ¬©€ÎRtc×1:1u¥Í£Ðe‚NH>,ÙTƒÎhÐNâr-A…¥Ý•ŽÏDG&ºÇäø|KJŸ ?5«³-4I “4 IŠRIð|t­Êì+G­1×'”ÙêRÈç§­·�DHÊ·¢T„Èls5º‰y½§ 7‰T!"Ù Ý„è–"SÌAÉVqÃ…Æ™H) “†�I3ç£S(=ô-)6Ï�’ §ªÙ#µf$¢?–œb¶¥6oÃ`mõþIº¢ŽQèBÒÆ áif *Ðs¯Ü;N‡ÛUä}Њ뙲n¥´:jJöŽ– Z† i¶bêòûz{)«ÞAˆ.ê¤K0±UJ*´¦´ŒümCépJ«)@¯ ºж CvÎÓ�ê 4�ÏáƒcMx)ÄdD¥.Úm˜AQFJU¨‘ŸRË€¶¤FW‚GIŽþ&JÞ,ƒÎQµ&Þ„%çÇ“kJþ ¦ÇJ�¥ º 1å–\L¥%–ij·äRE(ÃêW›€zé¨fÐ9-®Ù0 (<ÙÄ7@fVx)˜t¶†f™Ë uý¤Ô�Äø2kVL4†:C�>Õć<ÏÇTÞ#PŠð=@#R§› º$S!*Ó\»ºÈJ_h­I«è\P›¥É­„�æ,9_òŒ5™›´ù;‡ëŠÛ�@1ÐeÔ:€ÌHIVYÕ°).Â�É0׿´ #×w¸DŠ‚m#´›/.ÔÔŸ�«+¨ŠçHÄv¤„L tP*II+í�若Œ‚Íg7 Õ'çÙèR2­t™ë@+ 4†5kmA‹Bט�< c"„'˜Q"dl¡¥˜R`�NJ}þÖèð•SKl5Qù”T´e8º­´™ur\¾¥°j�9ˆ\´ ‡Ø>�`*F&›�ö É$¶‘^1ÝòºêCS4uǧë2¶ ’ã ¬ÄÄ|KØ9:ø@"BíÐËjD;âJ­a›Ú¢öQ”xµå“róÍ%è`” z)Br‰µZGÆ‚Øí:N%öŒÎÛòÎ1 (P%·„Á„Òb"3Èœ7Rrz¤U|?�Zň‚>è¼â+¬AßÃû(¹£ !Úˆ”É9 [YJo´—¢×Z¨u)&ø )Ð}¬‰-¶‚ŽÏjtéõvUƒ4 ¥#16«¯fu™«M2Qk‰ N4Õ¬^k¥ÍÜ4P—Rc§�Ï³ÒÆfY  UŸ]7H G—C¶9:\¥¼�´K ´ tÉ“ñ±¤ªd(™'³ÆA›Zm‡®CJÑKoHÇ)oó¹îÌ t9¢ ]¨š,r]AŸ ¾�"ºŠuOÏÖ­;0IK)»ÇëòÐ _dM} ñŸ½»Ä'Ÿ‰.ØíH%c%Æf÷EÇ9lF—Q:]«´ó]%%»Ç «‡v¦¦U  öFü².½Æ^›Z9@“Rd?‡÷¢D,Œyní¥ÞëöŒÓ•õŒÃ\Ó–ï ºUog_·3í +ë¥-Ü1”ýÚ½Îô³@4H.´–‹ZF ËŒv:WtŽÑ ›!MCåœú�”ü rw\�%UŒ¡”áŽèR“óëkÒÖöÃüÑ~Ô/|W^OÆöˆNâ3`Ÿ SˆÑñfèrvåë©`|ýU èM¬HlÑ›güõ +“ןć§˜±º(cøJˆÎìû�ofCW›ð‘ñ¦èzöS°L�a,Dæ˜ 1… Úâ³A–‡�ñ!™fèòÅÜBwíhJ,!ß¹¦ŸˆóK,³Ö¤×Úƒ4¢hšÔ:;ý|Vz1œ6ÎXƒŽ™èbK.$ÙdJ@%±— ˆ/„�ÐÆf[‚Ž I)íßʨ¸:Ï݈ÚÊ]ÎèX†€mɱÄ>ÉxÒŽ§ÂíÃAäA'­�Û—’Ã26Ñî>}ùÞñ´KšŒ›6wëÐÞ¼ m”¶¢k,ÉAÒVu�ÓÖ› ߤ­:8¾H—Qe –•dF;¶È<@n!Ǭ郮TmÎú�š5ëÈYõA¡2P ó6£ãl<ºu%ĖЋŽB2(õ�ÖÈw�=d7Í ç„¹„ŽTMÍñ©´Û¶ñâtb¡s NÈg(%§p§#Þäpt›ŠÉèú+²Ö»C§l±j÷XP™uûÆéòÚÑiO>k0溛ä¤r[�ãi·;¨»kÊmiLÏÚ<sEH ×>1Ç]zÔ§_ bšDÆo%Ã×Ñï�ñ ¯A‡8®ÈçjQou1†Ä…Õ– Ë Á©¦RX¶9ˆJ áñÄ/rÚcä/èZ&ÐfA>Àƒæ:zb¿IÖ”�¿yˆ˜Q=]ÏɸÈL3!¡ÒÔ)iݱ šŠã)ñ-<ÕL"¾”v…’9Œ¼ôEØoÚ¶Aè\W�€&FSªñ“bH²¯‹ì%r“sA\F7íÚ�ˤy 6¾ÐŠvˆÒónDs@øÈLË HNX´}µgPaÈ¿cìáés36B.šõQÙÛ†Òî?¿‘Ûa )=%ŸäqYõƒ(�)­¬¿6½Úž’�ˆmÀGÑø›Bl�ð±˜Cù[†Òîk�§²*ít%»FkKڜйK;É|ża{˜7 ¯h(ÉaÇH|OJ™šØ!Hw´k±x;íP„mü«;µúÈD“AŸ×Ÿ"6¨è@ÄOøLÚM‰.ÄâGt˜ÒÎIbk F€ÚJ/ÍŒørr-ˆ}ÙÃ÷ƒþ*¦”ÚP5ŒŠgÐWÐ ‰Ü~ONZkƒÎBj)ÄfÓkí(-¿K-±áVç÷‰ï­ÝôkÉ#þ˜vÙƒ–XjúOüŸ»¦® ð%äšÐ'�xA⫼ØL‹ÞîOòêÎÍ s‹Ôð�t¾‘ƒ/@n#ל™.lÿl¡¸é£”*\{j2í\L¬²•rZ†Hë>œ,¶<\*Õ_Ÿ+Å×Ù*TðÓ±&šì†Aš ǦÉõ'g +œ^»²Ý£Ñy‚¥By2žä—id\ÓHü"óQ›»m˜¾dÏXø*ø1d• èG4_ªáá ñq°M-ˆ®™ëìA<¤]—d‘ÑîS2Þ°Ð%h'5:fqMÈü Ä’ É EVè<¥ø(ŒWJu\K |%�WÚbI™¿ÇXäýè …Í€Šò±Ó?:òñ]h×2É!%ÿ2^4æ#ögVۡΕ€’#7ž˜ "6íV%6ªÍÚD}%}dÔØI¹5öP³€í„Rþ×�qmÛJæH)³¥ç—\Ñ�Æç²ž1 ËÀ€øŠ.f.*™ÖXš’¶QÒ†SSÑy,¦�ñ‹.è‹1À÷Ñ]©PT[¶ÏYJª¶…OŸA»Í‹pmK𛤀݂²-ÄY¨¡*•a_‰X!“ùOí³¢Ë9HŒ2R‘X®Ð’Ÿ¤VÁŸƒ¤xc©¿Xm¯â¥!üÑ�Zuj2¨¼´³µêØD(€G»˜3H~Lÿ¼Ñ^®<8N¬ûp hÕbþö!Pô‚�˜Õè ß6*H šCU@Mê0(€�Ö.&WÚ@­C¥O4FNJ<©ÉôÄGåôAÊŽ&u“=µ+µ¤Þ þô¾„B+9gƒ¥8´=s£õwL¶�‰d|¹�÷�¢Ïo:;„wØ'õeíNð!È«AyCnEj‚‘ð5$nõƒ}"O¤ã% ³�ó#o¹EKÆô8gI|‘I|�¦9±eªN’ß0ˆvq“¼…Æ!’CP f©bs,i.Bb§ôûï)Q”$2a“ðC´[ø÷×`¾`NÁ?Ëåí£)©Šüýn»Ç@�Ds¾îÈÄoÐÇ0ßñ9˜; €�#[£q¤ìˆ43Ì3JQ Ÿ "?Ajæà8ÔŒ"‰w<UÐUO}hËPÔ²\p2­õh÷9™Ÿ¸~š¬*;ªP@b¬Cj“„X2"³Ìy�¡¨û”ÖÔö‡j®3ºÖ•,©Uø#¬%!/Äw‚Q·Ç«¤hR‡¬6Ù ?t�ùÆ™ø,Äd’ [hª�OÆüBlýUJYß�’I‰ïG~(„ÆšrQI¦lD²)�kªûq1Yæ Ý‚`¨"uy/Ñ/ÍkBB©’fªD½®I0QƨÇPOằÁI& 7RZ,©Ó¥˜¼¾ éQ5 `ŠI�[JÆyZÅþqPCàZ/¡ó ~¬`ãn×Ý%b÷÷¾ìþ¿z¨[¿\ &%õ󛲑)¦A’ÖêmÂæËs¥MWfKiuv\DŠÖp@¤À�“ ¬á7i=\Ѐ5RKo‚ >ƒäIyÖÚÄLKäŸÚœ*{Ô3PKÙsŠÖ ¤Ö&9’9H Në2Hn PÖ¦A HA‘„’*3R_KbÔIhn»'>»—Ä×=VÚtj†L)Ìeý(þ¨áâ\q÷7ÞÒþAüžç”J©.Iý�_S‚욨3ÐkOlv�¼ ¾ñª¨-„8ò|øJ¬ %WÙò«rúÐ<9AZƒ”h^�ßêH)Ó$Ç%…úh<�äÕP5 $ÖÔò~BB±%æl“úX2´¨÷ñ“ÄO?ãΆd™¡~†¢lïüI7ƒhÒ¬e,ÅYÂoKħ`ý´?š3ÿ!ƒà‚DÖÖAd.õ•OX•ß—#uu©i”ê`&H7¢DIò{ø>q±ÝÈ\sP#Q¯ƒòÎiRL@å½��Ê6ÇP$B¾*l»î"Õ2WÊÛ>ù¡“ÛÄqaûç ùö'Ë(MêZmÃÅüÖÞaÝéÉâÖ› ¥�]å¶ûîòÎ/Ü@*饒¸RÜ2u)¥ö€V‰¸õ“Ò.'š“‡fýÉ)Ò†sÓÅ-׿û² Ö2`~lo½Nì sŠ*p�ºŸÒãWgôE¾¡AÍIê'PÏèÜ$v�u¬'HIU¶2©[@$Ǻò^.ŒøÏðsÔt 9�>$¥5ÒÜZNªí¿Œ|k ¶Ã&Ap—“ëúCõ\-†K1rʺþšˆ‚¾°M�‘‡êÖ”Óµ:Pš±¶K×;ó†h«�ô’Yj{"«ø9€a¾ÀO0žÙk¨¸�*tHåÚ)yøE‘uÔl:èéF"¾^”»·¤EôeŸ©äqìó.aœãš¨û@Y¡JE×ì!ckö2ÁùÛ¹N+§a}¸NÛùÍù?XJÐQˆëœ]Û ƒ>p8ï—ëáy CK¶ ã›vsÝÄNØŽ¥ž|�¾~ã&ˆáÿÕÙžÃR3¸}€ç°ØÀÀ€…és“ÄVC|ý²ûd.ƈm.ø è"-ºþ`å÷r½È=kµèJèLÚüê(xŸS”À÷&³Šêž‹Ÿ�ärØLèb+<ê4§å¡3�Û[ˆ‘ 1‡‡ý">b5rBÒIòõkã ^ÃÅ ±-cÜÒ–p1BànG.�‚.ܰ6EÇûS ‚ ~±‘ºÓ®'~Ü #Óz4¡Ûí_jŒ¹ÝhÊc³ Ã�Ó‰.øN¿%½i€ŸCnJ‚×!×½ :*ƒýtŠ_ÝW¹.œ+€çåÍuÖü³ëÞD±%æu€½å:X ñõ À±àÞ¸î�‘óE7Ò—aãͶxþ†ºOMãb ÀùÀÖxÞ] œ^䕵l"Q¸�ö{»�öìkÚy2‰ù}Ôr×±Ñ%qàæÈåQÆN±‹É°%P”¡Ý® ÎzOŸ±kñi̽3‰ì3ÁOs\ûtè`Jg”/æ•ØgC×4¡äœ<¨C�‚”$²r¿8¦N TBc€¥èjÎíkì×è@ì»Âß)Ñ!¹\—?ßZE(Àœ�¨P S>íç'·ïù‹¯æ‘ág |�S•8�÷ü)«±\MloEþO6Š�c%Žq 1^]ƒB'v.^ŠDAo¶ÐÞÏÖ‚""(:s¼ s%èR*@TLÝ>Ì×·1g|'qñ}ñ™òuÆïÑzP7‚øàtØ«€�†ø:ì»qЙžË¯áy„ubì�´Xb6�ã릘¯ƒ"ž[.îì–¶”ãËðÚE›‰"�[+¹ÎFgâÔ Ò—‰â+ÔÅ鵆¢ûM�Ú©-Œy¿“Sƒ8†Ÿù!ŒÅÍ1Ο•'%ç出žbî�mìM¸èî|0ðGð\w$èTñ ˆ'áõ ò~ºNìqg•Ä1tž˜ãë>_‡n¯p�_‡"ð ày`C±D*ôÍVP.ƒØ:Ä)9®†q)ÇÕ¡›Ä#çÑ v„m!S¾ TåȸfeŒI†Ô 0&ƒ}ÊÅlOÚ�#d‡95ñ¿¨A€:cŸ²ÀˆÀ\™G ÊôÜŸjnÄ—°¶öS5ñY«q°w8¥ûÄ€‰I°kCjâ¨UQl“Œºƒƒ¥Íñ¿És*tƒîW`WAY„ŒÄÛû1såºÇÝÌXNÄTí!Òú€B/(BKÁ3s¹³\æ£(=ë<Ö&`®;aèûítl¹2ùa7×�Æ ,ƒžna8%ÈXE®‹g\íIZ½<*ôíVn}ºß]9ææý\—5ï×ë‡tEòŒëx#È�ÇäÀ¾JaÁ'A\ƒ:~m4t“%L-G@naH¡Ã&—ïö~º‰»7ˆ?\Ä8Û. ¶í`¹®kxýqj‡7‚NwxM�‚t¡åÔ nÄ*þS ÂÔ ¼‡:óƒÿûbÅñ?Pƒ`0lnd ã0øØ�àhÌ=¡3*¬5ÎN^öžÆåé€Û·âöC·�˜Ç¸ÝYÊx>^=d¿ð¿]ô3Z{Ï„®f�?à84æF€ ¸¯\çÁÌ5°g9[ ¶ü?`ÌËeÛp]ùñ{ÀϹßçr‰Qó¡[*ãóz�8e7ð<§¨pîÆdÙI¼ŽžÁñ6N "h>�^¯Çù�« !E††Ä­)È眀®ßÖc§€ÒÒŸj³A Æ&ûK ÂüÚ衎–¯¶J]î¬cìÂXBŒs"ˆy:§-æ”X¼2Vƒ ]²›ÈÞj%ð»Ðù˜ñx²š¯ÚŠQC�®cçC¼ŠË1îÆxrf`£¤®xc› ±Y® ( ›Zp97Pÿ%7h“ UiÌm¹Î±AÇN°) †µ'ÎOŸ¹9�‹?À÷˜ _Á˜ÓQ§ æ)jØä1ëQ u¼w)¼çAµâIP³8 ÔA™8Äðë#¡«/p .ÇñKŒ©èÈŠ=bÏçë9åų̈¨’ÝDr³*U¶S�Ø´pÄ. 1Þ6ÐÔæÔ „˜« ȪA(‚m€Ü•OŠŒôÄÜú„‹Su‚¸¤ùe.6¹sX›¯†N˜G/�‚–ø=¶7G�.yÀC ó¬ôfú è˜ÊåÊO ź¤×“—s�ª¯úÍê0|y4‡ðu ˆŠÏàõ‹×¥ôŒÛD.~¾Õç§‚ÂÅíÏÕV0`§@Éûzˆ;sŠçW½¦‡Î‡ÚN-â‚Ó¨AÄW©‰«µ)ëp…¿Ô „²‹òÜš�8¤µ÷ À÷ s ±ÿW5ç!5ìã85¼nd˜±M>?’‹/8Ä-îÈ)à}ñwÿºÜ]Ê­»3îÁŽ€J*ߥBÅw¨Ro7qñþKn“ȔΰO™K ÿûWÂÙ¡@N™ûVúÄåÑPÜTØ@å :ƒ“‰Õ*\÷sèf \ˆ<*Ç3ä!=C„yÿ0à9�> Ü�<ç9ì"(‡jiRèÀ.]´¯õTˆµ Ž�ŠWøLPì…¸ä°àïæºÊÅ>â… XÇ©o@,x9(v‚ö™€ÉÁoç…N•ð\¸ŽžÉ-jÂ{}ÚxOm5lPƒàiC'pãap (�ú"ðè>Í©AèPHO—DÌÑk£e º�í5ŸÛ<ÔiÔw—GuŽR„<*×™10{“Z¯øÁnCEf�mù�ø¥âÄ -ijƒ@’ÒΣ’;4ˆ¨ÊœÞ'Œû�åDd.§AE”ìäÔ 0†z ]cd >#ŠH q(NÛ5j¨¬pjŽCj’Uƒ8û—Ä¥‘”É1yR|\ŽÃ»�Æ~žŠ(ÝÍ„îd0îäbwV‚á8§Uˆ‚Äõþ :¾ý“Ò­C& ¨B\Zìt{‰È&z.•Ö¡Jkç…®×À— > _œJæy—É\]„eÀ àå?®üÔ;ÿA Mb~u´ôÌ�I V¹Oè,KoclSæ§ÜÆAwò¢ßdXŸ|É19MuRUÓDÚšFˆÇçò¡€;©¸jeè4 �Ë!†% AyèÜHŽOø<Ù 5_°F©£—F2˜KÃØ%ñ¥št`Þ6 öm\ìÝÒ{:—ÿƒZ{èØš¨HÄUíe’Úµ95¿¬µ°fˆªAXü©qq´”Sƒ¸·ºéK.Þ˜±5ÞO$Ôž`¬)µ Ÿ+…Z(À�G®Ž‚XŸ�"úàÉá’+~3¸.ôPsá’¼l¬WÎAçÓ°œ�¢ÀÜí2‡xE˜Oˆ¿ƒj؉[ìbèf, ¾‘¾ÓÌ¥4éÂü‚ªgk#K•¥éå|Q\Å&4G l�^§Ý—!vÉÕƒ@'S�ŒUÀ€CÎî/5šSƒ¨Ý'JîÒ§µòÈô~M"¥Q…¹ž¶r<äQÛQ£#‰ãÎcþRƒ ¢÷H0/;%åŸ{ë¥Nþó8ÿŽ}™ÈïîZQÀË­�ûk8 xû®¶Û{˜+*ºp�(¦B�‰/U£âËT`~!öLæm†Ü�”­]ï-'¢ëw“ùéëYË)Ÿ—k9åùh¨MÒ·—¦ã°9ä!ïƒR‚sêR&¼t]©œ‡² � ¼òõÀ{¸ýXêöðš…¾Þ!Ž«Ñ¢ÓÛt¥«M¥w›E”÷‹5”e´uÉ*qÞs"ä fg‡Ñ&ÃŒð:Bc€÷Ëb°k"¼¿!ù"ž‰à÷8EŒ ¥î�×Ë\S–qxæ‚Ç¨× qL™šÈ/w WÏ9;Pý3× ªš ” óC„çm£ƒžm5‰eƒ€ÔÉ\ÂI¯'.“zem€šŽ!L7Ÿ‹½Cèò�)\ŒÝ&tðq.†Ýq/ºNâr<7¦Bb+ÒÈ*uqxÑÞ!ÎŽý·Ôw«èÛ5ú¢×U‡dÏKO€z£®¦õ_®–-¡ä€4¹Æ@”R­CÄæîàÔA-;¸P ºâC—j.ÊR#@üHÁs6+ÿ™�%Â17Å8\r§�$RÚTA Èi—Ä…Cù‰¤ùäßÉ ’N»¿ZÍ©AXzOãx”WêJˆyIœ£rj.CjâЧJ øÀuËÇØ_z óÇxENy óT®›0~Ÿ‰«TejÔ9~ߤ 9PìE;2ðÿP´›÷OE»ÄNu¨û1àSC]ù:ƒ˜…b¨k€º¢G”«ˆ5)ÿüMð`íp9!PÕ�\*ptˆ¥�?ÄI|¯†4}þöŒôiÕ!~F�*ìÊ7g=m«]ï�k_âòÀ¼'s¶Ø>f>tQ§ZÔ`½ë`<¨s@�S勱Ç~^rÚfœ ü¨‡ž¸4 ì»ô¼WW,vœÇuB†ÜÔ–AÍö‹"è¢ì‘½Fê�¼rB€96ÈQB~Ï%ÔŠ�Í|Êy’sΓ¸XÿQÛ1âKA˜Gß^*ö{¾ì§²jä6 †ù«W×¥Ö.céÁÅÕ!n"‹®×ez‘mô\à$‹‚zã«~ &ç&I¬=grÝïÿTo„¹%ҚȞ”6É+°¤¶!O¥¯#Dà›8¾±Poô~´i©Ä6uPؤâ”™ <%ñÍÌUb×´%œš.äü­ FGŸq™Àå`ÿE ‚Äü•Ë ¹Ä,åràÂÈ’í (GžrKœ¼>¯‘y´ëƒe Í©Ê;Gc®¶@ô—ø ¨Çó»¿Ž {½ |¶Ô5}`¿¿â«§uO]NG+Kb*5ı•¨¤Ú*ÚQ)Úe4ýWE»:UP´ƒ:Ln�Aü¯E®3¼÷íUœêöÿPwêCœB’ë�%P#Ê�̵`ný{¿\/²‰› ëìp3:¹Y“ñ¼½‚Sot¹³”¢I‹�é¤Mà ˆµ@- e2CpøÒÈ™‰°/%NjÔa¬±'BtDêa÷qj�ØÏ�’¨C<“9�±ÄãaM^ªUãbà úéûd§ÀöÔPE¶�C5ÀS³cžÁÕèB-£WÖ:Pàêƒ ßy”ƒWF@ž ò{�‚Ô*Hœã¹ºrPn€¨„¹cuÕguêâ(®FûCà5\‡r°!ÀᲉœ ªo«•:Ï—xÜ^ õ½4¨7f†µšT¥ʧÂäve®Fá´óx¨1„.îU± b&Ð}ž³íÀ‰a]¿³‚«ù»|ÖT+0÷€ÚûðyÜ^EIÿìõ �,vJ“cÒ":àáz"±jU²�ºywe2j"†”ˆðÏœRSÎVN5ÈÆ_ºæs”t >ã‘¹Š ³�ÍÙÄÅM@=êÌ͉Gæ&=¯%p©û�Õ\MÔ�Cí"ì�÷—‘IÝD©}ú"×Ç+¸úPÎ\v#}æ ›@Á…ë”6ó ¼·~áöäQ�Sï¶S€‹«éÀø°.¨ßØEÏ…¼'äüè#Vœß‡9¦N^ÍÕ¶ÚÆÍƒ-pò"¨‡Î¤Î]ŸªÝÀ“@]”8ޱ´Cš¢È·h+à‘Mâ<Î7ŸqšÀåã¥'å9vÚzœûC®$>ٛĞYë`n!g ¹zN5â˜�¿„x!ÔøBœß9u1‚œ)¶½\.bXðÿaœÁ\½>…³£ Ž¹fX£~O6rJO‡<—KÂN™ ìµÿó­â€Ç›€Ç Å#‚<�þQ‡HlRõFÑeŸ©ôÛqpÏÇìÅWø´ËþÓ¹±Âx07€µ öbÛ$¶§D|¥2ÄU¸1Ùã{åw_¼~_oå°}¯Å¯­Îõa LC%· ÒZÔ J»¤,dœ“¡Î b=DtÙN‘÷›M\\ï ¨×¾Íá\¯»+!WÌ)³GØ ¶Ö6œ÷€zü7ÖŠnÜåêe!¿y^ˆi@=’¿•JïÖÆÔì]ôžBšãj%!¦¹kØï¢VНÅÌåTY¬‚fA¬ï�e\È&€;7Âåþ¯LçTœ±}“¸ßZÅù~ŽDÍãÞ?á<Ž9îÊ]\�ú1‡±P‹q4¡ññ¡šz³3Ã!¶$0>#1câ´íXâˆåHP…Æ!~>ퟻ™ +Û{”Ç0¯—` ¸js9õ9È—]ó� ªNP—Âøålz!³Á§r÷ 5H^/ÖSÁåÛA5–ãóضº†:Qcç¸%/üŠ˜‹of¯�œâP< e)¨aI<²×1AùJff¨À]\�Üã5‚¸0ö—œ]pˆ]ë…ñÏÙ*\\ü¯{ü\W‚2((ê€ ¨‹QAÏ7s9xÞ^I˸˜ ä„ ï1c×ø…~ÂþŒŒ/ÛG…¿ÞÆå­Î¸M•3Èó‹}n€x�³ÔT95úˆ|%N¹/(k#Øe2ÛiÎ×ax3 ûì;«8L  äñ`çûS;´„É�ÊôõÔEð»?Æ6ï�œå—¿ ø UµS”Úb@¥vk‘1 {¸uïûÔޔȘòÝØg)�†<*æÇ[!æ-v½µìø‰û£5LÀ“ \ ¦o7’Ñ廨›©‹9•ˆU?=‚ów Þ’عŸLèV¡J¶Ásû5¬tÀû-ÔÕ�é´uÌ,Æíö*¡m¿8¹I”ѹx#œë9OÀÃ/pJQ„< }Ôy,wVÅáÎb‰]ÒB¨!ãT@�j’Áûdañr#‡9œî(2ÎwÓ^Y«ˆPüïfµŒ˜I\ ˜BÚÄ΢3Á¥[ˆÛŸµ¨»}‚ÛßÔ…Y? È·ß�ÉÜO©ì~†ºõY—Hû|€LPgîw $/šŽHßÖ�“¼kÛö“LmWÛBÇ6«€Â#(äÀ:“¸ß[ÍÅR¹zÑÌU`Çà+ãvgðbZ¬D$ÜO&6í§R›´ÄéM ¦^öK$¯ëOÊ^Ôž2~Xm&K®áK£ªÔ¥±uZt|Ól{vü’~/ÖÒ±­*’”f#“”:RÛ¦!ö|±¸¢‰Sôb©�ïl“ nS��S—‰!wœÃ)5�‚'äéÀ?ÒwÚyôÝ~#&«�a²ZDÌËöƒâuGD9mæâÛí$™6 AÆÔï&wª0wÚùÌÃ6šÆsH<à™ß 軟ŒÈÌ#&³�¢v ˜§-bñ£f‰4»æ�INÑñ“J:©]C_»‡HêRÅ— ¬9ÚïÝFX—°Æ¨”N Qr«äkEéí°6 d·jHÙÝ �\£A&4©€íc±ý‹mR†œ‘øQ™HíÙ/È<@ÝêÓ¦îvéôÈ{ŸôÉŸxô³~ó²Û�n†|ýIʼí9*Îî<(¾�ǘÙFвëe’'Í™'-êa'bÌ‚Çßô…Yß ˆç_(&÷ÓaÁßMˆ×ßD¢ÒÖK’ÒÊk&o?\6yñá´4³RFßjÖ§Óz´áÞ˜ÀÜ­à 8¿‚ñ™óI*Êê–2 ý ¶o™0±mjüƒ§ä�Ì. õIÈ…çXÈ^•Ÿ?ì6eõÊ$÷ÚÅÒôVRz«ž%6ëˆÓº ˜ÔnÆãÙP³bn>\A)q ¢�¹Û¿ˆoà}î_´MœÔ®#Nü¨M%t« Ò¿ª £úwò“¾ïå§ÿT6,` ~{BØóÇUI­·¨¿ó&Qóõ ÙüÕ‚îûäLõ}w”ùêy|¼ín¸d ÎGÜýÑSÖQïkÒY|´-'ZZW銟£„z÷í (·û¸¤¨ÞJö¦á¼8³E*{Pcbš]vêà›\ Ó§Eç$�ªeDÚWuaLë.ÑíN�,»æ(s¯— #ªwBübÆ¢´l‡ e)ÕBÓû•‡�ïVË€oR‰íê ¬…äMêA _’Õd"Ω=.Íi8%Ìü]�xúUH½è—‰ ÚΉr»ŽÓ/{eÔÓ>FôªÝŒÉk;Nç~>Lô¡KºÏÑŽgé÷_Ž‘ù¿&ß}7¾ù*"ó?›Òe]g¥m¥7¥íÅîâʲkô«�¦Tf��JÔ&âÚöÉŸÀ~ uPÌ“v‰$»É”yÔÀÐé­ºDj‡š(­•'{ZqÖ·ìE٠уšºßeDÝîÐ=h£$�ME/ÛLÉ»ßtˆÌOú̽6‚ÌjO»H2§OFå~;Ì|è>Ë”u\ ‹»ÎÐ/Ò•çÉ×:»‹ßD¾î“�> ‰§}BÑ£f•×tˆ®o¹$êlr3î/” 6ø›Ù³üÖœlør™®ï°¢ßõ&3>kS؇Z‡Í^9MΖc\ þâUü€êuüÛWeuH¥åWÌŸå\‘FÕjоO× îýÐ$î×¾ùBÏ(Aú¯ªÂð^%AÌ÷]â¸AmYZ aú°ê¸¬ ÐÒ¸´Ðñ`q�³In‰µäuÍIéý&±8½ÝˆÃ*)½šÀÓ(ì瘤~mŒ •$×Ræ #k¶ ³1$о›Q½_ì%Ÿ‹½%ƒ%Þ¢Ï=˜_ºÜEŸ<˜o}7è�>É@©ïñÖôà3͉¡nåÞ‘�e×Ã�vÜ %~s�ô5ùùø8¤»8XÒÓâ-moò¤j;®àçy–~7hμ<,Lû±ŸHP‘æ4ž5É/³“=k9.zÛs„z�ý/ó¦Õ\RQqM\[í kª¼iÚUtücfÌ©ÖÛ1G;Gî{.¨v—´T¸‰Kk,¨·}&Lqë9¦¹ÚÁ¤û}Сޜ°m÷¢Ï6'F^ª�‰¼\z¾1.âDkz¨ñ@®=Øã"¬ùå$ÿÉïúÿ‘\ðŸ&¶O]HÆT¦n è0)ý:`ÛÀw ^-4Œÿ¤Dç5iïgÖ–lZ›ïy¸ãeØ¡Ž·a¢ª&kaáSƒÇ¬ªÀõÕbþ!ë‘ú:ƈ¢ÌåÄvwI²êÌÌ:Þ†žj»{©1)éXË“ãú"wðkÌýfR|«ÑHœ…ŸÓ»âË&u¹²·˜ÛM†Òû-b°3L{£Óɶôp¼æÂ£‹]C=J<Ã` î~b<˜ ý\àgÖó$øZ]0·&ÓKB–؇$;‡žmŽ“âu{¸++äXÛ½pi¥¯¤¿ÙëPç›PºaÀ’ŸÍê‘é?4…1]»i—çË©”¯Z&/j.JŸw#Rÿ8@ø¯çU­¾úNËZ«<Ì;^EmeÜ[(jip’tÖß<Øý!DÚYåEuœæ6<ûÝPø²›¤?´ž¤+Z/ k¾¥»ê`Nu>W—^3ÊúU“—\½Å0m`§Á£ŸÊ¹¬.¿é÷ã§ZR#Ê�£+œ#½jnF;×øÆ\lŽ�1ïz.ýZ ùÒê#úÜæ%þÞêu¨ûIÈ…Æø¨ã­¡¦}ÏÕ?�>ø]�¾ó•'ÉjÅ~~@Säþd ãW¸°+�Þ­ËùÜG-RÑŒÿn·Æ©uBi\›]±� û DÞú¤)yÓzʸ¢ÔIZZa'zÞc*Lûu¿0¨há[°Ž\¼�x1HHkK��~|}¤ëU”¬£Ô[ü±ÆÍx°4èrcLŒk­w¬K­wL\•c„[­w‚´¥èU×vÑ´ÿC°cƒü�ú›a� Na©UöÁé5¶�w+ì‚ðxCn”{„z{„xUÜ ½Zv°çIÓÓãB•ôŸ¡_ ˜J_6œ”¾i8+-¨¾"yÙpŒyØL1wš�ÄŸ=ƒ¬%ó­óƩ挨óÍ)qg›oÅžj¾'í¨ö Š¾œà—üM*¬ùyŒ¨üûqÞ{ÖP?‡Õà%vm3Lù´Kü¡õòÁž¢ÐCÝ9¡tKÏ5º¨ó4]Ò~ãçc’ä&C:㣞øq�Lô¡ü¼IÃ;�cm"µ?9Þö8æRSb’ucp„[µgˆM½o�O¥[Pj¹CðƒZ› ÜZ ÿÒÆ+¾…UVùÖ%5~•Õ~¥øçòJË€’’k�Ù¥¶A©¥Ž!>¥îgÃ�ûßú‰j<ͺžuœùÍW3iM­«W…g‚}up‚ika°(·õqç7ALývá­¯ôó^±¨©ÑéRc\üÉÖ{±&½…Ø憙ôI¾ÕûêÎ µj �‰®uˆ¯uŽ9Û’'í/öc:ê�udF97yG»Ô{FDÖ:ß­² „+³Ò&èž§7eׂsŠì#^Ù…f–ØG”º„oÏjñµ7¹Éª«®‹òÚNIJj-ÄÅ ’òêk°7‚‹®ãuíêQîæ\îáPå[äîUîCuö8½cüFöøQlŸ|ÊÜ£" ÝÂ’ ]BmêBðúŠ�õ¯¸{ß90h¯ÿžÕç½cõ…Í?ÎÁß>Õø Á¯Ê;ûÚ'ãlë½dóά0¦¡ÜJT^vѹÖ?æ ®7•ÖAw«mƒ’Ê‚Ö\ *l°Hh° ;Ò�NþÒíhØÃ3êûÇ)þö ñã³½Iÿs_Ûª ¯Ê›áQ%Î!©….!×*CÂÎÕÇ…œ¯�;Þœ,ë)ð5ë~,íiô“~lô–6·zˆžþrˆ¼ûw]Ñ«_›5•†œoJK8Óœ}äcføÁÞ×!‡z^†‰>µß$z~µ¤{»�Äß«|ŽtÜ5ë{lÔΞ0jÒñ(±>è–q]îuÞ[V× íû6Ïç ,c§òlc§Ä5m2*ÿ]LövÚžè¼áßèYíjÞu/ØèWö¢~'k¬×ÃJtûY©n+ÒégiýAÖÌè{Þè'{‰ù^åÊü¨r%¾~µÓoa%z!M+ ³šäûŸ‡$EÍV&ÕUîÇ[ÆØV‡Ä‡”߈I-sаjŒH�vWz‰ê˜ºvkq]¥£´·Á÷|Cr¬}UPŒUeDôÝ|çЧïíƒ,ê#±Í~!ë/4ëÎ3ïÊ ¿Ü›àYç‘àPs²--œþ­ë:ÕÑa+ênͳ<м;;üT[zäåæˆˆðz§·:ÏhÑçf²ëË5²ã»5¿–53(d t îÔó�˜¥ë›1O»ˆUåwþ8-þ¥ÒçF…gxb‘S0ö{Áw �‚ÝJ½‚N5%™wÜ ¢û\˜ú+úíçÃØ�a;쎵gF¹TûÄ<,p~Sl”Uàúà½#þƒ_¼·Núàv¸ûؾÂ@ð¯ž/>ØçÙ¤c›URié7ØtÅç¾ ±­s©ó þþÉ^»…åý`/鼚Ò`^ØtÕÿyƒupVƒuˆo“[œøG™·øG¥øCÓÁ‚`Aÿ¯—u_±*6¾“4�ž•?`rQn¯@‚vì×A[wíCJ;÷£ÍJªhãÖ½h�’ Ú¨ÄCÊ„í0õkϧ¨§ým•F«A~m··+ Jzs#ôî;—�À|�Ј\÷ÐÄ|—`ÿ<¯°ë;œiL‹õö¸wUmËŒÀ¸(Ê¿Ô=:á½[DR±ShÆ a宀ó�?aü)7 ©Â!ô ¶o/-´Zø?h·d~6ÜÔÏø¼�g“y•«¯Æ«F Î×hb5 ¿²§ù¿°–Æý¯ýĽ]ž¢ÆAgqS·›¤»ÝëØÇ{á׫¼#£Þ»…$æ¹ß.pÆv1$5ß5ôY‘]ð»b›À”"§l�ƒ_ؿ˷Ì/¶ L(s ©p‹ln¾ìÍv�õÿÚfûK߯“ñ�¿±'°ÛÔ\ÞMÛ+±¶i—Z±\­]·©›ž“Óv½5SÇ9uºú1+ùe Ñd4�F£Ð4œû�Ç%�?‡!¹?Ž_�G=ÿÖHü“<÷Úxü¹`Â*´q³í&=å<`׈ú �ƒs¼‚#^y†ç¹‡å¹‡„}¸‘#4)ß5$%Ï%äa®SÈë<‡àì<‡ goƒ2ñÞ|Päü¸Ð>ä}éµÀ›•^QÌ·wÑ—zwâ—ÏŽWZÂÂß6cÜzÅ?¬É>L«‹5Øk|­œ½¯Ã©øþáÞFá»’ãFs3_p§ÃÐ|ÀûÿùCŽ ü&<� hÔ°)øëD4Rn"þiš5e-Z¿í:àV5“?€ýÆ k‡mÔaI_³×‰–Ûé¹.!ùyö�©ï�CÒ?8…`˜ShàRáaÚóÜßµÌ7ÖæÓ» ÌöÁE®!'ÚÒBD¿´x1¿5zØ5úFV}¼äØlÄû�=u ôݼ-{õ�âøx £¹û‰ï¾Ÿ€Ç4¯¸©ø;ø~ØÍþÆ�î_Ç= ÂÜ�ÅoÞ‹kö�D*­3Ôﲫ Ø£LG�›¬½ÒǬåUб–ŒÐ«5µ¡áoßb,‹×$ÌaDÁ�P˜Ç¬·.¡oòí¹y[ú,Ï!¤¡È.¬£Ì&Hò©Èÿ=s½–1ìcO ~°–ÚŬÆ.s4ÏÐÿë£ÜŸOþ;âÏg6sÔ2´x±Z¯qís¬š¤ÞÅj‘ŸË¬/•ÄúF¿ñ}ðÎ%ìEžCèó\§ðç…ö‘�?؇åä9†¼q {›ëâ÷Á=رÂ?Ü·Ô=̧üFhjæ]å¶ÁwKíƒbK]BùߨKoY%u·ûÓUÍ­ä6¬WB³ä&qkp wÿ皓㞿<·NáëÃÐJ‰ßÅí½¡}8Œû^�?Ça«:ÍBSF,Es •»O %ÓD9�zVƒøÒikÚýÔ;£Ð1ȧÈ#ôdKjðá³ ¡€Ë€Wbì⎿ZÕ„„kˆ×3Š‚Ê1f¯¯±ºþ1µŽf}YÁ_HT¯ú�š?{Öÿï³ޝë_¯Áxåÿ|ohÜ#¹'3?¡±øs·{‡,ê� ’ÿs¬c¸ý7sòf´zç ´ëøýwÙuÂnÖâpË#ÿó•IaÁïorëðLCBHM®Stq¾CXžÃúB‡è¦§¸¦bûèš2Û°·ïÂðú }žï]èª;ÈJ7)KÑŒ Ó¸½õßÙ…ÿíÇ_ãüï>`LcþœÓ‘øs47þIøûÄ©[Ñ¢B´Jå Ú"‰¶7•�¯ÿ…5?ÜpïFìk÷Ðû9®a9ïœ"Þç9F—å9Å—ÙǾÊwŒÈÎw‰Ïw ¶- �Ë©Â'û÷à°JçàC]÷ýtJYÝ5+6ÿ¯Ç1d å¹{–ÿ—9öç{cñ»ãðç”a³Ð ùùhÒ°™xž¦a›4ûø…hÚˆehÒð¥h¢ü4eÌZ4k¦Z­ì€v}7B5�ÝÀôæÙaÜŒýø„‡rÿ0ɧR/ã�Ÿ“MÉÁØÆ„¼À¶2»°5€ÉS°mÍ/² nnºtsN‹æ Pýìa�Ä�ËwëHÑ,ù‰ÿ—¹AÿÅVÂÏù ا°U‚1)Œ^†fMÜ‚æLß…fOÛ�flG3§nCÓ'lDÓGm@SÇ­GSáû±›ÐÌñø÷fª¢¥›¡íÆéò2Ø•¼ö˜yã}ïSU)þ€Í¾v ‰Æ¾¯µÀ9©9Ï5¹ýƒcBï—”ž2ÇäþJ‡¤Þ»øæJ›èÒR»à]ûËY¥Iòÿoìã_vÆ8æKa„"š2\ÿ4 Ï"x~ì?åæb[²Í¾MµM³M¿Íšw-Z‰±Ÿ†=ÚÌÄ Û&J�ÛíÕ=Eÿ+k&ê~gñÆ#äÑËë‘r#Êò"Ê £ËKì">äÛG8D<üà’‡íé›v¡ðzh±k°Z«ºzƒêÿz,ÙM°c9Ë>êÏïGsvdÌŸßOÆó¨0b1šƒçiî´­hÞÌ­hö¼}hî2u4‰!š½D€f/5D sÕÑŒEÚhÞ ­ÓõG»m[&¨¼g7H>¾¶ |íÂá–‚›!Ïò‚16 /r Æ83 ¸Çƒ<Œ_0+.¶ ©-°)(´ Ác ÖûÎÜyÂWnÉ–]Ø·Nþ·Çvr4g†sßÙÀ¡=8–C#“Ð ¹YhöØ•hö” hî¬}hÙ:)Z±ã4Z¼Õ_'ÐÜÕb4w1‰f-'Ь…<4CAÍ™£Å½·�†öØÕNPÿÈjô±‡Í^?[žàýÒ3¤ä•Kdý;çè¢<§hìã#ÞÚ,± ¨° ﯱލµ‰©)±‹Lªó“•.Ùfô¿š3¸ÿIF›ô'zòy°÷†Þ›€ß�‚fŽœ�æŽ[†f�_�¦®Ç¶yš9eÞ;Ñì©{�´=hú´}ÜØæ­4Aó–HÐâ §Ð*w´õÐCù�¾]ST²Ø•û‹X%ƒOì‘#u·Üƒ¾Êq‰¨Îs ¯ÇóT]jÒVj{®½Ö6±­Ê.¾­þZÜûR;Ì%ÜÔjÙ½ËÖhÿ¯×æÐX7àϦÊÍFSå1CÂûjÞsÓåâ×¢‰x'ákÚ¨%hÆøµxl›ÑÌÙJx}ªâ5i€æl6Aó•΢EûmÑ2O´Š‰B«ÈX´Éì…Ü¿_g(—²›¨Þ¢«Wòãü\ = ¼ƒŠ1öªÂc{Rlú û¸Ò"ÛжRÛð®rÛˆ¶ ›ˆÜû°‹ÕQAêïÙݳ'Íù·çí¯ýö<Õty¤0rÓ¼§ã×'`�=qè=¹yHaÌJlñÜ�Û€íæV4wæ>´p1�–l9�–ï³@K5Ñ25´PÙÍW·B Ô­ÑJ~Úhœ,·Ó½u’Êsv¯Ÿ=*ê*°»PçíœðòÉ͘ªW®quï\“rsB�3ø–¹G\jŒŠÈÇ<¡¾ì‡zs]å»löì ÿ¶/Îa-ÀˆØ{ Ǿlœ"¶ýK�ÂðÅØÎ/Ä+r·6§áÏér3ñø¡Yã– iãaÛˆ¯É«ÑÌéØþ/ÑAŠëL‘âzs´hÓI´t¯=Zj„éx¡uæ÷å¶»ÕŽÛwŸ]¬ÖÀª`|JÚþÚõLu¢¯ÿ[ï�û¯]‚+Þ:†Ö㱕äÚ¾(± úXeéÿ¹Ö:ª¿Ù:®¬Ú&&¶Ä9Èèg÷åub‹ÿëœ aàÿøù/[2„…ÇàÙ‡÷Út<‡³¹kºü¤0i7W óÕðÔEsð:\°YŠl¤±M1@s—ê …9ªHa‘RØh‚îÂ{ÎÈm>‘)¿Í¯a®[ìlå v³j»ÝðÛ'ÍoÝt/ô ŒÊ»Šmgø[Œ¥ñ k®²�‰í­³‰ûRw-¶»Ò>¾£ÂbIÁÚ-,o‰âŽkÞäÿÅ>Ù�‰x,}Œ_…¨¢EŠÚx*höB5l+”ÑÌYØ~ÌÚŽm&Þgx¯Í›½Í�³ÍWPAóóÐüZ¼ùZ©îˆÖ ãц£Ùr›�ÊFoòo»ë»`OâÏ9ûóÙÍš],Oø¥Ùڸ퉛ë»À@ߟàò\פÂ|û°çïœB¥?ò^±:F�1¿Èÿq�iou2ê`Oi”°ûTnNS˜°ø×�oáC°’c9”zš‚çi椵h.öÇË6™£ÕhÙv3´l-^¸ÍÇörîÔuøŸ·Í›³cJZ´–B‹6ŠÑrÕóh½�7ZOE ­G_Êoöï¿ã);GµŸUVûÈî7dÍy½ì ¦§ÏõHó½€Suia‡:�jL�Hx{#"öÝ͈ÓM·¢M{ŠBjƒÊʬüú*,ý£Š\B´úXr“Þ¹ÿql#¹ñLà|ód¤ÀÙ�qæÇ} örúˆùƒÌÃûQM—"š>qš½H-QÆøøÜëá{ýûfì½Í.T~É®<©üŒ]±'îo³w÷NÛá×5e§CÙø�WŸ�ÞëQ>E5›]u –U5úÌž7üÌž}-t3í{ê{¾1*øprÀšÏ€»æ;„¾ú`TZr-°©Ø&d Â>¶¦Ø.’øÚd£f_< lØ÷gmŽùÓ—Ãúd¬0j.š7e=Z¼F­Ó<‡V’–h…yZk“=|�ûû‘›=ŠÇlqy?zÃÕçÃ7ØæŒØæV6v›góømîõã·Ù~­d‘;j—KÅ„ýÏØuûkÙ=ÊwÙ%*>Í3Õ2Ø𵬦n=+ÔkcÅzM¬H0È^½R˜Æ•ޱ³}e@8�2DÚúûôÓ�Þi‘Y_…<—ûs”EW†-Y±÷X—rÜœ�]Ÿ¡€ñð,4s¡:RXiˆVì?‡Önh-qmû£-'nËo÷©™¸ç;_9ÏO%»m%»ìßn¯º)JÇÒä7ˆ=ÑVYȰ�§n�ØëP:qŸ{Ë4ÕðoóüÃPTÒ}QüêûQòþ¤¿©2ÿ0?ùaʼøb*Êê•ÊžU“䵜‡z'ƒBÖHEâ%?]þö{��6uô"Œõ7£Š|´h� Z²ý$Z®a‰Öñ]ÑZ­KhýÞchÍV­X«ŽV®Ô@k•DH‰ð¶ãâ³Q;­ ÇîOüûb�*VM§Ž5ÒïeM‰¯?ìÌÛ|¸.øþÝBøå§µn Ëh¥ýºV'®k­îv«~)kÈ+a)~k*l8Ã4ÖÚ0«õ¾ 3ëz*þÔîEÕXð‹Y©°òçq¦³ÕŹÊ/¦¢ÔÊÏ¥Â'L-vpÑbE¥c]ÊkÃØï3<Îiã–¢¹s•в-Fh³æ)´�pA;I´ûdÌð��¦(°«5~²|Cvð‚øó â× k£|» ü½Ú’ÿG“…Áïìq�,Oó Ë×ýÁJõ¾±‡èÏ].ú]¬‰–wÞ<ÝSAc4Í}Fêå³:‚2ö�AÆ; íoÏ¢�A¼Þ$ɨ'é½ÃÄÏÛ4.ÅŒ[ºj7ÇÓþ»�‰xÞ(lGË× 0ν�¶Ÿz;b‡GûÄ]ñ¬^{;´¾°¤Þ¯ì!½Ÿìa�¬d»KµŒÝ¢Þͪëÿε¬ Î(³Ѝp v¨ö ¾q‚Š^{oØíšOØ­Ze¬¯‰5åw±ç„\“|¯öa¾~¼¡ÿ„U10>!§ºeÒÑPGpŽê‰ÄF*ðí&±uò<Éé€)"ûì%Túﺢìc2í‹&å|o‘À:MA×Ü{ÔÚ͆hî„¥ÿ%ôkSã,Œ±&­DK·‰ÐVãX¹=>mÓÀþøÂí—ƒ†?ØS†¿°g >³‡u°-¨e ƒ2–Ð+fõ ëY3ákmÔɞ䕱ŒÁkVË0¸m�¡Kæ|^B÷VAÅ¾Á'ւ߯žÐËøCÉÐ=K‘]»�¼õE‹z:ÈÂK6þ¯×19JÔÃ#qö‰´¬ðši}ž—èy§);x€¬ØN{l ³›hÓ¦7^Òî2o^)KoÚMþ·ã‹íâ$ùyhòèùhêÄE˜GoC‹Vë¢ ú–hûÉ{÷ß(¿çÞߨU²»ñ~âi½a÷j¹¾VÐ:•0VÏ᱂Þ[Vƒn*·>ññN”l0Ï—htöõZä³<žGˆïÌÑá¼ —Fòì]'ê…f/Ñ+duD]�®Lc‹�áõÌÚ|128h1Üðößö·j ÏúL´AÖí=ìKÞ6�brÚÌ˜Âæ“’âÒ+Féû„·¿«ijdÊ'uÑó�Éܯu_³*.¤�[´bdzÿõc*ök7ÑNÆc˜ªmΤ•¬Šî'Vfô…=¯×Ïc{-1Ä~—üú݉ü>謇mƒ¶Õ­);T4‘ÒÎMÈàìÅF�{µÄ�ìϵ¤%X4EÄêÍ%? 8ò*X‘Nê§õºîïæë?eUxoYƒ„ŽÍ†�/–>ý©E¾l§‰G}F¿iW§ ŒÏËë !;)ÏõI‚þûñ󩨆Ýôíï²w�Wdù5Wñƒ»…gnŒ3²ˆœªw>düýóhÑì­œ�–çâéÃþ\—#Ðdyì×fmA+¶ Ñ™×0•Ðî9ª¯Ùµjõì>�_Y™ðçÇkämÎÌoõ¦9A�ûcú[\¨Ú¾+äû·¿IèÂÁÓ’ÚFgii³=“= !¬bgêªê"í];- Ô¿ó£J·>ÿ‡¦aÔ‡ ü«á´0€yèÊ�<¤jŸ?Y½‰= ÓÃÒä×ONdÿ¯öüw,mt‡U5´‹œnt?ËË®„/V“.ñó±N�v=õUԑƶíÈ@Y‰èÜY!®wœSú‹ÀY"žiá÷�°Ý œ£æ¥ÛŸì•”Gæ úÆÃâ¤f³´*)Vº‹¹æ;Î`P^÷V�‰û©¨š=¤ÿ‹õÂÔOjÒŒvJÒSí%k*ó4ºûwU¡Sü\ATéâÅ mÜTän2ð>˜ùÑà!øÉZòe/cvZ»ƒ%´³ØÚW3&«ð"MÉÑaúQ kéÆn+QYÇêùwFx1lÊemdÈ7EÜ ÷—+ Ïç+uR´cÙ´oõd°_™HÌä]¶›j~ÑnÚÁsö“eÖ>³ÈØ‚ÝPç+zVoBd·ó‰Œ/šüô®}Âë‰ó ÏŒ%Ô½ÔÕ ï|×à‡·mF~ÚNÞù»?¬bi«@œ¾6†²š!HhØMÝÐ#24ø±ÛøïVñ»• ³Y Ç샌Ÿ;õîü]Iï6»U#�Ý¥ÙÏèüÂJ4Y}�zVOï«kð†Õ5*b^««çûBQÿŒýH³³òFÏÈëhk¢�«¢ýÛ·#ž"]IŸ·=4AGôEø/{AÛ$Ì%ð³%Ý“qý@Ü—Km=è3Nãi‹°ÂøÚÝD\Ë^Ê-E‘²�œM9„Îb[(Í)?y°äµùºS"¼þ`±ÀÚo*éúx©äyË!ie¹ÔAÊ>|°¦ô ñÍ;)·;‹©K�S…^¯Væ³|bð«-à"íì ›çSÔϦ�Õ¼’5IãbúxíÇì6þ'ö*Ôòñ+Y3‡´™ZºÆH]E�I©íTFûwîF³ÖcèÛm¢ŒC2©IExÎ~¬¡@†àL:Ÿ!Ù› p�N©Ó6¾[$áÎá:'(B ar“2ì9Âëö2òâ͉„¥ïTÊ'k5œ?‘&4ÀÙ&£‘'}YvDœÝ(•fÕdRûu¨¨¶½ÂØö=tâ :Ô|Š?Ô^äßÿMƒŸØ¶‹ð{¾Zøt� 뻞Qþ„~%ÆTíìAƒÖÏ›¾ö}v‹¾oýR=3§ÊÊ<¤i(EÒ«òüË!“ÕuÅhïv5¤«%Eš*ÚHeíV¤¹÷À��茜†¦Rݳi« �Db™™¼éyë‰&N KM]n­‚³AR§€ypÆ‘¹Õ¦gšYyTüð£Dp닚Ð6l&é’²@˜ôIE\´‰¸6MpÆk¼0åinóE:³—âκXE+Àyfâæ�Å„SôÒ1~žÐ=s‰a|ÝVÃÌŸjF·¿)E–nä%(Üú¶Ó cÙB–gTñ7©Qáßh½Ç¿ïæ¹¦ÌæÙ‡N3Lþ¾“Ìî'�"Z·^ Ÿ&´Šž!¼â?ÅPtx˜ŠÒN´}ÙJ´w£ÒÃûŽÚëÕZêæëUDÊ€*õ¬C$HhÝ#¼ûE“ÈìÖ'½3W�6þÓ ûˆY|›Ø†îò>¬àY¤NÓ–]•Ó NÓ•XËóÈËrz†‡† /‡Nå_🨪l€�š†f`Þ´aꤶûRÛµéëò¸>Ä<¡É0BzBžÓÅ9wc²øðÉ$+è¿ÈN»M„¾[ÒóŽEçlÆÃ™a&­ZOš]a&yÐ"#Þ­ZÇÎ$‚ßoâ§õ«�®÷ƒV—¡ä¤�ת8»í $³EJ¦|V‡çHæn œç“–~ÓèK¡w ñ¤ßˆ—ý‹ºQæ7u£‡?e|Ý'𼿘ïrw¾àZÔ á·q0/º ?f(Fp6¯õ™¤{örâ’çDX÷„ÛƒÅp®TpÔj¤.Æa:<)НÈS‰óÈÈú]tT³ ô͆~F\?¡Ì&Rx§_ÎvQQ»‰”FU"­Y ΋“ئP±óè«~ÓÈ«>SH«àéÂìçÓT±Õ;Œn÷«÷o»dÔ«.)ù¦×„Ém?Bd÷ ø÷j�/úÅü;¿î'N¹ŽÓgL‡šœ“‡ó[dúm鋺ãÆåïeÅ¥¶TN¯Ô0ë‚§¬ÏûýRMÁ´Va)Z3a!þ:ièшÌj¤à¸ÕH#³sÉÃWG d—†«ìWGû°ýܧ´‹Óc#.zN¤ÎÚ�㛚Ë�¯�¹2VrùúTN3ê˜åÆìÌpÑ©+c W‚èVƒ¡äAƒ„Êì4"Ü"ç‘ÞSIu»¨”.MèkH]õš"²ñS ’êÔ¤Ï?˜›¾pa|ÅnŒ¥×Áü "+· 2¿h3zHAJË^ÐQ Î{LÝ2àÅz"ºn7[·›NîÕâöºÏƒ•Ô�äEDXé6ú^«õ¨UsK½í0¥óZ“Ϻ(ìwÎéó'�ÇðÈršÒPá!ô¹?æ0š<ï7™´Iš}£Hs»Q<ê¶§åÈ �SðZX@9ãË'o=œ[¡n èÒî™+ˆ“vcˆó.ã)‡ìÏ`<:“² ²‘>YkˆØ²ÝT|ó~êN‡.}÷#�LïVçúmßï2 u àœ†0¾i�0èõ:~F¿ œ. 5ßÔ«~™ yp/?èý:~â·Ýpÿ¤…ë$á›1”çôU"ep?ôÍ$¼,'Ü-ØÈOìÞex燲àJÄTMS´eÅF´núb´}é´{ãftàÀ¤­g€ha߆ñ±Žƒt (¤¥ÁCZ:†ÈÐ쌼Ð"p*ôûg´¡×"ôú£I39‚�mqXŽÓ� {§Ä$4 ›U¡g7qÖa噾”¾Ýd ½W!†µK»§-aì#æ@O,Ñ�Z¡8»N*Êj‘P÷zxDÚ'u"ý«&œ ##«wÂ39úÏ&=S–¢?l¥î÷‰^´ÜûM“ïýf¥Ð»t­aBïv£„¾]·; ÙŒ0�“Ófxðêpâ¬ßDþñk#wnÚŽ6,XŽvoÛ�4•õ°Ý Ј„Þð’·WJc?hˆÃËö�îô¡ƒ~…|¡ ñ(ÄéaÚΆ³þÐ÷E䑼Αb?°€² V œcæ c›v“wu‰ŒO¤ÿËu´U¤…/èO_ñšÊ�ɳ�˜Ãá› ‚M\_AϬUDÈë�dà‹õ”[Æ"ÒýþRAJÇ>"³Ç€Êì6$’¿ª7.�~|ÙyyuTŽob9œ8á>ÎtDØ>Ÿu=õ&–# Ïô$�:ަmãæÒîY+‰°Z%X_ÐóãŠÔy¯Iä9÷‰ä)û±ÄÉk£¡w$íro‰0ºa'wÙÿé:a\ÉN8[‰ýŸ±4»ò�(«A*Ë©8#zWw”Ìì1†o¡±ïú>]gáüõÿ±÷æñmUר³SÊŒ `åÌCÂd;!Nl,k–c[vDdËÈr‡„ „ �� aJ 3 -¥Ð‘öòµ¥—–2´¥”ÞÞÞ{ÛÞé{ï÷¾ßï½?î[k�Q’9Ž-™#ˆuÎÖÙûìµöÚkØ{íµ~òO­�/ý_Õ¾U{¿éË>vvÓºC—øÿß·úŽü½õ Íß‹ÿ»c�5ud&àšF}¬m<ÅiÙõ߸ÿs9°úàEwÜÙwbÍ�s+n¼A­˜1ý6 ËÆŠù¾@…/Ö:¾)¶e÷}gºWœÖØ‘9sPRŒ—¶¥};'†zïŒéƒq],}ìüXGß)-ËO�†ÛÆ7wô�ºà¾ƒW†v4c=alŒÀª§¿Øüâ•þƒ¿¿9¸ÿ³[C/þñv<çÞúòdŒ'8øEuô•Ï|Á7þÐè{ñ¯Õ�¯þwMàÝ¿£|Ñýá…^ù—zß‹¿¿5ôÀá«Bkv^àßþÖuM¯ýÇ:»üî¿ÆšÞüÿÀîøŒó-}ìÿÒ�çúüýæ¦C»%ðÄ/„¦-oM ¬Þs¡oÓ·¯lZöôyÕÕó+d¯P1릺 Ì㉹¾|>øÙã[�O1?6¼@1:ƒ©¥'cÌT¢Kà›¡ÇÞ¬ þ§ÙþƒÝYºþìp÷ŠÓ#럾4°ó{SC�¾ç <ï;òŸ3}/üå–ðÚ]ïÙ>1¼áõ«1×F`ÅŽ‰¡O~ådhÍÓRL�{À\ºøýÏ_Zýô…KrùÎoÒ+N ¤ï?�âílùîdú^òè9þŽ•'c¬y¬ƒçð1F•oÑŠ“ðœ4ÆÛ oùΔÈÖï{Ý÷Ÿq‡¿mÜ|_KÒ³¿kÝéáÕ{/Æùâ{é?k}¯ý}¶ÿ…­ñþ÷™Mû¿¼)üÀë×`lwŒS<ô§ZŒ±†±‡Ok1¬ýGþyvøðWóBoþ±)ôîWÍÁïþ1ì{áïÕÁG¾{=Æ�C¹ÑôôÿâýoümžÿµÿšÓôćœÕ� q]­©ïÉó[�gøò&Ô!üÏ|ªâùqŒç�±#}1˜k ;Oðßóèy¸6ÐtðO7ÿ9ïï¸ÿ”ÛgGÀšUQ77RÎn9;üÀ¡+16eøþC—.Ï/Û9qìKÝ{Н¥÷ÄÆÖ®0gGà™�§a®Œ Ýzäºðöïs[ã}RŒëµ/ÇØ£Kd…o÷¼ïà7Â|œ|ò]6´ë”Àž�¦Gžûôöæ#Ÿû‡~5;øÜof_ü·Û¯ÿe~ø½j‰|òéŠüð¡Ÿÿl=ž¿�ÿôG}áïü>Š<7¸êÉ `î ÁWþZ‡gq¯þ¿s}«Ž\8sv âfù–Š¦Î‡ÎîÿKMèð_æ`|1ÿÚ5m~ûê¦%O�‹ºè¬ÌÙÚR�ñm(n䯝¡|Œ‰{OŽÜ½õlÊõpÏãçcLyÌ«„ùðPÖ-øÎ/:"¯}æÃ¸0Á…P¾ñlŒ‰xùo·û^øk5Æ6ó?ý[ÇcÑa΂` ìÊ»7�\»ïâà:�³`_„€WW>~~xù#ƒ+Ÿ8ß¿ì£%�œ\òè¹ÁÞíçDºÖ�¸{Ced0æÅż!”4Ö5>Ô·c"žoõú{µÿПnÅ8áuû.£\Eƒ�³ë2æÃüx˜—s3aŒ¡Ð’õga —à«ÿTyç‹Xì­ß5‡_ý܇6ƌƵŠ!ôÐ+“C›öy0ÖSàñ÷9Œ=ƒ¹A`'^ú÷9þ—þc¶ïÀ§ãœÁfaÌ?“YsFxÝ3—¢Þâþ_g„6¼væÝ½l´É0Phó W"�b תSç76#O�1ß›îZzRÓâÕ§î{é2˜Û·†xëÚù ­3ož]QwG¤ÂߺdBäþg/Ã8â(صötÌ�…ñ ƒÝ›*}íK&Ìž®˜JŽ\\б‡0¦k ž9cÉ„(~ö WQ,ü~àÈ5‘͇&E¶¾q=ÅJÙòƵþ'~ÄRN‘çþyvì•Ïý­ßú‡dû;?ÌÆßúe"|è÷s(ŒuøÛÆ>ø]wóŸþñ�øŸ~ºÏÊa¬’ØëŸ†ð\>æchzüûÞ&°Ašžý¥ì;øo75mýÁµ�wm8¥¶º¡âÆë•Š9``L'’›w¯?£ó7§Ç7,Ìž8·¾øfkE¨µï$Œ=Õ¶ë'··ìþé Š�¶øþÓ1Væ-Áú¡¾íw-9åvó·~½`á·¹8¼ã]ãÒaL%ÿ®÷ùà›ÿÞ|ëûžÿßÓ‚Þ¼ cØ·‚NùØ÷™Ð’íçÝKŒC]/´ñÕ«P΢]í[Øu"Æö÷÷�s´i×O”å‘|¹0òó?¦ñœÚðÇ5xgxÙ]'—>òqß%Á̶³p­*°âéóÑF¨kjwë�uêµJÅÌ[æU4¶-›àkî>aØ®µ·5€. :d4Iù·šâã0&7ÆŸÆø¥û?К�à tŒ,ì™é{xbð¡×®Eˆq›O|(6¿úy¤ùå/ƒ‘mߺ�b®æòÀËÿ<7òîW-�ïý?á;ÞøŸY�¾=‰äæ'[±ëÿ¢ì„º†Æ Ì;‹çê1\cÇŠ“fÏi¬@¾HyÊ@­Ü2}õi˜›3�H�ˆq1)_%ÐÆ„ª÷E*‚ ŸÉ�-Yv(siõî‹1Æ.Š>òfÅe:´°{Å«zøí©±m¯Wa\.ÌYJ¦OÂ8u¡]?S#Û^½ãjù WŸË�zü{Òeþáž9ÊóàÓ?UBûþ±íÁèá¯æû~qKøÞÝ€§Ç&bN™¦=¿Wý/þ÷,Œ9áÛû¥xàÈ‘ÕÏ\Œ}›3çPEpñ†Óýw­=õŽh×x{ßIþâbé„9õa°yj+äkÄ µJª˜Y�q9Žkˆ§N,ÝqnðÁW¯.ÙvƉÇXª”Gxéæsc÷nÇÜ}ç`>óúùÑ ŒûDùÙ0>ðWôGA™‡±…Âû?©ÅXÌÄ›2÷žÑ´÷WÓ(þÏÿ¾û_Qÿ3š†9Ç‚Ý� scü\°½æÝ¨@ úcmÓÎ{‘OΞÝTqÛmõ˜ïŠÆ`éÃ1ïåqÂœÌ âã1ÞñþX…/²p<Æò¦Ñé•g„»—�ê�÷N ˜òÀÃÏ|pcóž÷k"�~w*Òu°=;ヅžú¹Úûá-÷+¼êáóI×zú%°ÿ—7b†æµ;.Ž­ßwæh~èÍ0Öa`÷jìÅO‡ÿ2;سé̦…©)ÏùÆg¯Œ>räzÌ;:ü×ÛƒGþ:—dý¡?TS,¦�/_Jn<-´xõi~˜�0W:¼í½ªÀ3¿¿1²ã#cÅa53\KÃØD¡þ<›rž¿ Ý»ç¢Ðêý“¾þð¼ágÿxkdÿŸf7ïÿC]óþßÖ÷ýúfÌ…íÛ61|ÿ�Ë1–!ÆÑCŒo\{èRÒ9¶|çºÐJ‘½ž9ø§Û›~Zç¡ß4FŸûd.ÆO„¹ì�®Û}YóšíEw¼Í…öXÙóQ-ЦL:è6Á�Ï_²n ÅÓëÚ|&æÄ ìýýM¡ÃŸ>ò×y¸n�ë¤:¸ñÀå$÷3À§xy®ÏW¿tYS×§–¼ó²bÌQÊ�±_A oÞÆÒôíy_ ¿ñ…?vø³†Æâ^°øÊiãrç‘ Eýævà«Ó‚‡~;#üÊç ¡G¾s}`Éý•Ã?”½ÿLÌuŒß¡ôêÓQ7ǵ‡ðýÏy0æ3ÊŒ3\ÿÒ¡{^ÔÔ~ÏI˜cdÆÙ—/pàߪCO~¦ yÐö‹¬Ø{1Å®;ôÛÚ¦}¿™†6/æÌÂu1Z‡Ûpø ¤ùæ=ŸÏÂXo¡_Ö„žùõ͘û ²hå)˜×sÍ÷ýê–¦CŸß„qBqM„ø/âyÓËW÷|ysó¾ßÍ øó ¨_‹qܳí›áÖž 8ïqÍ)öèÛlðÀÇձß4´þ4Ýû›™�Ý¿T1gkxÇ[Uë.¼þ•«(ïÕ¦oM‰úËÜÈ‘?7Ÿû¯™þº9¼ñ�I´~¼éÈUßê¼ýëDì[_´ý©—ö12ÛÏöw?pÚºw€ ˆy×ëËÆaÄpïãçE }Š#‰9c€îCãënóQ¼cÌ­‚ñ ›·¾Í,Øðü5áއΉvo9;ºr×…¡=ŸÝÛÿÉm¡?b+ý&ÅBFùŠñ®{î;sœ…õÜYþ§@/{ýO ±w~ÛF1ÕîÛw©‘; õ¨@¬øaç ánŒ)ºû›o󪽗5/ÛñMŒ�º`ÕS—boˆ¾ÿqrÁ�>Lc,î9Õ·W̯ h±¸~4«ù…_ß}þ³yþ?ŸN±¸Ñ¦Üÿ‡[À†æ0æ Ú#±žµgú‚nú/å^;#òcÓ7¯?x5ÊzŒ|ð­k�[Îðµ.�€væ/‰®{éŠèÚ—¯ —›^¾uŒYDzÄ#o]‡8DÚò…»Æc^>¤ÿسŸÎ\°ç‹9±Íß¹õߦpbÜ�ø¸ Ê Ìy…¹@.w¼MvO$ûȹãð}æ5Œí|=ûÅÜØæ÷¼G÷�PŽù#Éñ¡øÝbÙûÏ¢œO~OlÞûÙœ–ýÏǘ»çóù?{âC�ò"Ü»÷bŒØóÕM�?cƒ¿}MðáƒMõæäЖ·¦øŸÿý­Íï}ÔÞúÃ.iþÞG‹_ù�ÚÀözƒ�|05tÏⱘs÷éB÷í½×õ0?Æ¿ÃÜ¡ƒ_ÍÀ¼'sfÞ^1{&ðÕÆ0è¡wŽ3òÍ5w¯;3Øžž€r‘òfݽõÌ•‚ëï”à ¹òTœw±ìÚ³"Û@bŒUŒËM¹³€ødvôÈg�ƒ/tøÏ·7í=sg-ºÿ4_ë’1·lS8uBShñxŒÇÝœ^fsríé˜ã„bÊ.\zR˜bÚ®=ƒb*?xøêÆçÆK7ž�y¸1ÏÌ‚}ŸÏÃ+”Û¸{ã™”·ðþ®nY²õwv­>sªD ó"Q¾ÌÝ–=)Ú t³ìá‰û<ú—ó(wÖÀ­‘;ë!Ì�ú]÷ÚÊØ}O]‚1c›W€ÜÓsg…RNo=xÞŒ¦Š@¸m|¨ÞÕ²ð„pk猵Z´yÒëÖs)?È1ZÉn<ËŸ¼ëDÌÏ„1½)îõ“?)7æÙ9�ÿZÒ›ÎÆ|u-+·_{ðÈäÈΟ*aŒÅ½åȵ˜ÿ*ö§õ¨#ã^Vp%èL]ëO�$µXÜ”h÷ÇÓ(Î,æ|Æ8רï‡ß¨Â˜µè�Fù{;ï9U[^N9>,^s掊¥Wž®åÎzìÒЋ¿�‹ëƒá¥˜;kAEC=æ3Yz2æéÂ}7̆r(Ö¹ì4=wÖ˜;‹â•¹³+OYpï¾Ë¢Û(,X÷Ò51�g‡ÿ®ûN£¼]+v_D9Wl™ˆy,›×>~)ÆÒo^ ¼Æ5š¼ÿt¢ïí?’°>Èó´úkµú÷¸cV#}‡Ò@«Ë6�Óüà¡kZö~t{üÙOæ“Ýtð3î|Àˆ;ÿò ãÎÿ®ãÎ/x}/¾Š¢LÚ±{Ÿ½$ºöÐåMËNÂ5‰¦»î99Üûð¹(ã1oÖ|ÿÂqõ�;Ç5aµû_¾*²ãW 깑û/Bù‡¹ým÷œä Þ9®±1Ztr"åaíYåb_ºáœØš§/m^º]Ë׆sþÁ·® übæ%ÂõEè=˜[óœ×Ïmª¨›yåÎò…cãš‚fî¬+p�ebýüóg6‚|i�ò©9±ü”控6'ûN�&zOŽ´/?y4æâ¦üÔ«w^[ûô¥È?Céå§¢¼§|€ÛðS?–1ÇŧïÝr.ê­1Ðõ�\{ü=9úÈëUч^»Žr¶mØ}yðùOf¡ï ®•b,îð’‡Ï B›˜ß,¼ç“jÔIq 0š\sZ,µútô¡ÜXë^�ë-”ûwõÁKƒ½žåoMŸH¹œ@f’Œ4rgíû¤&rðÓÛp-ÅÈ�…ò6ÚûèyHÏ‘['b¾2Ì�…ù’Ñ6³rg­Órg-{ÿÎÔ‰(_,yø‘¶%'áÜÅþ±žm碄<·yÝÓ—Q>³{¿pÁ½�^<ð”‘Öå'Sî-¨ß²ô‘ó±>Æ[·×G;>¶aß•s›rö¡®ñøOÔæ½?©mÙôòuÑ•ÛÎǸϘï™rÁ>ðú5Áçÿ6+røßê1Ž,æŽÅÜxTd'®w}_ˆ>øü5ZÞõ̉˜+óàz îyÍóG*ê#‰ñó|ÑŠ†pû8´q={¾/V�9±ÃÀ3BÛÊ¢.Ioª¼£!^1¯.XQ7¿±"¸ ã„æ�¿`ý³W`t´Ë)·)Ê�M¯MƵÊ»éÕIÃ} Ðfõ¿òosÂ�ý˜Ç|ó˜;k>úJ†[Æc`¸"ˆ¹³€Æ‘?Qî¬9ð>ø‡¹ß›{:/¶dÝÙ-©¾ÓïLÞ_‰9#mÝ'…ÚÒ¢] ?1wðäÈæCWcDÌ¡Fkç˜×ì™�o?óáM˜ß5ºlçù Öð`ŽŠÈþ_ÍD=÷9P§ÂØÜ”ŸðÁ=W÷\�²…r$l½cí³—„—Œ˜—ãà¯Aßú¨fÁªÇ/i^¼æô;ûv^زìú-‡'7þuÓ‚—?‹F_øcCc'ïþ�L¹³(ûË×øwÿåÎ íúÇi”;kÕ.Ì�uÂ\œ‹±ôøðšç/ÅXÝ”›úÁ)wV3æOÆÜYë´ÜYÍöÜYi#wÖ’“ƒ-Éü!°-c ·£Î‹¹ã×<{)Æ÷Æü¨“`.°æ¥›`~î¼s+P}°;"PÿλNðÚÆa^*Ô(ïÖßúöõôsj€^¢Å9~áêà2Ú¹ætÊO–ì=s~GW>}aà‰àC/ýËܦ}_LÇü‡þ;;N@ÿòüC[�ì„ÎÞSñÖêæD+`“'î=Ÿ™ßà¯ð-X8>r϶‰¸Žˆòí7l×00ï´¿ ôŸ{Ÿº0¼í[×a¾ ÌÍ=wVSÅÜ9M¨o‡’K�ï¸0¶åÅɘ˗ôJ�Ûä'Ï[&Ò·�rþ¡¿•ÿ¹?TGžÿ²ŽrgaŒôTß©>3wÖ2=wVï© (wÖ«Þèöï ±ì¦³}MñqØwÌ·�{¥Í+» öðË7´¬ßuKvå·&{|ÅP<öÝ?ŸFù @a^Še�ù (7ùÎ "÷< º×KW£ íþÅ�‘}Ï îùÅÍ�]ïK˜žÖÂÐ?‡l™}„+üØ÷9Œ%�~�±Íß¾ó’Æžÿl~äñï‹-K7œjM�¸à®§�½vIøéoD, ¶¬–_RË�¤ÜYŸÝyîŸçF�|yú £}@¹0º×žh_urcDz þäºSŒÜY¸¾„9(¿Òû'Ŷ½V»ïÑ‹I¾ß·Û~ô•ë£�ý@hÞüæ ˜»2Ú½ê ôÃ9Žë&Ík÷zBO¼Ãiù9~ PÞ˜�ÏxðY”QÌǵím¦ùÁ7®‹­~ôBäÅQ¬¿0y"æßÂ<÷á]ß“C{?¿××hÏs ®Ý¼÷ñ bÙí)‡sê>Êu¿à¾=žÈæWáþEm—×çGœ†6ð„¯8ÕJŒoji�²“ô_Œé¿|ÛĹ³Bw4.j½ç¤æÎMg¢}Û¼âÑ 0ç òäð#o\;øù<ŠƒŒ{‹î=y~8³éL”…þæô ¾…ãÐçdêR(ÇšWí¹Œd$È5ʳ‹kž`·¡®—jùK_|ô]Œ­/£ÍÜù.ƒyš—?qå[½ûR”;-wˆmýöÔ(ت˜×7µœÂÛÎÕòP� E=uÇ{æ~C=€r¢`Ð%�? ®‰~'˜ é ÏX`Î`Ä7æ¨C=$ôøÛLä‰TÔq_sÇc^ÌóÚñÎT¢MÌ-³’dÑ5‘g~u+Ògøà¿Ü†ûu±ƒŸÍ�þM$ üóÒÕÏÃü‰íã)ôú}—Gz6�…{ú8&Áô½§á¾Tð±°�§?”0wVóK¿6=÷Õ­˜;+ôÈ«SðÌGxËW†W¸cYiÍù‡S(wæ Áõ¬‡€>7˜^Ì�u¿–;+òÄwÅЮŸ((#h½d~óê]—’® |s¶ >|ê{Bd;À½iÿ‘ ® \óOŠí|O ?õ¾BymqÏ%»ñœ«Á>À~›�Lïý¨:²ÿ73û?º)ð,´õðÛ×c>;Ìó�ùžb[Þñ6/úÂ`{ç„Èï^�k±W>  ^Dk‡þp«ÿ™�(¿ØXdklùö ‘Ý¿¸9òäÓPOªoŒW,91_v®ùÄî¾ïL̃[ÜwZóÒ-Ãûþ±¶åÀ¯(—Ì=ÛÏG] öÐ `¯7m›+0‡®c>\× Œòœ®<­yÕ®K0wÚ|‘5{/Åœ‘ /\‰gLh�iÝ‘«BH¯¸~™^uZäî5g F9`€–¢[_¿÷3(Ç{×}•¡¶e¤ï£Ýøæµ¡§~1 ×D¢^‰9¿Q~‡€Çan!Ä+Ú£Ä×=u 欦s.;>)_Ðò­”µ¹ï¡oPfÔC#;@nƒ�†ú>å±A½hÃ~OpO¶æÃ]p�ê9Ý+Ã�¼u®iÄÞü]¬ùÍ�„ü¦&ÜÒubSc¤÷¯(GÍšÇ.¢_˜ç õ°ÎûÏ õ[î¬ÐÎñd·Ý·ë’ÈöwXÔÇ›ö|¢¢ýÞÔ¾ü¤&ÐñCËvŸ�¹Ò¢›ô\œ`÷Á<¾v¸ç{è/ùMö­9+òÚ§¾ø;?¿«ý;ïu·¾þ³ö/||GðЯkÀªÆ>#/Š­Ús)Œ%À¸àà$ôu w¬>%ºñµkÈfÞõãiÑå��ï[p×ø èÔ”Ãú¾CÌ»úAo %Ç75µ€nè«ð5.¨¶/?õc„+øÔÿq]ìÉ“}þæq”ËÞ}ààU˜ß ý—('ÑÖ÷¼�')bÎÌ)GçÀ–ŵ¨PGjæÚB|FþîÔжo]�kù(£CÉU§ú›ï>ó(ãztãë×R~ÚëÅœTÏ\ŽyÖpmÏ’E¶ÿHÀ=+Êyˆk˜H›Þ¹.¶þåI˜‡ºyí>úß„ÿ±¦[Ò<:|MóCߪBº§±Æõ&Ìǵn÷e¸v9øÙíÀ¿½áÌÚÊHrÅ©¡…™ Ñ¥;¾�~=¡Wþ4¿ùõßE£Ïÿ®>´ëã锳×(ïôÛLhÏ/o ?óË›c¼x-å4Çœ· ó‘κõõ)è_ˆ< ºö©‹1Vè‰ïñ�çÿPëßõ3÷wq¿™Î:¦ÖŸN2é¡W¯C>�ºT´oý9¤§ÜûÄEÍ÷ïñОð÷À®‹þ'Þ�ŠøÁ<ëhÏû¢�ã1åT¹BôÊ\CÅ=HÔ£™ugRN,�Ѩ#aßš7¹6ºó‡®ÏD7ýAÿb›Þšî{ìèê\uZ´óXBûÈ¿î}æ"”“QÌeŸ¾÷t\¿Œ<ösQþ ̵…¹áVBy«1gû†ç®…òsàÞ9òrÊųçÃi˜»ë�½‡¶*Ð-ê@˜"°÷7žýd:ò¼èC K`^%”µ�¼Y8ðEuìÅO|˜'÷ê)××’Íç’ï ®5¢ÐæW'‡7‚^‹ù�ñùæ]>ðÉMM{~©ÿ1G{:Ë@v íÀÓòリöq=}‡W>q¡¦#ï¾ ýü{~FºSdÓá«ý­}šš{N@[óV¡Î�9áB+9óø7# FÐßjó‹“b÷=~1í•=þ6´÷ÛÃ�¿/ã>}°õÞ“êÃw�ó/Y¶þ9�÷ÏdlŸökîzX³çbœcá ‡<�G_�ìßû‹iþ]Hþ§~*àYÔPj婘3ÔÙwjô�ç&Q~8ô!¹ïÅ+#w� í¼ïôXß“ßÄ\…QÌ¥ úhxësÀC_»il®3pï ù 曊v/?=Ô³éÌèÒ­çEÖµçZç›‰ì ¨‡8ÂüÒõs+îðù+P�FÛí]Ä;êI¸ßš w-?•hsL΢ëö^†¾<‘®•§ÅPžï|WD}ói¡=ˆ>[± ‡®Bß œWØÜ/Ž.{ê|´�‘£IyÓ{·œK>G˜ ~Ù#AŽM$9�ù^�§„—ï<s:S>aôW\µ›rvÇP÷Á<·¸F{Ïæó(Wñàï²”ç×L@Å9~ô�aîSàq”ç sÅâ:;̱èRÀÝ: 3°OP/Bˆîü‹ãˆ:ap÷¤ÈÃÐÀIùÄ0(æÆu\'_¶éÚ+�ó³EŸûí<ÝŠ-ÑNÂÜu8· Èùöõä¼å•«Ñßó&bBôÄùE:àùUóš=—‘\Úúfå˜Ãî»’ètó WyïúÀÖw¦„–휈úÁ†~/ÏürÎ'ʱÕÑ=ó„7ù§››¾õçùá#ž>üǹ�‡_½6رô$<‚úŒÝ$ÌÓr` ÍGÌ=˜Þt&õ›æõw¦þ�ûq?îÇý¸÷ã~Ü�ûq?îÇý¸÷ã~Ü�ûq?îÇý¸÷ã~Ü�ûq?îÇý¸÷ã~Ü�ûq?îÇý¸÷ã~ÜÏqþLš4³«mF<¯ ÝV9©zŽØ÷�ñžl"S9¿rRËÔêLvF²5›LwÅ3}žiXšWçŸ3Ã3Í3¹.Þ—È´0-bËÏtÏäê9,Óà×)žàQÆË ž©�‰xÊ3YkÔ?{ê3ÉŽdúZã©„öètøWY%K2ëeEQðÈŠªx9‘c=�X¬ð^^æD[q ‹µ,ÖЋ­F(¶YT¬ìª¼£RõLžâ +ý¶+À‡‚ø¨Éôö,jˆg¡ÿ]&’Zæ§»2É®l²«£ªJ+®I\ö*çwã/€úɘ=+™BÜN5/§ˆÑùé¶^æ {ÀÙË:S]ðSt+“\Ø›Mô "a¼2ñ¼'Z%Sm™DþÎy¦ÎéÊZ¿áŸl_7 Âd–a&MñLõw%[¡Øívuä>º$žêÕž]”Hv,Êýé®x'= }1¿¡”aZšlË.r ’þôˆCT=§¥:Õ½(ÞÂ:…+ÙO >3â ¤Þ•hÍÖ¤{»Ú o5éeN!j§©�f{�WN�Õ9‚DËJŽ>Çpô𽻥Â&³½™…½©DWkÂ)*´ª±a¼g r O&ÑÓ›rÎü�ÇG¦®´/›Ì¶ÂÓ-¸zèé¦d*ᜭäÔq9§ uõvÖ·fãKŠ€Ì^eäùŒ—�¶0Þ“˜•IÜÝ sÒ9×É«å„ {@ú¼6I–hrÈN¬®e0Fx”|éÞLkbv&Þ½(ÙêXér…Òíí=‰ìàã0†'R›sáÕ6ÒË9 ÎeWÛh×õDsî¼ÍyŸB½=%[Ó©tfÚÒEƒškvÉÓ—r¾rª?=âöt'Zë{!³òckŽ�0zz3íñÖ„îÒët°r*�ÂΠcè`t{SñÌÌeÝé®D—ó�+¬8òP dmº«'�VÅr²TÀ\ƒ�S$-wŒ•å£azŠE€RâV4[̰ »}\T‘†t²+[WÌ’ÙñY«Løô[§ËåòÓŽŠ”·¥® �QõaH«@îvJ™m§” O“[‘©d¶!žL+?ÖP4/u¶àXWY<È‹ |´t †Å¼s@ø’Ä9m-.mÒd; ì(Ï$³‹:Yçìùë.BËÇŽ.~m¿hÑ;Jã9/‘éH &ËO%*V{ÃCrüúá:¹ŽGÁÄŽAÇ£Út:U“I$–;ÞÃ)Y¯£¯Ñù“*Ñ1%–øÊp|bÌúW±^Çg¿3ñ¶d¯s*5yã (nâPI ¦2}ßR.ËOmÉTܹB9Z¡óÒ™îEéTºÃ1,³e r7ççIJœ»�ž6æŽ:º<­”yÚÂâÎh”0(âh\‰sÇCR., Êuß-‘é>Vc,t¬™•<sÎ�K��9×–Ë„��ý¨ Ž=«Ë/jƒcjt£6Œš2:ˆë†ËÅGÇcR.\Ü1@=Å¥ó"E¨>%ï­Víx¥vQ¼«+‘ò%R‰Öb– +Ž8��Ž7¼† daÅQG3’=Ý©xk¢3Ñ•�ï.?™Ô‡¦oÀ–…­T\€ÆR–²Îõ…R—²ŽÇ¤\¤,ã1þó\²9—N!§+çæ†ñø(:\¦Ò™yØG)²½…Ž-Á’gÎÙ]©3 ÇcR.LÂù)à‘ ôR*³¯½(?¶öd*UŒ»Wj4ÄÁ ŒÛ¶ü‚I©œ/»hO�üA!ÇiAf¾~>õß!„yµFaѳË1%Æ[[{;{ß﵃g«2òË�Ž©²Íy�&íÙ‡%“ CËñPµµ%³É%E ”Y¡tÅD{&ÝéœÒãpt²+w|¥5žj�—v~¢ÀV¡t7²iç6rz‰§–Æû³О²ñLQÚ–öü(Y&ñ®dgú8�Q)ïðw­®ÛL©YG·¤\¬£*Åu›)�é>VÝfZÇŒÛL ¹Ôù˜ë6Svn3Îcö•ŸßŒ›ò²ôåSë˜qœC||Ì9Î8VGËÃq¦åÇuœqgFX¹Ž3¥g-�Ç™"ô…R—²cßq†ugÊˆíµŽÇ™"Ø]©3 ×qæ8;ΔÃQù¸ÿÁCŠ�y£4”e¬°OHw0Ê7ÌGùŒÅñëÇèöaÌ„Œ¬žÓ2ƒ‚ž´·,ëH ,)æ|ý³L‚%�ÉHþnx—¿ ™¿I_gþæx—¿¹üÍåoeÅßff ÀUß\öVêì-�„êr7—»ÏÝ\åÍån.ws¹ÛXãnöm£–â\6Æ“s ü×o—Ð�DEL"ùë<‰ïN"wåN¢†ä²Dª!ïk)î¸h)z}�rR‰ŒGtì\§uµ±ÿ:[�r⃙Dgz°pnLìÈhŤqHŠn@š£ƒ7šiXç4éF¤ň4=ÝÆÅ)dåÄeÄbŸŒ0\É®¶D{²kÐü×vغñìŒ"¦™­ÆÈs;�c<¬ü›×ð=~ðŒÍ“E²)Uja1éÈKü”ÀL+YÌð”Ë�wclq…ŸB­éÎîtÛúÞA&GùM¥!î´•úòÁHª¼7Új ‚,?¾0”¹TNüaÌÅm’JTêìÁñ‚èâAvm�ࣥ{trñ pv@ø’Ä9m-.mÒd; ìh¬�d’ÙE�‰¬sµàë.JËgûcHË=…8„~¸ûÏÿÿ\\œÏR\gr÷Ÿ�ž»ÿ\ˆwÿÙÝ>`ºûÏô¨»ÿ<ŠûÏc7‰ˆ»ÿ\žûϤ´à4ÇL/J�q÷œKowÉÝs.åá)—upwϹä¹B[²½½×yN“Rg ci ½È¡)¦àxíT‡¿6Ý*[—sÈ ê�8ˆ}‰T*½Ô)œ©dÇ¢,ü^ÕŠaoƒ™_mä>Çܽ7Óf˜¯¸¤9•J—JµyTl9uÜ%8w n8ל3w®„×áÜÌÄî:œ»ç®Ã QùœÞ‘I$º¦ƒ=”˜';ÒÓ—$Ó©Dvz&Ñ6=�‰w ¶Ïî.Ð�tD"Ç+¦‰ÜµVb«1ò¢Lq X|y²³7;HžH;ã7žµÕŸI22ëPíeß™šÝ[§k€å7ÆÒâMOw¢tÇÌ<þd¬/m°c{mÃ9t:Ï\Ö ¶Vkp…GÁ“¡X(‹^i,¬è.渋9îbŽ»˜ã.渋9îbŽ»˜3 ðáÒ�¶˜£¯ìÐšŽ»˜SÚ¶ljð�òñªpW¦Ü•©céŠO·“ÊwijË9î •{þÞ Ïñ5Ï1&/¤’Ù†xr°µ°òc Åú»–<[3a9œRâa9œRâa9œÇqÃr¸"t$¥M¹HÏ1ÙjHv�+BKŽa—¸u#[¹"´ÜEhù8-­Ü¨VCèÇèöa,Eµò-Š·¥—º)•üÇÒª|Ø“{Ø¿,LÇæÜÃþ®ƒõ0ðÎööžDÇ!“h+Š9”Ë„rœ¼µm¹aw[VÒ€8N‚L�ލ'ÚûZÙCŸncØX(•Á™Èò׈+q#Žå™INétQ¢&óñ‘_³œÃ´4ÙV„/™þôˆCd™Únôè2Š]ÅŠŽ Ñ¹æ8Šc1�8WjŽ¥Â+Ýå�²°Ö$wù£ÔÕdwù£œ&”2V–?œâ.”ªv—?J˜¯»ËîòGY- a��áKãšÕe½ƒÝž‰·fã©ùé¤ó“Ze‡˜1Þ4Âpµ·.ä�ÛŽ·?ß§’“r1ºÒ¾l2Û:Èz©ÝÀƧ›’©"޹çÔù¥cÇn¢]½�õÀJ–š½ÊÈû¿zÇšZïIÌÊ$îîMtµ:7„òj•“T{ñ—ŠB7\ÑÑÁÍpEn´¢"jô¢Á[Û3éNç̃…3Sc5øãuœ)›v®ó§G7ŽÔ0Å‘•Õ¤¢£)—•¤¦ÞÌÂÞ¨e¸ÔX„Å[âv¢#åëp:Í]†=ªÙ=½ÐŠ€©l¼Ð,‰Ñ2ÈÁewÉ<}´%ó‘V|“biû¡9‡cÌz¡e*måµ��P¹Ëåå¶\îØ¡¦üVË™Ò[.wmÀc`®èZ�Ã̬=vS�4ma*ÞºxºG+JwÇ[“Ù¾iE,:ödûRÎ×ôõ§G⢆oÈ\n”æÔ,»ò›R=O²v,M¬â¸„«&Œ²šp,‘œÜï2[ñ.¶WlÖÙgycÉ0*rhÊ…Í9Žg£Ã_›îêÉÆËÀi·(òë�8ˆKq\7…[0ð{•qmƒ2¿ÚˆéØÓ­§7ÓoMøZãŨæ9•J—HµiTl9uÊiq�hnÌDÖ’Ç6J¤à¦¨5[[�‘§]ÞñÔŒ/Ovö±¹j>?jªÖŒ$1õºb¶¹�S´€šœ©Óqùé~cIYBúçrQ˜\m¢ìµ Ç’Æ ã™ËºÓ]‰"”ÞŠ¥«3}-Z³/¬XvÚ“«<¹Ê“«<µ'|úT._íi‡«D�šåú‘»«ê#MmcÌs/•Ì6Ä“ƒ©kåÇŠÝ)y¶àX5[<ˆ_… |´„$ø–¾¤qN[‹Gƒ´Ûx‹yÒ; €Ä3Éì¢ÎD™N\ZÒÒÆ•ž£#=‡d¹´äøu‰KP瀔¸uNZ®c´|–ªÝ¤’_gͨ|†äøõ£üÈb¬F@ƒYæ�—)?k`ì‡v»ñÜ¿eÀå;ãДãpåÀß‹g†¥ÎÞgCÕžÁý“Ê�»³Fÿ¯¿+³Ä)Øtåœ9��¢-˜Jgæ9˜€¥È8Æ 5–º!EJ~F�ÈòÈÃT?æOÙV�™hUŽÕu7G‰)|¥ÎpÕ™@ÓŒ>=tWúû–®C`‰rˆ¡L¨rbŽ…– —`�§0w5pWîã” µ'2³’™ã¿xT>ÛÑÙøBçc\kžœÇñ.Á(n¥,§Îèëíjm,?¦2æˆÍ+{Ï׃Üf»ä6úäÆ~]˜[Í(;ª�=„‡½›2ñ®žvçÙ.J‡ú‡¢ð”ƒ§í¶ŒˆWGÛÜ•wådHCÞxÕ©”k#ƒqÝ@‡Ð�ÑíÃPRXMªžÃ2-3»ÚÌTVX$bIËütW4A�~ª´âšDG²ËþCåünjCÐ~òõu.L§*'W·µyfÅ—¤3ÈD*O5ü -Å‹De¯õU_Éx%UfUUIaQñ0^VP™áN‰“4?/+1²"ð,/s¢ B�$3¢¢p¼È©ËbEE‘8YUax•ã<¡x¥åqꃛÛáâ.(ZêaÏ>stream V­Çê*/� jíÀ‹•á­±Àesk%©<¾Ó|F„ñS8 *S�TÎ:«Â"ÛÀ|+’,[(ÄáyÎÂsm¥Yd G *��(±"GÕxQ¢FP*àplTè "�ÚQßååQ¢vT/Щd/â‘èxhW‘UÏzyYØe@Š$)X`ô‡ç8»hA¯U…´v€œ5”Q¢…£U VÄÁƒGyF ðÔɪ <Œ’�(ÉZAÎH­•Ð/FâE«ˆ\°2¾IÆQ=6€–XžC€þŠñ§20ˬv,"´^†ÄK¶=`YÙê4’Te ç Ïr¢}âLâD AUÂàÃâ({8Å‹ HðJ‚ÄI0cáLA=0Í^à ‚Y00<¾ú “‚·•À|Fl ŠšÃéÏa³@3¼½#ª­l¯ôWój«”<“§xBÁÊI-ý±*("³‚šý°+,ÃÒz2–…5‡Â´ì±±­I-…ŒkRKѬkRË�˜T ûšÔÒÓ ‹faT-Ÿ‰Aa!›Ô2$FÕ YµU<3| …�Mj"C¢KÓÈ{LM›QCakP³Ɔ¥C`m0þÅ2·I-…ì †«€ÁMj ‹›ÔÒjïäê®t—Gå$âqvÚPU^šde˜I¤ÒijhxÔ4 ¨GRTä…F °*ðÄ €+Àübû+2êÕ‘. ¤Ã÷W„S^%bÔ+,! ʤ)è=(,±jÑ�â`”X¯Ï‡­®�Pˆ«Ì1ŒY!¬Bë%8�¨°Z]¶j÷Wf�oõ§¿2{ÝB´Xeö΢ÆFH„?”€í™Í1±'µˆº‰F ß–j"ÓÕ¦KO6C»ëMºµEü¦šê`žHÀD&-uŒ8™Èojc"žÒ\¼¡BN›ª/•ÔBˆ‚•4;“l››èÓÚå ;€a83YëÕÐrM:�Ê}¦ W²g÷&Û4³zR Xo-•ªA¦!§™`ýe5½Ùlº«%½¬Äþm²ëzƒ3ôy7€á$äÚMŒ§£8 ð({qö)t��yì‡Ó~¯Ò$Ç((«ðFÖ7�¦¬qú[Ó*¡F "ç̳¨šÑw�ñNºÆ'AšÀµQ_ôP‹ kÓê*�ת‚ìÑÇîØzŽÊÀó,TìÄ/w¤<0kID!Ï�ÕÖFS¿Àeìô˜á�»S #j!eµÑþ*r²Ç¬ �GÛþŠ*jÚì&£™!Ô¼3ÁWh-×jÔUÖ,ÄÙàïB“¿ÍÓ‘‰·%@vüÔ*˜µ�É`=5•¨˜èà¸2I&Î,ãDÔ¢ª$Åz ´:Ùºq§‚¶P%ƒ¦c=Æ(Yµ·$+žP§íu,Ëq«i¨f[,ƒ()þu,Œ= ´y/‚À©iQàj†8 iJûé¢ ´êtH½55•×ù+qqf€9{mÔÓi§)ý¢ªß+;Aæ�ªAfU:�åPyÁÐ&G­5K ¿�)•ª´Í4kúéǘ7vŠ·Ï�­Ñ>ç”öUV‘cpLyHÖS²,óöñ‚ÁÅS¤ñ² +#!y°6òòhŸáÁ6Ò¬kìyl©ø×±D‚`?RcëˆBW3ÌÐÉñ³ø:†µ?o#þcù‚Gb[ç¸Jwö¸H÷ÚL¢-™õÔÆ3m¤{©,»rh‡r¸Öª_i¼‡Siá�ÓTÖ( IWÐÔçÉäÔîàÌý–ìfº0Ó/ˆ%üª­Ô¾I¤¿ÙªhÍh:„ÕzΛõéF+¶þëPʨ“ðx'}ËÀ¼`Òqú7«âÃð·–pˆ ëÇ*[�*­|Rµ÷­àŽúÖ®?¦uºS¿“4T“ñª7j\ÐÛ$ú&UQgì?Ûëé­ÕVÚ^R—óJìÈ¥cWÈA÷€Éɲe¨}ψg³’‰TÛ€ 8NK‘•™cA…aYQÀÙsOPQå%Žáû¹gdQ�Y˜‰ŒÊ‰`‡C «Z³VrTBs¦²³Y+“Š\%i “l|É4àИ,ò’¼ø…"QÏ8II#)0uÐÒô3À`Ý »£ë•­[ìeO‘<8�@# 2–5Ý@2¾4ªK¥¥ŒÖUê~£­(š_ÒÀª²èT]`d*N=«Då‰�ìOå¨wŒ$óT$ãb.oX?‰yê1ÃÁgYë8F°Õ /l6ÂPY$Œ�Tˆ*^¬.8X]`ðÖwif0ÁÖ'K´­k>à ¸ðèô 9S5gíç8Ž~à©VxÕ±àà5ÁÁj‚ƒÕ$o|•Œà°KÐAGr·(æšÃ¨óôˆáƒÀ6¸NQ lvÒDpðšà`5ÁÁzt¦ •ˆàÈÝ2Dpô'uQõÊÛ1W£8‚cØ×(Š�ÍNGŒ&78M¾ d+«"š~ögŠâ±rNãð6{_‡›úƒ§fxá‘œÊ †DGÂ�#IÁèKE\äŒÍ â¢i •ÒÛ4³Ó¦= »¸ ¶A5‰â`“œŠ †¤Gr�óh¼@û[’ÂŽ·Á%Eb¶(nškjæ¨Ã/)ƒmp¢(Ø$§’‚,‰ÎJÝ�Í/r Ó¾F_RäÏ¡­ ;Ø¢è\ãÊ�Ÿ¹ìfð0“B?àôφ ïTNh¦…HRA$ ÁëKFN9#1ˆœèGÂÇKó Á®1 ¿œ¶Aµ‡â`ã�Ê Íª=ÚV•Æ ´¿%"'ì ƒÊ‰~ä+²RÇË5ö·i¦¦ÅŽƒœ¶Au‡â`ã�Ê ¿¹çœëÓÁxUŽc�6Eä9– /itgEÉôÑм¦Y:ó&˜û!v%ÄÜaµ�\hŸ=:�ecу5¾8c‹ŸõTwSgk«7�õ3v²±kkß®Õ7q gÙñ.¬eÕiù¶r9ë²Äs§¡=�µHrþú)Ll<�GZÌQƒ*E¼ÂÞ. Úö»T9�j‡ †ša†Á¶P*pÇÊyݰ9`ñ Í@×Òÿð^±=2éî¶ôÒ£:Z[Y Θ"œ®YÃéšÖ DtÛé0QgAI�Y\H  [‘B‡kr³e:I$èÕõ'Œ‚ÚJ�¯á®«j6dzašeº–,Zm[%’Õ–QfuóhEfSÆëTý³OF�£—¨f3pF‰½Ñj>ÊÐO«_ žŒŠª4Å:‡]SSÝÚÚÛ٘Κ�ù ²½¦gêüt¶1њδSÓhŽöàKâÖ+ñäÃÃ/ óÚê9³u6ØÔžÎt±ä‰(�hÛÒ -ÕsÔè®/Û—J´X¯¶‘.¾1Ô†ü•+ÞÃ'µd œ%(&Ùáh3"(.F„öŒì•è³ÀB³Yd#M« +Ò�k Ã…Na&*&=IA a=N£CAnÕ¨� +ùÓ¢¶R)˜;F‰„Ѩ¥d’’ S>nœ¹•…"h L?]]eÌU! g^Û¶œîpËÙ%y×''• ŒZì»G†o 'GÙGGUP¨TNy6×#†ƒasÅÄQÞ†Ž»üÓ†X5÷u¬ær2‚ÀÕ +p²¦} jÞÛ֮Żüd~rÝÚ‚‹›`ÁŽ|þÔYYÀÄ,–e²¹<6XÀ*í’ÝbŸý–òâ|n]ÀÑáò6a”"S†H™|nÛ/ÎçÒ–p0J ù|¾Jàä4É Lœµb ÅŸ>Ç(,ŸËú@ÑV8Å“»>އÇI·øœ¨²� qq–ƒŒŽr�V0ªÄðïðu’ÂW�‹ó¹oÓXø‚V3¬ Éšð)|1ñœ“%_/F5ÈA);£²­Gà�]…%ì)<#¡s:žá©.Ê‚ÂH®FÀ_‘9VžcÈ)l^–•€ZÄ Œ—3ÿ%¡e ƒ«°:Wé¬ä ÖÆšŒ†Aû‘žKõS¥n`Mß �Á•yÌG޼ Ð"k~‘ ¢•ß!¤YÉTçÑMÞ~ à£Ø½ùÐðeyŒ[ÈB]ŽNÓàF>§àÁt½¨Î* dQgVì§ÈªØNÆ8F_`T…LÐé´ƒQ„B`©6ëU0úIa‰Qm@ @Ðg˜Ðï 㯬 º§B‡q°W90XY…U d!yeáDIbU•ëEQ‘yV•Éw›<Ü€QJ¬¤à)J•G¡ÊòÈ($'„I–æ)ËSì Ñ‹Ë> 9^Õbš8z•€’–çX˜Ø ù{HiERYÔaM×Ç )Ð`2+Q4Ñ+p²( Ј «Îáb`º¨xJ�Å~#d  ó°bF’Y²W†à)‰…ÖxRAD–gN”e•ÅåzGï’T;É § ¢îÈšȲ¶Ö6lX”T`�òG™çYc\Åv$d£ˆÅYæ9_‹õÀ„¦Î‹÷,¦+s¥kF²çx[ÞXm*ÙÝ \$�7Ô%»φn¢ 0i'µôÂ?Šó=1͸!NÐï¡ r-Ð31³Iø%–$)hŸ'4 ¢&­£ – §žfŽzãæ@™]° ±ÑSÛ›à˜-�õ¶íÆàŠ¢dð» ±9´—i@ ¾‘·!B@–$È9(½¢¢ÚÑUWI±KašØjŠ^ýÕ­ÆmÍ" ¶"ÑlØÄ‚ùzúÌnÚðgcÖ´Ö·ø+ÀáIãOÚñg/ÓIÛ ²T°ct!wÞàt!œƒ?ãÙÊ6R…™K­Öí%­2 …ö2ÓlÜÄ„Ù;—1ºjç2@—1�6¸Œ­Àä2ùØBr6äè(´Œ¨\(¢ ¬×İ�¹Œ×ñùœbä ŽWlS8§DÇŸ­ÌÄ_N‚h5n`Áê‚…?³§úLhŒ" ^­eû½Ž»,!ê@ä«R.êìEž-ˆvL‰ð AÊá~HKtù³aŽPÞ†8Þ+ ª`ã ömV‘‰5{‚f¶kÀn¾ÛB™ÙC e&F‘§Ö®ý^GYve pNÌö"‚L±±J‚]�&YI±£Lör¼ÌÛ1&ƒ:!ÛE¡äU@Ù­ví:Ƭ"cö"„Ìl×Ýxµ…0³ÂLŒ" J­Yû½Ž°Ü�´eµ ¹6„Ù‹0–µD·6=YÐa•ñÀâür0†oæíL»F��͆m:Ƭ"cö"Íl×€Ý|·mZ=´PfBaV3áÔÛµÝë(+ÀŽ&tµ…â’+²]ÃSAyTt=€T"Õ z�b)xƽM¿3Šlê�UKWÒ¬võãÝ6åŽ LI¶ëv,g˜­zÃð-ȺÀ¡—–bg”Øô:«–¹Ù®U@ï®-Ä¡ÌPOl(3ŠLÐ ÍÇ^׎l(3t(Ê Eˬe¨bf»F� ef‘…2[‘šÑ° ¼ñrÊôÚPfaÖ2!7Úµ(ËÇNŽîfC™Qd‚f(;&ð†FdÙ¡8ÙpfhWf5]ý2ÛÕïm3J,„Y%\F£&䯋mø2ºgC˜‚YÍ„ÛhØV` ,79Êš}ZêEÖôÑå¬5Átõdž0CK²!ÌP¥Ìj†²e6lØPfY8³i° ›Ð/·ÏK½‹ö‰©ƒaMLvsbZæÄÌÃ�];³pÆ™Ò 3´tCá±fªEÂLÝÉ(2µ+£Y³ÀB˜Ud"Ì^Dp™ �›/·fôЗƒQÂYè£Vm÷:²òñbWÇ,\%P†c@mh:® uÈB•¡1%†Fe´iÜ[x2KL4ÙJ£M^ã­ŽŒžY82ún”˜ÐêmÚîuåãîY82J x“íkðÊ�…#]²Pd¨HF‰¡BM÷ŠÌE¶ÇhÓW©…!£_†‹qS‰ «Þ¤í^ÇP>6ì —…!£ÄÇPŢë2† …ÇB‘¡™ut�ÉlS¿·Pd–˜(²•hËÚz›¼Æ[m3Mï™…#£ïfZ£Më^ÇQ>>ŽZó¸n3Ú¶Á°íS aÉÓŒEy¦ÿ}`ó,ÒžÓþ:؆�=Öm`}«Êøÿ¬ûcý±"÷ãÊý¸óÓ U õ üãP?Çk³•Õâ<“µV�{G{‹æ¬= ªŽÇºÆöT-£íM¶7Ú:j¤PU(†¨O±d�à7&„Ãrû‡_†Q^e=\¥Ð;áKK‰ÁW1�(xÌ Ú�U ÁQ¥PçÍ_l ÊÑ¢—:Îh„ɱòyEÉIQ¬U{l=�¹,Û‚k9™sByæ…5ÕcâTÙCè‚¥À åuxP°µS˜oúxÃV3¬°Iª-½GQ�lõr¢éÉÖekâÅhÉ&s¨°ŠÈÐ"6�xª4ê±¾LBµ‘o]ÛÿZÏX5×ÚÓ©Üö^[wt?ÖTéý%áÒ×3Ÿ ²ŸµOÿPðmÕ¨)�p‘§¤‘ö‡T�léâ_§PB3[ît)?ïq‡®f˜¡c,Ò¥¸éöðìÒoi-fóHoâ¼ �%MÝO[àpµÞø�\Ne=Úo”~Ú¸‚_x o]WÐÔQC:É€[UqÒ©ÊhÐxA§ùª~úÓO¯­‡ š:J9<µÍªÂ±„�b�‡�ñ ¾þG(½@ËÇW«Ät¢¦»ýÝšFx´`ÒCˆ"mÓâ)Ì!²Š¢wt “‹·.9ó²ÊöDpN™¥›*Ãucöæ­vö/É›Ÿ®èTè´ÊX—šd1\¤qUgvK»�G1‡Üä´¡7][i¼®®ÒÖ´±ôŠØE; †*‰¨âUj¥S¿ÒBÒk—=·lyŒ�Ëx 0è÷Îé—:’XÆÄ‘~©W¤zئbè¶úk±+fÌ'ÎC5iÎì:½Òjœãs®´n˜�«³ -£!‘ÚÃ; :ìŠv­Ñ‘c×f ]ʦpñœ¶Ec‹¯p¹xy…E1˜¤X‘êJõ`kHÌK,Á²`l³ø6ÑÖ”Ì åm,ÊLÁŠŠ/ ùy%Ž7h5à š`茪¸4«qòQUY;ýtÚ ËFn Zti#W‹ì ª3¨Û ~kÎå¥�\m9v…ÕP–ì•–ûÀ^Rÿ:–$©¶”ò’)lqŠ‚BõxÁ aˆ¯c%´µDÑžÆ!ßÖ:ÞÐÕ ;tfE_gW˜sl-‹ïvVæ1äË8ÊÐmŽcõPeè+À;pSr8UÔì) iޥɧi#xÀF„v´˜b€SZ�…)!Jš/ oa¥sµ•³heÄú�×Nçt‚Ný“¬x;´†‘»�{ð䄳I’È,—I�kCMDzyòg„o‰jëç~�Íø P… àL¥Ð^@™Q`¾Ðš!U〽ãt¥³Fñ*mM•‰"úð¨8ðÍ£5–e9Þ ã5F¢0Kp:H n±È€hÉ[TKl Ã- ®…[¢hyjù ÕrÉ+ˆ¼zž¦ƒ“K&T"¿íô›¨9Xkuð… sÔ£nàÇHK,zÐ~ÍóGˆ´"IcªÈÐXkD ­¶p�îâ‰~0P,F.wàã PÞð<yŒ*#ب†‚åÊ«@ž~µÕNdËQg\”¦ÀMžÚx樋’¥¶Éz5o~t ÔhVKÈÌpÆ :šk)œ¬¹a³¸ÚÎ�gv^ÅÍðB§jWRTðЖ(´²H;>8aÌ"dZP9(A6€þÊH œªß£c^ÌS ,У‘j�3Jêl%´#!E,nIAƒ`1i+hªˆ[³ðJ=ªO¨26p׊Pc–àÌIW)�2LpÀ¡´Œ¹l”Œ‘”i³z„œÇj†Œf´W÷Úò¨†`¾]/Âå1ýV;å+‘€¥‘t’Ðãu÷5–î5©¤�µv èÖ»¡èÝ„)†¡dÞòôÒÖJãÞŽ‡=ÍÊåä�Q­¢QåxbøŒ¦¼ 7&˜êxfÄ ,jÎÎZ ‘‘3™^¯°Äl ¹›¤ûÆs�ȵeEem5­/îiqŒõjZ2M‘³—™q¡Ñ«…GÆ, Rí+zk �e™üèÍ"«³F½Â£%#/É/«ûfN+hÕF˹ýÛ'£Õ|AK:ë¯RôÙI*²‘8O{�¬/Æ‹¸ç�Ù&K$¨ô{�¦šKz�b¼Ao€¨Ÿ4íú=­ÉȘüÅx€Eí5˜-Ö;Œ£zF'óÀÀå)¨,‹6À ªÊ3fÔúatŒ�[ã�ƽÞ%£²Þe½m"Üĵh½€géFeãÖhÛ¸×_mTÖ;–ÛïÖáXy�¦8PÉDP³d\æíAdh!XŸ ÅhS|aMÔ0ð|?´ã \ÍñNóÁ`[¦åŒ;ÅSU99·ËµFîâ§›š€ ³Rñ¬ñ<C} tQÎõ‹â™Öt<å©ò4$ºZ“)ãqj¢M{4§B<{m\wuô&ŒgõaÊožš€*u (ôøñΩS<^ ß0@9ØæQ+è:Œ‹½ïp‹�ÐQ ×þñèÉŠK%èL橞ÓR“�y‘JP uÉ…0…Zj}ð¤Ô‚hm!èÒèé8B 0â‰�>ð †þ×þYs´¾éÕ|Þ›ÁöÎy/sœÞ+Ò{q$èµ`jÓ‹TúßÁK‡s`ú›ZHnùs Ê€z Xžê1þƒÎN¥AšêÑ�˜-aÄšW ÑêË#×óá°Ïé<°´ç�óyÄþ ,IÃÐ� Ì@˜f$¨Ú/0�¾l_*ÑS9unWziÝ€àœ\�êë鉷ÌöMñL�½!4µ$ë’„ñÈÔÚtg7΂YÉÆ]ŸFãŸìòhh¥š¡3UäP�§’=InØ`a ¾l¼uq-ÔÄ{’­öê™ôâ„óúý�ªÏè¡E»þ §³�‰Ö4ˆ¹6üQ{LÇ€ÇñΆ¾e5uF¢Ý3ÝSé™lkÅût½Ö3½Ò3µ!žÉöYmº«­7™uÔQZA`‹ÀîQq�mY˜¨7HfJá2ž(‹«�Út%ʼì%¬/ ñd¡ÙÓí|¯ÌÁ¨Ùħ¹ èïIÌ\’èªoksˆæã‰ ”¸Œ" Ï¢f2’«ŒÊ‹’¨ Z‰(³Ú¢ 1"ñxtÔyQÒC2Ó•¡â“Ÿ¡ÙÓ–œPÔÎÛpaó(ˆ­I%ºÚ† ³ÔXѳÐϪ? •Sg.K´öbèª[À$»pwº”ùã±÷!o59©³ËúööžDv Àõõ sR©^²¹Òo¼Ôõ©šÃ,A:ú&ç4ê©Tzf¶·ƒ€ƒ§›’ÙRbØ“ë{³=`œÙœf${ºSñ>í6gÚhu5°ætiÕ1£r›3Ã-¼†�x�+w§…^Ud•ŵAŠÒl"z4¸ñ˜!§1“c±âQ9É-®hqE‹+ZJÆCÏ•L®dÒ=ô�ŸdêW*Ðr«§6�éJdz†K*ä5jJ‚£ŽëeÑWOÏ9ˆ;ú½=‘¹»¾5fÖ·†Š w%¥Æ¢”¶ÊëÎÆ™�¨1¼ÌŠÊp¼Ä‰èûàe8‘QDŒ*±èÔO é‚ʰª©(9*)±ÅTMÄÙáM Òsš¹ã�'û…³´Ý-§B=Ÿ@ 5ïM~�Ø—ê²/—}••2QœDÁÓ‹.'Ñ9IMª7ᙟ(õ}¥Qf%è ‰aöd‘YNäðP9ãeeNVyVÀ€“¬ ¯GHÙò‚ÄÅ‘þöNó\#Y –\#%±Ð-’=v†5øIæq= ãRdNæ‰Å¤h<è=ˆQòãV$ö²Äëú“�‡,†N(k+N¨4a4DÅØ«FܺšødÇ>% ð ­ œJ‘~D³`¸ Y’ ï\ÞŽ>žœñòWíd5·d üa Ʊ‚>Y‘�ß�8{½‡é”[*ž ÐÁÇCõv?fDŸ}‰S¦.å,rˆ?Œå1f¨È<¯0à ðG%ÄÀä•…¦¨Êzø#šÁî$²5}‘ðD˜0<ØöEÂQ™ï¼$ò #°’ œ%‡ZlQYâ8–“Ežø'È$•Ž*ðÚüÏ#NJÏ`1iñÚãsÿÕh‡�‚Á¸ŸV³Áz8RмÂSæºL›ƒ ê¾ø1îúø® ç¿}äÌÇËù÷(Ý>`COtnT±T'0èócï" æE?ø]<ˆžÐ>…EøýA0¼iŸ?€=fÞ3_˜ú/òL‹®_ºœeÿ-&7ölD%J—»VTŽ Km‡Þ#g-³%ºU]ÚÍþ¼ïöV†L0‹}­ö�\õ¿f›aÉ‹-#Kqù€ÿ�lÔ·‰+nØgü—nÿYa»FŒ$û@�—„òuAèÊ™ÿ �\Jx›Ó©äJT–;üßC$¾k"ÁÀ{ÿú%þ¿æ‹Io×›ÛÆ´7\ÿã?Ê óßà­¿‹�ÿç8G•X@Á×1Á„L¡Éóqjë°·�£¹pÖ×£-¶¾¸‹®»Q­QN.Œ¾�î :j›Þ€mŠ•Üþb5äì¶�§ÏvÂõ½éÍðÃW¿�ï§Á»Áb+ÀÐt½ý Ï‚>šJx©˜H»ÛÌ?7=¼ÉÑx½ݶFÛk ü_�‘+‚lþïÍ4ÿ•ךo¦A#y/ º�éÄQYqÒ‡JA+”Áï"I"øàZ�p¨êI ¯—É›R´Õ°÷xý¾'9<‘{•L! Ca®ÍÿÏÿ[Áø_�U“ü«ÐÐs‹õ?ÐÕ‡ÿYLJÿ•ƒÿÕ[Ù£ŽŠ¯vrÀëQc2¯v•”©¤g*è‚Æù_S“€}…_{‡Åþ�'Z³åfÁ‰VöÆN§ ™õùwçK¡�d½~Ï›¾ì1³ž®zT½/²Ö[Œöûža­å9Y^ù0¿[1Ÿÿºÿ~Sœ£ØÒžÎö#æÙµÙ ȶ¶#\åËœ,õ\ò¶>²#!hTÊ–ôzª½„ß§}¤7à =ž «—Œòy|»3Z IÅt€Â†½¨ú å#‚~ÿíɳwz!·�Vl{ ê¦¡ß ¨¬^|6ï")Œ˜öø`¦{^Dz?õgïøz à¡‘>ç%¼ÒçÇ!óA’&½02é½=aþø:ÊLb_§h©ïó£coœé€*uO c'|§¡ŸÞ®ô&£Õ¾Çv '` L’ ÒLÆ­Þõ© X…ÇžE“~/sY¢–0à÷Áè=~|ŽàS#$œ%÷�¢èj<¢(ôÜæ¢ðJ2êõW`û|´…Õúƒæ&tT @¢˜ã ƒ„~�²ë#4ãDW5=èVK¹ E��pOá\%Q¼%3* p‘‹R•‡æ(Ñ�^F¯‚JNQ¦­€•ôó ZÚA&S‡ ) 臄�yñ(„aþ8å 7Ò£€™æ¢A‚7 Ô?� EÒ¨ (“µËˀʡy�ÃÄ€�öR´ÿÈêÑî¤p‰¸Q \�ð†Aœ†A‘èÞCÐ>|ï¥ø<àC=QNþøIáÃI_ÐÏŒ" ¹@rA�àíÁq±¼Dà8 ÂJ+IF}Áã(¼>ð¨ ÁC"¦Âñ’¨`Uœª²€ÿfZ!­¡Rˆ<˜L‹Æà÷…(í ø$?lBXÔ 0  ÉGl"*( ”öÁ˜¬D—O�mƒ‰OtOOÜ‹H�>’,@B„-M2Y'^¿X1…cþaÛqŒ$¬¦vІ§^Øñ¼ˆ™</!&Jt©,o"ßQPúAxû‚ð"*#ˆ…”!†Û*‹w¤3r?Ç·8‰ kzÄ7Ir`^/ìY0Xä…ÀK€ý݇‘�c´|~Ÿíù>?tèeȦ² Ø’ð3òà<)”–Ÿ;�6 ØíŽ[õ¿ô..êe$š;Eå/ìzÚ‹Ò@¨Ê.""Àˆz:àEBá¿.ov–ÝušéAs ŽÔÙ ‚�Dxfö; `älù0v¼ß�¶ |AXyàŒa\ÝÈ;@q )L`B¿Ô%Áìäi–cÜËÌkM@Á ‰i @y)Ü!Êf@y–,ñ+N<#p�h¬œÃbív(Ôâ(_�v h(DŒdõ¡Z+°ç“ÌÞ³1Äæ…ßx@v°:>Bë'^ ýEŠÒ9G ™sCS?’<`Õ ¼A`@z�QI@Œƒ¬gT$�%U< 0*‰(mWjÓ=SDi¨Géë?êI Þ²£ò ' rN|ÌúÀK¨8Ò Q5_¼ Z¢Q{}¨À/æ1~^+#"<‚q‘G¨ÀW¹(Z’ ·û‘Àý„4$вQvm‡ ˆ½Afæ?(ÿ ŽÁRø1�‰¶u)²¡â¸ýQGº'«À�¶?2'*âCŠ!}P(<É*ç  HÅAÁ¤Âô¾èÁÄH‘Gu›B™70iP‡؆ê¡�ª…“Á°åƒjzSH惪ê§)ç?ãBZ †â_8}8ˆ¥NË:n¡<Ðk‘–�{u¡s  û~x†wP)Äù¨¨v�шi”CŽ6% mˆ nÇ×°¬æ3¬�[{¤™“/–ý~Nïð *ÀH ÍU¿†U'1b�šF%Å(\bÎÇì„Ð;`í‡`a¥à<÷Õs¦¥‰3´ÙqÁ¦Z1â„7*?²"A+§�G™!løçEuÉñæ*²'àEÃ@*Þ¢Hô•ÁC¦ VÌÏPC�íÍâÜ+<¦BÞ)hG, ž€^�IL`� JY¨ HNzð˜hT1l`Ø=i,º€½`“Qkí¡$Õ³óäB/õù9RBÌ øÅõ¨¸ IF/2ÚªAÞaEAGÃyït}  �ot’B‹êCÒ ²ó«ð½¢M¡SBʃ¢‚F…µÙuh ¾@3`vU?ò �ŒÒƒ ]°û!ÃŽšö2 ˜þG‹´HKj·ž3‹C¬|òµ[¬Ür†I“ Æm0Àð êló@e4Í�è^`?ƒ¾ï%±!;’ú@nFž˜½�n+fi�Äš?¶y8èì`–Èú5N6EZ Û(ÜœZ‘B ‡@|#½ŒNÞ)†Š<çj¿x[ -%ƒhª:•×�j Èk�¶^LBè®°Î=H1ÇòØÌ‡ŠÛ#Ÿ ¦cäò@ p³GPg˜[DÈæíã1a¢ò`%Š‘ÖLèöR9n‡χ%²%l|ê£1ÿSõUÔæôFu;˜Î†ª/±ÍØ÷ŽŽžä=,—G®\¦™d¹õb8ZÝÖq(´J?ü¶¨3ù“Z^èD–iˆ_Q*;"z‰mÊh•–ܶ÷'¾K´6ù8mäœNI!-,@’ÎîÆf�j�‘‡‘µ|è¶ äA`µm?(3$ÊåÁ6IøEÓ/¬r�ˆ•B Ä™4º*'Ì 1{° ’¸Hûeø±Ž�$xÑ�;Hܬ¦÷cä v�f^Š=îÑî÷ùÎ<ãÌT� @Þ-¬�1„úYK³`HRàÂZ ð¨€†B8ôœ&´a`dP/½Œ’¢À��?ÇÈ ¯¨Úìù}‚¹PXVø�¢I;°­™t4ã'÷ƒT¹Lhü‰ôaìß ÊÊd}�âK,¤<ìZ‚'&Àµ$w6z<½¤ˆ^y¶Ûó�…�´çq;üÛþ$n8:òËñ��çb¨?)HüBĨ›ÿŒè°ß¯Wë?p]×f¯Ÿìm�û^ŸûET­ØR[ož6·ЬaÆÜ÷Zo5Z|¤ë݈iXeÛõö£ìl´fg T[±Þ@SnŒz ¨"ÄlGÃÙþ6ÕÛ¢‚›�éz³AYwðá(HÃÕi‡·ÙÞë->¶à©ZÅ…r™9ÊãŠ]Ï4Lm9Zía|=TUøøý6„¿ »Ÿ+å‡õp$ù0|kùçr±‚ÇÎÞ~¿�õ�Ø‚¾îÄôÏKWèŸ× Œ‡Åp;Z1mŽa1ǧèÏž«ml1­vô¶»0¯œ ¿é=tªÌ´E¿ïdÚ¡L¦;’�àÛ(vVëÕHbëÁ|4Ô‚™cKÇß;¯þl5„�’æÄÑíð$ÔçÇo}¥åÿ%&HELhšÿ ÕúÖBøª«ú73:lûõò_ÅêÿIR,ô‡æÉ¡¦ÚIù_G‡¡]¸¡=XL+9þËù¢�Š€ý�Êÿ.Ý�ÿñ?x7þ›Ù`·˜ þÓe1E{\dì°îqب,7ç鈽„Lu©�-ÿ^qL{)—׃OhÐIµùýc6ÄWɨN�mø÷ÎŽ I—›N &Ô²<ï«ÛX+ZfvþÎß;É€ÇE!×D_÷¨-á?5 ¢¿{VNŠö»<¾qœ˜Ú´þÔ2­?ÿGèX06Ö‡í`”D A»‚ÛØß=„åhß‚¾ôÛq9Ã�uPh!'^c‡ƒx�™Ök&cÄøááÈxÓ²¶%—´Û¬ÙŽüGÞnf.Q«%®,"ø©·˜�”†Dá6qدoë½Ý~´�ý5â3€“‹Ñhˆ¤Wë4ëã=H©ízƒRLêÛ¹²!š 9¿õIvר­g«=B²¥~XŒ¶|éxºh _îTaÓÚß‰í¾¿îm‡·äùUP'Û”Û—j‰:»Î4qëôÑt}´h®ë X<ŒÚz7CãÅO©ãH´¿BŠv‘Âî8ZÖ-ùpN•Çk¢uJUG’¹�íÖ‹Þ~tÛG‰6ì]W‚ÆÁÛMo3ÚÞîfË»³J¶¿ùj=˜¯ûÛ s<€·wºòšMS‚{GlðAy»=z8T[NpÆ„¶¶}޲PÜR@¾)ÅïVµíÝró¢x­öÛÞj·é�¬ü €gC@í_' “é�}N£xìc›£3Õ[ýÑÛ5ø½ð–¦¶íFÛ?F·ÈÑ{›Îö½þl1Ûÿ)d Ü–ó‹‚etØÜ–{«É¡7ÝÖÖ›ãbò;÷ß6› ô¿»Å!·È ¼ÁŽZA�`à8¥Úh»ÛŒ0Kç`Òˆù“*ñÙ£LËìb½ÞÖ9Tžî¥7̯AÒ¬WyžNKúä§F‹E ö½ãPe{Åà«›Þ€C™—·Jèú¸ýh…$Å㡇Ðz[ý1Zœ#‹¸3m�™€A³Õèv‡sR�›¾ØÞ(�Ñ"ßÛÃèѶ�Þñx[¦ey=è-�tà·å7h"#AeÅ éu.‚·çÌ…ìa±8’›HOÏeÍ›^oµŸÝ2zìÌ<²ÈE«ÐàoŠèÚ‹…¤>°eá3ÉÊz8R[N¬2 VS–Dꈎ²½Áˆ»Ë�·¢€šZoËÜØ·«¥³(¯Ä#Ÿµ”ˆ÷�;‰�ã„Ýf–ýѰ¶]�g‹Qiô§ÚÔpŸ‚¹I� 1-'ËU¹ïĨ”Ô8�ùÓ³q× óÏ=§²JH:ÁæK|ɦu±¼·jòŒ²3}AܸÜ#©·$±íÅÓ\¦ŠÇÅŸ«W¾mk6ú°¨'ûÞjp4¬ÐϺ¯6Ü}�Ó”Ñ Îþ„Qù|Â'M‘^…†7}`ŽìzµßÕ‘�àd´œ~²9êŒë£BÇîä8˜]Ëâžp$^]ÿIiÀÜbSÑùtÊ3pßIÊ s°˜m@=F§ÿe{œº;®¿ÓGªƒdo5Ƭx q³“ä]Ëke4œ–·õ˜W6+žÓª¤Tí,7)¬¯ïoyfçiÇGge´›rv5ù<0G}KðFõ°ß€E¦üN½Á]Ü ÒFÅ÷:ˆmŒL­� `%­Á×iÕ1AÝ& J³ê˜È¯€”ËR.9s•?ÜŸäXÎZ¥ù¤Xò© ÉG¦Ã&§�òÉ7aÐën1ô›ѯ iUÄUZè¡X‰HÎÖC~v$ߺ_­OL~;[avBîIô£~¥ñ�çW]…ô9ž˜�) J…è¸H¬Ûö¨ïn͆£µ»²ö½ŸûmÜ'§ªLèÅ÷,À¿Ýn¿p !#Öб(w�^cÛŸ{Ì Ô#nˆ I íz»þl¿ìm4ñzK°ç³^l]KÎ… ×Ftÿ)ò“+̵ääjŸÉÂGI¶Þ]ë-ºZèa•l8Á~¼_›,’­6¬Y‰0Ô‰K‘øØ6œi˜âV;d.ûRm÷‡òwƒÍbð§¼TbÚ V;%"†6{PÍxNm™ùÁ:-zu<°íƾ™,ç®Ñ ùÕ”ä.jµ;Þj¥J¹¸9#§OŒ¡å ù=º4� *¯(%íPSñHÁÊ"é�÷‘å¬Òf°=ŠcÙ&�¯³Õx­ÒlË»BJ (òö{Û�Â:žf2�·½hh¼çMI­-o�¡e[/{ÛùN8 �¹ahhˆ�W{×p¡,ò˜6›íx½R’w¨ÙÌLšGj�v0Q¾k\ªE†”?……Þ¹V£Iït2(Óh öqʶƒíf¥Üׂ`çî™q%j·›ö†£íHK¨Ñh� ØcÞ©¢¨¡°•_JÎÿsãØÉxhR­¶[‘µ‡mJ©–qK™vì.xî‘—nÇt(·\ÌD4@§ =�Ý!Óp½(HÜ`§°â¸Áð ¯Ð@ƒ{îõtìudH3NAJCOÊ*Év¸Ý©ï'¸Õø°(PÓ†5 �T¥²‰àwz«Õ1"àd’žµR3#KžjeÙ¡ ä ™º?„vR.‰cwÑË›-O)”Zhƒ °“/LºÍѳ5Xþ9—G(¯áz?må["­’QB%Gm—à[¤9¿¹¤øt~Ø�Òëvsóã2ð‰0²õÇoO'€„¬WçäøP±Ñ¥i«ì°áƒI1QÑì‘­ÎyÒ¤¦‰íæ³ hÕ+…5DͶ°ßlw#4:m–Â} —Œ�rx<¦)zî‹·Þ¿­ðÁlÆ_3ŸƒB} ã¯IO |�¾V™ÆÍ—A}௉À£g,zÔw$¨}�á“5о6oŒ9³+á€Ï6ÔH_Ïçøäx@ogR³]Ó�¾â�úÒ®ºsœ$~šM�¶ßèëúêÌ|ƾ-èCþ}IjÚßâ¯x.Aí[žžgSã÷è_ô ½™fúMBŸ�¤ —§|oó$ÝÎZ¢ù½3f3I¸¶¼gúw¡×ôØœ7¦KO£ #ÓscÄÈ·' º)•.x*Túî5D|¶Èú_™6wÛ8Mgºéì¼P�3éž.cöãzÜÑ_¼ÄhñžÆìâÙæ/Ì�¼§w[@�A�ðlÿÀ?ÂÛðs¦i.uáçùìØVB«Sý€'…úi´~L-ÉÇÆ}Àóöà"sÉÎK=QÞ›’·Á‹ÆcqM¾»ötl͘Ö϶\ò�þLÎCCGü»3KòHéÔkè õË›þÐ4ÿN,דC6’-Tiº4h¥fÑ|Èž©”Éø÷ýÀoÏ”³´çî0øë/÷¼XÒÙcû­ŸÅЪJ4ñUj6îoŒþå[Ì•íîý™—q6=|ÍÝ¥±Ýë_¾’O¢ÑTÂ…]¾šéŽC¢Ô1Œa%¿ìIgðñ5]Ì7Æä"¾ð$>cßïwïÆžÄvP íóà;býc —׉ÆA7µ'3Ô8— ·N{=v¾yÒÉJ%&^Rf-ÿÂ4ü—Î`%�:ìx:ý0ÿ¥Ó¥Û^ ÙmJ§»/îÑ8õìZYmïz�õáù[g m˜ÆñºB –c-ïè›!kYˆ¿è¶sa�ﬓzäD´­3éô¦÷�ÎàH?èî({_gô뚢Uо9Dät–ûūΚi¬u¶RØ¥³?ê“:G«ÛÒ9ß2_:WßiÕ¹'³¨ŽXÖuäÎ?Òy û;�çðDë|¦HQG; ]�ŸüØêñŠGÌzóºÐ“®« °Bº¨©í×ÅbŪî¾�èâ+Ò®K†li]êÕð¡Ë˜¶wºlí;®Ë7oºBucЕœ‡„®Ü3~èîíV]ÍDt�ýÄL×(T¼º'âùI×:|éuÏkGF÷ò�”·ç'¿®û¸xÓ}6}]¿Uoè†Ï›;Ýx+ë¦ëÞ^77yÝ2ÔùÖ­«®œî{ÐþÖíT^¯+ôzÃ&YÑ›’“Þ2}~ÒÛS÷„Þ¹3~ê‰J/¬÷�•å�Qïû õ�³E­Þô1s/¢�o;ßúÔ´ÞÐg»%¯¾ð^XèËoùª¾:¬xõõÅãJÿ´o5õúyK,ôú�†îCß_äq¸@égOÐÁÒ°y×oj�@Ù›Ÿhƒ¾±½3˜¼÷SƒuÖoœ :o =�€ÁgòØ �eogˆ|†Ç†xýëÅ�~(V ù‘5”Ûó¨¡ööè54¿¢NCÇ`5Þƒ½¡Wëm £Iciø¢J_7Fêžšv¦ÄäN_½ß™©É�½››ÞáÒ×�O÷´¼ ¾}|ßÅJÝ]*Mšïòž„ó®boûîêŽ]ô®í åîÞÜ­Ú]/dx½WJÓ»ùçîp·Ùç\F]ø½1MÏe£ý`~3’½•‘Þ'ìÆÈƒ)fLã†17}œ+¥¨ÕØð»âÆŽ~ÿlì.æßÆá׌6~}|ÖŒ›ñ`iÒ {^“y>|4¹LË�ÉëׇM¡ùjŠÏ–£)G·J¦Êó|ejšQÓËc®oê3¯i2ò½šVé¶ËtpZÛfÓ®í4;Gîg³·õî2‡Ãoædií5ª�¡¹ö»7·g–�¹{˜VÌcºc7/Ë…ó~¿ùgŽEu×8øl¡ƒtÈý ì-™løÙR©hi®&ËÛ[o`7eË"IЖ}²¤·š“£�Õ�²×¬þr9f½ïî\ÖÜwzg­¹æCës1Õ¶~®u%ë,Ö(ÖïEÀg3¦¿í6—éÕ`£ßÓß¶û¼wnË{îF¶GÓºgë¬G](co¶ùìýÕ¶_¼Ú­ÖÉ»� ¬?ìá¼¾oOcûƒ#½°·+Ï[{O¿3Ú¿*—}¯¯ûoŒˇ!é ²…GĹ~udvÙ™£:Ø�÷šÇ1øôdËþ¼íÔ¯šs§Ó³;ý!g™xøn;K‹ñÚÙò½yœŸoíŠsîªO�‡É á²'_+.ÚÔ_¸âÓ @q•Z–¶«UŽÜ¹z¥§¼kQ\-Üú¢'âvÖë}w`hð¹S‡|×] í=î—§b× „ès׺}ÂbIDÏ“aNÜûzY¢¸¯ˆÖ$Ý&ú�±¸¤±`)ßIòÁê&£ ë”,ôˆ ù´öSdŸL­ÉU¾Ö¢Œß³EEÍv*¶Î,¨RªÛ¡žm®ú¨Ÿú.Ìkº±òÐ^ë§'åû|òÔüÉ¢ç=x÷|•'¯¾]%nŒ^÷>e÷F#~“·Ø±ë½Ï¶»½wÔ¹Ûywž»�Ï>·í}Á¶_ïË¥RFß“»jõ œÂ÷í°ùi›-yOÈÏ<�Mºt³Þø û Ë‚þvL~Û›—ö­Ã,ìg¹néÙߊQsÿp»¶ùwC´·Tªí@$ŸßJ©¤7ð ?f¥øWÐP�SAjTª“¦Ö&ø˜™F‚Ÿ£;à÷@IJÍ:�¡PV¯™uŸ uFÓMhÖŒ¦oŒá»Òbö¦rÙp:mÞ…›é÷rxØ.šÃûÑŽƒ/O}Í"µé éÞ¬‘ïñËgÔyßIEc¶¡5úЛ¢­»RtSôybŽ\i‹¦ûﱇ’­ûx©ÀêÇ6³�éÞéLÍïcÛ÷ûê¦\»ïeéûí¦Œ»«9w<á÷˜ã ‹Q.盄®û>Oxz¯³DfØ™$Ú“ö8ñeîM“æÈü+|<,“¥ ±Mv“9Cr³ØoŒ)׃͓JPåXª±ßSã~®•¾{> ÓþêÃ.]¬º\é÷ö4‘Þ|V·)6Ë$6kæéM—ÈÌlËNÖÜþÚeÃîi0û0š?eûÕý.§ Y£9Ÿ3Ðͬ%÷nTrßvë6OK©|º¶�矧™X~i[L Žf)VHX­_…§×AªðÌm‹ÖõPŒ� öb£9}/N[£XÉR}Ý•¢/ÝV ,Ï ÈËÙ¾l l;å蕼1–æ„­$èÌëCÛgxxXFÞÒUW%®¦»U}ÕÕïÌÜ\£¦=C­pÿv¨}ì»ûGÝûøðÈ®õ�Õ Åxc|ÛikÝâ®õ{Ï—¿Þ ¸ï롧bÃ=2=5rîz¿Ñ­Z7M�þÍÞ 4ï#ÍZÈRmNöãþ“mÐ2<%_K¡§—FüñiÛ Ï[¾n”lU¦±JklÊ|µ­É†÷ÆØNLÆOí—€QßÞŽc™g:ÿþõ\µ[ÂÏ“yeбÞù;é÷§~çý• ¼èz³ñKhZ¾i:Bë—eÆZ~%Ç;ÛkÉ3é¾»ýØ›5:н¥Œ³—··þ&ö®{w™nŒïá‡Pÿýé±Q~_7þ®·GºUÝ˸;óÛž>\OO™�‚…ô ž§öO«·pøL­Èùg÷u?èÝúo½ûx«Ý{‰×½C¡öØ×kµ~kتõ·¶~}xØ·nŒƒÆŽ|¬K…Þ�vL¾†�b;\¶^­#o‘ð�jÑ—äh‘ ×Çžü÷`\m?ÆóqÜ3ñPžÂ¤Ú0}L滵nêy\…§5÷²5]Ì·Û™÷Íž=>…^g«‡2hŸ_tmPøj¼Ù—_›I!:šÃy+�ðÏw_›Þ"’y ,:r´Ô?/cËx¤±\v©lqe¶Í«Œ™|[ ÜDtíð»öëbÞÓ^Oû±È†"ª†M­ññ¹YÛuÅãwà3æûnzú­Îãmã®÷ÖöÃæÏí¬Æqðÿ‰qf2ųoWÐm'ê`¿'é=ÅdK5=…«FðÊÒÜòІ\!¸ ­–Î~0á8(Œ{µgˆ^¬­³ã‘—´#™ï¨ƒÊzµà»eÒ묘,oq8�ÌðûÇŒÞTQZL,ÕÛ0ɳ‘’ßY{ä–Ô9ÀqÓJ£F—û�æ[šÃöHE\�Bßpäë?ôÑ*€š°(‚¸tÙÕ|Ú�°§)C·»Ã`ІWX¥q¤æ©Ú Hä£[�Oàg»ÛÃjŽª'º4+Gƒíl£rò-X(Í;þ‰­B˜ß±1(wHýQ þŒ�/GÔ[7•âÙ¸$~A1¤M¬¬�Ž‚áWFuIqæ¤úa¬÷¾jzµGÚQs¸÷ì(zLUg2¾Í-§¡ÉJWÌêsjÖsíîè§|†6„âO¹XÅ{*¿™+ñíaàÏf¨JÀæ³� vé¯ôÄAÜÅÃ]—-qlvñ]‰rßãá²n{lTÜ''ùÇr<â5R³hl�v¹Ì“3PåaàùÓYcÈÿ’Û§¿Þ“Þ§#±\—w‰Bc?µÇhÃ!›öÞµ“_ sûƘždgwþàØßz|}K4S®–Ñ,îçSa–‡‡ãBMdßâL‘ÏH6 ÔasØ“ë`W¼VBÌòö¸ åÜOwŒ%˜ OÅr.ñQ$1ÅDì›ðgÖ2.¹D¤ùBYïºf BtЇzp”µ˜6ÖÔ”®Ï3ö²+{¢T`€ÎI˜Ffˆ(4Lµ4ÁÔ ÖÔdšÙùçzÂÿBµÅkPË/Z‚¾õ¹ŒÓÑJ-Ip>*¥nŒ‰feh  ¦“åÎ\j´¸%¯]®ãÓd(‚Êy+申¯e­µE8›ö½PöXîÓyc<Í f5g3iŸ?I;«-,p\d¾åÀ@ÓîÏ�-ùµ.“‹Uk�hNŸï ‹’�ë`“q¬¨¬ÉéMÔÇS3¼önJÒöò”‘–VNBÃh×SF fZÏù£¥÷¦'ŸDŸ‘€ÿL÷½ÓvâÉ8Ø Û™õæë"ðµpF°D;måô|]$"ɹe3ËFr¤…'Û_ê¶'°—ð„5IôKô»}ÚiDO�’-{ÿ†7jœ=|ÚÃ…Ý$öÀàK’‡Åk¢ñYL±Oƒ‰Ïx$ŸrA“ÏH�²)I¾>�CÓ{zŠƒƒ–ñí dbV‹ÏŸîN侚Zùë㉅ìwŸ“î.ƒh:EæRå8ú#Š92JŒú¡{ÒaIÝs¿ÅNoÜO-ñ¯èk‰Â~¥eê=�2o¤ÐoI¦³DÄ™õûœé:õñ²É &Ü}Mß¹á%Q£‡S? OØEœ|Œ{#Œ› ÑÔð�¸é&ð@nŒxšÌ„Ñ üµ|¥‰~ ãÎNPpb‡,Š¿rý5X(ÜÛø�0zާqB%nއÇ`q5 ?r(h`|rP"¢¥ƒÕ.”ÄÒþ`!DËÀBaÞAÈ:õ�§�ñ$DGÏêôwÆAÎIŒ!.9—˜ú’0CÆŸ¸ Â¯ Y€ä—# Y²@�ËܬN¤"‰,ü(ùYQf®˜sŽèˆžæŒW¥�*âT�Qc¢ibœ„„]Ü G“â 34-ŠŸ¸(ù´Z‚U��¨7G˜HH°J˜a� ‘â,ïãn/Gµ2½`”c,âžY“€xjk^F†Ì’p<ÄHK<Æ: ­Uü‰A?š<úó"Týl‰f«´ÊÆÍ£&húcŠ¿a+Ø+'åìg¥Êêl.ØÅмÇÝÞyšKzož&©Y÷#žÌ¿MÌVÆS'|ûš¼9ÃW;ìml΀-&4hð@Ó§õžQýjëÛi�X[„!Þ2[‚©é¡þ’.•¾“ü %?F‰ú*]�7ºÛ>=\’B(vl;„ˆÅGÄù™]‹ŸºõÖW0B[›ÌÀÑt'iåäÙ�d²?I�l™üI·BšRñÆ_mÉGãû«ÃHTø%ðÄ·E0ÙÇè’+]øò÷NhË!ŽEb•÷·åf¢úTrîdˆó49£‚ÁgŒ¦mä’ zòеÿãIÿ?訚ÎÍ�#`¯Çrj à“cŸÛèûÁ =ì}v[–1R"fFÂä�EÜoO¾ÉAý¾JÅŸtAÖRmÚF€¬¹WÅè§^æ†ÔôM‚|WÿÝÓuï'ç;"µ±—c�2 ºÉ9Õ�pÄN„†Ë�–©(°‘éd6’ysq½ø³Ýw›!›Y€+)cp`(Ëqç~ øåbò±‡Ý¢³|`zè��²µ�Ú_ÇkáŸú5¢¼q-r»êh+‚Ìr¥öµ!ß9’ÌÆ·Ûé“7Tißcaâ>ü‰¬»1¦ ¼¾«›d>é=$ Òñ´Ó Ö൛†KNîAÓûíš%°-–qÄ·úb>k³:¼ ®Ú`ß8†+Ø�êÙì‡U7E3õÄ#ýî*Þ~´›BS{c›_ð Ó9O:Ÿ90òÎtqkûdhìœbt™Ó’ã_AgÚ¸—¢&¼"?ŒÿzNNGeîå q/˜‚ëqj¶›ÑÈ«à|­ÅÌwJÔ£+Ÿ×í£vî#÷z@})-p“Ð�ΟµvjûD©C™eŒ–†éá2è8ŸEvú=‘Nå Ìfä\ëb.ÆÀxÏÚQ_hôi±xÊ×ÜÉ…«NB§�V;nŒ ć§À{æ£k|…ÁOtñïd×ÂíXSŽî@êÒwFÀD°€öœI¦ï~™ u,±_±íÎî×å hJþveÓîÝLKÄ“eºÕþè&a$pÆÖÌÀN¼%¼–à#ˆ¿v€ÑXðC‘Xðg‰¦£Ùï|$½(ûNJ0»ˆ]ƒ.=n|®S3ý�Û[M¬b…µ ¡uADW]6ÁÊØM&ª¡L)Nnøš7;²ˆ%¾uH&Çþ÷áCzütg^F{“ŸÁ¯­¹ û~·“XO«6À˜�X8u }; u_àQI,J{¤$8Odš °ŽÕÆ�ôøq;2#*ØÑæ ÙTâ}’MÅ'õü]”,$‚îyBºIÂöo5 ½l$½ç�$±AµG“x`³ýÀ~És(`ÐÙðZÕ¦ZgʨyÂ^"¹Eei�ùsyØ_¾_Ân¡< (3;ä¦êø2Å[ãæ�×wŒ.Ò®úЉ¶xÊ9üiÒúì*Žpìú�@Ökr »Ÿýæ…{:ê~Q=òòÑ‘¯Òùîn—vô³™ˆõÎø´ØùN.«1ß9½<êaûš¿ M)LZ@Îy� ª5Ýéqs Æ1^ò8°°{ÿ̳ºR|kèîÓãõÖ%A°AØ5'Vt¶óœM�ï='öaí¤ø‘#–Q±²wÏ_3‚òͧé\Ì8#H3>ØAëeÇuÎZ Ã62.ß�ŒxN�"]d*ì'ðxÊã±Y¬ß6Ü­(÷•¨’I˜Ù÷óx$¶1ðyñ¨Á§¡›‡Ebçx¡cOÞLÂç,="AAžCÁ�ð@»Yª)¹'é³åUfà[d§Ë*�,sÂߨda :µÄ:1¶HCÌ—r]X@{"&¡ŠÝ;iÓ¤ÓÄ©²gÖEŽð9ç;±&n®uŸ}¢ú$2ƒÎÖ—Žç7ßÇÆŽ5Rèh†�r�ø²Ú…=Z|)ò°»Î{rá�ßaS‚=ȤÑá‚ßv@ò¢rŽ#[n¦|D%o%’‹ÅæSdÀŸhŒ·m÷3}"bækðl�4ó ±è�Щ„Ö‰úº¼O;ªßã¦4?p£æï/Š)3ÐÓï`Éè¶ÙL ž+ßùzÊáñÒd³ý‹>éB@$vÆ… (èávÆ^5Û�]§R»Xذt�³.)È7Fv;Yd­|\ÜYCžï §2ÁO¼¡Øc»—àI8‚´DSŠZ­d¡<¸g†P„Uh��² 7 2’^ÄýÏ“L"�ÛíÑÑ·3k):[)òi¹ �B¦%̹nåCŽ}/±‰dòý`$”–‡D ¿™ð¶,p_{yÐõÖDx|mÅ¢wmK»yopØhnŒô7l€¾ÝÈfã òÆ¡9T§_½È¨ù´)ÐG"•cz¯mŇ‚‰338è?˜\[PiyÁv´%½óá�n=½·þûT>5}ê‘…¥�G=Ýt©Ñs‡Åâ×@ËöL™xøý ÔNÿ£� ß�ò/sØsÇ›D}ák „pï9¾³>ëÓ¥¢ÈÞ�ÜH Ôã©}íÅßü8¬nŒÐ2MO|´>â8¼ÍèØ·-V�í;ÉXjää'šŽ2‰•c;Ö¨¨™ìѸ_ŸÆ±0�÷”¿1\G@ßÜu�'çfh84CTÏVK.œd3÷üò¼‚uÙ'OÞ<¦ÉC·È~¾¦8)ÛFΕ£éÅ Á_lUve3ŸÝÎ6,ü“%±êOvœlôØ¥–xäÅXºm�òÚ=;Fk�‡ÓS†ÆÚ‰æ“¿yÂ]pÿ*ÃÌ—m�Ëaù³ [Ô†Ø%ˆÈÆçÅÈJš#Í´mæD�R2pP¦Ìó*§Éaþ¸8¬†—e*9HTKyt\:é ¶±Œ«)„Çõb‹¿ôCóhú}Ö1ð�ë›õ°ç,åºð<¦¦ñ¡3]X¤Ú¢-Ÿ ß YK)€u©½8Ö¼ù üà4'fÈþôeúÍŒï$�_�â�b‡õÑCòÄ>d#{ˆ¡ÐçÊô>¿‰Õ½®–ý´¼SˆÞÒEݘ8 ïØ÷G7\¨æëtèù©seYH�•Eb«jž¼ñ}õtÈð®)´Èü°g*ö p�Ý<ÔÜe±úýÂ[xù�‹-§ÈL&ÂÝ‹·fš‰ï"æ÷pv�âƒE×§lP%lm©eÿßÿ«O9[Í»½k7ØŽ·ßò!„l³Á©vÉñ"™Âj~‹ bK]ès†Äéúùïâ·ãM2�Þ£Êa±Ÿm£„ðÂÁEÔÌMƹmoˆ®­¼í­†l†‡Ò]ÔÌKe/}ã—pUš³@g$æö›KA1o©Ã Ÿ/U˜+É.,Žze Š£žŽÏnpT'ÿÉXM{Ì÷é·ß·únÂm¯8í÷Ó½}¢¼‘Ç�‡{ðÈ}žûæ> šgnž7Ô£=d2Ƹ§”=Z§§:«'Õ9Ýæú�Qg�Í#:ëÃKPç˜ÎàÑçØ¥³B �£òœÖ9‰ E¸£ ïÓ¥¬�Þµ…Ç—ž{﫟1O2à €x[¾`)–C§§Dþc”º1n·±h?áØ<ã¥à.ÈGÚ®ìúÅÛÊlß^ˆôK¶ÓÌFÑ šéŠpWGOöXç�"еzŠÈúÜÔ§._%æi‹?¯£Ž>%áµ7ì‹°±`þîK4€�îÝœ¦Ì1}ZÔÄåÞrÔ½!ß…¯¹14uÒG|–wÛmx×Ú¾-%Âím0(À1´Çn9ã³'þh±À‹ä ¥zÂòö=e‹»<åÀÁËéL'´a Þu½±’ÚŒ½L'° ÑOß·mCHíÒ/59 yâï~9ŒñÀFt¯;C«S“ú5ÇB©×¢P{xà�Èõ�g»»÷V¤çêí<YÂV‘ªÏé;ؤ€Ùf;} ëÂKŒµF"!ô“È^ž¤�æœqs¡ïz– ëòöÕ£Y°5³Y´ªžð~1Ä@�$ûáªv¶ïTñµž¯©ëÕ­¤ìÔ»¾1ž‘R7’•ê[Tõ{9 ½m×dlI½1»Ù½2Ó V t—x÷ÈÍ{ׯ�µ4Ј޲3ûM[ јìöðI­–û×w) öH¸.7SÚ`ø>¼ø¥€" ãí¼ÙR¤&‰`}v4zÒ�R@‰ìzV”jªTG9 ôÆx6WogDä /Ò«úÐ&Œsw«@ýÐ�9÷qDoÇi9½1b°¾ïy£ÎÌ5ó6Ï €¾Äˆr!èA@mg3ÍÏ¿ýÞä½W (Q^ŽG(’–°h ’éöå€v‰ê¢Ú�Z2¿”\®õVyŠØFÅã—š+ZÎyK^ ¯^¢YhXe€ö�rîÕc”œk‹ØÏd�6Gî©ÐÑêšc" …[š[Ýý$ж³e’ÚNXÂ9 3âÅÉ/=ׇÂèK7°Y$�¾÷õY óÐÂ\EP°o÷D·›ðJ­ÚõˆwI Ÿžg‹,P}§ksãYb®�n»ÍÖæ¨ýŒiªTÜ®D4ô-–IrÕb�΃6 ”Ý÷1Øïÿr‹�ÂnoÉ l­ÙCë}uœsjÓm¬Î*u߉gšyØÀ• Øý½]$ �ÄÝÃ4Ôû>TЇG"“yÊ" ®sAhÔ™G€f(ìb'Qu;Û Ð{²äÕ7‹MFPj¿ÒQ©ý%ÎfÚò¼Ý¿žÓ€-êÄÞn3öã®Z[Šžê¨`a,ÿÔ3(8OOÏv1{,º^Ⱦ ¢×´•}Jd"CÇñicu.aÊñüëñyëLÀ—ëÍ…§ÃÏ�üÓŠn1áV_ê¹÷Î%ÿ´z˜É?m´‚ÁÓÓ3Œ�i&)ÿv³¾®Ê>ÝîÔqSËu$drëÉÿ}|þ&f4¢5I䟶ïjw Oé7Ë cÏóÓ´üÓß«]þéûÜR===ÇX×â}–»;éŽdŸÂæ‹I=e1Fz[ΞüÛQ×øIþi2èõÊ?}ˆyÖ #«ß¡°ìÓ�i³þ�}ª3ÙS¾ãÓ�íÆtw•Øüø¼/–}:ŠH/…O7" ‰™:g„šX+)¶±F6 Ÿ*+VøôêIöÓgñž³òÑfzN¦’îb;mé{{£pêLø”«ÅÝ{s*ûü–ž¬7èÀ`>íb<ØàžEûVXF}$ú}] û¶zÊ­9Ý Ù9¼™Æ 3ô]\bÑŠìœ_sW+3XÁÏ´� òG¤€‚D‘²@±�#”6Ü‘¥ó~+Úy“ ªíÆ#Ù9J‚E–Îä4·à�è¬| Þƽ5Å:4™ ' `Y ýŸëõM‘ö¿�êµ¾ËÕg{.�>&‹µ `‚öÿ)´ó! æ¢ÏÝѲsÅÚ¿ PP @§èÉ­Ÿ€2ZŸÁ¥–¢ßê'n¤ú¬öäz÷ÀŒ>¥‘ß ƒ!‹€ªÁW“ëüÛ£³xã©™6Ç&�8ß÷B�(úŒÆÓŸØÆ2l²3î…ïS‚æ0Ðø7ÓHà×ÃCNº§£´ý1pرIyæ`¯i²wgÎs¤NÞ4äXÆÈþqTÖRƒ )»S’�t<‘ôç•ÕùYŸ ;²*é÷–LIéìŸÞsúdU‹æû š¡ç.\*Ÿf(=?ôGmýÌz©õC«/XAÄŸm¾M#1?¤¼^´~¬‡Dj‰Ñרu ²ä‰å›ìæmµÎ4ûšÌ¼ïrRx¿1^JYa—Îá�‡1!æ?¶×ábœr)ùȉžÌ[Ì&=™“è9ò>7ÿ W£ãØ È X€@´ú5—‰QÊÎq—AÖt�÷¶x43ÈöŠƒÃ�äyæÊn†z?$KÒ‚[’+œÄÔœz©©�q¥ÊÔîC�…©1£�ì™ äÖ?�£ý“ûld}�U’`{ú %;I÷tm�žt°Æ–„ÑK’SÓ¢‡Ñ“%…4æH[ò++­pÊ¢¬Æ(ØÅæ�½òƤa}qc|÷ µ-á8í3ýIQ{ʉåô9²lüm—=“ÔH/·WƹÑhRèd÷Êj�*›^?e…NUçç5Ÿ�?\?ቃ¬–ójÄÐbl½þ¾3·ò¸n.ꌸ&ÆÈëaŒº&Æ<¿Ã»-³„æ87\'ybhîe”­’-Ú1•|JJ)…VNŽíïušli®œä…–øo¸rw¡¡ŒÏc%i,ù¼7þ;h4&Ñh¤õ1eì£ÞÇ“FS¡.;—NÖ4��‡´ Õ¡H D…qE‘Ò-a("ÝòGáq*{ƧböôûœÄ•Ç®k ¤‚tK–ÒíaFl�÷–ôXü5Åíûn²×J‹Œ#éÖì|d�kiÓúÈ "Â\Þwß²{¼”=,?$YÀÙûè *Û²”�ÑaÞ÷Óuæç¹o5+̺ü é€ò©êŽ,¦Z]¾€õ~8?~4ž!16?_àÏ�±É�ö÷'·âѲø9²¼ˆáF#²4±¸41ƒ ÎÅîÉâNÄâž»àæ n¤©x—°‡dY²ø| ž»�åNv47ÆKŒŠ¢Ø%+í8sÉJIþeQ¨Áÿlj^Ëij®”spH D¼-+º7¸¹ˆÈ�,„&å�&üöˆ4Xi/�¢ß§ˆw5ø}nŒ*ˆ‡,/| Êþ¤Ãv<6R¢@àiªÒîsUzSBã+ÓªdTiÏý“Ý Â/êDµ))œI©nƒ�â}èѬÁo+¥ ŸO-ô{~Ù”ð¨•Î¥wdŠ‘Ô2+%:/�ö=c?š�xË“7Fy',“NxŒöh¡oŒ£®Ë–Î6:9J6hÑeÑa•0~ã‘ùM‘ën4óÂöRÏo‰r¼Ê²Oën‡º í´ð‹+ê,ºÿµL~nüð�B´jè”ç‚MO¶ñI¡°—£æ~4r T/ÇØ¦Ÿ_ŸTà^Î÷=.gä‚��í,åzÕº‰â}_Á-ŽŽy-"}ýæRæ‘£ ÍEÆï…:#®³Ý ûÙÔ6BñŸ,*+)TJ¬ _U”h­õ¹Dƒß$$Gchˆ7ħxÊMò´:uTñs‰]•7Fu1¤E¢ÁƒšîךÒóÓo$Ú‰÷aÝ® ÑP/çMŠÆTû¹X¢qš’¨ŸßK4ÔËQ¢q~KþÑËãéGZ.˜’Ír¾qi-eÃg•O«ý\¡ni8€Õs•ël~cF£`AU$£ÖÃÔ•ø¸Tæ|_]̢ζ5ì†Ê{¡ðŒïÓê”Ø Ÿµ†#Éî…'Méc«°òã°4èÏÈQ—œ$òGÆGæ‰!å<)Ú—×(O¼�j.¨r7t6ÕÀ�ò¼Í÷*@gsy/ú%bûYÄà"Œ]d\~l5é¼\”š¤Ï 1ƒKÁu}Ad¶+aP *«ºª)Þ–ú;Ѷ„¡ôw×q÷"“RÒÉj}¢Ø5Õ%éçÌÅø”d‰¥sÅh[èìg§7’ãº'KåëxHú;MþäãJ"(2Qˆh-Ýš‚oqg2*Š' |°Š�>® I–"p<Œ*{1ŒË²Zˆ²_Ú²dËùǯcú%ÛjÜãî}²œÙv£¿É¡SΠÝÞðã:å :æ„÷÷9tÊt8¿ò 9tÊtÂlÁŸçÐ)gÐݯ“C§œAw–-øÃ:å :�–WÉ¡SΠ;ÏüY�r� Šà9tÊt“DöÓrèTÏ+ŸC' H>߯�1ð¶Dt£nöòõ:ù ¬Ž3'’pSÔqH)å|"ƒ@¼û72Q±šiw�`X O¯:ždlÛ´x·.ÝÑ § O å831ždÎÄQf™p£?-‚ÑhKÂk¬„g|¿¡'µ8,f~ê9#J™sZçÇø”Ògž« �.’TpŸðdD3ÒUw/S¥ùjã¥dKg �˜]¦ µl9Qçbû{É»Dø]ÔžIüGE:'Ÿ¿ï„§¢?6öòÊÆÞñ4AÉ…šŸaÊ›úrœG(¬´lZ˜J‚ ^!öŒOŽNv yâB•FšÃP‚›:ï«£C“ §pÊ#Ê’SßÞäÎ$&yàJU>·iÔ#%Î:¿ X‹Ṯê‘ò™>jzƉ’UÒ�TÒã„RçL�änŸ³dä÷óËô±÷½QÌ<}ì"Ž/hàxáù‹,žövóoðtÊ»1^æÞùYfÜ�ñ¢A]æ‘á†$ðô²ƒºÈ#£0$ñ�*¿À“&�ŒŒ•$ôÈxî‚s·Ð#S¼È#ÃÝ8-™ó¥ÿ­ÛbYäY?HÏá¯Y2ió]hHϹ ‘æNídW.‹¿öÈ 44IÇÃe÷)è‘e¤¢4´ßzdpvžÐ##wÇ�b|%çÜå‚]ŠÊé9%ç ¹„j{qêý“Q%šF‹² ºœá÷9‰%­‘ ¼˜+9«eSúõ½aÜŽz´ü> M.d{5RhèQ§)táœ>ù‘ÃhÍ5+åÕ�ÍJjªyu—Æ®Ÿ[I1šRHTc1nüš(YcغEⵡ~_Ÿ¶³2­ùp*÷õ])Ž9KgÄ];îrûI>œT„*Êd»n>Üo"TµçÃ)e¤^/Y|×ÈW·JK¹Î~›Çݪ¡1Uãgùp21ðW·;·ÄUCú~�§žY¯éX'uv_ñOóÅ~)Ò-QòÙµb"ŸNfôox¿µÖª¿+Åô‚²ÿP�õ‚*ýòZ Ü�rÖ�ö~~‘c´_P?�òTï"ÅÉu&ݦuyÄsgsΆð›� ¥¢´±á%1 ²7N£ô£k„&ã®”k±aK*4ùRmáû‡f´ �vqÇïÙõ"bŸX¯L?—$BÊer¡~~{ÕîEÝ£Mµg:“;v•»‰BÁ/m–¸¥x•UTiÑ�ò©oßWÉH%õ*—¨hÏH%õb»ñ©¤Þ«ÕUÊHíéG’n”Õ…ö•2RÛWÊHm_)#µ}•ŒÔ¶Ô5Ð<‹OCþšpÁD×@ $‚ŒÎ²9Dl(q 4ÊÅzRÞÀ´FÛ^7Ž™K^f»V*Üî‚þA*W¿R²³k¥Âa¿¥ºõþËT8I»òê©pR^…ë§Â1{¥P5TO…Ó¦ž.–Ì­¾ìFx¤«Ü/u°B–Ø/T“ZèìJ…'PöºÆð*:LÊå×t–¤A£ã~•;�d¯ æe£w7½Ë64$E#".‰A=q/ª'IÎì 0Õ~©ÝDç\=~è­nFçLxº:g1˜AåÌSèSGç˜~5ÑŸ¸Î>puŽt=…þ ’šÁ;n9M¢³Ÿ>¶z¬õ“{v¤qËçZA†’WO…‚Òyg½I©\œË©�ag�P“G ´Áð´Y¼Ê%»½(dØíôÙ/¥ »ñCC¨‰,~ 䀅vâl¬dƒT”ìf˜ŽNBQœû¾[r3gØy­Y €à¨|†‘ 2@q=¾ú’êÊå�)fØí¼ò@sŽÏÖ èy=¾‘Å?•«ÇçRZ6Ë~Ù=Åt²sÕÅß�MÁªŽ‚Gðø»ÖÔËp)Ûóþ±e÷°\©öH¾»™çªj;ß”¥;îž^”tô–©¢Ç#Ëù•†Ùƒ|•$©�Û³»Ô„¬ÄÑkZíÚÿóýZ®ŽUÍœå�ñçE¿°|AÌ•|j�PV�¹ºF%9)í—w–t¥Jr1‰:r?õÂ¥µ‡H*Çàºh6Y“K"®O¹îÛÕŠÈÉOsÚ¸æ”Á°jE•óùIÅ'£bmʵ´É-:Gþ1Ò5„Rjå—°j‰ˆfî8�Õú®˜M'!ò;ÿÚs–M'e-‹ëeÓI9¼µ8¯’M'år–¸yò—ÙtR âÅßgÓIåÒÉÝuóól:í^ëßdÓItEþl:©\:åÅŸdÓI�Ó0^ëkfÓIÙͽòÙtùTèîiJL™»_{5•¹»Ñ†òÛ2w\,ûŽd¡»_{0Z_Iì7ø1„å�`æYxîŸü’_Å*·ä¹XI6ø’©Yb.H¤jÞ?е†5]z ¿T�øŒï‡ê´dÀªd¥•dÃ/ "Ã:?J3¼ Â–Z>QïÃ,2”™ZiVåYkÛèPz  ×]�^[^1 :»V4Tm©1J9Í£÷¡¥6¤†ÌG믓{S8›Ãjûu?®s¤"-5öãøáhDu­Zª“iˆìB]¹4IK�‰µÖó}ï¹yÅ[¡3�ù&72Nš…ï¢R°.C¥©NÏ�TLdà®bæC�_CÊÇ{Ú\¹–èžÚŸe¦Àö¦2gµ¨agšJËj«`¸›Ë‡±j®Z$¾÷øÇ™�¨òQ�O×8ÜŽ\á–ÜÏ…‰ RѸéâZ?Hd°%Ââj© *lxW�2ñRûE#ªU¸Ó–_ùÛ wâÜ7Mœsq…»Ÿjã—U¸SÌ|ü9 zA¹Õ×èG-ŸHk¥¼ßå�*åɳáï+ÜIJ�¬µW¸ûÁ­æ(û©®ár 59Ö¾^bm«9~ùybm[ÙªÖZëùíû7÷Sñ2�WH¬…^¤¼YÆ\1ý\ìÁ<ó�3ýü>±zQ¼î²üvT.Oþ š ­a"U4¦1}lÏÙ~S÷kÝ5°!ÌêU¶Ðº–$&á.²h¼6]CÓÇV¼.?¾xw¦n¶ßh4Ü?¶šÜÔ²~K!ÆèëØ•°’-çv¥Œàz¾(‰‰…¢8¨ß_¤Ï³’ÌTò¹ã縊/:þ‘bÈVÊ»^ŽkG*ÃõdY\šãš|ž+ÍòNlØu‘ÏqGmüèj*öž+èl¯A3Ó Ãt¤2\\)Ok¹GÅÛPEº«”{|„ûyîg7žèzÎÜÑ»tÊœBÙ‚�E¾ø[ æ&øø–¹3ß­7ü�NP‡ÍÒ¿«Ïù–¸05íM©â\×) ”È&éªÐ#Sènå È¥áu€æt>y ¹Ü¶Ãó\‰Óð ßôáM.5M!.ð¯ó€r©i€1œå^<É¥áù¦¶xÛ¶‘K“ÏüôNÁ.&Îý{ÏË%ÒãÜÝêËíIÅ™õÁDHj®lé¤h�ª{3ÐOrèu` ¼ ná\ &Ѫ"ÖtbðøÓ1ó0ÔÐîÆ¸ T #-=ê«Q�†vÛÃÇÜÈóŸ0”|¦vYÞvXD[§’ùT­Kìv¢Š"mµfZŠÎƒÎ|§¿¨b¶¹0dH>û‡µšd3­U¾T+ƺ˜SùÔ¦‹B«d5]|߸I%ÀT«' ðT“ @“Œ„TÄ“Yµvƒæ¬´ËB«ÀìjYiÐSØ¡¿ºœ§�ð¸Í~@0ÌIݺ òókÍn ÈWéÕtG/øXì­üy"Ùùýc¿H?’UÞø÷(ž|x Ù‰ûû¢Ü¦¦AJ ïURïÔó÷5§r®Tr¨X߸¦TN™D Ä ÎàÎÙ…•�•¢È9Påë‹]ÒYG¹~÷eSËå¹c*'——L’•h×ÁØHVFÄùç/Lgòú¡L VcóË�³µæjºUC® Íõ¸úÈ?ʼ̟üÓ,@žJ °û¥Y€ZsoŒ¿ÉÔšxó«,@­øÄ;ò�³µæŠmä˲”EÙÓ7å,@v4ç³ÒP”O\à_S”OHÉ*Y[?.Ê'°,þeEù$½pW/ʧVçý:Eùð íé½Ð4½zQ>Y/ÜU‹òIæŒ\½(ßUêWªåÝ7®4(Ý™�êÝP¿®ë§\Õï ™\W»J½®Ÿö»¡~S×ï4µ+Ü %[×OÙ+$Ö“Z×O¹ªß�¨ë§ì.“˯¼´®ŸrU?-”¬)dQ±ªŸä-Í?¨ë÷ÛL®kD+²™\WJD’«êwYýJùº~ø-Q×O¸æ«3\\×ïòÕŸÔõ“JGT�…»´®Ÿ%_§®ŸòFw£r´¦µ®Ÿ†¬´+Ôõ;æoIWõûùZ×ïrûI]?©tÄkä¼ ëú)÷¢^�ï·¥l�õø®Q×O9ñ�;±úe]?å07é[h.¯ë§l©�ÇZÿ¬®Ÿ4G«ú©ç½j«ë§ŒÊÓIâïêú)\ßœ™)?«ëwIVÚµòÄUýduË ëúý†÷µ×õSL“´ó2RÕ�ò-Ôã»B«Ñ/ëú�z‘:¶â¬¤_ÖõS®êÇðþïëú)û nŒ×©ë'GìLU?ÅŒ¡ êú)Ÿ7KʱÔõ»$ŠàçuýøÔçUý~^�ï’âšJõø~Á†¼^þòö®®Ÿ‚ÿë´¿(«öêú]v£ÎOëú)Ôœ„ùe]?.K2Á„o½juIKÕõSVsp¼åêú)Wõ»N=>µ,\­õø~çÍ:Õãû]]¿c/ÒY¸Å\IÔõÓ– /éÿA]?ådx¦^ÒïëúÉìÜlU?99vi]?åª~¼“÷_ÕõS6Û¥×åòº~ÊUý~á·bL[$ä/ëúIå<Éç$þ´®Ÿä�8ë[í¶y­uýÎC~U?Ù\Ñ ëúI,,OÜe£ëø¨T­ë§œ+ÒÇ~\×O*íä>Vô(^P×O=»öuý”ø÷öü¦®ÇŸ’Uýäâ-/­ë§D<ï¨bÑ×ó+ˆSðÛD>«›a\.âƒ'-E®]BµûªäÚU¼gü–ÂÄŬ(J8Å÷a}¶G*CÌfÖZ°-V[Ÿ0*²EQî[>àÔ™™v²­ƒß¶ÉÇ(µÝF©dìé½cÑW~¯Î"²:Ûºñ¨£B�Š=¼%í±èÅó?•¦f"ó°ñÙ`&NdßßóDÎq¨eò•(ÿÿÛ;óõ¨ueÑ?AÞ¡h2»e�v!ó! C BÈÐ !� gßýÏ}ö[%ɶìnµÌ ë;YßõúÎa§»«e©TªAúÙýaÿ„¼˜¸ŽÈëÇ£‚¼>|ºHv¿Ÿ’·£_ÉÛÍøyûóÙCòîéñ29ØþþœÜD{äpcú‚|žxÕ&Ÿg?�ãý•[Ó£W× òêúòÑÆÕíÌ͇ë?ÿŠØfrkïìür¹3'G‡_ì.¶©;íîËÞ½»tüì<ž<ç/K?¹y­Eprvvz¢X?eiuÀ€‘Ï/Æ^éäãß%OçÈê›w«díÁåÎÕuòîTßIšß‘ÊÇßL>éLë_£1÷$®¬|ë\]¼|Œï=¨$ìf•ËgîÉ϶³³ªOìnëfZª_úibâ`õsÏü|æÔ‹w{ÃcÓG#x‹í3üç1þ¤æÎðtçÑ'TÛþÖæGü!Í;WxûG�Þ½™Oôl-ü¸Ü¼^xþîݧÉå©öíêØúÆT ?>®Žxkú½ÀŒã!z(¸??˜6•Óœøx�/;Ö‹õÑü/üu†¹ÕÛsÜ ÂŸÕYŸ0÷ýBĞ—SöåRáË(ÿbgråíÞ:öæ#{úöçâÒÙQ'&�9>¶ºB_`‡Ÿ�ÝĬ/½9š¼9|…M:#˜Úœ<É?˜v?ø¤ºùÅõ Ò|YÈ®·jÑ™RûœtÖžLïÆKñc+¾¶4å|pôpéIöÁF„7GN€î>N¢²ÆÁƒ~»…^Åú%{º; /wæ'†Úy‡:$»«Zß°|º‹ÚlÐ&h1 ,Ÿí+Ùîà£å¦4' /wu³ìaúã^~`�¯¿3øî›Éɹ³ôXL¢¤ó~s:¿èçì*ŸAËrz¹s4ûhæËÅèîêì ÿVÄë»×ö^ºGÙîQ~šV }¼Xú3-êöèèÜÈrÖÞø³¡vò2MÖVçG»o–7Ní�­0ª½83–7´˜x:~~ø`åäû¯DŽx>ð#¸ÊMj'ìx{4JUðr·cOÞáï=onŒÃ_bã;ÇŸè\ºAa®Ž�Xö×)×MØ©ýþJ·8­0x¹×±ßýþ�d}Š�Ù?†TlsÎöçû)s>ø4ÌͪüüâWÛŽåû©# [LXò¸ûiü¯¥¯ru{ñ' Å=¨Å„^Ï;éÒ#q¹ê¤•ú½‘¥…øÚ«~[zʃi`\7`Ÿ«0ühêl¥ÒÄäÒç&'Ö &Kß³"‰Ðï�ŒÌ=]#§í‹eÈ2/'ÜD2OHºVÛ¶FÖâ¤;":•&öövò&ÎÆœb@[<䙃•��§Ù£Çb°ƒå)œ!S¬ë÷ ½� "ëw®™Î2s?¼)iþÁhñ‹ÙùÓ7ŠÜ ’²í¤³ÝéùÅh½s•ëD?pâÈùõhü5rýÁøØÓh°| >ˆ£R2y‘ÍËí0^tØÌ¿þŽ~õp/º§òºÞ‡^˜{|­ÆÇŸçYïúA4òmW§»úÇÂuÑ�÷æ¼z³¢ù­çÉÙåë×¥G�äJ¸ý°�+a¯¬„IG®Øq¦‚™ØQÁÒþé'­È`u\%àŠ(aâ¡£‚§K¿.]*nlùʨÀ^Ô>í$›’° ɪ/ÊÔöw«z¶Ç'wе±7|ÙY1J¸Z|ÿ¡P>òå£ÇÆ'-¶g‡?†¤m¬N“w±Eó\ë)o/jöazpv^6ÝqI�gUþ½Ù˜ªcÓCíª{mzjÊÓD]UNE®·ôƒÍ¿³M=Ý.7×èƒV%xKO/hÖ„|PÌÆõÈÚó¥’\g¢�Ãg íd˜ùA«66vW¿»�uîÚ‡øî66~w›¨ÑÄÀ¦`"nÕaÔV¥ßÆÈg£ã,ס¶W›ø=ϧ£Xµ‰é;ÎF'ª˜”}6ÔoUçov™…ûÜ!wFÜoeàÎUýaпه"Oî°ðú\çO^,Mš&®æ+õ�úc€‘i‚NÝ¥Ú[Ò»�[D oIë$7ƒâ%¥<ùï,q—_ÒòKV™}ÊKŸ‹©ò˲ŠDùR¢S~IÊ/ãÊzå®T¬HðbÊÌy¨Å“)wC~îÕÙê›§3û+WŸ¢ý…u¹µ¾tôåÙ7³« èâþîS[³Š¥È”Š˜ágš¹Š'¿+|èÛûOÙŽâ‹‹b/ß[ü •ý¹.å§²ßä²;¸±”í Ø}�fÅcúÑj¶jBWN¶‡™Í�ŽW¦›ök«]u™]ân}Ž~ýaw�*¥~±—Y©÷‹½L(ú‹ á®õÜF'ßžu¯7ýpãk¦˜­q[ÇoŽä¶[î†-Ô�ù†í–»a •¿±ä­|«y‹è½’x]n¢%o™ÇJÆÇŸÚyÛ/'�ÈñÏóËé¼hxHGçÆ%x‘¹„­¼$æþÊ«ød}[¿a›=ÙÿÛ¹z¿:™ï¨šMl:.gN³‹¾‰ÌUÈøÃ„Ðó×í•©tlƒ¼}8™ãÚÃd f+½çT4ß“xÓ©Ñb¿ö†¼-§Å¸óàzvr÷ñ•œÛå[ êàtLï¾Ðñý×ÃÙfé‡b›ï3{8;ûÙìAŽßž~jgC7ålµ.¯?A›~-ïo˜�º|²mO–Ïw©ýëöÃ'}JGWÆ�í_ô î ¾º�¡6=ÜŸÇ÷#üÍúKzx¾IÌ·o_Ù¶?�ïåÖ¶ïnü~~|ú-ÿ€ç«òØËçwÃKæìõ1{úææÕâyôebaçä¯Íåçï‹-¡üY‡K9þóÈ¡;òSHÖ¾ÝÈ�:zìÝ円zˆ[&Âþµ|t–K2+ùöÇBµ7ÛKoV—ÏGN^½ù8ºr<=ÿ�Õ,þHe¶©|óSfkßì宊ìüI?wµóÈî瘅ôâÂ~q»;a´8úäõ„õT«·çØ6>ܱî×Ów+Gf#²{t3fö-»×ßõÙNqÔÓ¡ËÓ&µ§Êw=§õA®vWx®»g víù¸EöÀ{ù~ýGl�ì”ÓŒ2ÕÇCøøæˆœŽ�ÍdîjFc,^ù43›½7?eö-Í^5¸-"ŽŸãÄ>DZ8ŽòçY~6{I*GAÆŒfמLÄë¿Í?fœ‹9ÖѱbkÊú»/ w+²– ß™ïØ¶×¶‰9rŽžÖv©ÞOÖ»TæìãòÿÎ )Ç-•Â?�W·çÝ«í«³/g­©¡ÇC�…�8Þ½8½\½êvßtÿÏÍòåÉí�îÅMk¦ÕYx½´±‘ˆåîÉåi·¥ï»Ÿ•ó�3»kÎ|ÛéÚ—ÿJ×¾¯?xõähù/ò~®ºÙ>úóÍ/Ül_jãzüaxŠ®¾[¿žÂ—ïÍF“ÖÌÑÃáÕxmét‘üu8Œ ½’ñúüì3¿_íÈPÛß•q¶þ÷ø_áöþìp»?Çž½Æ—«Y~¶«ðƒslŸ�ñ»O%Թ؜l/Ý.ï¯v÷–œÞ®,¬½Ú“[K§#ó�›Ùgó�ëÓÇ«éƒï;+ïæÙ§Çû›skço÷>BŽ1| ­¼ýUvÙ&‡jÿ~ñû9^åw³ˆ>9Äa~|:î~��Äš€¿s[Z€_òb7Xü…å÷ÖDi½®íŽç¹Ã”ûÁžg\‚àÒpšØ¯O¯b$ߊ�A®?}…/_N”N˜�¿L¢n_Úõ|òPÍX� ŽÌUœL?ÁºàeÇæO7Pm/m³'/wu³LŸÀšó×õÃ+èø4ŸÖ{3ížU>�üÛѨ]e óhDÇ×WgÿF|ÔâËÍ'Å‚7;»kûÉ—¡öÂëÛ‡g+û§;XÒ¾‰ û¥·Ÿæ­›{ÿ‰å‡´ÜÍžªÜTÞMÛôáåÖBï:™Ù¿Óùàñî弋³XöNSH—øËÿ⦉•Ç?�MÙ·-žè‰ßÏÊ}’ÿ»³O?ÓOypÞgnR±üýavûMdcÙ—¿Ÿ® µó ø¨7];ˆŠ‹²GãÛ¨Ôøçý;ÜÑ;ˆó¿¨+÷â Ç÷xÑXûY^®~~û~iy2_]]yñ6ÉŽ}Ò=ž‘h¡Qží‡�‹Q.ÒÅ÷“+ù�dÙY�[s=U£3�.)_y·øë-xˉåɲ“Ìoþ| ¼x¶|{´³ |uºtðìÁúܯ‡?6³ã<—3GHvÊžý°> úköÑȳq½Ð2‘·¿Ð°#Ô1*+#WrØÄ‡€·Ô¿Ôÿ<ùYñ–¯¹n)Ö_vâÅü´~¬7>3vüÁÛ«ì\UÍîì¯Ý™}¡Ç¿>Íì�}ü=l§�s�ìãU§�CÕnfêË“,¯˜[-ðð”å|¨mŽi+Z‡=m݉lº¶6?YÒÆ+ç!][[�6øŠÉœÖ6óÌi‹Xç)7¿Õ€S‘MW€½2dûÈEµöÜaBÝvôÃR¾ß`ȺηbŸ¤ßéf›o-¿ÌN7¯&+¤WW³O_; l|œŠÜ{"õÉÜîáÄJ~’»Ûç$÷�{¼OŸUÎqÉÊìvÑÀË¢Í|é&nKM¬?Z/°FÔ‰yð¼ž0´-Š¿d‡¹ôú$þåïuò÷`^¦^#‘1Ù,‹ö+<ÃßßÒ. dn‡³ß˜}üãU~Šú~Àª~¨ûïž¡9�ù9¿ß>@ÌUàßȯ»×ÈåJøTœ¡Úcm«‚}WЛÒséÌÃ+áhv«Pûp'… ¥;ð,®2H ÕíïßÝüž¿Õ*À�æA§éìÀÜm´øÑÕ¢kH¦�¾¿A‘ßÕéZãoÚ¢ùU:Ûsòïï…§‰Ã«ºÃÈç¥Ú„¾á.Ãøz[9ÔÏè’Ú³±óñçïÛtééDs;‡žeQW•;Ýë~lÔ•u鄹�Ëápúª2cðçv®2|‡¿ÿQ4AÖ_¼?)± sû}ïL|ù7K¨y<Ã]mìõÅ�m¬{ó[Mô6p>|g{{qg{y× _õkyWûƒ†ñõ者°±ï·w›�÷‡þå:Ô®×Äñ¯»ôA?¹¿ÛW™õgãý×¾+¾0)ÃàÆ÷;öû‹[}·â]†qU]¿O–ÝŽÜ­û„#2½þX41<úöëk·‰ããÚ1 �È•^w…4èÃWǤÊÞ²®&Ž¿_ßÕ[_Ü't`:þU]à}óäAvy|;쾿<ùþŸ³ëîojÑ�r§¸Ûü±;ô›ýŽéïßmLôcú­nZ<6b›gÿÓ}ýõ[Ù9º:úqm»Qj¢gœ¯®]œžw¯¶Ž~tû·î8ëÍE7 ŠhÏ>=Ý7ŽÄy!@bšèpÒHbHâú�$HˆHºC·æ&ôÿÞ÷˜BU¥ÐXÊIš*Æ[ÓqG^ɘÆBA|ø1D !cAeÊxRbL`D(„!RQˆ „ iˆ 0z6ŠË�RZR ‰’�·Oþø2-#š°8‘¡£gnb÷�4“M8MÒHÊTKJ«=§ ?Ð&#$‚QÇi¬„H«ÚóHax,&yK•VF+ªds ˜¥O"žH«’¤j¼I ~¸"Äz–äÃZ(ŸÙë瘀Y) ygî¾Ú\ª¢âV ã—……•Á�·Ø\Ê# Õ‚Š!Ä%¢"$á­K)Ô ¨j^‚+#:‹Á/)A9Š�ü|Hخդ€«²ß�­“!È–#ˆ:pXá0”�°˜Äðe�hÞ`‘w¡˜‚ØÃ…™ÿ”Æ`pip§àÁ &î&QXÀDCPD©4ÑWb‘´�ãD7¥�„ þ.†É…vh$8�0 %ŠÀ<ÃrÁi‡KI‰#°0xƒJ0aSÌ"•€ÛäÐ4F¼‰ÀZ`…Àècm°1¸Ö8Áê F�Í�HØCk¨=’fªiRB`g¬éJá+°(ZKC®é]®ØkÊ"¦®‹¸G`@e!JS=åp9ÆaQB’+¸*Ä T˜U R�n E¤ÄtH‚ôj%Wb³A“i ­‹rFªj/´·R"9ê„pK`HÆÌœBðMc0§­ /“D¡º�`†`VÁñ;Ö®Ò´*9Õ—J"Rô’ »œF?„>öö†€-¶8ä¨TŸQÁ¦p)‚ö$OpE;°º¤n'Eÿ–)TUÇ ^áÕ¹’à€À4\¡^ÓÐílq4^»üzc‰¹ªI0k×E é A ([t,°%�A¢W�²š—–…I” �̧¯¬.ú@êo�ë…´UØvòU*`d ´CÀ=ƒ++_^ë°,Añ0ÄÌ!�+>„ôl�âL¦p±´ây0ˆB32"™sªú/0Nƒ" rb{¥7(�¹s‰³0=N{Ü)TÚ! àhú~ªŽãi ß~r?£§ kXGà.ÁÛĘÀ€BŒb¡A &j*ãëhR•IM2è õX}.Ä&G`c¬×!&½xYˆ’ž.eBLFœêI�\‚@Y–éÍ–bÈ;P&?Å ¬"cXPE÷4ãà–}ªM¹7ï„™˜q@‰ ‹$ÆD°§Ö�¿b�B �% úÁ2,i $æo\B1 z…ÿú¨ú ´„ pJõM¨u8a #PÚŒv\À „á2ôFJU„ 5Ý'AÐ Š€WúÙŠÔ—c�åÄ1æ XU„$(A·ÔÓŸšá¸µ *€ŽÛË�‰ÅÆak3…ñÁpõš q¨Dsþ …hDŒï‚ô85z7s©0¯´”(j4¼Ü=µ_‚ÊR).>HøyO¹C°‡øÊ”b¤”ãº. Ab©••ÊAB„CL�|ÒD°¹„§ÚîPLÃÅ„£% ¸3”Á}L-@�U‡äfK€§8U&6%JÏ ‰Ó]ÈeÀ¨ q†@é­î ¸LRSš&‡AD׺ÂRݪ' ]”u 4³A¶Ï­ùán3ÔÏD˜N,Ñö NL n€áT¥E;¸3 B�}J̳!.cj “ʼnI„2ðФ·³›í �™$Æ2Sj&Ôìf»—ƒ²¯"îLçøN·yOKàƒ°ÛÅà!¶1ãšÁš¹LÒlðA%þ©ŠÊÄlfVr–éAÙé2{ }d@9hÐV0Ú㼕?TYĉ°ø3×­EpíB±Ápq›M ú´ª±ûPX¥Æf~ݧ;O½œ'³_Ü#¤xÅ,8¤3åq÷Z…G÷8¿„˜áúƒ€ÁÜV²Bf)̾ èp!€­öÉT2¢#ÀìNUj],6-õî5à· e! á\Q¹BUçXç¼zBCÕ5R�ÑÝÓ¹�€jÑéÖd•ƒ¡a‘$$$…�´koX-Ü LaõîÊ@S¥â=�rÂ<ü1LVDàý´"C«®OéÝUs-¦0`Š^' ™¢.$!XÕD–ö‰4Õ¦{9N«BP‡WûÔkL²èS¦H%ªBÜ,aW¨zÜW9SÒ+„[å!ϼÝ3‹ó´b­‘´öN‡dkl¼µ÷®U@J\Ä,Š:[M)Ę3SÜ#N G‚w–ÀSD‰¹‹¦ÀŸr�ºƒØ üž* ,HúS |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ÷jnø �ø �ø �ø �ø �ø �ø �ø �ø DÔ}"A˜Eøß|bB@Ö!?˜@ê€ Ž�L¨öéžÄ0Áé¹Lp„ü`‚ª&-ùÁGÆ&Ó2Lp„¼`n „À]³†À·!?˜à˜“Lp„ü`Buæî©Íõ9Þv'Ø &8B^0AÕò†� Ž�L(¦e˜àØœLpLÅ &86ç܆ü`‚Ó%?˜àùÁ„êÌÝW›ë=¼"uÀHL 5Àpþƒ ¸ÙpÛ.&`¥°R � ˜bÀ„8 ‚ ¸‘Üåê!/˜€— ‚ ¸Ê`‚Þ7 &èÁ‡ÀÜÇ€ (\/˜Pê&¸½ñ€ `‚«˜àêØ&¸såœY÷ƒ Ž�L(,q˜àX´Lp–…LpW—LpV©LpÖºLp}†Lp=�L a0�ÔHL a0¡êÛÿ=`‚ª&¨:`BaÐÀGÈ&¨:`‚ª& …Lpd|`‚ú·‚ ޶ý`‚#ä - UzÁtA0Áòƒ Îåü`‚#äªzúgÁtØA0϶ƒ`‚Û’Lè¹Ü=µ_˜PÌÍ0Áòƒ ®�L�a0AÖdL�a0AÖdL�a0AÖdLPa0AÕTLPa0AÕTLPa0AÕTLPa0A…Á(²B`ŠÀÜb‚ è¦`"80œ ˜€NLÀ >&è: &`Ñ�¯ € ÏÁÌ©ƒ xÚ0¥� ˜R‡ÀH0�„Á'¡ð� ®ˆLp/˜P�!ÿ0˜ ê€ * &¨0˜ ê€ ª˜ ê€ ª˜ Â`‚ ƒ U%þc`®ä˜P’é &húc0˜€®'&`É4‹8Lp%¼`BIÈ&¸ãö� =ú»ÇùeŸ£{Ç7øÁ„BÈ& Á„Bh˜�;µA`‚ãùü`But÷tnúp;*÷ƒ Ž�LPa0AÕT0AÕœ=D?˜à yÁט¼`‚+ä‹óƒ ®YzÁ„ê¼Ý3‹û÷?¡�ø �ø ÕÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ­>hàƒ>hàƒ>hàƒÿõü²�îçÜ4ðAÜ ø ÿê§"ð:`‚#äôÃ-B`‚+äª}ºg1Lpzî!?˜ ê€ EK~0Á‘ñ‚ δøÁWÈ&È`‚ª&È`‚kN^0Áòƒ Õ™»§6×çxÛ�`/˜àyÁQLÈ&8B^0Á™?˜àÚœL�5ÀUL�5À·K^0Áòƒ Õ™»¯6×sxe÷pƒ ®�LÐŒ & &C`‚Þš € *&¨:`‚ ƒ * &¨`‚ ƒ 2 &È:`‚»\½`‚#äd0A†Ád0A…ÁT0A…Ád0A†Ád0Á™u?˜àùÁYL�A0A…ÁULPa0A…ÁULPA0Áñ_>0Áuƒ^0Áu§ýÁ„’ãî&ôøö˜ j€ ¢˜Pô0Áòƒ ¢˜ Â`‚“PxÁWÆ&ˆ+˜àhÛ&8B^0ÁÑ’LpUéT0AÕÜËyÁWÈ&Tõôƒ ²˜ ë€ ²˜P½Ü=µ_˜PÌÍ0Áòƒ ®�Làa0�×xLàa0�×xLàa0�×xLa0AÔDLa0AÔDLa0AÔDLa0AÔdL�a0AÖdL�a0AÖdL�a0AÖTLPa0AÕTLPa0AÕTLÀ”:&ÄI 0ƒnLp ˜Pñ� ¥ÄÄ &TcÈ? &ˆ:`‚ƒ " &ˆ:`‚¨&ˆ:`‚¨&ˆ0˜ Â`BU‰ÿ˜ j€ *&¨0˜ ë€ 2 &È ˜ ë€ ²˜ j€ UýÝãü²Ïѽãü`B!4LPuÀUL(œÚ0Áõ|~0¡:º{:7}¸•ûÁGÈ&ˆ0˜ ê€ ¢˜ ê€ ²˜ ë€ ª˜ j€ ®ÅyÁ„’YzÁ„ê¼Ý3‹û÷?¡�ø �ø ÕÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ |ÐÀ­>hàƒ>hàƒ>hàƒÿõü²�îçÜ4ðAÜ ø JZ¤Ek?¿Y?î¨@õ€³ ïàÑÁ“UI1ÅÖìAêb¥¨tqdhâ¾Eë<�Ö!?ˆ 뀎�D¨öéžÀÁé¹Dp„ü «"-ùAGÆ"Ó2Dp„ü ¯"ˆ: ¯"8æä!?ˆP�¹{js}Ž³Ý ö‚Ž�D`u@„¼¡A ‚#äŠi"86çx AÔxÁé’Dp„ü Buæî«ÍõVÉ: ‚ ƒ2 "È ‚ ƒ""ˆ: ‚ƒ" "ˆ ‚ƒ< "ð: ‚»\½ ‚#äx�‡AxA„ADA„Ax�‡AxÁ™u?ˆàùA^DàAA„AQDaA„AQDaA†AYD�AA†A„ªoÿ÷€¬ˆÀꀅA!?ˆÀꀬˆP$~Á‘ñ�ìß "8ÚöƒŽ�D(´4DpTéDAÔœËùAGÈ"Tõôƒ¼ˆÀ뀼ˆP½Ü=µ_ˆPÌÍÁòƒ®�D a�ÖhD a�ÖhD a�ÖhD`a�ÕXD`a�ÕXD`a�ÕXD`a�ÕxDàa�×xDàa�×xDàa�×DDaAÔDDaAÔDD�aAÖdDp ˆàŠxA71ñ‚Õòƒ¬ˆÀ  ƒ¬ˆÀꀬˆÀê€, "°0ˆPUâ?"ˆ ‚‚" "ð: ƒ<"ð: ¯"ˆ BU÷8¿ìsTïø?ˆP DAÔr§6Dp<ŸD¨ŽîžÎMŸmGå~Áò�, "°: «"°: ¯"ð: ‚¨"ˆ: ‚cq~Á5K/ˆP�·{fqƒ@„Ôƒ@ê'¡�cx΋'„€ûó 0Lºð1 |1nspΨÄwD .Q¡§¡ô؆ìAϯ4¸¯AÊó$„ÿŸL²(þ(�ä‡&)¶'xÚ‚ pD8Ó;»TÚJSŸéê^«|hP)Ud(�+2R/E÷Rú„7Ø›{fónlø‹†¿¨·ä 5µ6n¬bä:ÓÿáÊàé¡vÿ)n=`ÚžêÀYV%„NeaiÊô„™ ~Fyn'([j)Á­—²þN¹K`FFävÂ+k“ãqMY�eÉ @J ¾Ò#Qñ ”ˆ¸26)Í–¬ˆR³ËƒyŽÍÕÆ�rK‰”Ú¡âÏ4Ú–©^2ôªP"* �|—¯æ™·{ì�R§!ujy'†÷ñY¨†`.a½j;)d`�Ÿ¢·J˪ä²â�0±×ƒS$7<Ý.µ¤ÀѱŠP"ô^£Ó'¨è�Pœ �ª—!Òã0 bˆ«—ëqø[_¬:ºXôþIÒÌR=õ¸CÂtEÄp7ضTM�@HTeª©‡�T®ÕÞî³wj˜®†éj˜®†éj˜®†éºcþâ\¦ÝÞ7Oíl±Ø†’x€§˜1ä"4±7úgæœ@ñ슘³tm‚Yn ÙZª�a!ÔSíà��ŽïM¬ÇŒ{ò¨@«B‚«Êå¤Ù©v… $ZJ«rŽ'ÒØ„£Hïvâv'MíA‚;à’DÆèæÓˆeÖ,�~rdf,ѱ •&¾WAb•˜ ܦ‚ÉåÒøÝlgúiŸO�dþS)w¾âë ÑmØÍgÎD�„Ú ‘à�è ž…•zMƒÏˆÈ± “‰¬ŒŠ€Óԗ†q› OaªÚ—�í¨Â«0VÑ1î2–Dôé}i®(ä"ÚB=‰¦Ê°#è�×~`-ëÁêµDd)ÊB},ZP)�½ë<¢hÕX_÷ÑÔTƒiÞLSò3‚Á¯ß[¶1<¡Á)„ —:„P••’·èôðS„MtjA{„p‡¹"Ôãhq[@ Q‚*á<í³‹¥ÀȪ�¬^²?#„„ ÉÝy�´(*B0Š ô›Ñõt�뻆 ½Ÿ-R]÷T ¨Z¤Ë�J´@-€5ÑÅ¥yV+„„Þ÷„ø�-‡´ŒÓb…nìk!Èn-@Ù³�ʺ%¼½;†¹¶ž>1ø®Öä'ˆS2L^++ÌÂ40Sà •è^aͦzZ¸€ Á2Ì,ª}Jˆq-a=ý©i1«¥`–íFGá5„f–qµ@gG§ì󡍯³¸dÌnøàÜ%FOȹV„0YÒz ^®Á¶l»Á¶l»Á¶l»Á¶l{0¶ õ,Ö` ïa b½n~h:×®Ö#“(Xú¨D¸ÉÁÛÛí‹PŸFhogö±°ÑÌip#Æk3½Åa U%ÆP³éŠgÊ&Ðæscîvs)Ö¬CIæÇ,·!H�ÀŠLÀÞKÄ6Ø!7î6  fF_*É šÓ0;e¾2®�wØp› Ñ?#’årX¼ã 2§Þ#1ñ!³u°&¦½6É�—`šÆ†PdwÐ)ÖZ}Y~‘QpozaáÒÖ"™G!D—«õXlCT÷v¦3Ê¡=êSôþ4Ò!� ª])jj;d>iI$†×ä™×Ödº¹T.$2B—ef¬l;Äîüâ£�ôa{>™¨ T ·Yƒ5 Hr²h�ŽþDOTv!žÔ$T9¢�° &›µep@Y.½`u¦-ÇMà¾fEÚD"r×Õ+Ä 0îõ8jyñ°Sú£\"‹%Ñc§Úãý( Ã9eWœˆJ¿¡Ò« As¦öèó!ÝîÓ’~ˆÎ^Xß»ÂuóJ…]¤°pÍâRF×`¾±±ŽÌñÀ&^“—ö´¯L†›eÊܘPœ»A3›á“¼&Dв¯šsJÍ…eÒEä`ôv¾m¥èŠ‚.ÚÄ4µK»â jäĬbÔƒvqŒ*kÎV5�uo`¾†5rL´j ÷Î'®–’9÷º¦8aÆœƒvñ§Ìнh=Û¦·•„7³§ÝÙœíÄ8‘%rÂÔ= %–¹Y ‹@;_¶äK4x¡Ÿ`n½nýà´gGù‰ 6öåF nUOÆ &Ò,Oeª„5ö,N€7F(«²Ò•3n±3‹JAœ�qYDô¤)àóí¥r¡Ô¸ŒÁg€!ëÜ»œmhÒžì>ÅßÔ�ÖnÐ`nl7ülÍÂ9OìTáM \ ÇM†–eD�û¥fiqÛN��¢m´\ì#‚6°TÇÞ›{›{›{›{›{ïâùn4Ú>± )SÐêÒ•agL‘ÞÔºŒ¡ 2w¸%=Búl¯,ÄH¥ú 5�æHz…¸¹°êí7Ç-‡Íc»ÏVÞÜéÙÜéYcýâï­X6°jãP’p<‰/Éô,M‚ÛIÐoó;!X´²"„gi“)áÒ Ü}I%>yšUw¢*yZŠ ÉJ²�b¨EÓ´z9YJ ¹áAðª”ËœrÃQA¯CP¶*Ôãx |6zùüöº0¦ô]5®Põþ#¼T•¯æ™¹{æ�êܼ¹8Ô^؇+§›Gÿí^MOµÛ;G_ºo®ŽÎλWC_®�þ§Û:º¸Àö»?á“Ö—«îõÍåU·uýõò?ø|%o·W¶W‡þ£÷H• endstream endobj 21 0 obj [/ICCBased 27 0 R] endobj 7 0 obj [6 0 R 5 0 R] endobj 40 0 obj <> endobj xref 0 41 0000000000 65535 f 0000000016 00000 n 0000000156 00000 n 0000038280 00000 n 0000000000 00000 f 0000053108 00000 n 0000053178 00000 n 0000378446 00000 n 0000038331 00000 n 0000038793 00000 n 0000041265 00000 n 0000053839 00000 n 0000050299 00000 n 0000050186 00000 n 0000053480 00000 n 0000053603 00000 n 0000053716 00000 n 0000042272 00000 n 0000044889 00000 n 0000047506 00000 n 0000041327 00000 n 0000378411 00000 n 0000041711 00000 n 0000041759 00000 n 0000053045 00000 n 0000052982 00000 n 0000050123 00000 n 0000050334 00000 n 0000053364 00000 n 0000053395 00000 n 0000053248 00000 n 0000053279 00000 n 0000053913 00000 n 0000054175 00000 n 0000055286 00000 n 0000067808 00000 n 0000133396 00000 n 0000198984 00000 n 0000264572 00000 n 0000330160 00000 n 0000378475 00000 n trailer <<0C9D12E6EE994682A6EAD56912419B86>]>> startxref 378666 %%EOF immutable-js-immutable-js-6a01d72/resources/identity.svg000066400000000000000000000344021522056416100234110ustar00rootroot00000000000000 immutable-js-immutable-js-6a01d72/resources/jestPreprocessor.js000066400000000000000000000035331522056416100247520ustar00rootroot00000000000000const makeSynchronous = require('make-synchronous'); var typescript = require('typescript'); const TYPESCRIPT_OPTIONS = { noEmitOnError: true, target: typescript.ScriptTarget.ES2022, module: typescript.ModuleKind.CommonJS, sourceMap: true, inlineSourceMap: true, esModuleInterop: true, }; function transpileTypeScript(src, path) { return typescript.transpile(src, TYPESCRIPT_OPTIONS, path, []); } function transpileJavaScript(src, path) { // Need to make this sync by calling `makeSynchronous` // while https://github.com/facebook/jest/issues/9504 is not resolved const fn = makeSynchronous(async (path) => { const rollup = require('rollup'); const buble = require('@rollup/plugin-buble'); const commonjs = require('@rollup/plugin-commonjs'); const json = require('@rollup/plugin-json'); const typescript = require('@rollup/plugin-typescript'); // same input options as in rollup-config.js const inputOptions = { input: path, onwarn: () => {}, plugins: [commonjs(), json(), typescript(), buble()], }; const bundle = await rollup.rollup(inputOptions); const { output } = await bundle.generate({ file: path, format: 'cjs', sourcemap: true, }); await bundle.close(); const { code, map } = output[0]; if (!code) { throw new Error( 'Unable to get code from rollup output in jestPreprocessor. Did rollup version changed ?' ); } return { code, map }; }); return fn(path); } module.exports = { process(src, path) { if (path.endsWith('.ts') || path.endsWith('.tsx')) { return { code: transpileTypeScript(src, path) }; } return transpileJavaScript(src, path); }, getCacheKey() { // ignore cache, as there is a conflict between rollup compile and jest preprocessor. return Date.now().toString(); }, }; immutable-js-immutable-js-6a01d72/resources/jestResolver.js000066400000000000000000000011251522056416100240600ustar00rootroot00000000000000const path = require('path'); const pkg = require('../package.json'); module.exports = (request, options) => { if (request === 'immutable') { if (process.env.CI) { // In CI environment, test the real built file to be sure that the build is not broken return path.resolve(options.rootDir, pkg.main); } // In development mode, we want sourcemaps, live reload, etc., so point to the src/ directory return `${options.rootDir}/src/Immutable.js`; } // Call the defaultResolver, if we want to load non-immutable return options.defaultResolver(request, options); }; immutable-js-immutable-js-6a01d72/resources/prepare-dist.sh000077500000000000000000000014461522056416100237770ustar00rootroot00000000000000#!/bin/sh -e # This script prepares an npm directory with files safe to publish to npm or the # npm git branch: # # "immutable": "git://github.com/immutable-js/immutable-js.git#npm" # # Create empty npm directory rm -rf npm mkdir -p npm # Copy over necessary files cp -r dist npm/ cp README.md npm/ cp LICENSE npm/ # Ensure a vanilla package.json before deploying so other tools do not interpret # The built output as requiring any further transformation. node -e "var package = require('./package.json'); \ package = Object.fromEntries(Object.entries(package).filter(([key]) => package.publishKeys.includes(key))); \ require('fs').writeFileSync('./npm/package.json', JSON.stringify(package, null, 2));" # Retain marginal support for bower on the npm branch cp npm/package.json npm/bower.json immutable-js-immutable-js-6a01d72/resources/react-global.js000066400000000000000000000000371522056416100237260ustar00rootroot00000000000000module.exports = global.React; immutable-js-immutable-js-6a01d72/resources/rollup-config.mjs000066400000000000000000000024201522056416100243250ustar00rootroot00000000000000import path from 'path'; import buble from '@rollup/plugin-buble'; import commonjs from '@rollup/plugin-commonjs'; import json from '@rollup/plugin-json'; import terser from '@rollup/plugin-terser'; // TODO replace @rollup/plugin-typescript with babel after babel migration import typescript from '@rollup/plugin-typescript'; import copyright from './copyright.mjs'; const SRC_DIR = path.resolve('src'); const DIST_DIR = path.resolve('dist'); export default [ { input: path.join(SRC_DIR, 'Immutable.js'), plugins: [commonjs(), json(), typescript(), buble()], output: [ // umd build { banner: copyright, name: 'Immutable', exports: 'named', file: path.join(DIST_DIR, 'immutable.js'), format: 'umd', sourcemap: false, }, // minified build for browsers { banner: copyright, name: 'Immutable', exports: 'named', file: path.join(DIST_DIR, 'immutable.min.js'), format: 'umd', sourcemap: false, plugins: [terser()], }, // es build for bundlers and node { banner: copyright, name: 'Immutable', file: path.join(DIST_DIR, 'immutable.es.js'), format: 'es', sourcemap: false, }, ], }, ]; immutable-js-immutable-js-6a01d72/src/000077500000000000000000000000001522056416100176115ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/src/Collection.js000066400000000000000000000021661522056416100222470ustar00rootroot00000000000000import { IndexedSeq, KeyedSeq, Seq, SetSeq } from './Seq'; import { isAssociative } from './predicates/isAssociative'; import { isCollection } from './predicates/isCollection'; import { isIndexed } from './predicates/isIndexed'; import { isKeyed } from './predicates/isKeyed'; export class Collection { constructor(value) { // eslint-disable-next-line no-constructor-return return isCollection(value) ? value : Seq(value); } } export class KeyedCollection extends Collection { constructor(value) { // eslint-disable-next-line no-constructor-return return isKeyed(value) ? value : KeyedSeq(value); } } export class IndexedCollection extends Collection { constructor(value) { // eslint-disable-next-line no-constructor-return return isIndexed(value) ? value : IndexedSeq(value); } } export class SetCollection extends Collection { constructor(value) { // eslint-disable-next-line no-constructor-return return isCollection(value) && !isAssociative(value) ? value : SetSeq(value); } } Collection.Keyed = KeyedCollection; Collection.Indexed = IndexedCollection; Collection.Set = SetCollection; immutable-js-immutable-js-6a01d72/src/CollectionHelperMethods.ts000066400000000000000000000030771522056416100247470ustar00rootroot00000000000000import type { Collection } from '../type-definitions/immutable'; import assertNotInfinite from './utils/assertNotInfinite'; export function reduce>( collection: C, reducer: (reduction: V | R, value: V, key: K, iter: C) => R, reduction: V | R | undefined, context: unknown, useFirst: boolean, reverse: boolean ): V | R | undefined { // @ts-expect-error Migrate to CollectionImpl in v6 assertNotInfinite(collection.size); // @ts-expect-error Migrate to CollectionImpl in v6 collection.__iterate((v: V, k: K, c: C) => { if (useFirst) { useFirst = false; reduction = v; } else { // `reduction` has already been seeded here (either with the provided // initial value or with the first iterated value), so it is never the // `undefined` placeholder — only a `V` or a `R`. reduction = reducer.call(context, reduction!, v, k, c); } }, reverse); return reduction; } export function keyMapper(v: V, k: K): K { return k; } export function entryMapper(v: V, k: K): [K, V] { return [k, v]; } export function not(predicate: (...args: unknown[]) => boolean) { return function (this: unknown, ...args: unknown[]): boolean { return !predicate.apply(this, args); }; } export function neg(predicate: (...args: unknown[]) => number) { return function (this: unknown, ...args: unknown[]): number { return -predicate.apply(this, args); }; } export function defaultNegComparator( a: number | string, b: number | string ): number { return a < b ? 1 : a > b ? -1 : 0; } immutable-js-immutable-js-6a01d72/src/CollectionImpl.js000066400000000000000000000411451522056416100230710ustar00rootroot00000000000000import { Collection, IndexedCollection, KeyedCollection, SetCollection, } from './Collection'; import { defaultNegComparator, entryMapper, keyMapper, neg, not, reduce, } from './CollectionHelperMethods'; import { ITERATE_ENTRIES, ITERATE_KEYS, ITERATE_VALUES, Iterator, ITERATOR_SYMBOL, } from './Iterator'; import { List } from './List'; import { Map } from './Map'; import { FromEntriesSequence, ToIndexedSequence, ToKeyedSequence, ToSetSequence, concatFactory, countByFactory, filterFactory, flatMapFactory, flattenFactory, flipFactory, groupByFactory, interposeFactory, mapFactory, maxFactory, partitionFactory, reify, reverseFactory, skipWhileFactory, sliceFactory, sortFactory, takeWhileFactory, zipWithFactory, } from './Operations'; import { OrderedMap } from './OrderedMap'; import { OrderedSet } from './OrderedSet'; import { Range } from './Range'; import { ArraySeq, IndexedSeq, KeyedSeq, SetSeq } from './Seq'; import { Set } from './Set'; import { Stack } from './Stack'; import { NOT_SET, ensureSize, resolveBegin, returnTrue, wrapIndex, } from './TrieUtils'; import { is } from './is'; import { getIn } from './methods/getIn'; import { hasIn } from './methods/hasIn'; import { toObject } from './methods/toObject'; import { IS_COLLECTION_SYMBOL } from './predicates/isCollection'; import { isIndexed, IS_INDEXED_SYMBOL } from './predicates/isIndexed'; import { isKeyed, IS_KEYED_SYMBOL } from './predicates/isKeyed'; import { IS_ORDERED_SYMBOL } from './predicates/isOrdered'; import { toJS } from './toJS'; import arrCopy from './utils/arrCopy'; import assertNotInfinite from './utils/assertNotInfinite'; import deepEqual from './utils/deepEqual'; import { hashCollection } from './utils/hasCollection'; import mixin from './utils/mixin'; import quoteString from './utils/quoteString'; export { Collection, CollectionPrototype, IndexedCollectionPrototype }; Collection.Iterator = Iterator; mixin(Collection, { // ### Conversion to other types toArray() { assertNotInfinite(this.size); const array = new Array(this.size || 0); const useTuples = isKeyed(this); let i = 0; this.__iterate((v, k) => { // Keyed collections produce an array of tuples. array[i++] = useTuples ? [k, v] : v; }); return array; }, toIndexedSeq() { return new ToIndexedSequence(this); }, toJS() { return toJS(this); }, toKeyedSeq() { return new ToKeyedSequence(this, true); }, toMap() { // Use Late Binding here to solve the circular dependency. return Map(this.toKeyedSeq()); }, toObject: toObject, toOrderedMap() { // Use Late Binding here to solve the circular dependency. return OrderedMap(this.toKeyedSeq()); }, toOrderedSet() { // Use Late Binding here to solve the circular dependency. return OrderedSet(isKeyed(this) ? this.valueSeq() : this); }, toSet() { // Use Late Binding here to solve the circular dependency. return Set(isKeyed(this) ? this.valueSeq() : this); }, toSetSeq() { return new ToSetSequence(this); }, toSeq() { return isIndexed(this) ? this.toIndexedSeq() : isKeyed(this) ? this.toKeyedSeq() : this.toSetSeq(); }, toStack() { // Use Late Binding here to solve the circular dependency. return Stack(isKeyed(this) ? this.valueSeq() : this); }, toList() { // Use Late Binding here to solve the circular dependency. return List(isKeyed(this) ? this.valueSeq() : this); }, // ### Common JavaScript methods and properties toString() { return '[Collection]'; }, __toString(head, tail) { if (this.size === 0) { return head + tail; } return ( head + ' ' + this.toSeq().map(this.__toStringMapper).join(', ') + ' ' + tail ); }, // ### ES6 Collection methods (ES6 Array and Map) concat(...values) { return reify(this, concatFactory(this, values)); }, includes(searchValue) { return this.some((value) => is(value, searchValue)); }, entries() { return this.__iterator(ITERATE_ENTRIES); }, every(predicate, context) { assertNotInfinite(this.size); let returnValue = true; this.__iterate((v, k, c) => { if (!predicate.call(context, v, k, c)) { returnValue = false; return false; } }); return returnValue; }, filter(predicate, context) { return reify(this, filterFactory(this, predicate, context, true)); }, partition(predicate, context) { return partitionFactory(this, predicate, context); }, find(predicate, context, notSetValue) { const entry = this.findEntry(predicate, context); return entry ? entry[1] : notSetValue; }, forEach(sideEffect, context) { assertNotInfinite(this.size); return this.__iterate(context ? sideEffect.bind(context) : sideEffect); }, join(separator) { assertNotInfinite(this.size); separator = separator !== undefined ? '' + separator : ','; let joined = ''; let isFirst = true; this.__iterate((v) => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here isFirst ? (isFirst = false) : (joined += separator); joined += v !== null && v !== undefined ? v.toString() : ''; }); return joined; }, keys() { return this.__iterator(ITERATE_KEYS); }, map(mapper, context) { return reify(this, mapFactory(this, mapper, context)); }, reduce(reducer, initialReduction, context) { return reduce( this, reducer, initialReduction, context, arguments.length < 2, false ); }, reduceRight(reducer, initialReduction, context) { return reduce( this, reducer, initialReduction, context, arguments.length < 2, true ); }, reverse() { return reify(this, reverseFactory(this, true)); }, slice(begin, end) { return reify(this, sliceFactory(this, begin, end, true)); }, some(predicate, context) { assertNotInfinite(this.size); let returnValue = false; this.__iterate((v, k, c) => { if (predicate.call(context, v, k, c)) { returnValue = true; return false; } }); return returnValue; }, sort(comparator) { return reify(this, sortFactory(this, comparator)); }, values() { return this.__iterator(ITERATE_VALUES); }, // ### More sequential methods butLast() { return this.slice(0, -1); }, isEmpty() { return this.size !== undefined ? this.size === 0 : !this.some(() => true); }, count(predicate, context) { return ensureSize( predicate ? this.toSeq().filter(predicate, context) : this ); }, countBy(grouper, context) { return countByFactory(this, grouper, context); }, equals(other) { return deepEqual(this, other); }, entrySeq() { // eslint-disable-next-line @typescript-eslint/no-this-alias const collection = this; if (collection._cache) { // We cache as an entries array, so we can just return the cache! return new ArraySeq(collection._cache); } const entriesSequence = collection.toSeq().map(entryMapper).toIndexedSeq(); entriesSequence.fromEntrySeq = () => collection.toSeq(); return entriesSequence; }, filterNot(predicate, context) { return this.filter(not(predicate), context); }, findEntry(predicate, context, notSetValue) { let found = notSetValue; this.__iterate((v, k, c) => { if (predicate.call(context, v, k, c)) { found = [k, v]; return false; } }); return found; }, findKey(predicate, context) { const entry = this.findEntry(predicate, context); return entry && entry[0]; }, findLast(predicate, context, notSetValue) { return this.toKeyedSeq().reverse().find(predicate, context, notSetValue); }, findLastEntry(predicate, context, notSetValue) { return this.toKeyedSeq() .reverse() .findEntry(predicate, context, notSetValue); }, findLastKey(predicate, context) { return this.toKeyedSeq().reverse().findKey(predicate, context); }, first(notSetValue) { return this.find(returnTrue, null, notSetValue); }, flatMap(mapper, context) { return reify(this, flatMapFactory(this, mapper, context)); }, flatten(depth) { return reify(this, flattenFactory(this, depth, true)); }, fromEntrySeq() { return new FromEntriesSequence(this); }, get(searchKey, notSetValue) { return this.find((_, key) => is(key, searchKey), undefined, notSetValue); }, getIn: getIn, groupBy(grouper, context) { return groupByFactory(this, grouper, context); }, has(searchKey) { return this.get(searchKey, NOT_SET) !== NOT_SET; }, hasIn: hasIn, isSubset(iter) { iter = typeof iter.includes === 'function' ? iter : Collection(iter); return this.every((value) => iter.includes(value)); }, isSuperset(iter) { iter = typeof iter.isSubset === 'function' ? iter : Collection(iter); return iter.isSubset(this); }, keyOf(searchValue) { return this.findKey((value) => is(value, searchValue)); }, keySeq() { return this.toSeq().map(keyMapper).toIndexedSeq(); }, last(notSetValue) { return this.toSeq().reverse().first(notSetValue); }, lastKeyOf(searchValue) { return this.toKeyedSeq().reverse().keyOf(searchValue); }, max(comparator) { return maxFactory(this, comparator); }, maxBy(mapper, comparator) { return maxFactory(this, comparator, mapper); }, min(comparator) { return maxFactory( this, comparator ? neg(comparator) : defaultNegComparator ); }, minBy(mapper, comparator) { return maxFactory( this, comparator ? neg(comparator) : defaultNegComparator, mapper ); }, rest() { return this.slice(1); }, skip(amount) { return amount === 0 ? this : this.slice(Math.max(0, amount)); }, skipLast(amount) { return amount === 0 ? this : this.slice(0, -Math.max(0, amount)); }, skipWhile(predicate, context) { return reify(this, skipWhileFactory(this, predicate, context, true)); }, skipUntil(predicate, context) { return this.skipWhile(not(predicate), context); }, sortBy(mapper, comparator) { return reify(this, sortFactory(this, comparator, mapper)); }, take(amount) { return this.slice(0, Math.max(0, amount)); }, takeLast(amount) { return this.slice(-Math.max(0, amount)); }, takeWhile(predicate, context) { return reify(this, takeWhileFactory(this, predicate, context)); }, takeUntil(predicate, context) { return this.takeWhile(not(predicate), context); }, update(fn) { return fn(this); }, valueSeq() { return this.toIndexedSeq(); }, // ### Hashable Object hashCode() { return this.__hash || (this.__hash = hashCollection(this)); }, // ### Internal // abstract __iterate(fn, reverse) // abstract __iterator(type, reverse) }); const CollectionPrototype = Collection.prototype; CollectionPrototype[IS_COLLECTION_SYMBOL] = true; CollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.values; CollectionPrototype.toJSON = CollectionPrototype.toArray; CollectionPrototype.__toStringMapper = quoteString; CollectionPrototype.inspect = CollectionPrototype.toSource = function () { return this.toString(); }; CollectionPrototype.chain = CollectionPrototype.flatMap; CollectionPrototype.contains = CollectionPrototype.includes; mixin(KeyedCollection, { // ### More sequential methods flip() { return reify(this, flipFactory(this)); }, mapEntries(mapper, context) { let iterations = 0; return reify( this, this.toSeq() .map((v, k) => mapper.call(context, [k, v], iterations++, this)) .fromEntrySeq() ); }, mapKeys(mapper, context) { return reify( this, this.toSeq() .flip() .map((k, v) => mapper.call(context, k, v, this)) .flip() ); }, }); const KeyedCollectionPrototype = KeyedCollection.prototype; KeyedCollectionPrototype[IS_KEYED_SYMBOL] = true; KeyedCollectionPrototype[ITERATOR_SYMBOL] = CollectionPrototype.entries; KeyedCollectionPrototype.toJSON = toObject; KeyedCollectionPrototype.__toStringMapper = (v, k) => quoteString(k) + ': ' + quoteString(v); mixin(IndexedCollection, { // ### Conversion to other types toKeyedSeq() { return new ToKeyedSequence(this, false); }, // ### ES6 Collection methods (ES6 Array and Map) filter(predicate, context) { return reify(this, filterFactory(this, predicate, context, false)); }, findIndex(predicate, context) { const entry = this.findEntry(predicate, context); return entry ? entry[0] : -1; }, indexOf(searchValue) { const key = this.keyOf(searchValue); return key === undefined ? -1 : key; }, lastIndexOf(searchValue) { const key = this.lastKeyOf(searchValue); return key === undefined ? -1 : key; }, reverse() { return reify(this, reverseFactory(this, false)); }, slice(begin, end) { return reify(this, sliceFactory(this, begin, end, false)); }, splice(index, removeNum /*, ...values*/) { const numArgs = arguments.length; removeNum = Math.max(removeNum || 0, 0); if (numArgs === 0 || (numArgs === 2 && !removeNum)) { return this; } // If index is negative, it should resolve relative to the size of the // collection. However size may be expensive to compute if not cached, so // only call count() if the number is in fact negative. index = resolveBegin(index, index < 0 ? this.count() : this.size); const spliced = this.slice(0, index); return reify( this, numArgs === 1 ? spliced : spliced.concat(arrCopy(arguments, 2), this.slice(index + removeNum)) ); }, // ### More collection methods findLastIndex(predicate, context) { const entry = this.findLastEntry(predicate, context); return entry ? entry[0] : -1; }, first(notSetValue) { return this.get(0, notSetValue); }, flatten(depth) { return reify(this, flattenFactory(this, depth, false)); }, get(index, notSetValue) { index = wrapIndex(this, index); return index < 0 || this.size === Infinity || (this.size !== undefined && index > this.size) ? notSetValue : this.find((_, key) => key === index, undefined, notSetValue); }, has(index) { index = wrapIndex(this, index); return ( index >= 0 && (this.size !== undefined ? this.size === Infinity || index < this.size : this.find((_, key) => key === index, undefined, NOT_SET) !== NOT_SET) ); }, interpose(separator) { return reify(this, interposeFactory(this, separator)); }, interleave(/*...collections*/) { const collections = [this].concat(arrCopy(arguments)); const zipped = zipWithFactory(this.toSeq(), IndexedSeq.of, collections); const interleaved = zipped.flatten(true); if (zipped.size) { interleaved.size = zipped.size * collections.length; } return reify(this, interleaved); }, keySeq() { return Range(0, this.size); }, last(notSetValue) { return this.get(-1, notSetValue); }, skipWhile(predicate, context) { return reify(this, skipWhileFactory(this, predicate, context, false)); }, zip(/*, ...collections */) { const collections = [this].concat(arrCopy(arguments)); return reify(this, zipWithFactory(this, defaultZipper, collections)); }, zipAll(/*, ...collections */) { const collections = [this].concat(arrCopy(arguments)); return reify(this, zipWithFactory(this, defaultZipper, collections, true)); }, zipWith(zipper /*, ...collections */) { const collections = arrCopy(arguments); collections[0] = this; return reify(this, zipWithFactory(this, zipper, collections)); }, }); const IndexedCollectionPrototype = IndexedCollection.prototype; IndexedCollectionPrototype[IS_INDEXED_SYMBOL] = true; IndexedCollectionPrototype[IS_ORDERED_SYMBOL] = true; mixin(SetCollection, { // ### ES6 Collection methods (ES6 Array and Map) get(value, notSetValue) { return this.has(value) ? value : notSetValue; }, includes(value) { return this.has(value); }, // ### More sequential methods keySeq() { return this.valueSeq(); }, }); const SetCollectionPrototype = SetCollection.prototype; SetCollectionPrototype.has = CollectionPrototype.includes; SetCollectionPrototype.contains = SetCollectionPrototype.includes; SetCollectionPrototype.keys = SetCollectionPrototype.values; // Mixin subclasses mixin(KeyedSeq, KeyedCollectionPrototype); mixin(IndexedSeq, IndexedCollectionPrototype); mixin(SetSeq, SetCollectionPrototype); // #pragma Helper functions function defaultZipper() { return arrCopy(arguments); } immutable-js-immutable-js-6a01d72/src/Hash.ts000066400000000000000000000213461522056416100210520ustar00rootroot00000000000000import { smi } from './Math'; const defaultValueOf = Object.prototype.valueOf; export function hash(o: unknown): number { // eslint-disable-next-line eqeqeq if (o == null) { return hashNullish(o); } // @ts-expect-error don't care about object beeing typed as `{}` here if (typeof o.hashCode === 'function') { // Drop any high bits from accidentally long hash codes. // @ts-expect-error don't care about object beeing typed as `{}` here return smi(o.hashCode(o)); } const v = valueOf(o); // eslint-disable-next-line eqeqeq if (v == null) { return hashNullish(v); } switch (typeof v) { case 'boolean': // The hash values for built-in constants are a 1 value for each 5-byte // shift region expect for the first, which encodes the value. This // reduces the odds of a hash collision for these common values. return v ? 0x42108421 : 0x42108420; case 'number': return hashNumber(v); case 'string': return v.length > STRING_HASH_CACHE_MIN_STRLEN ? cachedHashString(v) : hashString(v); case 'object': case 'function': return hashJSObj(v); case 'symbol': return hashSymbol(v); default: if (typeof v.toString === 'function') { return hashString(v.toString()); } throw new Error('Value type ' + typeof v + ' cannot be hashed.'); } } function hashNullish(nullish: null | undefined): number { return nullish === null ? 0x42108422 : /* undefined */ 0x42108423; } // Compress arbitrarily large numbers into smi hashes. function hashNumber(n: number): number { if (n !== n || n === Infinity) { return 0; } let hash = n | 0; if (hash !== n) { hash ^= n * 0xffffffff; } while (n > 0xffffffff) { n /= 0xffffffff; hash ^= n; } return smi(hash); } function cachedHashString(string: string): number { let hashed = stringHashCache[string]; if (hashed === undefined) { hashed = hashString(string); if (STRING_HASH_CACHE_SIZE === STRING_HASH_CACHE_MAX_SIZE) { STRING_HASH_CACHE_SIZE = 0; stringHashCache = {}; } STRING_HASH_CACHE_SIZE++; stringHashCache[string] = hashed; } return hashed; } // http://jsperf.com/hashing-strings function hashString(string: string): number { // This is the hash from JVM // The hash code for a string is computed as // s[0] * 31 ^ (n - 1) + s[1] * 31 ^ (n - 2) + ... + s[n - 1], // where s[i] is the ith character of the string and n is the length of // the string. We "mod" the result to make it between 0 (inclusive) and 2^31 // (exclusive) by dropping high bits. let hashed = 0; for (let ii = 0; ii < string.length; ii++) { hashed = (31 * hashed + string.charCodeAt(ii)) | 0; } return smi(hashed); } // Per-process seed for the secondary collision hash. Never exposed nor // serialized, so the public `hash()` stays deterministic. An odd base in // [3, 2^20) keeps `base * h` exact as a double (no `Math.imul`). const COLLISION_HASH_BASE = ((Math.random() * 0x100000) | 1) % 0x100000 || 0x9e37; // Secondary hash to index entries within a `HashCollisionNode`, where every key // shares the same primary `hash()`. Using a different, seeded base scatters // crafted collision families (e.g. "Aa"/"BB", which only collide under base 31) // that an attacker cannot precompute without the seed. It only narrows // candidates — `is()` still decides equality — so non-string keys can safely // fall back to the (here constant) primary hash and a linear scan. export function hashCollisionKey(key: unknown): number { if (typeof key !== 'string') { return hash(key); } let hashed = 0; for (let ii = 0; ii < key.length; ii++) { hashed = (COLLISION_HASH_BASE * hashed + key.charCodeAt(ii)) | 0; } return hashed; } function hashSymbol(sym: symbol): number { let hashed = symbolMap[sym]; if (hashed !== undefined) { return hashed; } hashed = nextHash(); symbolMap[sym] = hashed; return hashed; } // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type function hashJSObj(obj: object | Function): number { let hashed: number | undefined; if (usingWeakMap) { // @ts-expect-error weakMap is defined hashed = weakMap.get(obj); if (hashed !== undefined) { return hashed; } } // @ts-expect-error used for old code, will be removed hashed = obj[UID_HASH_KEY]; if (hashed !== undefined) { return hashed; } if (!canDefineProperty) { // @ts-expect-error used for old code, will be removed hashed = obj.propertyIsEnumerable && obj.propertyIsEnumerable[UID_HASH_KEY]; if (hashed !== undefined) { return hashed; } hashed = getIENodeHash(obj); if (hashed !== undefined) { return hashed; } } hashed = nextHash(); if (usingWeakMap) { // @ts-expect-error weakMap is defined weakMap.set(obj, hashed); } else if (isExtensible !== undefined && isExtensible(obj) === false) { throw new Error('Non-extensible objects are not allowed as keys.'); } else if (canDefineProperty) { Object.defineProperty(obj, UID_HASH_KEY, { enumerable: false, configurable: false, writable: false, value: hashed, }); } else if ( obj.propertyIsEnumerable !== undefined && obj.propertyIsEnumerable === obj.constructor.prototype.propertyIsEnumerable ) { // Since we can't define a non-enumerable property on the object // we'll hijack one of the less-used non-enumerable properties to // save our hash on it. Since this is a function it will not show up in // `JSON.stringify` which is what we want. obj.propertyIsEnumerable = function () { return this.constructor.prototype.propertyIsEnumerable.apply( this, // eslint-disable-next-line prefer-rest-params arguments ); }; // @ts-expect-error used for old code, will be removed obj.propertyIsEnumerable[UID_HASH_KEY] = hashed; // @ts-expect-error used for old code, will be removed } else if (obj.nodeType !== undefined) { // At this point we couldn't get the IE `uniqueID` to use as a hash // and we couldn't use a non-enumerable property to exploit the // dontEnum bug so we simply add the `UID_HASH_KEY` on the node // itself. // @ts-expect-error used for old code, will be removed obj[UID_HASH_KEY] = hashed; } else { throw new Error('Unable to set a non-enumerable property on object.'); } return hashed; } // Get references to ES5 object methods. const isExtensible = Object.isExtensible; // True if Object.defineProperty works as expected. IE8 fails this test. // TODO remove this as widely available https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty const canDefineProperty = (function () { try { Object.defineProperty({}, '@', {}); return true; // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (e) { return false; } })(); // IE has a `uniqueID` property on DOM nodes. We can construct the hash from it // and avoid memory leaks from the IE cloneNode bug. // TODO remove this method as only used if `canDefineProperty` is false function getIENodeHash(node: unknown): number | undefined { // @ts-expect-error don't care if (node && node.nodeType > 0) { // @ts-expect-error don't care switch (node.nodeType) { case 1: // Element // @ts-expect-error don't care return node.uniqueID; case 9: // Document // @ts-expect-error don't care return node.documentElement && node.documentElement.uniqueID; } } } function valueOf(obj: object): unknown { return obj.valueOf !== defaultValueOf && typeof obj.valueOf === 'function' ? // @ts-expect-error weird the "obj" parameter as `valueOf` should not have a parameter obj.valueOf(obj) : obj; } function nextHash(): number { const nextHash = ++_objHashUID; if (_objHashUID & 0x40000000) { _objHashUID = 0; } return nextHash; } // If possible, use a WeakMap. // TODO using WeakMap should be true everywhere now that WeakMap is widely supported: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/WeakMap const usingWeakMap = typeof WeakMap === 'function'; let weakMap: WeakMap | undefined; if (usingWeakMap) { weakMap = new WeakMap(); } const symbolMap = Object.create(null); let _objHashUID = 0; // TODO remove string as Symbol is now widely supported: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Symbol let UID_HASH_KEY: string | symbol = '__immutablehash__' as const; if (typeof Symbol === 'function') { UID_HASH_KEY = Symbol(UID_HASH_KEY); } const STRING_HASH_CACHE_MIN_STRLEN = 16; const STRING_HASH_CACHE_MAX_SIZE = 255; let STRING_HASH_CACHE_SIZE = 0; let stringHashCache: { [key: string]: number } = {}; immutable-js-immutable-js-6a01d72/src/Immutable.js000066400000000000000000000050651522056416100220740ustar00rootroot00000000000000/* eslint-disable import/order */ import { Seq } from './Seq'; import { OrderedMap } from './OrderedMap'; import { List } from './List'; import { Map } from './Map'; import { Stack } from './Stack'; import { OrderedSet } from './OrderedSet'; import { PairSorting } from './PairSorting'; import { Set } from './Set'; import { Record } from './Record'; import { Range } from './Range'; import { Repeat } from './Repeat'; import { is } from './is'; import { fromJS } from './fromJS'; import isPlainObject from './utils/isPlainObj'; // Functional predicates import { isImmutable } from './predicates/isImmutable'; import { isCollection } from './predicates/isCollection'; import { isKeyed } from './predicates/isKeyed'; import { isIndexed } from './predicates/isIndexed'; import { isAssociative } from './predicates/isAssociative'; import { isOrdered } from './predicates/isOrdered'; import { isValueObject } from './predicates/isValueObject'; import { isSeq } from './predicates/isSeq'; import { isList } from './predicates/isList'; import { isMap } from './predicates/isMap'; import { isOrderedMap } from './predicates/isOrderedMap'; import { isStack } from './predicates/isStack'; import { isSet } from './predicates/isSet'; import { isOrderedSet } from './predicates/isOrderedSet'; import { isRecord } from './predicates/isRecord'; import { Collection } from './CollectionImpl'; import { hash } from './Hash'; // Functional read/write API import { get } from './functional/get'; import { getIn } from './functional/getIn'; import { has } from './functional/has'; import { hasIn } from './functional/hasIn'; import { merge, mergeDeep, mergeWith, mergeDeepWith } from './functional/merge'; import { remove } from './functional/remove'; import { removeIn } from './functional/removeIn'; import { set } from './functional/set'; import { setIn } from './functional/setIn'; import { update } from './functional/update'; import { updateIn } from './functional/updateIn'; import { version } from '../package.json'; // Note: Iterable is deprecated const Iterable = Collection; export { version, Collection, Iterable, Seq, Map, OrderedMap, List, Stack, Set, OrderedSet, PairSorting, Record, Range, Repeat, is, fromJS, hash, isImmutable, isCollection, isKeyed, isIndexed, isAssociative, isOrdered, isPlainObject, isValueObject, isSeq, isList, isMap, isOrderedMap, isStack, isSet, isOrderedSet, isRecord, get, getIn, has, hasIn, merge, mergeDeep, mergeWith, mergeDeepWith, remove, removeIn, set, setIn, update, updateIn, }; immutable-js-immutable-js-6a01d72/src/Iterator.ts000066400000000000000000000106321522056416100217540ustar00rootroot00000000000000export const ITERATE_KEYS = 0; export const ITERATE_VALUES = 1; export const ITERATE_ENTRIES = 2; type IteratorType = | typeof ITERATE_KEYS | typeof ITERATE_VALUES | typeof ITERATE_ENTRIES; // TODO Symbol is widely available in modern JavaScript environments, clean this const REAL_ITERATOR_SYMBOL = typeof Symbol === 'function' && Symbol.iterator; const FAUX_ITERATOR_SYMBOL = '@@iterator'; export const ITERATOR_SYMBOL: string | symbol = REAL_ITERATOR_SYMBOL || FAUX_ITERATOR_SYMBOL; // @ts-expect-error: properties are not supported in buble export class Iterator implements globalThis.Iterator { // TODO activate when using babel as buble does not support static class fields // static KEYS: number; // static VALUES: number; // static ENTRIES: number; // next: () => IteratorResult; // inspect!: () => string; // toSource!: () => string; constructor(next: () => IteratorResult) { // @ts-expect-error: properties are not supported in buble this.next = next; } toString() { return '[Iterator]'; } } // @ts-expect-error: static properties are not supported in buble Iterator.KEYS = ITERATE_KEYS; // @ts-expect-error: static properties are not supported in buble Iterator.VALUES = ITERATE_VALUES; // @ts-expect-error: static properties are not supported in buble Iterator.ENTRIES = ITERATE_ENTRIES; // @ts-expect-error: properties are not supported in buble Iterator.prototype.inspect = Iterator.prototype.toSource = function () { return this.toString(); }; // @ts-expect-error don't know how to type this Iterator.prototype[ITERATOR_SYMBOL] = function () { return this; }; export function iteratorValue( type: IteratorType, k: K, v?: undefined, iteratorResult?: IteratorResult ): IteratorResult | undefined; export function iteratorValue( type: IteratorType, k: K, v: V, iteratorResult?: IteratorResult ): IteratorResult | undefined; export function iteratorValue( type: typeof ITERATE_ENTRIES, k: K, v?: V, iteratorResult?: IteratorResult<[K, V]> ): IteratorResult<[K, V]> | undefined; export function iteratorValue( type: IteratorType, k: K, v?: V, iteratorResult?: | IteratorResult | IteratorResult | IteratorResult<[K, V]> ): IteratorResult | IteratorResult | IteratorResult<[K, V]> | undefined { const value = type === ITERATE_KEYS ? k : type === ITERATE_VALUES ? v : [k, v]; // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here iteratorResult ? (iteratorResult.value = value) : (iteratorResult = { // @ts-expect-error ensure value is not undefined value: value, done: false, }); return iteratorResult; } export function iteratorDone(): IteratorReturnResult { return { value: undefined, done: true }; } export function hasIterator( maybeIterable: unknown ): maybeIterable is Iterable { if (Array.isArray(maybeIterable)) { // IE11 trick as it does not support `Symbol.iterator` return true; } return !!getIteratorFn(maybeIterable); } export function isIterator( maybeIterator: unknown ): maybeIterator is Iterator { return !!( maybeIterator && // @ts-expect-error: maybeIterator is typed as `{}` typeof maybeIterator.next === 'function' ); } export function getIterator(iterable: unknown): Iterator | undefined { const iteratorFn = getIteratorFn(iterable); return iteratorFn && iteratorFn.call(iterable); } function getIteratorFn( iterable: unknown ): (() => Iterator) | undefined { const iteratorFn = iterable && // @ts-expect-error: maybeIterator is typed as `{}` ((REAL_ITERATOR_SYMBOL && iterable[REAL_ITERATOR_SYMBOL]) || // @ts-expect-error: maybeIterator is typed as `{}` iterable[FAUX_ITERATOR_SYMBOL]); if (typeof iteratorFn === 'function') { return iteratorFn; } } export function isEntriesIterable( maybeIterable: unknown ): maybeIterable is Iterable<[unknown, unknown]> { const iteratorFn = getIteratorFn(maybeIterable); // @ts-expect-error: maybeIterator is typed as `{}` return iteratorFn && iteratorFn === maybeIterable.entries; } export function isKeysIterable( maybeIterable: unknown ): maybeIterable is Iterable { const iteratorFn = getIteratorFn(maybeIterable); // @ts-expect-error: maybeIterator is typed as `{}` return iteratorFn && iteratorFn === maybeIterable.keys; } immutable-js-immutable-js-6a01d72/src/List.js000066400000000000000000000475641522056416100211020ustar00rootroot00000000000000import { IndexedCollection } from './Collection'; import { Iterator, hasIterator, iteratorDone, iteratorValue } from './Iterator'; import { DELETE, MASK, MakeRef, OwnerID, SHIFT, SIZE, SetRef, resolveBegin, resolveEnd, wholeSlice, wrapIndex, } from './TrieUtils'; import { asImmutable } from './methods/asImmutable'; import { asMutable } from './methods/asMutable'; import { deleteIn } from './methods/deleteIn'; import { mergeDeepIn } from './methods/mergeDeepIn'; import { mergeIn } from './methods/mergeIn'; import { setIn } from './methods/setIn'; import { update } from './methods/update'; import { updateIn } from './methods/updateIn'; import { wasAltered } from './methods/wasAltered'; import { withMutations } from './methods/withMutations'; import { IS_LIST_SYMBOL, isList } from './predicates/isList'; import assertNotInfinite from './utils/assertNotInfinite'; export class List extends IndexedCollection { // @pragma Construction constructor(value) { const empty = emptyList(); if (value === undefined || value === null) { // eslint-disable-next-line no-constructor-return return empty; } if (isList(value)) { // eslint-disable-next-line no-constructor-return return value; } const iter = IndexedCollection(value); const size = iter.size; if (size === 0) { // eslint-disable-next-line no-constructor-return return empty; } assertNotInfinite(size); if (size > 0 && size < SIZE) { // eslint-disable-next-line no-constructor-return return makeList(0, size, SHIFT, undefined, new VNode(iter.toArray())); } // eslint-disable-next-line no-constructor-return return empty.withMutations((list) => { list.setSize(size); iter.forEach((v, i) => list.set(i, v)); }); } static of(/*...values*/) { return this(arguments); } toString() { return this.__toString('List [', ']'); } // @pragma Access get(index, notSetValue) { index = wrapIndex(this, index); if (index >= 0 && index < this.size) { index += this._origin; const node = listNodeFor(this, index); return node && node.array[index & MASK]; } return notSetValue; } // @pragma Modification set(index, value) { return updateList(this, index, value); } remove(index) { return !this.has(index) ? this : index === 0 ? this.shift() : index === this.size - 1 ? this.pop() : this.splice(index, 1); } insert(index, value) { return this.splice(index, 0, value); } clear() { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = this._origin = this._capacity = 0; this._level = SHIFT; this._root = this._tail = this.__hash = undefined; this.__altered = true; return this; } return emptyList(); } push(/*...values*/) { const values = arguments; const oldSize = this.size; return this.withMutations((list) => { setListBounds(list, 0, oldSize + values.length); for (let ii = 0; ii < values.length; ii++) { list.set(oldSize + ii, values[ii]); } }); } pop() { return setListBounds(this, 0, -1); } unshift(/*...values*/) { const values = arguments; return this.withMutations((list) => { setListBounds(list, -values.length); for (let ii = 0; ii < values.length; ii++) { list.set(ii, values[ii]); } }); } shift() { return setListBounds(this, 1); } shuffle(random = Math.random) { return this.withMutations((mutable) => { // implementation of the Fisher-Yates shuffle: https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle let current = mutable.size; let destination; let tmp; while (current) { destination = Math.floor(random() * current--); tmp = mutable.get(destination); mutable.set(destination, mutable.get(current)); mutable.set(current, tmp); } }); } // @pragma Composition concat(/*...collections*/) { const seqs = []; for (let i = 0; i < arguments.length; i++) { const argument = arguments[i]; const seq = IndexedCollection( typeof argument !== 'string' && hasIterator(argument) ? argument : [argument] ); if (seq.size !== 0) { seqs.push(seq); } } if (seqs.length === 0) { return this; } if (this.size === 0 && !this.__ownerID && seqs.length === 1) { return this.constructor(seqs[0]); } return this.withMutations((list) => { seqs.forEach((seq) => seq.forEach((value) => list.push(value))); }); } setSize(size) { return setListBounds(this, 0, size); } map(mapper, context) { return this.withMutations((list) => { for (let i = 0; i < this.size; i++) { list.set(i, mapper.call(context, list.get(i), i, this)); } }); } // @pragma Iteration slice(begin, end) { const size = this.size; if (wholeSlice(begin, end, size)) { return this; } return setListBounds( this, resolveBegin(begin, size), resolveEnd(end, size) ); } __iterator(type, reverse) { let index = reverse ? this.size : 0; const values = iterateList(this, reverse); return new Iterator(() => { const value = values(); return value === DONE ? iteratorDone() : iteratorValue(type, reverse ? --index : index++, value); }); } __iterate(fn, reverse) { let index = reverse ? this.size : 0; const values = iterateList(this, reverse); let value; while ((value = values()) !== DONE) { if (fn(value, reverse ? --index : index++, this) === false) { break; } } return index; } __ensureOwner(ownerID) { if (ownerID === this.__ownerID) { return this; } if (!ownerID) { if (this.size === 0) { return emptyList(); } this.__ownerID = ownerID; this.__altered = false; return this; } return makeList( this._origin, this._capacity, this._level, this._root, this._tail, ownerID, this.__hash ); } } List.isList = isList; const ListPrototype = List.prototype; ListPrototype[IS_LIST_SYMBOL] = true; ListPrototype[DELETE] = ListPrototype.remove; ListPrototype.merge = ListPrototype.concat; ListPrototype.setIn = setIn; ListPrototype.deleteIn = ListPrototype.removeIn = deleteIn; ListPrototype.update = update; ListPrototype.updateIn = updateIn; ListPrototype.mergeIn = mergeIn; ListPrototype.mergeDeepIn = mergeDeepIn; ListPrototype.withMutations = withMutations; ListPrototype.wasAltered = wasAltered; ListPrototype.asImmutable = asImmutable; ListPrototype['@@transducer/init'] = ListPrototype.asMutable = asMutable; ListPrototype['@@transducer/step'] = function (result, arr) { return result.push(arr); }; ListPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; /** * A node in the List's 32-wide trie. At inner levels `array` holds child * `VNode`s; at the leaf level it holds the List's values. Missing slots are * `undefined` array holes. * * @template T */ class VNode { /** * @param {Array | T | undefined>} array * @param {OwnerID} [ownerID] */ constructor(array, ownerID) { this.array = array; this.ownerID = ownerID; } // TODO: seems like these methods are very similar removeBefore(ownerID, level, index) { if ( (index & ((1 << (level + SHIFT)) - 1)) === 0 || this.array.length === 0 ) { return this; } const originIndex = (index >>> level) & MASK; if (originIndex >= this.array.length) { return new VNode([], ownerID); } const removingFirst = originIndex === 0; let newChild; if (level > 0) { const oldChild = this.array[originIndex]; newChild = oldChild && oldChild.removeBefore(ownerID, level - SHIFT, index); if (newChild === oldChild && removingFirst) { return this; } } if (removingFirst && !newChild) { return this; } const editable = editableVNode(this, ownerID); if (!removingFirst) { for (let ii = 0; ii < originIndex; ii++) { editable.array[ii] = undefined; } } if (newChild) { editable.array[originIndex] = newChild; } return editable; } removeAfter(ownerID, level, index) { if ( index === (level ? 1 << (level + SHIFT) : SIZE) || this.array.length === 0 ) { return this; } const sizeIndex = ((index - 1) >>> level) & MASK; if (sizeIndex >= this.array.length) { return this; } let newChild; if (level > 0) { const oldChild = this.array[sizeIndex]; newChild = oldChild && oldChild.removeAfter(ownerID, level - SHIFT, index); if (newChild === oldChild && sizeIndex === this.array.length - 1) { return this; } } const editable = editableVNode(this, ownerID); editable.array.splice(sizeIndex + 1); if (newChild) { editable.array[sizeIndex] = newChild; } return editable; } } const DONE = {}; function iterateList(list, reverse) { const left = list._origin; const right = list._capacity; const tailPos = getTailOffset(right); const tail = list._tail; return iterateNodeOrLeaf(list._root, list._level, 0); function iterateNodeOrLeaf(node, level, offset) { return level === 0 ? iterateLeaf(node, offset) : iterateNode(node, level, offset); } function iterateLeaf(node, offset) { const array = offset === tailPos ? tail && tail.array : node && node.array; let from = offset > left ? 0 : left - offset; let to = right - offset; if (to > SIZE) { to = SIZE; } return () => { if (from === to) { return DONE; } const idx = reverse ? --to : from++; return array && array[idx]; }; } function iterateNode(node, level, offset) { let values; const array = node && node.array; let from = offset > left ? 0 : (left - offset) >> level; let to = ((right - offset) >> level) + 1; if (to > SIZE) { to = SIZE; } return () => { while (true) { if (values) { const value = values(); if (value !== DONE) { return value; } values = null; } if (from === to) { return DONE; } const idx = reverse ? --to : from++; values = iterateNodeOrLeaf( array && array[idx], level - SHIFT, offset + (idx << level) ); } }; } } /** * @param {number} origin * @param {number} capacity * @param {number} level * @param {VNode | undefined} [root] The trie root, or `undefined` when every * in-range value lives in the tail (or is a virtual `undefined`). * @param {VNode | undefined} [tail] * @param {OwnerID} [ownerID] * @param {number} [hash] */ function makeList(origin, capacity, level, root, tail, ownerID, hash) { const list = Object.create(ListPrototype); list.size = capacity - origin; list._origin = origin; list._capacity = capacity; list._level = level; list._root = root; list._tail = tail; list.__ownerID = ownerID; list.__hash = hash; list.__altered = false; return list; } export function emptyList() { return makeList(0, 0, SHIFT); } function updateList(list, index, value) { index = wrapIndex(list, index); if (index !== index) { return list; } if (index >= list.size || index < 0) { return list.withMutations((list) => { // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here index < 0 ? setListBounds(list, index).set(0, value) : setListBounds(list, 0, index + 1).set(index, value); }); } index += list._origin; let newTail = list._tail; let newRoot = list._root; const didAlter = MakeRef(); if (index >= getTailOffset(list._capacity)) { newTail = updateVNode(newTail, list.__ownerID, 0, index, value, didAlter); } else { newRoot = updateVNode( newRoot, list.__ownerID, list._level, index, value, didAlter ); } if (!didAlter.value) { return list; } if (list.__ownerID) { list._root = newRoot; list._tail = newTail; list.__hash = undefined; list.__altered = true; return list; } return makeList(list._origin, list._capacity, list._level, newRoot, newTail); } function updateVNode(node, ownerID, level, index, value, didAlter) { const idx = (index >>> level) & MASK; const nodeHas = node && idx < node.array.length; if (!nodeHas && value === undefined) { return node; } let newNode; if (level > 0) { const lowerNode = node && node.array[idx]; const newLowerNode = updateVNode( lowerNode, ownerID, level - SHIFT, index, value, didAlter ); if (newLowerNode === lowerNode) { return node; } newNode = editableVNode(node, ownerID); newNode.array[idx] = newLowerNode; return newNode; } if (nodeHas && node.array[idx] === value) { return node; } if (didAlter) { SetRef(didAlter); } newNode = editableVNode(node, ownerID); if (value === undefined && idx === newNode.array.length - 1) { newNode.array.pop(); } else { newNode.array[idx] = value; } return newNode; } function editableVNode(node, ownerID) { if (ownerID && node && ownerID === node.ownerID) { return node; } return new VNode(node ? node.array.slice() : [], ownerID); } /** * Returns the leaf `VNode` holding `rawIndex`, or `undefined` when no node is * allocated for it (an all-`undefined` region). * * @param {List} list * @param {number} rawIndex * @returns {VNode | undefined} */ function listNodeFor(list, rawIndex) { if (rawIndex >= getTailOffset(list._capacity)) { return list._tail; } if (rawIndex < 1 << (list._level + SHIFT)) { let node = list._root; let level = list._level; while (node && level > 0) { node = node.array[(rawIndex >>> level) & MASK]; level -= SHIFT; } return node; } } /** * Validates requested bounds before int32 coercion in setListBounds(). * Throws when origin/capacity would exceed the trie's safe range. */ function validateListBoundsRequest(list, begin, end) { const requestedOrigin = list._origin + (begin === undefined ? 0 : begin); const requestedCapacity = end === undefined ? list._capacity : end < 0 ? list._capacity + end : list._origin + end; // Keep origin/capacity within the trie's safe signed 32-bit range. if ( (Number.isFinite(requestedCapacity) && requestedCapacity > MAX_LIST_SIZE) || (Number.isFinite(requestedOrigin) && requestedOrigin < -MAX_LIST_SIZE) || (Number.isFinite(requestedCapacity) && Number.isFinite(requestedOrigin) && requestedCapacity - requestedOrigin > MAX_LIST_SIZE) ) { throw new RangeError( 'Invalid List size: a List cannot hold more than ' + MAX_LIST_SIZE + ' (2 ** 30) values.' ); } } function setListBounds(list, begin, end) { // Validate full-precision bounds before int32 coercion. validateListBoundsRequest(list, begin, end); // Sanitize begin & end using this shorthand for ToInt32(argument) // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 if (begin !== undefined) { begin |= 0; } if (end !== undefined) { end |= 0; } const owner = list.__ownerID || new OwnerID(); let oldOrigin = list._origin; let oldCapacity = list._capacity; let newOrigin = oldOrigin + begin; let newCapacity = end === undefined ? oldCapacity : end < 0 ? oldCapacity + end : oldOrigin + end; if (newOrigin === oldOrigin && newCapacity === oldCapacity) { return list; } // If it's going to end after it starts, it's empty. if (newOrigin >= newCapacity) { return list.clear(); } let newLevel = list._level; let newRoot = list._root; // New origin might need creating a higher root. let offsetShift = 0; while (newOrigin + offsetShift < 0) { newRoot = new VNode( newRoot && newRoot.array.length ? [undefined, newRoot] : [], owner ); newLevel += SHIFT; // Shift origin into non-negative space as trie height grows. offsetShift += levelCapacity(newLevel); } if (offsetShift) { newOrigin += offsetShift; oldOrigin += offsetShift; newCapacity += offsetShift; oldCapacity += offsetShift; } const oldTailOffset = getTailOffset(oldCapacity); const newTailOffset = getTailOffset(newCapacity); // New size might need creating a higher root. while (newTailOffset >= levelCapacity(newLevel + SHIFT)) { newRoot = new VNode( newRoot && newRoot.array.length ? [newRoot] : [], owner ); newLevel += SHIFT; } // Locate or create the new tail. const oldTail = list._tail; let newTail = newTailOffset < oldTailOffset ? listNodeFor(list, newCapacity - 1) : newTailOffset > oldTailOffset ? new VNode([], owner) : oldTail; // Merge Tail into tree. if ( oldTail && newTailOffset > oldTailOffset && newOrigin < oldCapacity && oldTail.array.length ) { newRoot = editableVNode(newRoot, owner); let node = newRoot; for (let level = newLevel; level > SHIFT; level -= SHIFT) { const idx = (oldTailOffset >>> level) & MASK; node = node.array[idx] = editableVNode(node.array[idx], owner); } node.array[(oldTailOffset >>> SHIFT) & MASK] = oldTail; } // If the size has been reduced, there's a chance the tail needs to be trimmed. if (newCapacity < oldCapacity) { newTail = newTail && newTail.removeAfter(owner, 0, newCapacity); } // If the new origin is within the tail, then we do not need a root. if (newOrigin >= newTailOffset) { newOrigin -= newTailOffset; newCapacity -= newTailOffset; newLevel = SHIFT; newRoot = undefined; newTail = newTail && newTail.removeBefore(owner, 0, newOrigin); // Otherwise, if the root has been trimmed, garbage collect. } else if (newOrigin > oldOrigin || newTailOffset < oldTailOffset) { offsetShift = 0; // Identify the new top root node of the subtree of the old root. while (newRoot) { const beginIndex = (newOrigin >>> newLevel) & MASK; if ((beginIndex !== newTailOffset >>> newLevel) & MASK) { break; } if (beginIndex) { offsetShift += (1 << newLevel) * beginIndex; } newLevel -= SHIFT; newRoot = newRoot.array[beginIndex]; } // Trim the new sides of the new root. if (newRoot && newOrigin > oldOrigin) { newRoot = newRoot.removeBefore(owner, newLevel, newOrigin - offsetShift); } if (newRoot && newTailOffset < oldTailOffset) { newRoot = newRoot.removeAfter( owner, newLevel, newTailOffset - offsetShift ); } if (offsetShift) { newOrigin -= offsetShift; newCapacity -= offsetShift; } } if (list.__ownerID) { list.size = newCapacity - newOrigin; list._origin = newOrigin; list._capacity = newCapacity; list._level = newLevel; list._root = newRoot; list._tail = newTail; list.__hash = undefined; list.__altered = true; return list; } return makeList(newOrigin, newCapacity, newLevel, newRoot, newTail); } function getTailOffset(size) { return size < SIZE ? 0 : ((size - 1) >>> SHIFT) << SHIFT; } // The largest number of values a List can hold. Above this the 32-bit trie math // in setListBounds() stays in the safe signed 32-bit range. const MAX_LIST_SIZE = 2 ** 30; // 1073741824 /** * Computes 2 ** exp for the trie level-raising loops in setListBounds(). * Use the cheap bitwise operator shift whenever possible, otherwise fall back to exponentiation. * This is necessary because bitwise operators in JavaScript only work on 32-bit signed integers, so for exp >= 31, we need to use exponentiation to avoid overflow. */ function levelCapacity(exp) { return exp < 31 ? 1 << exp : 2 ** exp; } immutable-js-immutable-js-6a01d72/src/Map.js000066400000000000000000000553451522056416100207000ustar00rootroot00000000000000import { Collection, KeyedCollection } from './Collection'; import { hash, hashCollisionKey } from './Hash'; import { Iterator, iteratorDone, iteratorValue } from './Iterator'; import { sortFactory } from './Operations'; import { OrderedMap } from './OrderedMap'; import { DELETE, MASK, MakeRef, NOT_SET, OwnerID, SHIFT, SIZE, SetRef, } from './TrieUtils'; import { is } from './is'; import { asImmutable } from './methods/asImmutable'; import { asMutable } from './methods/asMutable'; import { deleteIn } from './methods/deleteIn'; import { merge, mergeWith } from './methods/merge'; import { mergeDeep, mergeDeepWith } from './methods/mergeDeep'; import { mergeDeepIn } from './methods/mergeDeepIn'; import { mergeIn } from './methods/mergeIn'; import { setIn } from './methods/setIn'; import { update } from './methods/update'; import { updateIn } from './methods/updateIn'; import { wasAltered } from './methods/wasAltered'; import { withMutations } from './methods/withMutations'; import { IS_MAP_SYMBOL, isMap } from './predicates/isMap'; import { isOrdered } from './predicates/isOrdered'; import arrCopy from './utils/arrCopy'; import assertNotInfinite from './utils/assertNotInfinite'; export class Map extends KeyedCollection { // @pragma Construction constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptyMap() : isMap(value) && !isOrdered(value) ? value : emptyMap().withMutations((map) => { const iter = KeyedCollection(value); assertNotInfinite(iter.size); iter.forEach((v, k) => map.set(k, v)); }); } toString() { return this.__toString('Map {', '}'); } // @pragma Access get(k, notSetValue) { return this._root ? this._root.get(0, undefined, k, notSetValue) : notSetValue; } // @pragma Modification set(k, v) { return updateMap(this, k, v); } remove(k) { return updateMap(this, k, NOT_SET); } deleteAll(keys) { const collection = Collection(keys); if (collection.size === 0) { return this; } return this.withMutations((map) => { collection.forEach((key) => map.remove(key)); }); } clear() { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = 0; this._root = null; this.__hash = undefined; this.__altered = true; return this; } return emptyMap(); } // @pragma Composition sort(comparator) { // Late binding return OrderedMap(sortFactory(this, comparator)); } sortBy(mapper, comparator) { // Late binding return OrderedMap(sortFactory(this, comparator, mapper)); } map(mapper, context) { return this.withMutations((map) => { map.forEach((value, key) => { map.set(key, mapper.call(context, value, key, this)); }); }); } // @pragma Mutability __iterator(type, reverse) { return new MapIterator(this, type, reverse); } __iterate(fn, reverse) { let iterations = 0; // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here this._root && this._root.iterate((entry) => { iterations++; return fn(entry[1], entry[0], this); }, reverse); return iterations; } __ensureOwner(ownerID) { if (ownerID === this.__ownerID) { return this; } if (!ownerID) { if (this.size === 0) { return emptyMap(); } this.__ownerID = ownerID; this.__altered = false; return this; } return makeMap(this.size, this._root, ownerID, this.__hash); } } Map.isMap = isMap; const MapPrototype = Map.prototype; MapPrototype[IS_MAP_SYMBOL] = true; MapPrototype[DELETE] = MapPrototype.remove; MapPrototype.removeAll = MapPrototype.deleteAll; MapPrototype.setIn = setIn; MapPrototype.removeIn = MapPrototype.deleteIn = deleteIn; MapPrototype.update = update; MapPrototype.updateIn = updateIn; MapPrototype.merge = MapPrototype.concat = merge; MapPrototype.mergeWith = mergeWith; MapPrototype.mergeDeep = mergeDeep; MapPrototype.mergeDeepWith = mergeDeepWith; MapPrototype.mergeIn = mergeIn; MapPrototype.mergeDeepIn = mergeDeepIn; MapPrototype.withMutations = withMutations; MapPrototype.wasAltered = wasAltered; MapPrototype.asImmutable = asImmutable; MapPrototype['@@transducer/init'] = MapPrototype.asMutable = asMutable; MapPrototype['@@transducer/step'] = function (result, arr) { return result.set(arr[0], arr[1]); }; MapPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; // #pragma Trie Nodes class ArrayMapNode { constructor(ownerID, entries) { this.ownerID = ownerID; this.entries = entries; } get(shift, keyHash, key, notSetValue) { const entries = this.entries; for (let ii = 0, len = entries.length; ii < len; ii++) { if (is(key, entries[ii][0])) { return entries[ii][1]; } } return notSetValue; } update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { const removed = value === NOT_SET; const entries = this.entries; let idx = 0; const len = entries.length; for (; idx < len; idx++) { if (is(key, entries[idx][0])) { break; } } const exists = idx < len; if (exists ? entries[idx][1] === value : removed) { return this; } SetRef(didAlter); // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here (removed || !exists) && SetRef(didChangeSize); if (removed && entries.length === 1) { return; // undefined } if (!exists && !removed && entries.length >= MAX_ARRAY_MAP_SIZE) { return createNodes(ownerID, entries, key, value); } const isEditable = ownerID && ownerID === this.ownerID; const newEntries = isEditable ? entries : arrCopy(entries); if (exists) { if (removed) { // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); } else { newEntries[idx] = [key, value]; } } else { newEntries.push([key, value]); } if (isEditable) { this.entries = newEntries; return this; } return new ArrayMapNode(ownerID, newEntries); } } class BitmapIndexedNode { constructor(ownerID, bitmap, nodes) { this.ownerID = ownerID; this.bitmap = bitmap; this.nodes = nodes; } get(shift, keyHash, key, notSetValue) { if (keyHash === undefined) { keyHash = hash(key); } const bit = 1 << ((shift === 0 ? keyHash : keyHash >>> shift) & MASK); const bitmap = this.bitmap; return (bitmap & bit) === 0 ? notSetValue : this.nodes[popCount(bitmap & (bit - 1))].get( shift + SHIFT, keyHash, key, notSetValue ); } update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { if (keyHash === undefined) { keyHash = hash(key); } const keyHashFrag = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; const bit = 1 << keyHashFrag; const bitmap = this.bitmap; const exists = (bitmap & bit) !== 0; if (!exists && value === NOT_SET) { return this; } const idx = popCount(bitmap & (bit - 1)); const nodes = this.nodes; const node = exists ? nodes[idx] : undefined; const newNode = updateNode( node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter ); if (newNode === node) { return this; } if (!exists && newNode && nodes.length >= MAX_BITMAP_INDEXED_SIZE) { return expandNodes(ownerID, nodes, bitmap, keyHashFrag, newNode); } if ( exists && !newNode && nodes.length === 2 && isLeafNode(nodes[idx ^ 1]) ) { return nodes[idx ^ 1]; } if (exists && newNode && nodes.length === 1 && isLeafNode(newNode)) { return newNode; } const isEditable = ownerID && ownerID === this.ownerID; const newBitmap = exists ? (newNode ? bitmap : bitmap ^ bit) : bitmap | bit; const newNodes = exists ? newNode ? setAt(nodes, idx, newNode, isEditable) : spliceOut(nodes, idx, isEditable) : spliceIn(nodes, idx, newNode, isEditable); if (isEditable) { this.bitmap = newBitmap; this.nodes = newNodes; return this; } return new BitmapIndexedNode(ownerID, newBitmap, newNodes); } } class HashArrayMapNode { constructor(ownerID, count, nodes) { this.ownerID = ownerID; this.count = count; this.nodes = nodes; } get(shift, keyHash, key, notSetValue) { if (keyHash === undefined) { keyHash = hash(key); } const idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; const node = this.nodes[idx]; return node ? node.get(shift + SHIFT, keyHash, key, notSetValue) : notSetValue; } update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { if (keyHash === undefined) { keyHash = hash(key); } const idx = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; const removed = value === NOT_SET; const nodes = this.nodes; const node = nodes[idx]; if (removed && !node) { return this; } const newNode = updateNode( node, ownerID, shift + SHIFT, keyHash, key, value, didChangeSize, didAlter ); if (newNode === node) { return this; } let newCount = this.count; if (!node) { newCount++; } else if (!newNode) { newCount--; if (newCount < MIN_HASH_ARRAY_MAP_SIZE) { return packNodes(ownerID, nodes, newCount, idx); } } const isEditable = ownerID && ownerID === this.ownerID; const newNodes = setAt(nodes, idx, newNode, isEditable); if (isEditable) { this.count = newCount; this.nodes = newNodes; return this; } return new HashArrayMapNode(ownerID, newCount, newNodes); } } /** * Trie leaf gathering entries whose keys all share the same 32-bit `hash()`. * The trie routes by hash, so colliding keys cannot be separated and land here * in a flat `entries` array, disambiguated by `is()`. * * To guard against hash-flooding DoS (CWE-407), large buckets build a secondary * index keyed by a per-process seeded hash (`hashCollisionKey`). `is()` still * decides equality, so the index can only ever narrow candidates, never lose a key. */ class HashCollisionNode { constructor(ownerID, keyHash, entries) { this.ownerID = ownerID; this.keyHash = keyHash; this.entries = entries; // Lazy `{ [secondaryHash]: number[] }`, built only past // MIN_HASH_COLLISION_INDEX_SIZE so small buckets keep their linear path. this._index = undefined; } // Returns the position of `key` in `this.entries`, or -1. Uses the secondary // index when present; builds it only when `buildIndex` is true (reads and // transient inserts, where the node is reused so the O(n) build amortizes). // Persistent inserts already pay an O(n) copy, so a throwaway index is skipped. _positionOf(key, buildIndex) { const entries = this.entries; let index = this._index; if ( index === undefined && buildIndex && entries.length >= MIN_HASH_COLLISION_INDEX_SIZE ) { index = this._buildIndex(); } if (index !== undefined) { const positions = index[hashCollisionKey(key)]; if (positions !== undefined) { for (let jj = 0; jj < positions.length; jj++) { const ii = positions[jj]; if (is(key, entries[ii][0])) { return ii; } } } return -1; } for (let ii = 0, len = entries.length; ii < len; ii++) { if (is(key, entries[ii][0])) { return ii; } } return -1; } // Builds and memoizes the secondary index. A plain object, not `Map` — which // in this module resolves to the *Immutable* Map, not the native one. _buildIndex() { const index = Object.create(null); const entries = this.entries; for (let ii = 0, len = entries.length; ii < len; ii++) { const secondaryHash = hashCollisionKey(entries[ii][0]); const positions = index[secondaryHash]; if (positions !== undefined) { positions.push(ii); } else { index[secondaryHash] = [ii]; } } this._index = index; return index; } get(shift, keyHash, key, notSetValue) { const idx = this._positionOf(key, true); return idx === -1 ? notSetValue : this.entries[idx][1]; } update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { if (keyHash === undefined) { keyHash = hash(key); } const removed = value === NOT_SET; if (keyHash !== this.keyHash) { if (removed) { return this; } SetRef(didAlter); SetRef(didChangeSize); return mergeIntoNode(this, ownerID, shift, keyHash, [key, value]); } const entries = this.entries; const len = entries.length; const isEditable = ownerID && ownerID === this.ownerID; const foundIdx = this._positionOf(key, isEditable); const idx = foundIdx === -1 ? len : foundIdx; const exists = foundIdx !== -1; if (exists ? entries[idx][1] === value : removed) { return this; } SetRef(didAlter); // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here (removed || !exists) && SetRef(didChangeSize); if (removed && len === 2) { return new ValueNode(ownerID, this.keyHash, entries[idx ^ 1]); } const newEntries = isEditable ? entries : arrCopy(entries); if (exists) { if (removed) { // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here idx === len - 1 ? newEntries.pop() : (newEntries[idx] = newEntries.pop()); // The swap-pop reshuffles positions; drop the stale index (rebuilt lazily). if (isEditable) { this._index = undefined; } } else { // Same key, same position: the index stays valid. newEntries[idx] = [key, value]; } } else { newEntries.push([key, value]); // Keep the index in sync on the transient insert path. Persistent inserts // return a fresh node below whose index rebuilds lazily, so skip them. if (isEditable && this._index !== undefined) { const secondaryHash = hashCollisionKey(key); const positions = this._index[secondaryHash]; if (positions !== undefined) { positions.push(len); } else { this._index[secondaryHash] = [len]; } } } if (isEditable) { this.entries = newEntries; return this; } return new HashCollisionNode(ownerID, this.keyHash, newEntries); } } class ValueNode { constructor(ownerID, keyHash, entry) { this.ownerID = ownerID; this.keyHash = keyHash; this.entry = entry; } get(shift, keyHash, key, notSetValue) { return is(key, this.entry[0]) ? this.entry[1] : notSetValue; } update(ownerID, shift, keyHash, key, value, didChangeSize, didAlter) { const removed = value === NOT_SET; const keyMatch = is(key, this.entry[0]); if (keyMatch ? value === this.entry[1] : removed) { return this; } SetRef(didAlter); if (removed) { SetRef(didChangeSize); return; // undefined } if (keyMatch) { if (ownerID && ownerID === this.ownerID) { this.entry[1] = value; return this; } return new ValueNode(ownerID, this.keyHash, [key, value]); } SetRef(didChangeSize); return mergeIntoNode(this, ownerID, shift, hash(key), [key, value]); } } // #pragma Iterators ArrayMapNode.prototype.iterate = HashCollisionNode.prototype.iterate = function (fn, reverse) { const entries = this.entries; for (let ii = 0, maxIndex = entries.length - 1; ii <= maxIndex; ii++) { if (fn(entries[reverse ? maxIndex - ii : ii]) === false) { return false; } } }; BitmapIndexedNode.prototype.iterate = HashArrayMapNode.prototype.iterate = function (fn, reverse) { const nodes = this.nodes; for (let ii = 0, maxIndex = nodes.length - 1; ii <= maxIndex; ii++) { const node = nodes[reverse ? maxIndex - ii : ii]; if (node && node.iterate(fn, reverse) === false) { return false; } } }; // eslint-disable-next-line @typescript-eslint/no-unused-vars ValueNode.prototype.iterate = function (fn, reverse) { return fn(this.entry); }; class MapIterator extends Iterator { constructor(map, type, reverse) { this._type = type; this._reverse = reverse; this._stack = map._root && mapIteratorFrame(map._root); } next() { const type = this._type; let stack = this._stack; while (stack) { const node = stack.node; const index = stack.index++; let maxIndex; if (node.entry) { if (index === 0) { return mapIteratorValue(type, node.entry); } } else if (node.entries) { maxIndex = node.entries.length - 1; if (index <= maxIndex) { return mapIteratorValue( type, node.entries[this._reverse ? maxIndex - index : index] ); } } else { maxIndex = node.nodes.length - 1; if (index <= maxIndex) { const subNode = node.nodes[this._reverse ? maxIndex - index : index]; if (subNode) { if (subNode.entry) { return mapIteratorValue(type, subNode.entry); } stack = this._stack = mapIteratorFrame(subNode, stack); } continue; } } stack = this._stack = this._stack.__prev; } return iteratorDone(); } } function mapIteratorValue(type, entry) { return iteratorValue(type, entry[0], entry[1]); } function mapIteratorFrame(node, prev) { return { node: node, index: 0, __prev: prev, }; } function makeMap(size, root, ownerID, hash) { const map = Object.create(MapPrototype); map.size = size; map._root = root; map.__ownerID = ownerID; map.__hash = hash; map.__altered = false; return map; } let EMPTY_MAP; export function emptyMap() { return EMPTY_MAP || (EMPTY_MAP = makeMap(0)); } function updateMap(map, k, v) { let newRoot; let newSize; if (!map._root) { if (v === NOT_SET) { return map; } newSize = 1; newRoot = new ArrayMapNode(map.__ownerID, [[k, v]]); } else { const didChangeSize = MakeRef(); const didAlter = MakeRef(); newRoot = updateNode( map._root, map.__ownerID, 0, undefined, k, v, didChangeSize, didAlter ); if (!didAlter.value) { return map; } newSize = map.size + (didChangeSize.value ? (v === NOT_SET ? -1 : 1) : 0); } if (map.__ownerID) { map.size = newSize; map._root = newRoot; map.__hash = undefined; map.__altered = true; return map; } return newRoot ? makeMap(newSize, newRoot) : emptyMap(); } function updateNode( node, ownerID, shift, keyHash, key, value, didChangeSize, didAlter ) { if (!node) { if (value === NOT_SET) { return node; } SetRef(didAlter); SetRef(didChangeSize); return new ValueNode(ownerID, keyHash, [key, value]); } return node.update( ownerID, shift, keyHash, key, value, didChangeSize, didAlter ); } function isLeafNode(node) { return ( node.constructor === ValueNode || node.constructor === HashCollisionNode ); } function mergeIntoNode(node, ownerID, shift, keyHash, entry) { if (node.keyHash === keyHash) { return new HashCollisionNode(ownerID, keyHash, [node.entry, entry]); } const idx1 = (shift === 0 ? node.keyHash : node.keyHash >>> shift) & MASK; const idx2 = (shift === 0 ? keyHash : keyHash >>> shift) & MASK; let newNode; const nodes = idx1 === idx2 ? [mergeIntoNode(node, ownerID, shift + SHIFT, keyHash, entry)] : ((newNode = new ValueNode(ownerID, keyHash, entry)), idx1 < idx2 ? [node, newNode] : [newNode, node]); return new BitmapIndexedNode(ownerID, (1 << idx1) | (1 << idx2), nodes); } function createNodes(ownerID, entries, key, value) { if (!ownerID) { ownerID = new OwnerID(); } let node = new ValueNode(ownerID, hash(key), [key, value]); for (let ii = 0; ii < entries.length; ii++) { const entry = entries[ii]; node = node.update(ownerID, 0, undefined, entry[0], entry[1]); } return node; } function packNodes(ownerID, nodes, count, excluding) { let bitmap = 0; let packedII = 0; const packedNodes = new Array(count); for (let ii = 0, bit = 1, len = nodes.length; ii < len; ii++, bit <<= 1) { const node = nodes[ii]; if (node !== undefined && ii !== excluding) { bitmap |= bit; packedNodes[packedII++] = node; } } return new BitmapIndexedNode(ownerID, bitmap, packedNodes); } function expandNodes(ownerID, nodes, bitmap, including, node) { let count = 0; const expandedNodes = new Array(SIZE); for (let ii = 0; bitmap !== 0; ii++, bitmap >>>= 1) { expandedNodes[ii] = bitmap & 1 ? nodes[count++] : undefined; } expandedNodes[including] = node; return new HashArrayMapNode(ownerID, count + 1, expandedNodes); } function popCount(x) { x -= (x >> 1) & 0x55555555; x = (x & 0x33333333) + ((x >> 2) & 0x33333333); x = (x + (x >> 4)) & 0x0f0f0f0f; x += x >> 8; x += x >> 16; return x & 0x7f; } function setAt(array, idx, val, canEdit) { const newArray = canEdit ? array : arrCopy(array); newArray[idx] = val; return newArray; } function spliceIn(array, idx, val, canEdit) { const newLen = array.length + 1; if (canEdit && idx + 1 === newLen) { array[idx] = val; return array; } const newArray = new Array(newLen); let after = 0; for (let ii = 0; ii < newLen; ii++) { if (ii === idx) { newArray[ii] = val; after = -1; } else { newArray[ii] = array[ii + after]; } } return newArray; } function spliceOut(array, idx, canEdit) { const newLen = array.length - 1; if (canEdit && idx === newLen) { array.pop(); return array; } const newArray = new Array(newLen); let after = 0; for (let ii = 0; ii < newLen; ii++) { if (ii === idx) { after = 1; } newArray[ii] = array[ii + after]; } return newArray; } const MAX_ARRAY_MAP_SIZE = SIZE / 4; const MAX_BITMAP_INDEXED_SIZE = SIZE / 2; const MIN_HASH_ARRAY_MAP_SIZE = SIZE / 4; // Above this many colliding entries, a `HashCollisionNode` builds a seeded // secondary index instead of scanning linearly. Kept small so the rare, // naturally-occurring collision buckets stay overhead-free, while adversarial // hash-flooding (thousands of keys sharing one hash) degrades gracefully. const MIN_HASH_COLLISION_INDEX_SIZE = 16; immutable-js-immutable-js-6a01d72/src/Math.ts000066400000000000000000000015741522056416100210610ustar00rootroot00000000000000// TODO remove in v6 as Math.imul is widely available now: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/imul export const imul = typeof Math.imul === 'function' && Math.imul(0xffffffff, 2) === -2 ? Math.imul : function imul(a: number, b: number): number { a |= 0; // int b |= 0; // int const c = a & 0xffff; const d = b & 0xffff; // Shift by 0 fixes the sign on the high part. return (c * d + ((((a >>> 16) * d + c * (b >>> 16)) << 16) >>> 0)) | 0; // int }; // v8 has an optimization for storing 31-bit signed numbers. // Values which have either 00 or 11 as the high order bits qualify. // This function drops the highest order bit in a signed number, maintaining // the sign bit. export function smi(i32: number): number { return ((i32 >>> 1) & 0x40000000) | (i32 & 0xbfffffff); } immutable-js-immutable-js-6a01d72/src/Operations.js000066400000000000000000000671461522056416100223100ustar00rootroot00000000000000import { Collection, IndexedCollection, KeyedCollection, SetCollection, } from './Collection'; import { ITERATE_ENTRIES, ITERATE_KEYS, ITERATE_VALUES, Iterator, getIterator, iteratorDone, iteratorValue, } from './Iterator'; import { Map } from './Map'; import { OrderedMap } from './OrderedMap'; import { ArraySeq, IndexedSeq, KeyedSeq, Seq, SetSeq, indexedSeqFromValue, keyedSeqFromValue, } from './Seq'; import { NOT_SET, ensureSize, resolveBegin, resolveEnd, wholeSlice, wrapIndex, } from './TrieUtils'; import { isCollection } from './predicates/isCollection'; import { IS_INDEXED_SYMBOL, isIndexed } from './predicates/isIndexed'; import { IS_KEYED_SYMBOL, isKeyed } from './predicates/isKeyed'; import { IS_ORDERED_SYMBOL, isOrdered } from './predicates/isOrdered'; import { isSeq } from './predicates/isSeq'; export class ToKeyedSequence extends KeyedSeq { constructor(indexed, useKeys) { this._iter = indexed; this._useKeys = useKeys; this.size = indexed.size; } get(key, notSetValue) { return this._iter.get(key, notSetValue); } has(key) { return this._iter.has(key); } valueSeq() { return this._iter.valueSeq(); } reverse() { const reversedSequence = reverseFactory(this, true); if (!this._useKeys) { reversedSequence.valueSeq = () => this._iter.toSeq().reverse(); } return reversedSequence; } map(mapper, context) { const mappedSequence = mapFactory(this, mapper, context); if (!this._useKeys) { mappedSequence.valueSeq = () => this._iter.toSeq().map(mapper, context); } return mappedSequence; } __iterate(fn, reverse) { return this._iter.__iterate((v, k) => fn(v, k, this), reverse); } __iterator(type, reverse) { return this._iter.__iterator(type, reverse); } } ToKeyedSequence.prototype[IS_ORDERED_SYMBOL] = true; export class ToIndexedSequence extends IndexedSeq { constructor(iter) { this._iter = iter; this.size = iter.size; } includes(value) { return this._iter.includes(value); } __iterate(fn, reverse) { let i = 0; // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here reverse && ensureSize(this); return this._iter.__iterate( (v) => fn(v, reverse ? this.size - ++i : i++, this), reverse ); } __iterator(type, reverse) { const iterator = this._iter.__iterator(ITERATE_VALUES, reverse); let i = 0; // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here reverse && ensureSize(this); return new Iterator(() => { const step = iterator.next(); return step.done ? step : iteratorValue( type, reverse ? this.size - ++i : i++, step.value, step ); }); } } export class ToSetSequence extends SetSeq { constructor(iter) { this._iter = iter; this.size = iter.size; } has(key) { return this._iter.includes(key); } __iterate(fn, reverse) { return this._iter.__iterate((v) => fn(v, v, this), reverse); } __iterator(type, reverse) { const iterator = this._iter.__iterator(ITERATE_VALUES, reverse); return new Iterator(() => { const step = iterator.next(); return step.done ? step : iteratorValue(type, step.value, step.value, step); }); } } export class FromEntriesSequence extends KeyedSeq { constructor(entries) { this._iter = entries; this.size = entries.size; } entrySeq() { return this._iter.toSeq(); } __iterate(fn, reverse) { return this._iter.__iterate((entry) => { // Check if entry exists first so array access doesn't throw for holes // in the parent iteration. if (entry) { validateEntry(entry); const indexedCollection = isCollection(entry); return fn( indexedCollection ? entry.get(1) : entry[1], indexedCollection ? entry.get(0) : entry[0], this ); } }, reverse); } __iterator(type, reverse) { const iterator = this._iter.__iterator(ITERATE_VALUES, reverse); return new Iterator(() => { while (true) { const step = iterator.next(); if (step.done) { return step; } const entry = step.value; // Check if entry exists first so array access doesn't throw for holes // in the parent iteration. if (entry) { validateEntry(entry); const indexedCollection = isCollection(entry); return iteratorValue( type, indexedCollection ? entry.get(0) : entry[0], indexedCollection ? entry.get(1) : entry[1], step ); } } }); } } ToIndexedSequence.prototype.cacheResult = ToKeyedSequence.prototype.cacheResult = ToSetSequence.prototype.cacheResult = FromEntriesSequence.prototype.cacheResult = cacheResultThrough; export function flipFactory(collection) { const flipSequence = makeSequence(collection); flipSequence._iter = collection; flipSequence.size = collection.size; flipSequence.flip = () => collection; flipSequence.reverse = function () { const reversedSequence = collection.reverse.apply(this); // super.reverse() reversedSequence.flip = () => collection.reverse(); return reversedSequence; }; flipSequence.has = (key) => collection.includes(key); flipSequence.includes = (key) => collection.has(key); flipSequence.cacheResult = cacheResultThrough; flipSequence.__iterateUncached = function (fn, reverse) { return collection.__iterate((v, k) => fn(k, v, this) !== false, reverse); }; flipSequence.__iteratorUncached = function (type, reverse) { if (type === ITERATE_ENTRIES) { const iterator = collection.__iterator(type, reverse); return new Iterator(() => { const step = iterator.next(); if (!step.done) { const k = step.value[0]; step.value[0] = step.value[1]; step.value[1] = k; } return step; }); } return collection.__iterator( type === ITERATE_VALUES ? ITERATE_KEYS : ITERATE_VALUES, reverse ); }; return flipSequence; } export function mapFactory(collection, mapper, context) { const mappedSequence = makeSequence(collection); mappedSequence.size = collection.size; mappedSequence.has = (key) => collection.has(key); mappedSequence.get = (key, notSetValue) => { const v = collection.get(key, NOT_SET); return v === NOT_SET ? notSetValue : mapper.call(context, v, key, collection); }; mappedSequence.__iterateUncached = function (fn, reverse) { return collection.__iterate( (v, k, c) => fn(mapper.call(context, v, k, c), k, this) !== false, reverse ); }; mappedSequence.__iteratorUncached = function (type, reverse) { const iterator = collection.__iterator(ITERATE_ENTRIES, reverse); return new Iterator(() => { const step = iterator.next(); if (step.done) { return step; } const entry = step.value; const key = entry[0]; return iteratorValue( type, key, mapper.call(context, entry[1], key, collection), step ); }); }; return mappedSequence; } export function reverseFactory(collection, useKeys) { const reversedSequence = makeSequence(collection); reversedSequence._iter = collection; reversedSequence.size = collection.size; reversedSequence.reverse = () => collection; if (collection.flip) { reversedSequence.flip = function () { const flipSequence = flipFactory(collection); flipSequence.reverse = () => collection.flip(); return flipSequence; }; } reversedSequence.get = (key, notSetValue) => collection.get(useKeys ? key : -1 - key, notSetValue); reversedSequence.has = (key) => collection.has(useKeys ? key : -1 - key); reversedSequence.includes = (value) => collection.includes(value); reversedSequence.cacheResult = cacheResultThrough; reversedSequence.__iterate = function (fn, reverse) { let i = 0; // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here reverse && ensureSize(collection); return collection.__iterate( (v, k) => fn(v, useKeys ? k : reverse ? this.size - ++i : i++, this), !reverse ); }; reversedSequence.__iterator = (type, reverse) => { let i = 0; // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here reverse && ensureSize(collection); const iterator = collection.__iterator(ITERATE_ENTRIES, !reverse); return new Iterator(() => { const step = iterator.next(); if (step.done) { return step; } const entry = step.value; return iteratorValue( type, // `__iterator` is an arrow function, so `this` is not the reversed // sequence here — read `reversedSequence.size` explicitly. useKeys ? entry[0] : reverse ? reversedSequence.size - ++i : i++, entry[1], step ); }); }; return reversedSequence; } export function filterFactory(collection, predicate, context, useKeys) { const filterSequence = makeSequence(collection); if (useKeys) { filterSequence.has = (key) => { const v = collection.get(key, NOT_SET); return v !== NOT_SET && !!predicate.call(context, v, key, collection); }; filterSequence.get = (key, notSetValue) => { const v = collection.get(key, NOT_SET); return v !== NOT_SET && predicate.call(context, v, key, collection) ? v : notSetValue; }; } filterSequence.__iterateUncached = function (fn, reverse) { let iterations = 0; collection.__iterate((v, k, c) => { if (predicate.call(context, v, k, c)) { iterations++; return fn(v, useKeys ? k : iterations - 1, this); } }, reverse); return iterations; }; filterSequence.__iteratorUncached = function (type, reverse) { const iterator = collection.__iterator(ITERATE_ENTRIES, reverse); let iterations = 0; return new Iterator(() => { while (true) { const step = iterator.next(); if (step.done) { return step; } const entry = step.value; const key = entry[0]; const value = entry[1]; if (predicate.call(context, value, key, collection)) { return iteratorValue(type, useKeys ? key : iterations++, value, step); } } }); }; return filterSequence; } export function countByFactory(collection, grouper, context) { const groups = Map().asMutable(); collection.__iterate((v, k) => { groups.update(grouper.call(context, v, k, collection), 0, (a) => a + 1); }); return groups.asImmutable(); } export function groupByFactory(collection, grouper, context) { const isKeyedIter = isKeyed(collection); const groups = (isOrdered(collection) ? OrderedMap() : Map()).asMutable(); collection.__iterate((v, k) => { groups.update( grouper.call(context, v, k, collection), (a) => ((a = a || []), a.push(isKeyedIter ? [k, v] : v), a) ); }); const coerce = collectionClass(collection); return groups.map((arr) => reify(collection, coerce(arr))).asImmutable(); } export function partitionFactory(collection, predicate, context) { const isKeyedIter = isKeyed(collection); const groups = [[], []]; collection.__iterate((v, k) => { groups[predicate.call(context, v, k, collection) ? 1 : 0].push( isKeyedIter ? [k, v] : v ); }); const coerce = collectionClass(collection); return groups.map((arr) => reify(collection, coerce(arr))); } export function sliceFactory(collection, begin, end, useKeys) { const originalSize = collection.size; if (wholeSlice(begin, end, originalSize)) { return collection; } // begin or end can not be resolved if they were provided as negative numbers and // this collection's size is unknown. In that case, cache first so there is // a known size and these do not resolve to NaN. if (typeof originalSize === 'undefined' && (begin < 0 || end < 0)) { return sliceFactory(collection.toSeq().cacheResult(), begin, end, useKeys); } const resolvedBegin = resolveBegin(begin, originalSize); const resolvedEnd = resolveEnd(end, originalSize); // Note: resolvedEnd is undefined when the original sequence's length is // unknown and this slice did not supply an end and should contain all // elements after resolvedBegin. // In that case, resolvedSize will be NaN and sliceSize will remain undefined. const resolvedSize = resolvedEnd - resolvedBegin; let sliceSize; if (resolvedSize === resolvedSize) { sliceSize = resolvedSize < 0 ? 0 : resolvedSize; } const sliceSeq = makeSequence(collection); // If collection.size is undefined, the size of the realized sliceSeq is // unknown at this point unless the number of items to slice is 0 sliceSeq.size = sliceSize === 0 ? sliceSize : (collection.size && sliceSize) || undefined; if (!useKeys && isSeq(collection) && sliceSize >= 0) { sliceSeq.get = function (index, notSetValue) { index = wrapIndex(this, index); return index >= 0 && index < sliceSize ? collection.get(index + resolvedBegin, notSetValue) : notSetValue; }; } sliceSeq.__iterateUncached = function (fn, reverse) { if (sliceSize === 0) { return 0; } if (reverse) { return this.cacheResult().__iterate(fn, reverse); } let skipped = 0; let isSkipping = true; let iterations = 0; collection.__iterate((v, k) => { if (!(isSkipping && (isSkipping = skipped++ < resolvedBegin))) { iterations++; return ( fn(v, useKeys ? k : iterations - 1, this) !== false && iterations !== sliceSize ); } }); return iterations; }; sliceSeq.__iteratorUncached = function (type, reverse) { if (sliceSize !== 0 && reverse) { return this.cacheResult().__iterator(type, reverse); } // Don't bother instantiating parent iterator if taking 0. if (sliceSize === 0) { return new Iterator(iteratorDone); } const iterator = collection.__iterator(type, reverse); let skipped = 0; let iterations = 0; return new Iterator(() => { while (skipped++ < resolvedBegin) { iterator.next(); } if (++iterations > sliceSize) { return iteratorDone(); } const step = iterator.next(); if (useKeys || type === ITERATE_VALUES || step.done) { return step; } if (type === ITERATE_KEYS) { return iteratorValue(type, iterations - 1, undefined, step); } return iteratorValue(type, iterations - 1, step.value[1], step); }); }; return sliceSeq; } export function takeWhileFactory(collection, predicate, context) { const takeSequence = makeSequence(collection); takeSequence.__iterateUncached = function (fn, reverse) { if (reverse) { return this.cacheResult().__iterate(fn, reverse); } let iterations = 0; collection.__iterate( (v, k, c) => predicate.call(context, v, k, c) && ++iterations && fn(v, k, this) ); return iterations; }; takeSequence.__iteratorUncached = function (type, reverse) { if (reverse) { return this.cacheResult().__iterator(type, reverse); } const iterator = collection.__iterator(ITERATE_ENTRIES, reverse); let iterating = true; return new Iterator(() => { if (!iterating) { return iteratorDone(); } const step = iterator.next(); if (step.done) { return step; } const entry = step.value; const k = entry[0]; const v = entry[1]; if (!predicate.call(context, v, k, this)) { iterating = false; return iteratorDone(); } return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step); }); }; return takeSequence; } export function skipWhileFactory(collection, predicate, context, useKeys) { const skipSequence = makeSequence(collection); skipSequence.__iterateUncached = function (fn, reverse) { if (reverse) { return this.cacheResult().__iterate(fn, reverse); } let isSkipping = true; let iterations = 0; collection.__iterate((v, k, c) => { if (!(isSkipping && (isSkipping = predicate.call(context, v, k, c)))) { iterations++; return fn(v, useKeys ? k : iterations - 1, this); } }); return iterations; }; skipSequence.__iteratorUncached = function (type, reverse) { if (reverse) { return this.cacheResult().__iterator(type, reverse); } const iterator = collection.__iterator(ITERATE_ENTRIES, reverse); let skipping = true; let iterations = 0; return new Iterator(() => { let step; let k; let v; do { step = iterator.next(); if (step.done) { if (useKeys || type === ITERATE_VALUES) { return step; } if (type === ITERATE_KEYS) { return iteratorValue(type, iterations++, undefined, step); } return iteratorValue(type, iterations++, step.value[1], step); } const entry = step.value; k = entry[0]; v = entry[1]; // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here skipping && (skipping = predicate.call(context, v, k, this)); } while (skipping); return type === ITERATE_ENTRIES ? step : iteratorValue(type, k, v, step); }); }; return skipSequence; } class ConcatSeq extends Seq { constructor(iterables) { this._wrappedIterables = iterables.flatMap((iterable) => { if (iterable._wrappedIterables) { return iterable._wrappedIterables; } return [iterable]; }); this.size = this._wrappedIterables.reduce((sum, iterable) => { if (sum !== undefined) { const size = iterable.size; if (size !== undefined) { return sum + size; } } }, 0); this[IS_KEYED_SYMBOL] = this._wrappedIterables[0][IS_KEYED_SYMBOL]; this[IS_INDEXED_SYMBOL] = this._wrappedIterables[0][IS_INDEXED_SYMBOL]; this[IS_ORDERED_SYMBOL] = this._wrappedIterables[0][IS_ORDERED_SYMBOL]; } __iterateUncached(fn, reverse) { if (this._wrappedIterables.length === 0) { return; } if (reverse) { return this.cacheResult().__iterate(fn, reverse); } let iterableIndex = 0; const useKeys = isKeyed(this); const iteratorType = useKeys ? ITERATE_ENTRIES : ITERATE_VALUES; let currentIterator = this._wrappedIterables[iterableIndex].__iterator( iteratorType, reverse ); let keepGoing = true; let index = 0; while (keepGoing) { let next = currentIterator.next(); while (next.done) { iterableIndex++; if (iterableIndex === this._wrappedIterables.length) { return index; } currentIterator = this._wrappedIterables[iterableIndex].__iterator( iteratorType, reverse ); next = currentIterator.next(); } const fnResult = useKeys ? fn(next.value[1], next.value[0], this) : fn(next.value, index, this); keepGoing = fnResult !== false; index++; } return index; } __iteratorUncached(type, reverse) { if (this._wrappedIterables.length === 0) { return new Iterator(iteratorDone); } if (reverse) { return this.cacheResult().__iterator(type, reverse); } let iterableIndex = 0; let currentIterator = this._wrappedIterables[iterableIndex].__iterator( type, reverse ); return new Iterator(() => { let next = currentIterator.next(); while (next.done) { iterableIndex++; if (iterableIndex === this._wrappedIterables.length) { return next; } currentIterator = this._wrappedIterables[iterableIndex].__iterator( type, reverse ); next = currentIterator.next(); } return next; }); } } export function concatFactory(collection, values) { const isKeyedCollection = isKeyed(collection); const iters = [collection] .concat(values) .map((v) => { if (!isCollection(v)) { v = isKeyedCollection ? keyedSeqFromValue(v) : indexedSeqFromValue(Array.isArray(v) ? v : [v]); } else if (isKeyedCollection) { v = KeyedCollection(v); } return v; }) .filter((v) => v.size !== 0); if (iters.length === 0) { return collection; } if (iters.length === 1) { const singleton = iters[0]; if ( singleton === collection || (isKeyedCollection && isKeyed(singleton)) || (isIndexed(collection) && isIndexed(singleton)) ) { return singleton; } } return new ConcatSeq(iters); } export function flattenFactory(collection, depth, useKeys) { const flatSequence = makeSequence(collection); flatSequence.__iterateUncached = function (fn, reverse) { if (reverse) { return this.cacheResult().__iterate(fn, reverse); } let iterations = 0; let stopped = false; function flatDeep(iter, currentDepth) { iter.__iterate((v, k) => { if ((!depth || currentDepth < depth) && isCollection(v)) { flatDeep(v, currentDepth + 1); } else { iterations++; if (fn(v, useKeys ? k : iterations - 1, flatSequence) === false) { stopped = true; } } return !stopped; }, reverse); } flatDeep(collection, 0); return iterations; }; flatSequence.__iteratorUncached = function (type, reverse) { if (reverse) { return this.cacheResult().__iterator(type, reverse); } let iterator = collection.__iterator(type, reverse); const stack = []; let iterations = 0; return new Iterator(() => { while (iterator) { const step = iterator.next(); if (step.done !== false) { iterator = stack.pop(); continue; } let v = step.value; if (type === ITERATE_ENTRIES) { v = v[1]; } if ((!depth || stack.length < depth) && isCollection(v)) { stack.push(iterator); iterator = v.__iterator(type, reverse); } else { return useKeys ? step : iteratorValue(type, iterations++, v, step); } } return iteratorDone(); }); }; return flatSequence; } export function flatMapFactory(collection, mapper, context) { const coerce = collectionClass(collection); return collection .toSeq() .map((v, k) => coerce(mapper.call(context, v, k, collection))) .flatten(true); } export function interposeFactory(collection, separator) { const interposedSequence = makeSequence(collection); interposedSequence.size = collection.size && collection.size * 2 - 1; interposedSequence.__iterateUncached = function (fn, reverse) { let iterations = 0; collection.__iterate( (v) => (!iterations || fn(separator, iterations++, this) !== false) && fn(v, iterations++, this) !== false, reverse ); return iterations; }; interposedSequence.__iteratorUncached = function (type, reverse) { const iterator = collection.__iterator(ITERATE_VALUES, reverse); let iterations = 0; let step; return new Iterator(() => { if (!step || iterations % 2) { step = iterator.next(); if (step.done) { return step; } } return iterations % 2 ? iteratorValue(type, iterations++, separator) : iteratorValue(type, iterations++, step.value, step); }); }; return interposedSequence; } export function sortFactory(collection, comparator, mapper) { if (!comparator) { comparator = defaultComparator; } const isKeyedCollection = isKeyed(collection); let index = 0; const entries = collection .toSeq() .map((v, k) => [k, v, index++, mapper ? mapper(v, k, collection) : v]) .valueSeq() .toArray(); entries .sort((a, b) => comparator(a[3], b[3]) || a[2] - b[2]) .forEach( isKeyedCollection ? (v, i) => { entries[i].length = 2; } : (v, i) => { entries[i] = v[1]; } ); return isKeyedCollection ? KeyedSeq(entries) : isIndexed(collection) ? IndexedSeq(entries) : SetSeq(entries); } export function maxFactory(collection, comparator, mapper) { if (!comparator) { comparator = defaultComparator; } if (mapper) { const entry = collection .toSeq() .map((v, k) => [v, mapper(v, k, collection)]) .reduce((a, b) => (maxCompare(comparator, a[1], b[1]) ? b : a)); return entry && entry[0]; } return collection.reduce((a, b) => (maxCompare(comparator, a, b) ? b : a)); } function maxCompare(comparator, a, b) { const comp = comparator(b, a); // b is considered the new max if the comparator declares them equal, but // they are not equal and b is in fact a nullish value. return ( (comp === 0 && b !== a && (b === undefined || b === null || b !== b)) || comp > 0 ); } export function zipWithFactory(keyIter, zipper, iters, zipAll) { const zipSequence = makeSequence(keyIter); const sizes = new ArraySeq(iters).map((i) => i.size); zipSequence.size = zipAll ? sizes.max() : sizes.min(); // Note: this a generic base implementation of __iterate in terms of // __iterator which may be more generically useful in the future. zipSequence.__iterate = function (fn, reverse) { /* generic: var iterator = this.__iterator(ITERATE_ENTRIES, reverse); var step; var iterations = 0; while (!(step = iterator.next()).done) { iterations++; if (fn(step.value[1], step.value[0], this) === false) { break; } } return iterations; */ // indexed: const iterator = this.__iterator(ITERATE_VALUES, reverse); let step; let iterations = 0; while (!(step = iterator.next()).done) { if (fn(step.value, iterations++, this) === false) { break; } } return iterations; }; zipSequence.__iteratorUncached = function (type, reverse) { const iterators = iters.map( (i) => ((i = Collection(i)), getIterator(reverse ? i.reverse() : i)) ); let iterations = 0; let isDone = false; return new Iterator(() => { let steps; if (!isDone) { steps = iterators.map((i) => i.next()); isDone = zipAll ? steps.every((s) => s.done) : steps.some((s) => s.done); } if (isDone) { return iteratorDone(); } return iteratorValue( type, iterations++, zipper.apply( null, steps.map((s) => s.value) ) ); }); }; return zipSequence; } // #pragma Helper Functions export function reify(iter, seq) { return iter === seq ? iter : isSeq(iter) ? seq : iter.constructor(seq); } function validateEntry(entry) { if (entry !== Object(entry)) { throw new TypeError('Expected [K, V] tuple: ' + entry); } } function collectionClass(collection) { return isKeyed(collection) ? KeyedCollection : isIndexed(collection) ? IndexedCollection : SetCollection; } function makeSequence(collection) { return Object.create( (isKeyed(collection) ? KeyedSeq : isIndexed(collection) ? IndexedSeq : SetSeq ).prototype ); } function cacheResultThrough() { if (this._iter.cacheResult) { this._iter.cacheResult(); this.size = this._iter.size; return this; } return Seq.prototype.cacheResult.call(this); } function defaultComparator(a, b) { if (a === undefined && b === undefined) { return 0; } if (a === undefined) { return 1; } if (b === undefined) { return -1; } return a > b ? 1 : a < b ? -1 : 0; } immutable-js-immutable-js-6a01d72/src/OrderedMap.js000066400000000000000000000077021522056416100221770ustar00rootroot00000000000000import { KeyedCollection } from './Collection'; import { emptyList } from './List'; import { Map, emptyMap } from './Map'; import { DELETE, NOT_SET, SIZE } from './TrieUtils'; import { IS_ORDERED_SYMBOL } from './predicates/isOrdered'; import { isOrderedMap } from './predicates/isOrderedMap'; import assertNotInfinite from './utils/assertNotInfinite'; export class OrderedMap extends Map { // @pragma Construction constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptyOrderedMap() : isOrderedMap(value) ? value : emptyOrderedMap().withMutations((map) => { const iter = KeyedCollection(value); assertNotInfinite(iter.size); iter.forEach((v, k) => map.set(k, v)); }); } static of(/*...values*/) { return this(arguments); } toString() { return this.__toString('OrderedMap {', '}'); } // @pragma Access get(k, notSetValue) { const index = this._map.get(k); return index !== undefined ? this._list.get(index)[1] : notSetValue; } // @pragma Modification clear() { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = 0; this._map.clear(); this._list.clear(); this.__altered = true; return this; } return emptyOrderedMap(); } set(k, v) { return updateOrderedMap(this, k, v); } remove(k) { return updateOrderedMap(this, k, NOT_SET); } __iterate(fn, reverse) { return this._list.__iterate( (entry) => entry && fn(entry[1], entry[0], this), reverse ); } __iterator(type, reverse) { return this._list.fromEntrySeq().__iterator(type, reverse); } __ensureOwner(ownerID) { if (ownerID === this.__ownerID) { return this; } const newMap = this._map.__ensureOwner(ownerID); const newList = this._list.__ensureOwner(ownerID); if (!ownerID) { if (this.size === 0) { return emptyOrderedMap(); } this.__ownerID = ownerID; this.__altered = false; this._map = newMap; this._list = newList; return this; } return makeOrderedMap(newMap, newList, ownerID, this.__hash); } } OrderedMap.isOrderedMap = isOrderedMap; OrderedMap.prototype[IS_ORDERED_SYMBOL] = true; OrderedMap.prototype[DELETE] = OrderedMap.prototype.remove; function makeOrderedMap(map, list, ownerID, hash) { const omap = Object.create(OrderedMap.prototype); omap.size = map ? map.size : 0; omap._map = map; omap._list = list; omap.__ownerID = ownerID; omap.__hash = hash; omap.__altered = false; return omap; } let EMPTY_ORDERED_MAP; export function emptyOrderedMap() { return ( EMPTY_ORDERED_MAP || (EMPTY_ORDERED_MAP = makeOrderedMap(emptyMap(), emptyList())) ); } function updateOrderedMap(omap, k, v) { const map = omap._map; const list = omap._list; const i = map.get(k); const has = i !== undefined; let newMap; let newList; if (v === NOT_SET) { // removed if (!has) { return omap; } if (list.size >= SIZE && list.size >= map.size * 2) { newList = list.filter((entry, idx) => entry !== undefined && i !== idx); newMap = newList .toKeyedSeq() .map((entry) => entry[0]) .flip() .toMap(); if (omap.__ownerID) { newMap.__ownerID = newList.__ownerID = omap.__ownerID; } } else { newMap = map.remove(k); newList = i === list.size - 1 ? list.pop() : list.set(i, undefined); } } else if (has) { if (v === list.get(i)[1]) { return omap; } newMap = map; newList = list.set(i, [k, v]); } else { newMap = map.set(k, list.size); newList = list.set(list.size, [k, v]); } if (omap.__ownerID) { omap.size = newMap.size; omap._map = newMap; omap._list = newList; omap.__hash = undefined; omap.__altered = true; return omap; } return makeOrderedMap(newMap, newList); } immutable-js-immutable-js-6a01d72/src/OrderedSet.js000066400000000000000000000034331522056416100222120ustar00rootroot00000000000000import { KeyedCollection, SetCollection } from './Collection'; import { IndexedCollectionPrototype } from './CollectionImpl'; import { emptyOrderedMap } from './OrderedMap'; import { Set } from './Set'; import { IS_ORDERED_SYMBOL } from './predicates/isOrdered'; import { isOrderedSet } from './predicates/isOrderedSet'; import assertNotInfinite from './utils/assertNotInfinite'; export class OrderedSet extends Set { // @pragma Construction constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptyOrderedSet() : isOrderedSet(value) ? value : emptyOrderedSet().withMutations((set) => { const iter = SetCollection(value); assertNotInfinite(iter.size); iter.forEach((v) => set.add(v)); }); } static of(/*...values*/) { return this(arguments); } static fromKeys(value) { return this(KeyedCollection(value).keySeq()); } toString() { return this.__toString('OrderedSet {', '}'); } } OrderedSet.isOrderedSet = isOrderedSet; const OrderedSetPrototype = OrderedSet.prototype; OrderedSetPrototype[IS_ORDERED_SYMBOL] = true; OrderedSetPrototype.zip = IndexedCollectionPrototype.zip; OrderedSetPrototype.zipWith = IndexedCollectionPrototype.zipWith; OrderedSetPrototype.zipAll = IndexedCollectionPrototype.zipAll; OrderedSetPrototype.__empty = emptyOrderedSet; OrderedSetPrototype.__make = makeOrderedSet; function makeOrderedSet(map, ownerID) { const set = Object.create(OrderedSetPrototype); set.size = map ? map.size : 0; set._map = map; set.__ownerID = ownerID; return set; } let EMPTY_ORDERED_SET; function emptyOrderedSet() { return ( EMPTY_ORDERED_SET || (EMPTY_ORDERED_SET = makeOrderedSet(emptyOrderedMap())) ); } immutable-js-immutable-js-6a01d72/src/PairSorting.ts000066400000000000000000000002411522056416100224170ustar00rootroot00000000000000/** * Describes which item in a pair should be placed first when sorting */ export const PairSorting = { LeftThenRight: -1, RightThenLeft: +1, } as const; immutable-js-immutable-js-6a01d72/src/Range.js000066400000000000000000000070501522056416100212050ustar00rootroot00000000000000import { Iterator, iteratorDone, iteratorValue } from './Iterator'; import { IndexedSeq } from './Seq'; import { resolveBegin, resolveEnd, wholeSlice, wrapIndex } from './TrieUtils'; import deepEqual from './utils/deepEqual'; import invariant from './utils/invariant'; /** * Returns a lazy seq of nums from start (inclusive) to end * (exclusive), by step, where start defaults to 0, step to 1, and end to * infinity. When start is equal to end, returns empty list. */ export class Range extends IndexedSeq { constructor(start, end, step = 1) { if (!(this instanceof Range)) { // eslint-disable-next-line no-constructor-return return new Range(start, end, step); } invariant(step !== 0, 'Cannot step a Range by 0'); invariant( start !== undefined, 'You must define a start value when using Range' ); invariant( end !== undefined, 'You must define an end value when using Range' ); step = Math.abs(step); if (end < start) { step = -step; } this._start = start; this._end = end; this._step = step; this.size = Math.max(0, Math.ceil((end - start) / step - 1) + 1); if (this.size === 0) { if (EMPTY_RANGE) { // eslint-disable-next-line no-constructor-return return EMPTY_RANGE; } // eslint-disable-next-line @typescript-eslint/no-this-alias EMPTY_RANGE = this; } } toString() { return this.size === 0 ? 'Range []' : `Range [ ${this._start}...${this._end}${this._step !== 1 ? ' by ' + this._step : ''} ]`; } get(index, notSetValue) { return this.has(index) ? this._start + wrapIndex(this, index) * this._step : notSetValue; } includes(searchValue) { const possibleIndex = (searchValue - this._start) / this._step; return ( possibleIndex >= 0 && possibleIndex < this.size && possibleIndex === Math.floor(possibleIndex) ); } slice(begin, end) { if (wholeSlice(begin, end, this.size)) { return this; } begin = resolveBegin(begin, this.size); end = resolveEnd(end, this.size); if (end <= begin) { return new Range(0, 0); } return new Range( this.get(begin, this._end), this.get(end, this._end), this._step ); } indexOf(searchValue) { const offsetValue = searchValue - this._start; if (offsetValue % this._step === 0) { const index = offsetValue / this._step; if (index >= 0 && index < this.size) { return index; } } return -1; } lastIndexOf(searchValue) { return this.indexOf(searchValue); } __iterate(fn, reverse) { const size = this.size; const step = this._step; let value = reverse ? this._start + (size - 1) * step : this._start; let i = 0; while (i !== size) { if (fn(value, reverse ? size - ++i : i++, this) === false) { break; } value += reverse ? -step : step; } return i; } __iterator(type, reverse) { const size = this.size; const step = this._step; let value = reverse ? this._start + (size - 1) * step : this._start; let i = 0; return new Iterator(() => { if (i === size) { return iteratorDone(); } const v = value; value += reverse ? -step : step; return iteratorValue(type, reverse ? size - ++i : i++, v); }); } equals(other) { return other instanceof Range ? this._start === other._start && this._end === other._end && this._step === other._step : deepEqual(this, other); } } let EMPTY_RANGE; immutable-js-immutable-js-6a01d72/src/Record.js000066400000000000000000000173641522056416100214000ustar00rootroot00000000000000import { KeyedCollection } from './Collection'; import { CollectionPrototype } from './CollectionImpl'; import { ITERATE_ENTRIES, ITERATOR_SYMBOL } from './Iterator'; import { List } from './List'; import { keyedSeqFromValue } from './Seq'; import { DELETE } from './TrieUtils'; import { asImmutable } from './methods/asImmutable'; import { asMutable } from './methods/asMutable'; import { deleteIn } from './methods/deleteIn'; import { getIn } from './methods/getIn'; import { merge, mergeWith } from './methods/merge'; import { mergeDeep, mergeDeepWith } from './methods/mergeDeep'; import { mergeDeepIn } from './methods/mergeDeepIn'; import { mergeIn } from './methods/mergeIn'; import { setIn } from './methods/setIn'; import { update } from './methods/update'; import { updateIn } from './methods/updateIn'; import { withMutations } from './methods/withMutations'; import { isImmutable } from './predicates/isImmutable'; import { IS_RECORD_SYMBOL, isRecord } from './predicates/isRecord'; import { toJS } from './toJS'; import invariant from './utils/invariant'; import quoteString from './utils/quoteString'; function throwOnInvalidDefaultValues(defaultValues) { if (isRecord(defaultValues)) { throw new Error( 'Can not call `Record` with an immutable Record as default values. Use a plain javascript object instead.' ); } if (isImmutable(defaultValues)) { throw new Error( 'Can not call `Record` with an immutable Collection as default values. Use a plain javascript object instead.' ); } if (defaultValues === null || typeof defaultValues !== 'object') { throw new Error( 'Can not call `Record` with a non-object as default values. Use a plain javascript object instead.' ); } } export class Record { constructor(defaultValues, name) { let hasInitialized; throwOnInvalidDefaultValues(defaultValues); const RecordType = function Record(values) { if (values instanceof RecordType) { return values; } if (!(this instanceof RecordType)) { return new RecordType(values); } if (!hasInitialized) { hasInitialized = true; const keys = Object.keys(defaultValues); const indices = (RecordTypePrototype._indices = {}); // Deprecated: left to attempt not to break any external code which // relies on a ._name property existing on record instances. // Use Record.getDescriptiveName() instead RecordTypePrototype._name = name; RecordTypePrototype._keys = keys; RecordTypePrototype._defaultValues = defaultValues; for (let i = 0; i < keys.length; i++) { const propName = keys[i]; indices[propName] = i; if (RecordTypePrototype[propName]) { /* eslint-disable no-console */ // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here typeof console === 'object' && console.warn && console.warn( 'Cannot define ' + recordName(this) + ' with property "' + propName + '" since that property name is part of the Record API.' ); /* eslint-enable no-console */ } else { setProp(RecordTypePrototype, propName); } } } this.__ownerID = undefined; this._values = List().withMutations((l) => { l.setSize(this._keys.length); KeyedCollection(values).forEach((v, k) => { l.set(this._indices[k], v === this._defaultValues[k] ? undefined : v); }); }); return this; }; const RecordTypePrototype = (RecordType.prototype = Object.create(RecordPrototype)); RecordTypePrototype.constructor = RecordType; if (name) { RecordType.displayName = name; } // eslint-disable-next-line no-constructor-return return RecordType; } toString() { let str = recordName(this) + ' { '; const keys = this._keys; let k; for (let i = 0, l = keys.length; i !== l; i++) { k = keys[i]; str += (i ? ', ' : '') + k + ': ' + quoteString(this.get(k)); } return str + ' }'; } equals(other) { return ( this === other || (isRecord(other) && recordSeq(this).equals(recordSeq(other))) ); } hashCode() { return recordSeq(this).hashCode(); } // @pragma Access has(k) { return this._indices.hasOwnProperty(k); } get(k, notSetValue) { if (!this.has(k)) { return notSetValue; } const index = this._indices[k]; const value = this._values.get(index); return value === undefined ? this._defaultValues[k] : value; } // @pragma Modification set(k, v) { if (this.has(k)) { const newValues = this._values.set( this._indices[k], v === this._defaultValues[k] ? undefined : v ); if (newValues !== this._values && !this.__ownerID) { return makeRecord(this, newValues); } } return this; } remove(k) { return this.set(k); } clear() { const newValues = this._values.clear().setSize(this._keys.length); return this.__ownerID ? this : makeRecord(this, newValues); } wasAltered() { return this._values.wasAltered(); } toSeq() { return recordSeq(this); } toJS() { return toJS(this); } entries() { return this.__iterator(ITERATE_ENTRIES); } __iterator(type, reverse) { return recordSeq(this).__iterator(type, reverse); } __iterate(fn, reverse) { return recordSeq(this).__iterate(fn, reverse); } __ensureOwner(ownerID) { if (ownerID === this.__ownerID) { return this; } const newValues = this._values.__ensureOwner(ownerID); if (!ownerID) { this.__ownerID = ownerID; this._values = newValues; return this; } return makeRecord(this, newValues, ownerID); } } Record.isRecord = isRecord; Record.getDescriptiveName = recordName; const RecordPrototype = Record.prototype; RecordPrototype[IS_RECORD_SYMBOL] = true; RecordPrototype[DELETE] = RecordPrototype.remove; RecordPrototype.deleteIn = RecordPrototype.removeIn = deleteIn; RecordPrototype.getIn = getIn; RecordPrototype.hasIn = CollectionPrototype.hasIn; RecordPrototype.merge = merge; RecordPrototype.mergeWith = mergeWith; RecordPrototype.mergeIn = mergeIn; RecordPrototype.mergeDeep = mergeDeep; RecordPrototype.mergeDeepWith = mergeDeepWith; RecordPrototype.mergeDeepIn = mergeDeepIn; RecordPrototype.setIn = setIn; RecordPrototype.update = update; RecordPrototype.updateIn = updateIn; RecordPrototype.withMutations = withMutations; RecordPrototype.asMutable = asMutable; RecordPrototype.asImmutable = asImmutable; RecordPrototype[ITERATOR_SYMBOL] = RecordPrototype.entries; RecordPrototype.toJSON = RecordPrototype.toObject = CollectionPrototype.toObject; RecordPrototype.inspect = RecordPrototype.toSource = function () { return this.toString(); }; function makeRecord(likeRecord, values, ownerID) { const record = Object.create(Object.getPrototypeOf(likeRecord)); record._values = values; record.__ownerID = ownerID; return record; } function recordName(record) { return record.constructor.displayName || record.constructor.name || 'Record'; } function recordSeq(record) { return keyedSeqFromValue(record._keys.map((k) => [k, record.get(k)])); } function setProp(prototype, name) { try { Object.defineProperty(prototype, name, { get: function () { return this.get(name); }, set: function (value) { invariant(this.__ownerID, 'Cannot set on an immutable record.'); this.set(name, value); }, }); // eslint-disable-next-line @typescript-eslint/no-unused-vars -- TODO enable eslint here } catch (error) { // Object.defineProperty failed. Probably IE8. } } immutable-js-immutable-js-6a01d72/src/Repeat.js000066400000000000000000000044731522056416100213770ustar00rootroot00000000000000import { Iterator, iteratorDone, iteratorValue } from './Iterator'; import { IndexedSeq } from './Seq'; import { resolveBegin, resolveEnd, wholeSlice } from './TrieUtils'; import { is } from './is'; import deepEqual from './utils/deepEqual'; /** * Returns a lazy Seq of `value` repeated `times` times. When `times` is * undefined, returns an infinite sequence of `value`. */ export class Repeat extends IndexedSeq { constructor(value, times) { if (!(this instanceof Repeat)) { // eslint-disable-next-line no-constructor-return return new Repeat(value, times); } this._value = value; this.size = times === undefined ? Infinity : Math.max(0, times); if (this.size === 0) { if (EMPTY_REPEAT) { // eslint-disable-next-line no-constructor-return return EMPTY_REPEAT; } // eslint-disable-next-line @typescript-eslint/no-this-alias EMPTY_REPEAT = this; } } toString() { if (this.size === 0) { return 'Repeat []'; } return 'Repeat [ ' + this._value + ' ' + this.size + ' times ]'; } get(index, notSetValue) { return this.has(index) ? this._value : notSetValue; } includes(searchValue) { return is(this._value, searchValue); } slice(begin, end) { const size = this.size; return wholeSlice(begin, end, size) ? this : new Repeat( this._value, resolveEnd(end, size) - resolveBegin(begin, size) ); } reverse() { return this; } indexOf(searchValue) { if (this.size !== 0 && is(this._value, searchValue)) { return 0; } return -1; } lastIndexOf(searchValue) { if (this.size !== 0 && is(this._value, searchValue)) { return this.size - 1; } return -1; } __iterate(fn, reverse) { const size = this.size; let i = 0; while (i !== size) { if (fn(this._value, reverse ? size - ++i : i++, this) === false) { break; } } return i; } __iterator(type, reverse) { const size = this.size; let i = 0; return new Iterator(() => i === size ? iteratorDone() : iteratorValue(type, reverse ? size - ++i : i++, this._value) ); } equals(other) { return other instanceof Repeat ? is(this._value, other._value) : deepEqual(this, other); } } let EMPTY_REPEAT; immutable-js-immutable-js-6a01d72/src/Seq.js000066400000000000000000000175721522056416100207130ustar00rootroot00000000000000import { Collection } from './Collection'; import { Iterator, getIterator, hasIterator, isEntriesIterable, isIterator, isKeysIterable, iteratorDone, iteratorValue, } from './Iterator'; import { wrapIndex } from './TrieUtils'; import { isAssociative } from './predicates/isAssociative'; import { isCollection } from './predicates/isCollection'; import { isImmutable } from './predicates/isImmutable'; import { isKeyed } from './predicates/isKeyed'; import { IS_ORDERED_SYMBOL } from './predicates/isOrdered'; import { isRecord } from './predicates/isRecord'; import { IS_SEQ_SYMBOL, isSeq } from './predicates/isSeq'; import hasOwnProperty from './utils/hasOwnProperty'; import isArrayLike from './utils/isArrayLike'; export class Seq extends Collection { constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptySequence() : isImmutable(value) ? value.toSeq() : seqFromValue(value); } toSeq() { return this; } toString() { return this.__toString('Seq {', '}'); } cacheResult() { if (!this._cache && this.__iterateUncached) { this._cache = this.entrySeq().toArray(); this.size = this._cache.length; } return this; } // abstract __iterateUncached(fn, reverse) __iterate(fn, reverse) { const cache = this._cache; if (cache) { const size = cache.length; let i = 0; while (i !== size) { const entry = cache[reverse ? size - ++i : i++]; if (fn(entry[1], entry[0], this) === false) { break; } } return i; } return this.__iterateUncached(fn, reverse); } // abstract __iteratorUncached(type, reverse) __iterator(type, reverse) { const cache = this._cache; if (cache) { const size = cache.length; let i = 0; return new Iterator(() => { if (i === size) { return iteratorDone(); } const entry = cache[reverse ? size - ++i : i++]; return iteratorValue(type, entry[0], entry[1]); }); } return this.__iteratorUncached(type, reverse); } } export class KeyedSeq extends Seq { constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptySequence().toKeyedSeq() : isCollection(value) ? isKeyed(value) ? value.toSeq() : value.fromEntrySeq() : isRecord(value) ? value.toSeq() : keyedSeqFromValue(value); } toKeyedSeq() { return this; } } export class IndexedSeq extends Seq { constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptySequence() : isCollection(value) ? isKeyed(value) ? value.entrySeq() : value.toIndexedSeq() : isRecord(value) ? value.toSeq().entrySeq() : indexedSeqFromValue(value); } static of(/*...values*/) { return IndexedSeq(arguments); } toIndexedSeq() { return this; } toString() { return this.__toString('Seq [', ']'); } } export class SetSeq extends Seq { constructor(value) { // eslint-disable-next-line no-constructor-return return ( isCollection(value) && !isAssociative(value) ? value : IndexedSeq(value) ).toSetSeq(); } static of(/*...values*/) { return SetSeq(arguments); } toSetSeq() { return this; } } Seq.isSeq = isSeq; Seq.Keyed = KeyedSeq; Seq.Set = SetSeq; Seq.Indexed = IndexedSeq; Seq.prototype[IS_SEQ_SYMBOL] = true; // #pragma Root Sequences export class ArraySeq extends IndexedSeq { constructor(array) { this._array = array; this.size = array.length; } get(index, notSetValue) { return this.has(index) ? this._array[wrapIndex(this, index)] : notSetValue; } __iterate(fn, reverse) { const array = this._array; const size = array.length; let i = 0; while (i !== size) { const ii = reverse ? size - ++i : i++; if (fn(array[ii], ii, this) === false) { break; } } return i; } __iterator(type, reverse) { const array = this._array; const size = array.length; let i = 0; return new Iterator(() => { if (i === size) { return iteratorDone(); } const ii = reverse ? size - ++i : i++; return iteratorValue(type, ii, array[ii]); }); } } class ObjectSeq extends KeyedSeq { constructor(object) { const keys = Object.keys(object).concat( Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [] ); this._object = object; this._keys = keys; this.size = keys.length; } get(key, notSetValue) { if (notSetValue !== undefined && !this.has(key)) { return notSetValue; } return this._object[key]; } has(key) { return hasOwnProperty.call(this._object, key); } __iterate(fn, reverse) { const object = this._object; const keys = this._keys; const size = keys.length; let i = 0; while (i !== size) { const key = keys[reverse ? size - ++i : i++]; if (fn(object[key], key, this) === false) { break; } } return i; } __iterator(type, reverse) { const object = this._object; const keys = this._keys; const size = keys.length; let i = 0; return new Iterator(() => { if (i === size) { return iteratorDone(); } const key = keys[reverse ? size - ++i : i++]; return iteratorValue(type, key, object[key]); }); } } ObjectSeq.prototype[IS_ORDERED_SYMBOL] = true; class CollectionSeq extends IndexedSeq { constructor(collection) { this._collection = collection; this.size = collection.length || collection.size; } __iterateUncached(fn, reverse) { if (reverse) { return this.cacheResult().__iterate(fn, reverse); } const collection = this._collection; const iterator = getIterator(collection); let iterations = 0; if (isIterator(iterator)) { let step; while (!(step = iterator.next()).done) { if (fn(step.value, iterations++, this) === false) { break; } } } return iterations; } __iteratorUncached(type, reverse) { if (reverse) { return this.cacheResult().__iterator(type, reverse); } const collection = this._collection; const iterator = getIterator(collection); if (!isIterator(iterator)) { return new Iterator(iteratorDone); } let iterations = 0; return new Iterator(() => { const step = iterator.next(); return step.done ? step : iteratorValue(type, iterations++, step.value); }); } } // # pragma Helper functions let EMPTY_SEQ; function emptySequence() { return EMPTY_SEQ || (EMPTY_SEQ = new ArraySeq([])); } export function keyedSeqFromValue(value) { const seq = maybeIndexedSeqFromValue(value); if (seq) { return seq.fromEntrySeq(); } if (typeof value === 'object') { return new ObjectSeq(value); } throw new TypeError( 'Expected Array or collection object of [k, v] entries, or keyed object: ' + value ); } export function indexedSeqFromValue(value) { const seq = maybeIndexedSeqFromValue(value); if (seq) { return seq; } throw new TypeError( 'Expected Array or collection object of values: ' + value ); } function seqFromValue(value) { const seq = maybeIndexedSeqFromValue(value); if (seq) { return isEntriesIterable(value) ? seq.fromEntrySeq() : isKeysIterable(value) ? seq.toSetSeq() : seq; } if (typeof value === 'object') { return new ObjectSeq(value); } throw new TypeError( 'Expected Array or collection object of values, or keyed object: ' + value ); } function maybeIndexedSeqFromValue(value) { return isArrayLike(value) ? new ArraySeq(value) : hasIterator(value) ? new CollectionSeq(value) : undefined; } immutable-js-immutable-js-6a01d72/src/Set.js000066400000000000000000000127761522056416100207170ustar00rootroot00000000000000import { Collection, KeyedCollection, SetCollection } from './Collection'; import { emptyMap } from './Map'; import { sortFactory } from './Operations'; import { OrderedSet } from './OrderedSet'; import { DELETE } from './TrieUtils'; import { asImmutable } from './methods/asImmutable'; import { asMutable } from './methods/asMutable'; import { withMutations } from './methods/withMutations'; import { isOrdered } from './predicates/isOrdered'; import { IS_SET_SYMBOL, isSet } from './predicates/isSet'; import assertNotInfinite from './utils/assertNotInfinite'; export class Set extends SetCollection { // @pragma Construction constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptySet() : isSet(value) && !isOrdered(value) ? value : emptySet().withMutations((set) => { const iter = SetCollection(value); assertNotInfinite(iter.size); iter.forEach((v) => set.add(v)); }); } static of(/*...values*/) { return this(arguments); } static fromKeys(value) { return this(KeyedCollection(value).keySeq()); } static intersect(sets) { sets = Collection(sets).toArray(); return sets.length ? SetPrototype.intersect.apply(Set(sets.pop()), sets) : emptySet(); } static union(sets) { sets = Collection(sets).toArray(); return sets.length ? SetPrototype.union.apply(Set(sets.pop()), sets) : emptySet(); } toString() { return this.__toString('Set {', '}'); } // @pragma Access has(value) { return this._map.has(value); } // @pragma Modification add(value) { return updateSet(this, this._map.set(value, value)); } remove(value) { return updateSet(this, this._map.remove(value)); } clear() { return updateSet(this, this._map.clear()); } // @pragma Composition map(mapper, context) { // keep track if the set is altered by the map function let didChanges = false; const newMap = updateSet( this, this._map.mapEntries(([, v]) => { const mapped = mapper.call(context, v, v, this); if (mapped !== v) { didChanges = true; } return [mapped, mapped]; }, context) ); return didChanges ? newMap : this; } union(...iters) { iters = iters.filter((x) => x.size !== 0); if (iters.length === 0) { return this; } if (this.size === 0 && !this.__ownerID && iters.length === 1) { return this.constructor(iters[0]); } return this.withMutations((set) => { for (let ii = 0; ii < iters.length; ii++) { if (typeof iters[ii] === 'string') { set.add(iters[ii]); } else { SetCollection(iters[ii]).forEach((value) => set.add(value)); } } }); } intersect(...iters) { if (iters.length === 0) { return this; } iters = iters.map((iter) => SetCollection(iter)); const toRemove = []; this.forEach((value) => { if (!iters.every((iter) => iter.includes(value))) { toRemove.push(value); } }); return this.withMutations((set) => { toRemove.forEach((value) => { set.remove(value); }); }); } subtract(...iters) { if (iters.length === 0) { return this; } iters = iters.map((iter) => SetCollection(iter)); const toRemove = []; this.forEach((value) => { if (iters.some((iter) => iter.includes(value))) { toRemove.push(value); } }); return this.withMutations((set) => { toRemove.forEach((value) => { set.remove(value); }); }); } sort(comparator) { // Late binding return OrderedSet(sortFactory(this, comparator)); } sortBy(mapper, comparator) { // Late binding return OrderedSet(sortFactory(this, comparator, mapper)); } wasAltered() { return this._map.wasAltered(); } __iterate(fn, reverse) { return this._map.__iterate((k) => fn(k, k, this), reverse); } __iterator(type, reverse) { return this._map.__iterator(type, reverse); } __ensureOwner(ownerID) { if (ownerID === this.__ownerID) { return this; } const newMap = this._map.__ensureOwner(ownerID); if (!ownerID) { if (this.size === 0) { return this.__empty(); } this.__ownerID = ownerID; this._map = newMap; return this; } return this.__make(newMap, ownerID); } } Set.isSet = isSet; const SetPrototype = Set.prototype; SetPrototype[IS_SET_SYMBOL] = true; SetPrototype[DELETE] = SetPrototype.remove; SetPrototype.merge = SetPrototype.concat = SetPrototype.union; SetPrototype.withMutations = withMutations; SetPrototype.asImmutable = asImmutable; SetPrototype['@@transducer/init'] = SetPrototype.asMutable = asMutable; SetPrototype['@@transducer/step'] = function (result, arr) { return result.add(arr); }; SetPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; SetPrototype.__empty = emptySet; SetPrototype.__make = makeSet; function updateSet(set, newMap) { if (set.__ownerID) { set.size = newMap.size; set._map = newMap; return set; } return newMap === set._map ? set : newMap.size === 0 ? set.__empty() : set.__make(newMap); } function makeSet(map, ownerID) { const set = Object.create(SetPrototype); set.size = map ? map.size : 0; set._map = map; set.__ownerID = ownerID; return set; } let EMPTY_SET; function emptySet() { return EMPTY_SET || (EMPTY_SET = makeSet(emptyMap())); } immutable-js-immutable-js-6a01d72/src/Stack.js000066400000000000000000000126041522056416100212170ustar00rootroot00000000000000import { IndexedCollection } from './Collection'; import { Iterator, iteratorDone, iteratorValue } from './Iterator'; import { ArraySeq } from './Seq'; import { resolveBegin, resolveEnd, wholeSlice, wrapIndex } from './TrieUtils'; import { asImmutable } from './methods/asImmutable'; import { asMutable } from './methods/asMutable'; import { wasAltered } from './methods/wasAltered'; import { withMutations } from './methods/withMutations'; import { IS_STACK_SYMBOL, isStack } from './predicates/isStack'; import assertNotInfinite from './utils/assertNotInfinite'; export class Stack extends IndexedCollection { // @pragma Construction constructor(value) { // eslint-disable-next-line no-constructor-return return value === undefined || value === null ? emptyStack() : isStack(value) ? value : emptyStack().pushAll(value); } static of(/*...values*/) { return this(arguments); } toString() { return this.__toString('Stack [', ']'); } // @pragma Access get(index, notSetValue) { let head = this._head; index = wrapIndex(this, index); while (head && index--) { head = head.next; } return head ? head.value : notSetValue; } peek() { return this._head && this._head.value; } // @pragma Modification push(/*...values*/) { if (arguments.length === 0) { return this; } const newSize = this.size + arguments.length; let head = this._head; for (let ii = arguments.length - 1; ii >= 0; ii--) { head = { value: arguments[ii], next: head, }; } if (this.__ownerID) { this.size = newSize; this._head = head; this.__hash = undefined; this.__altered = true; return this; } return makeStack(newSize, head); } pushAll(iter) { iter = IndexedCollection(iter); if (iter.size === 0) { return this; } if (this.size === 0 && isStack(iter)) { return iter; } assertNotInfinite(iter.size); let newSize = this.size; let head = this._head; iter.__iterate((value) => { newSize++; head = { value: value, next: head, }; }, /* reverse */ true); if (this.__ownerID) { this.size = newSize; this._head = head; this.__hash = undefined; this.__altered = true; return this; } return makeStack(newSize, head); } pop() { return this.slice(1); } clear() { if (this.size === 0) { return this; } if (this.__ownerID) { this.size = 0; this._head = undefined; this.__hash = undefined; this.__altered = true; return this; } return emptyStack(); } slice(begin, end) { if (wholeSlice(begin, end, this.size)) { return this; } let resolvedBegin = resolveBegin(begin, this.size); const resolvedEnd = resolveEnd(end, this.size); if (resolvedEnd !== this.size) { // super.slice(begin, end); return IndexedCollection.prototype.slice.call(this, begin, end); } const newSize = this.size - resolvedBegin; let head = this._head; while (resolvedBegin--) { head = head.next; } if (this.__ownerID) { this.size = newSize; this._head = head; this.__hash = undefined; this.__altered = true; return this; } return makeStack(newSize, head); } // @pragma Mutability __ensureOwner(ownerID) { if (ownerID === this.__ownerID) { return this; } if (!ownerID) { if (this.size === 0) { return emptyStack(); } this.__ownerID = ownerID; this.__altered = false; return this; } return makeStack(this.size, this._head, ownerID, this.__hash); } // @pragma Iteration __iterate(fn, reverse) { if (reverse) { return new ArraySeq(this.toArray()).__iterate( (v, k) => fn(v, k, this), reverse ); } let iterations = 0; let node = this._head; while (node) { if (fn(node.value, iterations++, this) === false) { break; } node = node.next; } return iterations; } __iterator(type, reverse) { if (reverse) { return new ArraySeq(this.toArray()).__iterator(type, reverse); } let iterations = 0; let node = this._head; return new Iterator(() => { if (node) { const value = node.value; node = node.next; return iteratorValue(type, iterations++, value); } return iteratorDone(); }); } } Stack.isStack = isStack; const StackPrototype = Stack.prototype; StackPrototype[IS_STACK_SYMBOL] = true; StackPrototype.shift = StackPrototype.pop; StackPrototype.unshift = StackPrototype.push; StackPrototype.unshiftAll = StackPrototype.pushAll; StackPrototype.withMutations = withMutations; StackPrototype.wasAltered = wasAltered; StackPrototype.asImmutable = asImmutable; StackPrototype['@@transducer/init'] = StackPrototype.asMutable = asMutable; StackPrototype['@@transducer/step'] = function (result, arr) { return result.unshift(arr); }; StackPrototype['@@transducer/result'] = function (obj) { return obj.asImmutable(); }; function makeStack(size, head, ownerID, hash) { const map = Object.create(StackPrototype); map.size = size; map._head = head; map.__ownerID = ownerID; map.__hash = hash; map.__altered = false; return map; } let EMPTY_STACK; function emptyStack() { return EMPTY_STACK || (EMPTY_STACK = makeStack(0)); } immutable-js-immutable-js-6a01d72/src/TrieUtils.ts000066400000000000000000000062361522056416100221140ustar00rootroot00000000000000import type { Collection } from '../type-definitions/immutable'; // Used for setting prototype methods that IE8 chokes on. export const DELETE = 'delete'; // Constants describing the size of trie nodes. export const SHIFT = 5; // Resulted in best performance after ______? export const SIZE = 1 << SHIFT; export const MASK = SIZE - 1; // A consistent shared value representing "not set" which equals nothing other // than itself, and nothing that could be provided externally. export const NOT_SET = {}; type Ref = { value: boolean }; // Boolean references, Rough equivalent of `bool &`. export function MakeRef(): Ref { return { value: false }; } export function SetRef(ref: Ref): void { if (ref) { ref.value = true; } } // A function which returns a value representing an "owner" for transient writes // to tries. The return value will only ever equal itself, and will not equal // the return of any subsequent call of this function. export function OwnerID() {} export function ensureSize(iter: Collection): number { // @ts-expect-error size should exists on Collection if (iter.size === undefined) { // @ts-expect-error size should exists on Collection, __iterate does exist on Collection iter.size = iter.__iterate(returnTrue); } // @ts-expect-error size should exists on Collection return iter.size; } export function wrapIndex( iter: Collection, index: number ): number { // This implements "is array index" which the ECMAString spec defines as: // // A String property name P is an array index if and only if // ToString(ToUint32(P)) is equal to P and ToUint32(P) is not equal // to 2^32−1. // // http://www.ecma-international.org/ecma-262/6.0/#sec-array-exotic-objects if (typeof index !== 'number') { const uint32Index = index >>> 0; // N >>> 0 is shorthand for ToUint32 if ('' + uint32Index !== index || uint32Index === 4294967295) { return NaN; } index = uint32Index; } return index < 0 ? ensureSize(iter) + index : index; } export function returnTrue(): true { return true; } export function wholeSlice(begin: number, end: number, size: number): boolean { return ( ((begin === 0 && !isNeg(begin)) || (size !== undefined && begin <= -size)) && (end === undefined || (size !== undefined && end >= size)) ); } export function resolveBegin(begin: number, size: number): number { return resolveIndex(begin, size, 0); } export function resolveEnd(end: number, size: number): number { return resolveIndex(end, size, size); } function resolveIndex( index: number, size: number, defaultIndex: number ): number { // Sanitize indices using this shorthand for ToInt32(argument) // http://www.ecma-international.org/ecma-262/6.0/#sec-toint32 return index === undefined ? defaultIndex : isNeg(index) ? size === Infinity ? size : Math.max(0, size + index) | 0 : size === undefined || size === index ? index : Math.min(size, index) | 0; } function isNeg(value: number): boolean { // Account for -0 which is negative, but not less than 0. return value < 0 || (value === 0 && 1 / value === -Infinity); } immutable-js-immutable-js-6a01d72/src/fromJS.js000066400000000000000000000030701522056416100213470ustar00rootroot00000000000000import { hasIterator } from './Iterator'; import { Seq } from './Seq'; import { isImmutable } from './predicates/isImmutable'; import { isIndexed } from './predicates/isIndexed'; import { isKeyed } from './predicates/isKeyed'; import isArrayLike from './utils/isArrayLike'; import isPlainObj from './utils/isPlainObj'; export function fromJS(value, converter) { return fromJSWith( [], converter || defaultConverter, value, '', converter && converter.length > 2 ? [] : undefined, { '': value } ); } function fromJSWith(stack, converter, value, key, keyPath, parentValue) { if ( typeof value !== 'string' && !isImmutable(value) && (isArrayLike(value) || hasIterator(value) || isPlainObj(value)) ) { if (~stack.indexOf(value)) { throw new TypeError('Cannot convert circular structure to Immutable'); } stack.push(value); // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here keyPath && key !== '' && keyPath.push(key); const converted = converter.call( parentValue, key, Seq(value).map((v, k) => fromJSWith(stack, converter, v, k, keyPath, value) ), keyPath && keyPath.slice() ); stack.pop(); // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here keyPath && keyPath.pop(); return converted; } return value; } function defaultConverter(k, v) { // Effectively the opposite of "Collection.toSeq()" return isIndexed(v) ? v.toList() : isKeyed(v) ? v.toMap() : v.toSet(); } immutable-js-immutable-js-6a01d72/src/functional/000077500000000000000000000000001522056416100217535ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/src/functional/get.ts000066400000000000000000000036161522056416100231100ustar00rootroot00000000000000import type { Collection, Record } from '../../type-definitions/immutable'; import { isImmutable } from '../predicates/isImmutable'; import { has } from './has'; /** * Returns the value within the provided collection associated with the * provided key, or notSetValue if the key is not defined in the collection. * * A functional alternative to `collection.get(key)` which will also work on * plain Objects and Arrays as an alternative for `collection[key]`. */ export function get(collection: Collection, key: K): V | undefined; export function get( collection: Collection, key: K, notSetValue: NSV ): V | NSV; export function get( record: Record, key: K, notSetValue: unknown ): TProps[K]; export function get(collection: Array, key: number): V | undefined; export function get( collection: Array, key: number, notSetValue: NSV ): V | NSV; export function get( object: C, key: K, notSetValue: unknown ): C[K]; export function get( collection: { [key: string]: V }, key: string ): V | undefined; export function get( collection: { [key: string]: V }, key: string, notSetValue: NSV ): V | NSV; export function get( collection: Collection | Array | { [key: string]: V }, key: K, notSetValue?: NSV ): V | NSV; export function get( collection: Collection | Array | { [key: string]: V }, key: K, notSetValue?: NSV ): V | NSV { return isImmutable(collection) ? collection.get(key, notSetValue) : !has(collection, key) ? notSetValue : // @ts-expect-error weird "get" here, typeof collection.get === 'function' ? // @ts-expect-error weird "get" here, collection.get(key) : // @ts-expect-error key is unknown here, collection[key]; } immutable-js-immutable-js-6a01d72/src/functional/getIn.ts000066400000000000000000000020361522056416100233720ustar00rootroot00000000000000import type { KeyPath } from '../../type-definitions/immutable'; import { NOT_SET } from '../TrieUtils'; import coerceKeyPath from '../utils/coerceKeyPath'; import { get } from './get'; type GetType = typeof get; type GetTypeParameters = Parameters; type CollectionType = GetTypeParameters[0]; type Key = GetTypeParameters[1]; /** * Returns the value at the provided key path starting at the provided * collection, or notSetValue if the key path is not defined. * * A functional alternative to `collection.getIn(keypath)` which will also * work with plain Objects and Arrays. */ export function getIn( collection: CollectionType, searchKeyPath: KeyPath, notSetValue?: GetTypeParameters[2] ): ReturnType { const keyPath = coerceKeyPath(searchKeyPath); let i = 0; while (i !== keyPath.length) { // @ts-expect-error keyPath[i++] can not be undefined by design collection = get(collection, keyPath[i++], NOT_SET); if (collection === NOT_SET) { return notSetValue; } } return collection; } immutable-js-immutable-js-6a01d72/src/functional/has.ts000066400000000000000000000015031522056416100230750ustar00rootroot00000000000000import { isImmutable } from '../predicates/isImmutable'; import hasOwnProperty from '../utils/hasOwnProperty'; import isDataStructure from '../utils/isDataStructure'; /** * Returns true if the key is defined in the provided collection. * * A functional alternative to `collection.has(key)` which will also work with * plain Objects and Arrays as an alternative for * `collection.hasOwnProperty(key)`. */ export function has(collection: object, key: unknown): boolean { return isImmutable(collection) ? // @ts-expect-error key might be a number or symbol, which is not handled be Record key type collection.has(key) : // @ts-expect-error key might be anything else than PropertyKey, and will return false in that case but runtime is OK isDataStructure(collection) && hasOwnProperty.call(collection, key); } immutable-js-immutable-js-6a01d72/src/functional/hasIn.ts000066400000000000000000000007401522056416100233660ustar00rootroot00000000000000import { NOT_SET } from '../TrieUtils'; import { getIn } from './getIn'; type GetInParameters = Parameters; /** * Returns true if the key path is defined in the provided collection. * * A functional alternative to `collection.hasIn(keypath)` which will also * work with plain Objects and Arrays. */ export function hasIn( collection: GetInParameters[0], keyPath: GetInParameters[1] ): boolean { return getIn(collection, keyPath, NOT_SET) !== NOT_SET; } immutable-js-immutable-js-6a01d72/src/functional/merge.js000066400000000000000000000065321522056416100234160ustar00rootroot00000000000000import { IndexedCollection, KeyedCollection } from '../Collection'; import { Seq } from '../Seq'; import { isImmutable } from '../predicates/isImmutable'; import { isIndexed } from '../predicates/isIndexed'; import { isKeyed } from '../predicates/isKeyed'; import hasOwnProperty from '../utils/hasOwnProperty'; import isDataStructure from '../utils/isDataStructure'; import { isProtoKey } from '../utils/protoInjection'; import shallowCopy from '../utils/shallowCopy'; export function merge(collection, ...sources) { return mergeWithSources(collection, sources); } export function mergeWith(merger, collection, ...sources) { return mergeWithSources(collection, sources, merger); } export function mergeDeep(collection, ...sources) { return mergeDeepWithSources(collection, sources); } export function mergeDeepWith(merger, collection, ...sources) { return mergeDeepWithSources(collection, sources, merger); } export function mergeDeepWithSources(collection, sources, merger) { return mergeWithSources(collection, sources, deepMergerWith(merger)); } export function mergeWithSources(collection, sources, merger) { if (!isDataStructure(collection)) { throw new TypeError( 'Cannot merge into non-data-structure value: ' + collection ); } if (isImmutable(collection)) { return typeof merger === 'function' && collection.mergeWith ? collection.mergeWith(merger, ...sources) : collection.merge ? collection.merge(...sources) : collection.concat(...sources); } const isArray = Array.isArray(collection); let merged = collection; const Collection = isArray ? IndexedCollection : KeyedCollection; const mergeItem = isArray ? (value) => { // Copy on write if (merged === collection) { merged = shallowCopy(merged); } merged.push(value); } : (value, key) => { if (isProtoKey(key)) { return; } const hasVal = hasOwnProperty.call(merged, key); const nextVal = hasVal && merger ? merger(merged[key], value, key) : value; if (!hasVal || nextVal !== merged[key]) { // Copy on write if (merged === collection) { merged = shallowCopy(merged); } merged[key] = nextVal; } }; for (let i = 0; i < sources.length; i++) { Collection(sources[i]).forEach(mergeItem); } return merged; } function deepMergerWith(merger) { function deepMerger(oldValue, newValue, key) { return isDataStructure(oldValue) && isDataStructure(newValue) && areMergeable(oldValue, newValue) ? mergeWithSources(oldValue, [newValue], deepMerger) : merger ? merger(oldValue, newValue, key) : newValue; } return deepMerger; } /** * It's unclear what the desired behavior is for merging two collections that * fall into separate categories between keyed, indexed, or set-like, so we only * consider them mergeable if they fall into the same category. */ function areMergeable(oldDataStructure, newDataStructure) { const oldSeq = Seq(oldDataStructure); const newSeq = Seq(newDataStructure); // This logic assumes that a sequence can only fall into one of the three // categories mentioned above (since there's no `isSetLike()` method). return ( isIndexed(oldSeq) === isIndexed(newSeq) && isKeyed(oldSeq) === isKeyed(newSeq) ); } immutable-js-immutable-js-6a01d72/src/functional/remove.ts000066400000000000000000000043351522056416100236250ustar00rootroot00000000000000import type { Collection, Record } from '../../type-definitions/immutable'; import { isImmutable } from '../predicates/isImmutable'; import hasOwnProperty from '../utils/hasOwnProperty'; import isDataStructure from '../utils/isDataStructure'; import shallowCopy from '../utils/shallowCopy'; /** * Returns a copy of the collection with the value at key removed. * * A functional alternative to `collection.remove(key)` which will also work * with plain Objects and Arrays as an alternative for * `delete collectionCopy[key]`. */ export function remove>( collection: C, key: K ): C; export function remove< TProps extends object, C extends Record, K extends keyof TProps, >(collection: C, key: K): C; export function remove>(collection: C, key: number): C; export function remove(collection: C, key: K): C; export function remove< C extends { [key: PropertyKey]: unknown }, K extends keyof C, >(collection: C, key: K): C; export function remove< K, C extends | Collection | Array | { [key: PropertyKey]: unknown }, >(collection: C, key: K): C; export function remove( collection: | Collection | Array | { [key: PropertyKey]: unknown }, key: K ) { if (!isDataStructure(collection)) { throw new TypeError( 'Cannot update non-data-structure value: ' + collection ); } if (isImmutable(collection)) { // @ts-expect-error weird "remove" here, if (!collection.remove) { throw new TypeError( 'Cannot update immutable value without .remove() method: ' + collection ); } // @ts-expect-error weird "remove" here, return collection.remove(key); } // @ts-expect-error assert that key is a string, a number or a symbol here if (!hasOwnProperty.call(collection, key)) { return collection; } const collectionCopy = shallowCopy(collection); if (Array.isArray(collectionCopy)) { // @ts-expect-error assert that key is a number here collectionCopy.splice(key, 1); } else { // @ts-expect-error assert that key is a string, a number or a symbol here delete collectionCopy[key]; } return collectionCopy; } immutable-js-immutable-js-6a01d72/src/functional/removeIn.ts000066400000000000000000000011311522056416100241030ustar00rootroot00000000000000import type { KeyPath } from '../../type-definitions/immutable'; import { NOT_SET } from '../TrieUtils'; import { type PossibleCollection, updateIn } from './updateIn'; /** * Returns a copy of the collection with the value at the key path removed. * * A functional alternative to `collection.removeIn(keypath)` which will also * work with plain Objects and Arrays. */ export function removeIn< K extends PropertyKey, V, TProps extends object, C extends PossibleCollection, >(collection: C, keyPath: KeyPath): C { return updateIn(collection, keyPath, () => NOT_SET); } immutable-js-immutable-js-6a01d72/src/functional/set.ts000066400000000000000000000041361522056416100231220ustar00rootroot00000000000000import type { Collection, Record } from '../../type-definitions/immutable'; import { isImmutable } from '../predicates/isImmutable'; import hasOwnProperty from '../utils/hasOwnProperty'; import isDataStructure from '../utils/isDataStructure'; import { isProtoKey } from '../utils/protoInjection'; import shallowCopy from '../utils/shallowCopy'; /** * Returns a copy of the collection with the value at key set to the provided * value. * * A functional alternative to `collection.set(key, value)` which will also * work with plain Objects and Arrays as an alternative for * `collectionCopy[key] = value`. */ export function set>( collection: C, key: K, value: V ): C; export function set< TProps extends object, C extends Record, K extends keyof TProps, >(record: C, key: K, value: TProps[K]): C; export function set>( collection: C, key: number, value: V ): C; export function set(object: C, key: K, value: C[K]): C; export function set( collection: C, key: string, value: V ): C; export function set | { [key: string]: V }>( collection: C, key: K | string, value: V ): C { if (isProtoKey(key)) { return collection; } if (!isDataStructure(collection)) { throw new TypeError( 'Cannot update non-data-structure value: ' + collection ); } if (isImmutable(collection)) { // @ts-expect-error weird "set" here, if (!collection.set) { throw new TypeError( 'Cannot update immutable value without .set() method: ' + collection ); } // @ts-expect-error weird "set" here, return collection.set(key, value); } // @ts-expect-error mix of key and string here. Probably need a more fine type here if (hasOwnProperty.call(collection, key) && value === collection[key]) { return collection; } const collectionCopy = shallowCopy(collection); // @ts-expect-error mix of key and string here. Probably need a more fine type here collectionCopy[key] = value; return collectionCopy; } immutable-js-immutable-js-6a01d72/src/functional/setIn.ts000066400000000000000000000011771522056416100234130ustar00rootroot00000000000000import type { KeyPath } from '../../type-definitions/immutable'; import { NOT_SET } from '../TrieUtils'; import { type PossibleCollection, updateIn } from './updateIn'; /** * Returns a copy of the collection with the value at the key path set to the * provided value. * * A functional alternative to `collection.setIn(keypath)` which will also * work with plain Objects and Arrays. */ export function setIn< K extends PropertyKey, V, TProps extends object, C extends PossibleCollection, >(collection: C, keyPath: KeyPath, value: unknown): C { return updateIn(collection, keyPath, NOT_SET, () => value); } immutable-js-immutable-js-6a01d72/src/functional/update.ts000066400000000000000000000047371522056416100236200ustar00rootroot00000000000000import type { Collection, Record } from '../../type-definitions/immutable'; import { type PossibleCollection, updateIn } from './updateIn'; type UpdaterFunction = (value: V | undefined) => V | undefined; type UpdaterFunctionWithNSV = (value: V | NSV) => V; /** * Returns a copy of the collection with the value at key set to the result of * providing the existing value to the updating function. * * A functional alternative to `collection.update(key, fn)` which will also * work with plain Objects and Arrays as an alternative for * `collectionCopy[key] = fn(collection[key])`. */ export function update>( collection: C, key: K, updater: (value: V | undefined) => V | undefined ): C; export function update, NSV>( collection: C, key: K, notSetValue: NSV, updater: (value: V | NSV) => V ): C; export function update< TProps extends object, C extends Record, K extends keyof TProps, >(record: C, key: K, updater: (value: TProps[K]) => TProps[K]): C; export function update< TProps extends object, C extends Record, K extends keyof TProps, NSV, >( record: C, key: K, notSetValue: NSV, updater: (value: TProps[K] | NSV) => TProps[K] ): C; export function update>( collection: C, key: number, updater: UpdaterFunction ): C; export function update, NSV>( collection: C, key: number, notSetValue: NSV, updater: (value: V | NSV) => V ): C; export function update( object: C, key: K, updater: (value: C[K]) => C[K] ): C; export function update( object: C, key: K, notSetValue: NSV, updater: (value: C[K] | NSV) => C[K] ): C; export function update( collection: C, key: K, updater: (value: V) => V ): { [key: string]: V }; export function update< V, C extends { [key: string]: V }, K extends keyof C, NSV, >( collection: C, key: K, notSetValue: NSV, updater: (value: V | NSV) => V ): { [key: string]: V }; export function update< K, V, TProps extends object, C extends PossibleCollection, NSV, >( collection: C, key: K, notSetValue: NSV | UpdaterFunction, updater?: UpdaterFunctionWithNSV ) { return updateIn( // @ts-expect-error Index signature for type string is missing in type V[] collection, [key], notSetValue, updater ); } immutable-js-immutable-js-6a01d72/src/functional/updateIn.ts000066400000000000000000000116571522056416100241060ustar00rootroot00000000000000import type { Collection, KeyPath, Record, RetrievePath, } from '../../type-definitions/immutable'; import { emptyMap } from '../Map'; import { NOT_SET } from '../TrieUtils'; import { isImmutable } from '../predicates/isImmutable'; import coerceKeyPath from '../utils/coerceKeyPath'; import isDataStructure from '../utils/isDataStructure'; import quoteString from '../utils/quoteString'; import { get } from './get'; import { remove } from './remove'; import { set } from './set'; /** * Returns a copy of the collection with the value at key path set to the * result of providing the existing value to the updating function. * * A functional alternative to `collection.updateIn(keypath)` which will also * work with plain Objects and Arrays. */ export type PossibleCollection = | Collection | Record | Array; type UpdaterFunction = ( value: RetrievePath> | undefined ) => unknown | undefined; type UpdaterFunctionWithNSV = ( value: RetrievePath> | NSV ) => unknown; export function updateIn>( collection: C, keyPath: KeyPath, updater: UpdaterFunction ): C; export function updateIn, NSV>( collection: C, keyPath: KeyPath, notSetValue: NSV, updater: UpdaterFunctionWithNSV ): C; export function updateIn< TProps extends object, C extends Record, K extends keyof TProps, >(record: C, keyPath: KeyPath, updater: UpdaterFunction): C; export function updateIn< TProps extends object, C extends Record, K extends keyof TProps, NSV, >( record: C, keyPath: KeyPath, notSetValue: NSV, updater: UpdaterFunctionWithNSV ): C; export function updateIn>( collection: C, keyPath: KeyPath, updater: UpdaterFunction ): Array; export function updateIn, NSV>( collection: C, keyPath: KeyPath, notSetValue: NSV, updater: UpdaterFunctionWithNSV ): Array; export function updateIn( object: C, keyPath: KeyPath, updater: UpdaterFunction ): C; export function updateIn( object: C, keyPath: KeyPath, notSetValue: NSV, updater: UpdaterFunctionWithNSV ): C; export function updateIn( collection: C, keyPath: KeyPath, updater: UpdaterFunction ): { [key: PropertyKey]: V }; export function updateIn( collection: C, keyPath: KeyPath, notSetValue: NSV, updater: UpdaterFunction ): { [key: PropertyKey]: V }; export function updateIn< K, V, TProps extends object, C extends PossibleCollection, NSV, >( collection: C, keyPath: KeyPath, notSetValue: NSV | UpdaterFunction | undefined, updater?: UpdaterFunctionWithNSV ): C { if (!updater) { // handle the fact that `notSetValue` is optional here, in that case `updater` is the updater function // @ts-expect-error updater is a function here updater = notSetValue as UpdaterFunction; notSetValue = undefined; } const updatedValue = updateInDeeply( isImmutable(collection), // @ts-expect-error type issues with Record and mixed types collection, coerceKeyPath(keyPath), 0, notSetValue, updater ); // @ts-expect-error mixed return type return updatedValue === NOT_SET ? notSetValue : updatedValue; } function updateInDeeply< K, TProps extends object, C extends PossibleCollection, NSV, >( inImmutable: boolean, existing: C, keyPath: Array, i: number, notSetValue: NSV | undefined, updater: UpdaterFunctionWithNSV | UpdaterFunction ): C { const wasNotSet = existing === NOT_SET; if (i === keyPath.length) { const existingValue = wasNotSet ? notSetValue : existing; // @ts-expect-error mixed type with optional value const newValue = updater(existingValue); // @ts-expect-error mixed type return newValue === existingValue ? existing : newValue; } if (!wasNotSet && !isDataStructure(existing)) { throw new TypeError( 'Cannot update within non-data-structure value in path [' + Array.from(keyPath).slice(0, i).map(quoteString) + ']: ' + existing ); } const key = keyPath[i]; const nextExisting = wasNotSet ? NOT_SET : get(existing, key, NOT_SET); const nextUpdated = updateInDeeply( nextExisting === NOT_SET ? inImmutable : isImmutable(nextExisting), // @ts-expect-error mixed type nextExisting, keyPath, i + 1, notSetValue, updater ); return nextUpdated === nextExisting ? existing : nextUpdated === NOT_SET ? remove(existing, key) : set( wasNotSet ? (inImmutable ? emptyMap() : {}) : existing, key, nextUpdated ); } immutable-js-immutable-js-6a01d72/src/is.ts000066400000000000000000000061651522056416100206040ustar00rootroot00000000000000import { isValueObject } from './predicates/isValueObject'; /** * An extension of the "same-value" algorithm as [described for use by ES6 Map * and Set](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Map#Key_equality) * * NaN is considered the same as NaN, however -0 and 0 are considered the same * value, which is different from the algorithm described by * [`Object.is`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is). * * This is extended further to allow Objects to describe the values they * represent, by way of `valueOf` or `equals` (and `hashCode`). * * Note: because of this extension, the key equality of Immutable.Map and the * value equality of Immutable.Set will differ from ES6 Map and Set. * * ### Defining custom values * * The easiest way to describe the value an object represents is by implementing * `valueOf`. For example, `Date` represents a value by returning a unix * timestamp for `valueOf`: * * var date1 = new Date(1234567890000); // Fri Feb 13 2009 ... * var date2 = new Date(1234567890000); * date1.valueOf(); // 1234567890000 * assert( date1 !== date2 ); * assert( Immutable.is( date1, date2 ) ); * * Note: overriding `valueOf` may have other implications if you use this object * where JavaScript expects a primitive, such as implicit string coercion. * * For more complex types, especially collections, implementing `valueOf` may * not be performant. An alternative is to implement `equals` and `hashCode`. * * `equals` takes another object, presumably of similar type, and returns true * if it is equal. Equality is symmetrical, so the same result should be * returned if this and the argument are flipped. * * assert( a.equals(b) === b.equals(a) ); * * `hashCode` returns a 32bit integer number representing the object which will * be used to determine how to store the value object in a Map or Set. You must * provide both or neither methods, one must not exist without the other. * * Also, an important relationship between these methods must be upheld: if two * values are equal, they *must* return the same hashCode. If the values are not * equal, they might have the same hashCode; this is called a hash collision, * and while undesirable for performance reasons, it is acceptable. * * if (a.equals(b)) { * assert( a.hashCode() === b.hashCode() ); * } * * All Immutable collections are Value Objects: they implement `equals()` * and `hashCode()`. */ export function is(valueA: unknown, valueB: unknown): boolean { if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { return true; } if (!valueA || !valueB) { return false; } if ( typeof valueA.valueOf === 'function' && typeof valueB.valueOf === 'function' ) { valueA = valueA.valueOf(); valueB = valueB.valueOf(); if (valueA === valueB || (valueA !== valueA && valueB !== valueB)) { return true; } if (!valueA || !valueB) { return false; } } return !!( isValueObject(valueA) && isValueObject(valueB) && valueA.equals(valueB) ); } immutable-js-immutable-js-6a01d72/src/methods/000077500000000000000000000000001522056416100212545ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/src/methods/README.md000066400000000000000000000004441522056416100225350ustar00rootroot00000000000000These files represent common methods on Collection types, each will contain references to "this" - expecting to be called as a prototypal method. They are separated into individual files to avoid circular dependencies when possible, and to allow their use in multiple different Collections. immutable-js-immutable-js-6a01d72/src/methods/asImmutable.js000066400000000000000000000001011522056416100240450ustar00rootroot00000000000000export function asImmutable() { return this.__ensureOwner(); } immutable-js-immutable-js-6a01d72/src/methods/asMutable.js000066400000000000000000000002151522056416100235250ustar00rootroot00000000000000import { OwnerID } from '../TrieUtils'; export function asMutable() { return this.__ownerID ? this : this.__ensureOwner(new OwnerID()); } immutable-js-immutable-js-6a01d72/src/methods/deleteIn.js000066400000000000000000000001741522056416100233450ustar00rootroot00000000000000import { removeIn } from '../functional/removeIn'; export function deleteIn(keyPath) { return removeIn(this, keyPath); } immutable-js-immutable-js-6a01d72/src/methods/getIn.js000066400000000000000000000002411522056416100226550ustar00rootroot00000000000000import { getIn as _getIn } from '../functional/getIn'; export function getIn(searchKeyPath, notSetValue) { return _getIn(this, searchKeyPath, notSetValue); } immutable-js-immutable-js-6a01d72/src/methods/hasIn.js000066400000000000000000000002071522056416100226530ustar00rootroot00000000000000import { hasIn as _hasIn } from '../functional/hasIn'; export function hasIn(searchKeyPath) { return _hasIn(this, searchKeyPath); } immutable-js-immutable-js-6a01d72/src/methods/merge.js000066400000000000000000000027411522056416100227150ustar00rootroot00000000000000import { KeyedCollection } from '../Collection'; import { NOT_SET } from '../TrieUtils'; import { update } from '../functional/update'; import { isRecord } from '../predicates/isRecord'; export function merge(...iters) { return mergeIntoKeyedWith(this, iters); } export function mergeWith(merger, ...iters) { if (typeof merger !== 'function') { throw new TypeError('Invalid merger function: ' + merger); } return mergeIntoKeyedWith(this, iters, merger); } function mergeIntoKeyedWith(collection, collections, merger) { const iters = []; for (let ii = 0; ii < collections.length; ii++) { const collection = KeyedCollection(collections[ii]); if (collection.size !== 0) { iters.push(collection); } } if (iters.length === 0) { return collection; } if ( collection.toSeq().size === 0 && !collection.__ownerID && iters.length === 1 ) { return isRecord(collection) ? collection // Record is empty and will not be updated: return the same instance : collection.constructor(iters[0]); } return collection.withMutations((collection) => { const mergeIntoCollection = merger ? (value, key) => { update(collection, key, NOT_SET, (oldVal) => oldVal === NOT_SET ? value : merger(oldVal, value, key) ); } : (value, key) => { collection.set(key, value); }; for (let ii = 0; ii < iters.length; ii++) { iters[ii].forEach(mergeIntoCollection); } }); } immutable-js-immutable-js-6a01d72/src/methods/mergeDeep.js000066400000000000000000000003721522056416100235110ustar00rootroot00000000000000import { mergeDeepWithSources } from '../functional/merge'; export function mergeDeep(...iters) { return mergeDeepWithSources(this, iters); } export function mergeDeepWith(merger, ...iters) { return mergeDeepWithSources(this, iters, merger); } immutable-js-immutable-js-6a01d72/src/methods/mergeDeepIn.js000066400000000000000000000004421522056416100237760ustar00rootroot00000000000000import { emptyMap } from '../Map'; import { mergeDeepWithSources } from '../functional/merge'; import { updateIn } from '../functional/updateIn'; export function mergeDeepIn(keyPath, ...iters) { return updateIn(this, keyPath, emptyMap(), (m) => mergeDeepWithSources(m, iters) ); } immutable-js-immutable-js-6a01d72/src/methods/mergeIn.js000066400000000000000000000004171522056416100232020ustar00rootroot00000000000000import { emptyMap } from '../Map'; import { mergeWithSources } from '../functional/merge'; import { updateIn } from '../functional/updateIn'; export function mergeIn(keyPath, ...iters) { return updateIn(this, keyPath, emptyMap(), (m) => mergeWithSources(m, iters)); } immutable-js-immutable-js-6a01d72/src/methods/setIn.js000066400000000000000000000002011522056416100226650ustar00rootroot00000000000000import { setIn as _setIn } from '../functional/setIn'; export function setIn(keyPath, v) { return _setIn(this, keyPath, v); } immutable-js-immutable-js-6a01d72/src/methods/toObject.js000066400000000000000000000004741522056416100233700ustar00rootroot00000000000000import assertNotInfinite from '../utils/assertNotInfinite'; import { isProtoKey } from '../utils/protoInjection'; export function toObject() { assertNotInfinite(this.size); const object = {}; this.__iterate((v, k) => { if (isProtoKey(k)) { return; } object[k] = v; }); return object; } immutable-js-immutable-js-6a01d72/src/methods/update.js000066400000000000000000000003211522056416100230700ustar00rootroot00000000000000import { update as _update } from '../functional/update'; export function update(key, notSetValue, updater) { return arguments.length === 1 ? key(this) : _update(this, key, notSetValue, updater); } immutable-js-immutable-js-6a01d72/src/methods/updateIn.js000066400000000000000000000002661522056416100233670ustar00rootroot00000000000000import { updateIn as _updateIn } from '../functional/updateIn'; export function updateIn(keyPath, notSetValue, updater) { return _updateIn(this, keyPath, notSetValue, updater); } immutable-js-immutable-js-6a01d72/src/methods/wasAltered.js000066400000000000000000000000721522056416100237040ustar00rootroot00000000000000export function wasAltered() { return this.__altered; } immutable-js-immutable-js-6a01d72/src/methods/withMutations.js000066400000000000000000000002471522056416100244740ustar00rootroot00000000000000export function withMutations(fn) { const mutable = this.asMutable(); fn(mutable); return mutable.wasAltered() ? mutable.__ensureOwner(this.__ownerID) : this; } immutable-js-immutable-js-6a01d72/src/predicates/000077500000000000000000000000001522056416100217345ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/src/predicates/isAssociative.ts000066400000000000000000000013431522056416100251130ustar00rootroot00000000000000import type { Collection } from '../../type-definitions/immutable'; import { isIndexed } from './isIndexed'; import { isKeyed } from './isKeyed'; /** * True if `maybeAssociative` is either a Keyed or Indexed Collection. * * ```js * import { isAssociative, Map, List, Stack, Set } from 'immutable'; * * isAssociative([]); // false * isAssociative({}); // false * isAssociative(Map()); // true * isAssociative(List()); // true * isAssociative(Stack()); // true * isAssociative(Set()); // false * ``` */ export function isAssociative( maybeAssociative: unknown ): maybeAssociative is | Collection.Keyed | Collection.Indexed { return isKeyed(maybeAssociative) || isIndexed(maybeAssociative); } immutable-js-immutable-js-6a01d72/src/predicates/isCollection.ts000066400000000000000000000016151522056416100247360ustar00rootroot00000000000000import type { Collection } from '../../type-definitions/immutable'; // Note: value is unchanged to not break immutable-devtools. export const IS_COLLECTION_SYMBOL = '@@__IMMUTABLE_ITERABLE__@@'; /** * True if `maybeCollection` is a Collection, or any of its subclasses. * * ```js * import { isCollection, Map, List, Stack } from 'immutable'; * * isCollection([]); // false * isCollection({}); // false * isCollection(Map()); // true * isCollection(List()); // true * isCollection(Stack()); // true * ``` */ export function isCollection( maybeCollection: unknown ): maybeCollection is Collection { return Boolean( maybeCollection && // @ts-expect-error: maybeCollection is typed as `{}`, need to change in 6.0 to `maybeCollection && typeof maybeCollection === 'object' && IS_COLLECTION_SYMBOL in maybeCollection` maybeCollection[IS_COLLECTION_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isImmutable.ts000066400000000000000000000014321522056416100245570ustar00rootroot00000000000000import type { Collection, Record } from '../../type-definitions/immutable'; import { isCollection } from './isCollection'; import { isRecord } from './isRecord'; /** * True if `maybeImmutable` is an Immutable Collection or Record. * * Note: Still returns true even if the collections is within a `withMutations()`. * * ```js * import { isImmutable, Map, List, Stack } from 'immutable'; * isImmutable([]); // false * isImmutable({}); // false * isImmutable(Map()); // true * isImmutable(List()); // true * isImmutable(Stack()); // true * isImmutable(Map().asMutable()); // true * ``` */ export function isImmutable( maybeImmutable: unknown ): maybeImmutable is Collection | Record { return isCollection(maybeImmutable) || isRecord(maybeImmutable); } immutable-js-immutable-js-6a01d72/src/predicates/isIndexed.ts000066400000000000000000000015011522056416100242150ustar00rootroot00000000000000import type { Collection } from '../../type-definitions/immutable'; export const IS_INDEXED_SYMBOL = '@@__IMMUTABLE_INDEXED__@@'; /** * True if `maybeIndexed` is a Collection.Indexed, or any of its subclasses. * * ```js * import { isIndexed, Map, List, Stack, Set } from 'immutable'; * * isIndexed([]); // false * isIndexed({}); // false * isIndexed(Map()); // false * isIndexed(List()); // true * isIndexed(Stack()); // true * isIndexed(Set()); // false * ``` */ export function isIndexed( maybeIndexed: unknown ): maybeIndexed is Collection.Indexed { return Boolean( maybeIndexed && // @ts-expect-error: maybeIndexed is typed as `{}`, need to change in 6.0 to `maybeIndexed && typeof maybeIndexed === 'object' && IS_INDEXED_SYMBOL in maybeIndexed` maybeIndexed[IS_INDEXED_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isKeyed.ts000066400000000000000000000013741522056416100237060ustar00rootroot00000000000000import type { Collection } from '../../type-definitions/immutable'; export const IS_KEYED_SYMBOL = '@@__IMMUTABLE_KEYED__@@'; /** * True if `maybeKeyed` is a Collection.Keyed, or any of its subclasses. * * ```js * import { isKeyed, Map, List, Stack } from 'immutable'; * * isKeyed([]); // false * isKeyed({}); // false * isKeyed(Map()); // true * isKeyed(List()); // false * isKeyed(Stack()); // false * ``` */ export function isKeyed( maybeKeyed: unknown ): maybeKeyed is Collection.Keyed { return Boolean( maybeKeyed && // @ts-expect-error: maybeKeyed is typed as `{}`, need to change in 6.0 to `maybeKeyed && typeof maybeKeyed === 'object' && IS_KEYED_SYMBOL in maybeKeyed` maybeKeyed[IS_KEYED_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isList.ts000066400000000000000000000007211522056416100235530ustar00rootroot00000000000000import type { List } from '../../type-definitions/immutable'; export const IS_LIST_SYMBOL = '@@__IMMUTABLE_LIST__@@'; /** * True if `maybeList` is a List. */ export function isList(maybeList: unknown): maybeList is List { return Boolean( maybeList && // @ts-expect-error: maybeList is typed as `{}`, need to change in 6.0 to `maybeList && typeof maybeList === 'object' && IS_LIST_SYMBOL in maybeList` maybeList[IS_LIST_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isMap.ts000066400000000000000000000007521522056416100233610ustar00rootroot00000000000000import type { Map } from '../../type-definitions/immutable'; export const IS_MAP_SYMBOL = '@@__IMMUTABLE_MAP__@@'; /** * True if `maybeMap` is a Map. * * Also true for OrderedMaps. */ export function isMap(maybeMap: unknown): maybeMap is Map { return Boolean( maybeMap && // @ts-expect-error: maybeMap is typed as `{}`, need to change in 6.0 to `maybeMap && typeof maybeMap === 'object' && IS_MAP_SYMBOL in maybeMap` maybeMap[IS_MAP_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isOrdered.ts000066400000000000000000000017751522056416100242360ustar00rootroot00000000000000import type { OrderedCollection } from '../../type-definitions/immutable'; export const IS_ORDERED_SYMBOL = '@@__IMMUTABLE_ORDERED__@@'; /** * True if `maybeOrdered` is a Collection where iteration order is well * defined. True for Collection.Indexed as well as OrderedMap and OrderedSet. * * ```js * import { isOrdered, Map, OrderedMap, List, Set } from 'immutable'; * * isOrdered([]); // false * isOrdered({}); // false * isOrdered(Map()); // false * isOrdered(OrderedMap()); // true * isOrdered(List()); // true * isOrdered(Set()); // false * ``` */ export function isOrdered( maybeOrdered: Iterable ): maybeOrdered is OrderedCollection; export function isOrdered( maybeOrdered: unknown ): maybeOrdered is OrderedCollection { return Boolean( maybeOrdered && // @ts-expect-error: maybeOrdered is typed as `{}`, need to change in 6.0 to `maybeOrdered && typeof maybeOrdered === 'object' && IS_ORDERED_SYMBOL in maybeOrdered` maybeOrdered[IS_ORDERED_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isOrderedMap.ts000066400000000000000000000005651522056416100246700ustar00rootroot00000000000000import type { OrderedMap } from '../../type-definitions/immutable'; import { isMap } from './isMap'; import { isOrdered } from './isOrdered'; /** * True if `maybeOrderedMap` is an OrderedMap. */ export function isOrderedMap( maybeOrderedMap: unknown ): maybeOrderedMap is OrderedMap { return isMap(maybeOrderedMap) && isOrdered(maybeOrderedMap); } immutable-js-immutable-js-6a01d72/src/predicates/isOrderedSet.ts000066400000000000000000000005541522056416100247040ustar00rootroot00000000000000import type { OrderedSet } from '../../type-definitions/immutable'; import { isOrdered } from './isOrdered'; import { isSet } from './isSet'; /** * True if `maybeOrderedSet` is an OrderedSet. */ export function isOrderedSet( maybeOrderedSet: unknown ): maybeOrderedSet is OrderedSet { return isSet(maybeOrderedSet) && isOrdered(maybeOrderedSet); } immutable-js-immutable-js-6a01d72/src/predicates/isRecord.ts000066400000000000000000000007621522056416100240630ustar00rootroot00000000000000import type { Record } from '../../type-definitions/immutable'; export const IS_RECORD_SYMBOL = '@@__IMMUTABLE_RECORD__@@'; /** * True if `maybeRecord` is a Record. */ export function isRecord(maybeRecord: unknown): maybeRecord is Record { return Boolean( maybeRecord && // @ts-expect-error: maybeRecord is typed as `{}`, need to change in 6.0 to `maybeRecord && typeof maybeRecord === 'object' && IS_RECORD_SYMBOL in maybeRecord` maybeRecord[IS_RECORD_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isSeq.ts000066400000000000000000000010101522056416100233600ustar00rootroot00000000000000import type { Seq } from '../../type-definitions/immutable'; export const IS_SEQ_SYMBOL = '@@__IMMUTABLE_SEQ__@@'; /** * True if `maybeSeq` is a Seq. */ export function isSeq( maybeSeq: unknown ): maybeSeq is | Seq.Indexed | Seq.Keyed | Seq.Set { return Boolean( maybeSeq && // @ts-expect-error: maybeSeq is typed as `{}`, need to change in 6.0 to `maybeSeq && typeof maybeSeq === 'object' && MAYBE_SEQ_SYMBOL in maybeSeq` maybeSeq[IS_SEQ_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isSet.ts000066400000000000000000000007451522056416100234010ustar00rootroot00000000000000import type { Set } from '../../type-definitions/immutable'; export const IS_SET_SYMBOL = '@@__IMMUTABLE_SET__@@'; /** * True if `maybeSet` is a Set. * * Also true for OrderedSets. */ export function isSet(maybeSet: unknown): maybeSet is Set { return Boolean( maybeSet && // @ts-expect-error: maybeSet is typed as `{}`, need to change in 6.0 to `maybeSeq && typeof maybeSet === 'object' && MAYBE_SET_SYMBOL in maybeSet` maybeSet[IS_SET_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isStack.ts000066400000000000000000000007451522056416100237130ustar00rootroot00000000000000import type { Stack } from '../../type-definitions/immutable'; export const IS_STACK_SYMBOL = '@@__IMMUTABLE_STACK__@@'; /** * True if `maybeStack` is a Stack. */ export function isStack(maybeStack: unknown): maybeStack is Stack { return Boolean( maybeStack && // @ts-expect-error: maybeStack is typed as `{}`, need to change in 6.0 to `maybeStack && typeof maybeStack === 'object' && MAYBE_STACK_SYMBOL in maybeStack` maybeStack[IS_STACK_SYMBOL] ); } immutable-js-immutable-js-6a01d72/src/predicates/isValueObject.ts000066400000000000000000000012411522056416100250410ustar00rootroot00000000000000import type { ValueObject } from '../../type-definitions/immutable'; /** * True if `maybeValue` is a JavaScript Object which has *both* `equals()` * and `hashCode()` methods. * * Any two instances of *value objects* can be compared for value equality with * `Immutable.is()` and can be used as keys in a `Map` or members in a `Set`. */ export function isValueObject(maybeValue: unknown): maybeValue is ValueObject { return Boolean( maybeValue && // @ts-expect-error: maybeValue is typed as `{}` typeof maybeValue.equals === 'function' && // @ts-expect-error: maybeValue is typed as `{}` typeof maybeValue.hashCode === 'function' ); } immutable-js-immutable-js-6a01d72/src/toJS.ts000066400000000000000000000025501522056416100210420ustar00rootroot00000000000000import type { Collection } from './Collection'; import type { Record } from './Record'; import { Seq } from './Seq'; import { isCollection } from './predicates/isCollection'; import { isKeyed } from './predicates/isKeyed'; import isDataStructure from './utils/isDataStructure'; import { isProtoKey } from './utils/protoInjection'; export function toJS( value: Collection | Record ): Array | { [key: string]: unknown }; export function toJS(value: unknown): unknown; export function toJS( value: unknown ): Array | { [key: string]: unknown } | unknown { if (!value || typeof value !== 'object') { return value; } if (!isCollection(value)) { if (!isDataStructure(value)) { return value; } // @ts-expect-error until Seq has been migrated to TypeScript value = Seq(value); } if (isKeyed(value)) { const result: { [key: string]: unknown } = {}; // @ts-expect-error `__iterate` exists on all Keyed collections but method is not defined in the type value.__iterate((v, k) => { if (isProtoKey(k)) { return; } result[k] = toJS(v); }); return result; } const result: Array = []; // @ts-expect-error value "should" be a non-keyed collection, but we may need to assert for stricter types value.__iterate((v: unknown) => { result.push(toJS(v)); }); return result; } immutable-js-immutable-js-6a01d72/src/utils/000077500000000000000000000000001522056416100207515ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/src/utils/arrCopy.ts000066400000000000000000000007321522056416100227420ustar00rootroot00000000000000// http://jsperf.com/copy-array-inline export default function arrCopy(arr: Array, offset?: number): Array { offset = offset || 0; const len = Math.max(0, arr.length - offset); const newArr: Array = new Array(len); for (let ii = 0; ii < len; ii++) { // @ts-expect-error We may want to guard for undefined values with `if (arr[ii + offset] !== undefined`, but ths should not happen by design newArr[ii] = arr[ii + offset]; } return newArr; } immutable-js-immutable-js-6a01d72/src/utils/assertNotInfinite.ts000066400000000000000000000003111522056416100247640ustar00rootroot00000000000000import invariant from './invariant'; export default function assertNotInfinite(size: number): void { invariant( size !== Infinity, 'Cannot perform this action with an infinite size.' ); } immutable-js-immutable-js-6a01d72/src/utils/coerceKeyPath.ts000066400000000000000000000007471522056416100240570ustar00rootroot00000000000000import type { KeyPath } from '../../type-definitions/immutable'; import { isOrdered } from '../predicates/isOrdered'; import isArrayLike from './isArrayLike'; export default function coerceKeyPath(keyPath: KeyPath): ArrayLike { if (isArrayLike(keyPath) && typeof keyPath !== 'string') { return keyPath; } if (isOrdered(keyPath)) { return keyPath.toArray(); } throw new TypeError( 'Invalid keyPath: expected Ordered Collection or Array: ' + keyPath ); } immutable-js-immutable-js-6a01d72/src/utils/deepEqual.ts000066400000000000000000000056371522056416100232410ustar00rootroot00000000000000import type { Collection } from '../../type-definitions/immutable'; import type { Range } from '../Range'; import type { Repeat } from '../Repeat'; import { NOT_SET } from '../TrieUtils'; import { is } from '../is'; import { isAssociative } from '../predicates/isAssociative'; import { isCollection } from '../predicates/isCollection'; import { isIndexed } from '../predicates/isIndexed'; import { isKeyed } from '../predicates/isKeyed'; import { isOrdered } from '../predicates/isOrdered'; export default function deepEqual( a: Range | Repeat | Collection, b: unknown ): boolean { if (a === b) { return true; } if ( !isCollection(b) || // @ts-expect-error size should exists on Collection (a.size !== undefined && b.size !== undefined && a.size !== b.size) || // @ts-expect-error __hash exists on Collection (a.__hash !== undefined && // @ts-expect-error __hash exists on Collection b.__hash !== undefined && // @ts-expect-error __hash exists on Collection a.__hash !== b.__hash) || isKeyed(a) !== isKeyed(b) || isIndexed(a) !== isIndexed(b) || // @ts-expect-error Range extends Collection, which implements [Symbol.iterator], so it is valid isOrdered(a) !== isOrdered(b) ) { return false; } // @ts-expect-error size should exists on Collection if (a.size === 0 && b.size === 0) { return true; } const notAssociative = !isAssociative(a); // @ts-expect-error Range extends Collection, which implements [Symbol.iterator], so it is valid if (isOrdered(a)) { const entries = a.entries(); // @ts-expect-error need to cast as boolean return ( b.every((v, k) => { const entry = entries.next().value; return entry && is(entry[1], v) && (notAssociative || is(entry[0], k)); }) && entries.next().done ); } let flipped = false; if (a.size === undefined) { // @ts-expect-error size should exists on Collection if (b.size === undefined) { if (typeof a.cacheResult === 'function') { a.cacheResult(); } } else { flipped = true; const _ = a; a = b; b = _; } } let allEqual = true; const bSize: number = // @ts-expect-error b is Range | Repeat | Collection as it may have been flipped, and __iterate is valid b.__iterate((v, k) => { if ( notAssociative ? // @ts-expect-error has exists on Collection !a.has(v) : flipped ? // @ts-expect-error type of `get` does not "catch" the version with `notSetValue` !is(v, a.get(k, NOT_SET)) : // @ts-expect-error type of `get` does not "catch" the version with `notSetValue` !is(a.get(k, NOT_SET), v) ) { allEqual = false; return false; } }); return ( allEqual && // @ts-expect-error size should exists on Collection a.size === bSize ); } immutable-js-immutable-js-6a01d72/src/utils/hasCollection.ts000066400000000000000000000030641522056416100241130ustar00rootroot00000000000000import type { Collection } from '../../type-definitions/immutable'; import { hash } from '../Hash'; import { imul, smi } from '../Math'; import { isKeyed } from '../predicates/isKeyed'; import { isOrdered } from '../predicates/isOrdered'; export function hashCollection(collection: Collection): number { // @ts-expect-error Migrate to CollectionImpl in v6 if (collection.size === Infinity) { return 0; } const ordered = isOrdered(collection); const keyed = isKeyed(collection); let h: number = ordered ? 1 : 0; // @ts-expect-error Migrate to CollectionImpl in v6 collection.__iterate( keyed ? ordered ? (v: V, k: K): void => { h = (31 * h + hashMerge(hash(v), hash(k))) | 0; } : (v: V, k: K): void => { h = (h + hashMerge(hash(v), hash(k))) | 0; } : ordered ? (v: V): void => { h = (31 * h + hash(v)) | 0; } : (v: V): void => { h = (h + hash(v)) | 0; } ); // @ts-expect-error Migrate to CollectionImpl in v6 return murmurHashOfSize(collection.size, h); } function murmurHashOfSize(size: number, h: number): number { h = imul(h, 0xcc9e2d51); h = imul((h << 15) | (h >>> -15), 0x1b873593); h = imul((h << 13) | (h >>> -13), 5); h = ((h + 0xe6546b64) | 0) ^ size; h = imul(h ^ (h >>> 16), 0x85ebca6b); h = imul(h ^ (h >>> 13), 0xc2b2ae35); h = smi(h ^ (h >>> 16)); return h; } function hashMerge(a: number, b: number): number { return (a ^ (b + 0x9e3779b9 + (a << 6) + (a >> 2))) | 0; // int } immutable-js-immutable-js-6a01d72/src/utils/hasOwnProperty.ts000066400000000000000000000000601522056416100243210ustar00rootroot00000000000000export default Object.prototype.hasOwnProperty; immutable-js-immutable-js-6a01d72/src/utils/invariant.ts000066400000000000000000000002141522056416100233110ustar00rootroot00000000000000export default function invariant( condition: unknown, error: string ): asserts condition { if (!condition) throw new Error(error); } immutable-js-immutable-js-6a01d72/src/utils/isArrayLike.ts000066400000000000000000000016611522056416100235440ustar00rootroot00000000000000export default function isArrayLike( value: unknown ): value is ArrayLike { if (Array.isArray(value) || typeof value === 'string') { return true; } // @ts-expect-error "Type 'unknown' is not assignable to type 'boolean'" : convert to Boolean return ( value && typeof value === 'object' && // @ts-expect-error check that `'length' in value &&` Number.isInteger(value.length) && // @ts-expect-error check that `'length' in value &&` value.length >= 0 && // @ts-expect-error check that `'length' in value &&` (value.length === 0 ? // Only {length: 0} is considered Array-like. Object.keys(value).length === 1 : // An object is only Array-like if it has a property where the last value // in the array-like may be found (which could be undefined). // @ts-expect-error check that `'length' in value &&` value.hasOwnProperty(value.length - 1)) ); } immutable-js-immutable-js-6a01d72/src/utils/isDataStructure.ts000066400000000000000000000011201522056416100244410ustar00rootroot00000000000000import type { Collection, Record } from '../../type-definitions/immutable'; import { isImmutable } from '../predicates/isImmutable'; import isPlainObj from './isPlainObj'; /** * Returns true if the value is a potentially-persistent data structure, either * provided by Immutable.js or a plain Array or Object. */ export default function isDataStructure( value: unknown ): value is | Collection | Record | Array | object { return ( typeof value === 'object' && (isImmutable(value) || Array.isArray(value) || isPlainObj(value)) ); } immutable-js-immutable-js-6a01d72/src/utils/isPlainObj.ts000066400000000000000000000014141522056416100233530ustar00rootroot00000000000000const toString = Object.prototype.toString; export default function isPlainObject(value: unknown): value is object { // The base prototype's toString deals with Argument objects and native namespaces like Math if ( !value || typeof value !== 'object' || toString.call(value) !== '[object Object]' ) { return false; } const proto = Object.getPrototypeOf(value); if (proto === null) { return true; } // Iteratively going up the prototype chain is needed for cross-realm environments (differing contexts, iframes, etc) let parentProto = proto; let nextProto = Object.getPrototypeOf(proto); while (nextProto !== null) { parentProto = nextProto; nextProto = Object.getPrototypeOf(parentProto); } return parentProto === proto; } immutable-js-immutable-js-6a01d72/src/utils/mixin.ts000066400000000000000000000012771522056416100224540ustar00rootroot00000000000000type Constructor = new (...args: unknown[]) => T; /** * Contributes additional methods to a constructor */ export default function mixin( ctor: C, // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type methods: Record ): C { const keyCopier = (key: string | symbol): void => { // @ts-expect-error how to handle symbol ? ctor.prototype[key] = methods[key]; }; Object.keys(methods).forEach(keyCopier); // eslint-disable-next-line @typescript-eslint/no-unused-expressions -- TODO enable eslint here Object.getOwnPropertySymbols && Object.getOwnPropertySymbols(methods).forEach(keyCopier); return ctor; } immutable-js-immutable-js-6a01d72/src/utils/protoInjection.ts000066400000000000000000000002241522056416100243250ustar00rootroot00000000000000export function isProtoKey(key: unknown): boolean { return ( typeof key === 'string' && (key === '__proto__' || key === 'constructor') ); } immutable-js-immutable-js-6a01d72/src/utils/quoteString.ts000066400000000000000000000005521522056416100236470ustar00rootroot00000000000000/** * Converts a value to a string, adding quotes if a string was provided. */ export default function quoteString(value: unknown): string { try { return typeof value === 'string' ? JSON.stringify(value) : String(value); // eslint-disable-next-line @typescript-eslint/no-unused-vars } catch (_ignoreError) { return JSON.stringify(value); } } immutable-js-immutable-js-6a01d72/src/utils/shallowCopy.ts000066400000000000000000000011571522056416100236310ustar00rootroot00000000000000import arrCopy from './arrCopy'; import hasOwnProperty from './hasOwnProperty'; import { isProtoKey } from './protoInjection'; export default function shallowCopy(from: Array): Array; export default function shallowCopy(from: O): O; export default function shallowCopy( from: Array | O ): Array | O { if (Array.isArray(from)) { return arrCopy(from); } const to: Partial = {}; for (const key in from) { if (isProtoKey(key)) { continue; } if (hasOwnProperty.call(from, key)) { to[key] = from[key]; } } return to as O; } immutable-js-immutable-js-6a01d72/tsconfig.json000066400000000000000000000011321522056416100215260ustar00rootroot00000000000000{ "compilerOptions": { /* Base Options: */ "esModuleInterop": true, "skipLibCheck": true, "target": "es2022", "allowJs": true, "resolveJsonModule": true, "moduleDetection": "force", "isolatedModules": true, "verbatimModuleSyntax": true, /* Strictness */ "strict": true, "noUncheckedIndexedAccess": true, "noImplicitOverride": true, /* If NOT transpiling with TypeScript: */ "module": "ESNext", "moduleResolution": "bundler", "noEmit": true, /* If your code runs in the DOM: */ "lib": ["es2022", "dom", "dom.iterable"] } } immutable-js-immutable-js-6a01d72/tsconfig.src.json000066400000000000000000000001061522056416100223140ustar00rootroot00000000000000{ "extends": "./tsconfig.json", "include": ["src/Immutable.js"] } immutable-js-immutable-js-6a01d72/tstyche.config.json000066400000000000000000000001721522056416100226440ustar00rootroot00000000000000{ "$schema": "https://tstyche.org/schemas/config.json", "testFileMatch": [ "type-definitions/ts-tests/*.ts" ] } immutable-js-immutable-js-6a01d72/type-definitions/000077500000000000000000000000001522056416100223145ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/000077500000000000000000000000001522056416100244235ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/.flowconfig000066400000000000000000000003131522056416100265560ustar00rootroot00000000000000[include] ../../ [options] module.name_mapper='^immutable$' -> '../../type-definitions/immutable.js.flow' [ignore] 💩 Only interested in testing these files directly in this repo. .*/node_modules/.* immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/covariance.js000066400000000000000000000026711522056416100271010ustar00rootroot00000000000000//@flow import { List, Map, Set, Stack, OrderedMap, OrderedSet } from 'immutable'; class A { x: number; } class B extends A { y: string; } class C { z: string; } // List covariance declare var listOfB: List; var listOfA: List = listOfB; listOfA = List([new B()]); // $FlowExpectedError[incompatible-type-arg] var listOfC: List = listOfB; // Map covariance declare var mapOfB: Map; var mapOfA: Map = mapOfB; mapOfA = Map({ b: new B() }); // $FlowExpectedError[incompatible-type-arg] var mapOfC: Map = mapOfB; // Set covariance declare var setOfB: Set; var setOfA: Set = setOfB; setOfA = Set([new B()]); // $FlowExpectedError[incompatible-type-arg] var setOfC: Set = setOfB; // Stack covariance declare var stackOfB: Stack; var stackOfA: Stack = stackOfB; stackOfA = Stack([new B()]); // $FlowExpectedError[incompatible-type-arg] var stackOfC: Stack = stackOfB; // OrderedMap covariance declare var orderedMapOfB: OrderedMap; var orderedMapOfA: OrderedMap = orderedMapOfB; orderedMapOfA = OrderedMap({ b: new B() }); // $FlowExpectedError[incompatible-type-arg] var orderedMapOfC: OrderedMap = orderedMapOfB; // OrderedSet covariance declare var orderedSetOfB: OrderedSet; var orderedSetOfA: OrderedSet = orderedSetOfB; orderedSetOfA = OrderedSet([new B()]); // $FlowExpectedError[incompatible-type-arg] var orderedSetOfC: OrderedSet = orderedSetOfB; immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/es6-collections.js000066400000000000000000000007341522056416100277760ustar00rootroot00000000000000// @flow import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable'; // Immutable.js collections var mapImmutable: ImmutableMap = ImmutableMap(); var setImmutable: ImmutableSet = ImmutableSet(); var deleteResultImmutable: ImmutableMap = mapImmutable.delete( 'foo' ); // ES6 collections var mapES6: Map = new Map(); var setES6: Set = new Set(); var deleteResultES6: boolean = mapES6.delete('foo'); immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/immutable-flow.js000066400000000000000000001337541522056416100277220ustar00rootroot00000000000000// @flow // Some tests look like they are repeated in order to avoid false positives. // Flow might not complain about an instance of (what it thinks is) T to be assigned to T import Immutable, { List, Map, Stack, Set, Seq, Range, Repeat, Record, OrderedMap, OrderedSet, get, getIn, has, hasIn, merge, mergeDeep, mergeWith, mergeDeepWith, remove, removeIn, set, setIn, update, updateIn, } from 'immutable'; import * as Immutable2 from 'immutable'; import type { KeyedCollection, IndexedCollection, SetCollection, KeyedSeq, IndexedSeq, SetSeq, RecordFactory, RecordOf, } from 'immutable'; /** * Although this looks like dead code, importing `Immutable` and * `Immutable2` tests: * * 1. that default import works -- `import Immutable, {...} from 'immutable' * 2. that importing everything works -- `import * as X from 'immutable'` * 3. that individual imports are supported */ const ImmutableList = Immutable.List; const ImmutableMap = Immutable.Map; const ImmutableStack = Immutable.Stack; const ImmutableSet = Immutable.Set; const ImmutableKeyedCollection: KeyedCollection< *, * > = Immutable.Collection.Keyed(); const ImmutableRange = Immutable.Range; const ImmutableRepeat = Immutable.Repeat; const ImmutableIndexedSeq: IndexedSeq<*> = Immutable.Seq.Indexed(); const Immutable2List = Immutable2.List; const Immutable2Map = Immutable2.Map; const Immutable2Stack = Immutable2.Stack; const Immutable2Set = Immutable2.Set; const Immutable2KeyedCollection: Immutable2.KeyedCollection< *, * > = Immutable2.Collection.Keyed(); const Immutable2Range = Immutable2.Range; const Immutable2Repeat = Immutable2.Repeat; const Immutable2IndexedSeq: Immutable2.IndexedSeq<*> = Immutable2.Seq.Indexed(); var defaultExport: List<*> = Immutable.List(); var moduleExport: List<*> = Immutable2.List(); var numberList: List = List(); var numberOrStringList: List = List(); var nullableNumberList: List = List(); var stringToNumber: Map = Map(); var orderedStringToNumber: OrderedMap = OrderedMap(); var orderedStringToString: OrderedMap = OrderedMap(); var orderedStringToNumberOrString: OrderedMap< string, string | number > = OrderedMap(); var orderedNumberToString: OrderedMap = OrderedMap(); var orderedNumberToNumber: OrderedMap = OrderedMap(); var stringToNumberOrString: Map = Map(); var numberToString: Map = Map(); var stringOrNumberToNumberOrString: Map< string | number, string | number > = Map(); var anyMap: Map = Map(); var numberSet: Set = Set(); var orderedStringSet: OrderedSet = OrderedSet(); var orderedNumberSet: OrderedSet = OrderedSet(); var orderedNumberOrStringSet: OrderedSet = OrderedSet(); var numberOrStringSet: Set = Set(); var stringSet: Set = Set(); var numberStack: Stack = Stack(); var numberOrStringStack: Stack = Stack(); var number: number = 0; var stringToNumberCollection: KeyedCollection = stringToNumber; var numberToStringCollection: KeyedCollection = numberToString; var partitions: [List, List]; numberList = List([1, 2]); var numberListSize: number = numberList.size; numberOrStringList = List(['a', 1]); // $FlowExpectedError[incompatible-call] numberList = List(['a', 'b']); numberList = List.of(1, 2); numberOrStringList = List.of('a', 1); // $FlowExpectedError[incompatible-call] numberList = List.of('a', 1); numberList = List().set(0, 0); numberOrStringList = List.of(0).set(1, 'a'); // $FlowExpectedError[incompatible-call] numberList = List().set(0, 'a'); numberList = List.of(1, 2, 3); // $FlowExpectedError[incompatible-type] var item: number = numberList.get(4); var nullableItem: ?number = numberList.get(4); var itemOrDefault: number = numberList.get(4, 10); // $FlowExpectedError[incompatible-type] var item: number = numberList.first(); // $FlowExpectedError[incompatible-type] var func: () => number = () => numberList.first(); // $FlowExpectedError[incompatible-type] var item: number = numberList.last(); // $FlowExpectedError[incompatible-type] var func: () => number = () => numberList.last(); numberList = List().insert(0, 0); numberOrStringList = List.of(0).insert(1, 'a'); // $FlowExpectedError[incompatible-call] numberList = List().insert(0, 'a'); numberList = List().push(1, 1); numberOrStringList = List().push(1, 'a'); // $FlowExpectedError[incompatible-call] numberList = List().push(0, 'a'); numberList = List().unshift(1, 1); numberOrStringList = List().unshift(1, 'a'); // $FlowExpectedError[incompatible-call] numberList = List().unshift(0, 'a'); numberList = List.of(1).delete(0); // $FlowExpectedError[incompatible-call] numberList = List.of('a').delete(0); numberList = List.of(1).remove(0); // $FlowExpectedError[incompatible-call] numberList = List.of('a').remove(0); numberList = List.of(1).clear(); // $FlowExpectedError[incompatible-call] numberList = List.of('a').clear(); numberList = List.of(1).pop(); // $FlowExpectedError[incompatible-call] numberList = List.of('a').pop(); numberList = List.of(1).shift(); // $FlowExpectedError[incompatible-call] numberList = List.of('a').shift(); numberList = List.of('a').update((value) => List.of(1)); // $FlowExpectedError[incompatible-call] numberList = List.of(1).update((value) => List.of('a')); numberOrStringList = List.of('a').update(0, (value) => 1); // $FlowExpectedError[incompatible-call] numberList = List.of(1).update(0, (value) => 'a'); numberOrStringList = List.of(1).update(1, 0, (value) => 'a'); // $FlowExpectedError[incompatible-call] numberList = List.of(1).update(1, 0, (value) => 'a'); numberList = List.of(1).merge(List.of(2)); numberOrStringList = List.of('a').merge(List.of(1)); // $FlowExpectedError[incompatible-call] numberList = List.of('a').merge(List.of(1)); // Functional API numberList = merge(List([1]), List([2])); numberOrStringList = merge>(List(['a']), List([1])); // $FlowExpectedError[incompatible-call] numberList = merge(List(['a']), List([1])); nullableNumberList = List.of(1).setSize(2); // $FlowExpectedError[incompatible-type] setIn [] replaces the top-most value. number ~> List numberList = List([1]).setIn([], 0); { const x: number = List([1]).setIn([], 0); } // $FlowExpectedError[incompatible-call] "a" is not a valid key for List. numberList = List([1]).setIn(['a'], 0); // $FlowExpectedError[incompatible-type-arg] "a" is not a valid value for List of number. numberList = List([1]).setIn([0], 'a'); numberList = List([1]).setIn([0], 0); // $FlowExpectedError[incompatible-call] "a" is not a valid key for List. List([List([List([1])])]).setIn([0, 0, 'a'], 'a'); // $FlowExpectedError[incompatible-call] "a" is not a valid value for List of number. List([List([List([1])])]).setIn([0, 0, 0], 'a'); List([List([List([1])])]).setIn([0, 0, 0], 123); // $FlowExpectedError[incompatible-type] deleteIn [] replaces the top-most value. void ~> List numberList = List([1]).deleteIn([]); { const x: void = List([1]).deleteIn([]); } // $FlowExpectedError[incompatible-type] numberList = List([1]).removeIn([]); // $FlowExpectedError[incompatible-call] "a" is not a valid key for List. numberList = List([1]).deleteIn(['a']); // $FlowExpectedError[incompatible-call] numberList = List([1]).removeIn(['a']); numberList = List([1]).deleteIn([0]); numberList = List([1]).removeIn([0]); // Functional API // $FlowExpectedError[incompatible-type] deleteIn [] replaces the top-most value. void ~> List numberList = removeIn(List([1]), []); { const x: void = removeIn(List([1]), []); } // $FlowExpectedError[incompatible-call] "a" is not a valid key for List. numberList = removeIn(List([1]), ['a']); numberList = removeIn(List([1]), [0]); // $FlowExpectedError[incompatible-type] updateIn [] replaces the top-most value. number ~> List numberList = List([1]).updateIn([], () => 123); { const x: number = List([1]).updateIn([], () => 123); } // $FlowExpectedError[incompatible-call] - 'a' is not a number numberList = List([1]).updateIn([0], (val) => 'a'); // $FlowExpectedError[incompatible-call] numberList = List([1]).updateIn([0], 0, (val) => 'a'); // $FlowExpectedError[incompatible-call] - 'a' in an invalid argument numberList = List([1]).updateIn([0], 'a'); // $FlowExpectedError[incompatible-call] numberList = List([1]).updateIn([0], 0, 'a'); numberList = List([1]).updateIn([0], (val) => val + 1); numberList = List([1]).updateIn([0], 0, (val) => val + 1); numberList = List.of(1).mergeIn([], []); numberList = List.of(1).mergeDeepIn([], []); numberList = List.of(1).withMutations((mutable) => mutable); numberList = List.of(1).asMutable(); numberList = List.of(1).asImmutable(); numberList = List.of(1).map((value, index, iter) => 1); // $FlowExpectedError[incompatible-call] numberList = List.of(1).map((value, index, iter) => 'a'); numberList = List.of(1).flatMap((value, index, iter) => [1]); // $FlowExpectedError[incompatible-call] numberList = List.of(1).flatMap((value, index, iter) => ['a']); numberList = List.of(1).flatten(); // Specific type for filter(Boolean) which removes nullability. numberList = nullableNumberList.filter(Boolean); partitions = List([1,2,3]).partition(value => value % 2); /* Map */ stringToNumber = Map(); let stringToNumberSize: number = stringToNumber.size; stringToNumberOrString = Map(); numberToString = Map(); stringToNumber = Map({ a: 1 }); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 'a' }); stringToNumber = Map([['a', 1]]); stringToNumber = Map(List([['a', 1]])); // $FlowExpectedError[incompatible-call] stringToNumber = Map([['a', 'b']]); // $FlowExpectedError[incompatible-call] -- this is actually a Map stringToNumber = Map(List([['a', 'a']])); // $FlowFixMe[incompatible-call] - This is Iterable>, ideally it could be interpreted as Iterable<[string, string]> stringToNumber = Map(List([List(['a', 'a'])])); stringOrNumberToNumberOrString = Map({ a: 'a' }).set('b', 1).set(2, 'c'); // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 0 }).set('b', ''); // $FlowExpectedError[incompatible-call] stringToNumber = Map().set(1, ''); // Functional API stringToNumber = set(set(Map({ a: 0 }), 'b', 1), 'c', 2); // $FlowExpectedError[incompatible-call] - Functional API currently requires arguments to have the same value types. stringOrNumberToNumberOrString = set(set(Map({ a: 'a' }), 'b', 1), 2, 'c'); // $FlowExpectedError[incompatible-call] stringToNumber = set(Map({ a: 0 }), 'b', ''); // $FlowExpectedError[incompatible-call] stringToNumber = set(Map(), 1, ''); stringToNumber = Map({ a: 0 }).delete('a'); stringToNumber = Map({ a: 0 }).remove('a'); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 0 }).delete(1); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 0 }).remove(1); stringToNumber = Map({ a: 0 }).deleteAll(['a']); stringToNumber = Map({ a: 0 }).removeAll(['a']); // $FlowExpectedError[prop-missing] stringToNumber = Map({ a: 0 }).deleteAll(1); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 0 }).deleteAll([1]); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 0 }).removeAll([1]); stringToNumber = Map({ a: 0 }).clear(); stringToNumber = Map({ a: 1 }).update((value) => Map({ a: 1 })); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 1 }).update((value) => Map({ '1': 'a' })); stringToNumberOrString = Map({ a: 1 }).update('a', (value) => 'a'); // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 1 }).update('a', (value) => 'a'); stringToNumberOrString = Map({ a: 1 }).update('a', 'b', (value) => 'a'); // $FlowExpectedError[incompatible-type-arg] // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 1 }).update('a', 'b', (value) => 'a'); // $FlowExpectedError[incompatible-type-arg] stringToNumberOrString = Map({ a: 1 }).merge({ a: { a: '1' } }); // $FlowExpectedError[incompatible-type-arg] stringToNumberOrString = Map({ a: 1 }).update('a', 'b', (value) => { a: '1'; }); stringToNumber = Map({ a: 1 }).merge(Map({ a: 1 })); stringToNumberOrString = Map({ a: 1 }).merge({ a: 'b' }); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 1 }).merge({ a: 'b' }); // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 1 }).merge([[1, 'a']]); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 1 }).merge(numberToString); // Functional API stringToNumber = merge(Map({ a: 1 }), Map({ a: 1 })); // $FlowExpectedError[incompatible-call] - Functional API currently requires arguments to have the same value types. stringToNumberOrString = merge(Map({ a: 1 }), { a: 'b' }); // $FlowExpectedError[incompatible-call] stringToNumber = merge(Map({ a: 1 }), { a: 'b' }); // $FlowExpectedError[incompatible-call] stringToNumber = merge(Map({ a: 1 }), [[1, 'a']]); // $FlowExpectedError[incompatible-call] stringToNumber = merge(Map({ a: 1 }), numberToString); stringToNumber = Map({ a: 1 }).mergeWith((previous, next, key) => 1, { a: 2, b: 2, }); stringToNumber = Map({ a: 1 }).mergeWith( // $FlowExpectedError[incompatible-call] (previous, next, key) => previous + next, // $FlowExpectedError[incompatible-type-arg] { a: '2', b: '2' } ); stringToNumberOrString = Map({ a: 1 }).mergeWith( (previous, next, key) => previous + next, { a: '2', b: '2' } ); // $FlowExpectedError[incompatible-call] - the array [1] is not a valid argument stringToNumber = Map({ a: 1 }).mergeWith((previous, next, key) => 1, [1]); stringToNumberOrString = Map({ a: 1 }).mergeDeep({ a: 'b' }); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 1 }).mergeDeep({ a: 'b' }); stringToNumber = Map({ a: 1 }).mergeDeepWith((previous, next, key) => 1, { a: 2, b: 2, }); stringToNumber = Map({ a: 1 }).mergeDeepWith( (previous, next, key) => 1, // $FlowExpectedError[incompatible-type-arg] { a: '2', b: '2' } ); stringToNumberOrString = Map({ a: 1 }).mergeDeepWith( (previous, next, key) => 1, { a: '2', b: '2' } ); // $FlowExpectedError[incompatible-call] - the array [1] is not a valid argument stringToNumber = Map({ a: 1 }).mergeDeepWith((previous, next, key) => 1, [1]); // KeyedSeq can merge into Map var stringToStringSeq: KeyedSeq = Seq({ b: 'B' }); stringToNumberOrString = Map({ a: 1 }).merge(stringToStringSeq); // $FlowExpectedError[incompatible-type] stringToNumber = Map({ a: 1 }).setIn([], 0); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 1 }).setIn(['a'], 'a'); stringToNumber = Map({ a: 1 }).setIn(['a'], 0); // $FlowExpectedError[incompatible-type] stringToNumber = Map({ a: 1 }).deleteIn([]); // $FlowExpectedError[incompatible-type] stringToNumber = Map({ a: 1 }).removeIn([]); stringToNumber = Map({ a: 1 }).deleteIn(['a']); stringToNumber = Map({ a: 1 }).removeIn(['a']); // $FlowExpectedError[incompatible-type] Map({ a: 1 }).updateIn([], (v) => v + 1); // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 1 }).updateIn(['a'], (v) => 'a'); stringToNumber = Map({ a: 1 }).updateIn(['a'], (v) => v + 1); stringToNumber = Map({ a: 1 }).updateIn(['a'], 0, (v) => v + 1); Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 'z'], (v) => v + 1); Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn( ['x', 'y', 'z'], 0, (v) => v + 1 ); // $FlowExpectedError[incompatible-call] Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 1], (v) => v + 1); // $FlowExpectedError[incompatible-call] Map({ x: Map({ y: Map({ z: 1 }) }) }).updateIn(['x', 'y', 'z'], (v) => 'a'); stringToNumber = Map({ a: 1 }).mergeIn([], []); stringToNumber = Map({ a: 1 }).mergeDeepIn([], []); anyMap = Map({ a: {} }).mergeIn(['a'], Map({ b: 2 })); anyMap = Map({ a: {} }).mergeDeepIn(['a'], Map({ b: 2 })); anyMap = Map({ a: {} }).mergeIn(['a'], List([1, 2])); anyMap = Map({ a: {} }).mergeDeepIn(['a'], List([1, 2])); anyMap = Map({ a: {} }).mergeIn(['a'], { b: 2 }); anyMap = Map({ a: {} }).mergeDeepIn(['a'], { b: 2 }); // $FlowExpectedError[incompatible-call]: not iterable / object anyMap = Map({ a: {} }).mergeIn(['a'], 1); // $FlowExpectedError[incompatible-call]: not iterable / object anyMap = Map({ a: {} }).mergeDeepIn(['a'], 1); // $FlowExpectedError[incompatible-type-arg]: bad key type stringToNumber = Map({ a: {} }).mergeIn([1], { b: 2 }); // $FlowExpectedError[incompatible-type-arg]: bad key type stringToNumber = Map({ a: {} }).mergeDeepIn([1], { b: 2 }); stringToNumber = Map({ a: 1 }).withMutations((mutable) => mutable); stringToNumber = Map({ a: 1 }).asMutable(); stringToNumber = Map({ a: 1 }).asImmutable(); stringToNumber = Map({ a: 1 }).map((value, index, iter) => 1); // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 1 }).map((value, index, iter) => 'a'); stringToNumber = Map({ a: 1 }).flatMap((value, index, iter) => [['b', 1]]); // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 1 }).flatMap((value, index, iter) => [['a', 'a']]); // $FlowExpectedError[incompatible-call] stringToNumber = Map({ a: 1 }).flatMap((value, index, iter) => Map({ a: 'a' })); numberToString = Map({ a: 1 }).flip(); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 1 }).flip(); numberToString = Map({ a: 'a' }).mapKeys((key, value, iter) => 1); // $FlowExpectedError[incompatible-type-arg] stringToNumber = Map({ a: 1 }).mapKeys((key, value, iter) => 1); anyMap = Map({ a: 1 }).flatten(); var stringToNullableNumber = Map({ a: 1, b: null }); // $FlowExpectedError[incompatible-type-arg] stringToNumber = stringToNullableNumber; // Specific type for filter(Boolean) which removes nullability. stringToNumber = stringToNullableNumber.filter(Boolean); [anyMap, ] = Map({ "a": 1, "b": 2}).partition((key, index, iter) => key % 2) /* OrderedMap */ orderedStringToNumber = Map({ a: 1 }).toOrderedMap(); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap orderedStringToNumber = Map({ a: 'b' }).toOrderedMap(); orderedStringToString = Map({ a: 'b' }).toOrderedMap(); orderedStringToNumber = OrderedMap({ a: 1 }); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: '1' }); orderedStringToString = OrderedMap({ a: '1' }); orderedStringToNumber = OrderedMap(Map({ a: 1 })); // $FlowExpectedError[incompatible-type-arg] - it's actually an OrderedMap orderedStringToNumber = OrderedMap(Map({ a: '1' })); orderedStringToNumber = OrderedMap(); orderedStringToNumber = OrderedMap().set('b', 2); // $FlowExpectedError[incompatible-call] - this is actually an OrderedMap orderedStringToNumber = OrderedMap().set('b', '2'); orderedStringToString = OrderedMap().set('b', '2'); orderedStringToNumber = OrderedMap({ a: 1 }).delete('a'); orderedStringToNumber = OrderedMap({ a: 1 }).remove('a'); orderedStringToNumber = OrderedMap({ a: 1 }).clear(); orderedStringToNumber = OrderedMap({ a: 1 }).update(() => OrderedMap({ b: 1 })); /** * TODO: the following is valid but I question if it should be valid: * * ``` * const x: OrderedMap = OrderedMap({'a': 1}) * .update(() => OrderedMap({'b': '1'})) * ``` * * In the above example, `update` is changing an OrderedMap to an OrderedMap * This seems inconsistent with the typescript signature of * * ``` * update(updater: (value: Map) => Map): Map * ``` */ orderedStringToNumber = OrderedMap({ a: 1 }).update(() => // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap OrderedMap({ b: '1' }) ); orderedStringToString = OrderedMap({ a: 1 }).update(() => OrderedMap({ b: '1' }) ); orderedStringToNumber = OrderedMap({ a: 1 }).update('a', (value) => value + 1); /** * TODO: is the below the intended functionality? The typescript signature looks like * * ``` * update(key: K, updater: (value: V) => V): Map; * ``` * * so it seems like in this case the updater should only be able to return numbers. * This comment applies to all of the update / merge functions in Map and OrderedMap */ // $FlowExpectedError[incompatible-call] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: 1 }).update('a', () => 'b'); orderedStringToNumberOrString = OrderedMap({ a: 1 }).update('a', () => 'b'); orderedStringToNumber = OrderedMap({ a: 1 }).update( 'a', 0, (value) => value + 1 ); // $FlowExpectedError[incompatible-call] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: 1 }).update('a', 0, () => 'b'); orderedStringToNumberOrString = OrderedMap({ a: 1 }).update('a', 0, () => 'b'); orderedStringToNumber = OrderedMap({ a: 1 }).merge({ b: 2 }); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: 1 }).merge({ b: '2' }); orderedStringToNumberOrString = OrderedMap({ a: 1 }).merge({ b: '2' }); orderedStringToNumber = OrderedMap({ a: 1 }).mergeWith( (prev, next) => next, { a: 2, b: 3 } ); orderedStringToNumber = OrderedMap({ a: 1 }).mergeWith( // $FlowExpectedError[incompatible-call] (prev, next) => next, // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap { a: '2', b: '3' } ); orderedStringToNumberOrString = OrderedMap({ a: 1 }).mergeWith( (prev, next) => next, { a: '2', b: '3' } ); // $FlowExpectedError[incompatible-call] - the array [1] is not a valid argument orderedStringToNumber = OrderedMap({ a: 1 }).mergeWith((prev, next) => next, [ 1, ]); orderedStringToNumber = OrderedMap({ a: 1 }).mergeDeep({ a: 2 }); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: 1 }).mergeDeep({ a: '2' }); orderedStringToNumberOrString = OrderedMap({ a: 1 }).mergeDeep({ a: '2' }); orderedStringToNumber = OrderedMap({ a: 1 }).mergeDeepWith( (prev, next) => next, { a: 2, b: 3 } ); orderedStringToNumber = OrderedMap({ a: 1 }).mergeDeepWith( (prev, next) => next, // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap { a: '2', b: '3' } ); orderedStringToNumberOrString = OrderedMap({ a: 1 }).mergeDeepWith( (prev, next) => next, { a: '2', b: '3' } ); orderedStringToNumber = OrderedMap({ a: 1 }).mergeDeepWith( (prev, next) => next, // $FlowExpectedError[incompatible-call] - the array [1] is an invalid argument [1] ); // $FlowExpectedError[incompatible-type] orderedStringToNumber = OrderedMap({ a: 1 }).setIn([], 3); // $FlowExpectedError[incompatible-type-arg] orderedStringToNumber = OrderedMap({ a: 1 }).setIn([1], 3); orderedStringToNumber = OrderedMap({ a: 1 }).setIn(['a'], 3); // $FlowExpectedError[incompatible-type] orderedStringToNumber = OrderedMap({ a: 1 }).deleteIn([]); // $FlowExpectedError[incompatible-type] orderedStringToNumber = OrderedMap({ a: 1 }).removeIn([]); // $FlowExpectedError[incompatible-type-arg] orderedStringToNumber = OrderedMap({ a: 1 }).deleteIn([1]); // $FlowExpectedError[incompatible-type-arg] orderedStringToNumber = OrderedMap({ a: 1 }).removeIn([1]); orderedStringToNumber = OrderedMap({ a: 1 }).deleteIn(['b']); orderedStringToNumber = OrderedMap({ a: 1 }).removeIn(['b']); // $FlowExpectedError[incompatible-type] orderedStringToNumber = OrderedMap({ a: 1 }).updateIn([], (v) => v + 1); // $FlowExpectedError[incompatible-type-arg] orderedStringToNumber = OrderedMap({ a: 1 }).updateIn([1], (v) => v + 1); // $FlowExpectedError[incompatible-call] orderedStringToNumber = OrderedMap({ a: 1 }).updateIn(['a'], (v) => 'a'); orderedStringToNumber = OrderedMap({ a: 1 }).updateIn(['a'], (v) => v + 1); orderedStringToNumber = OrderedMap({ a: 1 }).updateIn(['a'], 0, (v) => v + 1); // $FlowExpectedError[incompatible-call] OrderedMap({ x: OrderedMap({ y: 1 }) }).updateIn(['x', 1], (v) => v + 1); // $FlowExpectedError[incompatible-call] OrderedMap({ x: OrderedMap({ y: 1 }) }).updateIn(['x', 'y'], (v) => 'a'); OrderedMap({ x: OrderedMap({ y: 1 }) }).updateIn(['x', 'y'], (v) => v + 1); OrderedMap({ x: OrderedMap({ y: 1 }) }).updateIn(['x', 'y'], 0, (v) => v + 1); orderedStringToNumber = OrderedMap({ a: 1 }).mergeIn([], { b: 2 }); orderedStringToNumber = OrderedMap({ a: 1 }).mergeDeepIn([], { b: 2 }); orderedStringToNumber = OrderedMap({ a: 1 }).withMutations((mutable) => mutable.set('b', 2) ); orderedStringToNumber = OrderedMap({ a: 1 }).asMutable(); orderedStringToNumber = OrderedMap({ a: 1 }).asImmutable(); orderedStringToNumber = OrderedMap({ a: 1 }).map((v) => v + 1); // $FlowExpectedError[incompatible-call] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: 1 }).map(() => 'a'); orderedStringToString = OrderedMap({ a: 1 }).map(() => 'a'); orderedStringToNumber = OrderedMap({ a: 1 }).flatMap((v, k) => OrderedMap({ [k]: v + 1 }) ); orderedStringToNumber = OrderedMap({ a: 1 }).flatMap((v, k) => // $FlowExpectedError[incompatible-call] - string "a" is not a number OrderedMap({ [k]: 'a' }) ); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: 1 }).flip(); orderedNumberToString = OrderedMap({ a: 1 }).flip(); orderedStringToNumber = OrderedMap({ a: 1 }).mapKeys((x) => x); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedMap orderedStringToNumber = OrderedMap({ a: 1 }).mapKeys((x) => 1); orderedNumberToNumber = OrderedMap({ a: 1 }).mapKeys((x) => 1); orderedStringToNumber = OrderedMap({ a: 1 }).flatten(); orderedStringToNumber = OrderedMap({ a: 1 }).flatten(1); orderedStringToNumber = OrderedMap({ a: 1 }).flatten(true); // $FlowExpectedError[incompatible-call] - 'a' is an invalid argument orderedStringToNumber = OrderedMap({ a: 1 }).flatten('a'); /* Set */ numberSet = Set(); numberOrStringSet = Set(); stringSet = Set(); numberSet = Set([1, 2, 3]); // $FlowExpectedError[incompatible-call] numberSet = Set(['a', 'b']); numberSet = Set.of(1, 2); // $FlowExpectedError[incompatible-call] numberSet = Set.of('a', 'b'); numberSet = Set.fromKeys(Map().set(1, '')); stringSet = Set.fromKeys({ a: '' }); // $FlowExpectedError[incompatible-type-arg] numberSet = Set.fromKeys(Map({ a: 1 })); // $FlowExpectedError[incompatible-type-arg] numberSet = Set.fromKeys({ a: 1 }); numberOrStringSet = Set([1]).add('a'); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).add('s'); numberSet = Set([1]).delete(1); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).delete('a'); // $FlowExpectedError[incompatible-call] numberSet = Set(['a']).delete('a'); numberSet = Set([1]).remove(1); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).remove('a'); // $FlowExpectedError[incompatible-call] numberSet = Set(['a']).remove('a'); numberSet = Set([1]).clear(); // $FlowExpectedError[incompatible-call] numberSet = Set(['a']).clear(); numberOrStringSet = Set(['a']).union([1]); numberOrStringSet = Set(['a']).union(Set([1])); numberSet = Set([1]).union([1]); numberSet = Set([1]).union(Set([1])); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).union(['a']); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).union(Set(['a'])); numberOrStringSet = Set(['a']).merge([1]); numberOrStringSet = Set(['a']).merge(Set([1])); numberSet = Set([1]).merge([1]); numberSet = Set([1]).merge(Set([1])); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).merge(['a']); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).merge(Set(['a'])); numberSet = Set([1]).intersect(Set([1])); numberSet = Set([1]).intersect([1]); numberSet = Set([1]).intersect(Set(['a'])); numberSet = Set([1]).intersect(['a']); numberSet = Set([1]).subtract(Set([1])); numberSet = Set([1]).subtract([1]); numberSet = Set([1]).subtract(Set(['a'])); numberSet = Set([1]).subtract(['a']); numberSet = Set([1]).withMutations((mutable) => mutable); // $FlowExpectedError[incompatible-call] stringSet = Set([1]).withMutations((mutable) => mutable); numberSet = Set([1]).asMutable(); // $FlowExpectedError[incompatible-call] stringSet = Set([1]).asMutable(); numberSet = Set([1]).asImmutable(); // $FlowExpectedError[incompatible-call] stringSet = Set([1]).asImmutable(); stringSet = Set([1]).map((value, index, iter) => 'a'); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).map((value, index, iter) => 'a'); stringSet = Set([1]).flatMap((value, index, iter) => ['a']); // $FlowExpectedError[incompatible-call] numberSet = Set([1]).flatMap((value, index, iter) => ['a']); numberSet = Set([1]).flatten(); /* OrderedSet */ orderedStringSet = Set(['a']).toOrderedSet(); // $FlowExpectedError[incompatible-call] - this is actually an OrderedSet orderedStringSet = Set([1]).toOrderedSet(); orderedNumberSet = Set([1]).toOrderedSet(); orderedStringSet = OrderedSet(['a']); // $FlowExpectedError[incompatible-call] - this is actually an OrderedSet orderedStringSet = OrderedSet([1]); orderedNumberSet = OrderedSet([1]); orderedStringSet = OrderedSet(List.of('a')); // $FlowExpectedError[incompatible-call] - this is actually an OrderedSet orderedStringSet = OrderedSet(List.of(1)); orderedNumberSet = OrderedSet(List.of(1)); orderedStringSet = OrderedSet.of('a', 'b', 'c'); // $FlowExpectedError[incompatible-call] - this is actually an OrderedSet orderedStringSet = OrderedSet.of(1); orderedNumberSet = OrderedSet.of(1); orderedStringSet = OrderedSet.fromKeys(Map({ a: 1 })); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedSet orderedNumberSet = OrderedSet.fromKeys(Map({ a: 1 })); orderedStringSet = OrderedSet.fromKeys({ a: 1 }); // $FlowExpectedError[incompatible-type-arg] - this is actually an OrderedSet orderedNumberSet = OrderedSet.fromKeys({ a: 1 }); orderedStringSet = OrderedSet(); orderedStringSet = OrderedSet.of('a').add('b'); /** * TODO: in typescript definitions, add looks like * * ``` * add(value: T): Set * ``` * * so we shouldn't be able to add a number to a set of strings */ // $FlowExpectedError[incompatible-call] - this is actually an OrderedSet orderedStringSet = OrderedSet('a').add(1); orderedNumberOrStringSet = OrderedSet('a').add(1); orderedStringSet = OrderedSet.of('a').delete('a'); // $FlowExpectedError[incompatible-call] - 1 is an invalid arg orderedStringSet = OrderedSet.of('a').delete(1); orderedStringSet = OrderedSet.of('a').remove('a'); // $FlowExpectedError[incompatible-call] - 1 is an invalid arg orderedStringSet = OrderedSet.of('a').remove(1); orderedStringSet = OrderedSet.of('a').clear(); orderedStringSet = OrderedSet.of('a').union(OrderedSet.of('b')); /** * TODO: typescript def looks like * * ``` * union(...iterables: Array[]): Set * ``` * * so we shouldn't be able to merge strings and numbers */ // $FlowExpectedError[incompatible-call] - this is actually an OrderedSet orderedStringSet = OrderedSet.of('a').union(OrderedSet.of(1)); orderedNumberOrStringSet = OrderedSet.of('a').union(OrderedSet.of(1)); orderedStringSet = OrderedSet.of('a').merge(OrderedSet.of('b')); /** * TODO: typescript def looks like * * ``` * merge(...iterables: Array[]): Set * ``` * * so we shouldn't be able to merge strings and numbers */ // $FlowExpectedError[incompatible-call] - this is actually an OrderedSet orderedStringSet = OrderedSet.of('a').merge(OrderedSet.of(1)); orderedNumberOrStringSet = OrderedSet.of('a').merge(OrderedSet.of(1)); orderedStringSet = OrderedSet.of('a', 'b').intersect(OrderedSet.of('a')); /** * TODO: typescript def looks like * * ``` * intersect(...iterables: Array[]): Set * ``` * * so we shouldn't be able to intersect strings and numbers */ orderedStringSet = OrderedSet.of('a', 'b').intersect(OrderedSet.of(1)); orderedStringSet = OrderedSet.of('a', 'b').subtract(OrderedSet.of('a')); /** * TODO: typescript def looks like * * ``` * subtract(...iterables: Array[]): Set * ``` * * so we shouldn't be able to intersect strings and numbers */ orderedStringSet = OrderedSet.of('a', 'b').subtract(OrderedSet.of(1)); orderedStringSet = OrderedSet().withMutations((mutable) => mutable.add('a')); orderedStringSet = OrderedSet.of('a').asMutable(); orderedStringSet = OrderedSet.of('a').asImmutable(); orderedStringSet = OrderedSet.of('a', 'b').map((m) => m); // $FlowExpectedError[incompatible-call] - this is an OrderedSet orderedStringSet = OrderedSet.of('a', 'b').map(() => 1); orderedNumberSet = OrderedSet.of('a', 'b').map(() => 1); orderedStringSet = OrderedSet.of('a', 'b').flatMap((m) => [m]); // $FlowExpectedError[incompatible-call] - this is an OrderedSet orderedStringSet = OrderedSet.of('a', 'b').flatMap((m) => [1]); orderedNumberSet = OrderedSet.of('a', 'b').flatMap((m) => [1]); orderedStringSet = OrderedSet.of('a', 'b').flatten(1); orderedStringSet = OrderedSet.of('a', 'b').flatten(false); // $FlowExpectedError[incompatible-call] - invalid arg for flatten orderedStringSet = OrderedSet.of('a', 'b').flatten('a'); /* Stack */ numberStack = Stack([1, 2]); let numberStackSize: number = numberStack.size; numberOrStringStack = Stack(['a', 1]); // $FlowExpectedError[incompatible-call] numberStack = Stack(['a', 'b']); numberStack = Stack.of(1, 2); numberOrStringStack = Stack.of('a', 1); // $FlowExpectedError[incompatible-call] numberStack = Stack.of('a', 1); number = Stack([1]).peek(); // $FlowExpectedError[incompatible-type] number = Stack(['a']).peek(); numberStack = Stack([1]).unshift(1); numberOrStringStack = Stack([1]).unshift('a'); // $FlowExpectedError[incompatible-call] numberStack = Stack([1]).unshift('a'); numberStack = Stack([1]).unshiftAll([1]); numberOrStringStack = Stack([1]).unshiftAll(['a']); // $FlowExpectedError[incompatible-call] numberStack = Stack([1]).unshiftAll(['a']); numberStack = Stack.of(1).shift(); // $FlowExpectedError[incompatible-call] numberStack = Stack.of('a').shift(); numberStack = Stack().push(1); numberOrStringStack = Stack([1]).push('a'); // $FlowExpectedError[incompatible-call] numberStack = Stack().push('a'); numberStack = Stack().pushAll([1]); numberOrStringStack = Stack([1]).pushAll(['a']); // $FlowExpectedError[incompatible-call] numberStack = Stack().push(['a']); numberStack = Stack.of(1).pop(); // $FlowExpectedError[incompatible-call] numberStack = Stack.of('a').pop(); numberStack = Stack([1]).withMutations((mutable) => mutable); // $FlowExpectedError[incompatible-call] numberStack = Stack(['a']).withMutations((mutable) => mutable); numberStack = Stack([1]).asMutable(); // $FlowExpectedError[incompatible-call] numberStack = Stack(['a']).asMutable(); numberStack = Stack([1]).asImmutable(); // $FlowExpectedError[incompatible-call] numberStack = Stack(['a']).asImmutable(); numberStack = Stack([1]).map((value, index, iter) => 1); // $FlowExpectedError[incompatible-call] numberStack = Stack([1]).map((value, index, iter) => 'a'); numberStack = Stack([1]).flatMap((value, index, iter) => [1]); // $FlowExpectedError[incompatible-call] numberStack = Stack([1]).flatMap((value, index, iter) => ['a']); numberStack = Stack([1]).flatten(); numberStack = Stack(['a']).flatten(); /* Range & Repeat */ // `{}` provide namespaces { const numberSequence: IndexedSeq = Range(0, 0, 0); } { const numberSequence: IndexedSeq = Repeat(1, 5); } { const stringSequence: IndexedSeq = Repeat('a', 5); } { // $FlowExpectedError[incompatible-call] const stringSequence: IndexedSeq = Repeat(0, 1); } { // $FlowExpectedError[incompatible-type-arg] const stringSequence: IndexedSeq = Range(0, 0, 0); } /* Seq */ let numberSeq = Seq([1, 2, 3]); // $FlowExpectedError[incompatible-type] let numberSeqSize: number = numberSeq.size; let maybeNumberSeqSize: ?number = numberSeq.size; /* Record */ type PersonRecordFields = { age: number, name: string }; type PersonRecord = RecordOf; const makePersonRecord: RecordFactory = Record({ age: 900, name: 'Yoda', }); const personRecordInstance: PersonRecord = makePersonRecord({ age: 25 }); { // $FlowExpectedError[incompatible-type] const age: string = personRecordInstance.get('age'); } { // $FlowExpectedError[incompatible-type] const age: string = personRecordInstance.age; } { const age: number = personRecordInstance.get('age'); } { const age: number = personRecordInstance.age; } // $FlowExpectedError[incompatible-call] personRecordInstance.set('invalid', 25); personRecordInstance.set('name', '25'); personRecordInstance.set('age', 33); // FixMe: The first should be FlowExpectedError[incompatible-call], and the second two should be correct, // however all three produce a hard to understand error because there is a bug // with Flow's $Call utility type. // set(personRecordInstance, 'invalid', 25) // set(personRecordInstance, 'name', '25') // set(personRecordInstance, 'age', 33) // Create a Map from a non-prototype "plain" Object let someObj = Object.create(null); someObj.x = 1; someObj.y = 2; let mapOfSomeObj: Map = Map(someObj); // $FlowExpectedError[incompatible-call] - someObj is string -> number let mapOfSomeObjMistake: Map = Map(someObj); // getIn() type // Deep nested const deepData1: List> = List([Map([['apple', 'sauce']])]); const deepNestedString1 = deepData1.getIn([0, 'apple']); { // $FlowExpectedError[incompatible-type] string is not a number const fail: ?number = deepNestedString1; } { // $FlowExpectedError[incompatible-type] getIn can return undefined const fail: string = deepNestedString1; } { const success: ?string = deepNestedString1; } const listOfListOfNumber: List> = List([List([1, 2, 3])]); const nestedNum = listOfListOfNumber.getIn([0, 1]); { // $FlowExpectedError[incompatible-type] number is not string const fail: ?string = nestedNum; } { // $FlowExpectedError[incompatible-type] getIn can return undefined const fail: number = nestedNum; } { const success: ?number = nestedNum; } // $FlowExpectedError[incompatible-call] expected a number 1st key listOfListOfNumber.getIn(['whoops', 1]); // $FlowExpectedError[incompatible-call] expected a number 2nd key listOfListOfNumber.getIn([0, 'whoops']); // $FlowExpectedError[incompatible-call] too many keys! listOfListOfNumber.getIn([0, 0, 'whoops']); // Deep nested const deepData: List>> = List([ Map([['apple', List(['sauce'])]]), ]); const deepNestedString = deepData.getIn([0, 'apple', 0]); { // $FlowExpectedError[incompatible-type] string is not a number const fail: ?number = deepNestedString; } { // $FlowExpectedError[incompatible-type] getIn can return undefined const fail: string = deepNestedString; } { const success: ?string = deepNestedString; } // $FlowExpectedError[incompatible-call] expected a string 2nd key deepData.getIn([0, 0, 0]); // $FlowExpectedError[incompatible-call] expected a number 3rd key deepData.getIn([0, 'apple', 'whoops']); // Containing Records const listOfPersonRecord: List = List([personRecordInstance]); const firstAge = listOfPersonRecord.getIn([0, 'age']); { // $FlowExpectedError[incompatible-type] expected a string key const age: string = firstAge; } { // $FlowExpectedError[incompatible-type] getIn can return undefined const age: number = firstAge; } { const age: ?number = firstAge; } // $FlowExpectedError[incompatible-call] - the first key is not an index listOfPersonRecord.getIn(['wrong', 'age']); // $FlowExpectedError[incompatible-call] - the second key is not an record key listOfPersonRecord.getIn([0, 'mispeld']); // $FlowExpectedError[incompatible-call] - the second key is not an record key listOfPersonRecord.getIn([0, 0]); // $FlowExpectedError[incompatible-call] listOfPersonRecord.setIn([0, 'age'], 'Thirteen'); listOfPersonRecord.setIn([0, 'age'], 13); // $FlowExpectedError[prop-missing] listOfPersonRecord.updateIn([0, 'age'], (value) => value.unknownFunction()); listOfPersonRecord.updateIn([0, 'age'], (value) => value + 1); listOfPersonRecord.updateIn([0, 'age'], 0, (value) => value + 1); // Recursive Records type PersonRecord2Fields = { name: string, friends: List }; type PersonRecord2 = RecordOf; const makePersonRecord2: RecordFactory = Record({ name: 'Adam', friends: List(), }); const friendly: PersonRecord2 = makePersonRecord2(); { // $FlowExpectedError[incompatible-type] string is not a number const fail: ?number = friendly.getIn(['friends', 0, 'name']); } // notSetValue provided { const success: string = friendly.getIn(['friends', 0, 'name'], 'Abbie'); } { const success: ?string = friendly.getIn(['friends', 0, 'name']); } // Functional API { // $FlowExpectedError[incompatible-type] string is not a number const fail: ?number = getIn(friendly, ['friends', 0, 'name']); } // notSetValue provided { const success: string = getIn(friendly, ['friends', 0, 'name'], 'Abbie'); } { const success: ?string = getIn(friendly, ['friends', 0, 'name']); } // Deep nested containing recursive Records const friendlies: List = List([makePersonRecord2()]); { // $FlowExpectedError[incompatible-type] string is not a number const fail: ?number = friendlies.getIn([0, 'friends', 0, 'name']); } // notSetValue provided { const success: string = friendlies.getIn([0, 'friends', 0, 'name'], 'Abbie'); } { const success: ?string = friendlies.getIn([0, 'friends', 0, 'name']); } // $FlowExpectedError[incompatible-call] friendlies.setIn([0, 'friends', 0, 'name'], 123); friendlies.setIn([0, 'friends', 0, 'name'], 'Sally'); friendlies.updateIn([0, 'friends', 0, 'name'], (value) => // $FlowExpectedError[prop-missing] value.unknownFunction() ); friendlies.updateIn([0, 'friends', 0, 'name'], (value) => value.toUpperCase()); friendlies.updateIn([0, 'friends', 0, 'name'], 'Unknown Name', (value) => value.toUpperCase() ); // Nested plain JS values type PlainPerson = { name: string, friends: Array }; const plainFriendly: PlainPerson = { name: 'Bobbie', friends: [] }; const plainFriendlies: List = List([plainFriendly]); { // $FlowExpectedError[incompatible-call] 'fraaands' is an unknown key in PlainPerson const fail: ?number = plainFriendlies.getIn([0, 'fraaands', 0, 'name']); } { // $FlowExpectedError[incompatible-call] 0 is an unknown key in PlainPerson const fail: ?number = plainFriendlies.getIn([0, 'fraaands', 0, 0]); } { // $FlowExpectedError[incompatible-type] string is not a number const fail: ?number = plainFriendlies.getIn([0, 'friends', 0, 'name']); } { // $FlowExpectedError[incompatible-type] can return undefined const fail: string = plainFriendlies.getIn([0, 'friends', 0, 'name']); } { const success: ?string = plainFriendlies.getIn([0, 'friends', 0, 'name']); } // $FlowExpectedError[incompatible-call] number is not a string plainFriendlies.setIn([0, 'friends', 0, 'name'], 123); plainFriendlies.setIn([0, 'friends', 0, 'name'], 'Morgan'); plainFriendlies.updateIn([0, 'friends', 0, 'name'], (value) => // $FlowExpectedError[prop-missing] value is a string, this is an unknown function value.unknownFunction() ); plainFriendlies.updateIn([0, 'friends', 0, 'name'], (value) => value.toUpperCase() ); // $FlowExpectedError[incompatible-call] number is not a string plainFriendlies.updateIn([0, 'friends', 0, 'name'], () => 123); plainFriendlies.updateIn([0, 'friends', 0, 'name'], () => 'Whitney'); // Functional API { // $FlowExpectedError[incompatible-call] 'fraaands' is an unknown key in PlainPerson const fail: ?number = getIn(plainFriendlies, [0, 'fraaands', 0, 'name']); } { // $FlowExpectedError[incompatible-call] 0 is an unknown key in PlainPerson const fail: ?number = getIn(plainFriendlies, [0, 'fraaands', 0, 0]); } { // $FlowExpectedError[incompatible-type] string is not a number const fail: ?number = getIn(plainFriendlies, [0, 'friends', 0, 'name']); } { // $FlowExpectedError[incompatible-type] can return undefined const fail: string = getIn(plainFriendlies, [0, 'friends', 0, 'name']); } { const success: ?string = getIn(plainFriendlies, [0, 'friends', 0, 'name']); } // $FlowExpectedError[incompatible-call] number is not a string setIn(plainFriendlies, [0, 'friends', 0, 'name'], 123); setIn(plainFriendlies, [0, 'friends', 0, 'name'], 'Morgan'); updateIn(plainFriendlies, [0, 'friends', 0, 'name'], (value) => // $FlowExpectedError[prop-missing] value is a string, this is an unknown function value.unknownFunction() ); updateIn(plainFriendlies, [0, 'friends', 0, 'name'], (value) => value.toUpperCase() ); // $FlowExpectedError[incompatible-call] number is not a string updateIn(plainFriendlies, [0, 'friends', 0, 'name'], () => 123); updateIn(plainFriendlies, [0, 'friends', 0, 'name'], () => 'Whitney'); // Plain JS values { const success: number | void = get([1, 2, 3], 0); } { const success: number | string = get([1, 2, 3], 0, 'missing'); } { // $FlowExpectedError[incompatible-call] - string is not an array index const success: number = get([1, 2, 3], 'z'); } // Note: does not return null since x is known to exist in {x,y} { const success: number = get({ x: 10, y: 10 }, 'x'); } { // $FlowExpectedError[incompatible-call] - z is not in {x,y} const success: number | void = get({ x: 10, y: 10 }, 'z'); } { const objMap: { [string]: number } = { x: 10, y: 10 }; const success: number | void = get(objMap, 'z'); } { const success: number = get({ x: 10, y: 10 }, 'x', 'missing'); } { const objMap: { [string]: number } = { x: 10, y: 10 }; const success: number | string = get(objMap, 'z', 'missing'); } // Deeply nested records type DeepNestFields = { foo: number, }; type DeepNest = RecordOf; const deepNest: RecordFactory = Record({ foo: 0, }); type NestFields = { deepNest: DeepNest, }; type Nest = RecordOf; const nest: RecordFactory = Record({ deepNest: deepNest(), }); type StateFields = { nest: Nest, }; type State = RecordOf; const initialState: RecordFactory = Record({ nest: nest(), }); const state = initialState(); (state.setIn(['nest', 'deepNest', 'foo'], 5): State); // $FlowExpectedError[incompatible-call] (state.setIn(['nest', 'deepNest', 'foo'], 'string'): State); // $FlowExpectedError[incompatible-call] (state.setIn(['nest', 'deepNest', 'unknownField'], 5): State); immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/merge.js000066400000000000000000000110631522056416100260610ustar00rootroot00000000000000// @flow import { List, Map, Record, type RecordOf, type RecordFactory, get, getIn, has, hasIn, merge, mergeDeep, mergeWith, mergeDeepWith, remove, removeIn, set, setIn, update, updateIn, } from 'immutable'; // merge: Objects as Maps type ObjMap = { [key: string]: T }; const objMap: ObjMap = { x: 12, y: 34 }; (merge(objMap, { x: 321 }): ObjMap); (merge(objMap, { z: 321 }): ObjMap); // $FlowExpectedError[incompatible-call] (merge(objMap, { x: 'abc' }): ObjMap); (merge(objMap, [['x', 321]]): ObjMap); (merge(objMap, [['z', 321]]): ObjMap); // $FlowExpectedError[incompatible-call] (merge(objMap, [['x', 'abc']]): ObjMap); // $FlowExpectedError[incompatible-call] (merge(objMap, [321]): ObjMap); (merge(objMap, Map({ x: 123 })): ObjMap); (merge(objMap, Map({ z: 123 })): ObjMap); (merge(objMap, Map([['x', 123]])): ObjMap); (merge(objMap, Map([['z', 123]])): ObjMap); // $FlowExpectedError[incompatible-call] (merge(objMap, List([123])): ObjMap); // merge: Maps const map = Map({ key: 'value' }); (merge(map, { key: 'alternate' }): Map); (merge(map, { otherKey: 'value' }): Map); (merge(map, Map({ key: 'alternate' })): Map); (merge(map, Map({ otherKey: 'value' })): Map); (merge(map, [['otherKey', 'value']]): Map); // $FlowExpectedError[incompatible-call] (functional merge cannot return union value types) (merge(map, Map({ otherKey: 123 })): Map); // $FlowExpectedError[incompatible-call] (merge(map, [4, 5, 6]): Map); // $FlowExpectedError[incompatible-call] (merge(map, 123): Map); // $FlowExpectedError[incompatible-call] (merge(map, { '0': 123 }): Map); // $FlowExpectedError[incompatible-call] (merge(map, [ [0, 4], [1, 5], [1, 6], ]): Map); // merge: Lists const list = List([1, 2, 3]); (merge(list, [4, 5, 6]): List); (merge(list, List([4, 5, 6])): List); // $FlowExpectedError[incompatible-call] (functional merge cannot return union value types) (merge(list, ['a', 'b', 'c']): List); // $FlowExpectedError[incompatible-call] (functional merge cannot return union value types) (merge(list, List(['a', 'b', 'c'])): List); // $FlowExpectedError[incompatible-call] (merge(list, 123): List); // $FlowExpectedError[incompatible-call] (merge(list, { '0': 123 }): List); // $FlowExpectedError[incompatible-call] (merge(list, Map({ '0': 123 })): List); // $FlowExpectedError[incompatible-call] (merge(list, [ [0, 4], [1, 5], [1, 6], ]): List); // merge: Objects as Records type XYPoint = { x: number, y: number }; const objRecord: XYPoint = { x: 12, y: 34 }; (merge(objRecord, { x: 321 }): XYPoint); (merge(objRecord, [['x', 321]]): XYPoint); (merge(objRecord, Map({ x: 123 })): XYPoint); (merge(objRecord, Map([['x', 123]])): XYPoint); const xyPointRecord = Record({ x: 0, y: 0 }); (merge(objRecord, xyPointRecord({ x: 321 })): XYPoint); // $FlowExpectedError[incompatible-call] (merge(objRecord, { x: 'abc' }): XYPoint); // $FlowExpectedError[incompatible-call] (merge({ x: 12, y: 34 }, [['x', 'abc']]): XYPoint); // $FlowExpectedError[incompatible-call] (merge(objRecord, { z: 321 }): XYPoint); // $FlowExpectedError[prop-missing]] // $FlowExpectedError[invalid-call-util]] (merge(objRecord, [['z', 321]]): XYPoint); // $FlowExpectedError[incompatible-call] (merge(objRecord, Map({ z: 123 })): XYPoint); // $FlowExpectedError[incompatible-call] (merge(objRecord, Map([['z', 123]])): XYPoint); // $FlowExpectedError[incompatible-call] (merge(objRecord, [321]): XYPoint); // $FlowExpectedError[incompatible-call] (merge(objRecord, List([123])): XYPoint); // merge: Arrays const arr = [1, 2, 3]; (merge(arr, [4, 5, 6]): Array); (merge(arr, List([4, 5, 6])): Array); // $FlowExpectedError[incompatible-call] (functional merge cannot return union value types) (merge(arr, ['a', 'b', 'c']): Array); // $FlowExpectedError[incompatible-call] (functional merge cannot return union value types) (merge(arr, List(['a', 'b', 'c'])): Array); // $FlowExpectedError[incompatible-call] (merge(arr, 123): Array); // $FlowExpectedError[incompatible-call] (merge(arr, { '0': 123 }): Array); // $FlowExpectedError[incompatible-call] (merge(arr, Map({ '0': 123 })): Array); // $FlowExpectedError[incompatible-call] (merge(arr, [ [0, 4], [1, 5], [1, 6], ]): Array); immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/predicates.js000066400000000000000000000005211522056416100271020ustar00rootroot00000000000000// @flow import { List } from 'immutable'; declare var mystery: mixed; // $FlowExpectedError[cannot-resolve-name] maybe.push('3'); if (mystery instanceof List) { maybe.push('3'); } // Note: Flow's support for %checks is still experimental. // Support this in the future. // if (List.isList(mystery)) { // mystery.push('3'); // } immutable-js-immutable-js-6a01d72/type-definitions/flow-tests/record.js000066400000000000000000000157311522056416100262460ustar00rootroot00000000000000// @flow // Some tests look like they are repeated in order to avoid false positives. // Flow might not complain about an instance of (what it thinks is) T to be assigned to T import { Record, type RecordFactory, type RecordOf, Map, List, merge } from 'immutable'; // Use the RecordFactory type to annotate const Point2: RecordFactory<{ x: number, y: number }> = Record({ x: 0, y: 0 }); const Point3: RecordFactory<{ x: number, y: number, z: number }> = Record({ x: 0, y: 0, z: 0, }); type TGeoPoint = { lat: ?number, lon: ?number }; const GeoPoint: RecordFactory = Record({ lat: null, lon: null }); // TODO: this should be FlowExpectedError - 'abc' is not a number // However, due to support for the brittle support for subclassing, Flow // cannot also type check default values in this position. const PointWhoops: RecordFactory<{ x: number, y: number }> = Record({ x: 0, y: 'abc', }); let origin2 = Point2({}); let origin3 = Point3({}); let geo = GeoPoint({ lat: 34 }); // $FlowExpectedError[incompatible-call] const mistake = Point2({ x: 'string' }); origin3 = GeoPoint({ lat: 34 }); geo = Point3({}); // Use RecordOf to type the return value of a Record factory function. let geoPointExpected1: RecordOf = GeoPoint({}); // $FlowExpectedError[prop-missing] - Point2 does not return GeoPoint. let geoPointExpected2: RecordOf = Point2({}); const px = origin2.get('x'); const px2: number = origin2.x; // $FlowExpectedError[incompatible-type] const px3: number = origin2.get('x', 'not set value'); const px4: number | string = origin2.get('x', 'not set value'); // $FlowExpectedError[incompatible-call] const pz = origin2.get('z'); // $FlowExpectedError[incompatible-use] const pz2 = origin2.z; origin2.set('x', 4); // $FlowExpectedError[incompatible-call] origin2.set('x', 'not-a-number'); // $FlowExpectedError[incompatible-call] origin2.set('z', 3); const name: string = Record.getDescriptiveName(origin2); // $FlowExpectedError[incompatible-call] const name2: string = Record.getDescriptiveName({}); // Note: need to cast through any when extending Records as if they ere classes class ABClass extends (Record({ a: 1, b: 2 }): any) { setA(a: number) { return this.set('a', a); } setB(b: number) { return this.set('b', b); } } var t1 = new ABClass({ a: 1 }); var t2 = t1.setA(3); var t3 = t2.setB(10); // Note: flow does not check extended Record classes yet var t4 = t2.setC(10); // Note: flow does not check extended Record classes yet var t1a: string = t1.a; // Note: flow does not check extended Record classes yet var t1c = t1.c; // Use of new to create record factories (supported, but discouraged) type TPointNew = { x: number, y: number }; type PointNew = RecordOf; const MakePointNew: RecordFactory = new Record({ x: 0, y: 0 }); // Not using new allows returning a record. const origin: PointNew = MakePointNew(); // Both get and prop access are supported with RecordOf { const x: number = origin.get('x'); } { const x: number = origin.x; } { // $FlowExpectedError[incompatible-type] number is not a string const x: string = origin.x; } // Can use the Record constructor type as an alternative, // it just doesn't support property access. const originAlt1: MakePointNew = MakePointNew(); // Both get and prop access are supported with RecordOf { const x: number = originAlt1.get('x'); } { // $FlowExpectedError[prop-missing] cannot use property access for this alternative annotation const x: number = originAlt1.x; } // Can also sort of use the inner Record values type as an alternative, // however it does not have the immutable record API, though useful for flowing // immutable Records where plain objects are expected. // Remember that Records are *read only*, and using the $ReadOnly helper type // can ensure correct types. const originAlt2: $ReadOnly = MakePointNew(); { // $FlowExpectedError[prop-missing] cannot use Record API for this alternative annotation const x: number = originAlt2.get('x'); } { const x: number = originAlt2.x; } // Use of new may only return a class instance, not a record // (supported but discouraged) // $FlowExpectedError[class-object-subtyping] // $FlowExpectedError[prop-missing] const mistakeOriginNew: PointNew = new MakePointNew(); // An alternative type strategy is instance based const originNew: MakePointNew = new MakePointNew(); // Only get, but not prop access are supported with class instances { const x: number = originNew.get('x'); } { // $FlowExpectedError[prop-missing] property `x`. Property not found in RecordInstance const x: number = originNew.x; } // $FlowExpectedError[incompatible-call] instantiated with invalid type const mistakeNewRecord = MakePointNew({ x: 'string' }); // $FlowExpectedError[incompatible-call] instantiated with invalid type const mistakeNewInstance = new MakePointNew({ x: 'string' }); // Subclassing // Note use of + for Read Only. type TPerson = { +name: string, +age: number }; const defaultValues: TPerson = { name: 'Aristotle', age: 2400 }; const PersonRecord = Record(defaultValues); class Person extends PersonRecord { getName(): string { return this.get('name'); } setName(name: string): this & TPerson { return this.set('name', name); } } const person = new Person(); (person.setName('Thales'): Person); (person.getName(): string); (person.setName('Thales').getName(): string); (person.setName('Thales').name: string); person.get('name'); person.set('name', 'Thales'); // $FlowExpectedError[incompatible-call] person.get('unknown'); // $FlowExpectedError[prop-missing] person.set('unknown', 'Thales'); // Note: not class PersonWithoutTypes extends PersonRecord { getName(): string { return this.get('name'); } setName(name: string): this & TPerson { return this.set('name', name); } } const person2 = new PersonWithoutTypes(); person2.get('name'); // Note: no error person2.get('unknown'); // Functional Merge type XYPoint = { x: number, y: number }; type XYPointRecord = RecordOf; const xyRecord: RecordFactory = Record({ x: 0, y: 0 }); const record = xyRecord(); (merge(record, { x: 321 }): XYPointRecord); (merge(record, xyRecord({ x: 321 })): XYPointRecord); // $FlowExpectedError[incompatible-call] (merge(record, { z: 321 }): XYPointRecord); // $FlowExpectedError[incompatible-call] (merge(record, { x: 'abc' }): XYPointRecord); (merge(record, [['x', 321]]): XYPointRecord); // $FlowExpectedError[prop-missing]] (merge(record, [['z', 321]]): XYPointRecord); // $FlowExpectedError[incompatible-call] (merge(record, [['x', 'abc']]): XYPointRecord); // $FlowExpectedError[incompatible-call] (merge(record, [321]): XYPointRecord); (merge(record, Map({ x: 123 })): XYPointRecord); // $FlowExpectedError[incompatible-call] (merge(record, Map({ z: 123 })): XYPointRecord); (merge(record, Map([['x', 123]])): XYPointRecord); // $FlowExpectedError[incompatible-call] (merge(record, Map([['z', 123]])): XYPointRecord); // $FlowExpectedError[incompatible-call] (merge(record, List([123])): XYPointRecord); immutable-js-immutable-js-6a01d72/type-definitions/immutable.d.ts000066400000000000000000005055231522056416100250770ustar00rootroot00000000000000/** @ignore we should disable this rules, but let's activate it to enable eslint first */ /** * Immutable data encourages pure functions (data-in, data-out) and lends itself * to much simpler application development and enabling techniques from * functional programming such as lazy evaluation. * * While designed to bring these powerful functional concepts to JavaScript, it * presents an Object-Oriented API familiar to Javascript engineers and closely * mirroring that of Array, Map, and Set. It is easy and efficient to convert to * and from plain Javascript types. * * ## How to read these docs * * In order to better explain what kinds of values the Immutable.js API expects * and produces, this documentation is presented in a statically typed dialect of * JavaScript (like [Flow][] or [TypeScript][]). You *don't need* to use these * type checking tools in order to use Immutable.js, however becoming familiar * with their syntax will help you get a deeper understanding of this API. * * **A few examples and how to read them.** * * All methods describe the kinds of data they accept and the kinds of data * they return. For example a function which accepts two numbers and returns * a number would look like this: * * ```js * sum(first: number, second: number): number * ``` * * Sometimes, methods can accept different kinds of data or return different * kinds of data, and this is described with a *type variable*, which is * typically in all-caps. For example, a function which always returns the same * kind of data it was provided would look like this: * * ```js * identity(value: T): T * ``` * * Type variables are defined with classes and referred to in methods. For * example, a class that holds onto a value for you might look like this: * * ```js * class Box { * constructor(value: T) * getValue(): T * } * ``` * * In order to manipulate Immutable data, methods that we're used to affecting * a Collection instead return a new Collection of the same type. The type * `this` refers to the same kind of class. For example, a List which returns * new Lists when you `push` a value onto it might look like: * * ```js * class List { * push(value: T): this * } * ``` * * Many methods in Immutable.js accept values which implement the JavaScript * [Iterable][] protocol, and might appear like `Iterable` for something * which represents sequence of strings. Typically in JavaScript we use plain * Arrays (`[]`) when an Iterable is expected, but also all of the Immutable.js * collections are iterable themselves! * * For example, to get a value deep within a structure of data, we might use * `getIn` which expects an `Iterable` path: * * ``` * getIn(path: Iterable): unknown * ``` * * To use this method, we could pass an array: `data.getIn([ "key", 2 ])`. * * * Note: All examples are presented in the modern [ES2015][] version of * JavaScript. Use tools like Babel to support older browsers. * * For example: * * ```js * // ES2015 * const mappedFoo = foo.map(x => x * x); * // ES5 * var mappedFoo = foo.map(function (x) { return x * x; }); * ``` * * [ES2015]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_6_support_in_Mozilla * [TypeScript]: https://www.typescriptlang.org/ * [Flow]: https://flowtype.org/ * [Iterable]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols */ declare namespace Immutable { /** @ignore */ type OnlyObject = Extract; /** @ignore */ type ContainObject = OnlyObject extends object ? OnlyObject extends never ? false : true : false; /** * @ignore * * Used to convert deeply all immutable types to a plain TS type. * Using `unknown` on object instead of recursive call as we have a circular reference issue */ export type DeepCopy = T extends Record ? // convert Record to DeepCopy plain JS object { [key in keyof R]: ContainObject extends true ? unknown : R[key]; } : T extends MapOf ? // convert MapOf to DeepCopy plain JS object { [key in keyof R]: ContainObject extends true ? unknown : R[key]; } : T extends Collection.Keyed ? // convert KeyedCollection to DeepCopy plain JS object { [key in KeyedKey extends PropertyKey ? KeyedKey : string]: V extends object ? unknown : V; } : // convert IndexedCollection or Immutable.Set to DeepCopy plain JS array // eslint-disable-next-line @typescript-eslint/no-unused-vars T extends Collection ? Array> : T extends string | number // Iterable scalar types : should be kept as is ? T : T extends Iterable // Iterable are converted to plain JS array ? Array> : T extends object // plain JS object are converted deeply ? { [ObjectKey in keyof T]: ContainObject< T[ObjectKey] > extends true ? unknown : T[ObjectKey]; } : // other case : should be kept as is T; /** * Describes which item in a pair should be placed first when sorting * * @ignore */ export enum PairSorting { LeftThenRight = -1, RightThenLeft = +1, } /** * Function comparing two items of the same type. It can return: * * * a PairSorting value, to indicate whether the left-hand item or the right-hand item should be placed before the other * * * the traditional numeric return value - especially -1, 0, or 1 * * @ignore */ export type Comparator = (left: T, right: T) => PairSorting | number; /** * @ignore * * KeyPath allowed for `xxxIn` methods */ export type KeyPath = OrderedCollection | ArrayLike; /** * Lists are ordered indexed dense collections, much like a JavaScript * Array. * * Lists are immutable and fully persistent with O(log32 N) gets and sets, * and O(1) push and pop. * * Lists implement Deque, with efficient addition and removal from both the * end (`push`, `pop`) and beginning (`unshift`, `shift`). * * Unlike a JavaScript Array, there is no distinction between an * "unset" index and an index set to `undefined`. `List#forEach` visits all * indices from 0 to size, regardless of whether they were explicitly defined. */ namespace List { /** * True if the provided value is a List */ function isList(maybeList: unknown): maybeList is List; /** * Creates a new List containing `values`. * * Note: Values are not altered or converted in any way. */ function of(...values: Array): List; } /** * Create a new immutable List containing the values of the provided * collection-like. * * Note: `List` is a factory function and not a class, and does not use the * `new` keyword during construction. */ function List(collection?: Iterable | ArrayLike): List; interface List extends Collection.Indexed { /** * The number of items in this List. */ readonly size: number; // Persistent changes /** * Returns a new List which includes `value` at `index`. If `index` already * exists in this List, it will be replaced. * * `index` may be a negative number, which indexes back from the end of the * List. `v.set(-1, "value")` sets the last item in the List. * * If `index` larger than `size`, the returned List's `size` will be large * enough to include the `index`. * * Note: `set` can be used in `withMutations`. */ set(index: number, value: T): List; /** * Returns a new List which excludes this `index` and with a size 1 less * than this List. Values at indices above `index` are shifted down by 1 to * fill the position. * * This is synonymous with `list.splice(index, 1)`. * * `index` may be a negative number, which indexes back from the end of the * List. `v.delete(-1)` deletes the last item in the List. * * Note: `delete` cannot be safely used in IE8 * * Since `delete()` re-indexes values, it produces a complete copy, which * has `O(N)` complexity. * * Note: `delete` *cannot* be used in `withMutations`. * * @alias remove */ delete(index: number): List; remove(index: number): List; /** * Returns a new List with `value` at `index` with a size 1 more than this * List. Values at indices above `index` are shifted over by 1. * * This is synonymous with `list.splice(index, 0, value)`. * * Since `insert()` re-indexes values, it produces a complete copy, which * has `O(N)` complexity. * * Note: `insert` *cannot* be used in `withMutations`. */ insert(index: number, value: T): List; /** * Returns a new List with 0 size and no values in constant time. * * Note: `clear` can be used in `withMutations`. */ clear(): List; /** * Returns a new List with the provided `values` appended, starting at this * List's `size`. * * Note: `push` can be used in `withMutations`. */ push(...values: Array): List; /** * Returns a new List with a size ones less than this List, excluding * the last index in this List. * * Note: this differs from `Array#pop` because it returns a new * List rather than the removed value. Use `last()` to get the last value * in this List. * * ```js * List([ 1, 2, 3, 4 ]).pop() * // List[ 1, 2, 3 ] * ``` * * Note: `pop` can be used in `withMutations`. */ pop(): List; /** * Returns a new List with the provided `values` prepended, shifting other * values ahead to higher indices. * * Note: `unshift` can be used in `withMutations`. */ unshift(...values: Array): List; /** * Returns a new List with a size ones less than this List, excluding * the first index in this List, shifting all other values to a lower index. * * Note: this differs from `Array#shift` because it returns a new * List rather than the removed value. Use `first()` to get the first * value in this List. * * Note: `shift` can be used in `withMutations`. */ shift(): List; /** * Returns a new List with an updated value at `index` with the return * value of calling `updater` with the existing value, or `notSetValue` if * `index` was not set. If called with a single argument, `updater` is * called with the List itself. * * `index` may be a negative number, which indexes back from the end of the * List. `v.update(-1)` updates the last item in the List. * * This can be very useful as a way to "chain" a normal function into a * sequence of methods. RxJS calls this "let" and lodash calls it "thru". * * For example, to sum a List after mapping and filtering: * * Note: `update(index)` can be used in `withMutations`. * * @see `Map#update` */ update(index: number, notSetValue: T, updater: (value: T) => T): this; update( index: number, updater: (value: T | undefined) => T | undefined ): this; update(updater: (value: this) => R): R; /** * Returns a new List with size `size`. If `size` is less than this * List's size, the new List will exclude values at the higher indices. * If `size` is greater than this List's size, the new List will have * undefined values for the newly available indices. * * When building a new List and the final size is known up front, `setSize` * used in conjunction with `withMutations` may result in the more * performant construction. */ setSize(size: number): List; // Deep persistent changes /** * Returns a new List having set `value` at this `keyPath`. If any keys in * `keyPath` do not exist, a new immutable Map will be created at that key. * * Index numbers are used as keys to determine the path to follow in * the List. * * Plain JavaScript Object or Arrays may be nested within an Immutable.js * Collection, and setIn() can update those values as well, treating them * immutably by creating new copies of those values with the changes applied. * * Note: `setIn` can be used in `withMutations`. */ setIn(keyPath: Iterable, value: unknown): this; /** * Returns a new List having removed the value at this `keyPath`. If any * keys in `keyPath` do not exist, no change will occur. * * Plain JavaScript Object or Arrays may be nested within an Immutable.js * Collection, and removeIn() can update those values as well, treating them * immutably by creating new copies of those values with the changes applied. * * Note: `deleteIn` *cannot* be safely used in `withMutations`. * * @alias removeIn */ deleteIn(keyPath: Iterable): this; removeIn(keyPath: Iterable): this; /** * Note: `updateIn` can be used in `withMutations`. * * @see `Map#updateIn` */ updateIn( keyPath: Iterable, notSetValue: unknown, updater: (value: unknown) => unknown ): this; updateIn( keyPath: Iterable, updater: (value: unknown) => unknown ): this; /** * Note: `mergeIn` can be used in `withMutations`. * * @see `Map#mergeIn` */ mergeIn(keyPath: Iterable, ...collections: Array): this; /** * Note: `mergeDeepIn` can be used in `withMutations`. * * @see `Map#mergeDeepIn` */ mergeDeepIn( keyPath: Iterable, ...collections: Array ): this; // Transient changes /** * Note: Not all methods can be safely used on a mutable collection or within * `withMutations`! Check the documentation for each method to see if it * allows being used in `withMutations`. * * @see `Map#withMutations` */ withMutations(mutator: (mutable: this) => unknown): this; /** * An alternative API for withMutations() * * Note: Not all methods can be safely used on a mutable collection or within * `withMutations`! Check the documentation for each method to see if it * allows being used in `withMutations`. * * @see `Map#asMutable` */ asMutable(): this; /** * @see `Map#wasAltered` */ wasAltered(): boolean; /** * @see `Map#asImmutable` */ asImmutable(): this; // Sequence algorithms /** * Returns a new List with other values or collections concatenated to this one. * * Note: `concat` can be used in `withMutations`. * * @alias merge */ concat(...valuesOrCollections: Array | C>): List; merge(...collections: Array>): List; /** * Returns a new List with values passed through a * `mapper` function. */ map( mapper: (value: T, key: number, iter: this) => M, context?: unknown ): List; /** * Flat-maps the List, returning a new List. * * Similar to `list.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown ): List; /** * Returns a new List with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, index: number, iter: this) => value is F, context?: unknown ): List; filter( predicate: (value: T, index: number, iter: this) => unknown, context?: unknown ): this; /** * Returns a new List with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C ): [List, List]; partition( predicate: (this: C, value: T, index: number, iter: this) => unknown, context?: C ): [this, this]; /** * Returns a List "zipped" with the provided collection. * * Like `zipWith`, but using the default `zipper`: creating an `Array`. */ zip(other: Collection): List<[T, U]>; zip( other: Collection, other2: Collection ): List<[T, U, V]>; zip(...collections: Array>): List; /** * Returns a List "zipped" with the provided collections. * * Unlike `zip`, `zipAll` continues zipping until the longest collection is * exhausted. Missing values from shorter collections are filled with `undefined`. * * Note: Since zipAll will return a collection as large as the largest * input, some results may contain undefined values. TypeScript cannot * account for these without cases (as of v2.5). */ zipAll(other: Collection): List<[T, U]>; zipAll( other: Collection, other2: Collection ): List<[T, U, V]>; zipAll(...collections: Array>): List; /** * Returns a List "zipped" with the provided collections by using a * custom `zipper` function. */ zipWith( zipper: (value: T, otherValue: U) => Z, otherCollection: Collection ): List; zipWith( zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection ): List; zipWith( zipper: (...values: Array) => Z, ...collections: Array> ): List; /** * Returns a new List with its values shuffled thanks to the * [Fisher–Yates](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) * algorithm. * It uses Math.random, but you can provide your own random number generator. */ shuffle(random?: () => number): this; } /** * Immutable Map is an unordered Collection.Keyed of (key, value) pairs with * `O(log32 N)` gets and `O(log32 N)` persistent sets. * * Iteration order of a Map is undefined, however is stable. Multiple * iterations of the same Map will iterate in the same order. * * Map's keys can be of any type, and use `Immutable.is` to determine key * equality. This allows the use of any value (including NaN) as a key. * * Because `Immutable.is` returns equality based on value semantics, and * Immutable collections are treated as values, any Immutable collection may * be used as a key. * * Any JavaScript object may be used as a key, however strict identity is used * to evaluate key equality. Two similar looking objects will represent two * different keys. * * Implemented by a hash-array mapped trie. */ namespace Map { /** * True if the provided value is a Map */ function isMap(maybeMap: unknown): maybeMap is Map; } /** * Creates a new Immutable Map. * * Created with the same key value pairs as the provided Collection.Keyed or * JavaScript Object or expects a Collection of [K, V] tuple entries. * * Note: `Map` is a factory function and not a class, and does not use the * `new` keyword during construction. * * Keep in mind, when using JS objects to construct Immutable Maps, that * JavaScript Object properties are always strings, even if written in a * quote-less shorthand, while Immutable Maps accept keys of any type. * * Property access for JavaScript Objects first converts the key to a string, * but since Immutable Map keys can be of any type the argument to `get()` is * not altered. */ function Map(collection?: Iterable): Map; function Map(obj: R): MapOf; function Map(obj: { [key: string]: V }): Map; function Map(obj: { [P in K]?: V }): Map; /** * Represent a Map constructed by an object * * @ignore */ interface MapOf extends Map { /** * Returns the value associated with the provided key, or notSetValue if * the Collection does not contain this key. * * Note: it is possible a key may be associated with an `undefined` value, * so if `notSetValue` is not provided and this method returns `undefined`, * that does not guarantee the key was not found. */ get(key: K, notSetValue?: unknown): R[K]; get(key: unknown, notSetValue: NSV): NSV; // TODO `` can be used after dropping support for TypeScript 4.x // reference: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#const-type-parameters // after this change, `as const` assertions can be remove from the type tests getIn

>( searchKeyPath: [...P], notSetValue?: unknown ): RetrievePath; set(key: K, value: R[K]): this; update(updater: (value: this) => this): this; update(key: K, updater: (value: R[K]) => R[K]): this; update( key: K, notSetValue: NSV, updater: (value: R[K]) => R[K] ): this; // Possible best type is MapOf> but Omit seems to broke other function calls // and generate recursion error with other methods (update, merge, etc.) until those functions are defined in MapOf delete( key: K ): Extract extends never ? never : this; remove( key: K ): Extract extends never ? never : this; toJS(): { [K in keyof R]: DeepCopy }; toJSON(): { [K in keyof R]: R[K] }; } // Loosely based off of this work. // https://github.com/immutable-js/immutable-js/issues/1462#issuecomment-584123268 /** * @ignore * Convert an immutable type to the equivalent plain TS type * - MapOf -> object * - List -> Array */ type GetNativeType = S extends MapOf ? T : S extends List ? Array : S; /** @ignore */ type Head> = T extends [ infer H, ...Array, ] ? H : never; /** @ignore */ type Tail> = T extends [unknown, ...infer I] ? I : Array; /** @ignore */ type RetrievePathReducer< T, C, L extends ReadonlyArray, NT = GetNativeType, > = // we can not retrieve a path from a primitive type T extends string | number | boolean | null | undefined ? never : C extends keyof NT ? L extends [] // L extends [] means we are at the end of the path, lets return the current type ? NT[C] : // we are not at the end of the path, lets continue with the next key RetrievePathReducer, Tail> : // C is not a "key" of NT, so the path is invalid never; /** @ignore */ type RetrievePath> = P extends [] ? P : RetrievePathReducer, Tail

>; interface Map extends Collection.Keyed { /** * The number of entries in this Map. */ readonly size: number; // Persistent changes /** * Returns a new Map also containing the new key, value pair. If an equivalent * key already exists in this Map, it will be replaced. * * Note: `set` can be used in `withMutations`. */ set(key: K, value: V): this; /** * Returns a new Map which excludes this `key`. * * Note: `delete` cannot be safely used in IE8, but is provided to mirror * the ES6 collection API. * * Note: `delete` can be used in `withMutations`. * * @alias remove */ delete(key: K): this; remove(key: K): this; /** * Returns a new Map which excludes the provided `keys`. * * Note: `deleteAll` can be used in `withMutations`. * * @alias removeAll */ deleteAll(keys: Iterable): this; removeAll(keys: Iterable): this; /** * Returns a new Map containing no keys or values. * * Note: `clear` can be used in `withMutations`. */ clear(): this; /** * Returns a new Map having updated the value at this `key` with the return * value of calling `updater` with the existing value. * * Similar to: `map.set(key, updater(map.get(key)))`. * * This is most commonly used to call methods on collections within a * structure of data. For example, in order to `.push()` onto a nested `List`, * `update` and `push` can be used together: * * When a `notSetValue` is provided, it is provided to the `updater` * function when the value at the key does not exist in the Map. * * However, if the `updater` function returns the same value it was called * with, then no change will occur. This is still true if `notSetValue` * is provided. * * For code using ES2015 or later, using `notSetValue` is discourged in * favor of function parameter default values. This helps to avoid any * potential confusion with identify functions as described above. * * The previous example behaves differently when written with default values: * * If no key is provided, then the `updater` function return value is * returned as well. * * This can be very useful as a way to "chain" a normal function into a * sequence of methods. RxJS calls this "let" and lodash calls it "thru". * * For example, to sum the values in a Map * * Note: `update(key)` can be used in `withMutations`. */ update(key: K, notSetValue: V, updater: (value: V) => V): this; update(key: K, updater: (value: V | undefined) => V | undefined): this; update(updater: (value: this) => R): R; /** * Returns a new Map resulting from merging the provided Collections * (or JS objects) into this Map. In other words, this takes each entry of * each collection and sets it on this Map. * * Note: Values provided to `merge` are shallowly converted before being * merged. No nested values are altered. * ``` * * Note: `merge` can be used in `withMutations`. * * @alias concat */ merge( ...collections: Array> ): Map | VC>; merge( ...collections: Array<{ [key: string]: C }> ): Map | C>; concat( ...collections: Array> ): Map | VC>; concat( ...collections: Array<{ [key: string]: C }> ): Map | C>; /** * Like `merge()`, `mergeWith()` returns a new Map resulting from merging * the provided Collections (or JS objects) into this Map, but uses the * `merger` function for dealing with conflicts. * * Note: `mergeWith` can be used in `withMutations`. */ mergeWith( merger: (oldVal: V, newVal: VC, key: K) => VCC, ...collections: Array> ): Map; mergeWith( merger: (oldVal: V, newVal: C, key: string) => CC, ...collections: Array<{ [key: string]: C }> ): Map; /** * Like `merge()`, but when two compatible collections are encountered with * the same key, it merges them as well, recursing deeply through the nested * data. Two collections are considered to be compatible (and thus will be * merged together) if they both fall into one of three categories: keyed * (e.g., `Map`s, `Record`s, and objects), indexed (e.g., `List`s and * arrays), or set-like (e.g., `Set`s). If they fall into separate * categories, `mergeDeep` will replace the existing collection with the * collection being merged in. This behavior can be customized by using * `mergeDeepWith()`. * * Note: Indexed and set-like collections are merged using * `concat()`/`union()` and therefore do not recurse. * * Note: `mergeDeep` can be used in `withMutations`. */ mergeDeep( ...collections: Array> ): Map; mergeDeep( ...collections: Array<{ [key: string]: C }> ): Map; /** * Like `mergeDeep()`, but when two non-collections or incompatible * collections are encountered at the same key, it uses the `merger` * function to determine the resulting value. Collections are considered * incompatible if they fall into separate categories between keyed, * indexed, and set-like. * * Note: `mergeDeepWith` can be used in `withMutations`. */ mergeDeepWith( merger: (oldVal: unknown, newVal: unknown, key: unknown) => unknown, ...collections: Array | { [key: string]: V }> ): this; // Deep persistent changes /** * Returns a new Map having set `value` at this `keyPath`. If any keys in * `keyPath` do not exist, a new immutable Map will be created at that key. * * Plain JavaScript Object or Arrays may be nested within an Immutable.js * Collection, and setIn() can update those values as well, treating them * immutably by creating new copies of those values with the changes applied. * * If any key in the path exists but cannot be updated (such as a primitive * like number or a custom Object like Date), an error will be thrown. * * Note: `setIn` can be used in `withMutations`. */ setIn(keyPath: Iterable, value: unknown): this; /** * Returns a new Map having removed the value at this `keyPath`. If any keys * in `keyPath` do not exist, no change will occur. * * Note: `deleteIn` can be used in `withMutations`. * * @alias removeIn */ deleteIn(keyPath: Iterable): this; removeIn(keyPath: Iterable): this; /** * Returns a new Map having applied the `updater` to the entry found at the * keyPath. * * This is most commonly used to call methods on collections nested within a * structure of data. For example, in order to `.push()` onto a nested `List`, * `updateIn` and `push` can be used together: * * If any keys in `keyPath` do not exist, new Immutable `Map`s will * be created at those keys. If the `keyPath` does not already contain a * value, the `updater` function will be called with `notSetValue`, if * provided, otherwise `undefined`. * * If the `updater` function returns the same value it was called with, then * no change will occur. This is still true if `notSetValue` is provided. * * For code using ES2015 or later, using `notSetValue` is discourged in * favor of function parameter default values. This helps to avoid any * potential confusion with identify functions as described above. * * The previous example behaves differently when written with default values: * * Plain JavaScript Object or Arrays may be nested within an Immutable.js * Collection, and updateIn() can update those values as well, treating them * immutably by creating new copies of those values with the changes applied. * * If any key in the path exists but cannot be updated (such as a primitive * like number or a custom Object like Date), an error will be thrown. * * Note: `updateIn` can be used in `withMutations`. */ updateIn( keyPath: Iterable, notSetValue: unknown, updater: (value: unknown) => unknown ): this; updateIn( keyPath: Iterable, updater: (value: unknown) => unknown ): this; /** * A combination of `updateIn` and `merge`, returning a new Map, but * performing the merge at a point arrived at by following the keyPath. * In other words, these two lines are equivalent: * * ```js * map.updateIn(['a', 'b', 'c'], abc => abc.merge(y)) * map.mergeIn(['a', 'b', 'c'], y) * ``` * * Note: `mergeIn` can be used in `withMutations`. */ mergeIn(keyPath: Iterable, ...collections: Array): this; /** * A combination of `updateIn` and `mergeDeep`, returning a new Map, but * performing the deep merge at a point arrived at by following the keyPath. * In other words, these two lines are equivalent: * * ```js * map.updateIn(['a', 'b', 'c'], abc => abc.mergeDeep(y)) * map.mergeDeepIn(['a', 'b', 'c'], y) * ``` * * Note: `mergeDeepIn` can be used in `withMutations`. */ mergeDeepIn( keyPath: Iterable, ...collections: Array ): this; // Transient changes /** * Every time you call one of the above functions, a new immutable Map is * created. If a pure function calls a number of these to produce a final * return value, then a penalty on performance and memory has been paid by * creating all of the intermediate immutable Maps. * * If you need to apply a series of mutations to produce a new immutable * Map, `withMutations()` creates a temporary mutable copy of the Map which * can apply mutations in a highly performant manner. In fact, this is * exactly how complex mutations like `merge` are done. * * As an example, this results in the creation of 2, not 4, new Maps: * * Note: Not all methods can be used on a mutable collection or within * `withMutations`! Read the documentation for each method to see if it * is safe to use in `withMutations`. */ withMutations(mutator: (mutable: this) => unknown): this; /** * Another way to avoid creation of intermediate Immutable maps is to create * a mutable copy of this collection. Mutable copies *always* return `this`, * and thus shouldn't be used for equality. Your function should never return * a mutable copy of a collection, only use it internally to create a new * collection. * * If possible, use `withMutations` to work with temporary mutable copies as * it provides an easier to use API and considers many common optimizations. * * Note: if the collection is already mutable, `asMutable` returns itself. * * Note: Not all methods can be used on a mutable collection or within * `withMutations`! Read the documentation for each method to see if it * is safe to use in `withMutations`. * * @see `Map#asImmutable` */ asMutable(): this; /** * Returns true if this is a mutable copy (see `asMutable()`) and mutative * alterations have been applied. * * @see `Map#asMutable` */ wasAltered(): boolean; /** * The yin to `asMutable`'s yang. Because it applies to mutable collections, * this operation is *mutable* and may return itself (though may not * return itself, i.e. if the result is an empty collection). Once * performed, the original mutable copy must no longer be mutated since it * may be the immutable result. * * If possible, use `withMutations` to work with temporary mutable copies as * it provides an easier to use API and considers many common optimizations. * * @see `Map#asMutable` */ asImmutable(): this; // Sequence algorithms /** * Returns a new Map with values passed through a * `mapper` function. * * Map({ a: 1, b: 2 }).map(x => 10 * x) * // Map { a: 10, b: 20 } */ map( mapper: (value: V, key: K, iter: this) => M, context?: unknown ): Map; /** * @see Collection.Keyed.mapKeys */ mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: unknown ): Map; /** * @see Collection.Keyed.mapEntries */ mapEntries( mapper: ( entry: [K, V], index: number, iter: this ) => [KM, VM] | undefined, context?: unknown ): Map; /** * Flat-maps the Map, returning a new Map. * * Similar to `data.map(...).flatten(true)`. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown ): Map; /** * Returns a new Map with only the entries for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: V, key: K, iter: this) => value is F, context?: unknown ): Map; filter( predicate: (value: V, key: K, iter: this) => unknown, context?: unknown ): this; /** * Returns a new Map with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C ): [Map, Map]; partition( predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C ): [this, this]; /** * @see Collection.Keyed.flip */ flip(): Map; /** * Returns an OrderedMap of the same type which includes the same entries, * stably sorted by using a `comparator`. * * If a `comparator` is not provided, a default comparator uses `<` and `>`. * * `comparator(valueA, valueB)`: * * * Returns `0` if the elements should not be swapped. * * Returns `-1` (or any negative number) if `valueA` comes before `valueB` * * Returns `1` (or any positive number) if `valueA` comes after `valueB` * * Alternatively, can return a value of the `PairSorting` enum type * * Is pure, i.e. it must always return the same value for the same pair * of values. * * Note: `sort()` Always returns a new instance, even if the original was * already sorted. * * Note: This is always an eager operation. */ sort(comparator?: Comparator): this & OrderedMap; /** * Like `sort`, but also accepts a `comparatorValueMapper` which allows for * sorting by more sophisticated means: * * Note: `sortBy()` Always returns a new instance, even if the original was * already sorted. * * Note: This is always an eager operation. */ sortBy( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: (valueA: C, valueB: C) => number ): this & OrderedMap; } /** * A type of Map that has the additional guarantee that the iteration order of * entries will be the order in which they were set(). * * The iteration behavior of OrderedMap is the same as native ES6 Map and * JavaScript Object. * * Note that `OrderedMap` are more expensive than non-ordered `Map` and may * consume more memory. `OrderedMap#set` is amortized O(log32 N), but not * stable. */ namespace OrderedMap { /** * True if the provided value is an OrderedMap. */ function isOrderedMap( maybeOrderedMap: unknown ): maybeOrderedMap is OrderedMap; } /** * Creates a new Immutable OrderedMap. * * Created with the same key value pairs as the provided Collection.Keyed or * JavaScript Object or expects a Collection of [K, V] tuple entries. * * The iteration order of key-value pairs provided to this constructor will * be preserved in the OrderedMap. * * let newOrderedMap = OrderedMap({key: "value"}) * let newOrderedMap = OrderedMap([["key", "value"]]) * * Note: `OrderedMap` is a factory function and not a class, and does not use * the `new` keyword during construction. */ function OrderedMap(collection?: Iterable<[K, V]>): OrderedMap; function OrderedMap(obj: { [key: string]: V }): OrderedMap; interface OrderedMap extends Map, OrderedCollection<[K, V]> { /** * The number of entries in this OrderedMap. */ readonly size: number; /** * Returns a new OrderedMap also containing the new key, value pair. If an * equivalent key already exists in this OrderedMap, it will be replaced * while maintaining the existing order. * * Note: `set` can be used in `withMutations`. */ set(key: K, value: V): this; /** * Returns a new OrderedMap resulting from merging the provided Collections * (or JS objects) into this OrderedMap. In other words, this takes each * entry of each collection and sets it on this OrderedMap. * * Note: Values provided to `merge` are shallowly converted before being * merged. No nested values are altered. * * Note: `merge` can be used in `withMutations`. * * @alias concat */ merge( ...collections: Array> ): OrderedMap | VC>; merge( ...collections: Array<{ [key: string]: C }> ): OrderedMap | C>; concat( ...collections: Array> ): OrderedMap | VC>; concat( ...collections: Array<{ [key: string]: C }> ): OrderedMap | C>; mergeWith( merger: (oldVal: V, newVal: VC, key: K) => VCC, ...collections: Array> ): OrderedMap; mergeWith( merger: (oldVal: V, newVal: C, key: string) => CC, ...collections: Array<{ [key: string]: C }> ): OrderedMap; mergeDeep( ...collections: Array> ): OrderedMap; mergeDeep( ...collections: Array<{ [key: string]: C }> ): OrderedMap; // Sequence algorithms /** * Returns a new OrderedMap with values passed through a * `mapper` function. * * OrderedMap({ a: 1, b: 2 }).map(x => 10 * x) * // OrderedMap { "a": 10, "b": 20 } * * Note: `map()` always returns a new instance, even if it produced the same * value at every step. */ map( mapper: (value: V, key: K, iter: this) => M, context?: unknown ): OrderedMap; /** * @see Collection.Keyed.mapKeys */ mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: unknown ): OrderedMap; /** * @see Collection.Keyed.mapEntries */ mapEntries( mapper: ( entry: [K, V], index: number, iter: this ) => [KM, VM] | undefined, context?: unknown ): OrderedMap; /** * Flat-maps the OrderedMap, returning a new OrderedMap. * * Similar to `data.map(...).flatten(true)`. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown ): OrderedMap; /** * Returns a new OrderedMap with only the entries for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: V, key: K, iter: this) => value is F, context?: unknown ): OrderedMap; filter( predicate: (value: V, key: K, iter: this) => unknown, context?: unknown ): this; /** * Returns a new OrderedMap with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C ): [OrderedMap, OrderedMap]; partition( predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C ): [this, this]; /** * @see Collection.Keyed.flip */ flip(): OrderedMap; } /** * A Collection of unique values with `O(log32 N)` adds and has. * * When iterating a Set, the entries will be (value, value) pairs. Iteration * order of a Set is undefined, however is stable. Multiple iterations of the * same Set will iterate in the same order. * * Set values, like Map keys, may be of any type. Equality is determined using * `Immutable.is`, enabling Sets to uniquely include other Immutable * collections, custom value types, and NaN. */ namespace Set { /** * True if the provided value is a Set */ function isSet(maybeSet: unknown): maybeSet is Set; /** * Creates a new Set containing `values`. */ function of(...values: Array): Set; /** * `Set.fromKeys()` creates a new immutable Set containing the keys from * this Collection or JavaScript Object. */ function fromKeys(iter: Collection.Keyed): Set; function fromKeys(iter: Collection): Set; function fromKeys(obj: { [key: string]: unknown }): Set; /** * `Set.intersect()` creates a new immutable Set that is the intersection of * a collection of other sets. * * ```js * import { Set } from 'immutable' * const intersected = Set.intersect([ * Set([ 'a', 'b', 'c' ]) * Set([ 'c', 'a', 't' ]) * ]) * // Set [ "a", "c" ] * ``` */ function intersect(sets: Iterable>): Set; /** * `Set.union()` creates a new immutable Set that is the union of a * collection of other sets. * * ```js * import { Set } from 'immutable' * const unioned = Set.union([ * Set([ 'a', 'b', 'c' ]) * Set([ 'c', 'a', 't' ]) * ]) * // Set [ "a", "b", "c", "t" ] * ``` */ function union(sets: Iterable>): Set; } /** * Create a new immutable Set containing the values of the provided * collection-like. * * Note: `Set` is a factory function and not a class, and does not use the * `new` keyword during construction. */ function Set(collection?: Iterable | ArrayLike): Set; interface Set extends Collection.Set { /** * The number of items in this Set. */ readonly size: number; // Persistent changes /** * Returns a new Set which also includes this value. * * Note: `add` can be used in `withMutations`. */ add(value: T): this; /** * Returns a new Set which excludes this value. * * Note: `delete` can be used in `withMutations`. * * Note: `delete` **cannot** be safely used in IE8, use `remove` if * supporting old browsers. * * @alias remove */ delete(value: T): this; remove(value: T): this; /** * Returns a new Set containing no values. * * Note: `clear` can be used in `withMutations`. */ clear(): this; /** * Returns a Set including any value from `collections` that does not already * exist in this Set. * * Note: `union` can be used in `withMutations`. * @alias merge * @alias concat */ union(...collections: Array>): Set; merge(...collections: Array>): Set; concat(...collections: Array>): Set; /** * Returns a Set which has removed any values not also contained * within `collections`. * * Note: `intersect` can be used in `withMutations`. */ intersect(...collections: Array>): this; /** * Returns a Set excluding any values contained within `collections`. * * Note: `subtract` can be used in `withMutations`. */ subtract(...collections: Array>): this; // Transient changes /** * Note: Not all methods can be used on a mutable collection or within * `withMutations`! Check the documentation for each method to see if it * mentions being safe to use in `withMutations`. * * @see `Map#withMutations` */ withMutations(mutator: (mutable: this) => unknown): this; /** * Note: Not all methods can be used on a mutable collection or within * `withMutations`! Check the documentation for each method to see if it * mentions being safe to use in `withMutations`. * * @see `Map#asMutable` */ asMutable(): this; /** * @see `Map#wasAltered` */ wasAltered(): boolean; /** * @see `Map#asImmutable` */ asImmutable(): this; // Sequence algorithms /** * Returns a new Set with values passed through a * `mapper` function. * * Set([1,2]).map(x => 10 * x) * // Set [10,20] */ map( mapper: (value: T, key: T, iter: this) => M, context?: unknown ): Set; /** * Flat-maps the Set, returning a new Set. * * Similar to `set.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown ): Set; /** * Returns a new Set with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, key: T, iter: this) => value is F, context?: unknown ): Set; filter( predicate: (value: T, key: T, iter: this) => unknown, context?: unknown ): this; /** * Returns a new Set with the values for which the `predicate` function * returns false and another for which is returns true. */ partition( predicate: (this: C, value: T, key: T, iter: this) => value is F, context?: C ): [Set, Set]; partition( predicate: (this: C, value: T, key: T, iter: this) => unknown, context?: C ): [this, this]; /** * Returns an OrderedSet of the same type which includes the same entries, * stably sorted by using a `comparator`. * * If a `comparator` is not provided, a default comparator uses `<` and `>`. * * `comparator(valueA, valueB)`: * * * Returns `0` if the elements should not be swapped. * * Returns `-1` (or any negative number) if `valueA` comes before `valueB` * * Returns `1` (or any positive number) if `valueA` comes after `valueB` * * Alternatively, can return a value of the `PairSorting` enum type * * Is pure, i.e. it must always return the same value for the same pair * of values. * * Note: `sort()` Always returns a new instance, even if the original was * already sorted. * * Note: This is always an eager operation. */ sort(comparator?: Comparator): this & OrderedSet; /** * Like `sort`, but also accepts a `comparatorValueMapper` which allows for * sorting by more sophisticated means: * * Note: `sortBy()` Always returns a new instance, even if the original was * already sorted. * * Note: This is always an eager operation. */ sortBy( comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: (valueA: C, valueB: C) => number ): this & OrderedSet; } /** * A type of Set that has the additional guarantee that the iteration order of * values will be the order in which they were `add`ed. * * The iteration behavior of OrderedSet is the same as native ES6 Set. * * Note that `OrderedSet` are more expensive than non-ordered `Set` and may * consume more memory. `OrderedSet#add` is amortized O(log32 N), but not * stable. */ namespace OrderedSet { /** * True if the provided value is an OrderedSet. */ function isOrderedSet( maybeOrderedSet: unknown ): maybeOrderedSet is OrderedSet; /** * Creates a new OrderedSet containing `values`. */ function of(...values: Array): OrderedSet; /** * `OrderedSet.fromKeys()` creates a new immutable OrderedSet containing * the keys from this Collection or JavaScript Object. */ function fromKeys(iter: Collection.Keyed): OrderedSet; function fromKeys(iter: Collection): OrderedSet; function fromKeys(obj: { [key: string]: unknown }): OrderedSet; } /** * Create a new immutable OrderedSet containing the values of the provided * collection-like. * * Note: `OrderedSet` is a factory function and not a class, and does not use * the `new` keyword during construction. */ function OrderedSet( collection?: Iterable | ArrayLike ): OrderedSet; interface OrderedSet extends Set, OrderedCollection { /** * The number of items in this OrderedSet. */ readonly size: number; /** * Returns an OrderedSet including any value from `collections` that does * not already exist in this OrderedSet. * * Note: `union` can be used in `withMutations`. * @alias merge * @alias concat */ union(...collections: Array>): OrderedSet; merge(...collections: Array>): OrderedSet; concat(...collections: Array>): OrderedSet; // Sequence algorithms /** * Returns a new Set with values passed through a * `mapper` function. * * OrderedSet([ 1, 2 ]).map(x => 10 * x) * // OrderedSet [10, 20] */ map( mapper: (value: T, key: T, iter: this) => M, context?: unknown ): OrderedSet; /** * Flat-maps the OrderedSet, returning a new OrderedSet. * * Similar to `set.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown ): OrderedSet; /** * Returns a new OrderedSet with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, key: T, iter: this) => value is F, context?: unknown ): OrderedSet; filter( predicate: (value: T, key: T, iter: this) => unknown, context?: unknown ): this; /** * Returns a new OrderedSet with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: T, key: T, iter: this) => value is F, context?: C ): [OrderedSet, OrderedSet]; partition( predicate: (this: C, value: T, key: T, iter: this) => unknown, context?: C ): [this, this]; /** * Returns an OrderedSet of the same type "zipped" with the provided * collections. * * Like `zipWith`, but using the default `zipper`: creating an `Array`. * * ```js * const a = OrderedSet([ 1, 2, 3 ]) * const b = OrderedSet([ 4, 5, 6 ]) * const c = a.zip(b) * // OrderedSet [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ] * ``` */ zip(other: Collection): OrderedSet<[T, U]>; zip( other1: Collection, other2: Collection ): OrderedSet<[T, U, V]>; zip( ...collections: Array> ): OrderedSet; /** * Returns a OrderedSet of the same type "zipped" with the provided * collections. * * Unlike `zip`, `zipAll` continues zipping until the longest collection is * exhausted. Missing values from shorter collections are filled with `undefined`. * * ```js * const a = OrderedSet([ 1, 2 ]); * const b = OrderedSet([ 3, 4, 5 ]); * const c = a.zipAll(b); // OrderedSet [ [ 1, 3 ], [ 2, 4 ], [ undefined, 5 ] ] * ``` * * Note: Since zipAll will return a collection as large as the largest * input, some results may contain undefined values. TypeScript cannot * account for these without cases (as of v2.5). */ zipAll(other: Collection): OrderedSet<[T, U]>; zipAll( other1: Collection, other2: Collection ): OrderedSet<[T, U, V]>; zipAll( ...collections: Array> ): OrderedSet; /** * Returns an OrderedSet of the same type "zipped" with the provided * collections by using a custom `zipper` function. * * @see Seq.Indexed.zipWith */ zipWith( zipper: (value: T, otherValue: U) => Z, otherCollection: Collection ): OrderedSet; zipWith( zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection ): OrderedSet; zipWith( zipper: (...values: Array) => Z, ...collections: Array> ): OrderedSet; } /** * Stacks are indexed collections which support very efficient O(1) addition * and removal from the front using `unshift(v)` and `shift()`. * * For familiarity, Stack also provides `push(v)`, `pop()`, and `peek()`, but * be aware that they also operate on the front of the list, unlike List or * a JavaScript Array. * * Note: `reverse()` or any inherent reverse traversal (`reduceRight`, * `lastIndexOf`, etc.) is not efficient with a Stack. * * Stack is implemented with a Single-Linked List. */ namespace Stack { /** * True if the provided value is a Stack */ function isStack(maybeStack: unknown): maybeStack is Stack; /** * Creates a new Stack containing `values`. */ function of(...values: Array): Stack; } /** * Create a new immutable Stack containing the values of the provided * collection-like. * * The iteration order of the provided collection is preserved in the * resulting `Stack`. * * Note: `Stack` is a factory function and not a class, and does not use the * `new` keyword during construction. */ function Stack(collection?: Iterable | ArrayLike): Stack; interface Stack extends Collection.Indexed { /** * The number of items in this Stack. */ readonly size: number; // Reading values /** * Alias for `Stack.first()`. */ peek(): T | undefined; // Persistent changes /** * Returns a new Stack with 0 size and no values. * * Note: `clear` can be used in `withMutations`. */ clear(): Stack; /** * Returns a new Stack with the provided `values` prepended, shifting other * values ahead to higher indices. * * This is very efficient for Stack. * * Note: `unshift` can be used in `withMutations`. */ unshift(...values: Array): Stack; /** * Like `Stack#unshift`, but accepts a collection rather than varargs. * * Note: `unshiftAll` can be used in `withMutations`. */ unshiftAll(iter: Iterable): Stack; /** * Returns a new Stack with a size ones less than this Stack, excluding * the first item in this Stack, shifting all other values to a lower index. * * Note: this differs from `Array#shift` because it returns a new * Stack rather than the removed value. Use `first()` or `peek()` to get the * first value in this Stack. * * Note: `shift` can be used in `withMutations`. */ shift(): Stack; /** * Alias for `Stack#unshift` and is not equivalent to `List#push`. */ push(...values: Array): Stack; /** * Alias for `Stack#unshiftAll`. */ pushAll(iter: Iterable): Stack; /** * Alias for `Stack#shift` and is not equivalent to `List#pop`. */ pop(): Stack; // Transient changes /** * Note: Not all methods can be used on a mutable collection or within * `withMutations`! Check the documentation for each method to see if it * mentions being safe to use in `withMutations`. * * @see `Map#withMutations` */ withMutations(mutator: (mutable: this) => unknown): this; /** * Note: Not all methods can be used on a mutable collection or within * `withMutations`! Check the documentation for each method to see if it * mentions being safe to use in `withMutations`. * * @see `Map#asMutable` */ asMutable(): this; /** * @see `Map#wasAltered` */ wasAltered(): boolean; /** * @see `Map#asImmutable` */ asImmutable(): this; // Sequence algorithms /** * Returns a new Stack with other collections concatenated to this one. */ concat(...valuesOrCollections: Array | C>): Stack; /** * Returns a new Stack with values passed through a * `mapper` function. * * Stack([ 1, 2 ]).map(x => 10 * x) * // Stack [ 10, 20 ] * * Note: `map()` always returns a new instance, even if it produced the same * value at every step. */ map( mapper: (value: T, key: number, iter: this) => M, context?: unknown ): Stack; /** * Flat-maps the Stack, returning a new Stack. * * Similar to `stack.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown ): Stack; /** * Returns a new Set with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, index: number, iter: this) => value is F, context?: unknown ): Set; filter( predicate: (value: T, index: number, iter: this) => unknown, context?: unknown ): this; /** * Returns a Stack "zipped" with the provided collections. * * Like `zipWith`, but using the default `zipper`: creating an `Array`. * * ```js * const a = Stack([ 1, 2, 3 ]); * const b = Stack([ 4, 5, 6 ]); * const c = a.zip(b); // Stack [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ] * ``` */ zip(other: Collection): Stack<[T, U]>; zip( other: Collection, other2: Collection ): Stack<[T, U, V]>; zip(...collections: Array>): Stack; /** * Returns a Stack "zipped" with the provided collections. * * Unlike `zip`, `zipAll` continues zipping until the longest collection is * exhausted. Missing values from shorter collections are filled with `undefined`. * * ```js * const a = Stack([ 1, 2 ]); * const b = Stack([ 3, 4, 5 ]); * const c = a.zipAll(b); // Stack [ [ 1, 3 ], [ 2, 4 ], [ undefined, 5 ] ] * ``` * * Note: Since zipAll will return a collection as large as the largest * input, some results may contain undefined values. TypeScript cannot * account for these without cases (as of v2.5). */ zipAll(other: Collection): Stack<[T, U]>; zipAll( other: Collection, other2: Collection ): Stack<[T, U, V]>; zipAll(...collections: Array>): Stack; /** * Returns a Stack "zipped" with the provided collections by using a * custom `zipper` function. * * ```js * const a = Stack([ 1, 2, 3 ]); * const b = Stack([ 4, 5, 6 ]); * const c = a.zipWith((a, b) => a + b, b); * // Stack [ 5, 7, 9 ] * ``` */ zipWith( zipper: (value: T, otherValue: U) => Z, otherCollection: Collection ): Stack; zipWith( zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection ): Stack; zipWith( zipper: (...values: Array) => Z, ...collections: Array> ): Stack; } /** * Returns a Seq.Indexed of numbers from `start` (inclusive) to `end` * (exclusive), by `step`, where `start` defaults to 0, `step` to 1, and `end` to * infinity. When `start` is equal to `end`, returns empty range. * * Note: `Range` is a factory function and not a class, and does not use the * `new` keyword during construction. * * ```js * import { Range } from 'immutable' * Range(10, 15) // [ 10, 11, 12, 13, 14 ] * Range(10, 30, 5) // [ 10, 15, 20, 25 ] * Range(30, 10, 5) // [ 30, 25, 20, 15 ] * Range(30, 30, 5) // [] * ``` */ function Range( start: number, end: number, step?: number ): Seq.Indexed; /** * Returns a Seq.Indexed of `value` repeated `times` times. When `times` is * not defined, returns an infinite `Seq` of `value`. * * Note: `Repeat` is a factory function and not a class, and does not use the * `new` keyword during construction. * * ```js * import { Repeat } from 'immutable' * Repeat('foo') // [ 'foo', 'foo', 'foo', ... ] * Repeat('bar', 4) // [ 'bar', 'bar', 'bar', 'bar' ] * ``` */ function Repeat(value: T, times?: number): Seq.Indexed; /** * A record is similar to a JS object, but enforces a specific set of allowed * string keys, and has default values. * * The `Record()` function produces new Record Factories, which when called * create Record instances. * * ```js * import { Record } from 'immutable' * const ABRecord = Record({ a: 1, b: 2 }) * const myRecord = ABRecord({ b: 3 }) * ``` * * Records always have a value for the keys they define. `remove`ing a key * from a record simply resets it to the default value for that key. * * ```js * myRecord.get('a') // 1 * myRecord.get('b') // 3 * const myRecordWithoutB = myRecord.remove('b') * myRecordWithoutB.get('b') // 2 * ``` * * Values provided to the constructor not found in the Record type will * be ignored. For example, in this case, ABRecord is provided a key "x" even * though only "a" and "b" have been defined. The value for "x" will be * ignored for this record. * * ```js * const myRecord = ABRecord({ b: 3, x: 10 }) * myRecord.get('x') // undefined * ``` * * Because Records have a known set of string keys, property get access works * as expected, however property sets will throw an Error. * * Note: IE8 does not support property access. Only use `get()` when * supporting IE8. * * ```js * myRecord.b // 3 * myRecord.b = 5 // throws Error * ``` * * Record Types can be extended as well, allowing for custom methods on your * Record. This is not a common pattern in functional environments, but is in * many JS programs. * * However Record Types are more restricted than typical JavaScript classes. * They do not use a class constructor, which also means they cannot use * class properties (since those are technically part of a constructor). * * While Record Types can be syntactically created with the JavaScript `class` * form, the resulting Record function is actually a factory function, not a * class constructor. Even though Record Types are not classes, JavaScript * currently requires the use of `new` when creating new Record instances if * they are defined as a `class`. * * ``` * class ABRecord extends Record({ a: 1, b: 2 }) { * getAB() { * return this.a + this.b; * } * } * * var myRecord = new ABRecord({b: 3}) * myRecord.getAB() // 4 * ``` * * * **Flow Typing Records:** * * Immutable.js exports two Flow types designed to make it easier to use * Records with flow typed code, `RecordOf` and `RecordFactory`. * * When defining a new kind of Record factory function, use a flow type that * describes the values the record contains along with `RecordFactory`. * To type instances of the Record (which the factory function returns), * use `RecordOf`. * * Typically, new Record definitions will export both the Record factory * function as well as the Record instance type for use in other code. * * ```js * import type { RecordFactory, RecordOf } from 'immutable'; * * // Use RecordFactory for defining new Record factory functions. * type Point3DProps = { x: number, y: number, z: number }; * const defaultValues: Point3DProps = { x: 0, y: 0, z: 0 }; * const makePoint3D: RecordFactory = Record(defaultValues); * export makePoint3D; * * // Use RecordOf for defining new instances of that Record. * export type Point3D = RecordOf; * const some3DPoint: Point3D = makePoint3D({ x: 10, y: 20, z: 30 }); * ``` * * **Flow Typing Record Subclasses:** * * Records can be subclassed as a means to add additional methods to Record * instances. This is generally discouraged in favor of a more functional API, * since Subclasses have some minor overhead. However the ability to create * a rich API on Record types can be quite valuable. * * When using Flow to type Subclasses, do not use `RecordFactory`, * instead apply the props type when subclassing: * * ```js * type PersonProps = {name: string, age: number}; * const defaultValues: PersonProps = {name: 'Aristotle', age: 2400}; * const PersonRecord = Record(defaultValues); * class Person extends PersonRecord { * getName(): string { * return this.get('name') * } * * setName(name: string): this { * return this.set('name', name); * } * } * ``` * * **Choosing Records vs plain JavaScript objects** * * Records offer a persistently immutable alternative to plain JavaScript * objects, however they're not required to be used within Immutable.js * collections. In fact, the deep-access and deep-updating functions * like `getIn()` and `setIn()` work with plain JavaScript Objects as well. * * Deciding to use Records or Objects in your application should be informed * by the tradeoffs and relative benefits of each: * * - *Runtime immutability*: plain JS objects may be carefully treated as * immutable, however Record instances will *throw* if attempted to be * mutated directly. Records provide this additional guarantee, however at * some marginal runtime cost. While JS objects are mutable by nature, the * use of type-checking tools like [Flow](https://medium.com/@gcanti/immutability-with-flow-faa050a1aef4) * can help gain confidence in code written to favor immutability. * * - *Value equality*: Records use value equality when compared with `is()` * or `record.equals()`. That is, two Records with the same keys and values * are equal. Plain objects use *reference equality*. Two objects with the * same keys and values are not equal since they are different objects. * This is important to consider when using objects as keys in a `Map` or * values in a `Set`, which use equality when retrieving values. * * - *API methods*: Records have a full featured API, with methods like * `.getIn()`, and `.equals()`. These can make working with these values * easier, but comes at the cost of not allowing keys with those names. * * - *Default values*: Records provide default values for every key, which * can be useful when constructing Records with often unchanging values. * However default values can make using Flow and TypeScript more laborious. * * - *Serialization*: Records use a custom internal representation to * efficiently store and update their values. Converting to and from this * form isn't free. If converting Records to plain objects is common, * consider sticking with plain objects to begin with. */ namespace Record { /** * True if `maybeRecord` is an instance of a Record. */ function isRecord(maybeRecord: unknown): maybeRecord is Record; /** * Records allow passing a second parameter to supply a descriptive name * that appears when converting a Record to a string or in any error * messages. A descriptive name for any record can be accessed by using this * method. If one was not provided, the string "Record" is returned. * * ```js * import { Record } from 'immutable' * const Person = Record({ * name: null * }, 'Person') * * var me = Person({ name: 'My Name' }) * me.toString() // "Person { "name": "My Name" }" * Record.getDescriptiveName(me) // "Person" * ``` */ function getDescriptiveName( record: RecordOf ): string; /** * A Record.Factory is created by the `Record()` function. Record instances * are created by passing it some of the accepted values for that Record * type: * * Note that Record Factories return `Record & Readonly`, * this allows use of both the Record instance API, and direct property * access on the resulting instances: */ namespace Factory {} interface Factory { ( values?: Partial | Iterable<[string, unknown]> ): RecordOf; new ( values?: Partial | Iterable<[string, unknown]> ): RecordOf; /** * The name provided to `Record(values, name)` can be accessed with * `displayName`. */ displayName: string; } function Factory( values?: Partial | Iterable<[string, unknown]> ): RecordOf; } /** * Unlike other types in Immutable.js, the `Record()` function creates a new * Record Factory, which is a function that creates Record instances. * * See above for examples of using `Record()`. * * Note: `Record` is a factory function and not a class, and does not use the * `new` keyword during construction. */ function Record( defaultValues: TProps, name?: string ): Record.Factory; interface Record { // Reading values has(key: string): key is keyof TProps & string; /** * Returns the value associated with the provided key, which may be the * default value defined when creating the Record factory function. * * If the requested key is not defined by this Record type, then * notSetValue will be returned if provided. Note that this scenario would * produce an error when using Flow or TypeScript. */ get(key: K, notSetValue?: unknown): TProps[K]; get(key: string, notSetValue: T): T; // Reading deep values hasIn(keyPath: Iterable): boolean; getIn(keyPath: Iterable): unknown; // Value equality equals(other: unknown): boolean; hashCode(): number; // Persistent changes set(key: K, value: TProps[K]): this; update( key: K, updater: (value: TProps[K]) => TProps[K] ): this; merge( ...collections: Array | Iterable<[string, unknown]>> ): this; mergeDeep( ...collections: Array | Iterable<[string, unknown]>> ): this; mergeWith( merger: (oldVal: unknown, newVal: unknown, key: keyof TProps) => unknown, ...collections: Array | Iterable<[string, unknown]>> ): this; mergeDeepWith( merger: (oldVal: unknown, newVal: unknown, key: unknown) => unknown, ...collections: Array | Iterable<[string, unknown]>> ): this; /** * Returns a new instance of this Record type with the value for the * specific key set to its default value. * * @alias remove */ delete(key: K): this; remove(key: K): this; /** * Returns a new instance of this Record type with all values set * to their default values. */ clear(): this; // Deep persistent changes setIn(keyPath: Iterable, value: unknown): this; updateIn( keyPath: Iterable, updater: (value: unknown) => unknown ): this; mergeIn(keyPath: Iterable, ...collections: Array): this; mergeDeepIn( keyPath: Iterable, ...collections: Array ): this; /** * @alias removeIn */ deleteIn(keyPath: Iterable): this; removeIn(keyPath: Iterable): this; // Conversion to JavaScript types /** * Deeply converts this Record to equivalent native JavaScript Object. * * Note: This method may not be overridden. Objects with custom * serialization to plain JS may override toJSON() instead. */ toJS(): DeepCopy; /** * Shallowly converts this Record to equivalent native JavaScript Object. */ toJSON(): TProps; /** * Shallowly converts this Record to equivalent JavaScript Object. */ toObject(): TProps; // Transient changes /** * Note: Not all methods can be used on a mutable collection or within * `withMutations`! Only `set` may be used mutatively. * * @see `Map#withMutations` */ withMutations(mutator: (mutable: this) => unknown): this; /** * @see `Map#asMutable` */ asMutable(): this; /** * @see `Map#wasAltered` */ wasAltered(): boolean; /** * @see `Map#asImmutable` */ asImmutable(): this; // Sequence algorithms toSeq(): Seq.Keyed; [Symbol.iterator](): IterableIterator<[keyof TProps, TProps[keyof TProps]]>; } /** * RecordOf is used in TypeScript to define interfaces expecting an * instance of record with type T. * * This is equivalent to an instance of a record created by a Record Factory. */ type RecordOf = Record & Readonly; /** * `Seq` describes a lazy operation, allowing them to efficiently chain * use of all the higher-order collection methods (such as `map` and `filter`) * by not creating intermediate collections. * * **Seq is immutable** — Once a Seq is created, it cannot be * changed, appended to, rearranged or otherwise modified. Instead, any * mutative method called on a `Seq` will return a new `Seq`. * * **Seq is lazy** — `Seq` does as little work as necessary to respond to any * method call. Values are often created during iteration, including implicit * iteration when reducing or converting to a concrete data structure such as * a `List` or JavaScript `Array`. * * For example, the following performs no work, because the resulting * `Seq`'s values are never iterated: * * ```js * import { Seq } from 'immutable' * const oddSquares = Seq([ 1, 2, 3, 4, 5, 6, 7, 8 ]) * .filter(x => x % 2 !== 0) * .map(x => x * x) * ``` * * Once the `Seq` is used, it performs only the work necessary. In this * example, no intermediate arrays are ever created, filter is called three * times, and map is only called once: * * ```js * oddSquares.get(1); // 9 * ``` * * Any collection can be converted to a lazy Seq with `Seq()`. * * `Seq` allows for the efficient chaining of operations, allowing for the * expression of logic that can otherwise be very tedious: * * ```js * lazySeq * .flip() * .map(key => key.toUpperCase()) * .flip() * // Seq { A: 1, B: 1, C: 1 } * ``` * * As well as expressing logic that would otherwise seem memory or time * limited, for example `Range` is a special kind of Lazy sequence. * * Seq is often used to provide a rich collection API to JavaScript Object. * * ```js * Seq({ x: 0, y: 1, z: 2 }).map(v => v * 2).toObject(); * // { x: 0, y: 2, z: 4 } * ``` */ namespace Seq { /** * True if `maybeSeq` is a Seq, it is not backed by a concrete * structure such as Map, List, or Set. */ function isSeq( maybeSeq: unknown ): maybeSeq is | Seq.Indexed | Seq.Keyed | Seq.Set; /** * `Seq` which represents key-value pairs. */ namespace Keyed {} /** * Always returns a Seq.Keyed, if input is not keyed, expects an * collection of [K, V] tuples. * * Note: `Seq.Keyed` is a conversion function and not a class, and does not * use the `new` keyword during construction. */ function Keyed(collection?: Iterable<[K, V]>): Seq.Keyed; function Keyed(obj: { [key: string]: V }): Seq.Keyed; interface Keyed extends Seq, Collection.Keyed { /** * Deeply converts this Keyed Seq to equivalent native JavaScript Object. * * Converts keys to Strings. */ toJS(): { [key in PropertyKey]: DeepCopy }; /** * Shallowly converts this Keyed Seq to equivalent native JavaScript Object. * * Converts keys to Strings. */ toJSON(): { [key in PropertyKey]: V }; /** * Shallowly converts this collection to an Array. */ toArray(): Array<[K, V]>; /** * Returns itself */ toSeq(): this; /** * Returns a new Seq with other collections concatenated to this one. * * All entries will be present in the resulting Seq, even if they * have the same key. */ concat( ...collections: Array> ): Seq.Keyed; concat( ...collections: Array<{ [key: string]: C }> ): Seq.Keyed; /** * Returns a new Seq.Keyed with values passed through a * `mapper` function. * * ```js * import { Seq } from 'immutable' * Seq.Keyed({ a: 1, b: 2 }).map(x => 10 * x) * // Seq { "a": 10, "b": 20 } * ``` * * Note: `map()` always returns a new instance, even if it produced the * same value at every step. */ map( mapper: (value: V, key: K, iter: this) => M, context?: unknown ): Seq.Keyed; /** * @see Collection.Keyed.mapKeys */ mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: unknown ): Seq.Keyed; /** * @see Collection.Keyed.mapEntries */ mapEntries( mapper: ( entry: [K, V], index: number, iter: this ) => [KM, VM] | undefined, context?: unknown ): Seq.Keyed; /** * Flat-maps the Seq, returning a Seq of the same type. * * Similar to `seq.map(...).flatten(true)`. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown ): Seq.Keyed; /** * Returns a new Seq with only the entries for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: V, key: K, iter: this) => value is F, context?: unknown ): Seq.Keyed; filter( predicate: (value: V, key: K, iter: this) => unknown, context?: unknown ): this; /** * Returns a new keyed Seq with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C ): [Seq.Keyed, Seq.Keyed]; partition( predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C ): [this, this]; /** * @see Collection.Keyed.flip */ flip(): Seq.Keyed; [Symbol.iterator](): IterableIterator<[K, V]>; } /** * `Seq` which represents an ordered indexed list of values. */ namespace Indexed { /** * Provides an Seq.Indexed of the values provided. */ function of(...values: Array): Seq.Indexed; } /** * Always returns Seq.Indexed, discarding associated keys and * supplying incrementing indices. * * Note: `Seq.Indexed` is a conversion function and not a class, and does * not use the `new` keyword during construction. */ function Indexed( collection?: Iterable | ArrayLike ): Seq.Indexed; interface Indexed extends Seq, Collection.Indexed { /** * Deeply converts this Indexed Seq to equivalent native JavaScript Array. */ toJS(): Array>; /** * Shallowly converts this Indexed Seq to equivalent native JavaScript Array. */ toJSON(): Array; /** * Shallowly converts this collection to an Array. */ toArray(): Array; /** * Returns itself */ toSeq(): this; /** * Returns a new Seq with other collections concatenated to this one. */ concat( ...valuesOrCollections: Array | C> ): Seq.Indexed; /** * Returns a new Seq.Indexed with values passed through a * `mapper` function. * * ```js * import { Seq } from 'immutable' * Seq.Indexed([ 1, 2 ]).map(x => 10 * x) * // Seq [ 10, 20 ] * ``` * * Note: `map()` always returns a new instance, even if it produced the * same value at every step. */ map( mapper: (value: T, key: number, iter: this) => M, context?: unknown ): Seq.Indexed; /** * Flat-maps the Seq, returning a a Seq of the same type. * * Similar to `seq.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown ): Seq.Indexed; /** * Returns a new Seq with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, index: number, iter: this) => value is F, context?: unknown ): Seq.Indexed; filter( predicate: (value: T, index: number, iter: this) => unknown, context?: unknown ): this; /** * Returns a new indexed Seq with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C ): [Seq.Indexed, Seq.Indexed]; partition( predicate: (this: C, value: T, index: number, iter: this) => unknown, context?: C ): [this, this]; /** * Returns a Seq "zipped" with the provided collections. * * Like `zipWith`, but using the default `zipper`: creating an `Array`. * * ```js * const a = Seq([ 1, 2, 3 ]); * const b = Seq([ 4, 5, 6 ]); * const c = a.zip(b); // Seq [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ] * ``` */ zip(other: Collection): Seq.Indexed<[T, U]>; zip( other: Collection, other2: Collection ): Seq.Indexed<[T, U, V]>; zip( ...collections: Array> ): Seq.Indexed; /** * Returns a Seq "zipped" with the provided collections. * * Unlike `zip`, `zipAll` continues zipping until the longest collection is * exhausted. Missing values from shorter collections are filled with `undefined`. * * ```js * const a = Seq([ 1, 2 ]); * const b = Seq([ 3, 4, 5 ]); * const c = a.zipAll(b); // Seq [ [ 1, 3 ], [ 2, 4 ], [ undefined, 5 ] ] * ``` */ zipAll(other: Collection): Seq.Indexed<[T, U]>; zipAll( other: Collection, other2: Collection ): Seq.Indexed<[T, U, V]>; zipAll( ...collections: Array> ): Seq.Indexed; /** * Returns a Seq "zipped" with the provided collections by using a * custom `zipper` function. * * ```js * const a = Seq([ 1, 2, 3 ]); * const b = Seq([ 4, 5, 6 ]); * const c = a.zipWith((a, b) => a + b, b); * // Seq [ 5, 7, 9 ] * ``` */ zipWith( zipper: (value: T, otherValue: U) => Z, otherCollection: Collection ): Seq.Indexed; zipWith( zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection ): Seq.Indexed; zipWith( zipper: (...values: Array) => Z, ...collections: Array> ): Seq.Indexed; [Symbol.iterator](): IterableIterator; } /** * `Seq` which represents a set of values. * * Because `Seq` are often lazy, `Seq.Set` does not provide the same guarantee * of value uniqueness as the concrete `Set`. */ namespace Set { /** * Returns a Seq.Set of the provided values */ function of(...values: Array): Seq.Set; } /** * Always returns a Seq.Set, discarding associated indices or keys. * * Note: `Seq.Set` is a conversion function and not a class, and does not * use the `new` keyword during construction. */ function Set(collection?: Iterable | ArrayLike): Seq.Set; interface Set extends Seq, Collection.Set { /** * Deeply converts this Set Seq to equivalent native JavaScript Array. */ toJS(): Array>; /** * Shallowly converts this Set Seq to equivalent native JavaScript Array. */ toJSON(): Array; /** * Shallowly converts this collection to an Array. */ toArray(): Array; /** * Returns itself */ toSeq(): this; /** * Returns a new Seq with other collections concatenated to this one. * * All entries will be present in the resulting Seq, even if they * are duplicates. */ concat(...collections: Array>): Seq.Set; /** * Returns a new Seq.Set with values passed through a * `mapper` function. * * ```js * Seq.Set([ 1, 2 ]).map(x => 10 * x) * // Seq { 10, 20 } * ``` * * Note: `map()` always returns a new instance, even if it produced the * same value at every step. */ map( mapper: (value: T, key: T, iter: this) => M, context?: unknown ): Seq.Set; /** * Flat-maps the Seq, returning a Seq of the same type. * * Similar to `seq.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown ): Seq.Set; /** * Returns a new Seq with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, key: T, iter: this) => value is F, context?: unknown ): Seq.Set; filter( predicate: (value: T, key: T, iter: this) => unknown, context?: unknown ): this; /** * Returns a new set Seq with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: T, key: T, iter: this) => value is F, context?: C ): [Seq.Set, Seq.Set]; partition( predicate: (this: C, value: T, key: T, iter: this) => unknown, context?: C ): [this, this]; [Symbol.iterator](): IterableIterator; } } /** * Creates a Seq. * * Returns a particular kind of `Seq` based on the input. * * * If a `Seq`, that same `Seq`. * * If an `Collection`, a `Seq` of the same kind (Keyed, Indexed, or Set). * * If an Array-like, an `Seq.Indexed`. * * If an Iterable Object, an `Seq.Indexed`. * * If an Object, a `Seq.Keyed`. * * Note: An Iterator itself will be treated as an object, becoming a `Seq.Keyed`, * which is usually not what you want. You should turn your Iterator Object into * an iterable object by defining a Symbol.iterator (or @@iterator) method which * returns `this`. * * Note: `Seq` is a conversion function and not a class, and does not use the * `new` keyword during construction. */ function Seq>(seq: S): S; function Seq(collection: Collection.Keyed): Seq.Keyed; function Seq(collection: Collection.Set): Seq.Set; function Seq( collection: Collection.Indexed | Iterable | ArrayLike ): Seq.Indexed; function Seq(obj: { [key: string]: V }): Seq.Keyed; function Seq(): Seq; interface Seq extends Collection { /** * Some Seqs can describe their size lazily. When this is the case, * size will be an integer. Otherwise it will be undefined. * * For example, Seqs returned from `map()` or `reverse()` * preserve the size of the original `Seq` while `filter()` does not. * * Note: `Range`, `Repeat` and `Seq`s made from `Array`s and `Object`s will * always have a size. */ readonly size: number | undefined; // Force evaluation /** * Because Sequences are lazy and designed to be chained together, they do * not cache their results. For example, this map function is called a total * of 6 times, as each `join` iterates the Seq of three values. * * var squares = Seq([ 1, 2, 3 ]).map(x => x * x) * squares.join() + squares.join() * * If you know a `Seq` will be used multiple times, it may be more * efficient to first cache it in memory. Here, the map function is called * only 3 times. * * var squares = Seq([ 1, 2, 3 ]).map(x => x * x).cacheResult() * squares.join() + squares.join() * * Use this method judiciously, as it must fully evaluate a Seq which can be * a burden on memory and possibly performance. * * Note: after calling `cacheResult`, a Seq will always have a `size`. */ cacheResult(): this; // Sequence algorithms /** * Returns a new Seq with values passed through a * `mapper` function. * * ```js * import { Seq } from 'immutable' * Seq([ 1, 2 ]).map(x => 10 * x) * // Seq [ 10, 20 ] * ``` * * Note: `map()` always returns a new instance, even if it produced the same * value at every step. */ map( mapper: (value: V, key: K, iter: this) => M, context?: unknown ): Seq; /** * Returns a new Seq with values passed through a * `mapper` function. * * ```js * import { Seq } from 'immutable' * Seq([ 1, 2 ]).map(x => 10 * x) * // Seq [ 10, 20 ] * ``` * * Note: `map()` always returns a new instance, even if it produced the same * value at every step. * Note: used only for sets. */ map( mapper: (value: V, key: K, iter: this) => M, context?: unknown ): Seq; /** * Flat-maps the Seq, returning a Seq of the same type. * * Similar to `seq.map(...).flatten(true)`. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable, context?: unknown ): Seq; /** * Flat-maps the Seq, returning a Seq of the same type. * * Similar to `seq.map(...).flatten(true)`. * Note: Used only for sets. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable, context?: unknown ): Seq; /** * Returns a new Seq with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: V, key: K, iter: this) => value is F, context?: unknown ): Seq; filter( predicate: (value: V, key: K, iter: this) => unknown, context?: unknown ): this; /** * Returns a new Seq with the values for which the `predicate` function * returns false and another for which is returns true. */ partition( predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C ): [Seq, Seq]; partition( predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C ): [this, this]; /** * Returns a new Sequence of the same type with other values and * collection-like concatenated to this one. * * All entries will be present in the resulting Seq, even if they * have the same key. */ concat(...valuesOrCollections: Array): Seq; } /** * The `Collection` is a set of (key, value) entries which can be iterated, and * is the base class for all collections in `immutable`, allowing them to * make use of all the Collection methods (such as `map` and `filter`). * * Note: A collection is always iterated in the same order, however that order * may not always be well defined, as is the case for the `Map` and `Set`. * * Collection is the abstract base class for concrete data structures. It * cannot be constructed directly. * * Implementations should extend one of the subclasses, `Collection.Keyed`, * `Collection.Indexed`, or `Collection.Set`. */ namespace Collection { /** * Keyed Collections have discrete keys tied to each value. * * When iterating `Collection.Keyed`, each iteration will yield a `[K, V]` * tuple, in other words, `Collection#entries` is the default iterator for * Keyed Collections. */ namespace Keyed {} /** * Creates a Collection.Keyed * * Similar to `Collection()`, however it expects collection-likes of [K, V] * tuples if not constructed from a Collection.Keyed or JS Object. * * Note: `Collection.Keyed` is a conversion function and not a class, and * does not use the `new` keyword during construction. */ function Keyed(collection?: Iterable<[K, V]>): Collection.Keyed; function Keyed(obj: { [key: string]: V }): Collection.Keyed; interface Keyed extends Collection { /** * Deeply converts this Keyed collection to equivalent native JavaScript Object. * * Converts keys to Strings. */ toJS(): { [key in PropertyKey]: DeepCopy }; /** * Shallowly converts this Keyed collection to equivalent native JavaScript Object. * * Converts keys to Strings. */ toJSON(): { [key in PropertyKey]: V }; /** * Shallowly converts this collection to an Array. */ toArray(): Array<[K, V]>; /** * Returns Seq.Keyed. * @override */ toSeq(): Seq.Keyed; // Sequence functions /** * Returns a new Collection.Keyed of the same type where the keys and values * have been flipped. */ flip(): Collection.Keyed; /** * Returns a new Collection with other collections concatenated to this one. */ concat( ...collections: Array> ): Collection.Keyed; concat( ...collections: Array<{ [key: string]: C }> ): Collection.Keyed; /** * Returns a new Collection.Keyed with values passed through a * `mapper` function. * * ```js * import { Collection } from 'immutable' * Collection.Keyed({ a: 1, b: 2 }).map(x => 10 * x) * // Seq { "a": 10, "b": 20 } * ``` * * Note: `map()` always returns a new instance, even if it produced the * same value at every step. */ map( mapper: (value: V, key: K, iter: this) => M, context?: unknown ): Collection.Keyed; /** * Returns a new Collection.Keyed of the same type with keys passed through * a `mapper` function. * * Note: `mapKeys()` always returns a new instance, even if it produced * the same key at every step. */ mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: unknown ): Collection.Keyed; /** * Returns a new Collection.Keyed of the same type with entries * ([key, value] tuples) passed through a `mapper` function. * * Note: `mapEntries()` always returns a new instance, even if it produced * the same entry at every step. * * If the mapper function returns `undefined`, then the entry will be filtered */ mapEntries( mapper: ( entry: [K, V], index: number, iter: this ) => [KM, VM] | undefined, context?: unknown ): Collection.Keyed; /** * Flat-maps the Collection, returning a Collection of the same type. * * Similar to `collection.map(...).flatten(true)`. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown ): Collection.Keyed; /** * Returns a new Collection with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: V, key: K, iter: this) => value is F, context?: unknown ): Collection.Keyed; filter( predicate: (value: V, key: K, iter: this) => unknown, context?: unknown ): this; /** * Returns a new keyed Collection with the values for which the * `predicate` function returns false and another for which is returns * true. */ partition( predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C ): [Collection.Keyed, Collection.Keyed]; partition( predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C ): [this, this]; [Symbol.iterator](): IterableIterator<[K, V]>; } /** * Indexed Collections have incrementing numeric keys. They exhibit * slightly different behavior than `Collection.Keyed` for some methods in order * to better mirror the behavior of JavaScript's `Array`, and add methods * which do not make sense on non-indexed Collections such as `indexOf`. * * Unlike JavaScript arrays, `Collection.Indexed`s are always dense. "Unset" * indices and `undefined` indices are indistinguishable, and all indices from * 0 to `size` are visited when iterated. * * All Collection.Indexed methods return re-indexed Collections. In other words, * indices always start at 0 and increment until size. If you wish to * preserve indices, using them as keys, convert to a Collection.Keyed by * calling `toKeyedSeq`. */ namespace Indexed {} /** * Creates a new Collection.Indexed. * * Note: `Collection.Indexed` is a conversion function and not a class, and * does not use the `new` keyword during construction. */ function Indexed( collection?: Iterable | ArrayLike ): Collection.Indexed; interface Indexed extends Collection, OrderedCollection { /** * Deeply converts this Indexed collection to equivalent native JavaScript Array. */ toJS(): Array>; /** * Shallowly converts this Indexed collection to equivalent native JavaScript Array. */ toJSON(): Array; /** * Shallowly converts this collection to an Array. */ toArray(): Array; // Reading values /** * Returns the value associated with the provided index, or notSetValue if * the index is beyond the bounds of the Collection. * * `index` may be a negative number, which indexes back from the end of the * Collection. `s.get(-1)` gets the last item in the Collection. */ get(index: number, notSetValue: NSV): T | NSV; get(index: number): T | undefined; // Conversion to Seq /** * Returns Seq.Indexed. * @override */ toSeq(): Seq.Indexed; /** * If this is a collection of [key, value] entry tuples, it will return a * Seq.Keyed of those entries. */ fromEntrySeq(): Seq.Keyed; // Combination /** * Returns a Collection of the same type with `separator` between each item * in this Collection. */ interpose(separator: T): this; /** * Returns a Collection of the same type with the provided `collections` * interleaved into this collection. * * The resulting Collection includes the first item from each, then the * second from each, etc. * * The shortest Collection stops interleave. * * Since `interleave()` re-indexes values, it produces a complete copy, * which has `O(N)` complexity. * * Note: `interleave` *cannot* be used in `withMutations`. */ interleave(...collections: Array>): this; /** * Splice returns a new indexed Collection by replacing a region of this * Collection with new values. If values are not provided, it only skips the * region to be removed. * * `index` may be a negative number, which indexes back from the end of the * Collection. `s.splice(-2)` splices after the second to last item. * * Since `splice()` re-indexes values, it produces a complete copy, which * has `O(N)` complexity. * * Note: `splice` *cannot* be used in `withMutations`. */ splice(index: number, removeNum: number, ...values: Array): this; /** * Returns a Collection of the same type "zipped" with the provided * collections. * * Like `zipWith`, but using the default `zipper`: creating an `Array`. */ zip(other: Collection): Collection.Indexed<[T, U]>; zip( other: Collection, other2: Collection ): Collection.Indexed<[T, U, V]>; zip( ...collections: Array> ): Collection.Indexed; /** * Returns a Collection "zipped" with the provided collections. * * Unlike `zip`, `zipAll` continues zipping until the longest collection is * exhausted. Missing values from shorter collections are filled with `undefined`. * * ```js * const a = List([ 1, 2 ]); * const b = List([ 3, 4, 5 ]); * const c = a.zipAll(b); // List [ [ 1, 3 ], [ 2, 4 ], [ undefined, 5 ] ] * ``` */ zipAll(other: Collection): Collection.Indexed<[T, U]>; zipAll( other: Collection, other2: Collection ): Collection.Indexed<[T, U, V]>; zipAll( ...collections: Array> ): Collection.Indexed; /** * Returns a Collection of the same type "zipped" with the provided * collections by using a custom `zipper` function. */ zipWith( zipper: (value: T, otherValue: U) => Z, otherCollection: Collection ): Collection.Indexed; zipWith( zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection ): Collection.Indexed; zipWith( zipper: (...values: Array) => Z, ...collections: Array> ): Collection.Indexed; // Search for value /** * Returns the first index at which a given value can be found in the * Collection, or -1 if it is not present. */ indexOf(searchValue: T): number; /** * Returns the last index at which a given value can be found in the * Collection, or -1 if it is not present. */ lastIndexOf(searchValue: T): number; /** * Returns the first index in the Collection where a value satisfies the * provided predicate function. Otherwise -1 is returned. */ findIndex( predicate: (value: T, index: number, iter: this) => boolean, context?: unknown ): number; /** * Returns the last index in the Collection where a value satisfies the * provided predicate function. Otherwise -1 is returned. */ findLastIndex( predicate: (value: T, index: number, iter: this) => boolean, context?: unknown ): number; // Sequence algorithms /** * Returns a new Collection with other collections concatenated to this one. */ concat( ...valuesOrCollections: Array | C> ): Collection.Indexed; /** * Returns a new Collection.Indexed with values passed through a * `mapper` function. * * ```js * import { Collection } from 'immutable' * Collection.Indexed([1,2]).map(x => 10 * x) * // Seq [ 1, 2 ] * ``` * * Note: `map()` always returns a new instance, even if it produced the * same value at every step. */ map( mapper: (value: T, key: number, iter: this) => M, context?: unknown ): Collection.Indexed; /** * Flat-maps the Collection, returning a Collection of the same type. * * Similar to `collection.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown ): Collection.Indexed; /** * Returns a new Collection with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, index: number, iter: this) => value is F, context?: unknown ): Collection.Indexed; filter( predicate: (value: T, index: number, iter: this) => unknown, context?: unknown ): this; /** * Returns a new indexed Collection with the values for which the * `predicate` function returns false and another for which is returns * true. */ partition( predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C ): [Collection.Indexed, Collection.Indexed]; partition( predicate: (this: C, value: T, index: number, iter: this) => unknown, context?: C ): [this, this]; [Symbol.iterator](): IterableIterator; } /** * Set Collections only represent values. They have no associated keys or * indices. Duplicate values are possible in the lazy `Seq.Set`s, however * the concrete `Set` Collection does not allow duplicate values. * * Collection methods on Collection.Set such as `map` and `forEach` will provide * the value as both the first and second arguments to the provided function. * * ```js * import { Collection } from 'immutable' * const seq = Collection.Set([ 'A', 'B', 'C' ]) * // Seq { "A", "B", "C" } * seq.forEach((v, k) => * assert.equal(v, k) * ) * ``` */ namespace Set {} /** * Similar to `Collection()`, but always returns a Collection.Set. * * Note: `Collection.Set` is a factory function and not a class, and does * not use the `new` keyword during construction. */ function Set(collection?: Iterable | ArrayLike): Collection.Set; interface Set extends Collection { /** * Deeply converts this Set collection to equivalent native JavaScript Array. */ toJS(): Array>; /** * Shallowly converts this Set collection to equivalent native JavaScript Array. */ toJSON(): Array; /** * Shallowly converts this collection to an Array. */ toArray(): Array; /** * Returns Seq.Set. * @override */ toSeq(): Seq.Set; // Sequence algorithms /** * Returns a new Collection with other collections concatenated to this one. */ concat(...collections: Array>): Collection.Set; /** * Returns a new Collection.Set with values passed through a * `mapper` function. * * ``` * Collection.Set([ 1, 2 ]).map(x => 10 * x) * // Seq { 1, 2 } * ``` * * Note: `map()` always returns a new instance, even if it produced the * same value at every step. */ map( mapper: (value: T, key: T, iter: this) => M, context?: unknown ): Collection.Set; /** * Flat-maps the Collection, returning a Collection of the same type. * * Similar to `collection.map(...).flatten(true)`. */ flatMap( mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown ): Collection.Set; /** * Returns a new Collection with only the values for which the `predicate` * function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: T, key: T, iter: this) => value is F, context?: unknown ): Collection.Set; filter( predicate: (value: T, key: T, iter: this) => unknown, context?: unknown ): this; /** * Returns a new set Collection with the values for which the * `predicate` function returns false and another for which is returns * true. */ partition( predicate: (this: C, value: T, key: T, iter: this) => value is F, context?: C ): [Collection.Set, Collection.Set]; partition( predicate: (this: C, value: T, key: T, iter: this) => unknown, context?: C ): [this, this]; [Symbol.iterator](): IterableIterator; } } /** * Creates a Collection. * * The type of Collection created is based on the input. * * * If an `Collection`, that same `Collection`. * * If an Array-like, an `Collection.Indexed`. * * If an Object with an Iterator defined, an `Collection.Indexed`. * * If an Object, an `Collection.Keyed`. * * This methods forces the conversion of Objects and Strings to Collections. * If you want to ensure that a Collection of one item is returned, use * `Seq.of`. * * Note: An Iterator itself will be treated as an object, becoming a `Seq.Keyed`, * which is usually not what you want. You should turn your Iterator Object into * an iterable object by defining a Symbol.iterator (or @@iterator) method which * returns `this`. * * Note: `Collection` is a conversion function and not a class, and does not * use the `new` keyword during construction. */ function Collection>(collection: I): I; function Collection( collection: Iterable | ArrayLike ): Collection.Indexed; function Collection(obj: { [key: string]: V; }): Collection.Keyed; function Collection(): Collection; interface Collection extends ValueObject { // Value equality /** * True if this and the other Collection have value equality, as defined * by `Immutable.is()`. * * Note: This is equivalent to `Immutable.is(this, other)`, but provided to * allow for chained expressions. */ equals(other: unknown): boolean; /** * Computes and returns the hashed identity for this Collection. * * The `hashCode` of a Collection is used to determine potential equality, * and is used when adding this to a `Set` or as a key in a `Map`, enabling * lookup via a different instance. * * If two values have the same `hashCode`, they are [not guaranteed * to be equal][Hash Collision]. If two values have different `hashCode`s, * they must not be equal. * * [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) */ hashCode(): number; // Reading values /** * Returns the value associated with the provided key, or notSetValue if * the Collection does not contain this key. * * Note: it is possible a key may be associated with an `undefined` value, * so if `notSetValue` is not provided and this method returns `undefined`, * that does not guarantee the key was not found. */ get(key: K, notSetValue: NSV): V | NSV; get(key: K): V | undefined; /** * True if a key exists within this `Collection`, using `Immutable.is` * to determine equality */ has(key: K): boolean; /** * True if a value exists within this `Collection`, using `Immutable.is` * to determine equality * @alias contains */ includes(value: V): boolean; contains(value: V): boolean; /** * In case the `Collection` is not empty returns the first element of the * `Collection`. * In case the `Collection` is empty returns the optional default * value if provided, if no default value is provided returns undefined. */ first(notSetValue: NSV): V | NSV; first(): V | undefined; /** * In case the `Collection` is not empty returns the last element of the * `Collection`. * In case the `Collection` is empty returns the optional default * value if provided, if no default value is provided returns undefined. */ last(notSetValue: NSV): V | NSV; last(): V | undefined; // Reading deep values /** * Returns the value found by following a path of keys or indices through * nested Collections. * * Plain JavaScript Object or Arrays may be nested within an Immutable.js * Collection, and getIn() can access those values as well: */ getIn(searchKeyPath: Iterable, notSetValue?: unknown): unknown; /** * True if the result of following a path of keys or indices through nested * Collections results in a set value. */ hasIn(searchKeyPath: Iterable): boolean; // Persistent changes /** * This can be very useful as a way to "chain" a normal function into a * sequence of methods. RxJS calls this "let" and lodash calls it "thru". * * For example, to sum a Seq after mapping and filtering: */ update(updater: (value: this) => R): R; // Conversion to JavaScript types /** * Deeply converts this Collection to equivalent native JavaScript Array or Object. * * `Collection.Indexed`, and `Collection.Set` become `Array`, while * `Collection.Keyed` become `Object`, converting keys to Strings. */ toJS(): Array> | { [key in PropertyKey]: DeepCopy }; /** * Shallowly converts this Collection to equivalent native JavaScript Array or Object. * * `Collection.Indexed`, and `Collection.Set` become `Array`, while * `Collection.Keyed` become `Object`, converting keys to Strings. */ toJSON(): Array | { [key in PropertyKey]: V }; /** * Shallowly converts this collection to an Array. * * `Collection.Indexed`, and `Collection.Set` produce an Array of values. * `Collection.Keyed` produce an Array of [key, value] tuples. */ toArray(): Array | Array<[K, V]>; /** * Shallowly converts this Collection to an Object. * * Converts keys to Strings. */ toObject(): { [key: string]: V }; // Conversion to Collections /** * Converts this Collection to a Map, Throws if keys are not hashable. * * Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided * for convenience and to allow for chained expressions. */ toMap(): Map; /** * Converts this Collection to a Map, maintaining the order of iteration. * * Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but * provided for convenience and to allow for chained expressions. */ toOrderedMap(): OrderedMap; /** * Converts this Collection to a Set, discarding keys. Throws if values * are not hashable. * * Note: This is equivalent to `Set(this)`, but provided to allow for * chained expressions. */ toSet(): Set; /** * Converts this Collection to a Set, maintaining the order of iteration and * discarding keys. * * Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided * for convenience and to allow for chained expressions. */ toOrderedSet(): OrderedSet; /** * Converts this Collection to a List, discarding keys. * * This is similar to `List(collection)`, but provided to allow for chained * expressions. However, when called on `Map` or other keyed collections, * `collection.toList()` discards the keys and creates a list of only the * values, whereas `List(collection)` creates a list of entry tuples. */ toList(): List; /** * Converts this Collection to a Stack, discarding keys. Throws if values * are not hashable. * * Note: This is equivalent to `Stack(this)`, but provided to allow for * chained expressions. */ toStack(): Stack; // Conversion to Seq /** * Converts this Collection to a Seq of the same kind (indexed, * keyed, or set). */ toSeq(): Seq; /** * Returns a Seq.Keyed from this Collection where indices are treated as keys. * * This is useful if you want to operate on an * Collection.Indexed and preserve the [index, value] pairs. * * The returned Seq will have identical iteration order as * this Collection. */ toKeyedSeq(): Seq.Keyed; /** * Returns an Seq.Indexed of the values of this Collection, discarding keys. */ toIndexedSeq(): Seq.Indexed; /** * Returns a Seq.Set of the values of this Collection, discarding keys. */ toSetSeq(): Seq.Set; // Iterators /** * An iterator of this `Collection`'s keys. * * Note: this will return an ES6 iterator which does not support * Immutable.js sequence algorithms. Use `keySeq` instead, if this is * what you want. */ keys(): IterableIterator; /** * An iterator of this `Collection`'s values. * * Note: this will return an ES6 iterator which does not support * Immutable.js sequence algorithms. Use `valueSeq` instead, if this is * what you want. */ values(): IterableIterator; /** * An iterator of this `Collection`'s entries as `[ key, value ]` tuples. * * Note: this will return an ES6 iterator which does not support * Immutable.js sequence algorithms. Use `entrySeq` instead, if this is * what you want. */ entries(): IterableIterator<[K, V]>; [Symbol.iterator](): IterableIterator; // Collections (Seq) /** * Returns a new Seq.Indexed of the keys of this Collection, * discarding values. */ keySeq(): Seq.Indexed; /** * Returns an Seq.Indexed of the values of this Collection, discarding keys. */ valueSeq(): Seq.Indexed; /** * Returns a new Seq.Indexed of [key, value] tuples. */ entrySeq(): Seq.Indexed<[K, V]>; // Sequence algorithms /** * Returns a new Collection of the same type with values passed through a * `mapper` function. * * Note: `map()` always returns a new instance, even if it produced the same * value at every step. */ map( mapper: (value: V, key: K, iter: this) => M, context?: unknown ): Collection; /** * Note: used only for sets, which return Collection but are otherwise * identical to normal `map()`. * * @ignore */ map(...args: Array): unknown; /** * Returns a new Collection of the same type with only the entries for which * the `predicate` function returns true. * * Note: `filter()` always returns a new instance, even if it results in * not filtering out any values. */ filter( predicate: (value: V, key: K, iter: this) => value is F, context?: unknown ): Collection; filter( predicate: (value: V, key: K, iter: this) => unknown, context?: unknown ): this; /** * Returns a new Collection of the same type with only the entries for which * the `predicate` function returns false. * * Note: `filterNot()` always returns a new instance, even if it results in * not filtering out any values. */ filterNot( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): this; /** * Returns a new Collection with the values for which the `predicate` * function returns false and another for which is returns true. */ partition( predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C ): [Collection, Collection]; partition( predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C ): [this, this]; /** * Returns a new Collection of the same type in reverse order. */ reverse(): this; /** * Returns a new Collection of the same type which includes the same entries, * stably sorted by using a `comparator`. * * If a `comparator` is not provided, a default comparator uses `<` and `>`. * * `comparator(valueA, valueB)`: * * * Returns `0` if the elements should not be swapped. * * Returns `-1` (or any negative number) if `valueA` comes before `valueB` * * Returns `1` (or any positive number) if `valueA` comes after `valueB` * * Alternatively, can return a value of the `PairSorting` enum type * * Is pure, i.e. it must always return the same value for the same pair * of values. * * When sorting collections which have no defined order, their ordered * equivalents will be returned. e.g. `map.sort()` returns OrderedMap. * * Note: `sort()` Always returns a new instance, even if the original was * already sorted. * * Note: This is always an eager operation. */ sort(comparator?: Comparator): this; /** * Like `sort`, but also accepts a `comparatorValueMapper` which allows for * sorting by more sophisticated means: * * Note: `sortBy()` Always returns a new instance, even if the original was * already sorted. * * Note: This is always an eager operation. */ sortBy( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): this; /** * Returns a `Map` of `Collection`, grouped by the return * value of the `grouper` function. * * Note: This is always an eager operation. */ groupBy( grouper: (value: V, key: K, iter: this) => G, context?: unknown ): Map; // Side effects /** * The `sideEffect` is executed for every entry in the Collection. * * Unlike `Array#forEach`, if any call of `sideEffect` returns * `false`, the iteration will stop. Returns the number of entries iterated * (including the last iteration which returned false). */ forEach( sideEffect: (value: V, key: K, iter: this) => unknown, context?: unknown ): number; // Creating subsets /** * Returns a new Collection of the same type representing a portion of this * Collection from start up to but not including end. * * If begin is negative, it is offset from the end of the Collection. e.g. * `slice(-2)` returns a Collection of the last two entries. If it is not * provided the new Collection will begin at the beginning of this Collection. * * If end is negative, it is offset from the end of the Collection. e.g. * `slice(0, -1)` returns a Collection of everything but the last entry. If * it is not provided, the new Collection will continue through the end of * this Collection. * * If the requested slice is equivalent to the current Collection, then it * will return itself. */ slice(begin?: number, end?: number): this; /** * Returns a new Collection of the same type containing all entries except * the first. */ rest(): this; /** * Returns a new Collection of the same type containing all entries except * the last. */ butLast(): this; /** * Returns a new Collection of the same type which excludes the first `amount` * entries from this Collection. */ skip(amount: number): this; /** * Returns a new Collection of the same type which excludes the last `amount` * entries from this Collection. */ skipLast(amount: number): this; /** * Returns a new Collection of the same type which includes entries starting * from when `predicate` first returns false. */ skipWhile( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): this; /** * Returns a new Collection of the same type which includes entries starting * from when `predicate` first returns true. */ skipUntil( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): this; /** * Returns a new Collection of the same type which includes the first `amount` * entries from this Collection. */ take(amount: number): this; /** * Returns a new Collection of the same type which includes the last `amount` * entries from this Collection. */ takeLast(amount: number): this; /** * Returns a new Collection of the same type which includes entries from this * Collection as long as the `predicate` returns true. */ takeWhile( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): this; /** * Returns a new Collection of the same type which includes entries from this * Collection as long as the `predicate` returns false. */ takeUntil( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): this; // Combination /** * Returns a new Collection of the same type with other values and * collection-like concatenated to this one. * * For Seqs, all entries will be present in the resulting Seq, even if they * have the same key. */ concat( ...valuesOrCollections: Array ): Collection; /** * Flattens nested Collections. * * Will deeply flatten the Collection by default, returning a Collection of the * same type, but a `depth` can be provided in the form of a number or * boolean (where true means to shallowly flatten one level). A depth of 0 * (or shallow: false) will deeply flatten. * * Flattens only others Collection, not Arrays or Objects. * * Note: `flatten(true)` operates on Collection> and * returns Collection */ flatten(depth?: number): Collection; flatten(shallow?: boolean): Collection; /** * Flat-maps the Collection, returning a Collection of the same type. * * Similar to `collection.map(...).flatten(true)`. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable, context?: unknown ): Collection; /** * Flat-maps the Collection, returning a Collection of the same type. * * Similar to `collection.map(...).flatten(true)`. * Used for Dictionaries only. */ flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown ): Collection; // Reducing a value /** * Reduces the Collection to a value by calling the `reducer` for every entry * in the Collection and passing along the reduced value. * * If `initialReduction` is not provided, the first item in the * Collection will be used. * * @see `Array#reduce`. */ reduce(reducer: (reduction: V, value: V, key: K, iter: this) => V): V; reduce( reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown ): R; reduce( reducer: (reduction: V | R, value: V, key: K, iter: this) => R ): R; /** * Reduces the Collection in reverse (from the right side). * * Note: Similar to this.reverse().reduce(), and provided for parity * with `Array#reduceRight`. */ reduceRight(reducer: (reduction: V, value: V, key: K, iter: this) => V): V; reduceRight( reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown ): R; reduceRight( reducer: (reduction: V | R, value: V, key: K, iter: this) => R ): R; /** * True if `predicate` returns true for all entries in the Collection. */ every( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): boolean; /** * True if `predicate` returns true for any entry in the Collection. */ some( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): boolean; /** * Joins values together as a string, inserting a separator between each. * The default separator is `","`. */ join(separator?: string): string; /** * Returns true if this Collection includes no values. * * For some lazy `Seq`, `isEmpty` might need to iterate to determine * emptiness. At most one iteration will occur. */ isEmpty(): boolean; /** * Returns the size of this Collection. * * Regardless of if this Collection can describe its size lazily (some Seqs * cannot), this method will always return the correct size. E.g. it * evaluates a lazy `Seq` if necessary. * * If `predicate` is provided, then this returns the count of entries in the * Collection for which the `predicate` returns true. */ count(): number; count( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): number; /** * Returns a `Seq.Keyed` of counts, grouped by the return value of * the `grouper` function. * * Note: This is not a lazy operation. */ countBy( grouper: (value: V, key: K, iter: this) => G, context?: unknown ): Map; // Search for value /** * Returns the first value for which the `predicate` returns true. */ find( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown, notSetValue?: V ): V | undefined; /** * Returns the last value for which the `predicate` returns true. * * Note: `predicate` will be called for each entry in reverse. */ findLast( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown, notSetValue?: V ): V | undefined; /** * Returns the first [key, value] entry for which the `predicate` returns true. */ findEntry( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown, notSetValue?: V ): [K, V] | undefined; /** * Returns the last [key, value] entry for which the `predicate` * returns true. * * Note: `predicate` will be called for each entry in reverse. */ findLastEntry( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown, notSetValue?: V ): [K, V] | undefined; /** * Returns the key for which the `predicate` returns true. */ findKey( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): K | undefined; /** * Returns the last key for which the `predicate` returns true. * * Note: `predicate` will be called for each entry in reverse. */ findLastKey( predicate: (value: V, key: K, iter: this) => boolean, context?: unknown ): K | undefined; /** * Returns the key associated with the search value, or undefined. */ keyOf(searchValue: V): K | undefined; /** * Returns the last key associated with the search value, or undefined. */ lastKeyOf(searchValue: V): K | undefined; /** * Returns the maximum value in this collection. If any values are * comparatively equivalent, the first one found will be returned. * * The `comparator` is used in the same way as `Collection#sort`. If it is not * provided, the default comparator is `>`. * * When two values are considered equivalent, the first encountered will be * returned. Otherwise, `max` will operate independent of the order of input * as long as the comparator is commutative. The default comparator `>` is * commutative *only* when types do not differ. * * If `comparator` returns 0 and either value is NaN, undefined, or null, * that value will be returned. */ max(comparator?: Comparator): V | undefined; /** * Like `max`, but also accepts a `comparatorValueMapper` which allows for * comparing by more sophisticated means: */ maxBy( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): V | undefined; /** * Returns the minimum value in this collection. If any values are * comparatively equivalent, the first one found will be returned. * * The `comparator` is used in the same way as `Collection#sort`. If it is not * provided, the default comparator is `<`. * * When two values are considered equivalent, the first encountered will be * returned. Otherwise, `min` will operate independent of the order of input * as long as the comparator is commutative. The default comparator `<` is * commutative *only* when types do not differ. * * If `comparator` returns 0 and either value is NaN, undefined, or null, * that value will be returned. */ min(comparator?: Comparator): V | undefined; /** * Like `min`, but also accepts a `comparatorValueMapper` which allows for * comparing by more sophisticated means: */ minBy( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): V | undefined; // Comparison /** * True if `iter` includes every value in this Collection. */ isSubset(iter: Iterable): boolean; /** * True if this Collection includes every value in `iter`. */ isSuperset(iter: Iterable): boolean; } /** * The interface to fulfill to qualify as a Value Object. */ interface ValueObject { /** * True if this and the other Collection have value equality, as defined * by `Immutable.is()`. * * Note: This is equivalent to `Immutable.is(this, other)`, but provided to * allow for chained expressions. */ equals(other: unknown): boolean; /** * Computes and returns the hashed identity for this Collection. * * The `hashCode` of a Collection is used to determine potential equality, * and is used when adding this to a `Set` or as a key in a `Map`, enabling * lookup via a different instance. * * Note: hashCode() MUST return a Uint32 number. The easiest way to * guarantee this is to return `myHash | 0` from a custom implementation. * * If two values have the same `hashCode`, they are [not guaranteed * to be equal][Hash Collision]. If two values have different `hashCode`s, * they must not be equal. * * Note: `hashCode()` is not guaranteed to always be called before * `equals()`. Most but not all Immutable.js collections use hash codes to * organize their internal data structures, while all Immutable.js * collections use equality during lookups. * * [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) */ hashCode(): number; } /** * Interface representing all oredered collections. * This includes `List`, `Stack`, `Map`, `OrderedMap`, `Set`, and `OrderedSet`. * return of `isOrdered()` return true in that case. */ interface OrderedCollection { /** * Shallowly converts this collection to an Array. */ toArray(): Array; [Symbol.iterator](): IterableIterator; } /** * Deeply converts plain JS objects and arrays to Immutable Maps and Lists. * * `fromJS` will convert Arrays and [array-like objects][2] to a List, and * plain objects (without a custom prototype) to a Map. [Iterable objects][3] * may be converted to List, Map, or Set. * * If a `reviver` is optionally provided, it will be called with every * collection as a Seq (beginning with the most nested collections * and proceeding to the top-level collection itself), along with the key * referring to each collection and the parent JS object provided as `this`. * For the top level, object, the key will be `""`. This `reviver` is expected * to return a new Immutable Collection, allowing for custom conversions from * deep JS objects. Finally, a `path` is provided which is the sequence of * keys to this value from the starting value. * * `reviver` acts similarly to the [same parameter in `JSON.parse`][1]. * * If `reviver` is not provided, the default behavior will convert Objects * into Maps and Arrays into Lists like so: * * Accordingly, this example converts native JS data to OrderedMap and List: * * Keep in mind, when using JS objects to construct Immutable Maps, that * JavaScript Object properties are always strings, even if written in a * quote-less shorthand, while Immutable Maps accept keys of any type. * * Property access for JavaScript Objects first converts the key to a string, * but since Immutable Map keys can be of any type the argument to `get()` is * not altered. * * [1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter * "Using the reviver parameter" * [2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections#working_with_array-like_objects * "Working with array-like objects" * [3]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterable_protocol * "The iterable protocol" */ function fromJS( jsValue: JSValue, reviver?: undefined ): FromJS; function fromJS( jsValue: unknown, reviver?: ( key: string | number, sequence: Collection.Keyed | Collection.Indexed, path?: Array ) => unknown ): Collection; type FromJS = JSValue extends FromJSNoTransform ? JSValue : JSValue extends Array ? FromJSArray : JSValue extends object ? FromJSObject : unknown; type FromJSNoTransform = | Collection | number | string | null | undefined; type FromJSArray = JSValue extends Array ? List> : never; type FromJSObject = JSValue extends object ? Map> : never; /** * Value equality check with semantics similar to `Object.is`, but treats * Immutable `Collection`s as values, equal if the second `Collection` includes * equivalent values. * * It's used throughout Immutable when checking for equality, including `Map` * key equality and `Set` membership. * * `is()` compares primitive types like strings and numbers, Immutable.js * collections like `Map` and `List`, but also any custom object which * implements `ValueObject` by providing `equals()` and `hashCode()` methods. * * Note: Unlike `Object.is`, `Immutable.is` assumes `0` and `-0` are the same * value, matching the behavior of ES6 Map key equality. */ function is(first: unknown, second: unknown): boolean; /** * The `hash()` function is an important part of how Immutable determines if * two values are equivalent and is used to determine how to store those * values. Provided with any value, `hash()` will return a 31-bit integer. * * When designing Objects which may be equal, it's important that when a * `.equals()` method returns true, that both values `.hashCode()` method * return the same value. `hash()` may be used to produce those values. * * For non-Immutable Objects that do not provide a `.hashCode()` functions * (including plain Objects, plain Arrays, Date objects, etc), a unique hash * value will be created for each *instance*. That is, the create hash * represents referential equality, and not value equality for Objects. This * ensures that if that Object is mutated over time that its hash code will * remain consistent, allowing Objects to be used as keys and values in * Immutable.js collections. * * Note that `hash()` attempts to balance between speed and avoiding * collisions, however it makes no attempt to produce secure hashes. * * *New in Version 4.0* */ function hash(value: unknown): number; /** * True if `maybeImmutable` is an Immutable Collection or Record. * * Note: Still returns true even if the collections is within a `withMutations()`. */ function isImmutable( maybeImmutable: unknown ): maybeImmutable is Collection; /** * True if `maybeCollection` is a Collection, or any of its subclasses. */ function isCollection( maybeCollection: unknown ): maybeCollection is Collection; /** * True if `maybeKeyed` is a Collection.Keyed, or any of its subclasses. */ function isKeyed( maybeKeyed: unknown ): maybeKeyed is Collection.Keyed; /** * True if `maybeIndexed` is a Collection.Indexed, or any of its subclasses. */ function isIndexed( maybeIndexed: unknown ): maybeIndexed is Collection.Indexed; /** * True if `maybeAssociative` is either a Keyed or Indexed Collection. */ function isAssociative( maybeAssociative: unknown ): maybeAssociative is | Collection.Keyed | Collection.Indexed; /** * True if `maybeOrdered` is a Collection where iteration order is well * defined. True for Collection.Indexed as well as OrderedMap and OrderedSet. */ function isOrdered( maybeOrdered: Iterable ): maybeOrdered is OrderedCollection; function isOrdered( maybeOrdered: unknown ): maybeOrdered is OrderedCollection; /** * True if `maybeValue` is a JavaScript Object which has *both* `equals()` * and `hashCode()` methods. * * Any two instances of *value objects* can be compared for value equality with * `Immutable.is()` and can be used as keys in a `Map` or members in a `Set`. */ function isValueObject(maybeValue: unknown): maybeValue is ValueObject; /** * True if `maybeSeq` is a Seq. */ function isSeq( maybeSeq: unknown ): maybeSeq is | Seq.Indexed | Seq.Keyed | Seq.Set; /** * True if `maybeList` is a List. */ function isList(maybeList: unknown): maybeList is List; /** * True if `maybeMap` is a Map. * * Also true for OrderedMaps. */ function isMap(maybeMap: unknown): maybeMap is Map; /** * True if `maybeOrderedMap` is an OrderedMap. */ function isOrderedMap( maybeOrderedMap: unknown ): maybeOrderedMap is OrderedMap; /** * True if `maybeStack` is a Stack. */ function isStack(maybeStack: unknown): maybeStack is Stack; /** * True if `maybeSet` is a Set. * * Also true for OrderedSets. */ function isSet(maybeSet: unknown): maybeSet is Set; /** * True if `maybeOrderedSet` is an OrderedSet. */ function isOrderedSet( maybeOrderedSet: unknown ): maybeOrderedSet is OrderedSet; /** * True if `maybeRecord` is a Record. */ function isRecord(maybeRecord: unknown): maybeRecord is Record; /** * Returns the value within the provided collection associated with the * provided key, or notSetValue if the key is not defined in the collection. * * A functional alternative to `collection.get(key)` which will also work on * plain Objects and Arrays as an alternative for `collection[key]`. */ function get(collection: Collection, key: K): V | undefined; function get( collection: Collection, key: K, notSetValue: NSV ): V | NSV; function get( record: Record, key: K, notSetValue: unknown ): TProps[K]; function get(collection: Array, key: number): V | undefined; function get( collection: Array, key: number, notSetValue: NSV ): V | NSV; function get( object: C, key: K, notSetValue: unknown ): C[K]; function get( collection: { [key: PropertyKey]: V }, key: string ): V | undefined; function get( collection: { [key: PropertyKey]: V }, key: string, notSetValue: NSV ): V | NSV; /** * Returns true if the key is defined in the provided collection. * * A functional alternative to `collection.has(key)` which will also work with * plain Objects and Arrays as an alternative for * `collection.hasOwnProperty(key)`. */ function has(collection: object, key: unknown): boolean; /** * Returns a copy of the collection with the value at key removed. * * A functional alternative to `collection.remove(key)` which will also work * with plain Objects and Arrays as an alternative for * `delete collectionCopy[key]`. */ function remove>( collection: C, key: K ): C; function remove< TProps extends object, C extends Record, K extends keyof TProps, >(collection: C, key: K): C; function remove>(collection: C, key: number): C; function remove(collection: C, key: K): C; function remove( collection: C, key: K ): C; /** * Returns a copy of the collection with the value at key set to the provided * value. * * A functional alternative to `collection.set(key, value)` which will also * work with plain Objects and Arrays as an alternative for * `collectionCopy[key] = value`. */ function set>( collection: C, key: K, value: V ): C; function set< TProps extends object, C extends Record, K extends keyof TProps, >(record: C, key: K, value: TProps[K]): C; function set>(collection: C, key: number, value: V): C; function set(object: C, key: K, value: C[K]): C; function set( collection: C, key: string, value: V ): C; /** * Returns a copy of the collection with the value at key set to the result of * providing the existing value to the updating function. * * A functional alternative to `collection.update(key, fn)` which will also * work with plain Objects and Arrays as an alternative for * `collectionCopy[key] = fn(collection[key])`. */ function update>( collection: C, key: K, updater: (value: V | undefined) => V | undefined ): C; function update, NSV>( collection: C, key: K, notSetValue: NSV, updater: (value: V | NSV) => V ): C; function update< TProps extends object, C extends Record, K extends keyof TProps, >(record: C, key: K, updater: (value: TProps[K]) => TProps[K]): C; function update< TProps extends object, C extends Record, K extends keyof TProps, NSV, >( record: C, key: K, notSetValue: NSV, updater: (value: TProps[K] | NSV) => TProps[K] ): C; function update( collection: Array, key: number, updater: (value: V | undefined) => V | undefined ): Array; function update( collection: Array, key: number, notSetValue: NSV, updater: (value: V | NSV) => V ): Array; function update( object: C, key: K, updater: (value: C[K]) => C[K] ): C; function update( object: C, key: K, notSetValue: NSV, updater: (value: C[K] | NSV) => C[K] ): C; function update( collection: C, key: K, updater: (value: V) => V ): { [key: string]: V }; function update( collection: C, key: K, notSetValue: NSV, updater: (value: V | NSV) => V ): { [key: string]: V }; // TODO `` can be used after dropping support for TypeScript 4.x // reference: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-0.html#const-type-parameters // after this change, `as const` assertions can be remove from the type tests /** * Returns the value at the provided key path starting at the provided * collection, or notSetValue if the key path is not defined. * * A functional alternative to `collection.getIn(keypath)` which will also * work with plain Objects and Arrays. */ function getIn>( object: C, keyPath: [...P] ): RetrievePath; function getIn>(object: C, keyPath: P): unknown; function getIn, NSV>( collection: C, keyPath: [...P], notSetValue: NSV ): RetrievePath extends never ? NSV : RetrievePath; function getIn, NSV>( object: C, keyPath: P, notSetValue: NSV ): unknown; /** * Returns true if the key path is defined in the provided collection. * * A functional alternative to `collection.hasIn(keypath)` which will also * work with plain Objects and Arrays. */ function hasIn( collection: string | boolean | number, keyPath: KeyPath ): never; function hasIn(collection: unknown, keyPath: KeyPath): boolean; /** * Returns a copy of the collection with the value at the key path removed. * * A functional alternative to `collection.removeIn(keypath)` which will also * work with plain Objects and Arrays. */ function removeIn(collection: C, keyPath: Iterable): C; /** * Returns a copy of the collection with the value at the key path set to the * provided value. * * A functional alternative to `collection.setIn(keypath)` which will also * work with plain Objects and Arrays. */ function setIn( collection: C, keyPath: Iterable, value: unknown ): C; /** * Returns a copy of the collection with the value at key path set to the * result of providing the existing value to the updating function. * * A functional alternative to `collection.updateIn(keypath)` which will also * work with plain Objects and Arrays. */ function updateIn>( collection: C, keyPath: KeyPath, updater: ( value: RetrievePath> | undefined ) => unknown | undefined ): C; function updateIn, NSV>( collection: C, keyPath: KeyPath, notSetValue: NSV, updater: (value: RetrievePath> | NSV) => unknown ): C; function updateIn< TProps extends object, C extends Record, K extends keyof TProps, >( record: C, keyPath: KeyPath, updater: (value: RetrievePath>) => unknown ): C; function updateIn< TProps extends object, C extends Record, K extends keyof TProps, NSV, >( record: C, keyPath: KeyPath, notSetValue: NSV, updater: (value: RetrievePath> | NSV) => unknown ): C; function updateIn>( collection: Array, keyPath: KeyPath, updater: ( value: RetrievePath> | undefined ) => unknown | undefined ): Array; function updateIn, NSV>( collection: Array, keyPath: KeyPath, notSetValue: NSV, updater: (value: RetrievePath> | NSV) => unknown ): Array; function updateIn( object: C, keyPath: KeyPath, updater: (value: RetrievePath>) => unknown ): C; function updateIn( object: C, keyPath: KeyPath, notSetValue: NSV, updater: (value: RetrievePath> | NSV) => unknown ): C; function updateIn< K extends PropertyKey, V, C extends { [key: PropertyKey]: V }, >( collection: C, keyPath: KeyPath, updater: (value: RetrievePath>) => unknown ): { [key: PropertyKey]: V }; function updateIn< K extends PropertyKey, V, C extends { [key: PropertyKey]: V }, NSV, >( collection: C, keyPath: KeyPath, notSetValue: NSV, updater: (value: RetrievePath> | NSV) => unknown ): { [key: PropertyKey]: V }; /** * Returns a copy of the collection with the remaining collections merged in. * * A functional alternative to `collection.merge()` which will also work with * plain Objects and Arrays. */ function merge( collection: C, ...collections: Array< | Iterable | Iterable<[unknown, unknown]> | { [key: string]: unknown } > ): C; /** * Returns a copy of the collection with the remaining collections merged in, * calling the `merger` function whenever an existing value is encountered. * * A functional alternative to `collection.mergeWith()` which will also work * with plain Objects and Arrays. */ function mergeWith( merger: (oldVal: unknown, newVal: unknown, key: unknown) => unknown, collection: C, ...collections: Array< | Iterable | Iterable<[unknown, unknown]> | { [key: string]: unknown } > ): C; /** * Like `merge()`, but when two compatible collections are encountered with * the same key, it merges them as well, recursing deeply through the nested * data. Two collections are considered to be compatible (and thus will be * merged together) if they both fall into one of three categories: keyed * (e.g., `Map`s, `Record`s, and objects), indexed (e.g., `List`s and * arrays), or set-like (e.g., `Set`s). If they fall into separate * categories, `mergeDeep` will replace the existing collection with the * collection being merged in. This behavior can be customized by using * `mergeDeepWith()`. * * Note: Indexed and set-like collections are merged using * `concat()`/`union()` and therefore do not recurse. * * A functional alternative to `collection.mergeDeep()` which will also work * with plain Objects and Arrays. */ function mergeDeep( collection: C, ...collections: Array< | Iterable | Iterable<[unknown, unknown]> | { [key: string]: unknown } > ): C; /** * Like `mergeDeep()`, but when two non-collections or incompatible * collections are encountered at the same key, it uses the `merger` function * to determine the resulting value. Collections are considered incompatible * if they fall into separate categories between keyed, indexed, and set-like. * * A functional alternative to `collection.mergeDeepWith()` which will also * work with plain Objects and Arrays. */ function mergeDeepWith( merger: (oldVal: unknown, newVal: unknown, key: unknown) => unknown, collection: C, ...collections: Array< | Iterable | Iterable<[unknown, unknown]> | { [key: string]: unknown } > ): C; } /** * Defines the main export of the immutable module to be the Immutable namespace * This supports many common module import patterns: * * const Immutable = require("immutable"); * const { List } = require("immutable"); * import Immutable from "immutable"; * import * as Immutable from "immutable"; * import { List } from "immutable"; * */ export = Immutable; /** * A global "Immutable" namespace used by UMD modules which allows the use of * the full Immutable API. * * If using Immutable as an imported module, prefer using: * * import Immutable from 'immutable' * */ export as namespace Immutable; immutable-js-immutable-js-6a01d72/type-definitions/immutable.js.flow000066400000000000000000001726171522056416100256150ustar00rootroot00000000000000/** * This file provides type definitions for use with the Flow type checker. * * An important caveat when using these definitions is that the types for * `Collection.Keyed`, `Collection.Indexed`, `Seq.Keyed`, and so on are stubs. * When referring to those types, you can get the proper definitions by * importing the types `KeyedCollection`, `IndexedCollection`, `KeyedSeq`, etc. * For example, * * import { Seq } from 'immutable' * import type { IndexedCollection, IndexedSeq } from 'immutable' * * const someSeq: IndexedSeq = Seq.Indexed.of(1, 2, 3) * * function takesASeq>(iter: TS): TS { * return iter.butLast() * } * * takesASeq(someSeq) * * @flow strict */ // Helper type that represents plain objects allowed as arguments to // some constructors and functions. type PlainObjInput = { +[key: K]: V, __proto__: null }; type K = $Keys; // Helper types to extract the "keys" and "values" use by the *In() methods. type $KeyOf = $Call< ((?_Collection) => K) & ((?$ReadOnlyArray) => number) & ((?RecordInstance | T) => $Keys) & ((T) => $Keys), C, >; type $ValOf> = $Call< ((?_Collection) => V) & ((?$ReadOnlyArray) => T) & (>(?RecordInstance | T, K) => $ElementType) & ((T) => $Values), C, K, >; type $IterableOf = $Call< ( | IndexedCollection | SetCollection>( V ) => Iterable<$ValOf>) & (< V: | KeyedCollection | RecordInstance | PlainObjInput, >( V ) => Iterable<[$KeyOf, $ValOf]>), C, >; const PairSorting: $ReadOnly<{ LeftThenRight: number, RightThenLeft: number }> = { LeftThenRight: -1, RightThenLeft: +1, }; type Comparator = (left: T, right: T) => number; declare class _Collection implements ValueObject { equals(other: mixed): boolean; hashCode(): number; get(key: K, ..._: []): V | void; get(key: K, notSetValue: NSV): V | NSV; has(key: K): boolean; includes(value: V): boolean; contains(value: V): boolean; first(): V | void; first(notSetValue: NSV): V | NSV; last(): V | void; last(notSetValue: NSV): V | NSV; hasIn(keyPath: Iterable): boolean; getIn(keyPath: [], notSetValue?: mixed): this; getIn(keyPath: [K], notSetValue: NSV): V | NSV; getIn>( keyPath: [K, K2], notSetValue: NSV ): $ValOf | NSV; getIn, K3: $KeyOf<$ValOf>>( keyPath: [K, K2, K3], notSetValue: NSV ): $ValOf<$ValOf, K3> | NSV; getIn< NSV, K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, >( keyPath: [K, K2, K3, K4], notSetValue: NSV ): $ValOf<$ValOf<$ValOf, K3>, K4> | NSV; getIn< NSV, K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf, K3>, K4>>, >( keyPath: [K, K2, K3, K4, K5], notSetValue: NSV ): $ValOf<$ValOf<$ValOf<$ValOf, K3>, K4>, K5> | NSV; update(updater: (value: this) => U): U; toJS(): Array | { [key: string]: mixed }; toJSON(): Array | { [key: string]: V }; toArray(): Array | Array<[K, V]>; toObject(): { [key: string]: V }; toMap(): Map; toOrderedMap(): OrderedMap; toSet(): Set; toOrderedSet(): OrderedSet; toList(): List; toStack(): Stack; toSeq(): Seq; toKeyedSeq(): KeyedSeq; toIndexedSeq(): IndexedSeq; toSetSeq(): SetSeq; keys(): Iterator; values(): Iterator; entries(): Iterator<[K, V]>; keySeq(): IndexedSeq; valueSeq(): IndexedSeq; entrySeq(): IndexedSeq<[K, V]>; reverse(): this; sort(comparator?: Comparator): this; sortBy( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): this; groupBy( grouper: (value: V, key: K, iter: this) => G, context?: mixed ): KeyedSeq; forEach( sideEffect: (value: V, key: K, iter: this) => any, context?: mixed ): number; slice(begin?: number, end?: number): this; rest(): this; butLast(): this; skip(amount: number): this; skipLast(amount: number): this; skipWhile( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): this; skipUntil( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): this; take(amount: number): this; takeLast(amount: number): this; takeWhile( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): this; takeUntil( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): this; filterNot( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): this; reduce( reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: mixed ): R; reduce(reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R; reduceRight( reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: mixed ): R; reduceRight( reducer: (reduction: V | R, value: V, key: K, iter: this) => R ): R; every( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): boolean; some( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): boolean; join(separator?: string): string; isEmpty(): boolean; count( predicate?: (value: V, key: K, iter: this) => mixed, context?: mixed ): number; countBy( grouper: (value: V, key: K, iter: this) => G, context?: mixed ): Map; find( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed, notSetValue?: V ): V | void; findLast( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed, notSetValue?: V ): V | void; findEntry(predicate: (value: V, key: K, iter: this) => mixed): [K, V] | void; findLastEntry( predicate: (value: V, key: K, iter: this) => mixed ): [K, V] | void; findKey( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): K | void; findLastKey( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): K | void; keyOf(searchValue: V): K | void; lastKeyOf(searchValue: V): K | void; max(comparator?: Comparator): V; maxBy( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): V; min(comparator?: Comparator): V; minBy( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): V; isSubset(iter: Iterable): boolean; isSuperset(iter: Iterable): boolean; } declare function isImmutable( maybeImmutable: mixed ): boolean %checks(maybeImmutable instanceof Collection); declare function isCollection( maybeCollection: mixed ): boolean %checks(maybeCollection instanceof Collection); declare function isKeyed( maybeKeyed: mixed ): boolean %checks(maybeKeyed instanceof KeyedCollection); declare function isIndexed( maybeIndexed: mixed ): boolean %checks(maybeIndexed instanceof IndexedCollection); declare function isAssociative( maybeAssociative: mixed ): boolean %checks(maybeAssociative instanceof KeyedCollection || maybeAssociative instanceof IndexedCollection); declare function isOrdered( maybeOrdered: mixed ): boolean %checks(maybeOrdered instanceof IndexedCollection || maybeOrdered instanceof OrderedMap || maybeOrdered instanceof OrderedSet); declare function isValueObject(maybeValue: mixed): boolean; declare function isSeq(maybeSeq: any): boolean %checks(maybeSeq instanceof Seq); declare function isList(maybeList: any): boolean %checks(maybeList instanceof List); declare function isMap(maybeMap: any): boolean %checks(maybeMap instanceof Map); declare function isOrderedMap( maybeOrderedMap: any ): boolean %checks(maybeOrderedMap instanceof OrderedMap); declare function isStack(maybeStack: any): boolean %checks(maybeStack instanceof Stack); declare function isSet(maybeSet: any): boolean %checks(maybeSet instanceof Set); declare function isOrderedSet( maybeOrderedSet: any ): boolean %checks(maybeOrderedSet instanceof OrderedSet); declare function isRecord( maybeRecord: any ): boolean %checks(maybeRecord instanceof Record); declare interface ValueObject { equals(other: mixed): boolean; hashCode(): number; } declare class Collection extends _Collection { static Keyed: typeof KeyedCollection; static Indexed: typeof IndexedCollection; static Set: typeof SetCollection; static isCollection: typeof isCollection; static isKeyed: typeof isKeyed; static isIndexed: typeof isIndexed; static isAssociative: typeof isAssociative; static isOrdered: typeof isOrdered; } declare class KeyedCollection extends Collection { static ( values?: Iterable<[K, V]> | PlainObjInput ): KeyedCollection; toJS(): { [key: string]: mixed }; toJSON(): { [key: string]: V }; toArray(): Array<[K, V]>; @@iterator(): Iterator<[K, V]>; toSeq(): KeyedSeq; flip(): KeyedCollection; concat( ...iters: Array | PlainObjInput> ): KeyedCollection; filter(predicate: typeof Boolean): KeyedCollection>; filter( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): KeyedCollection; partition( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: V, key: K, iter: this) => M, context?: mixed ): KeyedCollection; mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: mixed ): KeyedCollection; mapEntries( mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], context?: mixed ): KeyedCollection; flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: mixed ): KeyedCollection; flatten(depth?: number): KeyedCollection; flatten(shallow?: boolean): KeyedCollection; } Collection.Keyed = KeyedCollection; declare class IndexedCollection<+T> extends Collection { static (iter?: Iterable): IndexedCollection; toJS(): Array; toJSON(): Array; toArray(): Array; @@iterator(): Iterator; toSeq(): IndexedSeq; fromEntrySeq(): KeyedSeq; interpose(separator: T): this; interleave(...collections: Iterable[]): this; splice(index: number, removeNum: number, ...values: T[]): this; zip(a: Iterable, ..._: []): IndexedCollection<[T, A]>; zip( a: Iterable, b: Iterable, ..._: [] ): IndexedCollection<[T, A, B]>; zip( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): IndexedCollection<[T, A, B, C]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): IndexedCollection<[T, A, B, C, D]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): IndexedCollection<[T, A, B, C, D, E]>; zipAll(a: Iterable, ..._: []): IndexedCollection<[T | void, A | void]>; zipAll( a: Iterable, b: Iterable, ..._: [] ): IndexedCollection<[T | void, A | void, B | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): IndexedCollection<[T | void, A | void, B | void, C | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): IndexedCollection<[T | void, A | void, B | void, C | void, D | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): IndexedCollection< [T | void, A | void, B | void, C | void, D | void, E | void], >; zipWith( zipper: (value: T, a: A) => R, a: Iterable, ..._: [] ): IndexedCollection; zipWith( zipper: (value: T, a: A, b: B) => R, a: Iterable, b: Iterable, ..._: [] ): IndexedCollection; zipWith( zipper: (value: T, a: A, b: B, c: C) => R, a: Iterable, b: Iterable, c: Iterable, ..._: [] ): IndexedCollection; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): IndexedCollection; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D, e: E) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): IndexedCollection; indexOf(searchValue: T): number; lastIndexOf(searchValue: T): number; findIndex( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): number; findLastIndex( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): number; concat(...iters: Array | C>): IndexedCollection; filter(predicate: typeof Boolean): IndexedCollection<$NonMaybeType>; filter( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): IndexedCollection; partition( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: T, index: number, iter: this) => M, context?: mixed ): IndexedCollection; flatMap( mapper: (value: T, index: number, iter: this) => Iterable, context?: mixed ): IndexedCollection; flatten(depth?: number): IndexedCollection; flatten(shallow?: boolean): IndexedCollection; } declare class SetCollection<+T> extends Collection { static (iter?: Iterable): SetCollection; toJS(): Array; toJSON(): Array; toArray(): Array; @@iterator(): Iterator; toSeq(): SetSeq; concat(...collections: Iterable[]): SetCollection; // `filter`, `map` and `flatMap` cannot be defined further up the hierarchy, // because the implementation for `KeyedCollection` allows the value type to // change without constraining the key type. That does not work for // `SetCollection` - the value and key types *must* match. filter(predicate: typeof Boolean): SetCollection<$NonMaybeType>; filter( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): SetCollection; partition( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: T, value: T, iter: this) => M, context?: mixed ): SetCollection; flatMap( mapper: (value: T, value: T, iter: this) => Iterable, context?: mixed ): SetCollection; flatten(depth?: number): SetCollection; flatten(shallow?: boolean): SetCollection; } declare function isSeq(maybeSeq: mixed): boolean %checks(maybeSeq instanceof Seq); declare class Seq extends _Collection { static Keyed: typeof KeyedSeq; static Indexed: typeof IndexedSeq; static Set: typeof SetSeq; static (values: KeyedSeq): KeyedSeq; static (values: SetSeq): SetSeq; static (values: Iterable): IndexedSeq; static (values?: PlainObjInput): KeyedSeq; static isSeq: typeof isSeq; size: number | void; cacheResult(): this; toSeq(): this; } declare class KeyedSeq extends Seq mixins KeyedCollection { static ( values?: Iterable<[K, V]> | PlainObjInput ): KeyedSeq; // Override specialized return types flip(): KeyedSeq; concat( ...iters: Array | PlainObjInput> ): KeyedSeq; filter(predicate: typeof Boolean): KeyedSeq>; filter( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): KeyedSeq; partition( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: V, key: K, iter: this) => M, context?: mixed ): KeyedSeq; mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: mixed ): KeyedSeq; mapEntries( mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], context?: mixed ): KeyedSeq; flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: mixed ): KeyedSeq; flatten(depth?: number): KeyedSeq; flatten(shallow?: boolean): KeyedSeq; } declare class IndexedSeq<+T> extends Seq mixins IndexedCollection { static (values?: Iterable): IndexedSeq; static of(...values: T[]): IndexedSeq; // Override specialized return types concat(...iters: Array | C>): IndexedSeq; filter(predicate: typeof Boolean): IndexedSeq<$NonMaybeType>; filter( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): IndexedSeq; partition( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: T, index: number, iter: this) => M, context?: mixed ): IndexedSeq; flatMap( mapper: (value: T, index: number, iter: this) => Iterable, context?: mixed ): IndexedSeq; flatten(depth?: number): IndexedSeq; flatten(shallow?: boolean): IndexedSeq; zip(a: Iterable, ..._: []): IndexedSeq<[T, A]>; zip(a: Iterable, b: Iterable, ..._: []): IndexedSeq<[T, A, B]>; zip( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): IndexedSeq<[T, A, B, C]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): IndexedSeq<[T, A, B, C, D]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): IndexedSeq<[T, A, B, C, D, E]>; zipAll(a: Iterable, ..._: []): IndexedSeq<[T | void, A | void]>; zipAll( a: Iterable, b: Iterable, ..._: [] ): IndexedSeq<[T | void, A | void, B | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): IndexedSeq<[T | void, A | void, B | void, C | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): IndexedSeq<[T | void, A | void, B | void, C | void, D | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): IndexedSeq<[T | void, A | void, B | void, C | void, D | void, E | void]>; zipWith( zipper: (value: T, a: A) => R, a: Iterable, ..._: [] ): IndexedSeq; zipWith( zipper: (value: T, a: A, b: B) => R, a: Iterable, b: Iterable, ..._: [] ): IndexedSeq; zipWith( zipper: (value: T, a: A, b: B, c: C) => R, a: Iterable, b: Iterable, c: Iterable, ..._: [] ): IndexedSeq; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): IndexedSeq; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D, e: E) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): IndexedSeq; } declare class SetSeq<+T> extends Seq mixins SetCollection { static (values?: Iterable): SetSeq; static of(...values: T[]): SetSeq; // Override specialized return types concat(...collections: Iterable[]): SetSeq; filter(predicate: typeof Boolean): SetSeq<$NonMaybeType>; filter( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): SetSeq; partition( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: T, value: T, iter: this) => M, context?: mixed ): SetSeq; flatMap( mapper: (value: T, value: T, iter: this) => Iterable, context?: mixed ): SetSeq; flatten(depth?: number): SetSeq; flatten(shallow?: boolean): SetSeq; } declare class UpdatableInCollection { setIn(keyPath: [], value: S): S; setIn(keyPath: [K], value: V): this; setIn, S: $ValOf>(keyPath: [K, K2], value: S): this; setIn, K3: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K3>>( keyPath: [K, K2, K3], value: S ): this; setIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, S: $ValOf<$ValOf<$ValOf, K3>, K4>, >( keyPath: [K, K2, K3, K4], value: S ): this; setIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K3>, K4>, K5>, >( keyPath: [K, K2, K3, K4, K5], value: S ): this; deleteIn(keyPath: []): void; deleteIn(keyPath: [K]): this; deleteIn>(keyPath: [K, K2]): this; deleteIn, K3: $KeyOf<$ValOf>>( keyPath: [K, K2, K3] ): this; deleteIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, >( keyPath: [K, K2, K3, K4] ): this; deleteIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf, K3>, K4>>, >( keyPath: [K, K2, K3, K4, K5] ): this; removeIn(keyPath: []): void; removeIn(keyPath: [K]): this; removeIn>(keyPath: [K, K2]): this; removeIn, K3: $KeyOf<$ValOf>>( keyPath: [K, K2, K3] ): this; removeIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, >( keyPath: [K, K2, K3, K4] ): this; removeIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf, K3>, K4>>, >( keyPath: [K, K2, K3, K4, K5] ): this; updateIn(keyPath: [], notSetValue: mixed, updater: (value: this) => U): U; updateIn(keyPath: [], updater: (value: this) => U): U; updateIn(keyPath: [K], notSetValue: NSV, updater: (value: V) => V): this; updateIn(keyPath: [K], updater: (value: V) => V): this; updateIn, S: $ValOf>( keyPath: [K, K2], notSetValue: NSV, updater: (value: $ValOf | NSV) => S ): this; updateIn, S: $ValOf>( keyPath: [K, K2], updater: (value: $ValOf) => S ): this; updateIn< NSV, K2: $KeyOf, K3: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K3>, >( keyPath: [K, K2, K3], notSetValue: NSV, updater: (value: $ValOf<$ValOf, K3> | NSV) => S ): this; updateIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K3>, >( keyPath: [K, K2, K3], updater: (value: $ValOf<$ValOf, K3>) => S ): this; updateIn< NSV, K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, S: $ValOf<$ValOf<$ValOf, K3>, K4>, >( keyPath: [K, K2, K3, K4], notSetValue: NSV, updater: (value: $ValOf<$ValOf<$ValOf, K3>, K4> | NSV) => S ): this; updateIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, S: $ValOf<$ValOf<$ValOf, K3>, K4>, >( keyPath: [K, K2, K3, K4], updater: (value: $ValOf<$ValOf<$ValOf, K3>, K4>) => S ): this; updateIn< NSV, K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K3>, K4>, K5>, >( keyPath: [K, K2, K3, K4, K5], notSetValue: NSV, updater: ( value: $ValOf<$ValOf<$ValOf<$ValOf, K3>, K4>, K5> | NSV ) => S ): this; updateIn< K2: $KeyOf, K3: $KeyOf<$ValOf>, K4: $KeyOf<$ValOf<$ValOf, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K3>, K4>, K5>, >( keyPath: [K, K2, K3, K4, K5], updater: (value: $ValOf<$ValOf<$ValOf<$ValOf, K3>, K4>, K5>) => S ): this; } declare function isList(maybeList: mixed): boolean %checks(maybeList instanceof List); declare class List<+T> extends IndexedCollection mixins UpdatableInCollection { static (collection?: Iterable): List; static of(...values: T[]): List; static isList: typeof isList; size: number; set(index: number, value: U): List; delete(index: number): this; remove(index: number): this; insert(index: number, value: U): List; clear(): this; push(...values: U[]): List; pop(): this; unshift(...values: U[]): List; shift(): this; update(updater: (value: this) => U): U; update(index: number, updater: (value: T) => U): List; update( index: number, notSetValue: U, updater: (value: T) => U ): List; merge(...collections: Iterable[]): List; setSize(size: number): this; mergeIn(keyPath: Iterable, ...collections: Iterable[]): this; mergeDeepIn( keyPath: Iterable, ...collections: Iterable[] ): this; withMutations(mutator: (mutable: this) => mixed): this; asMutable(): this; wasAltered(): boolean; asImmutable(): this; // Override specialized return types concat(...iters: Array | C>): List; filter(predicate: typeof Boolean): List<$NonMaybeType>; filter( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): List; partition( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: T, index: number, iter: this) => M, context?: mixed ): List; flatMap( mapper: (value: T, index: number, iter: this) => Iterable, context?: mixed ): List; flatten(depth?: number): List; flatten(shallow?: boolean): List; zip(a: Iterable, ..._: []): List<[T, A]>; zip(a: Iterable, b: Iterable, ..._: []): List<[T, A, B]>; zip( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): List<[T, A, B, C]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): List<[T, A, B, C, D]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): List<[T, A, B, C, D, E]>; zipAll(a: Iterable, ..._: []): List<[T | void, A | void]>; zipAll( a: Iterable, b: Iterable, ..._: [] ): List<[T | void, A | void, B | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): List<[T | void, A | void, B | void, C | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): List<[T | void, A | void, B | void, C | void, D | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): List<[T | void, A | void, B | void, C | void, D | void, E | void]>; zipWith( zipper: (value: T, a: A) => R, a: Iterable, ..._: [] ): List; zipWith( zipper: (value: T, a: A, b: B) => R, a: Iterable, b: Iterable, ..._: [] ): List; zipWith( zipper: (value: T, a: A, b: B, c: C) => R, a: Iterable, b: Iterable, c: Iterable, ..._: [] ): List; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): List; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D, e: E) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): List; } declare function isMap(maybeMap: mixed): boolean %checks(maybeMap instanceof Map); declare class Map extends KeyedCollection mixins UpdatableInCollection { static (values?: Iterable<[K, V]> | PlainObjInput): Map; static isMap: typeof isMap; size: number; set(key: K_, value: V_): Map; delete(key: K): this; remove(key: K): this; clear(): this; deleteAll(keys: Iterable): Map; removeAll(keys: Iterable): Map; update(updater: (value: this) => U): U; update(key: K, updater: (value: V) => V_): Map; update( key: K, notSetValue: V_, updater: (value: V) => V_ ): Map; merge( ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): Map; concat( ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): Map; mergeWith( merger: (oldVal: V, newVal: W, key: K) => X, ...collections: (Iterable<[K_, W]> | PlainObjInput)[] ): Map; mergeDeep( ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): Map; mergeDeepWith( merger: (oldVal: any, newVal: any, key: any) => mixed, ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): Map; mergeIn( keyPath: Iterable, ...collections: (Iterable | PlainObjInput)[] ): this; mergeDeepIn( keyPath: Iterable, ...collections: (Iterable | PlainObjInput)[] ): this; withMutations(mutator: (mutable: this) => mixed): this; asMutable(): this; wasAltered(): boolean; asImmutable(): this; // Override specialized return types flip(): Map; filter(predicate: typeof Boolean): Map>; filter( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): Map; partition( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: V, key: K, iter: this) => M, context?: mixed ): Map; mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: mixed ): Map; mapEntries( mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], context?: mixed ): Map; flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: mixed ): Map; flatten(depth?: number): Map; flatten(shallow?: boolean): Map; } declare function isOrderedMap( maybeOrderedMap: mixed ): boolean %checks(maybeOrderedMap instanceof OrderedMap); declare class OrderedMap extends Map mixins UpdatableInCollection { static ( values?: Iterable<[K, V]> | PlainObjInput ): OrderedMap; static isOrderedMap: typeof isOrderedMap; size: number; set(key: K_, value: V_): OrderedMap; delete(key: K): this; remove(key: K): this; clear(): this; update(updater: (value: this) => U): U; update(key: K, updater: (value: V) => V_): OrderedMap; update( key: K, notSetValue: V_, updater: (value: V) => V_ ): OrderedMap; merge( ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): OrderedMap; concat( ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): OrderedMap; mergeWith( merger: (oldVal: V, newVal: W, key: K) => X, ...collections: (Iterable<[K_, W]> | PlainObjInput)[] ): OrderedMap; mergeDeep( ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): OrderedMap; mergeDeepWith( merger: (oldVal: any, newVal: any, key: any) => mixed, ...collections: (Iterable<[K_, V_]> | PlainObjInput)[] ): OrderedMap; mergeIn( keyPath: Iterable, ...collections: (Iterable | PlainObjInput)[] ): this; mergeDeepIn( keyPath: Iterable, ...collections: (Iterable | PlainObjInput)[] ): this; withMutations(mutator: (mutable: this) => mixed): this; asMutable(): this; wasAltered(): boolean; asImmutable(): this; // Override specialized return types flip(): OrderedMap; filter(predicate: typeof Boolean): OrderedMap>; filter( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): OrderedMap; partition( predicate: (value: V, key: K, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: V, key: K, iter: this) => M, context?: mixed ): OrderedMap; mapKeys( mapper: (key: K, value: V, iter: this) => M, context?: mixed ): OrderedMap; mapEntries( mapper: (entry: [K, V], index: number, iter: this) => [KM, VM], context?: mixed ): OrderedMap; flatMap( mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: mixed ): OrderedMap; flatten(depth?: number): OrderedMap; flatten(shallow?: boolean): OrderedMap; } declare function isSet(maybeSet: mixed): boolean %checks(maybeSet instanceof Set); declare class Set<+T> extends SetCollection { static (values?: Iterable): Set; static of(...values: T[]): Set; static fromKeys( values: Iterable<[T, mixed]> | PlainObjInput ): Set; static intersect(sets: Iterable>): Set; static union(sets: Iterable>): Set; static isSet: typeof isSet; size: number; add(value: U): Set; delete(value: T): this; remove(value: T): this; clear(): this; union(...collections: Iterable[]): Set; merge(...collections: Iterable[]): Set; concat(...collections: Iterable[]): Set; intersect(...collections: Iterable[]): Set; subtract(...collections: Iterable[]): this; withMutations(mutator: (mutable: this) => mixed): this; asMutable(): this; wasAltered(): boolean; asImmutable(): this; // Override specialized return types filter(predicate: typeof Boolean): Set<$NonMaybeType>; filter( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): Set; partition( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: T, value: T, iter: this) => M, context?: mixed ): Set; flatMap( mapper: (value: T, value: T, iter: this) => Iterable, context?: mixed ): Set; flatten(depth?: number): Set; flatten(shallow?: boolean): Set; } // Overrides except for `isOrderedSet` are for specialized return types declare function isOrderedSet( maybeOrderedSet: mixed ): boolean %checks(maybeOrderedSet instanceof OrderedSet); declare class OrderedSet<+T> extends Set { static (values?: Iterable): OrderedSet; static of(...values: T[]): OrderedSet; static fromKeys( values: Iterable<[T, mixed]> | PlainObjInput ): OrderedSet; static isOrderedSet: typeof isOrderedSet; size: number; add(value: U): OrderedSet; union(...collections: Iterable[]): OrderedSet; merge(...collections: Iterable[]): OrderedSet; concat(...collections: Iterable[]): OrderedSet; intersect(...collections: Iterable[]): OrderedSet; filter(predicate: typeof Boolean): OrderedSet<$NonMaybeType>; filter( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): OrderedSet; partition( predicate: (value: T, value: T, iter: this) => mixed, context?: mixed ): [this, this]; map( mapper: (value: T, value: T, iter: this) => M, context?: mixed ): OrderedSet; flatMap( mapper: (value: T, value: T, iter: this) => Iterable, context?: mixed ): OrderedSet; flatten(depth?: number): OrderedSet; flatten(shallow?: boolean): OrderedSet; zip(a: Iterable, ..._: []): OrderedSet<[T, A]>; zip(a: Iterable, b: Iterable, ..._: []): OrderedSet<[T, A, B]>; zip( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): OrderedSet<[T, A, B, C]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): OrderedSet<[T, A, B, C, D]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): OrderedSet<[T, A, B, C, D, E]>; zipAll(a: Iterable, ..._: []): OrderedSet<[T | void, A | void]>; zipAll( a: Iterable, b: Iterable, ..._: [] ): OrderedSet<[T | void, A | void, B | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): OrderedSet<[T | void, A | void, B | void, C | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): OrderedSet<[T | void, A | void, B | void, C | void, D | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): OrderedSet<[T | void, A | void, B | void, C | void, D | void, E | void]>; zipWith( zipper: (value: T, a: A) => R, a: Iterable, ..._: [] ): OrderedSet; zipWith( zipper: (value: T, a: A, b: B) => R, a: Iterable, b: Iterable, ..._: [] ): OrderedSet; zipWith( zipper: (value: T, a: A, b: B, c: C) => R, a: Iterable, b: Iterable, c: Iterable, ..._: [] ): OrderedSet; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): OrderedSet; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D, e: E) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): OrderedSet; } declare function isStack( maybeStack: mixed ): boolean %checks(maybeStack instanceof Stack); declare class Stack<+T> extends IndexedCollection { static (collection?: Iterable): Stack; static isStack(maybeStack: mixed): boolean; static of(...values: T[]): Stack; static isStack: typeof isStack; size: number; peek(): T; clear(): this; unshift(...values: U[]): Stack; unshiftAll(iter: Iterable): Stack; shift(): this; push(...values: U[]): Stack; pushAll(iter: Iterable): Stack; pop(): this; withMutations(mutator: (mutable: this) => mixed): this; asMutable(): this; wasAltered(): boolean; asImmutable(): this; // Override specialized return types concat(...iters: Array | C>): Stack; filter(predicate: typeof Boolean): Stack<$NonMaybeType>; filter( predicate: (value: T, index: number, iter: this) => mixed, context?: mixed ): Stack; map( mapper: (value: T, index: number, iter: this) => M, context?: mixed ): Stack; flatMap( mapper: (value: T, index: number, iter: this) => Iterable, context?: mixed ): Stack; flatten(depth?: number): Stack; flatten(shallow?: boolean): Stack; zip(a: Iterable, ..._: []): Stack<[T, A]>; zip(a: Iterable, b: Iterable, ..._: []): Stack<[T, A, B]>; zip( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): Stack<[T, A, B, C]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): Stack<[T, A, B, C, D]>; zip( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): Stack<[T, A, B, C, D, E]>; zipAll(a: Iterable, ..._: []): Stack<[T | void, A | void]>; zipAll( a: Iterable, b: Iterable, ..._: [] ): Stack<[T | void, A | void, B | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, ..._: [] ): Stack<[T | void, A | void, B | void, C | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): Stack<[T | void, A | void, B | void, C | void, D | void]>; zipAll( a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): Stack<[T | void, A | void, B | void, C | void, D | void, E | void]>; zipWith( zipper: (value: T, a: A) => R, a: Iterable, ..._: [] ): Stack; zipWith( zipper: (value: T, a: A, b: B) => R, a: Iterable, b: Iterable, ..._: [] ): Stack; zipWith( zipper: (value: T, a: A, b: B, c: C) => R, a: Iterable, b: Iterable, c: Iterable, ..._: [] ): Stack; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, ..._: [] ): Stack; zipWith( zipper: (value: T, a: A, b: B, c: C, d: D, e: E) => R, a: Iterable, b: Iterable, c: Iterable, d: Iterable, e: Iterable, ..._: [] ): Stack; } declare function Range( start?: number, end?: number, step?: number ): IndexedSeq; declare function Repeat(value: T, times?: number): IndexedSeq; // The type of a Record factory function. type RecordFactory = Class>; // The type of runtime Record instances. type RecordOf = RecordInstance & $ReadOnly; // The values of a Record instance. type _RecordValues | T> = R; type RecordValues = _RecordValues<*, R>; declare function isRecord( maybeRecord: any ): boolean %checks(maybeRecord instanceof RecordInstance); declare class Record { static (spec: Values, name?: string): typeof RecordInstance; constructor( spec: Values, name?: string ): typeof RecordInstance; static isRecord: typeof isRecord; static getDescriptiveName(record: RecordInstance): string; } declare class RecordInstance { static (values?: Iterable<[$Keys, $ValOf]> | $Shape): RecordOf; // Note: a constructor can only create an instance of RecordInstance, // it's encouraged to not use `new` when creating Records. constructor(values?: Iterable<[$Keys, $ValOf]> | $Shape): void; size: number; has(key: string): boolean; get>(key: K, ..._: []): $ElementType; get, NSV>(key: K, notSetValue: NSV): $ElementType | NSV; hasIn(keyPath: Iterable): boolean; getIn(keyPath: [], notSetValue?: mixed): this & $ReadOnly; getIn>(keyPath: [K], notSetValue?: mixed): $ElementType; getIn, K2: $KeyOf<$ValOf>>( keyPath: [K, K2], notSetValue: NSV ): $ValOf<$ValOf, K2> | NSV; getIn< NSV, K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, >( keyPath: [K, K2, K3], notSetValue: NSV ): $ValOf<$ValOf<$ValOf, K2>, K3> | NSV; getIn< NSV, K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, >( keyPath: [K, K2, K3, K4], notSetValue: NSV ): $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4> | NSV; getIn< NSV, K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, >( keyPath: [K, K2, K3, K4, K5], notSetValue: NSV ): $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5> | NSV; equals(other: any): boolean; hashCode(): number; set>(key: K, value: $ElementType): this & $ReadOnly; update>( key: K, updater: (value: $ElementType) => $ElementType ): this & $ReadOnly; merge( ...collections: Array, $ValOf]> | $Shape> ): this & $ReadOnly; mergeDeep( ...collections: Array, $ValOf]> | $Shape> ): this & $ReadOnly; mergeWith( merger: (oldVal: $ValOf, newVal: $ValOf, key: $Keys) => $ValOf, ...collections: Array, $ValOf]> | $Shape> ): this & $ReadOnly; mergeDeepWith( merger: (oldVal: any, newVal: any, key: any) => any, ...collections: Array, $ValOf]> | $Shape> ): this & $ReadOnly; delete>(key: K): this & $ReadOnly; remove>(key: K): this & $ReadOnly; clear(): this & $ReadOnly; setIn(keyPath: [], value: S): S; setIn, S: $ValOf>( keyPath: [K], value: S ): this & $ReadOnly; setIn, K2: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K2>>( keyPath: [K, K2], value: S ): this & $ReadOnly; setIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, S: $ValOf<$ValOf<$ValOf, K2>, K3>, >( keyPath: [K, K2, K3], value: S ): this & $ReadOnly; setIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, >( keyPath: [K, K2, K3, K4], value: S ): this & $ReadOnly; setIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5>, >( keyPath: [K, K2, K3, K4, K5], value: S ): this & $ReadOnly; deleteIn(keyPath: []): void; deleteIn>(keyPath: [K]): this & $ReadOnly; deleteIn, K2: $KeyOf<$ValOf>>( keyPath: [K, K2] ): this & $ReadOnly; deleteIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, >( keyPath: [K, K2, K3] ): this & $ReadOnly; deleteIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, >( keyPath: [K, K2, K3, K4] ): this & $ReadOnly; deleteIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, >( keyPath: [K, K2, K3, K4, K5] ): this & $ReadOnly; removeIn(keyPath: []): void; removeIn>(keyPath: [K]): this & $ReadOnly; removeIn, K2: $KeyOf<$ValOf>>( keyPath: [K, K2] ): this & $ReadOnly; removeIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, >( keyPath: [K, K2, K3] ): this & $ReadOnly; removeIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, >( keyPath: [K, K2, K3, K4] ): this & $ReadOnly; removeIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, >( keyPath: [K, K2, K3, K4, K5] ): this & $ReadOnly; updateIn( keyPath: [], notSetValue: mixed, updater: (value: this & T) => U ): U; updateIn(keyPath: [], updater: (value: this & T) => U): U; updateIn, S: $ValOf>( keyPath: [K], notSetValue: NSV, updater: (value: $ValOf) => S ): this & $ReadOnly; updateIn, S: $ValOf>( keyPath: [K], updater: (value: $ValOf) => S ): this & $ReadOnly; updateIn< NSV, K: $Keys, K2: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K2>, >( keyPath: [K, K2], notSetValue: NSV, updater: (value: $ValOf<$ValOf, K2> | NSV) => S ): this & $ReadOnly; updateIn, K2: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K2>>( keyPath: [K, K2], updater: (value: $ValOf<$ValOf, K2>) => S ): this & $ReadOnly; updateIn< NSV, K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, S: $ValOf<$ValOf<$ValOf, K2>, K3>, >( keyPath: [K, K2, K3], notSetValue: NSV, updater: (value: $ValOf<$ValOf<$ValOf, K2>, K3> | NSV) => S ): this & $ReadOnly; updateIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, S: $ValOf<$ValOf<$ValOf, K2>, K3>, >( keyPath: [K, K2, K3], updater: (value: $ValOf<$ValOf<$ValOf, K2>, K3>) => S ): this & $ReadOnly; updateIn< NSV, K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, >( keyPath: [K, K2, K3, K4], notSetValue: NSV, updater: ( value: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4> | NSV ) => S ): this & $ReadOnly; updateIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, >( keyPath: [K, K2, K3, K4], updater: (value: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>) => S ): this & $ReadOnly; updateIn< NSV, K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5>, >( keyPath: [K, K2, K3, K4, K5], notSetValue: NSV, updater: ( value: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5> | NSV ) => S ): this & $ReadOnly; updateIn< K: $Keys, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5>, >( keyPath: [K, K2, K3, K4, K5], updater: ( value: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5> ) => S ): this & $ReadOnly; mergeIn( keyPath: Iterable, ...collections: Array ): this & $ReadOnly; mergeDeepIn( keyPath: Iterable, ...collections: Array ): this & $ReadOnly; toSeq(): KeyedSeq<$Keys, any>; toJS(): { [key: $Keys]: mixed }; toJSON(): T; toObject(): T; withMutations(mutator: (mutable: this & T) => mixed): this & $ReadOnly; asMutable(): this & $ReadOnly; wasAltered(): boolean; asImmutable(): this & $ReadOnly; @@iterator(): Iterator<[$Keys, $ValOf]>; } declare function fromJS( jsValue: mixed, reviver?: ( key: string | number, sequence: KeyedCollection | IndexedCollection, path?: Array ) => mixed ): Collection; declare function is(first: mixed, second: mixed): boolean; declare function hash(value: mixed): number; declare function get>( collection: C, key: K, notSetValue: mixed ): $ValOf; declare function get, NSV>( collection: C, key: K, notSetValue: NSV ): $ValOf | NSV; declare function has(collection: Object, key: mixed): boolean; declare function remove(collection: C, key: $KeyOf): C; declare function set, V: $ValOf>( collection: C, key: K, value: V ): C; declare function update, V: $ValOf, NSV>( collection: C, key: K, notSetValue: NSV, updater: ($ValOf | NSV) => V ): C; declare function update, V: $ValOf>( collection: C, key: K, updater: ($ValOf) => V ): C; declare function getIn(collection: C, keyPath: [], notSetValue?: mixed): C; declare function getIn, NSV>( collection: C, keyPath: [K], notSetValue: NSV ): $ValOf | NSV; declare function getIn, K2: $KeyOf<$ValOf>, NSV>( collection: C, keyPath: [K, K2], notSetValue: NSV ): $ValOf<$ValOf, K2> | NSV; declare function getIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, NSV, >( collection: C, keyPath: [K, K2, K3], notSetValue: NSV ): $ValOf<$ValOf<$ValOf, K2>, K3> | NSV; declare function getIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, NSV, >( collection: C, keyPath: [K, K2, K3, K4], notSetValue: NSV ): $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4> | NSV; declare function getIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, NSV, >( collection: C, keyPath: [K, K2, K3, K4, K5], notSetValue: NSV ): $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5> | NSV; declare function hasIn(collection: Object, keyPath: Iterable): boolean; declare function removeIn(collection: C, keyPath: []): void; declare function removeIn>(collection: C, keyPath: [K]): C; declare function removeIn, K2: $KeyOf<$ValOf>>( collection: C, keyPath: [K, K2] ): C; declare function removeIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, >( collection: C, keyPath: [K, K2, K3] ): C; declare function removeIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, >( collection: C, keyPath: [K, K2, K3, K4] ): C; declare function removeIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, >( collection: C, keyPath: [K, K2, K3, K4, K5] ): C; declare function setIn(collection: Object, keyPath: [], value: S): S; declare function setIn, S: $ValOf>( collection: C, keyPath: [K], value: S ): C; declare function setIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K2>, >( collection: C, keyPath: [K, K2], value: S ): C; declare function setIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, S: $ValOf<$ValOf<$ValOf, K2>, K3>, >( collection: C, keyPath: [K, K2, K3], value: S ): C; declare function setIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, >( collection: C, keyPath: [K, K2, K3, K4], value: S ): C; declare function setIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5>, >( collection: C, keyPath: [K, K2, K3, K4, K5], value: S ): C; declare function updateIn( collection: C, keyPath: [], notSetValue: mixed, updater: (value: C) => S ): S; declare function updateIn( collection: C, keyPath: [], updater: (value: C) => S ): S; declare function updateIn, S: $ValOf, NSV>( collection: C, keyPath: [K], notSetValue: NSV, updater: (value: $ValOf | NSV) => S ): C; declare function updateIn, S: $ValOf>( collection: C, keyPath: [K], updater: (value: $ValOf) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K2>, NSV, >( collection: C, keyPath: [K, K2], notSetValue: NSV, updater: (value: $ValOf<$ValOf, K2> | NSV) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, S: $ValOf<$ValOf, K2>, >( collection: C, keyPath: [K, K2], updater: (value: $ValOf<$ValOf, K2>) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, S: $ValOf<$ValOf<$ValOf, K2>, K3>, NSV, >( collection: C, keyPath: [K, K2, K3], notSetValue: NSV, updater: (value: $ValOf<$ValOf<$ValOf, K2>, K3> | NSV) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, S: $ValOf<$ValOf<$ValOf, K2>, K3>, >( collection: C, keyPath: [K, K2, K3], updater: (value: $ValOf<$ValOf<$ValOf, K2>, K3>) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, NSV, >( collection: C, keyPath: [K, K2, K3, K4], notSetValue: NSV, updater: (value: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4> | NSV) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, S: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, >( collection: C, keyPath: [K, K2, K3, K4], updater: (value: $ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5>, NSV, >( collection: C, keyPath: [K, K2, K3, K4, K5], notSetValue: NSV, updater: ( value: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5> | NSV ) => S ): C; declare function updateIn< C, K: $KeyOf, K2: $KeyOf<$ValOf>, K3: $KeyOf<$ValOf<$ValOf, K2>>, K4: $KeyOf<$ValOf<$ValOf<$ValOf, K2>, K3>>, K5: $KeyOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>>, S: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5>, >( collection: C, keyPath: [K, K2, K3, K4, K5], updater: ( value: $ValOf<$ValOf<$ValOf<$ValOf<$ValOf, K2>, K3>, K4>, K5> ) => S ): C; declare function merge( collection: C, ...collections: Array< | $IterableOf | $Shape> | PlainObjInput<$KeyOf, $ValOf>, > ): C; declare function mergeWith( merger: (oldVal: $ValOf, newVal: $ValOf, key: $KeyOf) => $ValOf, collection: C, ...collections: Array< | $IterableOf | $Shape> | PlainObjInput<$KeyOf, $ValOf>, > ): C; declare function mergeDeep( collection: C, ...collections: Array< | $IterableOf | $Shape> | PlainObjInput<$KeyOf, $ValOf>, > ): C; declare function mergeDeepWith( merger: (oldVal: any, newVal: any, key: any) => mixed, collection: C, ...collections: Array< | $IterableOf | $Shape> | PlainObjInput<$KeyOf, $ValOf>, > ): C; export { Collection, Seq, List, Map, OrderedMap, OrderedSet, Range, Repeat, Record, Set, Stack, fromJS, is, hash, isImmutable, isCollection, isKeyed, isIndexed, isAssociative, isOrdered, isRecord, isValueObject, get, has, remove, set, update, getIn, hasIn, removeIn, setIn, updateIn, merge, mergeWith, mergeDeep, mergeDeepWith, }; export default { Collection, Seq, List, Map, OrderedMap, OrderedSet, PairSorting, Range, Repeat, Record, Set, Stack, fromJS, is, hash, isImmutable, isCollection, isKeyed, isIndexed, isAssociative, isOrdered, isRecord, isValueObject, get, has, remove, set, update, getIn, hasIn, removeIn, setIn, updateIn, merge, mergeWith, mergeDeep, mergeDeepWith, }; export type { Comparator, KeyedCollection, IndexedCollection, SetCollection, KeyedSeq, IndexedSeq, SetSeq, RecordFactory, RecordOf, RecordInstance, ValueObject, $KeyOf, $ValOf, }; immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/000077500000000000000000000000001522056416100241025ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/collection.ts000066400000000000000000000135711522056416100266140ustar00rootroot00000000000000import { Collection, List, Map, OrderedMap, Seq, Set } from 'immutable'; import { expect, test } from 'tstyche'; // Type-level coverage for shared Collection methods (defined on the // Collection.ts classes), exercised through the concrete public types. test('subset methods keep the collection type (indexed / keyed / set / seq)', () => { expect(List().skipWhile((x) => x < 3)).type.toBe>(); expect(List().skipUntil((x) => x < 3)).type.toBe>(); expect(List().takeWhile((x) => x < 3)).type.toBe>(); expect(List().takeUntil((x) => x < 3)).type.toBe>(); expect(List().skip(2)).type.toBe>(); expect(List().skipLast(2)).type.toBe>(); expect(List().take(2)).type.toBe>(); expect(List().takeLast(2)).type.toBe>(); expect(List().butLast()).type.toBe>(); expect(List().rest()).type.toBe>(); expect(List().reverse()).type.toBe>(); expect(List().sort()).type.toBe>(); expect(List().sortBy((x) => -x)).type.toBe>(); expect(List().filterNot((x) => x > 1)).type.toBe>(); expect(Map().skipWhile((v) => v > 1)).type.toBe< Map >(); expect(Map().filterNot((v) => v > 1)).type.toBe< Map >(); // Sorting an unordered Map yields its ordered equivalent. expect(Map().sortBy((v) => v)).type.toBe< Map & OrderedMap >(); expect(Set().filterNot((v) => v > 1)).type.toBe>(); expect(Seq.Indexed().skipWhile((x) => x < 1)).type.toBe< Seq.Indexed >(); expect(Seq.Keyed().filterNot((v) => v > 1)).type.toBe< Seq.Keyed >(); }); test('filter narrows with a type guard, across collection types', () => { expect( List().filter((x): x is number => typeof x === 'number') ).type.toBe>(); expect( Map().filter( (v): v is number => typeof v === 'number' ) ).type.toBe>(); expect( Set().filter((v): v is number => typeof v === 'number') ).type.toBe>(); // Without a guard, filter returns the same type. expect(List().filter((x) => x > 1)).type.toBe>(); }); test('partition splits and narrows', () => { expect(List().partition((x) => x > 1)).type.toBe< [List, List] >(); expect( List().partition((x): x is string => typeof x === 'string') ).type.toBe<[List, List]>(); }); test('flatMap returns the mapped collection type (indexed and keyed)', () => { expect(List([1, 2]).flatMap((x) => [x, x * 10])).type.toBe>(); expect( Map().flatMap((v, k): Array<[string, number]> => [[k, v]]) ).type.toBe>(); }); test('flatten returns a collection', () => { expect(List([1, 2]).flatten()).type.toBe>(); expect(List([1, 2]).flatten(1)).type.toBe>(); expect(List([1, 2]).flatten(true)).type.toBe>(); }); test('reducing-to-a-single-value methods', () => { expect(List().max()).type.toBe(); expect(List().min((a, b) => a - b)).type.toBe(); expect(List().maxBy((x) => x)).type.toBe(); expect( List().minBy( (x) => x, (a, b) => a - b ) ).type.toBe(); }); test('find / last family', () => { expect(List().findLast((x) => x > 1)).type.toBe(); expect(List().findLastEntry((x) => x > 1)).type.toBe< [number, number] | undefined >(); expect(Map().findLastKey((v) => v > 1)).type.toBe< string | undefined >(); expect(OrderedMap().lastKeyOf(1)).type.toBe< string | undefined >(); }); test('indexed search returns number indices', () => { expect(List().findLastIndex((x) => x > 1)).type.toBe(); expect(List().lastIndexOf(1)).type.toBe(); }); test('indexed combination keeps the indexed type', () => { expect(List().interpose(0)).type.toBe>(); expect(List().interleave(List())).type.toBe>(); expect(Seq.Indexed().interpose(0)).type.toBe>(); }); test('zip family produces tuples and respects arity', () => { expect(List().zip(List())).type.toBe< List<[number, string]> >(); expect(List().zip(List(), List())).type.toBe< List<[number, string, boolean]> >(); expect(List().zipAll(List())).type.toBe< List<[number, string]> >(); expect(List().zipWith((a, b) => a + b, List())).type.toBe< List >(); expect( List().zipWith( (a, b: string, c: boolean) => `${a}${b}${c}`, List(), List() ) ).type.toBe>(); }); test('flip swaps key and value types', () => { expect(Map().flip()).type.toBe>(); expect(Seq.Keyed().flip()).type.toBe< Seq.Keyed >(); }); test('indexed-only methods are not available on keyed collections', () => { expect(Map().findLastIndex((v) => v > 1)).type.toRaiseError(); expect(Map().lastIndexOf(1)).type.toRaiseError(); expect(Map().zip(List())).type.toRaiseError(); expect(Map().interpose(0)).type.toRaiseError(); }); test('flip is keyed-only', () => { expect(List().flip()).type.toRaiseError(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/covariance.ts000066400000000000000000000033111522056416100265620ustar00rootroot00000000000000import { List, Map, MapOf, OrderedMap, OrderedSet, Set, Stack, } from 'immutable'; import { expect, test } from 'tstyche'; class A { x: number; constructor() { this.x = 1; } } class B extends A { y: string; constructor() { super(); this.y = 'B'; } } class C { z: string; constructor() { this.z = 'C'; } } test('List covariance', () => { expect>().type.toBeAssignableTo(List()); expect(List([new B()])).type.toBe>(); expect>().type.not.toBeAssignableTo(List()); }); test('Map covariance', () => { expect>().type.toBeAssignableTo>(); expect(Map({ b: new B() })).type.toBe>(); expect>().type.not.toBeAssignableTo>(); }); test('Set covariance', () => { expect>().type.toBeAssignableTo>(); expect(Set([new B()])).type.toBe>(); expect>().type.not.toBeAssignableTo>(); }); test('Stack covariance', () => { expect>().type.toBeAssignableTo>(); expect(Stack([new B()])).type.toBe>(); expect>().type.not.toBeAssignableTo>(); }); test('OrderedMap covariance', () => { expect>().type.toBeAssignableTo< OrderedMap >(); expect(OrderedMap({ b: new B() })).type.toBe>(); expect>().type.not.toBeAssignableTo< OrderedMap >(); }); test('OrderedSet covariance', () => { expect>().type.toBeAssignableTo>(); expect(OrderedSet([new B()])).type.toBe>(); expect>().type.not.toBeAssignableTo>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/deepCopy.ts000066400000000000000000000063001522056416100262210ustar00rootroot00000000000000import { Collection, DeepCopy, List, Map, Record, Seq, Set } from 'immutable'; import { describe, expect, test } from 'tstyche'; describe('DeepCopy', () => { test('basic types', () => { expect< DeepCopy<{ a: number; b: number; }> >().type.toBe<{ a: number; b: number; }>(); }); test('iterables', () => { expect>().type.toBe(); expect>>().type.toBe(); }); test('immutable first-level types', () => { expect>>().type.toBe<{ [x: string]: string; }>(); // should be `{ [x: string]: object }`, but there is an issue with circular references expect>>().type.toBe<{ [x: string]: unknown; }>(); // should be `{ [x: string]: object; [x: number]: object }`, but there is an issue with circular references expect>>().type.toBe<{ [x: string]: unknown; [x: number]: unknown; }>(); expect>>().type.toBe(); expect>>().type.toBe(); }); test('keyed', () => { expect>>().type.toBe<{ [x: string]: number; }>(); expect>>().type.toBe<{ [x: string]: number; [x: number]: number; }>(); expect>>().type.toBe<{ [x: string]: number; [x: number]: number; }>(); expect>>().type.toBe<{ [x: string]: number; [x: number]: number; }>(); }); test('nested', () => { // should be `{ map: { [x: string]: string }; list: string[]; set: string[] }`, but there is an issue with circular references expect< DeepCopy<{ map: Map; list: List; set: Set; }> >().type.toBe<{ map: unknown; list: unknown; set: unknown }>(); // should be `{ map: { [x: string]: string } }`, but there is an issue with circular references expect>>>().type.toBe<{ map: unknown; }>(); }); test('circular references', () => { type Article = Record<{ title: string; tag: Tag }>; type Tag = Record<{ name: string; article: Article }>; // should handle circular references here somehow expect>().type.toBe<{ title: string; tag: unknown }>(); }); test('circular references #1957', () => { class Foo1 extends Record<{ foo: undefined | Foo1 }>({ foo: undefined, }) {} class Foo2 extends Record<{ foo?: Foo2 }>({ foo: undefined, }) {} class Foo3 extends Record<{ foo: null | Foo3 }>({ foo: null, }) {} expect>().type.toBe<{ foo: unknown }>(); expect>().type.toBe<{ foo?: unknown }>(); expect>().type.toBe<{ foo: unknown }>(); class FooWithList extends Record<{ foo: undefined | List }>({ foo: undefined, }) {} expect>().type.toBe<{ foo: unknown }>(); }); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/empty.ts000066400000000000000000000024101522056416100256050ustar00rootroot00000000000000import { Collection, Seq } from 'immutable'; import { expect, test } from 'tstyche'; test('typed empty Seq', () => { expect(Seq()).type.toBe>(); expect(Seq()).type.toBe>(); expect(Seq.Indexed()).type.toBe>(); expect(Seq.Indexed()).type.toBe>(); expect(Seq.Keyed()).type.toBe>(); expect(Seq.Keyed()).type.toBe>(); expect(Seq.Set()).type.toBe>(); expect(Seq.Set()).type.toBe>(); }); test('typed empty Collection', () => { expect(Collection()).type.toBe>(); expect(Collection()).type.toBe>(); expect(Collection.Indexed()).type.toBe>(); expect(Collection.Indexed()).type.toBe>(); expect(Collection.Keyed()).type.toBe>(); expect(Collection.Keyed()).type.toBe< Collection.Keyed >(); expect(Collection.Set()).type.toBe>(); expect(Collection.Set()).type.toBe>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/es6-collections.ts000066400000000000000000000013351522056416100274650ustar00rootroot00000000000000import { Map as ImmutableMap, Set as ImmutableSet } from 'immutable'; import { expect, test } from 'tstyche'; test('immutable.js collections', () => { const mapImmutable: ImmutableMap = ImmutableMap< string, number >(); const setImmutable: ImmutableSet = ImmutableSet(); expect(mapImmutable.delete('foo')).type.toBe>(); expect(setImmutable.delete('bar')).type.toBe>(); }); test('ES6 collections', () => { const mapES6: Map = new Map(); const setES6: Set = new Set(); expect(mapES6.delete('foo')).type.toBe(); expect(setES6.delete('bar')).type.toBe(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/exports.ts000066400000000000000000000053731522056416100261660ustar00rootroot00000000000000// Some tests look like they are repeated in order to avoid false positives. import * as Immutable from 'immutable'; import { Collection, List, Map, OrderedMap, OrderedSet, Range, Repeat, Seq, Set, Stack, } from 'immutable'; import { expect, test } from 'tstyche'; test('named imports', () => { expect(List).type.toBe(); expect(Map).type.toBe(); expect(OrderedMap).type.toBe(); expect(OrderedSet).type.toBe(); expect(Range).type.toBe< ( start: number, end: number, step?: number | undefined ) => Seq.Indexed >(); expect(Repeat).type.toBe< (value: T, times?: number | undefined) => Seq.Indexed >(); expect(Seq).type.toBe(); expect(Set).type.toBe(); expect(Stack).type.toBe(); expect(Collection).type.toBe(); expect(Collection.Set).type.toBe< ( collection?: Iterable | ArrayLike | undefined ) => Collection.Set >(); expect(Collection.Keyed).type.toBe<{ (collection?: Iterable<[K, V]> | undefined): Collection.Keyed; (obj: { [key: string]: V }): Collection.Keyed; }>(); expect(Collection.Indexed).type.toBe< ( collection?: Iterable | ArrayLike | undefined ) => Collection.Indexed >(); }); test('namespace import', () => { expect(Immutable.List).type.toBe(); expect(Immutable.Map).type.toBe(); expect(Immutable.OrderedMap).type.toBe(); expect(Immutable.OrderedSet).type.toBe(); expect(Immutable.Range).type.toBe< ( start: number, end: number, step?: number | undefined ) => Immutable.Seq.Indexed >(); expect(Immutable.Repeat).type.toBe< (value: T, times?: number | undefined) => Immutable.Seq.Indexed >(); expect(Immutable.Seq).type.toBe(); expect(Immutable.Set).type.toBe(); expect(Immutable.Stack).type.toBe(); expect(Immutable.Collection).type.toBe(); expect(Immutable.Collection.Set).type.toBe< ( collection?: Iterable | ArrayLike | undefined ) => Immutable.Collection.Set >(); expect(Immutable.Collection.Keyed).type.toBe<{ ( collection?: Iterable<[K, V]> | undefined ): Immutable.Collection.Keyed; (obj: { [key: string]: V }): Immutable.Collection.Keyed; }>(); expect(Immutable.Collection.Indexed).type.toBe< ( collection?: Iterable | ArrayLike | undefined ) => Immutable.Collection.Indexed >(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/from-js.ts000066400000000000000000000026401522056416100260310ustar00rootroot00000000000000import { Collection, List, Map, MapOf, fromJS } from 'immutable'; import { expect, test } from 'tstyche'; test('fromJS', () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any expect(fromJS({}, (a: any, b: any) => b)).type.toBe< Collection >(); expect(fromJS('abc')).type.toBe(); expect(fromJS([0, 1, 2])).type.toBe>(); expect(fromJS(List([0, 1, 2]))).type.toBe>(); expect(fromJS({ a: 0, b: 1, c: 2 })).type.toBe< Map<'b' | 'a' | 'c', number> >(); expect(fromJS(Map({ a: 0, b: 1, c: 2 }))).type.toBe< MapOf<{ a: number; b: number; c: number }> >(); expect(fromJS([{ a: 0 }])).type.toBe>>(); expect(fromJS({ a: [0] })).type.toBe>>(); expect(fromJS([[[0]]])).type.toBe>>>(); expect(fromJS({ a: { b: { c: 0 } } })).type.toBe< Map<'a', Map<'b', Map<'c', number>>> >(); }); test('fromJS in an array of function', () => { // eslint-disable-next-line @typescript-eslint/no-explicit-any const create = [(data: any) => data, fromJS][1]; // eslint-disable-next-line @typescript-eslint/no-explicit-any expect(create({ a: 'A' })).type.toBe(); // eslint-disable-next-line @typescript-eslint/no-explicit-any const createConst = ([(data: any) => data, fromJS] as const)[1]; expect(createConst({ a: 'A' })).type.toBe>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/functional.ts000066400000000000000000000114751522056416100266240ustar00rootroot00000000000000import { List, Map, MapOf, get, getIn, has, hasIn, remove, set, update, } from 'immutable'; import { expect, test } from 'tstyche'; test('get', () => { expect(get([1, 2, 3], 0)).type.toBe(); expect(get([1, 2, 3], 0, 'a')).type.toBe(); expect(get({ x: 10, y: 20 }, 'x')).type.toBe(); expect(get({ x: 10, y: 20 }, 'z', 'missing')).type.toBe(); }); test('getIn', () => { expect(getIn('a', ['length' as const])).type.toBe(); expect(getIn([1, 2, 3], [0])).type.toBe(); // first parameter type is Array so we can not detect that the number will be invalid expect(getIn([1, 2, 3], [99])).type.toBe(); // We do not handle List in getIn TS type yet (hard to convert to a tuple) expect(getIn([1, 2, 3], List([0]))).type.toBe(); expect(getIn([1, 2, 3], [0], 'a' as const)).type.toBe(); expect(getIn(List([1, 2, 3]), [0])).type.toBe(); // first parameter type is Array so we can not detect that the number will be invalid expect(getIn(List([1, 2, 3]), [99])).type.toBe(); expect(getIn(List([1, 2, 3]), ['a' as const])).type.toBe(); expect( getIn(List([1, 2, 3]), ['a' as const], 'missing') ).type.toBe<'missing'>(); expect(getIn({ x: 10, y: 20 }, ['x' as const])).type.toBe(); expect( getIn({ x: 10, y: 20 }, ['z' as const], 'missing') ).type.toBe<'missing'>(); expect(getIn({ x: { y: 20 } }, ['x' as const])).type.toBe<{ y: number }>(); expect(getIn({ x: { y: 20 } }, ['z' as const])).type.toBe(); expect( getIn({ x: { y: 20 } }, ['x' as const, 'y' as const]) ).type.toBe(); expect( getIn({ x: Map({ y: 20 }) }, ['x' as const, 'y' as const]) ).type.toBe(); expect( getIn(Map({ x: Map({ y: 20 }) }), ['x' as const, 'y' as const]) ).type.toBe(); const o = Map({ x: List([Map({ y: 20 })]) }); expect(getIn(o, ['x' as const, 'y' as const])).type.toBe(); expect(getIn(o, ['x' as const])).type.toBe>>(); expect(getIn(o, ['x' as const, 0])).type.toBe>(); expect(getIn(o, ['x' as const, 0, 'y' as const])).type.toBe(); }); test('has', () => { expect(has([1, 2, 3], 0)).type.toBe(); expect(has({ x: 10, y: 20 }, 'x')).type.toBe(); }); test('hasIn', () => { expect(hasIn('a', ['length' as const])).type.toBe(); expect(hasIn(123, [])).type.toBe(); expect(hasIn(true, [])).type.toBe(); expect(hasIn([1, 2, 3], [0])).type.toBe(); // first parameter type is Array so we can not detect that the number will be invalid expect(hasIn([1, 2, 3], [99])).type.toBe(); // We do not handle List in hasIn TS type yet (hard to convert to a tuple) expect(hasIn([1, 2, 3], List([0]))).type.toBe(); expect(hasIn(List([1, 2, 3]), [0])).type.toBe(); // first parameter type is Array so we can not detect that the number will be invalid expect(hasIn(List([1, 2, 3]), [99])).type.toBe(); expect(hasIn(List([1, 2, 3]), ['a' as const])).type.toBe(); expect(hasIn({ x: 10, y: 20 }, ['x' as const])).type.toBe(); expect(hasIn({ x: { y: 20 } }, ['z' as const])).type.toBe(); expect( hasIn({ x: { y: 20 } }, ['x' as const, 'y' as const]) ).type.toBe(); expect( hasIn({ x: Map({ y: 20 }) }, ['x' as const, 'y' as const]) ).type.toBe(); expect( hasIn(Map({ x: Map({ y: 20 }) }), ['x' as const, 'y' as const]) ).type.toBe(); const o = Map({ x: List([Map({ y: 20 })]) }); expect(hasIn(o, ['x' as const, 'y' as const])).type.toBe(); expect(hasIn(o, ['x' as const, 0, 'y' as const])).type.toBe(); }); test('set', () => { expect(set([1, 2, 3], 0, 10)).type.toBe(); expect(set([1, 2, 3], 0, 'a')).type.toRaiseError(); expect(set([1, 2, 3], 'a', 0)).type.toRaiseError(); expect(set({ x: 10, y: 20 }, 'x', 100)).type.toBe<{ x: number; y: number; }>(); expect(set({ x: 10, y: 20 }, 'x', 'a')).type.toRaiseError(); }); test('remove', () => { expect(remove([1, 2, 3], 0)).type.toBe(); expect(remove({ x: 10, y: 20 }, 'x')).type.toBe<{ x: number; y: number; }>(); }); test('update', () => { expect(update([1, 2, 3], 0, (v: number) => v + 1)).type.toBe(); expect(update([1, 2, 3], 0, 1)).type.toRaiseError(); expect(update([1, 2, 3], 0, (v: string) => v + 'a')).type.toRaiseError(); expect(update([1, 2, 3], 'a', (v: number) => v + 1)).type.toRaiseError(); expect(update({ x: 10, y: 20 }, 'x', (v: number) => v + 1)).type.toBe<{ x: number; y: number; }>(); expect( update({ x: 10, y: 20 }, 'x', (v: string) => v + 'a') ).type.toRaiseError(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/groupBy.ts000066400000000000000000000032661522056416100261100ustar00rootroot00000000000000import { Collection, List, Map, MapOf, OrderedMap, OrderedSet, Seq, Set, Stack, } from 'immutable'; import { expect, test } from 'tstyche'; test('groupBy', () => { expect(Collection(['a', 'b', 'c', 'a']).groupBy((v) => v)).type.toBe< Map> >(); expect( Collection({ a: 1, b: 2, c: 3, d: 1 }).groupBy((v) => `key-${v}`) ).type.toBe>>(); expect(List(['a', 'b', 'c', 'a']).groupBy((v) => v)).type.toBe< Map> >(); expect(Seq(['a', 'b', 'c', 'a']).groupBy((v) => v)).type.toBe< Map> >(); expect(Seq({ a: 1, b: 2, c: 3, d: 1 }).groupBy((v) => `key-${v}`)).type.toBe< Map> >(); expect(Set(['a', 'b', 'c', 'a']).groupBy((v) => v)).type.toBe< Map> >(); expect(Stack(['a', 'b', 'c', 'a']).groupBy((v) => v)).type.toBe< Map> >(); expect(OrderedSet(['a', 'b', 'c', 'a']).groupBy((v) => v)).type.toBe< Map> >(); expect( Map({ a: 1, b: 2, c: 3, d: 1 }).groupBy((v) => `key-${v}`) ).type.toBe>>(); // type should be something like Map>> but groupBy returns a wrong type with `this` expect(Map({ a: 1, b: 2, c: 3, d: 1 }).groupBy((v) => `key-${v}`)).type.toBe< Map> >(); expect( OrderedMap({ a: 1, b: 2, c: 3, d: 1 }).groupBy((v) => `key-${v}`) ).type.toBe>>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/list.ts000066400000000000000000000233761522056416100254400ustar00rootroot00000000000000import { List, get, merge, remove, removeIn, set, setIn, update, updateIn, } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('#constructor', () => { expect(List()).type.toBe>(); expect(List()).type.toBeAssignableTo>(); expect(List([1, 'a'])).type.toBeAssignableTo>(); expect(List([1, 'a'])).type.not.toBeAssignableTo>(); }); test('#size', () => { expect(pick(List(), 'size')).type.toBe<{ readonly size: number }>(); }); test('#setSize', () => { expect(List().setSize(10)).type.toBe>(); expect(List().setSize('foo')).type.toRaiseError(); }); test('.of', () => { expect(List.of(1, 2, 3)).type.toBe>(); expect(List.of('a', 1)).type.toRaiseError(); expect(List.of('a', 1)).type.toBe>(); }); test('#get', () => { expect(List().get(4)).type.toBe(); expect(List().get(4, 'a')).type.toBe(); expect(List().get(4, 'a')).type.toRaiseError(); expect(get(List(), 4)).type.toBe(); expect(get(List(), 4, 'a')).type.toBe(); }); test('#set', () => { expect(List().set(0, 0)).type.toBe>(); expect(List().set(1, 'a')).type.toRaiseError(); expect(List().set('a', 1)).type.toRaiseError(); expect(List().set(0, 1)).type.toBe>(); expect(List().set(0, 'a')).type.toBe< List >(); expect(set(List(), 0, 0)).type.toBe>(); }); test('#first', () => { const a = List().first(); // ^? expect(List().first()).type.toBe(); expect(List().first('first')).type.toBe(); }); test('#last', () => { expect(List().last()).type.toBe(); expect(List().last('last')).type.toBe(); }); test('#set', () => { expect(set(List(), 1, 'a')).type.toRaiseError(); expect(set(List(), 'a', 1)).type.toRaiseError(); }); test('#setIn', () => { expect(List().setIn([], 0)).type.toBe>(); expect(setIn(List(), [], 0)).type.toBe>(); }); test('#insert', () => { expect(List().insert(0, 0)).type.toBe>(); expect(List().insert(1, 'a')).type.toRaiseError(); expect(List().insert('a', 1)).type.toRaiseError(); expect(List().insert(0, 1)).type.toBe< List >(); expect(List().insert(0, 'a')).type.toBe< List >(); }); test('#push', () => { expect(List().push(0, 0)).type.toBe>(); expect(List().push(1, 'a')).type.toRaiseError(); expect(List().push('a', 1)).type.toRaiseError(); expect(List().push(0, 1)).type.toBe>(); expect(List().push(0, 'a')).type.toBe< List >(); }); test('#unshift', () => { expect(List().unshift(0, 0)).type.toBe>(); expect(List().unshift(1, 'a')).type.toRaiseError(); expect(List().unshift('a', 1)).type.toRaiseError(); expect(List().unshift(0, 1)).type.toBe< List >(); expect(List().unshift(0, 'a')).type.toBe< List >(); }); test('#delete', () => { expect(List().delete(0)).type.toBe>(); expect(List().delete('a')).type.toRaiseError(); }); test('#deleteIn', () => { expect(List().deleteIn([])).type.toBe>(); }); test('#remove', () => { expect(List().remove(0)).type.toBe>(); expect(List().remove('a')).type.toRaiseError(); expect(remove(List(), 0)).type.toBe>(); }); test('#removeIn', () => { expect(List().removeIn([])).type.toBe>(); expect(removeIn(List(), [])).type.toBe>(); }); test('#clear', () => { expect(List().clear()).type.toBe>(); expect(List().clear(10)).type.toRaiseError(); }); test('#pop', () => { expect(List().pop()).type.toBe>(); expect(List().pop(10)).type.toRaiseError(); }); test('#shift', () => { expect(List().shift()).type.toBe>(); expect(List().shift(10)).type.toRaiseError(); }); test('#update', () => { expect(List().update((v) => 1)).type.toBe(); expect( List().update((v: List | undefined) => v) ).type.toRaiseError(); expect(List().update(0, (v: number | undefined) => 0)).type.toBe< List >(); expect( List().update(0, (v: number | undefined) => v + 'a') ).type.toRaiseError(); expect(List().update(1, 10, (v: number | undefined) => 0)).type.toBe< List >(); expect( List().update(1, 'a', (v: number | undefined) => 0) ).type.toRaiseError(); expect( List().update(1, 10, (v: number | undefined) => v + 'a') ).type.toRaiseError(); expect(List().update(1, (v) => v?.toUpperCase())).type.toBe< List >(); expect(update(List(), 0, (v: number | undefined) => 0)).type.toBe< List >(); expect( update(List(), 1, 10, (v: number) => v + 'a') ).type.toRaiseError(); }); test('#updateIn', () => { expect(List().updateIn([], (v) => v)).type.toBe>(); expect(List().updateIn([], 10)).type.toRaiseError(); expect(updateIn(List(), [], (v) => v)).type.toBe>(); }); test('#map', () => { expect( List().map((value: number, key: number, iter: List) => 1) ).type.toBe>(); expect( List().map((value: number, key: number, iter: List) => 'a') ).type.toBe>(); expect( List().map( (value: number, key: number, iter: List) => 1 ) ).type.toBe>(); expect( List().map( (value: number, key: number, iter: List) => 1 ) ).type.toRaiseError(); expect( List().map( (value: string, key: number, iter: List) => 1 ) ).type.toRaiseError(); expect( List().map( (value: number, key: string, iter: List) => 1 ) ).type.toRaiseError(); expect( List().map( (value: number, key: number, iter: List) => 1 ) ).type.toRaiseError(); expect( List().map( (value: number, key: number, iter: List) => 'a' ) ).type.toRaiseError(); }); test('#flatMap', () => { expect( List().flatMap((value: number, key: number, iter: List) => [ 1, ]) ).type.toBe>(); expect( List().flatMap((value: number, key: number, iter: List) => [ 'a', ]) ).type.toBe>(); expect(List>().flatMap((list) => list)).type.toBe< List >(); expect( List().flatMap( (value: number, key: number, iter: List) => [1] ) ).type.toBe>(); expect( List().flatMap( (value: number, key: number, iter: List) => [1] ) ).type.toRaiseError(); expect( List().flatMap( (value: string, key: number, iter: List) => [1] ) ).type.toRaiseError(); expect( List().flatMap( (value: number, key: string, iter: List) => [1] ) ).type.toRaiseError(); expect( List().flatMap( (value: number, key: number, iter: List) => [1] ) ).type.toRaiseError(); expect( List().flatMap( (value: number, key: number, iter: List) => ['a'] ) ).type.toRaiseError(); }); test('#merge', () => { expect(List().merge(List())).type.toBe>(); expect(List().merge(List())).type.toBe< List >(); expect(List().merge(List())).type.toBe< List >(); expect(List().merge(List())).type.toBe< List >(); expect(merge(List(), List())).type.toBe>(); }); test('#mergeIn', () => { expect(List().mergeIn([], [])).type.toBe>(); }); test('#mergeDeepIn', () => { expect(List().mergeDeepIn([], [])).type.toBe>(); }); test('#flatten', () => { expect(List().flatten()).type.toBe< Immutable.Collection >(); expect(List().flatten(10)).type.toBe< Immutable.Collection >(); expect(List().flatten(false)).type.toBe< Immutable.Collection >(); expect(List().flatten('a')).type.toRaiseError(); }); test('#withMutations', () => { expect(List().withMutations((mutable) => mutable)).type.toBe< List >(); expect( List().withMutations((mutable: List) => mutable) ).type.toRaiseError(); }); test('#asMutable', () => { expect(List().asMutable()).type.toBe>(); }); test('#asImmutable', () => { expect(List().asImmutable()).type.toBe>(); }); test('#toJS', () => { expect(List>().toJS()).type.toBe(); }); test('#toJSON', () => { expect(List>().toJSON()).type.toBe[]>(); }); test('for of loops', () => { const list = List([1, 2, 3, 4]); for (const val of list) { expect(val).type.toBe(); } }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/map.ts000066400000000000000000000431251522056416100252340ustar00rootroot00000000000000import { List, Map, MapOf, OrderedMap } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('#constructor', () => { expect(Map()).type.toBe>(); expect(Map()).type.toBe>(); expect(Map([[1, 'a']])).type.toBe>(); expect(Map([['a', 'a']])).type.toBe>(); expect(Map([] as ReadonlyArray)).type.toBe< Map >(); expect(Map(List<[number, string]>([[1, 'a']]))).type.toBe< Map >(); expect(Map({ a: 1 })).type.toBe>(); expect(Map({ a: 1, b: 'b' })).type.toBe>(); expect(Map({ a: Map({ b: Map({ c: 3 }) }) })).type.toBe< MapOf<{ a: MapOf<{ b: MapOf<{ c: number }> }> }> >(); expect(Map<{ a: string }>({ a: 1 })).type.toRaiseError(); expect(Map<{ a: string }>({ a: 'a', b: 'b' })).type.toRaiseError(); // TODO this type is really weird, it should be `Map` or MapOf<{ a: string }> See https://github.com/immutable-js/immutable-js/pull/1991#discussion_r1510863932 expect(Map(List([List(['a', 'b'])]))).type.toBe>>>(); expect(Map([[1, 'a']])).type.not.toBeAssignableTo>(); expect(Map<'status', string>({ status: 'paid' })).type.toBe< Map<'status', string> >(); expect(Map<'status' | 'amount', string>({ status: 'paid' })).type.toBe< Map<'status' | 'amount', string> >(); expect( Map<'status', string>({ status: 'paid', amount: 10 }) ).type.toRaiseError(); }); test('#size', () => { expect(pick(Map(), 'size')).type.toBe<{ readonly size: number }>(); }); test('#get', () => { expect(Map().get(4)).type.toBe(); expect(Map().get(4, 'a')).type.toBe(); expect(Map().get(4, 'a')).type.toRaiseError(); expect(Map({ a: 4, b: true }).get('a')).type.toBe(); expect(Map({ a: 4, b: true }).get('b')).type.toBe(); expect( Map({ a: Map({ b: true }) }) .get('a') .get('b') ).type.toBe(); expect(Map({ a: 4 }).get('b')).type.toRaiseError(); expect(Map({ a: 4 }).get('b', undefined)).type.toBe(); expect(Map({ 1: 4 }).get(1)).type.toBe(); expect(Map({ 1: 4 }).get(2)).type.toRaiseError(); expect(Map({ 1: 4 }).get(2, 3)).type.toBe<3>(); const s1 = Symbol('s1'); expect(Map({ [s1]: 4 }).get(s1)).type.toBe(); const s2 = Symbol('s2'); expect(Map({ [s2]: 4 }).get(s1)).type.toRaiseError(); }); test('#getIn', () => { const result = Map({ a: 4, b: true }).getIn(['a']); expect(result).type.toBe(); expect(Map({ a: 4, b: true }).getIn(['a' as const])).type.toBe(); expect( Map({ a: Map({ b: Map({ c: Map({ d: 4 }) }) }) }).getIn([ 'a' as const, 'b' as const, 'c' as const, 'd' as const, ]) ).type.toBe(); expect(Map({ a: [1] }).getIn(['a' as const, 0])).type.toBe(); expect(Map({ a: List([1]) }).getIn(['a' as const, 0])).type.toBe(); }); test('#set', () => { expect(Map().set(0, 0)).type.toBe>(); expect(Map().set(1, 'a')).type.toRaiseError(); expect(Map().set('a', 1)).type.toRaiseError(); expect(Map().set(0, 1)).type.toBe< Map >(); expect(Map().set(0, 'a')).type.toBe< Map >(); expect(Map({ a: 1 }).set('b', 'b')).type.toRaiseError(); expect(Map<{ a: number; b?: string }>({ a: 1 }).set('b', 'b')).type.toBe< MapOf<{ a: number; b?: string | undefined }> >(); expect( Map<{ a: number; b?: string }>({ a: 1 }).set('b', undefined) ).type.toBe>(); expect( Map<{ a: number; b?: string }>({ a: 1 }).set('b', 'b').get('a') ).type.toBe(); expect( Map<{ a: number; b?: string }>({ a: 1 }).set('b', 'b').get('b') ).type.toBe(); const customer = Map<{ phone: string | number }>({ phone: 'bar', }); expect(customer.set('phone', 8)).type.toBeAssignableTo(customer); }); test('#setIn', () => { expect(Map().setIn([], 0)).type.toBe>(); }); test('#delete', () => { expect(Map().delete(0)).type.toBe>(); expect(Map().delete('a')).type.toRaiseError(); expect(Map({ a: 1, b: 'b' }).delete('b')).type.toBe(); expect( Map<{ a: number; b?: string }>({ a: 1, b: 'b' }).delete('b') ).type.toBe>(); expect( Map<{ a?: number; b?: string }>({ a: 1, b: 'b' }).remove('b').delete('a') ).type.toBe>(); expect( Map<{ a: number; b?: string }>({ a: 1, b: 'b' }).remove('b').get('a') ).type.toBe(); expect( Map<{ a: number; b?: string }>({ a: 1, b: 'b' }).remove('b').get('b') ).type.toBe(); }); test('#deleteAll', () => { expect(Map().deleteAll([0])).type.toBe>(); expect(Map().deleteAll([0, 'a'])).type.toRaiseError(); }); test('#deleteIn', () => { expect(Map().deleteIn([])).type.toBe>(); }); test('#remove', () => { expect(Map().remove(0)).type.toBe>(); expect(Map().remove('a')).type.toRaiseError(); }); test('#removeAll', () => { expect(Map().removeAll([0])).type.toBe>(); expect(Map().removeAll([0, 'a'])).type.toRaiseError(); }); test('#removeIn', () => { expect(Map().removeIn([])).type.toBe>(); }); test('#clear', () => { expect(Map().clear()).type.toBe>(); expect(Map().clear(10)).type.toRaiseError(); }); test('#update', () => { expect(Map().update((v) => 1)).type.toBe(); expect( Map().update((v: Map | undefined) => v) ).type.toRaiseError(); expect( Map().update(0, (v: number | undefined) => 0) ).type.toBe>(); expect( Map().update(0, (v: number | undefined) => v + 'a') ).type.toRaiseError(); expect( Map().update(1, 10, (v: number | undefined) => 0) ).type.toBe>(); expect( Map().update(1, 'a', (v: number | undefined) => 0) ).type.toRaiseError(); expect( Map().update(1, 10, (v: number | undefined) => v + 'a') ).type.toRaiseError(); expect(Map({ a: 1, b: 'b' }).update('c', (v) => v)).type.toRaiseError(); expect(Map({ a: 1, b: 'b' }).update('b', (v) => v.toUpperCase())).type.toBe< MapOf<{ a: number; b: string }> >(); expect( Map({ a: 1, b: 'b' }).update('b', 'NSV', (v) => v.toUpperCase()) ).type.toBe>(); expect(Map({ a: 1, b: 'b' }).update((v) => ({ a: 'a' }))).type.toRaiseError(); expect( Map({ a: 1, b: 'b' }).update((v) => v.set('a', 2).set('b', 'B')) ).type.toBe>(); expect( Map({ a: 1, b: 'b' }).update((v) => v.set('c', 'c')) ).type.toRaiseError(); expect( Map().update('noKey', (ls) => ls?.toUpperCase()) ).type.toBe>(); }); test('#updateIn', () => { expect(Map().updateIn([], (v) => v)).type.toBe< Map >(); expect(Map().updateIn([], 10)).type.toRaiseError(); }); test('#map', () => { expect( Map().map( (value: number, key: number, iter: Map) => 1 ) ).type.toBe>(); expect( Map().map( (value: number, key: number, iter: Map) => 'a' ) ).type.toBe>(); expect( Map().map( (value: number, key: number, iter: Map) => 1 ) ).type.toBe>(); expect( Map().map( (value: number, key: number, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().map( (value: string, key: number, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().map( (value: number, key: string, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().map( (value: number, key: number, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().map( (value: number, key: number, iter: Map) => 'a' ) ).type.toRaiseError(); }); test('#mapKeys', () => { expect( Map().mapKeys( (value: number, key: number, iter: Map) => 1 ) ).type.toBe>(); expect( Map().mapKeys( (value: number, key: number, iter: Map) => 'a' ) ).type.toBe>(); expect( Map().mapKeys( (value: number, key: number, iter: Map) => 1 ) ).type.toBe>(); expect( Map().mapKeys( (value: number, key: number, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().mapKeys( (value: string, key: number, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().mapKeys( (value: number, key: string, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().mapKeys( (value: number, key: number, iter: Map) => 1 ) ).type.toRaiseError(); expect( Map().mapKeys( (value: number, key: number, iter: Map) => 'a' ) ).type.toRaiseError(); }); test('#flatMap', () => { expect( Map().flatMap( (value: number, key: number, iter: Map) => [[0, 1]] ) ).type.toBe>(); expect( Map().flatMap( (value: number, key: number, iter: Map) => [['a', 'b']] ) ).type.toBe>(); expect( Map().flatMap( (value: number, key: number, iter: Map) => [[0, 1]] ) ).type.toBe>(); expect( Map().flatMap( (value: number, key: number, iter: Map) => [[0, 1]] ) ).type.toRaiseError(); expect( Map().flatMap( (value: string, key: number, iter: Map) => [[0, 1]] ) ).type.toRaiseError(); expect( Map().flatMap( (value: number, key: string, iter: Map) => [[0, 1]] ) ).type.toRaiseError(); expect( Map().flatMap( (value: number, key: number, iter: Map) => [[0, 1]] ) ).type.toRaiseError(); expect( Map().flatMap( (value: number, key: number, iter: Map) => [[0, 'a']] ) ).type.toRaiseError(); }); test('#merge', () => { expect(Map().merge({ a: 1 })).type.toBe< Map >(); expect(Map().merge({ a: { b: 1 } })).type.toBe< Map >(); expect(Map().merge(Map())).type.toBe< Map >(); expect(Map().merge(Map())).type.toBe< Map >(); expect(Map().merge(Map())).type.toBe< Map >(); expect(Map().merge(Map())).type.toBe< Map >(); expect(Map({ a: 1 }).merge(Map({ b: 2 }))).type.toBe< Map<'b' | 'a', number> >(); }); test('#mergeIn', () => { expect(Map().mergeIn([], [])).type.toBe< Map >(); }); test('#mergeWith', () => { expect( Map().mergeWith( (prev: number, next: number, key: number) => 1, Map() ) ).type.toBe>(); expect( Map().mergeWith( (prev: string, next: number, key: number) => 1, Map() ) ).type.toRaiseError(); expect( Map().mergeWith( (prev: number, next: string, key: number) => 1, Map() ) ).type.toRaiseError(); expect( Map().mergeWith( (prev: number, next: number, key: string) => 1, Map() ) ).type.toRaiseError(); expect( Map().mergeWith( (prev: number, next: number, key: number) => 'a', Map() ) ).type.toBe>(); expect( Map().mergeWith( (prev: number, next: number, key: number) => 1, Map() ) ).type.toRaiseError(); expect( Map().mergeWith( (prev: number, next: number, key: string) => 1, { a: 1 } ) ).type.toBe>(); expect( Map().mergeWith( (prev: number, next: number, key: string) => 1, { a: 'a' } ) ).type.toRaiseError(); expect( Map().mergeWith( (prev: number, next: number | string, key: string) => 1, { a: 'a' } ) ).type.toBe>(); expect( Map().mergeWith( (prev: number | string, next: number | string, key: number) => 1, Map() ) ).type.toBe>(); }); test('#mergeDeep', () => { expect(Map().mergeDeep({ a: 1 })).type.toBe< Map >(); expect(Map().mergeDeep({ a: { b: 1 } })).type.toBe< Map >(); expect(Map().mergeDeep(Map({ a: { b: 1 } }))).type.toBe< Map >(); expect(Map().mergeDeep(Map())).type.toBe< Map >(); expect(Map().mergeDeep(Map())).type.toBe< Map >(); expect( Map().mergeDeep(Map()) ).type.toBe>(); expect( Map().mergeDeep(Map()) ).type.toBe>(); }); test('#mergeDeepIn', () => { expect(Map().mergeDeepIn([], [])).type.toBe< Map >(); }); test('#mergeDeepWith', () => { expect( Map().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, Map() ) ).type.toBe>(); expect( Map().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, Map() ) ).type.toRaiseError(); expect( Map().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, { a: 1 } ) ).type.toBe>(); expect( Map().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, { a: 'a' } ) ).type.toRaiseError(); expect( Map().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, Map() ) ).type.toBe>(); }); test('#flip', () => { expect(Map().flip()).type.toBe>(); }); test('#sort', () => { expect(Map().sort()).type.toBe< Map & OrderedMap >(); expect(Map().sort((a, b) => 1)).type.toBe< Map & OrderedMap >(); expect(Map({ a: 'a' }).sort()).type.toBe< MapOf<{ a: string }> & OrderedMap<'a', string> >(); }); test('#sortBy', () => { expect(Map().sortBy((v) => v)).type.toBe< Map & OrderedMap >(); expect( Map().sortBy( (v) => v, (a, b) => 1 ) ).type.toBe & OrderedMap>(); expect(Map({ a: 'a' }).sortBy((v) => v)).type.toBe< MapOf<{ a: string }> & OrderedMap<'a', string> >(); }); test('#withMutations', () => { expect(Map().withMutations((mutable) => mutable)).type.toBe< Map >(); expect( Map().withMutations((mutable: Map) => mutable) ).type.toRaiseError(); }); test('#asMutable', () => { expect(Map().asMutable()).type.toBe>(); }); test('#asImmutable', () => { expect(Map().asImmutable()).type.toBe>(); }); test('#toJS', () => { expect(Map().toJS()).type.toBe<{ [x: string]: number; [x: number]: number; [x: symbol]: number; }>(); expect(Map({ a: 'A' }).toJS()).type.toBe<{ a: string }>(); expect(Map({ a: Map({ b: 'b' }) }).toJS()).type.toBe<{ a: { b: string }; }>(); }); test('#toJSON', () => { expect(Map({ a: Map({ b: 'b' }) }).toJSON()).type.toBe<{ a: MapOf<{ b: string }>; }>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/ordered-map.ts000066400000000000000000000325311522056416100266550ustar00rootroot00000000000000import { List, OrderedMap } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('#constructor', () => { expect(OrderedMap()).type.toBe>(); expect(OrderedMap()).type.toBe>(); expect(OrderedMap([[1, 'a']])).type.toBe>(); expect(OrderedMap(List<[number, string]>([[1, 'a']]))).type.toBe< OrderedMap >(); expect(OrderedMap({ a: 1 })).type.toBe>(); // No longer works in typescript@>=3.9 // // $ExpectError - TypeScript does not support Lists as tuples // OrderedMap(List([List(['a', 'b'])])); }); test('#size', () => { expect(pick(OrderedMap(), 'size')).type.toBe<{ readonly size: number }>(); }); test('#get', () => { expect(OrderedMap().get(4)).type.toBe(); expect(OrderedMap().get(4, 'a')).type.toBe(); expect(OrderedMap().get(4, 'a')).type.toRaiseError(); }); test('#set', () => { expect(OrderedMap().set(0, 0)).type.toBe< OrderedMap >(); expect(OrderedMap().set(1, 'a')).type.toRaiseError(); expect(OrderedMap().set('a', 1)).type.toRaiseError(); expect(OrderedMap().set(0, 1)).type.toBe< OrderedMap >(); expect(OrderedMap().set(0, 'a')).type.toBe< OrderedMap >(); }); test('#setIn', () => { expect(OrderedMap().setIn([], 0)).type.toBe< OrderedMap >(); }); test('#delete', () => { expect(OrderedMap().delete(0)).type.toBe< OrderedMap >(); expect(OrderedMap().delete('a')).type.toRaiseError(); }); test('#deleteAll', () => { expect(OrderedMap().deleteAll([0])).type.toBe< OrderedMap >(); expect(OrderedMap().deleteAll([0, 'a'])).type.toRaiseError(); }); test('#deleteIn', () => { expect(OrderedMap().deleteIn([])).type.toBe< OrderedMap >(); }); test('#remove', () => { expect(OrderedMap().remove(0)).type.toBe< OrderedMap >(); expect(OrderedMap().remove('a')).type.toRaiseError(); }); test('#removeAll', () => { expect(OrderedMap().removeAll([0])).type.toBe< OrderedMap >(); expect(OrderedMap().removeAll([0, 'a'])).type.toRaiseError(); }); test('#removeIn', () => { expect(OrderedMap().removeIn([])).type.toBe< OrderedMap >(); }); test('#clear', () => { expect(OrderedMap().clear()).type.toBe< OrderedMap >(); expect(OrderedMap().clear(10)).type.toRaiseError(); }); test('#update', () => { expect(OrderedMap().update((v) => 1)).type.toBe(); expect( OrderedMap().update( (v: OrderedMap | undefined) => v ) ).type.toRaiseError(); expect( OrderedMap().update(0, (v: number | undefined) => 0) ).type.toBe>(); expect( OrderedMap().update(0, (v: number | undefined) => v + 'a') ).type.toRaiseError(); expect( OrderedMap().update(1, 10, (v: number | undefined) => 0) ).type.toBe>(); expect( OrderedMap().update(1, 'a', (v: number | undefined) => 0) ).type.toRaiseError(); expect( OrderedMap().update( 1, 10, (v: number | undefined) => v + 'a' ) ).type.toRaiseError(); }); test('#updateIn', () => { expect(OrderedMap().updateIn([], (v) => v)).type.toBe< OrderedMap >(); expect(OrderedMap().updateIn([], 10)).type.toRaiseError(); }); test('#map', () => { expect( OrderedMap().map( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toBe>(); expect( OrderedMap().map( (value: number, key: number, iter: OrderedMap) => 'a' ) ).type.toBe>(); expect( OrderedMap().map( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toBe>(); expect( OrderedMap().map( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().map( (value: string, key: number, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().map( (value: number, key: string, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().map( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().map( (value: number, key: number, iter: OrderedMap) => 'a' ) ).type.toRaiseError(); }); test('#mapKeys', () => { expect( OrderedMap().mapKeys( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toBe>(); expect( OrderedMap().mapKeys( (value: number, key: number, iter: OrderedMap) => 'a' ) ).type.toBe>(); expect( OrderedMap().mapKeys( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toBe>(); expect( OrderedMap().mapKeys( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().mapKeys( (value: string, key: number, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().mapKeys( (value: number, key: string, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().mapKeys( (value: number, key: number, iter: OrderedMap) => 1 ) ).type.toRaiseError(); expect( OrderedMap().mapKeys( (value: number, key: number, iter: OrderedMap) => 'a' ) ).type.toRaiseError(); }); test('#flatMap', () => { expect( OrderedMap().flatMap( (value: number, key: number, iter: OrderedMap) => [[0, 1]] ) ).type.toBe>(); expect( OrderedMap().flatMap( (value: number, key: number, iter: OrderedMap) => [ ['a', 'b'], ] ) ).type.toBe>(); expect( OrderedMap().flatMap( (value: number, key: number, iter: OrderedMap) => [[0, 1]] ) ).type.toBe>(); expect( OrderedMap().flatMap( (value: number, key: number, iter: OrderedMap) => [[0, 1]] ) ).type.toRaiseError(); expect( OrderedMap().flatMap( (value: string, key: number, iter: OrderedMap) => [[0, 1]] ) ).type.toRaiseError(); expect( OrderedMap().flatMap( (value: number, key: string, iter: OrderedMap) => [[0, 1]] ) ).type.toRaiseError(); expect( OrderedMap().flatMap( (value: number, key: number, iter: OrderedMap) => [[0, 1]] ) ).type.toRaiseError(); expect( OrderedMap().flatMap( (value: number, key: number, iter: OrderedMap) => [ [0, 'a'], ] ) ).type.toRaiseError(); }); test('#merge', () => { expect(OrderedMap().merge({ a: 1 })).type.toBe< OrderedMap >(); expect(OrderedMap().merge({ a: { b: 1 } })).type.toBe< OrderedMap >(); expect( OrderedMap().merge(OrderedMap()) ).type.toBe>(); expect( OrderedMap().merge(OrderedMap()) ).type.toBe>(); expect( OrderedMap().merge(OrderedMap()) ).type.toBe>(); expect( OrderedMap().merge(OrderedMap()) ).type.toBe>(); }); test('#mergeIn', () => { expect(OrderedMap().mergeIn([], [])).type.toBe< OrderedMap >(); }); test('#mergeWith', () => { expect( OrderedMap().mergeWith( (prev: number, next: number, key: number) => 1, OrderedMap() ) ).type.toBe>(); expect( OrderedMap().mergeWith( (prev: string, next: number, key: number) => 1, OrderedMap() ) ).type.toRaiseError(); expect( OrderedMap().mergeWith( (prev: number, next: string, key: number) => 1, OrderedMap() ) ).type.toRaiseError(); expect( OrderedMap().mergeWith( (prev: number, next: number, key: string) => 1, OrderedMap() ) ).type.toRaiseError(); expect( OrderedMap().mergeWith( (prev: number, next: number, key: number) => 'a', OrderedMap() ) ).type.toBe>(); expect( OrderedMap().mergeWith( (prev: number, next: number, key: number) => 1, OrderedMap() ) ).type.toRaiseError(); expect( OrderedMap().mergeWith( (prev: number, next: number, key: string) => 1, { a: 1 } ) ).type.toBe>(); expect( OrderedMap().mergeWith( (prev: number, next: number, key: string) => 1, { a: 'a' } ) ).type.toRaiseError(); expect( OrderedMap().mergeWith( (prev: number | string, next: number | string, key: number) => 1, OrderedMap() ) ).type.toBe>(); }); test('#mergeDeep', () => { expect(OrderedMap().mergeDeep({ a: 1 })).type.toBe< OrderedMap >(); expect(OrderedMap().mergeDeep({ a: { b: 1 } })).type.toBe< OrderedMap >(); expect( OrderedMap().mergeDeep(OrderedMap()) ).type.toBe>(); expect( OrderedMap().mergeDeep(OrderedMap()) ).type.toBe>(); expect( OrderedMap().mergeDeep( OrderedMap() ) ).type.toBe>(); expect( OrderedMap().mergeDeep( OrderedMap() ) ).type.toBe>(); }); test('#mergeDeepIn', () => { expect(OrderedMap().mergeDeepIn([], [])).type.toBe< OrderedMap >(); }); test('#mergeDeepWith', () => { expect( OrderedMap().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, OrderedMap() ) ).type.toBe>(); expect( OrderedMap().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, OrderedMap() ) ).type.toRaiseError(); expect( OrderedMap().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, { a: 1 } ) ).type.toBe>(); expect( OrderedMap().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, { a: 'a' } ) ).type.toRaiseError(); expect( OrderedMap().mergeDeepWith( (prev: unknown, next: unknown, key: unknown) => 1, OrderedMap() ) ).type.toBe>(); }); test('#flip', () => { expect(OrderedMap().flip()).type.toBe< OrderedMap >(); }); test('#withMutations', () => { expect( OrderedMap().withMutations((mutable) => mutable) ).type.toBe>(); expect( OrderedMap().withMutations( (mutable: OrderedMap) => mutable ) ).type.toRaiseError(); }); test('#asMutable', () => { expect(OrderedMap().asMutable()).type.toBe< OrderedMap >(); }); test('#asImmutable', () => { expect(OrderedMap().asImmutable()).type.toBe< OrderedMap >(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/ordered-set.ts000066400000000000000000000161471522056416100267000ustar00rootroot00000000000000import { Collection, Map, OrderedSet } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('#constructor', () => { expect(OrderedSet()).type.toBe>(); expect(OrderedSet()).type.toBe>(); expect(OrderedSet([1, 'a'])).type.toBe>(); expect(OrderedSet([1, 'a'])).type.not.toBeAssignableTo(OrderedSet()); }); test('#size', () => { expect(pick(OrderedSet(), 'size')).type.toBe<{ readonly size: number }>(); }); test('.of', () => { expect(OrderedSet.of(1, 2, 3)).type.toBe>(); expect(OrderedSet.of('a', 1)).type.toRaiseError(); expect(OrderedSet.of('a', 1)).type.toBe< OrderedSet >(); }); test('.fromKeys', () => { expect(OrderedSet.fromKeys(Map())).type.toBe< OrderedSet >(); expect(OrderedSet.fromKeys(Map())).type.toBe< OrderedSet >(); expect(OrderedSet.fromKeys({ a: 1 })).type.toBe>(); expect( OrderedSet.fromKeys(Map()) ).type.toRaiseError(); expect( OrderedSet.fromKeys(Map()) ).type.toBe>(); }); test('#get', () => { expect(OrderedSet().get(4)).type.toBe(); expect(OrderedSet().get(4, 'a')).type.toBe(); expect(OrderedSet().get(4, 'a')).type.toRaiseError(); }); test('#delete', () => { expect(OrderedSet().delete(0)).type.toBe>(); expect(OrderedSet().delete('a')).type.toRaiseError(); }); test('#remove', () => { expect(OrderedSet().remove(0)).type.toBe>(); expect(OrderedSet().remove('a')).type.toRaiseError(); }); test('#clear', () => { expect(OrderedSet().clear()).type.toBe>(); expect(OrderedSet().clear(10)).type.toRaiseError(); }); test('#map', () => { expect( OrderedSet().map( (value: number, key: number, iter: OrderedSet) => 1 ) ).type.toBe>(); expect( OrderedSet().map( (value: number, key: number, iter: OrderedSet) => 'a' ) ).type.toBe>(); expect( OrderedSet().map( (value: number, key: number, iter: OrderedSet) => 1 ) ).type.toBe>(); expect( OrderedSet().map( (value: number, key: number, iter: OrderedSet) => 1 ) ).type.toRaiseError(); expect( OrderedSet().map( (value: string, key: number, iter: OrderedSet) => 1 ) ).type.toRaiseError(); expect( OrderedSet().map( (value: number, key: string, iter: OrderedSet) => 1 ) ).type.toRaiseError(); expect( OrderedSet().map( (value: number, key: number, iter: OrderedSet) => 1 ) ).type.toRaiseError(); expect( OrderedSet().map( (value: number, key: number, iter: OrderedSet) => 'a' ) ).type.toRaiseError(); }); test('#flatMap', () => { expect( OrderedSet().flatMap( (value: number, key: number, iter: OrderedSet) => [1] ) ).type.toBe>(); expect( OrderedSet().flatMap( (value: number, key: number, iter: OrderedSet) => ['a'] ) ).type.toBe>(); expect( OrderedSet().flatMap( (value: number, key: number, iter: OrderedSet) => [1] ) ).type.toBe>(); expect( OrderedSet().flatMap( (value: number, key: number, iter: OrderedSet) => [1] ) ).type.toRaiseError(); expect( OrderedSet().flatMap( (value: string, key: number, iter: OrderedSet) => [1] ) ).type.toRaiseError(); expect( OrderedSet().flatMap( (value: number, key: string, iter: OrderedSet) => [1] ) ).type.toRaiseError(); expect( OrderedSet().flatMap( (value: number, key: number, iter: OrderedSet) => [1] ) ).type.toRaiseError(); expect( OrderedSet().flatMap( (value: number, key: number, iter: OrderedSet) => ['a'] ) ).type.toRaiseError(); }); test('#union', () => { expect(OrderedSet().union(OrderedSet())).type.toBe< OrderedSet >(); expect(OrderedSet().union(OrderedSet())).type.toBe< OrderedSet >(); expect(OrderedSet().union(OrderedSet())).type.toBe< OrderedSet >(); expect(OrderedSet().union(OrderedSet())).type.toBe< OrderedSet >(); }); test('#merge', () => { expect(OrderedSet().merge(OrderedSet())).type.toBe< OrderedSet >(); expect(OrderedSet().merge(OrderedSet())).type.toBe< OrderedSet >(); expect(OrderedSet().merge(OrderedSet())).type.toBe< OrderedSet >(); expect(OrderedSet().merge(OrderedSet())).type.toBe< OrderedSet >(); }); test('#intersect', () => { expect(OrderedSet().intersect(OrderedSet())).type.toBe< OrderedSet >(); expect( OrderedSet().intersect(OrderedSet()) ).type.toRaiseError(); expect( OrderedSet().intersect(OrderedSet()) ).type.toBe>(); expect( OrderedSet().intersect(OrderedSet()) ).type.toBe>(); }); test('#subtract', () => { expect(OrderedSet().subtract(OrderedSet())).type.toBe< OrderedSet >(); expect( OrderedSet().subtract(OrderedSet()) ).type.toRaiseError(); expect( OrderedSet().subtract(OrderedSet()) ).type.toBe>(); expect( OrderedSet().subtract(OrderedSet()) ).type.toBe>(); }); test('#flatten', () => { expect(OrderedSet().flatten()).type.toBe< Collection >(); expect(OrderedSet().flatten(10)).type.toBe< Collection >(); expect(OrderedSet().flatten(false)).type.toBe< Collection >(); expect(OrderedSet().flatten('a')).type.toRaiseError(); }); test('#withMutations', () => { expect(OrderedSet().withMutations((mutable) => mutable)).type.toBe< OrderedSet >(); expect( OrderedSet().withMutations((mutable: OrderedSet) => mutable) ).type.toRaiseError(); }); test('#asMutable', () => { expect(OrderedSet().asMutable()).type.toBe>(); }); test('#asImmutable', () => { expect(OrderedSet().asImmutable()).type.toBe>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/partition.ts000066400000000000000000000102651522056416100264670ustar00rootroot00000000000000/* eslint-disable @typescript-eslint/no-unused-expressions */ import { Collection, List, Map, OrderedMap, OrderedSet, Seq, Set, } from 'immutable'; import { expect, test } from 'tstyche'; abstract class A {} class B extends A {} test('Collection', () => { type Indexed = Collection.Indexed; type Keyed = Collection.Keyed; type Set = Collection.Set; (c: Collection) => { expect(c.partition((x) => x % 2)).type.toBe< [Collection, Collection] >(); }; (c: Collection) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Collection, Collection] >(); }; (c: Keyed) => { expect(c.partition((x) => x % 2)).type.toBe< [Keyed, Keyed] >(); }; (c: Keyed) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Keyed, Keyed] >(); }; (c: Indexed) => { expect(c.partition((x) => x % 2)).type.toBe< [Indexed, Indexed] >(); }; (c: Indexed) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Indexed, Indexed] >(); }; (c: Set) => { expect(c.partition((x) => x % 2)).type.toBe<[Set, Set]>(); }; (c: Set) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Set, Set] >(); }; }); test('Seq', () => { type Indexed = Seq.Indexed; type Keyed = Seq.Keyed; type Set = Seq.Set; (c: Seq) => { expect(c.partition((x) => x % 2)).type.toBe< [Seq, Seq] >(); }; (c: Seq) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Seq, Seq] >(); }; (c: Keyed) => { expect(c.partition((x) => x % 2)).type.toBe< [Keyed, Keyed] >(); }; (c: Keyed) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Keyed, Keyed] >(); }; (c: Indexed) => { expect(c.partition((x) => x % 2)).type.toBe< [Indexed, Indexed] >(); }; (c: Indexed) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Indexed, Indexed] >(); }; (c: Set) => { expect(c.partition((x) => x % 2)).type.toBe<[Set, Set]>(); }; (c: Set) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Set, Set] >(); }; }); test('Map', () => { (c: Map) => { expect(c.partition((x) => x % 2)).type.toBe< [Map, Map] >(); }; (c: Map) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Map, Map] >(); }; }); test('OrderedMap', () => { (c: OrderedMap) => { expect(c.partition((x) => x % 2)).type.toBe< [OrderedMap, OrderedMap] >(); }; (c: OrderedMap) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [OrderedMap, OrderedMap] >(); }; }); test('List', () => { (c: List) => { expect(c.partition((x) => x % 2)).type.toBe<[List, List]>(); }; (c: List) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [List, List] >(); }; }); test('Set', () => { (c: Set) => { expect(c.partition((x) => x % 2)).type.toBe<[Set, Set]>(); }; (c: Set) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [Set, Set] >(); }; }); test('OrderedSet', () => { (c: OrderedSet) => { expect(c.partition((x) => x % 2)).type.toBe< [OrderedSet, OrderedSet] >(); }; (c: OrderedSet) => { expect(c.partition((x): x is B => x instanceof B)).type.toBe< [OrderedSet, OrderedSet] >(); }; }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/range.ts000066400000000000000000000004571522056416100255540ustar00rootroot00000000000000import { Range, Seq } from 'immutable'; import { expect, test } from 'tstyche'; test('#constructor', () => { expect(Range(0, 0, 1)).type.toBe>(); expect(Range('a', 0, 0)).type.toRaiseError(); expect(Range()).type.toRaiseError(); expect(Range(1)).type.toRaiseError(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/record.ts000066400000000000000000000050731522056416100257350ustar00rootroot00000000000000import { List, Map, MapOf, Record, RecordOf, Set } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('Factory', () => { const PointXY = Record({ x: 0, y: 0 }); expect(PointXY).type.toBe>(); expect(PointXY({ x: 'a' })).type.toRaiseError(); const pointXY = PointXY(); expect(pointXY).type.toBe< Record<{ x: number; y: number }> & Readonly<{ x: number; y: number }> >(); expect(pick(pointXY, 'x')).type.toBe<{ readonly x: number }>(); expect(pick(pointXY, 'y')).type.toBe<{ readonly y: number }>(); expect(pointXY.toJS()).type.toBe<{ x: number; y: number }>(); class PointClass extends PointXY { setX(x: number) { return this.set('x', x); } setY(y: number) { return this.set('y', y); } } const point = new PointClass(); expect(point).type.toBe(); expect(point.x).type.toBe(); expect(point.y).type.toBe(); expect(point.setX(10)).type.toBe(); expect(point.setY(10)).type.toBe(); expect(point.toJSON()).type.toBe<{ x: number; y: number }>(); expect(point.toJS()).type.toBe<{ x: number; y: number }>(); }); test('.getDescriptiveName', () => { const PointXY = Record({ x: 0, y: 0 }); expect(Record.getDescriptiveName(PointXY())).type.toBe(); expect(Record.getDescriptiveName({})).type.toRaiseError(); }); test('Factory', () => { const WithMap = Record({ map: Map({ a: 'A' }), list: List(['a']), set: Set(['a']), }); const withMap = WithMap(); expect(withMap.toJSON()).type.toBe<{ map: MapOf<{ a: string }>; list: List; set: Set; }>(); // should be `{ map: { a: string; }; list: string[]; set: string[]; }` but there is an issue with circular references expect(withMap.toJS()).type.toBe<{ map: unknown; list: unknown; set: unknown; }>(); }); test('optional properties', () => { interface Size { distance: string; } const Line = Record<{ size?: Size; color?: string }>({ size: undefined, color: 'red', }); const line = Line({}); // should be { size?: { distance: string; } | undefined; color?: string | undefined; } but there is an issue with circular references expect(line.toJS()).type.toBe<{ size?: unknown; color?: string | undefined; }>(); }); test('similar properties, but one is optional', () => { // see https://github.com/immutable-js/immutable-js/issues/1930 interface Id { value: string; } expect>().type.toBeAssignableTo>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/reduce.ts000066400000000000000000000046301522056416100257240ustar00rootroot00000000000000/* eslint-disable @typescript-eslint/no-unused-expressions */ import { Collection, List, Map, Set } from 'immutable'; import { expect, test } from 'tstyche'; test('reduce', () => { // With an initial value, the result type is the accumulator type `R`. (l: List) => { expect( l.reduce((acc: string, value) => acc + value, 'seed') ).type.toBe(); }; // With an initial value (overload 1), the reduction is typed `R`. (l: List) => { l.reduce((acc, value, key, iter) => { expect(acc).type.toBe(); expect(value).type.toBe(); expect(key).type.toBe(); expect(iter).type.toBe>(); return `${acc}${value}`; }, 'seed'); }; // Without an initial value and a reducer that returns a value (`R = V`), // the result type `V` is inferred from the values — no annotation needed. (l: List) => { expect(l.reduce((acc, value) => acc + value)).type.toBe(); }; // Without an initial value but a reducer that returns a different type `R`, // the reduction is typed `V | R`, since the first value (a `V`) seeds it. (l: List) => { expect( l.reduce((acc: string | number, value) => { expect(value).type.toBe(); return `${acc}${value}`; }) ).type.toBe(); }; // Keyed collection: key is `K`. (m: Map) => { m.reduce((acc, value, key, iter) => { expect(value).type.toBe(); expect(key).type.toBe(); expect(iter).type.toBe>(); return acc + value; }, 0); }; // Set collection: value and key are both `T`. (s: Set) => { s.reduce((acc, value, key) => { expect(value).type.toBe(); expect(key).type.toBe(); return acc + value; }, 0); }; // Base Collection. (c: Collection) => { expect( c.reduce((acc: boolean, value) => acc && value > 0, true) ).type.toBe(); }; }); test('reduceRight', () => { (l: List) => { expect( l.reduceRight((acc: string, value) => acc + value, 'seed') ).type.toBe(); }; (l: List) => { l.reduceRight((acc, value, key, iter) => { expect(value).type.toBe(); expect(key).type.toBe(); expect(iter).type.toBe>(); return acc + value; }, 0); }; }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/repeat.ts000066400000000000000000000004311522056416100257300ustar00rootroot00000000000000import { Repeat, Seq } from 'immutable'; import { expect, test } from 'tstyche'; test('#constructor', () => { expect(Repeat(0, 0)).type.toBe>(); expect(Repeat('a', 0)).type.toBe>(); expect(Repeat('a', 'b')).type.toRaiseError(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/seq.ts000066400000000000000000000014541522056416100252460ustar00rootroot00000000000000import { Seq } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('#constructor', () => { expect(Seq([1, 2, 3])).type.toBe>(); }); test('#size', () => { expect(pick(Seq(), 'size')).type.toBe<{ readonly size: number | undefined; }>(); }); test('Set.Indexed concat', () => { const s: Seq.Indexed = Seq([1]); expect(s).type.toBe>(); expect(s.concat([4, 5, 6])).type.toBe>(); expect(s.concat(Seq([4, 5, 6]))).type.toBe>(); }); test('Set concat', () => { const s: Seq = Seq([1]); expect(s).type.toBe>(); expect(s.concat([4, 5, 6])).type.toBe>(); expect(s.concat(Seq([4, 5, 6]))).type.toBe>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/set.ts000066400000000000000000000153171522056416100252540ustar00rootroot00000000000000import { Collection, Map, OrderedSet, Set } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('#constructor', () => { expect(Set()).type.toBe>(); expect(Set()).type.toBe>(); expect(Set([1, 'a'])).type.toBe>(); expect(Set([1, 'a'])).type.not.toBeAssignableTo>(); }); test('#size', () => { expect(pick(Set(), 'size')).type.toBe<{ readonly size: number }>(); }); test('.of', () => { expect(Set.of(1, 2, 3)).type.toBe>(); expect(Set.of('a', 1)).type.toRaiseError(); expect(Set.of('a', 1)).type.toBe>(); }); test('.fromKeys', () => { expect(Set.fromKeys(Map())).type.toBe>(); expect(Set.fromKeys(Map())).type.toBe>(); expect(Set.fromKeys({ a: 1 })).type.toBe>(); expect(Set.fromKeys(Map())).type.toRaiseError(); expect( Set.fromKeys(Map()) ).type.toBe>(); }); test('#get', () => { expect(Set().get(4)).type.toBe(); expect(Set().get(4, 'a')).type.toBe(); expect(Set().get(4, 'a')).type.toRaiseError(); }); test('#delete', () => { expect(Set().delete(0)).type.toBe>(); expect(Set().delete('a')).type.toRaiseError(); }); test('#remove', () => { expect(Set().remove(0)).type.toBe>(); expect(Set().remove('a')).type.toRaiseError(); }); test('#clear', () => { expect(Set().clear()).type.toBe>(); expect(Set().clear(10)).type.toRaiseError(); }); test('#map', () => { expect( Set().map((value: number, key: number, iter: Set) => 1) ).type.toBe>(); expect( Set().map((value: number, key: number, iter: Set) => 'a') ).type.toBe>(); expect( Set().map( (value: number, key: number, iter: Set) => 1 ) ).type.toBe>(); expect( Set().map( (value: number, key: number, iter: Set) => 1 ) ).type.toRaiseError(); expect( Set().map( (value: string, key: number, iter: Set) => 1 ) ).type.toRaiseError(); expect( Set().map( (value: number, key: string, iter: Set) => 1 ) ).type.toRaiseError(); expect( Set().map( (value: number, key: number, iter: Set) => 1 ) ).type.toRaiseError(); expect( Set().map( (value: number, key: number, iter: Set) => 'a' ) ).type.toRaiseError(); }); test('#flatMap', () => { expect( Set().flatMap((value: number, key: number, iter: Set) => [ 1, ]) ).type.toBe>(); expect( Set().flatMap((value: number, key: number, iter: Set) => [ 'a', ]) ).type.toBe>(); expect( Set().flatMap( (value: number, key: number, iter: Set) => [1] ) ).type.toBe>(); expect( Set().flatMap( (value: number, key: number, iter: Set) => [1] ) ).type.toRaiseError(); expect( Set().flatMap( (value: string, key: number, iter: Set) => [1] ) ).type.toRaiseError(); expect( Set().flatMap( (value: number, key: string, iter: Set) => [1] ) ).type.toRaiseError(); expect( Set().flatMap( (value: number, key: number, iter: Set) => [1] ) ).type.toRaiseError(); expect( Set().flatMap( (value: number, key: number, iter: Set) => ['a'] ) ).type.toRaiseError(); }); test('#union', () => { expect(Set().union(Set())).type.toBe>(); expect(Set().union(Set())).type.toBe>(); expect(Set().union(Set())).type.toBe< Set >(); expect(Set().union(Set())).type.toBe< Set >(); }); test('#merge', () => { expect(Set().merge(Set())).type.toBe>(); expect(Set().merge(Set())).type.toBe>(); expect(Set().merge(Set())).type.toBe< Set >(); expect(Set().merge(Set())).type.toBe< Set >(); }); test('#intersect', () => { expect(Set().intersect(Set())).type.toBe>(); expect(Set().intersect(Set())).type.toRaiseError(); expect(Set().intersect(Set())).type.toBe< Set >(); expect(Set().intersect(Set())).type.toBe< Set >(); }); test('#subtract', () => { expect(Set().subtract(Set())).type.toBe>(); expect(Set().subtract(Set())).type.toRaiseError(); expect(Set().subtract(Set())).type.toBe< Set >(); expect(Set().subtract(Set())).type.toBe< Set >(); }); test('#flatten', () => { expect(Set().flatten()).type.toBe>(); expect(Set().flatten(10)).type.toBe>(); expect(Set().flatten(false)).type.toBe< Collection >(); expect(Set().flatten('a')).type.toRaiseError(); }); test('#sort', () => { expect(Set().sort()).type.toBe & OrderedSet>(); expect(Set().sort((a, b) => 1)).type.toBe< Set & OrderedSet >(); }); test('#sortBy', () => { expect(Set().sortBy((v) => v)).type.toBe< Set & OrderedSet >(); expect( Set().sortBy( (v) => v, (a, b) => 1 ) ).type.toBe & OrderedSet>(); }); test('#withMutations', () => { expect(Set().withMutations((mutable) => mutable)).type.toBe< Set >(); expect( Set().withMutations((mutable: Set) => mutable) ).type.toRaiseError(); }); test('#asMutable', () => { expect(Set().asMutable()).type.toBe>(); }); test('#asImmutable', () => { expect(Set().asImmutable()).type.toBe>(); }); test('#toJS', () => { expect(Set>().toJS()).type.toBe(); }); test('#toJSON', () => { expect(Set>().toJSON()).type.toBe[]>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/stack.ts000066400000000000000000000126611522056416100255650ustar00rootroot00000000000000import { Collection, Stack } from 'immutable'; import { expect, pick, test } from 'tstyche'; test('#constructor', () => { expect(Stack()).type.toBe>(); expect(Stack()).type.toBe>(); expect(Stack([1, 'a'])).type.toBe>(); }); test('#size', () => { expect(pick(Stack(), 'size')).type.toBe<{ readonly size: number }>(); }); test('.of', () => { expect(Stack.of(1, 2, 3)).type.toBe>(); expect(Stack.of('a', 1)).type.toRaiseError(); expect(Stack.of('a', 1)).type.toBe>(); }); test('#peek', () => { expect(Stack().peek()).type.toBe(); }); test('#push', () => { expect(Stack().push(0)).type.toBe>(); expect(Stack().push('a')).type.toRaiseError(); expect(Stack().push(0)).type.toBe>(); expect(Stack().push('a')).type.toBe< Stack >(); }); test('#pushAll', () => { expect(Stack().pushAll([0])).type.toBe>(); expect(Stack().pushAll(['a'])).type.toRaiseError(); expect(Stack().pushAll([0])).type.toBe< Stack >(); expect(Stack().pushAll(['a'])).type.toBe< Stack >(); }); test('#unshift', () => { expect(Stack().unshift(0)).type.toBe>(); expect(Stack().unshift('a')).type.toRaiseError(); expect(Stack().unshift(0)).type.toBe< Stack >(); expect(Stack().unshift('a')).type.toBe< Stack >(); }); test('#unshiftAll', () => { expect(Stack().unshiftAll([0])).type.toBe>(); expect(Stack().unshiftAll(['a'])).type.toRaiseError(); expect(Stack().unshiftAll([1])).type.toBe< Stack >(); expect(Stack().unshiftAll(['a'])).type.toBe< Stack >(); }); test('#clear', () => { expect(Stack().clear()).type.toBe>(); expect(Stack().clear(10)).type.toRaiseError(); }); test('#pop', () => { expect(Stack().pop()).type.toBe>(); expect(Stack().pop(10)).type.toRaiseError(); }); test('#shift', () => { expect(Stack().shift()).type.toBe>(); expect(Stack().shift(10)).type.toRaiseError(); }); test('#map', () => { expect( Stack().map((value: number, key: number, iter: Stack) => 1) ).type.toBe>(); expect( Stack().map( (value: number, key: number, iter: Stack) => 'a' ) ).type.toBe>(); expect( Stack().map( (value: number, key: number, iter: Stack) => 1 ) ).type.toBe>(); expect( Stack().map( (value: number, key: number, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().map( (value: string, key: number, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().map( (value: number, key: string, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().map( (value: number, key: number, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().map( (value: number, key: number, iter: Stack) => 'a' ) ).type.toRaiseError(); }); test('#flatMap', () => { expect( Stack().flatMap( (value: number, key: number, iter: Stack) => [1] ) ).type.toBe>(); expect( Stack().flatMap( (value: number, key: number, iter: Stack) => 'a' ) ).type.toBe>(); expect( Stack().flatMap( (value: number, key: number, iter: Stack) => [1] ) ).type.toBe>(); expect( Stack().flatMap( (value: number, key: number, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().flatMap( (value: string, key: number, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().flatMap( (value: number, key: string, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().flatMap( (value: number, key: number, iter: Stack) => 1 ) ).type.toRaiseError(); expect( Stack().flatMap( (value: number, key: number, iter: Stack) => 'a' ) ).type.toRaiseError(); }); test('#flatten', () => { expect(Stack().flatten()).type.toBe>(); expect(Stack().flatten(10)).type.toBe>(); expect(Stack().flatten(false)).type.toBe< Collection >(); expect(Stack().flatten('a')).type.toRaiseError(); }); test('#withMutations', () => { expect(Stack().withMutations((mutable) => mutable)).type.toBe< Stack >(); expect( Stack().withMutations((mutable: Stack) => mutable) ).type.toRaiseError(); }); test('#asMutable', () => { expect(Stack().asMutable()).type.toBe>(); }); test('#asImmutable', () => { expect(Stack().asImmutable()).type.toBe>(); }); immutable-js-immutable-js-6a01d72/type-definitions/ts-tests/tsconfig.json000066400000000000000000000004521522056416100266120ustar00rootroot00000000000000{ "compilerOptions": { "target": "es2015", "module": "commonjs", "sourceMap": true, "strict": true, "types": [], "noEmit": true, "lib": ["es2015"], "baseUrl": "./", "paths": { "immutable": ["../immutable.d.ts"] } }, "exclude": ["node_modules"] } immutable-js-immutable-js-6a01d72/type-definitions/tsconfig.json000066400000000000000000000004441522056416100250250ustar00rootroot00000000000000{ "compilerOptions": { "target": "es2015", "module": "commonjs", "sourceMap": true, "noImplicitAny": true, "noImplicitThis": true, "strictNullChecks": true, "strictFunctionTypes": true, "lib": ["es2015"], "types": [] }, "files": ["immutable.d.ts"] } immutable-js-immutable-js-6a01d72/website/000077500000000000000000000000001522056416100204645ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/.eslintrc000066400000000000000000000000621522056416100223060ustar00rootroot00000000000000{ "extends": ["next", "next/core-web-vitals"] } immutable-js-immutable-js-6a01d72/website/docs/000077500000000000000000000000001522056416100214145ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/docs/BrowserExtension.mdx000066400000000000000000000035441522056416100254540ustar00rootroot00000000000000# Devtools Inspecting immutable collections in browser's Dev Tools is awkward. You only see the internal data structure, not the logical contents. For example, when inspecting the contents of an Immutable List, you'd really like to see the items in the list. Chrome (v47+) and Firefox (116+) has support for custom "formatters". A formatter tells browser's Dev Tools how to display values in the Console, Scope list, etc. This means we can display Lists, Maps and other collections, in a much better way. Essentially, it turns this: ![Before Devtools](/before.png) into: ![After Devtools](/after.png) ## Installation Install the following extension in your browser: ### Alternative If you don't want to install an extension, you can install the devtools as a dependency in your project. To do that, install the following package using your package manager: ```sh npm install --save-dev @immutable/devtools ``` and enable it with: ```js import * as Immutable from 'immutable'; import installDevTools from '@immutable/devtools'; installDevTools(Immutable); ``` See more details in the [github repository](https://github.com/immutable-js/immutable-devtools). immutable-js-immutable-js-6a01d72/website/docs/Collection.Indexed.mdx000066400000000000000000000605171522056416100256110ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Collection.Indexed Indexed Collections have incrementing numeric keys. They exhibit slightly different behavior than `Collection.Keyed` for some methods in order to better mirror the behavior of JavaScript's `Array`, and add methods which do not make sense on non-indexed Collections such as `indexOf`. Unlike JavaScript arrays, `Collection.Indexed`s are always dense. "Unset" indices and `undefined` indices are indistinguishable, and all indices from 0 to `size` are visited when iterated. All Collection.Indexed methods return re-indexed Collections. In other words, indices always start at 0 and increment until size. If you wish to preserve indices, using them as keys, convert to a Collection.Keyed by calling `toKeyedSeq`. ## Construction Creates a new Collection.Indexed. (collection?: Iterable | ArrayLike): Collection.Indexed;`} /> Note: `Collection.Indexed` is a conversion function and not a class, and does not use the `new` keyword during construction. ## Reading values Returns the value associated with the provided index, or notSetValue if the index is beyond the bounds of the Collection. (index: number, notSetValue: NSV): T | NSV; get(index: number): T | undefined;`} /> `index` may be a negative number, which indexes back from the end of the Collection. `s.get(-1)` gets the last item in the Collection. True if a key exists within this `Collection`, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. In case the `Collection` is not empty returns the first element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): T | NSV; first(): T | undefined;`} /> In case the `Collection` is not empty returns the last element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): T | NSV; last(): T | undefined;`} /> ## Conversion to JavaScript types Deeply converts this Indexed collection to equivalent native JavaScript Array. >;`} /> Shallowly converts this Indexed collection to equivalent native JavaScript Array. ;`} /> Shallowly converts this collection to an Array. ;`} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Returns Seq.Indexed. ;`} /> If this is a collection of [key, value] entry tuples, it will return a Seq.Keyed of those entries. ;`} /> Returns a Seq.Keyed with the same key-value entries as this Collection.Indexed. ;`} /> Returns a Seq.Indexed with the same values as this Collection.Indexed. ;`} /> Returns a Seq.Set with the same values as this Collection.Indexed. ;`} /> ## Combination Returns a Collection of the same type with `separator` between each item in this Collection. Returns a Collection of the same type with the provided `collections` interleaved into this collection. >): this;`} /> The resulting Collection includes the first item from each, then the second from each, etc. The shortest Collection stops interleave. Since `interleave()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `interleave` _cannot_ be used in `withMutations`. Splice returns a new indexed Collection by replacing a region of this Collection with new values. If values are not provided, it only skips the region to be removed. ): this;`} /> `index` may be a negative number, which indexes back from the end of the Collection. `s.splice(-2)` splices after the second to last item. Since `splice()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `splice` _cannot_ be used in `withMutations`. Returns a Collection of the same type "zipped" with the provided collections. (other: Collection): Collection.Indexed<[T, U]>;`} /> (other: Collection, other2: Collection): Collection.Indexed<[T, U, V]>;`} /> >): Collection.Indexed;`} /> Like `zipWith`, but using the default `zipper`: creating an `Array`. Returns a Collection "zipped" with the provided collections. Unlike `zip`, `zipAll` continues zipping until the longest collection is exhausted. Missing values from shorter collections are filled with `undefined`. (other: Collection): Collection.Indexed<[T, U]>;`} /> (other: Collection, other2: Collection): Collection.Indexed<[T, U, V]>;`} /> >): Collection.Indexed;`} /> Returns a Collection of the same type "zipped" with the provided collections by using a custom `zipper` function. (zipper: (value: T, otherValue: U) => Z, otherCollection: Collection): Collection.Indexed;`} /> (zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection): Collection.Indexed;`} /> (zipper: (...values: Array) => Z, ...collections: Array>): Collection.Indexed;`} /> a + b, b);`} /> Flattens nested Collections. ;`} /> ;`} /> Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only others Collection, not Arrays or Objects. Note: `flatten(true)` operates on `Collection>` and returns `Collection` ## Search for value Returns the first index at which a given value can be found in the Collection, or -1 if it is not present. Returns the last index at which a given value can be found in the Collection, or -1 if it is not present. Returns the first index in the Collection where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number;`} /> Returns the last index in the Collection where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number;`} /> Returns the first value for which the `predicate` returns true. boolean, context?: unknown): T | undefined;`} /> Returns the last value for which the `predicate` returns true. boolean, context?: unknown): T | undefined;`} /> Note: `predicate` will be called for each entry in reverse. Returns the first [key, value] entry for which the `predicate` returns true. boolean, context?: unknown): [number, T] | undefined;`} /> Returns the last [key, value] entry for which the `predicate` returns true. boolean, context?: unknown): [number, T] | undefined;`} /> Returns the key for which the `predicate` returns true. boolean, context?: unknown): number | undefined;`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown): number | undefined;`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator): T | undefined;`} /> i.avgHit);`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator): T | undefined;`} /> i.avgHit);`} /> ## Sequence algorithms Returns a new Collection with other collections concatenated to this one. (...valuesOrCollections: Array | C>): Collection.Indexed;`} /> Returns a new Collection.Indexed with values passed through a `mapper` function. (mapper: (value: T, key: number, iter: this) => M, context?: unknown): Collection.Indexed;`} /> 10 * x)`} /> Note: `map()` always returns a new instance, even if it produced the same value at every step. Flat-maps the Collection, returning a Collection of the same type. (mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown): Collection.Indexed;`} /> Similar to `collection.map(...).flatten(true)`. Returns a new Collection with only the values for which the `predicate` function returns true. (predicate: (value: T, index: number, iter: this) => value is F, context?: unknown): Collection.Indexed;`} /> unknown, context?: unknown): this;`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. Returns a new indexed Collection with the values for which the `predicate` function returns false and another for which is returns true. (predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C): [Collection.Indexed, Collection.Indexed];`} /> (predicate: (this: C, value: T, index: number, iter: this) => unknown, context?: C): [this, this];`} /> ;`} /> Returns a new Collection with only the values for which the `predicate` function returns false. unknown, context?: unknown): this;`} /> x > 2)`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection with the values in reverse order. Returns a new sorted Collection, sorted by the natural order of the values. ;`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. Note: `sort()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a new sorted Collection, sorted by the provided `comparator` function. (comparator: (value: T) => R): Collection.Indexed;`} /> Note: `sortBy()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Groups the values by the return value of the `mapper` function, and returns a Collection.Indexed of Arrays of grouped values. (mapper: (value: T) => K): Collection.Indexed>;`} /> ## Value equality Returns true if the Collections are of the same size and all values are equal. Returns a hash code for this Collection. ## Reading deep values Returns the value at the given nested path, or notSetValue if any key in the path is not present. (path: Array, notSetValue: NSV): T | NSV;`} /> ): T | undefined;`} /> Returns a boolean if the given nested path exists. ): boolean;`} /> ## Persistent changes Returns a new Collection.Indexed with the value at the given index updated to the new value. T): this;`} /> ## Conversion to Collections Converts this Collection.Indexed to a Map. The first value of each entry is used as the key. ;`} /> Converts this Collection.Indexed to an OrderedMap. The first value of each entry is used as the key. ;`} /> Converts this Collection.Indexed to a Set. ;`} /> Converts this Collection.Indexed to an OrderedSet. ;`} /> Converts this Collection.Indexed to a List. ;`} /> Converts this Collection.Indexed to a Stack. ;`} /> ## Iterators Returns an Iterable of the keys in the Collection. ;`} /> Returns an Iterable of the values in the Collection. ;`} /> Returns an Iterable of the [key, value] entries in the Collection. ;`} /> ## Collections (Seq) Returns a Seq of the keys in the Collection. ;`} /> Returns a Seq of the values in the Collection. ;`} /> Returns a Seq of the [key, value] entries in the Collection. ;`} /> ## Side effects Calls the provided function for each value in the Collection. Returns the Collection. void, context?: unknown): this;`} /> ## Creating subsets Returns a new Collection.Indexed with the values between the given start and end indices. Returns a new Collection.Indexed with all but the first value. Returns a new Collection.Indexed with all but the last value. Returns a new Collection.Indexed with the first `n` values removed. Returns a new Collection.Indexed with the last `n` values removed. Returns a new Collection.Indexed with values skipped while the `predicate` function returns true. boolean, context?: unknown): this;`} /> Returns a new Collection.Indexed with values skipped until the `predicate` function returns true. boolean, context?: unknown): this;`} /> Returns a new Collection.Indexed with the first `n` values. Returns a new Collection.Indexed with the last `n` values. Returns a new Collection.Indexed with values taken while the `predicate` function returns true. boolean, context?: unknown): this;`} /> Returns a new Collection.Indexed with values taken until the `predicate` function returns true. boolean, context?: unknown): this;`} /> ## Reducing a value Returns the accumulated result of calling the provided reducer function for each value in the Collection, from left to right. (reducer: (previousValue: R | T, currentValue: T, index: number, iter: this) => R, initialValue?: R): R;`} /> Returns the accumulated result of calling the provided reducer function for each value in the Collection, from right to left. (reducer: (previousValue: R | T, currentValue: T, index: number, iter: this) => R, initialValue?: R): R;`} /> Returns true if the `predicate` function returns a truthy value for every value in the Collection. boolean, context?: unknown): boolean;`} /> Returns true if the `predicate` function returns a truthy value for any value in the Collection. boolean, context?: unknown): boolean;`} /> Returns the concatenated string result of calling `String(value)` on every value in the Collection, separated by the given separator string. Returns true if the Collection has no values. Returns the number of values in the Collection. Returns a new Collection.Indexed with the number of times each value occurs in the Collection. ;`} /> ## Comparison Returns true if this Collection.Indexed is a subset of the other Collection (i.e. all values in this Collection.Indexed are also in the other). Returns true if this Collection.Indexed is a superset of the other Collection (i.e. this Collection.Indexed contains all values of the other). immutable-js-immutable-js-6a01d72/website/docs/Collection.Keyed.mdx000066400000000000000000000667751522056416100253060ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Collection.Keyed Keyed Collections have discrete keys tied to each value. When iterating `Collection.Keyed`, each iteration will yield a [K, V] tuple, in other words, `Collection#entries` is the default iterator for Keyed Collections. ## Construction Creates a Collection.Keyed Similar to `Collection()`, however it expects collection-likes of [K, V] tuples if not constructed from a Collection.Keyed or JS Object. Note: `Collection.Keyed` is a conversion function and not a class, and does not use the `new` keyword during construction. ## Conversion to JavaScript types Deeply converts this Keyed collection to equivalent native JavaScript Object. };`} /> Converts keys to Strings. Shallowly converts this Keyed collection to equivalent native JavaScript Object. Converts keys to Strings. Shallowly converts this collection to an Array of [key, value] pairs. ;`} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Returns Seq.Keyed. Returns a Seq.Keyed from this Collection where indices are treated as keys. ;`} /> This is useful if you want to operate on an Collection.Indexed and preserve the [index, value] pairs. The returned Seq will have identical iteration order as this Collection. ```js const indexedSeq = Seq(['A', 'B', 'C']); // Seq [ "A", "B", "C" ] indexedSeq.filter((v) => v === 'B'); // Seq [ "B" ] const keyedSeq = indexedSeq.toKeyedSeq(); // Seq { 0: "A", 1: "B", 2: "C" } keyedSeq.filter((v) => v === 'B'); ``` Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a Seq.Set of the values of this Collection, discarding keys. ;`} /> ## Sequence functions Returns a new Collection.Keyed of the same type where the keys and values have been flipped. ```js import { Map } from 'immutable'; Map({ a: 'z', b: 'y' }).flip(); // Map { "z": "a", "y": "b" } ``` Returns a new Collection with other collections concatenated to this one. (...collections: Array>): Collection.Keyed;`} /> (...collections: Array<{ [key: string]: C }>): Collection.Keyed;`} /> Returns a new Collection.Keyed with values passed through a `mapper` function. (mapper: (value: V, key: K, iter: this) => M, context?: unknown): Collection.Keyed;`} /> ```js import { Collection } from 'immutable'; Collection.Keyed({ a: 1, b: 2 }).map((x) => 10 * x); // Seq { "a": 10, "b": 20 } ``` Note: `map()` always returns a new instance, even if it produced the same value at every step. Returns a new Collection.Keyed of the same type with keys passed through a `mapper` function. (mapper: (key: K, value: V, iter: this) => M, context?: unknown): Collection.Keyed;`} /> ```js import { Map } from 'immutable'; Map({ a: 1, b: 2 }).mapKeys((x) => x.toUpperCase()); // Map { "A": 1, "B": 2 } ``` Note: `mapKeys()` always returns a new instance, even if it produced the same key at every step. Returns a new Collection.Keyed of the same type with entries ([key, value] tuples) passed through a `mapper` function. (mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown): Collection.Keyed;`} /> ```js import { Map } from 'immutable'; Map({ a: 1, b: 2 }).mapEntries(([k, v]) => [k.toUpperCase(), v * 2]); // Map { "A": 2, "B": 4 } ``` Note: `mapEntries()` always returns a new instance, even if it produced the same entry at every step. If the mapper function returns `undefined`, then the entry will be filtered. Flat-maps the Collection, returning a Collection of the same type. (mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown): Collection.Keyed;`} /> Similar to `collection.map(...).flatten(true)`. Returns a new Collection with only the values for which the `predicate` function returns true. (predicate: (value: V, key: K, iter: this) => value is F, context?: unknown): Collection.Keyed;`} /> unknown, context?: unknown): this;`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. (predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C): [Collection.Keyed, Collection.Keyed];`} /> (predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C): [this, this];`} /> Returns a new keyed Collection with the values for which the `predicate` function returns false and another for which it returns true. ;`} /> Yields [key, value] pairs. ## Value equality Returns true if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: this is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. ```js const a = List([1, 2, 3]); const b = List([1, 2, 3]); assert.notStrictEqual(a, b); // different instances const set = Set([a]); assert.equal(set.has(b), true); ``` If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. (key: K, notSetValue: NSV): V | NSV;`} /> Note: it is possible a key may be associated with an `undefined` value, so if `notSetValue` is not provided and this method returns `undefined`, that does not guarantee the key was not found. True if a key exists within this `Collection`, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. In case the `Collection` is not empty returns the first element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> In case the `Collection` is not empty returns the last element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown;`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean;`} /> ## Persistent changes This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru". (updater: (value: this) => R): R;`} /> For example, to sum a Seq after mapping and filtering: sum + x, 0); } Seq([1, 2, 3]) .map((x) => x + 1) .filter((x) => x % 2 === 0) .update(sum);`} /> ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. ;`} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. ;`} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Set, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to Set(this), but provided to allow for chained expressions. Converts this Collection to a Set, maintaining the order of iteration and discarding keys. ;`} /> Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List, discarding keys. ;`} /> This is similar to `List(collection)`, but provided to allow for chained expressions. However, when called on `Map` or other keyed collections, `collection.toList()` ignores the keys and creates a list of just the values, whereas `List(collection)` creates a list of entry tuples. Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Iterators An iterator of this `Collection`'s keys. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead if you want an Immutable.js Seq. An iterator of this `Collection`'s values. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead if you want an Immutable.js Seq. An iterator of this `Collection`'s entries as `[ key, value ]` tuples. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead if you want an Immutable.js Seq. ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. ;`} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a new Seq.Indexed of [key, value] tuples. ;`} /> ## Sequence algorithms Returns a new Collection of the same type with only the entries for which the `predicate` function returns false. boolean, context?: unknown): this;`} /> ```js import { Map } from 'immutable'; Map({ a: 1, b: 2, c: 3, d: 4 }).filterNot((x) => x % 2 === 0); // Map { "a": 1, "c": 3 } ``` Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection of the same type in reverse order. Returns a new Collection of the same type which includes the same entries, stably sorted by using a `comparator`. ): this;`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. ```js import { Map } from 'immutable'; Map({ c: 3, a: 1, b: 2 }).sort((a, b) => { if (a < b) { return -1; } if (a > b) { return 1; } if (a === b) { return 0; } }); // OrderedMap { "a": 1, "b": 2, "c": 3 } ``` Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means: (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: (valueA: C, valueB: C) => number): this;`} /> member.name);`} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a `Map` of `Collection`, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map;`} /> Note: This is always an eager operation. x.get('v'));`} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown): number;`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Collection of the same type representing a portion of this Collection from start up to but not including end. If begin is negative, it is offset from the end of the Collection. e.g. slice(-2) returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. slice(0, -1) returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. Returns a new Collection of the same type containing all entries except the last. Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): this;`} /> x.match(/g/)) // List [ "cat", "hat", "god" ] `} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): this;`} /> x.match(/hat/)) // List [ "hat", "god" ] `} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. Returns a new Collection of the same type which includes the last `amount` entries from this Collection. Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): this;`} /> ```js import { List } from 'immutable'; List(['dog', 'frog', 'cat', 'hat', 'god']).takeWhile((x) => x.match(/o/)); // List [ "dog", "frog" ] ``` Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): this;`} /> ```js import { List } from 'immutable'; List(['dog', 'frog', 'cat', 'hat', 'god']).takeUntil((x) => x.match(/at/)); // List [ "dog", "frog" ] ``` ## Combination Flattens nested Collections. ; flatten(shallow?: boolean): Collection;`} /> Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only other Collections, not Arrays or Objects. Note: `flatten(true)` operates on `Collection>` and returns `Collection`. ## Reducing a value Reduces the Collection to a value by calling the `reducer` for every entry in the Collection and passing along the reduced value. If `initialReduction` is not provided, the first item in the Collection will be used. (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R; reduce(reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R;`} /> Reduces the Collection in reverse (from the right side). (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R; reduceRight(reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R;`} /> True if `predicate` returns true for all entries in the Collection. boolean, context?: unknown): boolean;`} /> True if `predicate` returns true for any entry in the Collection. boolean, context?: unknown): boolean;`} /> Joins values together as a string, inserting a separator between each. The default separator is `","`. Returns true if this Collection includes no values. For some lazy `Seq`, `isEmpty` might need to iterate to determine emptiness. At most one iteration will occur. Returns the size of this Collection. Regardless of if this Collection can describe its size lazily (some Seqs cannot), this method will always return the correct size. E.g. it evaluates a lazy `Seq` if necessary. If `predicate` is provided, then this returns the count of entries in the Collection for which the `predicate` returns true. boolean, context?: unknown): number;`} /> Returns a `Seq.Keyed` of counts, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map;`} /> Note: This is not a lazy operation. ## Search for value Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): V | undefined;`} /> Returns the last value for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown, notSetValue?: V): V | undefined;`} /> Returns the first [key, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): [K, V] | undefined;`} /> Returns the last [key, value] entry for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown, notSetValue?: V): [K, V] | undefined;`} /> Returns the key for which the `predicate` returns true. boolean, context?: unknown): K | undefined;`} /> Returns the last key for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown): K | undefined;`} /> Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. ): V | undefined;`} /> Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): V | undefined;`} /> ```js import { List } from 'immutable'; const l = List([ { name: 'Bob', avgHit: 1 }, { name: 'Max', avgHit: 3 }, { name: 'Lili', avgHit: 2 }, ]); l.maxBy((i) => i.avgHit); // will output { name: 'Max', avgHit: 3 ``` Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): V | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): V | undefined;`} /> ```js import { List } from 'immutable'; const l = List([ { name: 'Bob', avgHit: 1 }, { name: 'Max', avgHit: 3 }, { name: 'Lili', avgHit: 2 }, ]); l.minBy((i) => i.avgHit); // will output { name: 'Bob', avgHit: 1 } ``` ## Comparison True if `iter` includes every value in this Collection. ): boolean;`} /> True if this Collection includes every value in `iter`. ): boolean;`} /> immutable-js-immutable-js-6a01d72/website/docs/Collection.Set.mdx000066400000000000000000000562221522056416100247620ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Collection.Set Set Collections only represent values. They have no associated keys or indices. Duplicate values are possible in the lazy s, however the concrete Collection does not allow duplicate values. Collection methods on Collection.Set such as and will provide the value as both the first and second arguments to the provided function. ```js const seq = Collection.Set(['A', 'B', 'C']); // Seq { "A", "B", "C" } seq.forEach((v, k) => { assert.equal(v, k); }); ``` ## Construction Similar to Collection(), but always returns a `Collection.Set`. Note: `Collection.Set` is a factory function and not a class, and does not use the `new` keyword during construction. ## Sequence algorithms Returns a new `Collection.Set` with values passed through a `mapper` function. (mapper: (value: T, key: T, iter: this) => M, context?: unknown): Collection.Set`} /> 10 * x)`} /> Note: `map()` always returns a new instance, even if it produced the same value at every step. Flat-maps the Collection, returning a Collection of the same type. Similar to `collection.map(...).flatten(true)`. (mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown): Collection.Set`} /> Returns a new Collection with only the values for which the `predicate` function returns true. Note: `filter()` always returns a new instance, even if it results in not filtering out any values. boolean, context?: unknown): Collection.Set`} /> Returns a new Collection with only the values for which the `predicate` function returns false. boolean, context?: unknown): Collection.Set`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection with the values for which the `predicate` function returns false and another for which is returns true. boolean, context?: C): [Collection.Set, Collection.Set]`} /> Returns a Collection of the same type which includes the same entries, stably sorted by using a `comparator`. ): this`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. When sorting collections which have no defined order, their ordered equivalents will be returned. e.g. `map.sort()` returns OrderedMap. { if (a < b) { return -1; } if (a > b) { return 1; } if (a === b) { return 0; } });`} /> Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): this`} /> person.age)`} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a new Set with the order of the values reversed. `} /> Returns a `Map` of `Set`, grouped by the return value of the `grouper` function. (grouper: (value: T, key: T, iter: this) => G, context?: unknown): Map>`} /> Note: This is not a lazy operation. ## Conversion to JavaScript types Deeply converts this Set to equivalent native JavaScript Array. >`} /> Shallowly converts this Set to equivalent native JavaScript Array. `} /> Shallowly converts this collection to an Array. `} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Returns itself. `} /> Returns a Seq.Keyed from this Collection where indices are treated as keys. This is useful if you want to operate on a Collection and preserve the [value, value] pairs. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a Seq.Set of the values of this Collection, discarding keys. `} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. Note: it is possible a key may be associated with an `undefined` value, so if `notSetValue` is not provided and this method returns `undefined`, that does not guarantee the key was not found. (key: T, notSetValue: NSV): T | NSV get(key: T): T | undefined`} /> True if a key exists within this Collection, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. Returns the first value in this Collection. (notSetValue: NSV): T | NSV first(): T | undefined`} /> Returns the last value in this Collection. (notSetValue: NSV): T | NSV last(): T | undefined`} /> ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean`} /> ## Persistent changes This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru". For example, to sum a Seq after mapping and filtering: sum + x, 0) } Collection.Set([ 1, 2, 3 ]) .map(x => x + 1) .filter(x => x % 2 === 0) .update(sum)`} /> ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. `} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Returns itself. `} /> Converts this Collection to a Set, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedSet(this)`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List. `} /> Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. `} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Iterators An iterator of this `Set`'s keys. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead, if this is what you want. An iterator of this `Set`'s values. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead, if this is what you want. An iterator of this `Set`'s entries as `[value, value]` tuples. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead, if this is what you want. ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a new Seq.Indexed of [value, value] tuples. `} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown): number`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Set of the same type representing a portion of this Set from start up to but not including end. `} /> If begin is negative, it is offset from the end of the Collection. e.g. `slice(-2)` returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. `slice(0, -1)` returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. `} /> Returns a new Collection of the same type containing all entries except the last. `} /> Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): Set`} /> x.match(/g/))`} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): Set`} /> x.match(/hat/))`} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): Set`} /> x.match(/o/))`} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): Set`} /> x.match(/at/))`} /> ## Combination Returns a new Set with other collections concatenated to this one. (...valuesOrCollections: Array | C>): Set`} /> Flattens nested Collections. Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only others Collection, not Arrays or Objects. Flat-maps the Set, returning a new Set. Similar to `set.map(...).flatten(true)`. (mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown): Set`} /> ## Reducing a value Reduces the Iterable to a value by calling the `reducer` for every entry in the Iterable and passing along the reduced value. (reducer: (reduced: R, value: T, key: T, iter: this) => R, initialValue: R): R`} /> If initialValue is not provided, the first entry in the Iterable will be used as the initial value. Reduces the Iterable to a value by calling the `reducer` for every entry in the Iterable and passing along the reduced value. (reducer: (reduced: R, value: T, key: T, iter: this) => R, initialValue: R): R`} /> Note: Similar to this.reverse().reduce(), and provided for parity with `Array#reduceRight`. Returns true if the `predicate` returns true for every entry in the Iterable. boolean, context?: unknown): boolean`} /> Returns true if the `predicate` returns true for any entry in the Iterable. boolean, context?: unknown): boolean`} /> Returns a string of all the entries in the Iterable, separated by `separator`. Returns true if the Iterable is empty. Returns the number of entries in the Iterable. Returns a Map of the number of occurrences of each value in the Iterable. (grouper: (value: T, key: T, iter: this) => G, context?: unknown): Map`} /> ## Search for value Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Returns the last value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first [value, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [T, T] | undefined`} /> Returns the last [value, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [T, T] | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first key for which the `predicate` returns true. boolean, context?: unknown): T | undefined`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> The comparator is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): T | undefined`} /> person.age)`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> The comparator is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): T | undefined`} /> person.age)`} /> ## Comparison True if `iter` includes every value in this Collection. ): boolean`} /> True if this Collection includes every value in `iter`. ): boolean`} /> immutable-js-immutable-js-6a01d72/website/docs/Collection.mdx000066400000000000000000000653351522056416100242350ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Collection The `Collection` is a set of (key, value) entries which can be iterated, and is the base class for all collections in `immutable`, allowing them to make use of all the Collection methods (such as and ). Note: A collection is always iterated in the same order, however that order may not always be well defined, as is the case for the and . Collection is the abstract base class for concrete data structures. It cannot be constructed directly. Implementations should extend one of the subclasses, , , or . ## Construction Creates a Collection. The type of Collection created is based on the input. - If an `Collection`, that same `Collection`. - If an Array-like, an `Collection.Indexed`. - If an Object with an Iterator defined, an `Collection.Indexed`. - If an Object, an `Collection.Keyed`. This methods forces the conversion of Objects and Strings to Collections. If you want to ensure that a Collection of one item is returned, use `Seq.of`. Note: An Iterator itself will be treated as an object, becoming a `Seq.Keyed`, which is usually not what you want. You should turn your Iterator Object into an iterable object by defining a `Symbol.iterator` (or `@@iterator`) method which returns `this`. Note: `Collection` is a conversion function and not a class, and does not use the `new` keyword during construction. (collection: Iterable | ArrayLike): Collection.Indexed; function Collection(obj: { [key: string]: V; }): Collection.Keyed; function Collection(): Collection; `} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. ```js const a = List([1, 2, 3]); const b = List([1, 2, 3]); assert.notStrictEqual(a, b); // different instances const set = Set([a]); assert.equal(set.has(b), true); ``` If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. (key: K, notSetValue: NSV): V | NSV;`} /> Note: it is possible a key may be associated with an `undefined` value, so if `notSetValue` is not provided and this method returns `undefined`, that does not guarantee the key was not found. True if a key exists within this `Collection`, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. In case the `Collection` is not empty returns the first element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> In case the `Collection` is not empty returns the last element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown;`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean;`} /> ## Persistent changes This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru". (updater: (value: this) => R): R;`} /> For example, to sum a Seq after mapping and filtering: sum + x, 0); } Seq([1, 2, 3]) .map((x) => x + 1) .filter((x) => x % 2 === 0) .update(sum); `} /> ## Conversion to JavaScript types Deeply converts this Collection to equivalent native JavaScript Array or Object. > | { [key in PropertyKey]: DeepCopy };`} /> `Collection.Indexed`, and `Collection.Set` become `Array`, while `Collection.Keyed` become `Object`, converting keys to Strings. Shallowly converts this Collection to equivalent native JavaScript Array or Object. | { [key in PropertyKey]: V };`} /> `Collection.Indexed`, and `Collection.Set` become `Array`, while `Collection.Keyed` become `Object`, converting keys to Strings. Shallowly converts this collection to an Array. | Array<[K, V]>;`} /> `Collection.Indexed`, and `Collection.Set` produce an Array of values. `Collection.Keyed` produce an Array of [key, value] tuples. Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. ;`} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. ;`} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Set, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to `Set(this)`, but provided to allow for chained expressions. Converts this Collection to a Set, maintaining the order of iteration and discarding keys. ;`} /> Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List, discarding keys. ;`} /> This is similar to `List(collection)`, but provided to allow for chained expressions. However, when called on `Map` or other keyed collections, `collection.toList()` discards the keys and creates a list of only the values, whereas `List(collection)` creates a list of entry tuples. Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Conversion to Seq Converts this Collection to a Seq of the same kind (indexed, keyed, or set). ;`} /> Returns a Seq.Keyed from this Collection where indices are treated as keys. ;`} /> This is useful if you want to operate on an Collection.Indexed and preserve the [index, value] pairs. The returned Seq will have identical iteration order as this Collection. v === 'B'); // Seq [ "B" ] const keyedSeq = indexedSeq.toKeyedSeq(); // Seq { 0: "A", 1: "B", 2: "C" } keyedSeq.filter((v) => v === 'B');`} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a Seq.Set of the values of this Collection, discarding keys. ;`} /> ## Iterators An iterator of this `Collection`'s keys. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead, if this is what you want. An iterator of this `Collection`'s values. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead, if this is what you want. An iterator of this `Collection`'s entries as `[ key, value ]` tuples. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead, if this is what you want. ;`} /> ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. ;`} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a new Seq.Indexed of [key, value] tuples. ;`} /> ## Sequence algorithms Returns a new Collection of the same type with values passed through a `mapper` function. (mapper: (value: V, key: K, iter: this) => M, context?: unknown): Collection;`} /> Note: `map()` always returns a new instance, even if it produced the same value at every step. Returns a new Collection of the same type with only the entries for which the `predicate` function returns true. (predicate: (value: V, key: K, iter: this) => value is F, context?: unknown): Collection;`} /> unknown, context?: unknown): this;`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection of the same type with only the entries for which the `predicate` function returns false. boolean, context?: unknown): this;`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection with the values for which the `predicate` function returns false and another for which is returns true. (predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C): [Collection, Collection];`} /> (predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C): [this, this];`} /> Returns a new Collection of the same type in reverse order. Returns a new Collection of the same type which includes the same entries, stably sorted by using a `comparator`. ): this;`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. When sorting collections which have no defined order, their ordered equivalents will be returned. e.g. `map.sort()` returns OrderedMap. { if (a < b) { return -1; } if (a > b) { return 1; } if (a === b) { return 0; } });`} /> Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means. (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): this;`} /> member.name);`} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a `Map` of `Collection`, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map;`} /> Note: This is always an eager operation. x.get('v'));`} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown): number;`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Collection of the same type representing a portion of this Collection from start up to but not including end. If begin is negative, it is offset from the end of the Collection. e.g. `slice(-2)` returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. `slice(0, -1)` returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. Returns a new Collection of the same type containing all entries except the last. Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): this;`} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): this;`} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. Returns a new Collection of the same type which includes the last `amount` entries from this Collection. Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): this;`} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): this;`} /> ## Combination Returns a new Collection of the same type with other values and collection-like concatenated to this one. ): Collection;`} /> For Seqs, all entries will be present in the resulting Seq, even if they have the same key. Flattens nested Collections. ;`} /> ;`} /> Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only others Collection, not Arrays or Objects. Note: `flatten(true)` operates on `Collection>` and returns `Collection` Flat-maps the Collection, returning a Collection of the same type. (mapper: (value: V, key: K, iter: this) => Iterable, context?: unknown): Collection;`} /> (mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown): Collection;`} /> Reduces the Collection to a value by calling the `reducer` for every entry in the Collection and passing along the reduced value. (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R;`} /> (reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R;`} /> Reduces the Collection in reverse (from the right side). (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R;`} /> (reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R;`} /> True if `predicate` returns true for all entries in the Collection. boolean, context?: unknown): boolean;`} /> True if `predicate` returns true for any entry in the Collection. boolean, context?: unknown): boolean;`} /> Joins values together as a string, inserting a separator between each. The default separator is `","`. Returns true if this Collection includes no values. For some lazy `Seq`, `isEmpty` might need to iterate to determine emptiness. At most one iteration will occur. Returns the size of this Collection. boolean, context?: unknown): number;`} /> Regardless of if this Collection can describe its size lazily (some Seqs cannot), this method will always return the correct size. E.g. it evaluates a lazy `Seq` if necessary. If `predicate` is provided, then this returns the count of entries in the Collection for which the `predicate` returns true. Returns a `Seq.Keyed` of counts, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map;`} /> Note: This is not a lazy operation. ## Search for value Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): V | undefined;`} /> Returns the last value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): V | undefined;`} /> Returns the first [key, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): [K, V] | undefined;`} /> Returns the last [key, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): [K, V] | undefined;`} /> Returns the key for which the `predicate` returns true. boolean, context?: unknown): K | undefined;`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown): K | undefined;`} /> Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): V | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): V | undefined;`} /> i.avgHit);`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): V | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): V | undefined;`} /> i.avgHit); // will output { name: 'Bob', avgHit: 1 }`} /> ## Comparison True if `iter` includes every value in this Collection. ): boolean;`} /> True if this Collection includes every value in `iter`. ): boolean;`} /> immutable-js-immutable-js-6a01d72/website/docs/Intro.mdx000066400000000000000000000073731522056416100232330ustar00rootroot00000000000000Immutable data encourages pure functions (data-in, data-out) and lends itself to much simpler application development and enabling techniques from functional programming such as lazy evaluation. While designed to bring these powerful functional concepts to JavaScript, it presents an Object-Oriented API familiar to Javascript engineers and closely mirroring that of Array, Map, and Set. It is easy and efficient to convert to and from plain Javascript types. ## How to read these docs In order to better explain what kinds of values the Immutable.js API expects and produces, this documentation is presented in a statically typed dialect of JavaScript (like [Flow][] or [TypeScript][]). You _don't need_ to use these type checking tools in order to use Immutable.js, however becoming familiar with their syntax will help you get a deeper understanding of this API. **A few examples and how to read them.** All methods describe the kinds of data they accept and the kinds of data they return. For example a function which accepts two numbers and returns a number would look like this: ```ts sum(first: number, second: number): number ``` Sometimes, methods can accept different kinds of data or return different kinds of data, and this is described with a _type variable_, which is typically in all-caps. For example, a function which always returns the same kind of data it was provided would look like this: ```ts identity(value: T): T ``` Type variables are defined with classes and referred to in methods. For example, a class that holds onto a value for you might look like this: ```ts class Box { constructor(value: T); getValue(): T; } ``` In order to manipulate Immutable data, methods that we're used to affecting a Collection instead return a new Collection of the same type. The type `this` refers to the same kind of class. For example, a List which returns new Lists when you `push` a value onto it might look like: ```ts class List { push(value: T): this; } ``` Many methods in Immutable.js accept values which implement the JavaScript [Iterable][] protocol, and might appear like `Iterable` for something which represents sequence of strings. Typically in JavaScript we use plain Arrays (`[]`) when an Iterable is expected, but also all of the Immutable.js collections are iterable themselves! For example, to get a value deep within a structure of data, we might use `getIn` which expects an `Iterable` path: ```ts getIn(path: Iterable): unknown ``` To use this method, we could pass an array: `data.getIn([ "key", 2 ])`. ### Inheritance cheatsheet The following diagram shows the inheritance relationships between the Immutable.js collections. Click on the image to view it in full size. {/* SVG files are generated from https://excalidraw.com/#json=Indmlmx6FxIgZXvBbKbmH,OKX0Xpl-pmU1c8ZQueCj6Q If you want to update this chart: - open the link above - edit the chart - export it as SVG via "file > export" without background, one time in light mode and one time in dark mode - change the link above with the link you will get with "share > shareable link" */} Immutable.js Inheritance cheatsheet [ES2015]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/New_in_JavaScript/ECMAScript_6_support_in_Mozilla [TypeScript]: https://www.typescriptlang.org/ [Flow]: https://flowtype.org/ [Iterable]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols immutable-js-immutable-js-6a01d72/website/docs/List.mdx000066400000000000000000001202411522056416100230410ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # List Lists are ordered indexed dense collections, much like a JavaScript Array. extends Collection.Indexed`} /> Lists are immutable and fully persistent with O(log32 N) gets and sets, and O(1) push and pop. Lists implement Deque, with efficient addition and removal from both the end (, ) and beginning (, ). Unlike a JavaScript Array, there is no distinction between an "unset" index and an index set to undefined. List#forEach visits all indices from 0 to size, regardless of whether they were explicitly defined. ## Construction Create a new immutable List containing the values of the provided collection-like. (collection?: Iterable | ArrayLike): List`} /> Note: is a factory function and not a class, and does not use the `new` keyword during construction. ## Static methods (...values: Array): List`} /> ## Members The number of items in this List. ## Persistent changes Returns a new List which includes `value` at `index`. If `index` already exists in this List, it will be replaced. `} /> `index` may be a negative number, which indexes back from the end of the List. `v.set(-1, "value")` sets the last item in the List. If `index` larger than , the returned List's will be large enough to include the index. Note: `set` can be used in withMutations. Returns a new List which excludes this `index` and with a size 1 less than this List. Values at indices above `index` are shifted down by 1 to fill the position. This is synonymous with `list.splice(index, 1)`. `} /> `index` may be a negative number, which indexes back from the end of the List. `v.delete(-1)` deletes the last item in the List. Note: `delete` cannot be safely used in IE8. Since `delete()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `delete` _cannot_ be used in withMutations. Returns a new List with `value` at `index` with a size 1 more than this List. Values at indices above `index` are shifted over by 1. `} /> This is synonymous with `list.splice(index, 0, value)`. Since `insert()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `insert` _cannot_ be used in withMutations. Returns a new List with 0 size and no values in constant time. `} /> Note: `clear` can be used in withMutations. Returns a new List with the provided `values` appended, starting at this List's `size`. ): List`} /> Note: `push` can be used in withMutations. Returns a new List with a size one less than this List, excluding the last index in this List. `} /> Note: this differs from `Array#pop` because it returns a new List rather than the removed value. Use `last()` to get the last value in this List. Note: `pop` can be used in withMutations. Returns a new List with the provided `values` prepended, shifting other values ahead to higher indices. ): List`} /> Note: `unshift` can be used in withMutations. Returns a new List with a size one less than this List, excluding the first index in this List, shifting all other values to a lower index. `} /> Note: this differs from `Array#shift` because it returns a new List rather than the removed value. Use `first()` to get the first value in this List. Note: `shift` can be used in withMutations. Returns a new List with an updated value at `index` with the return value of calling `updater` with the existing value, or `notSetValue` if `index` was not set. If called with a single argument, `updater` is called with the List itself. T): List update(index: number, updater: (value: T | undefined) => T | undefined): List update(updater: (value: this) => R): R`} /> `index` may be a negative number, which indexes back from the end of the List. `v.update(-1)` updates the last item in the List. val.toUpperCase()) // List [ "a", "b", "C" ]`} /> This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru". For example, to sum a List after mapping and filtering: sum + x, 0) } List([ 1, 2, 3 ]) .map(x => x + 1) .filter(x => x % 2 === 0) .update(sum)`} /> Note: `update(index)` can be used in withMutations. Returns a new List with size `size`. If `size` is less than this List's size, the new List will exclude values at the higher indices. If `size` is greater than this List's size, the new List will have undefined values for the newly available indices. `} /> When building a new List and the final size is known up front, `setSize` used in conjunction with withMutations may result in the more performant construction. ## Deep persistent changes Returns a new List having set `value` at this `keyPath`. If any keys in `keyPath` do not exist, a new immutable Map will be created at that key. , value: unknown): List`} /> Index numbers are used as keys to determine the path to follow in the List. Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and setIn() can update those values as well, treating them immutably by creating new copies of those values with the changes applied. Note: `setIn` can be used in withMutations. Returns a new List having removed the value at this `keyPath`. If any keys in `keyPath` do not exist, no change will occur. ): List`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and `removeIn()` can update those values as well, treating them immutably by creating new copies of those values with the changes applied. Note: `deleteIn` _cannot_ be safely used in withMutations. , notSetValue: unknown, updater: (value: unknown) => unknown): this updateIn(keyPath: Iterable, updater: (value: unknown) => unknown): this`} /> Note: `updateIn` can be used in withMutations. , ...collections: Array): this`} /> Note: `mergeIn` can be used in withMutations. , ...collections: Array): this`} /> Note: `mergeDeepIn` can be used in withMutations. ## Transient changes Note: Not all methods can be safely used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it allows being used in `withMutations`. unknown): List`} /> An alternative API for withMutations() Note: Not all methods can be safely used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it allows being used in `withMutations`. `} /> ## Sequence algorithms Returns a new List with other values or collections concatenated to this one. (...valuesOrCollections: Array | C>): List`} /> Note: `concat` can be used in withMutations. Returns a new List with values passed through a `mapper` function. (mapper: (value: T, key: number, iter: this) => M, context?: unknown): List`} /> 10 * x)`} /> Returns a new List with values passed through a `mapper` function. (mapper: (value: T, key: number, iter: this) => M, context?: unknown): List`} /> Returns a new List with values passed through a `mapper` function. (mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown): List<[KM, VM]>`} /> Flat-maps the List, returning a new List. Similar to `list.map(...).flatten(true)`. (mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown): List`} /> Returns a new List with only the values for which the `predicate` function returns true. Note: `filter()` always returns a new instance, even if it results in not filtering out any values. (predicate: (value: T, index: number, iter: this) => value is F, context?: unknown): List`} /> Returns a new List with the values for which the `predicate` function returns false and another for which is returns true. (predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C): [List, List]`} /> Returns a List "zipped" with the provided collection. Like `zipWith`, but using the default `zipper`: creating an `Array`. (other: Collection): List<[T, U]> zip(other: Collection, other2: Collection): List<[T, U, V]>`} /> Returns a List "zipped" with the provided collections. Unlike `zip`, `zipAll` continues zipping until the longest collection is exhausted. Missing values from shorter collections are filled with `undefined`. (other: Collection): List<[T, U]> zipAll(other: Collection, other2: Collection): List<[T, U, V]>`} /> Note: Since zipAll will return a collection as large as the largest input, some results may contain undefined values. TypeScript cannot account for these without cases (as of v2.5). Returns a List "zipped" with the provided collections by using a custom `zipper` function. (zipper: (value: T, otherValue: U) => Z, otherCollection: Collection): List zipWith(zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection): List zipWith(zipper: (...values: Array) => Z, ...collections: Array>): List`} /> a + b, b);`} /> Returns a new List with its values shuffled thanks to the [Fisher–Yates](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle) algorithm. It uses Math.random, but you can provide your own random number generator. number): this`} /> Returns a new List with only the values for which the `predicate` function returns false. boolean, context?: unknown): this`} /> x % 2 === 0);`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new List with the order of the values reversed. `} /> Returns List of the same type which includes the same entries, stably sorted by using a comparator. number): List`} /> b - a);`} /> If a comparator is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. When sorting collections which have no defined order, their ordered equivalents will be returned. e.g. `map.sort()` returns `OrderedMap`. Note: `sort()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means: C, comparator?: (a, b) => number): List`} /> person.age);`} /> Note: `sortBy()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a `Map` of `List` grouped by the return value of the `grouper` function. (grouper: (value: T, index: number, iter: this) => G, context?: unknown): Map>`} /> Note: This is not a lazy operation. x.get('v'))`} /> ## Conversion to JavaScript types Deeply converts this List to a JavaScript Array. >`} /> Shallowly converts this Indexed collection to equivalent native JavaScript Array. `} /> Shallowly converts this collection to an Array. `} /> Shallowly converts this List to a JavaScript Object. Convert keys to strings. ## Reading values Returns the value at `index`. True if a key exists within this Collection, using Immutable.is to determine equality True if a value exists within this `Collection`, using `Immutable.is` to determine equality. Returns the first value in this collection. Returns the last value in this collection. ## Conversion to Seq Converts this List to a Seq of the same kind (indexed). `} /> If this is a collection of [key, value] entry tuples, it will return a Seq.Keyed of those entries. `} /> Returns a Seq.Keyed from this List where indices are treated as keys. This is useful if you want to operate on a List and preserve the [index, value] pairs. The returned Seq will have identical iteration order as this List. `} /> v === 'B') // Seq [ "B" ] const keyedSeq = indexedSeq.toKeyedSeq() // Seq { 0: "A", 1: "B", 2: "C" } keyedSeq.filter(v => v === 'B') // Seq { 1: "B" }`} /> Returns a Seq.Indexed of the values of this List, discarding keys. `} /> Returns a Seq.Set of the values of this List, discarding keys. `} /> ## Combination Returns a new List with the separator inserted between each value in this List. `} /> Returns a new List with the values from each collection interleaved. >): List`} /> The resulting Collection includes the first item from each, then the second from each, etc. The shortest Collection stops interleave. Since `interleave()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `interleave()` _cannot_ be used in withMutations. Returns a new List by replacing a region of this List with new values. If values are not provided, it only skips the region to be removed. `index` may be a negative number, which indexes back from the end of the List. `s.splice(-2)` splices after the second to last item. ): List`} /> Since `splice()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `splice` _cannot_ be used in withMutations. Returns a new flattened List, optionally only flattening to a particular depth. flatten(shallow?: boolean): List`} /> ## Search for value Returns the first index at which a given value can be found in the Collection, or -1 if it is not present. Returns the last index at which a given value can be found in the Collection, or -1 if it is not present. Returns the first index in the Collection where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number`} /> x % 2 === 0)`} /> Returns the last index in the Collection where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number`} /> x % 2 === 0)`} /> Returns the first value for which the `predicate` function returns true. boolean, context?: unknown): T | undefined`} /> x % 2 === 0)`} /> Returns the last value for which the `predicate` function returns true. boolean, context?: unknown): T | undefined`} /> x % 2 === 0)`} /> Note: `predicate` will be called for each entry in reverse. Returns the first `[key, value]` entry for which the `predicate` function returns true. boolean, context?: unknown): [number, T] | undefined`} /> x % 2 === 0)`} /> Returns the last `[key, value]` entry for which the `predicate` function returns true. boolean, context?: unknown): [number, T] | undefined`} /> x % 2 === 0)`} /> Note: `predicate` will be called for each entry in reverse. Returns the first key for which the `predicate` function returns true. boolean, context?: unknown): number | undefined`} /> x % 2 === 0)`} /> Returns the last key for which the `predicate` function returns true. boolean, context?: unknown): number | undefined`} /> x % 2 === 0)`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. number): T | undefined`} /> The comparator is used in the same way as Collection#sort. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max()`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. ( comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: (valueA: C, valueB: C) => number ): T | undefined`} /> person.age)`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. number): T | undefined`} /> The comparator is used in the same way as Collection#sort. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min()`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. ( comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: (valueA: C, valueB: C) => number ): T | undefined`} /> person.age)`} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean`} /> ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. `} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Set, discarding keys. Throws if values are not hashable. `} /> Note: This is equivalent to `Set(this)`, but provided to allow for chained expressions. Converts this Collection to a Set, maintaining the order of iteration and discarding keys. `} /> Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List, discarding keys. This is similar to `List(collection)`, but provided to allow for chained expressions. However, when called on `Map` or other keyed collections, `collection.toList()` discards the keys and creates a list of only the values, whereas `List(collection)` creates a list of entry tuples. `} /> Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. `} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Iterators An iterator of this `Collection`'s keys. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead, if this is what you want. An iterator of this `Collection`'s values. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead, if this is what you want. An iterator of this `Collection`'s entries as `[ key, value ]` tuples. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead, if this is what you want. ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a new Seq.Indexed of [key, value] tuples. `} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown): number`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Collection of the same type representing a portion of this Collection from start up to but not including end. If begin is negative, it is offset from the end of the Collection. e.g. `slice(-2)` returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. `slice(0, -1)` returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. `} /> Returns a new Collection of the same type containing all entries except the last. `} /> Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): List`} /> x.match(/g/))`} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): this`} /> x.match(/hat/))`} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): List`} /> x.match(/o/))`} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): List`} /> x.match(/at/))`} /> ## Reducing a value Reduces the Collection to a value by calling the `reducer` for every entry in the Collection and passing along the reduced value. (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R reduce(reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R`} /> If `initialReduction` is not provided, the first item in the Collection will be used. Reduces the Collection in reverse (from the right side). (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R reduceRight(reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R`} /> Note: Similar to this.reverse().reduce(), and provided for parity with `Array#reduceRight`. True if `predicate` returns true for all entries in the Collection. boolean, context?: unknown): boolean`} /> True if `predicate` returns true for any entry in the Collection. boolean, context?: unknown): boolean`} /> Joins values together as a string, inserting a separator between each. The default separator is `","`. Returns true if this Collection includes no values. For some lazy `Seq`, `isEmpty` might need to iterate to determine emptiness. At most one iteration will occur. Returns the size of this Collection. boolean, context?: unknown): number`} /> Regardless of if this Collection can describe its size lazily (some Seqs cannot), this method will always return the correct size. E.g. it evaluates a lazy `Seq` if necessary. If `predicate` is provided, then this returns the count of entries in the Collection for which the `predicate` returns true. Returns a `Seq.Keyed` of counts, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map`} /> Note: This is not a lazy operation. ## Comparison True if `iter` includes every value in this Collection. ): boolean`} /> True if this Collection includes every value in `iter`. ): boolean`} /> immutable-js-immutable-js-6a01d72/website/docs/Map.mdx000066400000000000000000001231041522056416100226440ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Map Immutable Map is an unordered Collection.Keyed of (key, value) pairs with `O(log32 N)` gets and `O(log32 N)` persistent sets. extends Collection.Keyed`} /> Iteration order of a Map is undefined, however is stable. Multiple iterations of the same Map will iterate in the same order. Map's keys can be of any type, and use `Immutable.is` to determine key equality. This allows the use of any value (including NaN) as a key. Because `Immutable.is` returns equality based on value semantics, and Immutable collections are treated as values, any Immutable collection may be used as a key. Any JavaScript object may be used as a key, however strict identity is used to evaluate key equality. Two similar looking objects will represent two different keys. Implemented by a hash-array mapped trie. ## Construction Create a new Immutable Map. (collection?: Iterable<[K, V]>): Map Map(obj: { [key: PropertyKey]: V }): Map `} /> Created with the same key value pairs as the provided Collection.Keyed or JavaScript Object or expects a Collection of [K, V] tuple entries. Note: `Map` is a factory function and not a class, and does not use the `new` keyword during construction. Keep in mind, when using JS objects to construct Immutable Maps, that JavaScript Object properties are always strings, even if written in a quote-less shorthand, while Immutable Maps accept keys of any type. ```js let obj = { 1: 'one' }; Object.keys(obj); // [ "1" ] assert.equal(obj['1'], obj[1]); // "one" === "one" let map = Map(obj); assert.notEqual(map.get('1'), map.get(1)); // "one" !== undefined ``` Property access for JavaScript Objects first converts the key to a string, but since Immutable Map keys can be of any type the argument to `get()` is not altered. ## Static Methods True if the provided value is a Map. `} /> ## Members The number of entries in this Map. ## Persistent changes Returns a new Map also containing the new key, value pair. If an equivalent key already exists in this Map, it will be replaced. `} /> Note: `set` can be used in `withMutations`. Returns a new Map which excludes this `key`. `} /> Note: `delete` cannot be safely used in IE8, but is provided to mirror the ES6 collection API. Note: `delete` can be used in `withMutations`. Returns a new Map which excludes the provided `keys`. ): this`} /> Note: `deleteAll` can be used in `withMutations`. Returns a new Map containing no keys or values. `} /> Note: `clear` can be used in `withMutations`. Returns a new Map having updated the value at this `key` with the return value of calling `updater` with the existing value. V): Map update(key: K, updater: (value: V | undefined) => V | undefined): Map update(updater: (value: this) => R): R`} /> Similar to: `map.set(key, updater(map.get(key)))`. value + value)`} /> This is most commonly used to call methods on collections within a structure of data. For example, in order to `.push()` onto a nested `List`, `update` and `push` can be used together: list.push(4))`} /> When a `notSetValue` is provided, it is provided to the `updater` function when the value at the key does not exist in the Map. value + value)`} /> However, if the `updater` function returns the same value it was called with, then no change will occur. This is still true if `notSetValue` is provided. val) // Map { "apples": 10 } assert.strictEqual(newMap, aMap);`} /> For code using ES2015 or later, using `notSetValue` is discouraged in favor of function parameter default values. This helps to avoid any potential confusion with identify functions as described above. The previous example behaves differently when written with default values: val)`} /> If no key is provided, then the `updater` function return value is returned as well. aMap.get('key')) // "value"`} /> This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru". For example, to sum the values in a Map: sum + x, 0) } Map({ x: 1, y: 2, z: 3 }) .map(x => x + 1) .filter(x => x % 2 === 0) .update(sum)`} /> Note: `update(key)` can be used in `withMutations`. Returns a new Map resulting from merging the provided Collections (or JS objects) into this Map. In other words, this takes each entry of each collection and sets it on this Map. `} /> Note: Values provided to `merge` are shallowly converted before being merged. No nested values are altered. Note: `merge` can be used in `withMutations`. Like `merge()`, `mergeWith()` returns a new Map resulting from merging the provided Collections (or JS objects) into this Map, but uses the `merger` function for dealing with conflicts. unknown, ...collections): Map`} /> oldVal / newVal, two) // { "a": 0.2, "b": 0.5, "c": 30, "d": 60 } two.mergeWith((oldVal, newVal) => oldVal / newVal, one) // { "b": 2, "a": 5, "d": 60, "c": 30 }`} /> Note: `mergeWith` can be used in `withMutations`. Like `merge()`, but when two compatible collections are encountered with the same key, it merges them as well, recursing deeply through the nested data. Two collections are considered to be compatible (and thus will be merged together) if they both fall into one of three categories: keyed (e.g., `Map`s, `Record`s, and objects), indexed (e.g., `List`s and arrays), or set-like (e.g., `Set`s). If they fall into separate categories, `mergeDeep` will replace the existing collection with the collection being merged in. This behavior can be customized by using `mergeDeepWith()`. `} /> Note: Indexed and set-like collections are merged using `concat()`/`union()` and therefore do not recurse. Note: `mergeDeep` can be used in `withMutations`. Like `mergeDeep()`, but when two non-collections or incompatible collections are encountered at the same key, it uses the `merger` function to determine the resulting value. Collections are considered incompatible if they fall into separate categories between keyed, indexed, and set-like. unknown, ...collections): Map`} /> oldVal / newVal, two)`} /> Note: `mergeDeepWith` can be used in `withMutations`. ## Deep persistent changes Returns a new Map having set `value` at this `keyPath`. If any keys in `keyPath` do not exist, a new immutable Map will be created at that key. , value: unknown): Map`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and `setIn()` can update those values as well, treating them immutably by creating new copies of those values with the changes applied. If any key in the path exists but cannot be updated (such as a primitive like number or a custom Object like Date), an error will be thrown. Note: `setIn` can be used in `withMutations`. Returns a new Map having removed the value at this `keyPath`. If any keys in `keyPath` do not exist, no change will occur. ): Map`} /> Note: `deleteIn` can be used in `withMutations`. Returns a new Map having applied the `updater` to the entry found at the keyPath. , notSetValue: unknown, updater: (value) => unknown): Map`} /> This is most commonly used to call methods on collections nested within a structure of data. For example, in order to `.push()` onto a nested `List`, `updateIn` and `push` can be used together: list.push(4))`} /> If any keys in `keyPath` do not exist, new Immutable `Map`s will be created at those keys. If the `keyPath` does not already contain a value, the `updater` function will be called with `notSetValue`, if provided, otherwise `undefined`. val * 2)`} /> If the `updater` function returns the same value it was called with, then no change will occur. This is still true if `notSetValue` is provided. val) // Map { "a": Map { "b": Map { "c": 10 } } } assert.strictEqual(newMap, map)`} /> For code using ES2015 or later, using `notSetValue` is discouraged in favor of function parameter default values. This helps to avoid any potential confusion with identify functions as described above. The previous example behaves differently when written with default values: val)`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and updateIn() can update those values as well, treating them immutably by creating new copies of those values with the changes applied. val * 2)`} /> If any key in the path exists but cannot be updated (such as a primitive like number or a custom Object like Date), an error will be thrown. Note: `updateIn` can be used in `withMutations`. A combination of `updateIn` and `merge`, returning a new Map, but performing the merge at a point arrived at by following the keyPath. In other words, these two lines are equivalent: ```js map.updateIn(['a', 'b', 'c'], (abc) => abc.merge(y)); map.mergeIn(['a', 'b', 'c'], y); ``` , ...collections: Array): Map`} /> Note: `mergeIn` can be used in `withMutations`. A combination of `updateIn` and `mergeDeep`, returning a new Map, but performing the deep merge at a point arrived at by following the keyPath. In other words, these two lines are equivalent: ```js map.updateIn(['a', 'b', 'c'], (abc) => abc.mergeDeep(y)); map.mergeDeepIn(['a', 'b', 'c'], y); ``` , ...collections: Array): Map`} /> Note: `mergeDeepIn` can be used in `withMutations`. ## Transient changes Every time you call one of the above functions, a new immutable Map is created. If a pure function calls a number of these to produce a final return value, then a penalty on performance and memory has been paid by creating all of the intermediate immutable Maps. If you need to apply a series of mutations to produce a new immutable Map, `withMutations()` creates a temporary mutable copy of the Map which can apply mutations in a highly performant manner. In fact, this is exactly how complex mutations like `merge` are done. unknown): Map`} /> As an example, this results in the creation of 2, not 4, new Maps: { map.set('a', 1).set('b', 2).set('c', 3) }) assert.equal(map1.size, 0) assert.equal(map2.size, 3)`} /> Note: Not all methods can be used on a mutable collection or within `withMutations`! Read the documentation for each method to see if it is safe to use in `withMutations`. Another way to avoid creation of intermediate Immutable maps is to create a mutable copy of this collection. Mutable copies _always_ return `this`, and thus shouldn't be used for equality. Your function should never return a mutable copy of a collection, only use it internally to create a new collection. If possible, use `withMutations` to work with temporary mutable copies as it provides an easier to use API and considers many common optimizations. Note: if the collection is already mutable, `asMutable` returns itself. Note: Not all methods can be used on a mutable collection or within `withMutations`! Read the documentation for each method to see if it allows being used in `withMutations`. Returns true if this is a mutable copy (see `asMutable()`) and mutative alterations have been applied. The yin to `asMutable`'s yang. Because it applies to mutable collections, this operation is _mutable_ and may return itself (though may not return itself, i.e. if the result is an empty collection). Once performed, the original mutable copy must no longer be mutated since it may be the immutable result. If possible, use `withMutations` to work with temporary mutable copies as it provides an easier to use API and considers many common optimizations. ## Sequence algorithms Returns a new Map with values passed through a `mapper` function. (mapper: (value: V, key: K, iter: this) => M, context?: unknown): Map`} /> 10 * x)`} /> Returns a new Map with keys passed through a `mapper` function. (mapper: (key: K, value: V, iter: this) => M, context?: unknown): Map`} /> x.toUpperCase())`} /> Returns a new Map with entries ([key, value] tuples) passed through a `mapper` function. (mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown): Map`} /> [ k.toUpperCase(), v * 2 ])`} /> Note: `mapEntries()` always returns a new instance, even if it produced the same entry at every step. If the mapper function returns `undefined`, then the entry will be filtered. Flat-maps the Map, returning a Map of the same type. Similar to `map(...).flatten(true)`. (mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown): Map`} /> Returns a new Map with only the entries for which the `predicate` function returns true. boolean, context?: unknown): Map`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. Returns a new Map with only the entries for which the `predicate` function returns false. boolean, context?: unknown): this`} /> x % 2 === 0)`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Map with the order of the entries reversed. Returns a new Map with the entries partitioned into two Maps based on the `predicate` function. boolean, context?: unknown): [Map, Map]`} /> x % 2 === 0)`} /> Returns a new Map with the keys and values flipped. `} /> Returns an OrderedMap of the same type which includes the same entries, stably sorted by using a `comparator`. ): this & OrderedMap`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. { if (a < b) { return -1; } if (a > b) { return 1; } if (a === b) { return 0; } });`} /> Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means: ( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: (valueA: C, valueB: C) => number ): OrderedMap`} /> member.name);`} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a `Map` of `Collection`, grouped by the return value of the `grouper` function. ( grouper: (value: V, key: K, iter: this) => G, context?: unknown ): Map`} /> Note: This is always an eager operation. x.get('v'))`} /> ## Conversion to JavaScript types Deeply converts this Keyed collection to equivalent native JavaScript Object. > | { [key in PropertyKey]: DeepCopy }`} /> Converts keys to Strings. Shallowly converts this Keyed collection to equivalent native JavaScript Object. | { [key in PropertyKey]: V }`} /> Converts keys to Strings. Shallowly converts this collection to an Array. | Array<[K, V]>`} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Converts this Collection to a Seq of the same kind (indexed, keyed, or set). `} /> Returns a Seq.Keyed from this Collection where indices are treated as keys. This is useful if you want to operate on a Collection.Indexed and preserve the [index, value] pairs. The returned Seq will have identical iteration order as this Collection. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a Seq.Set of the values of this Collection, discarding keys. `} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key. True if a key exists within this Collection, using Immutable.is to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. Returns the first value in this collection. Returns the last value in this collection. ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean`} /> ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. `} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Set, discarding keys. Throws if values are not hashable. `} /> Note: This is equivalent to `Set(this)`, but provided to allow for chained expressions. Converts this Collection to a Set, maintaining the order of iteration and discarding keys. `} /> Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List, discarding keys. `} /> This is similar to `List(collection)`, but provided to allow for chained expressions. However, when called on `Map` or other keyed collections, `collection.toList()` discards the keys and creates a list of only the values, whereas `List(collection)` creates a list of entry tuples. Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. `} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Iterators An iterator of this `Collection`'s keys. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead, if this is what you want. An iterator of this `Collection`'s values. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead, if this is what you want. An iterator of this `Collection`'s entries as `[ key, value ]` tuples. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead, if this is what you want. ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a new Seq.Indexed of [key, value] tuples. `} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown ): number`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Collection of the same type representing a portion of this Collection from start up to but not including end. `} /> If begin is negative, it is offset from the end of the Collection. e.g. `slice(-2)` returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. `slice(0, -1)` returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. `} /> Returns a new Collection of the same type containing all entries except the last. `} /> Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): Map`} /> x.match(/g/))`} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): Map`} /> x.match(/hat/))`} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): Map`} /> x.match(/o/))`} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): Map`} /> x.match(/at/))`} /> ## Combination Returns a new flattened Map, optionally only flattening to a particular depth. flatten(shallow?: boolean): Map`} /> ## Reducing a value Reduces the Collection to a value by calling the `reducer` for every entry in the Collection and passing along the reduced value. ( reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction?: R, context?: unknown ): R`} /> If `initialReduction` is not provided, the first item in the Collection will be used. Reduces the Collection in reverse (from the right side). ( reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction?: R, context?: unknown ): R`} /> Note: Similar to `this.reverse().reduce()`, and provided for parity with `Array#reduceRight`. True if `predicate` returns true for all entries in the Collection. boolean, context?: unknown ): boolean`} /> True if `predicate` returns true for any entry in the Collection. boolean, context?: unknown ): boolean`} /> Joins values together as a string, inserting a separator between each. The default separator is `","`. Returns true if this Collection includes no values. For some lazy `Seq`, `isEmpty` might need to iterate to determine emptiness. At most one iteration will occur. Returns the size of this Collection. boolean, context?: unknown): number`} /> Regardless of if this Collection can describe its size lazily (some Seqs cannot), this method will always return the correct size. E.g. it evaluates a lazy `Seq` if necessary. If `predicate` is provided, then this returns the count of entries in the Collection for which the `predicate` returns true. Returns a `Seq.Keyed` of counts, grouped by the return value of the `grouper` function. ( grouper: (value: V, key: K, iter: this) => G, context?: unknown ): Map`} /> Note: This is not a lazy operation. ## Search for value Returns the first value for which the `predicate` function returns true. boolean, context?: unknown ): V | undefined`} /> x % 2 === 0)`} /> Returns the last value for which the `predicate` function returns true. boolean, context?: unknown ): V | undefined`} /> x % 2 === 0)`} /> Note: `predicate` will be called for each entry in reverse. Returns the first `[key, value]` entry for which the `predicate` function returns true. boolean, context?: unknown ): [K, V] | undefined`} /> x % 2 === 0)`} /> Returns the last `[key, value]` entry for which the `predicate` function returns true. boolean, context?: unknown ): [K, V] | undefined`} /> x % 2 === 0)`} /> Note: `predicate` will be called for each entry in reverse. Returns the first key for which the `predicate` function returns true. boolean, context?: unknown ): K | undefined`} /> x % 2 === 0)`} /> Returns the last key for which the `predicate` function returns true. boolean, context?: unknown ): K | undefined`} /> x % 2 === 0)`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. number): V | undefined`} /> The comparator is used in the same way as Collection#sort. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max()`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. ( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: (valueA: C, valueB: C) => number ): V | undefined`} /> person.age)`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. number): V | undefined`} /> The comparator is used in the same way as Collection#sort. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min()`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. ( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: (valueA: C, valueB: C) => number ): V | undefined`} /> person.age)`} /> ## Comparison True if `iter` includes every value in this Collection. ): boolean`} /> True if this Collection includes every value in `iter`. ): boolean`} /> immutable-js-immutable-js-6a01d72/website/docs/OrderedCollection.mdx000066400000000000000000000011331522056416100255240ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # OrderedCollection Interface representing all oredered collections. This includes `List`, `Stack`, `Map`, `OrderedMap`, `Set`, and `OrderedSet`. return of `isOrdered()` return true in that case. ## Members Shallowly converts this collection to an Array. Returns an iterator that iterates over the values in this collection. immutable-js-immutable-js-6a01d72/website/docs/OrderedMap.mdx000066400000000000000000000031651522056416100241550ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # OrderedMap A type of [`Map`](../Map/) that maintains the order of iteration according to when entries were set. extends Map`} /> The iteration behavior of OrderedMap is the same as native ES6 Map and JavaScript Object. Note that `OrderedMap` are more expensive than non-ordered Map and may consume more memory. OrderedMap#set is amortized `O(log32 N)`, but not stable. Let's look at the following example to see the difference between `Map` and `OrderedMap`: The `b` key is re-located on the second position. The `b` key is still on the third position. ## Similar API with `Map` `OrderedMap` has the exact same API as [`Map`](../Map/). The only new method is OrderedMap.isOrderedMap(maybeOrderedMap) to check if a value is an `OrderedMap`. ## Construction Creates a new Immutable OrderedMap. (collection?: Iterable<[K, V]>): OrderedMap OrderedMap(obj: { [key: PropertyKey]: V }): OrderedMap`} /> Note: `OrderedMap` is a factory function and not a class, and does not use the `new` keyword during construction. ## Static Methods True if the provided value is an OrderedMap. immutable-js-immutable-js-6a01d72/website/docs/OrderedSet.mdx000066400000000000000000000025321522056416100241700ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # OrderedSet A type of [`Set`](../Set/) that has the additional guarantee that the iteration order of values will be the order in which they were added. extends Set, OrderedCollection`} /> The iteration behavior of OrderedSet is the same as native ES6 Set. Note that `OrderedSet` are more expensive than non-ordered Set and may consume more memory. `OrderedSet#add` is amortized `O(log32 N)`, but not stable. ## Similar API with `Set` `OrderedSet` has the exact same API as [`Set`](../Set/). The only new method is OrderedSet.isOrderedSet(maybeOrderedSet) to check if a value is an `OrderedSet`. ## Construction Create a new immutable OrderedSet containing the values of the provided collection-like. (collection?: Iterable | ArrayLike): OrderedSet`} /> Note: `OrderedSet` is a factory function and not a class, and does not use the `new` keyword during construction. ## Static Methods True if the provided value is an OrderedSet. immutable-js-immutable-js-6a01d72/website/docs/Range().mdx000066400000000000000000000012551522056416100233060ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Range() Returns a Seq.Indexed of numbers from `start` (inclusive) to `end` (exclusive), by `step`, where start defaults to 0, `step` to 1, and `end` to infinity. When `start` is equal to `end`, returns empty range. `} /> Note: `Range` is a factory function and not a class, and does not use the `new` keyword during construction. immutable-js-immutable-js-6a01d72/website/docs/Record.Factory.mdx000066400000000000000000000023521522056416100247540ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Record.Factory A Record.Factory is created by the `Record()` function. Record instances are created by passing it some of the accepted values for that Recordtype: Note that Record Factories return `Record & Readonly`, this allows use of both the Record instance API, and direct property access on the resulting instances: ## Construction ( values?: Partial ): RecordOf`} /> ## Members The name provided to `Record(values, name)` can be accessed with `displayName`. immutable-js-immutable-js-6a01d72/website/docs/Record.mdx000066400000000000000000000243151522056416100233510ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Record A record is similar to a JS object, but enforces a specific set of allowed string keys, and has default values. The `Record()` function produces new Record Factories, which when called create Record instances. Records always have a value for the keys they define. `remove`ing a key from a record simply resets it to the default value for that key. ```js myRecord.get('a'); // 1 myRecord.get('b'); // 3 const myRecordWithoutB = myRecord.remove('b'); myRecordWithoutB.get('b'); // 2 ``` Values provided to the constructor not found in the Record type will be ignored. For example, in this case, ABRecord is provided a key "x" even though only "a" and "b" have been defined. The value for "x" will be ignored for this record. ```js const myRecord = ABRecord({ b: 3, x: 10 }); myRecord.get('x'); // undefined ``` Because Records have a known set of string keys, property get access works as expected, however property sets will throw an Error. Note: IE8 does not support property access. Only use `get()` when supporting IE8. ```js myRecord.b; // 3 myRecord.b = 5; // throws Error ``` Record Types can be extended as well, allowing for custom methods on your Record. This is not a common pattern in functional environments, but is in many JS programs. However Record Types are more restricted than typical JavaScript classes. They do not use a class constructor, which also means they cannot use class properties (since those are technically part of a constructor). While Record Types can be syntactically created with the JavaScript `class` form, the resulting Record function is actually a factory function, not a class constructor. Even though Record Types are not classes, JavaScript currently requires the use of `new` when creating new Record instances if they are defined as a `class`. **Typing Records:** Immutable.js exports two types designed to make it easier to use Records with typed code, `RecordOf` and `RecordFactory`. When defining a new kind of Record factory function, use a type that describes the values the record contains along with `RecordFactory`. To type instances of the Record (which the factory function returns), use `RecordOf`. Typically, new Record definitions will export both the Record factory function as well as the Record instance type for use in other code. ```ts import type { RecordFactory, RecordOf } from 'immutable'; // Use RecordFactory for defining new Record factory functions. type Point3DProps = { x: number, y: number, z: number }; const defaultValues: Point3DProps = { x: 0, y: 0, z: 0 }; const makePoint3D: RecordFactory = Record(defaultValues); export makePoint3D; // Use RecordOf for defining new instances of that Record. export type Point3D = RecordOf; const some3DPoint: Point3D = makePoint3D({ x: 10, y: 20, z: 30 }); ``` **Typing Record Subclasses:** Records can be subclassed as a means to add additional methods to Record instances. This is generally discouraged in favor of a more functional API, since Subclasses have some minor overhead. However the ability to create a rich API on Record types can be quite valuable. When typing Subclasses, do not use `RecordFactory`, instead apply the props type when subclassing: ```ts type PersonProps = { name: string; age: number }; const defaultValues: PersonProps = { name: 'Aristotle', age: 2400 }; const PersonRecord = Record(defaultValues); class Person extends PersonRecord { getName(): string { return this.get('name'); } setName(name: string): this { return this.set('name', name); } } ``` **Choosing Records vs plain JavaScript objects** Records offer a persistently immutable alternative to plain JavaScript objects, however they're not required to be used within Immutable.js collections. In fact, the deep-access and deep-updating functions like `getIn()` and `setIn()` work with plain JavaScript Objects as well. Deciding to use Records or Objects in your application should be informed by the tradeoffs and relative benefits of each: - _Runtime immutability_: plain JS objects may be carefully treated as immutable, however Record instances will _throw_ if attempted to be mutated directly. Records provide this additional guarantee, however at some marginal runtime cost. While JS objects are mutable by nature, the use of type-checking tools like TypeScript or [Flow](https://medium.com/@gcanti/immutability-with-flow-faa050a1aef4) can help gain confidence in code written to favor immutability. - _Value equality_: Records use value equality when compared with `is()` or `record.equals()`. That is, two Records with the same keys and values are equal. Plain objects use _reference equality_. Two objects with the same keys and values are not equal since they are different objects. This is important to consider when using objects as keys in a `Map` or values in a `Set`, which use equality when retrieving values. - _API methods_: Records have a full featured API, with methods like `.getIn()`, and `.equals()`. These can make working with these values easier, but comes at the cost of not allowing keys with those names. - _Default values_: Records provide default values for every key, which can be useful when constructing Records with often unchanging values. However default values can make using Flow and TypeScript more laborious. - _Serialization_: Records use a custom internal representation to efficiently store and update their values. Converting to and from this form isn't free. If converting Records to plain objects is common, consider sticking with plain objects to begin with. ## Construction (defaultValues: TProps, name?: string): Record.Factory`} /> ## Static methods ## Reading values (key: K): TProps[K] get(key: string, notSetValue: T): T`} /> ## Reading deep values (key: K): TProps[K] getIn(key: string, notSetValue: T): T`} /> ## Value equality ## Persistent changes (key: K, value: TProps[K]): this`} /> (key: K, updater: (value: TProps[K]) => TProps[K]): this;`} /> >>): this`} /> >): this;`} /> unknown, ...collections: Array> ): this;`} /> unknown, ...collections: Array> ): this;`} /> Returns a new instance of this Record type with the value for the specific key set to its default value. (key: K): this;`} /> Returns a new instance of this Record type with all values set to their default values. ## Deep persistent changes unknown): this;`} /> >): this;`} /> >): this;`} /> ): this;`} /> ## Conversion to JavaScript types Deeply converts this Record to equivalent native JavaScript Object. Note: This method may not be overridden. Objects with custom serialization to plain JS may override toJSON() instead. ;`} /> Shallowly converts this Record to equivalent native JavaScript Object. Shallowly converts this Record to equivalent JavaScript Object. ## Transient changes Note: Not all methods can be used on a mutable collection or within `withMutations`! Only `set` may be used mutatively. See Map#withMutations unknown): this;`} /> See Map#asMutable See Map#wasAltered See Map#asImmutable ## Sequence algorithms ;`} /> immutable-js-immutable-js-6a01d72/website/docs/Repeat().mdx000066400000000000000000000011011522056416100234600ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Repeat() Returns a Seq.Indexed of `value` repeated `times` times. When `times` is not defined, returns an infinite `Seq` of `value`. (value: T, times?: number): Seq.Indexed`} /> Note: `Repeat` is a factory function and not a class, and does not use the `new` keyword during construction. immutable-js-immutable-js-6a01d72/website/docs/Seq.Indexed.mdx000066400000000000000000000575071522056416100242530ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Seq.Indexed which represents an ordered indexed list of values. ## Construction Always returns Seq.Indexed, discarding associated keys and supplying incrementing indices. Note: `Seq.Indexed` is a conversion function and not a class, and does not use the new keyword during construction. ## Static methods Provides an Seq.Indexed of the values provided. ## Reading values Returns the value associated with the provided index, or notSetValue if the index is beyond the bounds of the Collection. (key: number, notSetValue: NSV): T | NSV; get(key: number): T | undefined;`} /> `index` may be a negative number, which indexes back from the end of the Collection. `s.get(-1)` gets the last item in the Collection. True if a key exists within this `Collection`, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. In case the `Collection` is not empty returns the first element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): T | NSV; first(): T | undefined;`} /> In case the `Collection` is not empty returns the last element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): T | NSV; last(): T | undefined;`} /> ## Conversion to JavaScript types Deeply converts this Indexed Seq to equivalent native JavaScript Array. >;`} /> Shallowly converts this Indexed Seq to equivalent native JavaScript Array. ;`} /> Shallowly converts this collection to an Array. ;`} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Returns Seq.Indexed. ;`} /> If this is a collection of [key, value] entry tuples, it will return a Seq.Keyed of those entries. ;`} /> Returns a Seq.Keyed with the same key-value entries as this Collection.Indexed. ;`} /> Returns a Seq.Indexed with the same values as this Collection.Indexed. ;`} /> Returns a Seq.Set with the same values as this Collection.Indexed. ;`} /> ## Combination Returns a Collection of the same type with `separator` between each item in this Collection. Returns a Collection of the same type with the provided `collections` interleaved into this collection. >): this;`} /> The resulting Collection includes the first item from each, then the second from each, etc. The shortest Collection stops interleave. Since `interleave()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `interleave` _cannot_ be used in `withMutations`. Splice returns a new indexed Collection by replacing a region of this Collection with new values. If values are not provided, it only skips the region to be removed. ): this;`} /> `index` may be a negative number, which indexes back from the end of the Collection. `s.splice(-2)` splices after the second to last item. Since `splice()` re-indexes values, it produces a complete copy, which has `O(N)` complexity. Note: `splice` _cannot_ be used in `withMutations`. Returns a Collection of the same type "zipped" with the provided collections. (other: Collection): Seq.Indexed<[T, U]>;`} /> (other: Collection, other2: Collection): Seq.Indexed<[T, U, V]>;`} /> >): Seq.Indexed;`} /> Like `zipWith`, but using the default `zipper`: creating an `Array`. Returns a Collection "zipped" with the provided collections. Unlike `zip`, `zipAll` continues zipping until the longest collection is exhausted. Missing values from shorter collections are filled with `undefined`. (other: Collection): Seq.Indexed<[T, U]>;`} /> (other: Collection, other2: Collection): Seq.Indexed<[T, U, V]>;`} /> >): Seq.Indexed;`} /> Returns a Collection of the same type "zipped" with the provided collections by using a custom `zipper` function. (zipper: (value: T, otherValue: U) => Z, otherCollection: Collection): Collection.Indexed;`} /> (zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection): Seq.Indexed;`} /> (zipper: (...values: Array) => Z, ...collections: Array>): Seq.Indexed;`} /> a + b, b);`} /> Flattens nested Collections. ;`} /> ;`} /> Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only others Collection, not Arrays or Objects. Note: `flatten(true)` operates on `Collection>` and returns `Collection` ## Search for value Returns the first index at which a given value can be found in the Collection, or -1 if it is not present. Returns the last index at which a given value can be found in the Collection, or -1 if it is not present. Returns the first index in the Collection where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number;`} /> Returns the last index in the Collection where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number;`} /> Returns the first value for which the `predicate` returns true. boolean, context?: unknown): T | undefined;`} /> Returns the last value for which the `predicate` returns true. boolean, context?: unknown): T | undefined;`} /> Note: `predicate` will be called for each entry in reverse. Returns the first [key, value] entry for which the `predicate` returns true. boolean, context?: unknown): [number, T] | undefined;`} /> Returns the last [key, value] entry for which the `predicate` returns true. boolean, context?: unknown): [number, T] | undefined;`} /> Returns the key for which the `predicate` returns true. boolean, context?: unknown): number | undefined;`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown): number | undefined;`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator): T | undefined;`} /> i.avgHit);`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator): T | undefined;`} /> i.avgHit);`} /> ## Sequence algorithms Returns a new Seq with other collections concatenated to this one. (...valuesOrCollections: Array | C>): Seq.Indexed;`} /> Returns a new Seq.Indexed with values passed through a `mapper` function. (mapper: (value: T, key: number, iter: this) => M, context?: unknown): Seq.Indexed;`} /> 10 * x)`} /> Note: `map()` always returns a new instance, even if it produced the same value at every step. Flat-maps the Seq, returning a Seq of the same type. (mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown): Seq.Indexed;`} /> Similar to `seq.map(...).flatten(true)`. Returns a new Collection with only the values for which the `predicate` function returns true. (predicate: (value: T, index: number, iter: this) => value is F, context?: unknown): Seq.Indexed;`} /> unknown, context?: unknown): this;`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. Returns a new indexed Seq with the values for which the `predicate` function returns false and another for which is returns true. (predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C): [Seq.Indexed, Seq.Indexed];`} /> (predicate: (this: C, value: T, index: number, iter: this) => unknown, context?: C): [this, this];`} /> ;`} /> Returns a new Collection with only the values for which the `predicate` function returns false. unknown, context?: unknown): this;`} /> x > 2)`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection with the values in reverse order. Returns a new sorted Collection, sorted by the natural order of the values. ;`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. Note: `sort()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a new sorted Collection, sorted by the provided `comparator` function. (comparator: (value: T) => R): Collection.Indexed;`} /> Note: `sortBy()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Groups the values by the return value of the `mapper` function, and returns a Collection.Indexed of Arrays of grouped values. (mapper: (value: T) => K): Collection.Indexed>;`} /> ## Value equality Returns true if the Collections are of the same size and all values are equal. Returns a hash code for this Collection. ## Reading deep values Returns the value at the given nested path, or notSetValue if any key in the path is not present. (path: Array, notSetValue: NSV): T | NSV;`} /> ): T | undefined;`} /> Returns a boolean if the given nested path exists. ): boolean;`} /> ## Persistent changes Returns a new Collection.Indexed with the value at the given index updated to the new value. T): this;`} /> ## Conversion to Collections Converts this Collection.Indexed to a Map. The first value of each entry is used as the key. ;`} /> Converts this Collection.Indexed to an OrderedMap. The first value of each entry is used as the key. ;`} /> Converts this Collection.Indexed to a Set. ;`} /> Converts this Collection.Indexed to an OrderedSet. ;`} /> Converts this Collection.Indexed to a List. ;`} /> Converts this Collection.Indexed to a Stack. ;`} /> ## Iterators Returns an Iterable of the keys in the Collection. ;`} /> Returns an Iterable of the values in the Collection. ;`} /> Returns an Iterable of the [key, value] entries in the Collection. ;`} /> ## Collections (Seq) Returns a Seq of the keys in the Collection. ;`} /> Returns a Seq of the values in the Collection. ;`} /> Returns a Seq of the [key, value] entries in the Collection. ;`} /> ## Side effects Calls the provided function for each value in the Collection. Returns the Collection. void, context?: unknown): this;`} /> ## Creating subsets Returns a new Collection.Indexed with the values between the given start and end indices. Returns a new Collection.Indexed with all but the first value. Returns a new Collection.Indexed with all but the last value. Returns a new Collection.Indexed with the first `n` values removed. Returns a new Collection.Indexed with the last `n` values removed. Returns a new Collection.Indexed with values skipped while the `predicate` function returns true. boolean, context?: unknown): this;`} /> Returns a new Collection.Indexed with values skipped until the `predicate` function returns true. boolean, context?: unknown): this;`} /> Returns a new Collection.Indexed with the first `n` values. Returns a new Collection.Indexed with the last `n` values. Returns a new Collection.Indexed with values taken while the `predicate` function returns true. boolean, context?: unknown): this;`} /> Returns a new Collection.Indexed with values taken until the `predicate` function returns true. boolean, context?: unknown): this;`} /> ## Reducing a value Returns the accumulated result of calling the provided reducer function for each value in the Collection, from left to right. (reducer: (previousValue: R | T, currentValue: T, index: number, iter: this) => R, initialValue?: R): R;`} /> Returns the accumulated result of calling the provided reducer function for each value in the Collection, from right to left. (reducer: (previousValue: R | T, currentValue: T, index: number, iter: this) => R, initialValue?: R): R;`} /> Returns true if the `predicate` function returns a truthy value for every value in the Collection. boolean, context?: unknown): boolean;`} /> Returns true if the `predicate` function returns a truthy value for any value in the Collection. boolean, context?: unknown): boolean;`} /> Returns the concatenated string result of calling `String(value)` on every value in the Collection, separated by the given separator string. Returns true if the Collection has no values. Returns the number of values in the Collection. Returns a new Collection.Indexed with the number of times each value occurs in the Collection. ;`} /> ## Comparison Returns true if this Collection.Indexed is a subset of the other Collection (i.e. all values in this Collection.Indexed are also in the other). Returns true if this Collection.Indexed is a superset of the other Collection (i.e. this Collection.Indexed contains all values of the other). immutable-js-immutable-js-6a01d72/website/docs/Seq.Keyed.mdx000066400000000000000000000665101522056416100237260ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Seq.Keyed which represents key-value pairs. ## Construction Always returns a `Seq.Keyed`, if input is not keyed, expects an collection of [K, V] tuples. (collection?: Iterable<[K, V]>): Seq.Keyed Seq.Keyed(obj: {[key: string]: V}): Seq.Keyed`} /> Note: `Seq.Keyed` is a conversion function and not a class, and does not use the `new` keyword during construction. ## Conversion to JavaScript types Deeply converts this Keyed Seq to equivalent native JavaScript Object. };`} /> Converts keys to Strings. Shallowly converts this Keyed Seq to equivalent native JavaScript Object. Converts keys to Strings. Shallowly converts this collection to an Array. ;`} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Returns itself. Returns a Seq.Keyed from this Collection where indices are treated as keys. ;`} /> This is useful if you want to operate on an Collection.Indexed and preserve the [index, value] pairs. The returned Seq will have identical iteration order as this Collection. ```js const indexedSeq = Seq(['A', 'B', 'C']); // Seq [ "A", "B", "C" ] indexedSeq.filter((v) => v === 'B'); // Seq [ "B" ] const keyedSeq = indexedSeq.toKeyedSeq(); // Seq { 0: "A", 1: "B", 2: "C" } keyedSeq.filter((v) => v === 'B'); ``` Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a Seq.Set of the values of this Collection, discarding keys. ;`} /> ## Sequence functions Returns a new Collection.Keyed of the same type where the keys and values have been flipped. ```js import { Map } from 'immutable'; Map({ a: 'z', b: 'y' }).flip(); // Map { "z": "a", "y": "b" } ``` Returns a new Seq with other collections concatenated to this one. All entries will be present in the resulting Seq, even if they have the same key. ( ...collections: Array> ): Seq.Keyed; concat( ...collections: Array<{ [key: string]: C }> ): Seq.Keyed;`} /> Returns a new Seq.Keyed with values passed through a `mapper` function. (mapper: (value: V, key: K, iter: this) => M, context?: unknown): Seq.Keyed;`} /> ```js import { Seq } from 'immutable'; Seq.Keyed({ a: 1, b: 2 }).map((x) => 10 * x); // Seq { "a": 10, "b": 20 } ``` Note: `map()` always returns a new instance, even if it produced the same value at every step. Returns a new Collection.Keyed of the same type with keys passed through a `mapper` function. (mapper: (key: K, value: V, iter: this) => M, context?: unknown): Seq.Keyed;`} /> ```js import { Map } from 'immutable'; Map({ a: 1, b: 2 }).mapKeys((x) => x.toUpperCase()); // Map { "A": 1, "B": 2 } ``` Note: `mapKeys()` always returns a new instance, even if it produced the same key at every step. Returns a new Collection.Keyed of the same type with entries ([key, value] tuples) passed through a `mapper` function. (mapper: (entry: [K, V], index: number, iter: this) => [KM, VM] | undefined, context?: unknown): Seq.Keyed;`} /> ```js import { Map } from 'immutable'; Map({ a: 1, b: 2 }).mapEntries(([k, v]) => [k.toUpperCase(), v * 2]); // Map { "A": 2, "B": 4 } ``` Note: `mapEntries()` always returns a new instance, even if it produced the same entry at every step. If the mapper function returns `undefined`, then the entry will be filtered. Flat-maps the Seq, returning a Seq of the same type. (mapper: (value: V, key: K, iter: this) => Iterable<[KM, VM]>, context?: unknown): Seq.Keyed;`} /> Similar to `seq.map(...).flatten(true)`. Returns a new Seq with only the entries for which the `predicate` function returns true. (predicate: (value: V, key: K, iter: this) => value is F, context?: unknown): Seq.Keyed;`} /> unknown, context?: unknown): this;`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. (predicate: (this: C, value: V, key: K, iter: this) => value is F, context?: C): [Seq.Keyed, Seq.Keyed];`} /> (predicate: (this: C, value: V, key: K, iter: this) => unknown, context?: C): [this, this];`} /> Returns a new keyed Seq with the values for which the `predicate` function returns false and another for which is returns true. ;`} /> Yields [key, value] pairs. ## Value equality Returns true if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: this is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. ```js const a = List([1, 2, 3]); const b = List([1, 2, 3]); assert.notStrictEqual(a, b); // different instances const set = Set([a]); assert.equal(set.has(b), true); ``` If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. (key: K, notSetValue: NSV): V | NSV;`} /> Note: it is possible a key may be associated with an `undefined` value, so if `notSetValue` is not provided and this method returns `undefined`, that does not guarantee the key was not found. True if a key exists within this `Collection`, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. In case the `Collection` is not empty returns the first element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> In case the `Collection` is not empty returns the last element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown;`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean;`} /> ## Persistent changes This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru". (updater: (value: this) => R): R;`} /> For example, to sum a Seq after mapping and filtering: sum + x, 0); } Seq([1, 2, 3]) .map((x) => x + 1) .filter((x) => x % 2 === 0) .update(sum);`} /> ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. ;`} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. ;`} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Set, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to Set(this), but provided to allow for chained expressions. Converts this Collection to a Set, maintaining the order of iteration and discarding keys. ;`} /> Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List, discarding keys. ;`} /> This is similar to `List(collection)`, but provided to allow for chained expressions. However, when called on `Map` or other keyed collections, `collection.toList()` ignores the keys and creates a list of just the values, whereas `List(collection)` creates a list of entry tuples. Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Iterators An iterator of this `Collection`'s keys. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead if you want an Immutable.js Seq. An iterator of this `Collection`'s values. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead if you want an Immutable.js Seq. An iterator of this `Collection`'s entries as `[ key, value ]` tuples. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead if you want an Immutable.js Seq. ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. ;`} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a new Seq.Indexed of [key, value] tuples. ;`} /> ## Sequence algorithms Returns a new Collection of the same type with only the entries for which the `predicate` function returns false. boolean, context?: unknown): this;`} /> ```js import { Map } from 'immutable'; Map({ a: 1, b: 2, c: 3, d: 4 }).filterNot((x) => x % 2 === 0); // Map { "a": 1, "c": 3 } ``` Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection of the same type in reverse order. Returns a new Collection of the same type which includes the same entries, stably sorted by using a `comparator`. ): this;`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. ```js import { Map } from 'immutable'; Map({ c: 3, a: 1, b: 2 }).sort((a, b) => { if (a < b) { return -1; } if (a > b) { return 1; } if (a === b) { return 0; } }); // OrderedMap { "a": 1, "b": 2, "c": 3 } ``` Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means: (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: (valueA: C, valueB: C) => number): this;`} /> member.name);`} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a `Map` of `Collection`, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map;`} /> Note: This is always an eager operation. x.get('v'));`} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown): number;`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Collection of the same type representing a portion of this Collection from start up to but not including end. If begin is negative, it is offset from the end of the Collection. e.g. slice(-2) returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. slice(0, -1) returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. Returns a new Collection of the same type containing all entries except the last. Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): this;`} /> x.match(/g/)) // List [ "cat", "hat", "god" ] `} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): this;`} /> x.match(/hat/)) // List [ "hat", "god" ] `} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. Returns a new Collection of the same type which includes the last `amount` entries from this Collection. Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): this;`} /> ```js import { List } from 'immutable'; List(['dog', 'frog', 'cat', 'hat', 'god']).takeWhile((x) => x.match(/o/)); // List [ "dog", "frog" ] ``` Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): this;`} /> ```js import { List } from 'immutable'; List(['dog', 'frog', 'cat', 'hat', 'god']).takeUntil((x) => x.match(/at/)); // List [ "dog", "frog" ] ``` ## Combination Flattens nested Collections. ; flatten(shallow?: boolean): Collection;`} /> Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only other Collections, not Arrays or Objects. Note: `flatten(true)` operates on `Collection>` and returns `Collection`. ## Reducing a value Reduces the Collection to a value by calling the `reducer` for every entry in the Collection and passing along the reduced value. If `initialReduction` is not provided, the first item in the Collection will be used. (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R; reduce(reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R;`} /> Reduces the Collection in reverse (from the right side). (reducer: (reduction: R, value: V, key: K, iter: this) => R, initialReduction: R, context?: unknown): R; reduceRight(reducer: (reduction: V | R, value: V, key: K, iter: this) => R): R;`} /> True if `predicate` returns true for all entries in the Collection. boolean, context?: unknown): boolean;`} /> True if `predicate` returns true for any entry in the Collection. boolean, context?: unknown): boolean;`} /> Joins values together as a string, inserting a separator between each. The default separator is `","`. Returns true if this Collection includes no values. For some lazy `Seq`, `isEmpty` might need to iterate to determine emptiness. At most one iteration will occur. Returns the size of this Collection. Regardless of if this Collection can describe its size lazily (some Seqs cannot), this method will always return the correct size. E.g. it evaluates a lazy `Seq` if necessary. If `predicate` is provided, then this returns the count of entries in the Collection for which the `predicate` returns true. boolean, context?: unknown): number;`} /> Returns a `Seq.Keyed` of counts, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map;`} /> Note: This is not a lazy operation. ## Search for value Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): V | undefined;`} /> Returns the last value for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown, notSetValue?: V): V | undefined;`} /> Returns the first [key, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V): [K, V] | undefined;`} /> Returns the last [key, value] entry for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown, notSetValue?: V): [K, V] | undefined;`} /> Returns the key for which the `predicate` returns true. boolean, context?: unknown): K | undefined;`} /> Returns the last key for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown): K | undefined;`} /> Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. ): V | undefined;`} /> Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): V | undefined;`} /> ```js import { List } from 'immutable'; const l = List([ { name: 'Bob', avgHit: 1 }, { name: 'Max', avgHit: 3 }, { name: 'Lili', avgHit: 2 }, ]); l.maxBy((i) => i.avgHit); // will output { name: 'Max', avgHit: 3 ``` Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): V | undefined;`} /> The `comparator` is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): V | undefined;`} /> ```js import { List } from 'immutable'; const l = List([ { name: 'Bob', avgHit: 1 }, { name: 'Max', avgHit: 3 }, { name: 'Lili', avgHit: 2 }, ]); l.minBy((i) => i.avgHit); // will output { name: 'Bob', avgHit: 1 } ``` ## Comparison True if `iter` includes every value in this Collection. ): boolean;`} /> True if this Collection includes every value in `iter`. ): boolean;`} /> immutable-js-immutable-js-6a01d72/website/docs/Seq.Set.mdx000066400000000000000000000542461522056416100234230ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Seq.Set which represents a set of values. Because are often lazy, `Seq.Set` does not provide the same guarantee of value uniqueness as the concrete . ## Construction Always returns a Seq.Set, discarding associated indices or keys. Note: `Seq.Set` is a conversion function and not a class, and does not use the new keyword during construction. ## Static methods Returns a Seq.Set of the provided values. ## Members ## Force evaluation ## Persistent changes ## Sequence algorithms Returns a new `Seq.Set` with values passed through a `mapper` function. (mapper: (value: T, key: T, iter: this) => M, context?: unknown): Set`} /> 10 * x)`} /> Note: `map()` always returns a new instance, even if it produced the same value at every step. Flat-maps the Seq, returning a Seq of the same type. Similar to `set.map(...).flatten(true)`. (mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown): Seq.Set`} /> Returns a new Set with only the values for which the `predicate` function returns true. Note: `filter()` always returns a new instance, even if it results in not filtering out any values. boolean, context?: unknown): Seq.Set`} /> Returns a new Set with only the values for which the `predicate` function returns false. boolean, context?: unknown): Seq.Set`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Set with the values for which the `predicate` function returns false and another for which is returns true. boolean, context?: C): [Seq.Set, Seq.Set]`} /> Returns a new Collection of the same type which includes the same entries, stably sorted by using a `comparator`. ): OrderedSet`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): this & OrderedSet`} /> person.age)`} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a new Set with the order of the values reversed. `} /> Returns a `Map` of `Set`, grouped by the return value of the `grouper` function. (grouper: (value: T, key: T, iter: this) => G, context?: unknown): Map>`} /> Note: This is not a lazy operation. ## Conversion to JavaScript types Deeply converts this Set Seq to equivalent native JavaScript Array. >`} /> Shallowly converts this Set Seq to equivalent native JavaScript Array. `} /> Shallowly converts this collection to an Array. `} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Returns itself. `} /> Returns a Seq.Keyed from this Collection where indices are treated as keys. This is useful if you want to operate on a Collection and preserve the [value, value] pairs. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a Seq.Set of the values of this Collection, discarding keys. `} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. Note: it is possible a key may be associated with an `undefined` value, so if `notSetValue` is not provided and this method returns `undefined`, that does not guarantee the key was not found. (key: T, notSetValue: NSV): T | NSV get(key: T): T | undefined`} /> True if a key exists within this Collection, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. Returns the first value in this Collection. (notSetValue: NSV): T | NSV first(): T | undefined`} /> Returns the last value in this Collection. (notSetValue: NSV): T | NSV last(): T | undefined`} /> ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean`} /> ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. `} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Returns itself. `} /> Converts this Collection to a Set, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedSet(this)`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List. `} /> Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. `} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Iterators An iterator of this `Set`'s keys. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead, if this is what you want. An iterator of this `Set`'s values. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead, if this is what you want. An iterator of this `Set`'s entries as `[value, value]` tuples. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead, if this is what you want. ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a new Seq.Indexed of [value, value] tuples. `} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown): number`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Set of the same type representing a portion of this Set from start up to but not including end. `} /> If begin is negative, it is offset from the end of the Collection. e.g. `slice(-2)` returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. `slice(0, -1)` returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. `} /> Returns a new Collection of the same type containing all entries except the last. `} /> Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): Set`} /> x.match(/g/))`} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): Set`} /> x.match(/hat/))`} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): Set`} /> x.match(/o/))`} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): Set`} /> x.match(/at/))`} /> ## Combination Returns a new Seq with other collections concatenated to this one. (...valuesOrCollections: Array | C>): Seq.Set`} /> Flattens nested Collections. Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only others Collection, not Arrays or Objects. Flat-maps the Set, returning a new Set. Similar to `set.map(...).flatten(true)`. (mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown): Set`} /> ## Reducing a value Reduces the Iterable to a value by calling the `reducer` for every entry in the Iterable and passing along the reduced value. (reducer: (reduced: R, value: T, key: T, iter: this) => R, initialValue: R): R`} /> If initialValue is not provided, the first entry in the Iterable will be used as the initial value. Reduces the Iterable to a value by calling the `reducer` for every entry in the Iterable and passing along the reduced value. (reducer: (reduced: R, value: T, key: T, iter: this) => R, initialValue: R): R`} /> Note: Similar to this.reverse().reduce(), and provided for parity with `Array#reduceRight`. Returns true if the `predicate` returns true for every entry in the Iterable. boolean, context?: unknown): boolean`} /> Returns true if the `predicate` returns true for any entry in the Iterable. boolean, context?: unknown): boolean`} /> Returns a string of all the entries in the Iterable, separated by `separator`. Returns true if the Iterable is empty. Returns the number of entries in the Iterable. Returns a Map of the number of occurrences of each value in the Iterable. (grouper: (value: T, key: T, iter: this) => G, context?: unknown): Map`} /> ## Search for value Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Returns the last value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first [value, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [T, T] | undefined`} /> Returns the last [value, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [T, T] | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first key for which the `predicate` returns true. boolean, context?: unknown): T | undefined`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> The comparator is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): T | undefined`} /> person.age)`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> The comparator is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): T | undefined`} /> person.age)`} /> ## Comparison True if `iter` includes every value in this Collection. ): boolean`} /> True if this Collection includes every value in `iter`. ): boolean`} /> immutable-js-immutable-js-6a01d72/website/docs/Seq.mdx000066400000000000000000000723461522056416100226720ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Seq `Seq` describes a lazy operation, allowing them to efficiently chain use of all the higher-order collection methods (such as and ) by not creating intermediate collections. extends Collection`} /> **Seq is immutable** — Once a Seq is created, it cannot be changed, appended to, rearranged or otherwise modified. Instead, any mutative method called on a `Seq` will return a new `Seq`. **Seq is lazy** — `Seq` does as little work as necessary to respond to any method call. Values are often created during iteration, including implicit iteration when reducing or converting to a concrete data structure such as a or JavaScript [`Array`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array). For example, the following performs no work, because the resulting `Seq`'s values are never iterated: ```js import { Seq } from 'immutable'; const oddSquares = Seq([1, 2, 3, 4, 5, 6, 7, 8]) .filter((x) => x % 2 !== 0) .map((x) => x * x); ``` Once the `Seq` is used, it performs only the work necessary. In this example, no intermediate arrays are ever created, filter is called three times, and map is only called once: ```js oddSquares.get(1); // 9 ``` Any collection can be converted to a lazy Seq with `Seq()`. ```js import { Map } from 'immutable'; const map = Map({ a: 1, b: 2, c: 3 }); const lazySeq = Seq(map); ``` `Seq` allows for the efficient chaining of operations, allowing for the expression of logic that can otherwise be very tedious: ```js lazySeq .flip() .map((key) => key.toUpperCase()) .flip(); // Seq { A: 1, B: 1, C: 1 } ``` As well as expressing logic that would otherwise seem memory or time limited, for example `Range` is a special kind of Lazy sequence. -n) .filter((n) => n % 2 === 0) .take(2) .reduce((r, n) => r * n, 1); `} /> Seq is often used to provide a rich collection API to JavaScript Object. v * 2) .toObject();`} /> ## Construction Creates a Seq. (seq: S): S; function Seq(collection: Collection.Keyed): Seq.Keyed; function Seq(collection: Collection.Set): Seq.Set; function Seq(collection: Collection.Indexed | Iterable | ArrayLike): Seq.Indexed; function Seq(obj: { [key: string]: V }): Seq.Keyed;`} /> Returns a particular kind of `Seq` based on the input. * If a `Seq`, that same `Seq`. * If an `Collection`, a `Seq` of the same kind (Keyed, Indexed, or Set). * If an Array-like, an `Seq.Indexed`. * If an Iterable Object, an `Seq.Indexed`. * If an Object, a `Seq.Keyed`. Note: An Iterator itself will be treated as an object, becoming a `Seq.Keyed`, which is usually not what you want. You should turn your Iterator Object into an iterable object by defining a Symbol.iterator (or @@iterator) method which returns `this`. Note: `Seq` is a conversion function and not a class, and does not use the `new` keyword during construction. ## Static methods ## Members Some Seqs can describe their size lazily. When this is the case, size will be an integer. Otherwise it will be undefined. For example, Seqs returned from or preserve the size of the original `Seq` while does not. Note: , and `Seq`s made from s and s will always have a size. ## Force evaluation Because Sequences are lazy and designed to be chained together, they do not cache their results. For example, this function is called a total of 6 times, as each `join` iterates the `Seq` of three values. ```js var squares = Seq([1, 2, 3]).map((x) => x * x); squares.join() + squares.join(); ``` If you know a `Seq` will be used multiple times, it may be more efficient to first cache it in memory. Here, the function is called only 3 times. ```js var squares = Seq([1, 2, 3]) .map((x) => x * x) .cacheResult(); squares.join() + squares.join(); ``` Use this method judiciously, as it must fully evaluate a `Seq` which can be a burden on memory and possibly performance. Note: after calling , a `Seq` will always have a `size`. ## Sequence algorithms Returns a new `Seq` with values passed through a `mapper` function. (mapper: (value: V, key: K, iter: this) => M, context?: unknown): Seq;`} /> 10 * x);`} /> Note: always returns a new instance, even if it produced the same value at every step. Note: used only for sets. Flat-maps the `Seq`, returning a `Seq` of the same type. (mapper: (value: V, key: K, iter: this) => Iterable, context?: unknown): Seq;`} /> Similar to (...).(true). Note: Used only for sets. Returns a new `Seq` with only the values for which the `predicate` function returns true. unknown, context?: unknown): this;`} /> Note: always returns a new instance, even if it results in not filtering out any values. Returns a new `Seq` with the values for which the `predicate` function returns false and another for which is returns true. ( predicate: (this, value: V, key: K, iter) => value is F, context ): [Seq, Seq];`} /> Returns a new `Seq` of the same type with other values and collection-like concatenated to this one. All entries will be present in the resulting `Seq`, even if they have the same key. Returns a new Collection of the same type with only the entries for which the `predicate` function returns false. boolean, context): this;`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Collection of the same type in reverse order. Returns a new Collection of the same type which includes the same entries, stably sorted by using a `comparator`. ): this;`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. When sorting collections which have no defined order, their ordered equivalents will be returned. e.g. `map.sort()` returns OrderedMap. { if (a < b) { return -1; } if (a > b) { return 1; } if (a === b) { return 0; } });`} /> Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means. (comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator): this;`} /> member.name); `} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a `Map` of `Collection`, grouped by the return value of the `grouper` function. ( grouper: (value: V, key: K, iter: this) => G, context?: unknown ): Map`} /> Note: This is always an eager operation. x.get('v'))`} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. ```js import { Seq, Set } from 'immutable'; const a = Seq([1, 2, 3]); const b = Seq([1, 2, 3]); assert.notStrictEqual(a, b); // different instances const set = Set([a]); assert.equal(set.has(b), true); ``` Note: hashCode() MUST return a Uint32 number. The easiest way to guarantee this is to return `myHash | 0` from a custom implementation. If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. Note: `hashCode()` is not guaranteed to always be called before `equals()`. Most but not all Immutable.js collections use hash codes to organize their internal data structures, while all Immutable.js collections use equality during lookups. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. Note: it is possible a key may be associated with an `undefined` value, so if `notSetValue` is not provided and this method returns `undefined`, that does not guarantee the key was not found. (key: K, notSetValue: NSV): V | NSV;`} /> True if a key exists within this `Collection`, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. In case the `Collection` is not empty returns the first element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> In case the `Collection` is not empty returns the last element of the `Collection`. In case the `Collection` is empty returns the optional default value if provided, if no default value is provided returns undefined. (notSetValue: NSV): V | NSV;`} /> ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown;`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean;`} /> ## Persistent changes This can be very useful as a way to "chain" a normal function into a sequence of methods. RxJS calls this "let" and lodash calls it "thru". (updater: (value: this) => R): R;`} /> For example, to sum a Seq after mapping and filtering: sum + x, 0); } Seq([1, 2, 3]) .map((x) => x + 1) .filter((x) => x % 2 === 0) .update(sum);`} /> ## Conversion to JavaScript types Deeply converts this Seq to equivalent native JavaScript Array or Object. | { [key: string]: V };`} /> `Collection.Indexed`, and `Collection.Set` become `Array`, while `Collection.Keyed` become `Object`, converting keys to Strings. Shallowly converts this Seq to equivalent native JavaScript Array or Object. | { [key: string]: V };`} /> `Collection.Indexed`, and `Collection.Set` become `Array`, while `Collection.Keyed` become `Object`, converting keys to Strings. Shallowly converts this collection to an Array. ;`} /> `Collection.Indexed`, and `Collection.Set` produce an Array of values. `Collection.Keyed` produce an Array of [key, value] tuples. Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. ;`} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. ;`} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Set, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to `Set(this)`, but provided to allow for chained expressions. Converts this Collection to a Set, maintaining the order of iteration and discarding keys. ;`} /> Note: This is equivalent to `OrderedSet(this.valueSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List, discarding keys. ;`} /> This is similar to `List(collection)`, but provided to allow for chained expressions. However, when called on `Map` or other keyed collections, `collection.toList()` discards the keys and creates a list of only the values, whereas `List(collection)` creates a list of entry tuples. Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. ;`} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Conversion to Seq Converts this Collection to a Seq of the same kind (indexed, keyed, or set). ;`} /> Returns a Seq.Keyed from this Collection where indices are treated as keys. ;`} /> This is useful if you want to operate on an Collection.Indexed and preserve the [index, value] pairs. The returned Seq will have identical iteration order as this Collection. ```js import { Seq } from 'immutable'; const indexedSeq = Seq(['A', 'B', 'C']); // Seq [ "A", "B", "C" ] indexedSeq.filter((v) => v === 'B'); // Seq [ "B" ] const keyedSeq = indexedSeq.toKeyedSeq(); // Seq { 0: "A", 1: "B", 2: "C" } keyedSeq.filter((v) => v === 'B'); // Seq { 1: "B" } ``` Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a Seq.Set of the values of this Collection, discarding keys. ;`} /> ## Iterators An iterator of this `Collection`'s keys. ;`} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead, if this is what you want. An iterator of this `Collection`'s values. Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead, if this is what you want. ;`} /> An iterator of this `Collection`'s entries as `[ key, value ]` tuples. Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead, if this is what you want. ;`} /> ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. ;`} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. ;`} /> Returns a new Seq.Indexed of [key, value] tuples. ;`} /> ## Side effects The sideEffect is executed for every entry in the Seq. unknown, context?: unknown): number;`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned `false`). ## Creating subsets Returns a new Seq of the same type containing entries from begin up to but not including end. If begin is negative, it is offset from the end of the Seq. If end is negative, it is also offset from the end of the Seq. If end is not provided, it will default to the size of the Seq. If the requested slice is empty, returns the same type of empty Seq. Returns a new Seq of the same type containing all entries except the first. Returns a new Seq of the same type containing all entries except the last. Returns a new Seq of the same type containing all entries except the first amount. Returns a new Seq of the same type containing all entries except the last amount. Returns a new Seq of the same type containing entries from the first entry for which predicate returns false. boolean, context?: unknown): this;`} /> Returns a new Seq of the same type containing entries from the first entry for which predicate returns true. boolean, context?: unknown): this;`} /> Returns a new Seq of the same type containing the first amount entries. Returns a new Seq of the same type containing the last amount entries. Returns a new Seq of the same type containing entries from the start until predicate returns false. boolean, context?: unknown): this;`} /> Returns a new Seq of the same type containing entries from the start until predicate returns true. boolean, context?: unknown): this;`} /> ## Combination Flattens nested Collections. Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only other Collections, not Arrays or Objects. Note: `flatten(true)` operates on `Collection>` and returns `Collection`. Reduces the Collection to a value by calling the `reducer` for every entry in the Collection and passing along the reduced value. If `initialReduction` is not provided, the first item in the Collection will be used. @see `Array#reduce`. (reducer: (reduction, value, key, iter: this) => R): R;`} /> Reduces the Collection in reverse (from the right side). Note: Similar to `this.reverse().reduce()`, and provided for parity with `Array#reduceRight`. (reducer: (reduction, value, key, iter: this) => R): R;`} /> True if `predicate` returns true for all entries in the Collection. boolean, context?: unknown ): boolean;`} /> True if `predicate` returns true for any entry in the Collection. boolean, context?: unknown ): boolean;`} /> Joins values together as a string, inserting a separator between each. The default separator is `","`. Returns true if this Collection includes no values. For some lazy `Seq`, `isEmpty` might need to iterate to determine emptiness. At most one iteration will occur. Returns the size of this Collection. Regardless of if this Collection can describe its size lazily (some Seqs cannot), this method will always return the correct size. E.g. it evaluates a lazy `Seq` if necessary. If `predicate` is provided, then this returns the count of entries in the Collection for which the `predicate` returns true. boolean, context?: unknown): number;`} /> Returns a `Seq.Keyed` of counts, grouped by the return value of the `grouper` function. (grouper: (value: V, key: K, iter: this) => G, context?: unknown): Map;`} /> Note: This is not a lazy operation. ## Search for value Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V ): V | undefined;`} /> Returns the last value for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown, notSetValue?: V ): V | undefined;`} /> Returns the first [key, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: V ): [K, V] | undefined;`} /> Returns the last [key, value] entry for which the `predicate` returns true. Note: `predicate` will be called for each entry in reverse. boolean, context?: unknown, notSetValue?: V ): [K, V] | undefined;`} /> Returns the key for which the `predicate` returns true. boolean, context?: unknown ): K | undefined;`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown ): K | undefined;`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): V | undefined;`} /> The `comparator` is used in the same way as . If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: ( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): V | undefined;`} /> i.avgHit); `} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): V | undefined;`} /> The `comparator` is used in the same way as . If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative _only_ when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: ( comparatorValueMapper: (value: V, key: K, iter: this) => C, comparator?: Comparator ): V | undefined;`} /> i.avgHit); `} /> ## Comparison True if `iter` includes every value in this Collection. ): boolean;`} /> True if this Collection includes every value in `iter`. ): boolean;`} /> immutable-js-immutable-js-6a01d72/website/docs/Set.mdx000066400000000000000000000635571522056416100227010ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Set A Collection of unique values with `O(log32 N)` adds and has. extends Collection.Set`} /> When iterating a Set, the entries will be (value, value) pairs. Iteration order of a Set is undefined, however is stable. Multiple iterations of the same Set will iterate in the same order. Set values, like Map keys, may be of any type. Equality is determined by `Immutable.is` enabling Sets to uniquely include other Immutable collections, custom value types, and NaN. ## Construction Create a new Immutable Set. (collection?: Iterable | ArrayLike): Set`} /> Note: `Set` is a factory function and not a class, and does not use the `new` keyword during construction. ## Static Methods True if the provided value is a Set. Creates a new Set containing `values`. (...values: Array): Set`} /> `Set.fromKeys()` creates a new immutable Set containing the keys from this Collection or JavaScript Object. (iter: Collection.Keyed): Set Set.fromKeys(iter: Collection): Set Set.fromKeys(obj: { [key: string]: unknown }): Set`} /> Creates a Set that contains every value shared between all of the provided Sets. (sets: Iterable>): Set`} /> Creates a Set that contains all values contained in any of the provided Sets. (sets: Iterable>): Set`} /> ## Members The number of items in this Set. ## Persistent changes Returns a new Set which includes this value. `} /> Note: `add` can be used in `withMutations`. Returns a new Set which excludes this value. `} /> Note: `delete` cannot be safely used in IE8, use `remove` if supporting old browsers. Note: `delete` can be used in `withMutations`. Returns a new Set containing no values. `} /> Note: `clear` can be used in `withMutations`. Returns a Set including any value from `collections` that does not already exist in this Set. (...collections: Array>): Set`} /> Note: `union` can be used in `withMutations`. Returns a Set which has removed any values not also contained within `collections`. >): Set`} /> Note: `intersect` can be used in `withMutations`. Returns a Set excluding any values contained within `collections`. >): Set`} /> Note: `subtract` can be used in `withMutations`. ## Transient changes Note: Not all methods can be used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it allows being used in `withMutations`. unknown): Set`} /> `} /> Note: Not all methods can be used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it allows being used in `withMutations`. Returns true if this is a mutable copy (see `asMutable()`) and mutative alterations have been applied. The yin to `asMutable`'s yang. Because it applies to mutable collections, this operation is _mutable_ and may return itself (though may not return itself, i.e. if the result is an empty collection). Once performed, the original mutable copy must no longer be mutated since it may be the immutable result. `} /> If possible, use `withMutations` to work with temporary mutable copies as it provides an easier to use API and considers many common optimizations. ## Sequence algorithms Returns a new Set with values passed through a `mapper` function. (mapper: (value: T, key: T, iter: this) => M, context?: unknown): Set`} /> 10 * x)`} /> Flat-maps the Set, returning a new Set. Similar to `set.map(...).flatten(true)`. (mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown): Set`} /> Returns a new Set with only the values for which the `predicate` function returns true. Note: `filter()` always returns a new instance, even if it results in not filtering out any values. boolean, context?: unknown): Set`} /> Returns a new Set with only the values for which the `predicate` function returns false. boolean, context?: unknown): Set`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Set with the values for which the `predicate` function returns false and another for which is returns true. boolean, context?: C): [Set, Set]`} /> Returns an OrderedSet of the same type which includes the same entries, stably sorted by using a `comparator`. ): OrderedSet`} /> If a `comparator` is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. Note: `sort()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: (valueA: C, valueB: C) => number): this & OrderedSet`} /> person.age)`} /> Note: `sortBy()` Always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a new Set with the order of the values reversed. `} /> Returns a `Map` of `Set`, grouped by the return value of the `grouper` function. (grouper: (value: T, key: T, iter: this) => G, context?: unknown): Map>`} /> Note: This is not a lazy operation. ## Conversion to JavaScript types Deeply converts this Set to equivalent native JavaScript Array. >`} /> Shallowly converts this Set to equivalent native JavaScript Array. `} /> Shallowly converts this collection to an Array. `} /> Shallowly converts this Collection to an Object. Converts keys to Strings. ## Conversion to Seq Returns itself. `} /> Returns a Seq.Keyed from this Collection where indices are treated as keys. This is useful if you want to operate on a Collection and preserve the [value, value] pairs. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a Seq.Set of the values of this Collection, discarding keys. `} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) ## Reading values Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. Note: it is possible a key may be associated with an `undefined` value, so if `notSetValue` is not provided and this method returns `undefined`, that does not guarantee the key was not found. (key: T, notSetValue: NSV): T | NSV get(key: T): T | undefined`} /> True if a key exists within this Collection, using `Immutable.is` to determine equality. True if a value exists within this `Collection`, using `Immutable.is` to determine equality. Returns the first value in this Collection. (notSetValue: NSV): T | NSV first(): T | undefined`} /> Returns the last value in this Collection. (notSetValue: NSV): T | NSV last(): T | undefined`} /> ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown`} /> Plain JavaScript Object or Arrays may be nested within an Immutable.js Collection, and getIn() can access those values as well: True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean`} /> ## Conversion to Collections Converts this Collection to a Map, Throws if keys are not hashable. `} /> Note: This is equivalent to `Map(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Converts this Collection to a Map, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedMap(this.toKeyedSeq())`, but provided for convenience and to allow for chained expressions. Returns itself. `} /> Converts this Collection to a Set, maintaining the order of iteration. `} /> Note: This is equivalent to `OrderedSet(this)`, but provided for convenience and to allow for chained expressions. Converts this Collection to a List. `} /> Converts this Collection to a Stack, discarding keys. Throws if values are not hashable. `} /> Note: This is equivalent to `Stack(this)`, but provided to allow for chained expressions. ## Iterators An iterator of this `Set`'s keys. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `keySeq` instead, if this is what you want. An iterator of this `Set`'s values. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `valueSeq` instead, if this is what you want. An iterator of this `Set`'s entries as `[value, value]` tuples. `} /> Note: this will return an ES6 iterator which does not support Immutable.js sequence algorithms. Use `entrySeq` instead, if this is what you want. ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Collection, discarding values. `} /> Returns an Seq.Indexed of the values of this Collection, discarding keys. `} /> Returns a new Seq.Indexed of [value, value] tuples. `} /> ## Side effects The `sideEffect` is executed for every entry in the Collection. unknown, context?: unknown): number`} /> Unlike `Array#forEach`, if any call of `sideEffect` returns `false`, the iteration will stop. Returns the number of entries iterated (including the last iteration which returned false). ## Creating subsets Returns a new Set of the same type representing a portion of this Set from start up to but not including end. `} /> If begin is negative, it is offset from the end of the Collection. e.g. `slice(-2)` returns a Collection of the last two entries. If it is not provided the new Collection will begin at the beginning of this Collection. If end is negative, it is offset from the end of the Collection. e.g. `slice(0, -1)` returns a Collection of everything but the last entry. If it is not provided, the new Collection will continue through the end of this Collection. If the requested slice is equivalent to the current Collection, then it will return itself. Returns a new Collection of the same type containing all entries except the first. `} /> Returns a new Collection of the same type containing all entries except the last. `} /> Returns a new Collection of the same type which excludes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which excludes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): Set`} /> x.match(/g/))`} /> Returns a new Collection of the same type which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): Set`} /> x.match(/hat/))`} /> Returns a new Collection of the same type which includes the first `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes the last `amount` entries from this Collection. `} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns true. boolean, context?: unknown): Set`} /> x.match(/o/))`} /> Returns a new Collection of the same type which includes entries from this Collection as long as the `predicate` returns false. boolean, context?: unknown): Set`} /> x.match(/at/))`} /> ## Combination Returns a new Set with other collections concatenated to this one. (...valuesOrCollections: Array | C>): Set`} /> Flattens nested Collections. Will deeply flatten the Collection by default, returning a Collection of the same type, but a `depth` can be provided in the form of a number or boolean (where true means to shallowly flatten one level). A depth of 0 (or shallow: false) will deeply flatten. Flattens only others Collection, not Arrays or Objects. Flat-maps the Set, returning a new Set. Similar to `set.map(...).flatten(true)`. (mapper: (value: T, key: T, iter: this) => Iterable, context?: unknown): Set`} /> ## Reducing a value Reduces the Iterable to a value by calling the `reducer` for every entry in the Iterable and passing along the reduced value. (reducer: (reduced: R, value: T, key: T, iter: this) => R, initialValue: R): R`} /> If initialValue is not provided, the first entry in the Iterable will be used as the initial value. Reduces the Iterable to a value by calling the `reducer` for every entry in the Iterable and passing along the reduced value. (reducer: (reduced: R, value: T, key: T, iter: this) => R, initialValue: R): R`} /> Note: Similar to this.reverse().reduce(), and provided for parity with `Array#reduceRight`. Returns true if the `predicate` returns true for every entry in the Iterable. boolean, context?: unknown): boolean`} /> Returns true if the `predicate` returns true for any entry in the Iterable. boolean, context?: unknown): boolean`} /> Returns a string of all the entries in the Iterable, separated by `separator`. Returns true if the Iterable is empty. Returns the number of entries in the Iterable. Returns a Map of the number of occurrences of each value in the Iterable. (grouper: (value: T, key: T, iter: this) => G, context?: unknown): Map`} /> ## Search for value Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Returns the last value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first [value, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [T, T] | undefined`} /> Returns the last [value, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [T, T] | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first key for which the `predicate` returns true. boolean, context?: unknown): T | undefined`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> The comparator is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `>`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `max` will operate independent of the order of input as long as the comparator is commutative. The default comparator `>` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): T | undefined`} /> person.age)`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> The comparator is used in the same way as `Collection#sort`. If it is not provided, the default comparator is `<`. When two values are considered equivalent, the first encountered will be returned. Otherwise, `min` will operate independent of the order of input as long as the comparator is commutative. The default comparator `<` is commutative only when types do not differ. If `comparator` returns 0 and either value is NaN, undefined, or null, that value will be returned. Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means: (comparatorValueMapper: (value: T, key: T, iter: this) => C, comparator?: Comparator): T | undefined`} /> person.age)`} /> ## Comparison True if `iter` includes every value in this Collection. ): boolean`} /> True if this Collection includes every value in `iter`. ): boolean`} /> immutable-js-immutable-js-6a01d72/website/docs/Stack.mdx000066400000000000000000000601541522056416100232010ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # Stack Stacks are indexed collections which support very efficient `O(1)` addition and removal from the front using `unshift(v)` and `shift()`. extends Collection.Indexed`} /> For familiarity, Stack also provides `push(v)`, `pop()`, and `peek()`, but be aware that they also operate on the front of the list, unlike List or a JavaScript Array. Note: `reverse()` or any inherent reverse traversal (`reduceRight`, `lastIndexOf`, etc.) is not efficient with a Stack. Stack is implemented with a Single-Linked List. ## Construction Create a new immutable Stack containing the values of the provided collection-like. (collection?: Iterable | ArrayLike): Stack`} /> Note: `Stack` is a factory function and not a class, and does not use the `new` keyword during construction. ## Static Methods True if the provided value is a Stack. `} /> Creates a new Stack containing `values`. (...values: Array): Stack`} /> ## Members The number of items in this Stack. ## Reading values Alias for `Stack.first()`. Returns the value associated with the provided key, or notSetValue if the Collection does not contain this key. (key: number, notSetValue: NSV): T | NSV get(key: number): T | undefined`} /> True if a key exists within this Collection, using `Immutable.is` to determine equality. True if a value exists within this Collection, using `Immutable.is` to determine equality. Returns the first value in this Collection. Returns the last value in this Collection. ## Persistent changes Returns a new Stack with 0 size and no values. `} /> Note: `clear` can be used in `withMutations`. Returns a new Stack with the provided `values` prepended, shifting other values ahead to higher indices. ): Stack`} /> This is very efficient for Stack. Note: `unshift` can be used in `withMutations`. Like `Stack#unshift`, but accepts a collection rather than varargs. ): Stack`} /> Note: `unshiftAll` can be used in `withMutations`. Returns a new Stack with a size ones less than this Stack, excluding the first item in this Stack, shifting all other values to a lower index. `} /> Note: this differs from `Array#shift` because it returns a new Stack rather than the removed value. Use `first()` or `peek()` to get the first value in this Stack. Note: `shift` can be used in `withMutations`. Alias for `Stack#unshift` and is not equivalent to `List#push`. ): Stack`} /> Alias for `Stack#unshiftAll`. ): Stack`} /> Alias for `Stack#shift` and is not equivalent to `List#pop`. `} /> Returns a new Stack with an updated value at `index` with the return value of calling `updater` with the existing value. T | undefined): this update(updater: (value: this) => R): R`} /> ## Transient changes Note: Not all methods can be used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it mentions being safe to use in `withMutations`. unknown): this`} /> Note: Not all methods can be used on a mutable collection or within `withMutations`! Check the documentation for each method to see if it mentions being safe to use in `withMutations`. ## Sequence algorithms Returns a new Stack with other collections concatenated to this one. (...valuesOrCollections: Array | C>): Stack`} /> Returns a new Stack with values passed through a `mapper` function. (mapper: (value: T, key: number, iter: this) => M, context?: unknown): Stack`} /> Note: `map()` always returns a new instance, even if it produced the same value at every step. Flat-maps the Stack, returning a new Stack. Similar to `stack.map(...).flatten(true)`. (mapper: (value: T, key: number, iter: this) => Iterable, context?: unknown): Stack`} /> Returns a new Set with only the values for which the `predicate` function returns true. (predicate: (value: T, index: number, iter: this) => value is F, context?: unknown): Set filter(predicate: (value: T, index: number, iter: this) => unknown, context?: unknown): this`} /> Note: `filter()` always returns a new instance, even if it results in not filtering out any values. Returns a new Stack with the values for which the `predicate` function returns false and another for which it returns true. (predicate: (this: C, value: T, index: number, iter: this) => value is F, context?: C): [Stack, Stack] partition(predicate: (this: C, value: T, index: number, iter: this) => unknown, context?: C): [this, this]`} /> Returns a Stack "zipped" with the provided collections. Like `zipWith`, but using the default `zipper`: creating an `Array`. (other: Collection): Stack<[T, U]> zip(other: Collection, other2: Collection): Stack<[T, U, V]> zip(...collections: Array>): Stack`} /> Example: ```js const a = Stack([1, 2, 3]); const b = Stack([4, 5, 6]); const c = a.zip(b); // Stack [ [ 1, 4 ], [ 2, 5 ], [ 3, 6 ] ] ``` Returns a Stack "zipped" with the provided collections. Unlike `zip`, `zipAll` continues zipping until the longest collection is exhausted. Missing values from shorter collections are filled with `undefined`. (other: Collection): Stack<[T, U]> zipAll(other: Collection, other2: Collection): Stack<[T, U, V]> zipAll(...collections: Array>): Stack`} /> Example: ```js const a = Stack([1, 2]); const b = Stack([3, 4, 5]); const c = a.zipAll(b); // Stack [ [ 1, 3 ], [ 2, 4 ], [ undefined, 5 ] ] ``` Note: Since zipAll will return a collection as large as the largest input, some results may contain undefined values. TypeScript cannot account for these without cases (as of v2.5). Returns a Stack "zipped" with the provided collections by using a custom `zipper` function. (zipper: (value: T, otherValue: U) => Z, otherCollection: Collection): Stack zipWith(zipper: (value: T, otherValue: U, thirdValue: V) => Z, otherCollection: Collection, thirdCollection: Collection): Stack zipWith(zipper: (...values: Array) => Z, ...collections: Array>): Stack`} /> Example: ```js const a = Stack([1, 2, 3]); const b = Stack([4, 5, 6]); const c = a.zipWith((a, b) => a + b, b); // Stack [ 5, 7, 9 ] ``` ## Sequence algorithms Returns an iterator of this Stack. `} /> Returns a new Stack with only the values for which the `predicate` function returns false. boolean, context?: unknown): this`} /> Note: `filterNot()` always returns a new instance, even if it results in not filtering out any values. Returns a new Stack with the order of the values reversed. Returns Stack of the same type which includes the same entries, stably sorted by using a comparator. ): this`} /> If a comparator is not provided, a default comparator uses `<` and `>`. `comparator(valueA, valueB)`: - Returns `0` if the elements should not be swapped. - Returns `-1` (or any negative number) if `valueA` comes before `valueB` - Returns `1` (or any positive number) if `valueA` comes after `valueB` - Alternatively, can return a value of the `PairSorting` enum type - Is pure, i.e. it must always return the same value for the same pair of values. Note: `sort()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Like `sort`, but also accepts a `comparatorValueMapper` which allows for sorting by more sophisticated means. (comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator): this`} /> Note: `sortBy()` always returns a new instance, even if the original was already sorted. Note: This is always an eager operation. Returns a `Map` of `Stack`, grouped by the return value of the `grouper` function. (grouper: (value: T, key: number, iter: this) => G, context?: unknown): Map>`} /> Note: This is not a lazy operation. ## Conversion to JavaScript types Deeply converts this Stack to equivalent native JavaScript Array. >`} /> Shallowly converts this Stack to equivalent native JavaScript Array. `} /> Shallowly converts this collection to an Array. `} /> Shallowly converts this Stack to a JavaScript Object. ## Conversion to Seq Returns a Seq.Indexed of the values of this Stack. `} /> If this is a collection of [key, value] entry tuples, it will return a Seq.Keyed of those entries. `} /> Returns a Seq.Keyed from this Stack where indices are treated as keys. `} /> Returns a Seq.Indexed of the values of this Stack, discarding keys. `} /> Returns a Seq.Set of the values of this Stack, discarding keys. `} /> ## Combination Returns a new Stack with the separator inserted between each value in this Stack. `} /> Returns a new Stack with the values from each collection interleaved. >): Stack`} /> Returns a new Stack by replacing a region of this Stack with new values. If values are not provided, it only skips the region to be removed. ): Stack`} /> Returns a new flattened Stack, optionally only flattening to a particular depth. flatten(shallow?: boolean): Stack`} /> ## Search for value Returns the first index at which a given value can be found in the Stack, or -1 if it is not present. Returns the last index at which a given value can be found in the Stack, or -1 if it is not present. Returns the first index in the Stack where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number`} /> Returns the last index in the Stack where a value satisfies the provided predicate function. Otherwise -1 is returned. boolean, context?: unknown): number`} /> Returns the first value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Returns the last value for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): T | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first [key, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [number, T] | undefined`} /> Returns the last [key, value] entry for which the `predicate` returns true. boolean, context?: unknown, notSetValue?: T): [number, T] | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the first key for which the `predicate` returns true. boolean, context?: unknown): number | undefined`} /> Returns the last key for which the `predicate` returns true. boolean, context?: unknown): number | undefined`} /> Note: `predicate` will be called for each entry in reverse. Returns the key associated with the search value, or undefined. Returns the last key associated with the search value, or undefined. Returns the maximum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> Like `max`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator): T | undefined`} /> Returns the minimum value in this collection. If any values are comparatively equivalent, the first one found will be returned. ): T | undefined`} /> Like `min`, but also accepts a `comparatorValueMapper` which allows for comparing by more sophisticated means. (comparatorValueMapper: (value: T, key: number, iter: this) => C, comparator?: Comparator): T | undefined`} /> ## Value equality True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. ## Reading deep values Returns the value found by following a path of keys or indices through nested Collections. , notSetValue?: unknown): unknown`} /> True if the result of following a path of keys or indices through nested Collections results in a set value. ): boolean`} /> ## Conversion to Collections Converts this Stack to a Map, Throws if keys are not hashable. `} /> Converts this Stack to a Map, maintaining the order of iteration. `} /> Converts this Stack to a Set, discarding keys. `} /> Converts this Stack to a Set, maintaining the order of iteration and discarding keys. `} /> Converts this Stack to a List, discarding keys. `} /> Returns itself. `} /> ## Iterators An iterator of this Stack's keys. `} /> An iterator of this Stack's values. `} /> An iterator of this Stack's entries as [key, value] tuples. `} /> ## Collections (Seq) Returns a new Seq.Indexed of the keys of this Stack, discarding values. `} /> Returns an Seq.Indexed of the values of this Stack, discarding keys. `} /> Returns a new Seq.Indexed of [key, value] tuples. `} /> ## Side effects The `sideEffect` is executed for every entry in the Stack. unknown, context?: unknown): number`} /> ## Creating subsets Returns a new Stack representing a portion of this Stack from start up to but not including end. `} /> Returns a new Stack containing all entries except the first. `} /> Returns a new Stack containing all entries except the last. `} /> Returns a new Stack which excludes the first `amount` entries from this Stack. `} /> Returns a new Stack which excludes the last `amount` entries from this Stack. `} /> Returns a new Stack which includes entries starting from when `predicate` first returns false. boolean, context?: unknown): Stack`} /> Returns a new Stack which includes entries starting from when `predicate` first returns true. boolean, context?: unknown): Stack`} /> Returns a new Stack which includes the first `amount` entries from this Stack. `} /> Returns a new Stack which includes the last `amount` entries from this Stack. `} /> Returns a new Stack which includes entries from this Stack as long as the `predicate` returns true. boolean, context?: unknown): Stack`} /> Returns a new Stack which includes entries from this Stack as long as the `predicate` returns false. boolean, context?: unknown): Stack`} /> ## Reducing a value Reduces the Stack to a value by calling the `reducer` for every entry in the Stack and passing along the reduced value. (reducer: (reduction: R, value: T, key: number, iter: this) => R, initialReduction: R, context?: unknown): R reduce(reducer: (reduction: T | R, value: T, key: number, iter: this) => R): R`} /> Reduces the Stack in reverse (from the right side). (reducer: (reduction: R, value: T, key: number, iter: this) => R, initialReduction: R, context?: unknown): R reduceRight(reducer: (reduction: T | R, value: T, key: number, iter: this) => R): R`} /> True if `predicate` returns true for all entries in the Stack. boolean, context?: unknown): boolean`} /> True if `predicate` returns true for any entry in the Stack. boolean, context?: unknown): boolean`} /> Joins values together as a string, inserting a separator between each. The default separator is `","`. Returns true if this Stack includes no values. Returns the size of this Stack. boolean, context?: unknown): number`} /> Returns a `Map` of counts, grouped by the return value of the `grouper` function. (grouper: (value: T, key: number, iter: this) => G, context?: unknown): Map`} /> ## Comparison True if `iter` includes every value in this Stack. ): boolean`} /> True if this Stack includes every value in `iter`. ): boolean`} /> immutable-js-immutable-js-6a01d72/website/docs/ValueObject.mdx000066400000000000000000000030121522056416100243250ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # ValueObject The interface to fulfill to qualify as a Value Object. ## Members True if this and the other Collection have value equality, as defined by `Immutable.is()`. Note: This is equivalent to `Immutable.is(this, other)`, but provided to allow for chained expressions. Computes and returns the hashed identity for this Collection. The `hashCode` of a Collection is used to determine potential equality, and is used when adding this to a `Set` or as a key in a `Map`, enabling lookup via a different instance. Note: hashCode() MUST return a Uint32 number. The easiest way to guarantee this is to return `myHash | 0` from a custom implementation. If two values have the same `hashCode`, they are [not guaranteed to be equal][Hash Collision]. If two values have different `hashCode`s, they must not be equal. Note: `hashCode()` is not guaranteed to always be called before `equals()`. Most but not all Immutable.js collections use hash codes to organize their internal data structures, while all Immutable.js collections use equality during lookups. [Hash Collision]: https://en.wikipedia.org/wiki/Collision_(computer_science) immutable-js-immutable-js-6a01d72/website/docs/fromJS().mdx000066400000000000000000000054611522056416100234550ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # fromJS() Deeply converts plain JS objects and arrays to Immutable Maps and Lists. unknown ): Collection; `} /> `fromJS` will convert Arrays and [array-like objects][2] to a List, and plain objects (without a custom prototype) to a Map. [Iterable objects][3] may be converted to List, Map, or Set. If a `reviver` is optionally provided, it will be called with every collection as a Seq (beginning with the most nested collections and proceeding to the top-level collection itself), along with the key referring to each collection and the parent JS object provided as `this`. For the top level, object, the key will be `""`. This `reviver` is expected to return a new Immutable Collection, allowing for custom conversions from deep JS objects. Finally, a `path` is provided which is the sequence of keys to this value from the starting value. `reviver` acts similarly to the [same parameter in `JSON.parse`][1]. If `reviver` is not provided, the default behavior will convert Objects into Maps and Arrays into Lists like so: ```js import { fromJS, isKeyed } from 'immutable'; function (key, value) { return isKeyed(value) ? value.toMap() : value.toList() } ``` Accordingly, this example converts native JS data to OrderedMap and List: ```js import { fromJS, isKeyed } from 'immutable'; fromJS({ a: { b: [10, 20, 30] }, c: 40 }, function (key, value, path) { console.log(key, value, path); return isKeyed(value) ? value.toOrderedMap() : value.toList(); }) > 'b', [10, 20, 30], ['a', 'b'] > 'a', { b: [10, 20, 30] }, ['a'] > '', { a: { b: [10, 20, 30] }, c: 40 }, []; ``` Keep in mind, when using JS objects to construct Immutable Maps, that JavaScript Object properties are always strings, even if written in a quote-less shorthand, while Immutable Maps accept keys of any type. ```js import { Map } from 'immutable'; let obj = { 1: 'one' }; Object.keys(obj); // [ "1" ] assert.equal(obj['1'], obj[1]); // "one" === "one" let map = Map(obj); assert.notEqual(map.get('1'), map.get(1)); // "one" !== undefined ``` Property access for JavaScript Objects first converts the key to a string, but since Immutable Map keys can be of any type the argument to `get()` is not altered. [1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse#Example.3A_Using_the_reviver_parameter 'Using the reviver parameter' [2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Indexed_collections#working_with_array-like_objects 'Working with array-like objects' [3]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols#the_iterable_protocol 'The iterable protocol' immutable-js-immutable-js-6a01d72/website/docs/get().mdx000066400000000000000000000011711522056416100230260ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # get() Returns the value within the provided collection associated with the provided key, or notSetValue if the key is not defined in the collection. A functional alternative to `collection.get(key)` which will also work on plain Objects and Arrays as an alternative for `collection[key]`. immutable-js-immutable-js-6a01d72/website/docs/getIn().mdx000066400000000000000000000010721522056416100233150ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # getIn() Returns the value at the provided key path starting at the provided collection, or notSetValue if the key path is not defined. A functional alternative to `collection.getIn(keypath)` which will also work with plain Objects and Arrays. immutable-js-immutable-js-6a01d72/website/docs/has().mdx000066400000000000000000000011351522056416100230220ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # has() Returns true if the key is defined in the provided collection. A functional alternative to `collection.has(key)` which will also work with plain Objects and Arrays as an alternative for `collection.hasOwnProperty(key)`. immutable-js-immutable-js-6a01d72/website/docs/hasIn().mdx000066400000000000000000000007551522056416100233200ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # hasIn() Returns true if the key path is defined in the provided collection. A functional alternative to `collection.hasIn(keypath)` which will also work with plain Objects and Arrays. immutable-js-immutable-js-6a01d72/website/docs/hash().mdx000066400000000000000000000022521522056416100231730ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # hash() The `hash()` function is an important part of how Immutable determines if two values are equivalent and is used to determine how to store those values. Provided with any value, `hash()` will return a 31-bit integer. When designing Objects which may be equal, it's important that when a `.equals()` method returns true, that both values `.hashCode()` method return the same value. `hash()` may be used to produce those values. For non-Immutable Objects that do not provide a `.hashCode()` functions (including plain Objects, plain Arrays, Date objects, etc), a unique hash value will be created for each _instance_. That is, the create hash represents referential equality, and not value equality for Objects. This ensures that if that Object is mutated over time that its hash code will remain consistent, allowing Objects to be used as keys and values in Immutable.js collections. Note that `hash()` attempts to balance between speed and avoiding collisions, however it makes no attempt to produce secure hashes. _New in Version 4.0_ immutable-js-immutable-js-6a01d72/website/docs/is().mdx000066400000000000000000000017671522056416100226750ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # is() Value equality check with semantics similar to `Object.is`, but treats Immutable `Collection`s as values, equal if the second `Collection` includes equivalent values. It's used throughout Immutable when checking for equality, including `Map` key equality and `Set` membership. ```js import { Map, is } from 'immutable'; const map1 = Map({ a: 1, b: 1, c: 1 }); const map2 = Map({ a: 1, b: 1, c: 1 }); assert.equal(map1 !== map2, true); assert.equal(Object.is(map1, map2), false); assert.equal(is(map1, map2), true); ``` `is()` compares primitive types like strings and numbers, Immutable.js collections like `Map` and `List`, but also any custom object which implements `ValueObject` by providing `equals()` and `hashCode()` methods. Note: Unlike `Object.is`, `Immutable.is` assumes `0` and `-0` are the same value, matching the behavior of ES6 Map key equality. immutable-js-immutable-js-6a01d72/website/docs/isAssociative().mdx000066400000000000000000000007771522056416100250700ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isAssociative() True if `maybeAssociative` is either a Keyed or Indexed Collection. ```js import { isAssociative, Map, List, Stack, Set } from 'immutable'; isAssociative([]); // false isAssociative({}); // false isAssociative(Map()); // true isAssociative(List()); // true isAssociative(Stack()); // true isAssociative(Set()); // false ``` immutable-js-immutable-js-6a01d72/website/docs/isCollection().mdx000066400000000000000000000007231522056416100247000ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isCollection() True if `maybeCollection` is a Collection, or any of its subclasses. ```js import { isCollection, Map, List, Stack } from 'immutable'; isCollection([]); // false isCollection({}); // false isCollection(Map()); // true isCollection(List()); // true isCollection(Stack()); // true ``` immutable-js-immutable-js-6a01d72/website/docs/isImmutable().mdx000066400000000000000000000010741522056416100245240ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isImmutable() True if `maybeImmutable` is an Immutable Collection or Record. Note: Still returns true even if the collections is within a `withMutations()`. ```js import { isImmutable, Map, List, Stack } from 'immutable'; isImmutable([]); // false isImmutable({}); // false isImmutable(Map()); // true isImmutable(List()); // true isImmutable(Stack()); // true isImmutable(Map().asMutable()); // true ``` immutable-js-immutable-js-6a01d72/website/docs/isIndexed().mdx000066400000000000000000000007361522056416100241710ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isIndexed() True if `maybeIndexed` is a Collection.Indexed, or any of its subclasses. ```js import { isIndexed, Map, List, Stack, Set } from 'immutable'; isIndexed([]); // false isIndexed({}); // false isIndexed(Map()); // false isIndexed(List()); // true isIndexed(Stack()); // true isIndexed(Set()); // false ``` immutable-js-immutable-js-6a01d72/website/docs/isKeyed().mdx000066400000000000000000000006501522056416100236450ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isKeyed() True if `maybeKeyed` is a Collection.Keyed, or any of its subclasses. ```js import { isKeyed, Map, List, Stack } from 'immutable'; isKeyed([]); // false isKeyed({}); // false isKeyed(Map()); // true isKeyed(List()); // false isKeyed(Stack()); // false ``` immutable-js-immutable-js-6a01d72/website/docs/isList().mdx000066400000000000000000000003031522056416100235120ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isList() True if `maybeList` is a List. immutable-js-immutable-js-6a01d72/website/docs/isMap().mdx000066400000000000000000000003321522056416100233160ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isMap() True if `maybeMap` is a Map. Also true for OrderedMaps. immutable-js-immutable-js-6a01d72/website/docs/isOrdered().mdx000066400000000000000000000010561522056416100241710ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isOrdered() True if `maybeOrdered` is a Collection where iteration order is well defined. True for Collection.Indexed as well as OrderedMap and OrderedSet. ```js import { isOrdered, Map, OrderedMap, List, Set } from 'immutable'; isOrdered([]); // false isOrdered({}); // false isOrdered(Map()); // false isOrdered(OrderedMap()); // true isOrdered(List()); // true isOrdered(Set()); // false ``` immutable-js-immutable-js-6a01d72/website/docs/isOrderedMap().mdx000066400000000000000000000003421522056416100246240ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isOrderedMap() True if `maybeOrderedMap` is an OrderedMap. immutable-js-immutable-js-6a01d72/website/docs/isOrderedSet().mdx000066400000000000000000000003421522056416100246420ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isOrderedSet() True if `maybeOrderedSet` is an OrderedSet. immutable-js-immutable-js-6a01d72/website/docs/isRecord().mdx000066400000000000000000000003151522056416100240200ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isRecord() True if `maybeRecord` is a Record. immutable-js-immutable-js-6a01d72/website/docs/isSeq().mdx000066400000000000000000000002761522056416100233400ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isSeq() True if `maybeSeq` is a Seq. immutable-js-immutable-js-6a01d72/website/docs/isSet().mdx000066400000000000000000000003321522056416100233340ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isSet() True if `maybeSet` is a Set. Also true for OrderedSets. immutable-js-immutable-js-6a01d72/website/docs/isStack().mdx000066400000000000000000000003101522056416100236420ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isStack() True if `maybeStack` is a Stack. immutable-js-immutable-js-6a01d72/website/docs/isValueObject().mdx000066400000000000000000000006541522056416100250130ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # isValueObject() True if `maybeValue` is a JavaScript Object which has _both_ `equals()` and `hashCode()` methods. Any two instances of value objects can be compared for value equality with `Immutable.is()` and can be used as keys in a `Map` or members in a `Set`. immutable-js-immutable-js-6a01d72/website/docs/merge().mdx000066400000000000000000000007031522056416100233460ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # merge() Returns a new collection with the provided collections merged in. A functional alternative to `collection.merge()` which will also work with plain Objects and Arrays (collection: C, ...collections: Array>): C;`} /> immutable-js-immutable-js-6a01d72/website/docs/mergeDeep().mdx000066400000000000000000000021301522056416100241400ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; # mergeDeep() Like [`merge()`](<../merge()>), but when two compatible collections are encountered with the same key, it merges them as well, recursing deeply through the nested data. Two collections are considered to be compatible (and thus will be merged together) if they both fall into one of three categories: keyed (e.g., [`Map`](../Map)s, [`Record`](../Record)s, and objects), indexed (e.g., [`List`](../List)s and arrays), or set-like (e.g., [`Set`](../Set)s). If they fall into separate categories, [`mergeDeep`](<../mergeDeep()>) will replace the existing collection with the collection being merged in. This behavior can be customized by using [`mergeDeepWith()`](<../mergeDeepWith()>). Note: Indexed and set-like collections are merged using `concat()`/`union()` and therefore do not recurse. A functional alternative to `collection.mergeDeep()` which will also work with plain Objects and Arrays. immutable-js-immutable-js-6a01d72/website/docs/mergeDeepWith().mdx000066400000000000000000000013531522056416100250020ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; # mergeDeepWith() Like[`mergeDeep()`](<../mergeDeep()>), but when two non-collections or incompatible collections are encountered at the same key, it uses the `merger` function to determine the resulting value. Collections are considered incompatible if they fall into separate categories between keyed, indexed, and set-like. any, collection, ...collections )`} /> A functional alternative to `collection.mergeDeepWith()` which will also work with plain Objects and Arrays. oldVal + newVal, original, { x: { y: 456 }} )`} /> immutable-js-immutable-js-6a01d72/website/docs/mergeWith().mdx000066400000000000000000000010061522056416100241770ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # mergeWith() Returns a copy of the collection with the remaining collections merged in, calling the `merger` function whenever an existing value is encountered. A functional alternative to `collection.mergeWith()` which will also work with plain Objects and Arrays. oldVal + newVal, original, { y: 789, z: 'abc' } )`} /> immutable-js-immutable-js-6a01d72/website/docs/remove().mdx000066400000000000000000000011101522056416100235350ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # remove() Returns a copy of the collection with the value at key removed. A functional alternative to `collection.remove(key)` which will also work with plain Objects and Arrays as an alternative for `delete collectionCopy[key]`. immutable-js-immutable-js-6a01d72/website/docs/removeIn().mdx000066400000000000000000000007441522056416100240400ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # removeIn() Returns a copy of the collection with the value at the key path removed. A functional alternative to `collection.removeIn(keypath)` which will also work with plain Objects and Arrays. immutable-js-immutable-js-6a01d72/website/docs/set().mdx000066400000000000000000000011471522056416100230450ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # set() Returns a copy of the collection with the value at key set to the provided value. A functional alternative to `collection.set(key, value)` which will also work with plain Objects and Arrays as an alternative for `collectionCopy[key] = value`. immutable-js-immutable-js-6a01d72/website/docs/setIn().mdx000066400000000000000000000007511522056416100233340ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # setIn() Returns a copy of the collection with the value at the key path set to the provided value. A functional alternative to `collection.setIn(keypath)` which will also work with plain Objects and Arrays. immutable-js-immutable-js-6a01d72/website/docs/update().mdx000066400000000000000000000014121522056416100235270ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # update() Returns a copy of the collection with the value at key set to the result of providing the existing value to the updating function. A functional alternative to `collection.update(key, fn)` which will also work with plain Objects and Arrays as an alternative for `collectionCopy[key] = fn(collection[key])`. val.toUpperCase()); // [ 'dog', 'FROG', 'cat' ]`} /> val * 6); // { x: 738, y: 456 }`} /> immutable-js-immutable-js-6a01d72/website/docs/updateIn().mdx000066400000000000000000000007201522056416100240170ustar00rootroot00000000000000import Repl from '@/repl/Repl.tsx'; import CodeLink from '@/mdx-components/CodeLink.tsx'; # updateIn() Returns a copy of the collection with the value at the key path set to the result of providing the existing value to the updating function. A functional alternative to `collection.updateIn(keypath, fn)` which will also work with plain Objects and Arrays. any): C;`} /> immutable-js-immutable-js-6a01d72/website/next-env.d.ts000066400000000000000000000004061522056416100230220ustar00rootroot00000000000000/// /// /// // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. immutable-js-immutable-js-6a01d72/website/next-sitemap.config.js000066400000000000000000000006731522056416100247120ustar00rootroot00000000000000// eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef const { getVersions } = require('./src/static/getVersions'); /** @type {import('next-sitemap').IConfig} */ // eslint-disable-next-line no-undef module.exports = { siteUrl: 'https://immutable-js.com', generateRobotsTxt: true, outDir: './out', exclude: [ '/docs', ...getVersions() .slice(1) .map((version) => `/docs/${version}/*`), ], }; immutable-js-immutable-js-6a01d72/website/next.config.mjs000066400000000000000000000007001522056416100234160ustar00rootroot00000000000000import createMDX from '@next/mdx'; /** @type {import('next').NextConfig} */ const nextConfig = { // Configure `pageExtensions` to include markdown and MDX files pageExtensions: ['js', 'jsx', 'md', 'mdx', 'ts', 'tsx'], reactStrictMode: true, trailingSlash: true, output: 'export', }; const withMDX = createMDX({ // Add markdown plugins here, as desired }); // Merge MDX config with Next.js config export default withMDX(nextConfig); immutable-js-immutable-js-6a01d72/website/public/000077500000000000000000000000001522056416100217425ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/public/Immutable-Data-and-React-YouTube.png000066400000000000000000007501041522056416100304330ustar00rootroot00000000000000‰PNG  IHDR¼8[’|5ézTXtRaw profile type exifxÚuQÛ Ã ügŠŽ`|``œ<ˆÔ :~ 8‰¨R#ü8Ðùåêç}¸WÎäBLYŠ©„ /êd²ví)t= �ÄÐ wÈ=$b… ã¡°‘UÅù"¥bIüùÿ$:¿¨ï‡%¾þàÛ°ÚÍ‘e†·Ì»µ`Dà�{‹7û/%§©µ]h–|ßAb‰zj‚d9R§ ç �¤Ån’Ž{�Z˜+
Ö}תSh±jGë.j7ÜZEqk«U´jÅj­:vN*eù3�yy÷½ßýnr¾÷|çžïrº Riµ™¬0 KcÐÅF÷¦ Bso�B{Xƒ�³*Y¯ �‰é‚—Ç¿âñ9âMpÆßøY�¯ÿOئ¨õÉE^‘¬Õ¿KxÇ1-á,{Â�u¤S„ûyª‰y’‰÷¯õ‰�� |á‚$×yª‰O0òœäTãgÎØŽ‘"À)®ã ÀÛN|Êã#bˆŸø{U™úV ·Huf&ÍÈè*­*%›ŽÓ楨uƒ^†á�H¨‘I~h"šŒü´¤¥ ›œÅžG¸:¼º©¥xÃw· u®ÁxŒÈÖæéÒSÓ t8-5ÝO“,ìA3"F ÇÞä]s¿vL©v¹¯mÚ_é^b<öÚ¦Ú ”•NÛ_Û|›)ÀžõÉ£u9u_O±$À›ÎMãS6éEìl Ž%—Ç·²¶±ØÙ;:9»¸ºµsoïáùN/ÚÛ§£o§Î]ºvóëî/ ‰‰40H,ï¢è¥ ïÕ'ºo¿wßë?àýbÆÆÅ'|˜Hú:tØGÃÿ6B•”œ¢™š–þqFf–&[;J§7ŒÎ“›—?¶à“qã'Lœ4yÊß§~:múŒ™³fÏ™;o~aÑ‚…‹/YúÙ²å+þñùÊU«×—|ñåÚ®+]ÿÕ†�›¾þ׿-ßlݶ}ÇÎ]»÷”íÝ·ÿÛË>rôXÅñ'O�þîû3gÎVž;_uáâ¥ËW~øñ§«×~¾~£úæ­_nß¹ûë½{ÿ¾ÿ æáo�ÿþä�§ÏžÿçÅŸ�âw¨ ©ø{´T€ÿgü- Qüõh6þ¿†ßäø›âoN€¦S i š¡yšIƒ&ehJ‡‰ðJóœ0Ï óœh8'^®eŠÐܬL:G­Ó§gkzùˆ…"Z­IÎNIפöòIˆïãìªT$“N§N6¨S”ŠXe°T(–Šd!¹P,cBr*+b•Šhe�\(‹ä!bi1Ë &G)£ˆV*z+%2¡H.‡ˆ%B1#…0¢`a°œ‘*z+‰J±\$ ï’ e¢@q#!±œ8$*õ{Búoª5jÁ!ÍÒDÃËQ¾‹ÓÒuݸLï›<£5šì1ZoБèiIC?»zþ¬º#ÕÀ‡U×ÚŒÐ�¡‰¾ichF(’5îG�ˆ‘2M\1�‘’D Kq ¸%Ü�ÜS¿= ºÑT£Éc0‹Eq¤BÈžQK�ã¤âprf¡ª=…¾Ó€Î›ÙðºDa᥷8È»ÁÂTâ—¿’‡õ~ü%pØË+8˜Dª˜íùö¸|–‹Âï�Øôð·Âåj`u‚VýbCj8 |àa�î](LçøAR})=ÀàÞy7”äRx¿B�…Ó<ñ|…ÀÂh`¾7Î]£Àñ�ÇÖ‚.ðöm¨°f¼õó|�Ql ¹=î ðÕL CK€+»)ÜÎ&y ô`±±ÀÉÝ)l;h�>ûù¨)¢�(à¢c‘îþ,ø�å#9Ó¸ÀÂY¶(à{bTs¦9 m�/í³ÀÀ4W¬y „ †ƒxr=îROÇq!îƒ}²¾°¾ÁÚÒn8]’ˆy;¬�Ïe05!·/ÚÀÞ2•Ÿ 'Ȭ(üЩ·}[[J3ÞBÔÏÿ9És™eV�¹¸àb�+zòÛA-~~ÐÔø£êT8T½¢à]øÖ�HÂÖØTXÏÖ¢lÅLè|Šš¾.Å»ÀÙUŽ¥«ªZ;T3Ìh‰„åC#£ u¥�ân²çp¤Ñ^H­g=°ØFXp,�àr¹<ŸÏ·²²¶¶¶±±µvvöööŽŽNÎÎ.®®nníÜÝÛ{xxz¾Ó¡ƒM{×íÏ™6èêv(›Ú¡«¿CŸðá ÁC†}4ܸ5§™šþqF–&{”N?:'7olÁ¸ 'O™úéô³æÌ�_¸`áâ%Ÿ-_ñùª5%_¬]·~ÃÆ¯7³mÇÎÝeû¾=P~øhʼnSß�©<áÒ•¯]¯¾uûî½û5¿=~òôùŸæøÛvüÔ˰Ñxoš›[q*�ž6¤tjêý·B›�ñ/ Ѫ¬,Í™ÖîL+!2ª:Ž‘1Ld„�7© S¶ÂÓ)Õø/°ÚÄiW�èûgiTXtXML:com.adobe.xmp Screenshot w{Ì[bKGDÿÿÿ ½§“ pHYs  šœtIMEè }cñtEXtCommentScreenshotû« IDATxÚìÝévãHÒ­émî8hˆÈª>÷sÖ¹ÿ+éÕÝ_Uf„$pëîAM¡�”ò}r)¥ˆ�(£›fnÿûÿoÛVî®?1™dNBA�Å€9#ðÀ¬x`Ö¼0k^˜5/Ì�f�À ³Fà€Y#ðÀ¬x`Ö¼0k^˜5/Ì�f�À ³Fà€Y#ðÀ¬x`Ö¼0k^˜5/Ì�f�À ³Fà€Y#ðÀ¬x`Ö¼0k^˜5/Ì�f�À ³Fà€Y#ðÀ¬x`Ö¼0k^˜5/Ì�f�À ³Fà€Y#ðÀ¬x`Ö*‰¿òoÆâ€C!ð€#p÷WÿÝܽà@hi‡ä»ò·ù®ÌYlðTxÀgy °Þýc»Ð‹Š/ø8*¼à“ü%Z{_€wyW…×pÀµo~›�ËósàÝN´»;fq¬0£c×Apü_äC- ýÞfàrJ|œ´i¯î�79Öø†AÖÁÆz¿pIãhÀ÷b/09cù| ;ÿeGèÀi;d�÷àc¼pÉ#‘ƒFÎn â§QÍù–çiv‚ ÞDèÀ˜vxá>|ŸÀ"ÀeŽDæø9Õ®ûÌ^�_ÊfËĵœØÅúqïÞŒÀ —ÉŽñ�ÆòÁŒ£ ½¸Æ x—Y^³¾ñëgö»¸O¶5\îy8…í”mžåÀõ?\´ÙÏá5÷ÐËtÄ^¼Ó¶t_z�ä\Jß´=uÝ‚A/ƒ^¼ýÞq Ǫ·C?ü±ŒmþLJ]—Œ£ÀÜÆVß1¦졥ᷟ}–�ýÚ‰“åÏòÀql‡O·Ã#Ý`›?Ññ!ëœçÀêËÆVÌåoCàu"'ÈY<&'`Æœ`,'ˆÀëØLóM¿–új€�(àbÆœ`,'¢bÀùkÿDâ_…À > µàTÐÒ8"‘³]±¬[8!^À‘¹ŒœúfÀI!ð¾™×y-cÖ'fµkøñ·Yö ßuîçø(˜Ã Àì�í¹é¼¼�yÿ07ª|å�m<ÿsüHTx€ø’J2Èœ½¹49þ$*¼ÌÜzÙ+¥^.ÏÿN5œ%/Ôx#áôŸ(Îp,úDZ*-à,xáð|O‘Ä à2‡ª%ôzAÌ�Ž0 s¯RýóEà€ËðÙ÷èòƶŸñKÞðͱ�ãÃÁ–Ý9â|ñ-¼pþü!…KfÜÅdûëö©‹ìÀ~ÁùâÄÁilü³xL|buø¼Ö Û\æ±Ñ�õ°“ó ç¼ùŽ‹p„1 ãB|÷öÃvwÞÛˆ³_€ýö;QáÅÁ¬gà,Ù‰Þ)e08Ïê¸ÞX};m%$9�ã-ëàÉxšùFYO^Gà8;¦Ó\š¡× /Xðhÿ:Ôrá"ð\6 æ0¨ÎâÚ„0åô¯ùXOÀ÷!ðœ;ñçv¦ÛCÏG«=\~za%7FŽ· sñw&›+òÇŒ“<q™�¯÷â7Ÿ ZïÀ7k€³9_¦lLq¬cë ø^ààû³¹(8ã€ò3’žß7yÃä"n’L–7¢/h½3?>œ/S°ž€=¸x€4¹)ñÁŸýÖçcó\Þpä Ç\θ…Pe^ãKÖp^PœÚ�Ñ·>Ÿ9¾{ØÄ¼–Žz僋·PI4¯ñ%ë 8/ÀYaÀ%b,Ø;(vá2Ç/U†3D8ýõÅ:‰žOßžÿéxν.ú ìÂ…oþÏoûTÍ`}¹dÆJ¼ϧß}¬1I�58Œ €ËáOÿLØ<·«ø³û Nl=¹³^p~Çš/F…æÅOãÆ0Ÿ]æéþBå×LÖÝl€7£Â phå\*¹€íJ„Ƭ'à¼Pá˜=ÞíÎÅpSëµ7ó¸œñ.qçØí#f³ßŽç¬cž7dŒ /À¼q³€ãßL:ÖsÆÇ—�ËiE…ËÙœã0ÃÙx.ãœÿ5ãÆ�`Æ»˜ð½“ä|ž+>±Kèõ¶�0ÿcÛ©î{ì_¸”sÉ;›€¯Fà˜%Â.`öWcìÃçrQÍŠ<©õ1ÝÇÌìd÷n‚i½¿6vâ]ߘïÀÿdC/ö/\Ú¹óZ—›p‰¼ð]WcåJìŒ^ËgØŒ_;Ò§¹jü4Inª}ßr?Æ;øÏúø|tÿb›0—s?Ç+œ/|ËÅ×ä§[‰ò¶s�øs}&óÍh_ÛÃwms?Η6¶Á³Ç1àÏýŒãqn‹0K È€óºc2ú³¾�>à/"Àæ{ Û`Öן´qÆÙŽãýÃ? œ*¼3¹¾ Ep*ûǺ°qwÞ �½ hÂ-À¬OeŒmÎnlnŒOp†Ãn'¼ÂÙ Â 0ƒëŠRb?|Ì{$ ° ³�à Û7“gqJ£ÒëÜ.N©ô€Fà8ñë‰3ê'Í \œÅfìGÝŽÙGÀÙ�Ÿ½Îí"u ½ì™ÿ߇À pÂׄ]ÀEî÷jöÇq¼|š$ô:·AknW9íDb“¿| æðœèõÃŒÃ.ÀðÆã‡Íõ©;ïjàµs%sz]Îõ¬!'€|�ä<îÛ¼æ#¿/Àé\ !׌oøRÉuv£S|ÇàøÂ«¼Ìçøs#Ε(×·fo¿¶õÝX˜Ý¶~¬7,ŸÉ~qÈç?—kÅW_³·––†€Ó ÍíúÏw\ Ìs½½ø�ï[7ýò}ÖË€w3ÀXï¼¶Ú!R-�ÙmâG `Ø/ž¿Vä<ø**¼œß‰–Ì<×ÍŒ«0ÏÁûñiâç\åt°‹»9¯CÞ½ð¡1às­À¸v9ÔâýÚñ)ë�ýbîÛðx8¯ƒþW÷¯œîºùb„]s]q\xÌc5z�Ã1ò\�ÿG¼€~úWn\Ã|z±~ý¸ÔÄ\nìxå¢ÿpûäðXNà;Ér>}Û`ò•�ÉìÏË Z�/ÿz�Ã:Ι„_¾Àææþ›“½º ¿å9 s¹=7NÆAö –éL¯ó‡|Pɘà p¬AféµLØàÓav9Ö%Ú´3{uñ<ºñøã›×ÝãÖåá—--Õ!^¼að û] J^»(tÑ>o.ëò¹þûOÖ7ž¢ÒëÕeúĴ¢Že{™¼x#Â.à›÷Á?\°Ðñ<Ö#^APºÄ—kþdÌá}�hiÀvNoð:«uI{C–/‡À €? ìGA(ÃòÅÁxð².pL„2ÀAxÀ\ðÆÌóDè|�8±k7?Þ†æŽ`ä¬×-€�«X¼ÀKø‚oXôN8/1Éܸf=ËUËz=(îí\*¼`@àS‡ ŽøTzºXãzíÂPá"àŒvß\øÜ…¿ËóßÛ§Éþï¾Ë�*½Þœ1Æ _²�^0/ Œç°+û‹oþ‰Ð‹cNÍ'B¯�¾!ÌdŒ�¿øZoXvβ»t^0°.n?7·ÿ,ÀG¤Ú/ ÔŽ½òN}ãzwèÅöx�Ûñ//®Õ xà"¯‹¸GPprƒ»£�ï>Õ%àë6Ì·?OÛðnÇ,/œ;/¦~xa×é]£qÓ{o=ì÷á˶q¶ã÷ X^x�eðÄ` ÀI]Ðqp�ÆrÀùnâÌ7űX0xp:x×8€³kùAè;žü|ž+0ÿƒÅø™k4œóv~.a×ÁÎï/8|Ýò>Tx'‚° ÀÉ“>áñ ªC†^f_p°œÞdûàóžÅœ?À©pnæâŒ·ë³~‰ì·_½¼_¼ŒÀ fN-Næpôù)æv¼›|_ÐúõÏ�›RÀÛ÷iª8pêç¶kœÎ¦åŸ~cÒ¹"ðpaÅÀ à‚§¼mp®¼ÀmÎò@G ½Ž~£Çü\ ½ðE×5sOpŽÁA�µl׸ ã>c‹§¼QÀ):¥—G­ÔÁyowG ½Ž~SßDè…ù\ÖLæâX�˾ÄgûÇE ÚØŸžAà8ÊIñÃגּ£?9Ã|äüÌiórÖ5ÛÏqÇÈ„^8Òõ —~n!ðí‚þ£'Õ£MBNEÞ8n<֙РE  —;V±ã<îœï�xNïœí/ôžÿ̉œ° §0Ö%ô‡Teœ2g^€“½ð؇o và„ÆŽ„^à³c <XÎê@ϱžuüô‡0.<¹±#×/fxð}þk8Tx8Û _ï˜<÷u Æ…ûÃ¥¨ô0“îîøÈõ8€F…€‹¸ÀØÿ•ø¶®\·8ñ,]SÌ^ÎþÂ×Üòg*¾€³ûËKµ×{0†[Óã(ÇHsBàà2.|E»à’Æÿ€w<÷îŸÀx¸¸‹_B/pü­ßFÈ`þ¼\àX�Ð à�(\Òºfœ p|ÆÙlY. �€ óù»{û|ùxůà[6¾ŒÍàøŒùÃEØàòx¸H„]`¸Q…oÝæ\2cÜ p|Æl¶Kg»pÙ‹¸ÜÿÀ±ÎöXMØTxç�ùßÀ™£Â À…Ž ý3? Ài�›þpÞâfÀY ßÀ3G*¼\î!ÐýCsy1¨œÚ¹‰sÀ‘Çi9e:‰9ÁãÀó¼0`€s«ÀŒÐNKCÌ™x€#¢l?à ÐÒ<Ëå27Ëàäx€1_ Ë`hi€Y#ðÀ¬x`֘à 0/.s:oæ æ‡À 0%ì²#ÿB/`^hi˜‡#Wv=þ]æƒÀ pú&a×±C¯¡‚̽€Ù ðœ<Ó´2|ôû$QéÌ�/a./`¼0k^˜5/Ì�f�À ³Fà€Y#ðÀ¬x`Ö¼0k^˜5/Ì�f�À ³Fà€Y#ðÀ¬U,ð]L6|ñ½|øä¬€¢Â |/ã9às¼0k^˜5æðxÄ>ØóøÜçµOö‚>Öò!ð˜0Ù‡çø4·³ ½>³\޽|hiP|:Ô1–áw,/¦‚ ߃–†`&ìÍßµß$ÇŸý’›YçƒÀ ̈ýù_]2²­]Â徃™ón€sAà/zÏDÊöÆóñOþ¦ßÉÝxœû^æ9xzu—²Ég{u×÷/×£}-ï{ÓÌËmÿwŸëäòàc†á³CàÀË#7pñ'‚·Þü¶WN&7+U'®òÕ£ïÌwæwÕ'o½ì‹OVø²íj¼Ñ4ÝklÜßžëLhe7~Âw{átÙ“½œm<›zÍ�`ƒŒûÊßÇ ð®³ÇK'ÛýÛþ§|~ú�ËOž<Ž?úm¾÷#1ÿøKo.™¹ÜMfïÛXJÝÕ“ít劉Nþèw>·úÓ]Ã}ºìÏçåŒûÀ³c”O„^Œ™¿�àôÙî†Æ±‹®Æ÷òsÓp¨“Ø3Îg¾»”Î_ùK�aOÏËŸýÓy£×êÀü�¯È¨ˆÁþT6ÂüÉKøõ¶mkún>ù˼_ø00ó2ß–‚¤0îIÓm{¬à‚c ãØ®lµþ´¡èðTÝìCû8ãqÎøîÌ�`lÿ]¼Çþ]æ„b/žX|rÒñI»µýï·OŸœ¦�€=y~\½ã“žëÂi>y—’¿áG§á“çLÊ]I¹2+SÞ—Lûo‚2M:–¿B2SNÞloó½íß&ûI~ gߘ)/À|”{ÓÛ‡2Þp!ìzç*±,kn 8áãš¿~.Øk‘6Î-TªLüiPå“£¥ïÕF så›ëI¹ºÄ§'¥gƒ¯gÏ^û´½g5vJÜEo»–söø$»÷¬÷—Ê'¹ÕkÛ¡&[÷°Múî¼o¾_Ù8Ùl},±šD`eÌ—ÆÀK’™Y©ðÊ» É<Œsä Ûs0C2™?™Ñk¿²rÒJà… ÆýŠ5×óÍH|'/À¬x¹qèÛ ´1|?ÓÇúX›ll}'u\óik³GÿfCT44¿Ýo3¸;&Ú£#ÞðÃíöýOå˜8„]ûç£WªÃüQÊ$AØÍ3`ãë™^ÓÐk¿Uð~ÌÓ¿Å޼dî»ùâžÿ™ûd[‚«òaùs*¡’Oæ¡›[» ÙÇÿ»ïZvúPáåAÁ‚†î‡¦ügŸlëI¹õázYÙÁsá™�;Zþ^ßUwIÏÎæ�G��öŠc7ÝÀ[x.7ñ>è÷u̽œØ!ÍŸ99Øó‡½b=ßvÐ÷*=LCD6T©ŒÁ—íZ¯åßUŒí*°ž¼Ü%·4Η4‰ÊÆ'n®gžIÊkž#7ß«øÚ»j7Ž×5.ráT? ªýË8g–�µSC”””äžJ€•ÆyºÆù¾¦Û—í¶e·ý­w j¥1´Ê[tz4�×°�¦:ï±Ip6Ù?]ûûÛ0çׂ½mÈCèðݼÀ·°§¥‡çÇi¡øÑê¶c=ŸÜ§ý…æ�¾›h÷=�÷ÿi؆¸©[»›é¹’«ÄSf¹rEÊ­ µûZ&³½Páe^ªÂÊ£O«i´«Æ “g8�ß\Rp/¯-ŽÏ6ŒM'�ù†y˜p>ưkødÏ…^¶_5œÛÌÇàtÈ£’'%ï•Ô+y/WÊÛîPÃõ¨rÊäR(c>ç­Ó†ÿ,å_�´{’>„Ç>öHÜd%àJû{‚)·GTÙ'MaÿõŒ»·cá~Í1x€ïcÇ|s;hÈôá°ëHÏÀç.ªì•ÃÓã:Ÿ>Ží×OùäFzšüÝtå ® · … Y”‡2Qù»ªüYdã xÛÝnŸÌÍ¥!8p—§RA“va‚ù� ¿<)¥$y¯$Wðü=ÁrÐe®R�“†ƒ•ä9Žó'K„cØÅì'%}¼ì}ˈ–¶†æJêåž”Ôå°Ëú\•hIÃ.‚)ÄP>L1ÚøuA!˜,YÈ­ ÍBž¹k˜›Ë]žrHç½+%Wê]©OJ½Ë‡?§¼í{Rùsn•hòGˆ%hÎûÞ° |Z5V–Åt?Àé!ð\<æ&9ÿln‡Ý`ÌïPàßá‡[ýÓÝß}¨<±r“|RÕå»°+yng˜drEY¨dU-«jÅX)TµBÕ(Ö•bU+Ęoì‡üÙB¾Éo¶ûÈÏ)‡\©OêS¯Ôwê»^)õêû$O½¼ï•ú^©ë”úNÞmÔw[)%™z¹¢¤d®0Îdd J¥:,hWF3¾r6¦‹™¼Ÿù�¦]}–Jä$³”›z¯ä�’º¼­Z’‚Ë¢+Ö¦ª jµÚE­º©Õ4µê¶VÛÖª›J1†ñ#TQ1”y»l7ÏVJ9Ôê»^}—Ôo{u]¯í¶×vÓi³Ùj»é´ÝlµÙtÚn;m7�ú‡N}ç¥2*(ʬʟwûµKî9K¦±brÚbÑ8@øª7Ã|4¬ãÍ:à`ŽØý†À 0?N¨¸|¿�m‡‚�þ„ïN>ã]frãç¡U¡ÆJ®¡Q YÌ7ëc­P· u-«…ºV¬Å:Tu¥ªRÑ÷«[dùse¢\ÍÕ§^}ß«ï;¥®S?`½|ø»n«~»U·}�6ò~+õ]®úRRPRï9, J¹ M®`©„ûs„9o¹ˆ6™�ËÇ=blF8Þ¤æ»*eIzII1˜,FYkS¬ƒš6ªn¢ËFËe£f‘¯fѨmó×!ÅÊrè5^¡^¥r1Wt%õ]R×%õ]¯®„^›‡­¶Ú)Ä$+­ cùœû· •^�ú®S÷p¯Íæ^ýæAýöAÞoä}/ï·JÝF.W�•ù½\Q¦`ü`å1Ÿ­úÂyí.C�•†)¬ÆIcÔUþ³ò1„]ÁeVª¸šJuS©]Öj–µÚe®èj•šE¥¦­Ô4Q± ¹�aª�C²`²à²`ŠQ Áe–ò®1iÕiÉ’T¥ OAîµRrõ½çª¯†m7½¶ÛN›N›ûN÷[ÝÿÞèþ÷F÷9ë¶½úÍV©/Á²‡\ñå1ï�^â.7 ãñà í ç�!?ª˜'ü§ˆÀ 0[nmQ5yŒr8cï¾™ü¸rc7'×|¹‚ÜMIA½aWnY«Z¡®UÕ UÍBu»PµXªjòŸ­jä¡ÌábžÐHÓ`Íws‚Ùî÷æÎ`ž?…Ý3cÆR™’'.Rê;mToîµ}¸S÷p—ƒ¯n£~»Q² ä&y//U:yN£>Wõxž›)ÏcdåáŒGYãXkZÛç–”Je †À+”–‡æŠ•*S»¬µX5Z®Z­®Z^-´\·Z®Ú1ôªjS¬r°åòÒQ¥Z¬„ªA –C4ºˆ–À+”9ì”cÚFYÈ?äyž¯”7õ}R×yiw˜t·Ñ¯¿ëŸÿÞé×?¿õÏß¿u·Q IÚº<™¼2Ï­C‡ '¨aen32ôšË±tü²TÇœ/À¬ù'ÞKØçüœþx¾ðÉÌ\¶÷õî_§�×8å�~oN®*W±R¨ÕM«ºY¨jZÕm®æªš…BÝ(Tµky¨ä¡R2+­s¢0´G+u2“×eù ¥šl÷œKk7=ªXŸu ½Ìs¨¦J¡�ªK[ź]©ï6y^¯íFÛ‡;mî”¶¹Ú«ß¨ë72·žiˆ”»Ê…1ôz~=½ý? MðÁmüƒ–Ï,gwçèÂ.W¯d}¼,ÉC’E©n¢ê¶ÖbÙä k½Ðêj¡ÅªÍ^‹ZuT51]µËB’‡šå°ëq£D/ÙUÙâ‡jCvx/»€•@jW9 ò<˜<šW}ÝuÚ>tJÛ^i›£äPæüŠVkûl§ýýCJŸì«sÝ-Ìv‰(û6—ÃË8ñ½oúùŠñ�§eê¤ IDAT`þ'ZB+¸hæ“û󽬄^Òã f€ ÿº»…JØeê’Ô»))*Y”Y+«U‹•šÕ•ÚÅJÍb©f±TU7 u›C1 ¹LRR ÌÆÉ‘J¥–íâ·§':›D]¶wtMgÙã0s+Ÿ£çùÁªVÑ{)õòÔ•ÀëA›‡;UwwÚÞÿÒæî—ÒÖÔ§Üq¨Ÿ©,ÖøTŸ¾ëdÈ"ž®¤ÝkáÆø¶ñwνô©ù–lº/yžÛJII½ÜràåêseWèó¼\«Zë«F×·Wº¾]k}½Òêz©v™ƒ®P™Rùp™åǪ ǰË}ò†$÷ ³Ý–n6�KlºXJ Ød×õ2—b‚ª<ªík­º…Öw[=üÞ蟿ëïÿüÒ?ÿý­þóKþ÷VëÕ{’¥ ¥(S]j'MfÃ|_»¹ýÞºŠžyæ<-žM¶Q'øà’œâyŸÀ Àl= Wöï€?½(3ß ½Ê£ä�éü46Ì\r@åA} ª’…ºUU/Û•b»PÝ®Ô.×jÚ¥ª2W—W•R¬ä•,Whõž+¸¼TnÉ\ÏÕhí^ÆîîýP}fÓ§]¤'Ui¥NÆ¥då½É\æUžÉ{y¬eU#«ZUõRu»PÓ.ÔÝÿR÷ШßÞ«ß>(õ[õC\g>Dv2ßÅm/Äu�V˜Äýð�lèøþw,ç]]Un'è¶ÿ9ÿ·•«“E�st5‹V‹U£«›µ®nVZ]-KeW£fY«j‚B%)¤pMB®¼'ôctå{9îäÉÛ¤�§ 5—»eâ“Z)·ýªÇa>ùûñÕX#§¡MbfÿrWš„Ôa¦(ó¨PÕªêVZ,•6 õË•¶÷Km~/´¹ÿG÷¿ÿV·‘”‚Ü{% ž$ëóü^�–âsëjŠÛúGæû¡¼¥xi]˜ò‡÷êÕ˵QR§¦ªT/-¯[]߬t}³ÒÍÏk]߬U/*UmTÌ<¥ÐçVˆÖ+•vˆ*¿#îKxUZe–$˕ʼqš^Ó(·¼È¡ðÍ,?žïÚ"Ž1˜åÀKf¥V1^^B/kLu4źU»j´¾^jóãJ÷¿¶úû?ÿèïÿù¥þçNÿè·¶w�ún£”*©Ê�m&…Ò–tÌÒý¹JH{mïµ5´iõ&•RAà`füù¶yÓ–„O*½¦³Hù^8¦élT^B.™z¥”,ÊC¥j…ª–U­ëkµëUíJÕb¥Pµ U#Uun_X®$�so•øiü<ÌÃ5´pó'×KŸ§•\O—Á�¸¦ó1YyÓ°,(Xž÷(„JÁkE‹ ±’…¨k…º‘ÅZÛûßJ݃Òv£ä[yê”ÔÉ\9ªt4™BihÕ¸[üŠÛù‡f{_š¿¶Mÿ_"s%s%Ïí “:õꕬS²^¡’ê:juÝêúv�îÛ\Ùµ¾Zj±n+“Õ’Åܾp˜óËKKÄdIcßg¶™ÒÛÏËÜaÃvûx/ž¾Þ½J)æÀó10Ë?“Æýņù¿,I Ñd!(Æ XUuTÓ–yÇš ¶­Õ¶µš6ê×ît÷÷½úM¯äu.Õ“=/ïeaÜíÉï/¬{vOyö`€x˜‘¡�ÞK^i(¶›4K»‡Øoè–+²’¢zê’ÉcPŒ�b»Ìót-¯Ô,¯T¯®d±•b-•R¨ä¥ÒÊǨ<öÐÂp¯Êãñíí 'm M’‡?¾N÷IµË“oÛmCàåÖ|R®zËÏ8È‚+TAÑ*ŦUµÈ­·÷¿uÿû=Üý£îáNÛt/KRôN±dhahƒ7VªIÚ«µž’hK 2Û_Ñö†=aé�­ ƒ—°ÈÕ{Rï½zmÕk£d�“Úu«ÕÕB?ÿºÕ_ÿþ¡››+]Ý,Õ.…J²èò˜äÁóüVÊÕ]I¹R,W�¥±íà¸-ØþüsùK›´û³Ýœ^Ͻr:ݰ­ï=¬çoÎû~*-]i˜�+„R±TS¬*µíZWWK]_¯ôÏÍ•þçÿù�þ¿ÿûôë¿÷ÚÞm´ÙvªlQZ…™LÁrõØÓí|?º{:WßóëiZ!€×x˜•—oûN¤ÇÕ]îãmã] ¾üÿÝüWCØ•Û&«ä!*Ô Õ˵šÕZ‹õ�šÕµêv¥Ø.å¡V¯X*ºÂ® byüR¿’·¿RÕô¨uÛî™—×âo¹ÙíO—ÒÐ:qò&—�ihóærw«ËÜFQAMž‹¬n›…j¹Ur«Ôy~n}2É{ÉòÜ^ceŽï?'{”ííÏÁôd]oØGž�}ºBiq¸ë9¸{–+;ÍRi­e¡R¬‚BdmPÓTj�b”¤^!šþ±{=üî%ߪO&ó�CcŲ»†gž¥ížÃ£Ýuè¶j¯¼B¼ŽÀ À™Þ6÷±²kœk�ÕWe>Ÿ¡2«STçQªUõRíêJ«ë[µ«+UíR¡YHU«j%‹“ÀËJ£6+!Ú~qÉ«�Oçízá%½f:ÿO¹k>¶i|¦õá|™‚¤Úe'äH ˜¬ŠÔ(HU-«*)õ¿•6wò~«^�”zE¹¤ !ò“™§½„ëiÝËò+z"¾¼hüÏûHžë*W_¹'%w%KêµÕÖ·êm+…­ªVZÝ,uu³ÔÏ¿nõã¯[]_¯µ\7ªAнzå–‡½º\AeIR™ßm¹Lã×»íïùÍÛÿ°W?·-ø®ò…-lºAW�f^æî –[1º\Ƀ,U­i2¹ê:j¹\èÿmþÖßÿs§‡ß½º»�LQò °¢¥á3ëzxqÑÙ.Úq¥ÎlÕi#)6¦ÅU£]ëçÿu­¿þ}¥ÛŸkÅ:*V& ž+¡Ì¥0„g¥ªk/»Ùßö¾s&*Û‹}˳ñ–£•v‚–Êœ`.÷¤à½BŒŠUÔ²jÕ´ -K¹›ú”ôë?wJé^¾IJ}'ó\é¸ûý¾·öçëz¦6�í0‹‘¹íoe7>Ì­¥NÉ;už[†JZ®[ýü×ýø÷•~þk­õm«ªIRèsci[hæùÏæû¯Ûü#[Ýîö†g7iË8ݸLJ¥¹a0)Æ fuûs­¦®U…¼ü×]›‡ßJ]c¾\ jå÷[y&»¯U*DŸÝÆ�  pñÃþÃ�±©;[^àô|õ¸“IÀܯ€Uzù“ïÃ. rÏUZ½‚’URl›¥šÕ•ë[ÕË+Åv¥%«•<¨—Ô{icXª»¦�ýL'e&¦½¿K“Zª4¤)Š ¡–Õ¦è®&õå<cݽR·«j‰ÖË•vwõ퀇{;�Íð”î™ ­5}²VsAžç9»¼S¯üá!©YF5«F·?¯ôóß׺ýy¥õu£Å2Ja+…\*øn0›Tq�ÅJ®9ôâ³Ò†t/«›þß&AªûÐá³ì)×{…$‹Aí²RQݶSê“”¤~ÛëÞ6ê7½ú>�-ÍL¦8i/ú´©¡3Fàk.!¨;K^à´|Ã;­x÷40Ã+Ôá€1üßl¯Òk×Êoú3–ƒ.‹ê<ªS”…F±Yª^]«]ßjqu«Ø®å¡Q¯Z�Wêe%è2ÉBiE&%/!ÂIÕuôp¼?ûR9>w¥Û[T(¡WR³L¥ªÈ•ÜÕÝKÛÔ—^�ÝXøÌsXÀ½…/X>Y“9¨rÏUJ½òœ]É:Y•´º^ëö_7úëýÐÏßhuݪYšbåJ!W„í…Z¥²ËŸìŽþì®ê§z±ý¹³lÚgs7™JV8¾’zõ Áê¨Æ‚®n—Š!(äAÿ ëïÿù¥í¶S,ë ¨R°¡­êä¸áO-8þ`Àü¸£xµ¯GàNÇ7µpùׄ^´Mse:½ý¤Ÿ�?ú:Œß‘J•WRT²¨d•bÕæV†Ëk5ËkU‹µT-”B­¤*¯çŸÓ$ôr%yª[†Ú�sÙ¿wËt½vKÖ•¼´8TPeR�B#Õ’ú¾Wê{%ORß)u’’—v�ž—ÛØÚ�ãá±Ïm¹²k¨’Ü]½õê}+½B%Õ«JW7Kýø×µn~^i}³T»Š U’Å.o×6©ìÒ£6†þüT{ÿ6þì©K¦_Ù®²kX~ãf:|m“yÒúr<0…:h±®UŨ¾ïÕu�ú¾ÓÃý¶›­¶5œÞ}å–{P²P‚¬JÅz©z±V»¾V»¾Vh–Rlä »ÀK!Wvùnv¢Ýo°½ç´‹¿æ~<{T=g6 ½$÷\éÖ'Wï¦Ê‚B0ÅhªZW0Sê;uÝVžzuÝF}J AJ Š ’z‰ÐëxkÐs{ÉR×¥¤^É{%õò2oWÕ­¯úñ×µn\éúv¥vU+4&ÅtåV†CûÂéúòI%ÒŸg°³q±ÓÙÂ5Ù�ŸkgäÏÜ¥ÚU}¹¤¤áÿ.W•bÕ®j™­Ô÷�î~ÿV·éôÛ7ê¶] ƒ%ó ³^U;£Q€ïBà¾a€÷4^JlÎŒß$™údêeêC�‡JU³P½ºÖb}£f±RlòXï*À†ö‡6TÉødŠ¢|óÞö"0öù)°wþý°l÷ÛNæ:*Õ)^æìꇉL U£h¦ºÛªí;¥¾×vû ”:…”44t³ñöþëí 9;|lÙí"“ù»JØeÑÕ,£VW�n~\éÇ¿ntu»ÒbU+6A CЕ£2M®Ýc›¦go{uÍ�æ>áØ †j°ïU&º)Éež4NJgR¨¥Æk­¯—ºýëZ}—”ÒµyØÈ;WßÕ“¡Ì=ÊÞ�d&Á"Þ‹À |Â.=x¼hÌÈä”Ü”\êÝ”B”ÇJ±Yj±¾Öb}­j±R¨[uªÔ�Õ]9ðzv¹§’¥ù乸&iØI².gÓó•/9ì rËD}ùÞƒBŒªúNmJê¶ÝßýRouž¤d%†Ü]Ãï0÷gŸ8g‰÷ï^*°†¸Kž,y¯X™ÚE¥Õunexû×�–×­Úe-¯’zË•`¹�¡ï?¶éQ ã NOwŸæÔúÓ~óÌ>`ãž äû/5ÄJõ"j™ZÝn¯•ú^÷wwúçï¤Î]}ßI2«ÆV†>†óþ©=àÒx€ïAØàð‡•½Ù§\¦”r ±<W”ÅF¡^¨j—j–WªKØå¡Rò ÞmWÝ¥øPÍâã/x¹ùØ õmû{þ`]Ž×¶ÿ�f%ñÒþÎåf’Åz![öÚnîÕÜÿ–¼SºïÕ»)ZiYÂI®àþêsâlñö`¨çò2o—{¯¤Nn½’ê¶ÖÕõR·?®uu³ÒêªU½¨*WJ|i½ö›xîV¿=^;öÒ6ïÚ¸¾wK÷Ï.ìiX9FxÊËÎL±1-¯m7+­ÿ»Ð¯_�î´Q×uê}«¨z¨óRÒ4žÿqà»x€�ù̽Â.G’JÅ�•ê¬>I½KÉ‚j…ªQhªK5‹•êf!‹M¼z©×®¥Ø8oWi 7ÜØ¶'s š¤�Oè5¼þÝí}+¡Vù[–j/+­ ëF1¸Ú̓6÷¿•ú�6Ûõ�))„òÛv·ùŸž,wŽ#ôzëyu¬4,ówyRï½’õ’õ²àªÛJW7kÝþ¼Öúf©vÕÈê!´ì奺Ë-Ǿn“*.{n yC�×É…]vˆEž·}³±Á£[Êót™d•´X5ê·K]Ý.õë×R]×ëîþAÞwJêÆ¶†¡Ìýg>4�4z¼�ø8ÿè�qÛÀ!>�ª4ÊÍø\7är�ª»jÅf¡z±RÝ®êFе’ ß7TwM[ÁåßgO~·ïµ{{ZÌâß·XÞÍžþqòºŸÌ´å“Ðk\fII9\Ì¡`Tˆµª¶U»ºRê7êîÕw¹ç FJŠåFÿk�Üv¡—�ÁÛ)²òZŽñ¸ZÏ»Hrø/í*¼Ô+y§ª’ê¶ÒòªÕÕíJW7+µËZ±‘<¸Ò^ØUêmžíÏ�÷þÍË?½ÛA–æAÊ%3Ôôs¨ð*ûL MP»¬µ¾^éæÇ•¶›N÷wõÊ¡—ilò™—·¹}2ô²c$Þþ«â€oDà>„Ð x;¡wèŸÇ~ëe®§§7ƒÝwów¹l ±’‚,T²ºU³Xi±¾VÝ.e¡Ésv¥<Uš„]»EåÃl`Xš¾7{Ø7,–g±¿a �~×n{ݵ²3=�·i·Dò¿&Y²äê=·~ êV‹Õ•¼ß¨»û­‡í½¼Ky#3™Yinè¯ÞÞ·ÒjrNò®ºåçyŒÇ�.ú—öã1¨µýÐ+Y½ª¦Öêz¡ëk]ÿ¸Òêz¡ª rë•,)•¹»†½áÑ£~`©Û~(|¬�üÛŽD9ôšîG>.9W’)¨jƒÖ7KuÝ�¶Û^÷÷Ý[§î®Wßo% 2E%/G ÉvôÁˆQ/·˜<þ¾cvœ‰÷w€· ðŽÄd§söLîš¿>ÇÍ0ÿ–OÂ.·¨P5ŠõBu»T³\«jR¬ä ê“©—çÊŒIu“¦¿Ë¦­ ËŒVîòG)—íOwôµ+ø¹‚³·<‘IH“+LÊ’tçC›Óù´#œåe=ÞŽNùsLÉ‚B¬U· õÛ•êv©îáNJ�zÅR×RÊ·dÊ3Ù+ûS5sèu²;ý‘WñÂ.Mz©ÔJ’¹ª6ju½Ðúz¡åºU³¬eu’‡¡•aþ^/óªå×2™»n¯ÖïOÔö:þ®Ã�qÁ&43{´ÛÙtÿË�UÝL ®PYnmØ­u÷ë^¿þYÉ»;õ›�úÔ+¨WR’Y*íS‡�ÝÞÝÒÓ^y}_Ûá·}€· ðÞèÝÕZvRO~ö7 ÿT,2ÜdNåÞs2+­ Åv©f¹RµX©jZ…ª‘B”[(óTi¸Í¯16³ióÄiœ°ÿœÜÞöü¾k™½^tä“mc×4ðÉkq+Y�<º?ÙÄ’ç�^R´ PUªêFõr©~³Ô¶ß(m7»J$Ë­à†Y½^ÛP­¬«#‘Ìüø¤±áÒšƒª Å²Öú*‡]u*í…]ùchÕ¹k‘8mI8=î/ÞöÃ.ßÿ—áŸ>H�Ñ·i †§¡ +”–’½L±Î­ —W ]߬Ôm’îï¶êû^)õ2urUrK²±Ía‰›ßz½µ¾ÔNr�\Âù |�À"þl¬ÖzÏ·üýõÅ:Þæ/­ï†ê.…JVµªš¥êRÙë…BU��Wþ^�Á×þzŸ†]�ÿ~ÿùé„Výôyü9ˆ›¤®Ò2ÒŸ}Ìi(¶¿ô÷+Œ’\É]n& •bݪijK…º•‡JI1ÏŸ¦ YÈiŠ½íµ‰]ìÙ} .soY’Y®0ªÛ¨vUkuµÐbݨj‚,ºòìkneÞ.ó½=jÚàroʼ׊ˆžÙvüd—Ö–·M–ûdæBóàŠµ©YTZ®Z_¯µ\µª“Ï-%½+ëüQ�ÞããËŸ÷Œ·îAç‡ /à-¸Gx²¦ñL¾ÕlêeòeU£Ø´ŠíB±Y(6­,–°«´>|ïìšž½±›Ÿöf›Û/¾ðÔmò"†ò©?¾H“y’[˜Ìäµ?ç—\ò$¹•¹·BPÝ,”+mïï´­î¤$yÚîYnW¨][É—‚µÜnñO•k—¸# í“Ü{¹õ’%UuP½ˆZ¬Z^-´X¶Šu�Bþ^Yƒ•1b1Ó4µg6 ç—¿Ïh÷ðOï]ÓJ¯éÃN+CžÐN±6µ‹Z««¥~ýs§zQi»IJ[—wIò\eg–çóa´¡úò’·yª»Àx˜­ç®䥺˪ÜΰÎaWÕ.êF«ÜÊÐsûÃI?²~ü½öÊöo¢ûë2©Þ1YX¬Tù0{Úî­%Ý$‹•ª¦•· =4­bÝJÛ$÷NîA®�çæ2óGOÇßö¢.vG(A•—ê"ËíôÌ’b]©]TZ¬Z-ÖK5ËF¡ÊaÊ^[I¥'ËÖ]9›¬?»#ÈG÷ª¡}átÙÍwç¾›G-ĨàAÍ¢ÖjíZ¬Z5‹Z÷]†ûò½%,³¡µäØËÐ/{£§¥!x#Z˜�½ª,Ë÷…}¬3Êmò$ÏÑW~\J:>²>“¼¬G—‚+ÓbÙêúúJËÕRUe1¯ðaΨüµÆ¯ñ‰ãÑ£ýJr%+1n�bÕzÔrµÐúj©ûßýþµUï�Â8�WÐÿÏÞ›v·qdY»Ï‰ÈL$%y’5ºÜÕÝÿÿݾkU•-Ûò¤�ôî IDAT‰dFÄy?Däp5äyl 1Çdlî}�Ù4ž­.½}NÞ¿“ÔÖ•[<„äRËó>��Aþk„Í Ã0næð2 Ã0 Ã0 c?)=cå¨âðAÁ«.1† LjweG[n¢Ý ëw|ûÞŒ[ZÇVTäP”kê¿Ò·œ(Ê×1©âp%Ú°™äXCW¡â·Ü]zNõ.ã]ÈB‰ó‚¯=óyÃÁÑ‚ù¢¡ªn"x N¢ÉÉ4–�Ðþå´UMq‚¯|‰6\°8˜SÕ\žgi¸­µâ'YpÅœb·wØÈåcGnÙ\¸I_b Ã0v0ÁË0 Ã0 Ã0Œ½¥»t*`õb—¯ñUƒ¯¤ªÁÕ¤"®Œzç…õCûîl„ k(éµ}šˆ&¥˜×PS­œTn0Á'ÖŒW.9¤—S´ï�ó U3ÇW½à•EHDÌÝõ®l‹¶£àUUžº©if5ͼ¡nrý.qEVѱkg,X?¼G_Èè”ÌkKvFj‘²—£&kÏ|>c¾˜ÑÌjªªEh�aºÓ jÚÌ'YðDÅF# ¡6 Ã0n&x†a†a†q#6‰Å�¯p¾ÆU¹v—ø w$íÝ`gER"æFqIM/)RÖÙJ[:ÞBUn«8„Ñ}犩¾"…ÜNûÖ·¸ê˜ïûJ¡%׋ªê*»ºæ5uãñUŽô:?ÊÐøh}R&…ô}±ãðQ¼‡ªñ4³Šº©©êŠä|o—LâE­y?É:'¨‰&~Üα`ýnœ?<ì{É»_4Œ/ƒ ^†a†a†aì-ºsÄ�…‡sRDWÕùg)õ»”¡fÔ¸…1úZÌcTZS/s•œ'v�w‹^RqƒÃE|5ö‹¯s/zç� òö�}ë¡í¶Èµë´ÄzÁ«©˜-f4MMÕT%Ê0î„ìYK~ì¾zÑ«Ãår*³@Dq^¨›Ñ�W55©…Pn;<žØ˜ÿ<‹�-4Æd,X¿g†…˜¨c{„ ^†a†a†aì²u^B܆xBqñï+|Uá}…8�Š€ºÉíG'Ñô‘8sù·ôÑK¸ø§óŸÅɱ†"@îç+\Õ÷�ÛêËüîÂ~è_×ÍÜ›Ôò¿rìW8Žýq¤–ÿÔin/4³ŠÙ¢¡žU¹F”×R»«´©mÞ}Ü^“¡ëÑ+'ö=•†ž福ŠfV3›54MM¬"aKˆÔ­9d|‰OsûX¿†aû† ^†a†a†aì;–‡iý-ÉñyâÜ ¦øªÂy�ˆCÅe¡KÙ»¶°?Wk徉•"T�5xÝ$;·²è…s >‹^U…xOïÎÓ¾¾Ú´¯•„ܤÞÒ"�ô×yïÌ ã~�Ft"|9E¼£šyæó†fVák‡¸”à û†“‹^Á—{ïû>gt2Þû-ó!Ú°ô¢xïpµ+õÕ²Ëkã•0ˆ]ÿ¶ïn†aûúµÎø˜àe†a†aÆÞKfwWþGœÇû|rnt©Á…rce�Þ��èÄ‘a&˜�ÑS@Åå:F.;¼|Uã¼ç¡K/|æ[°k Wô¬±w*‹Mï%¼wTµÃWç@œ‚$TS½tty鵘Å7mUš aÝñk‰"Î U]QÕÎwC_&UÜÖø·•è‹-|¶YiýnÆí>Èø »Ûbò%0ÁË0 Ã0 Ã0Œ=eÛqÔ *ƒÃ«DŠs¨äÚ]:Dæûö"‹�ʹŽ!±cÔ¡µT߯~E¯ßôû‡½ÓËM/ï="}í®\ëH§é}·i÷ñÊo5;†¤ˆµ�Eq‚ó‚¯_çËâúþ+¾!í�^ÛÂÌ—ieÝ9ßOT¯þ^µL ðÞSÕUY§òM{FD®øØÆ'™’"[aX¿†qKP¬ö¼ Ã0 Ã0 ÃØ¿#Ð"Y�FÄá¼N"Å bW_ïK‘AÕ£ÇdRÉèÛt¨t¦gãå-=•ï&£Ø(¥¥]éç¡�›,}ªC­)Ùy¦³}óA{’²§ã¿ï„Á¡ÕK$Å9ä²³«ª<Î ¸±~—’²¨¢pQ�(ýdóvÿFÿû ’ËÔÃ1RR¼PÕžªªpÞ!Nд=óäF´äž¯‚&~ÜÒO?«åe7þpâÒ«mþï+&x†a†a†±WG§c�Û4�MaEÄ!ntxá\q�‘†*½³«gSn•è%Ã?W¹a¾´¥·È[ï5¦ô9 õÓ¤&‹ qÛµ¨Jl9íäì6„~Øp*Ü~ušœmz+�¸1*¯n<¾D¶[uÈ”s¸å”äܾþÔóúO�+]·+ÇîV¼SU%‘pâŠ0ï†HCï}®C(gÅ2™L$Å×¾ÈHØéÛ5 ÃØëà [Ço0&x†a†aƌΔ²²*ׄÑ„L^ÎgñK²»HU&Qa²Ó�ƒ¼Rí¶l)_E²:g*ôM$W~š²¹0éƒm(~ÒO“>ÒÛ·õ$:ž)gªf‰ó½ës¯Û¶ÆÒFZÞ‡âDðÞåSåq}œa_·kˆíB&/îkùØó@÷jnäö•«ƒóå¤~—–� 8Éñ“¾*‘†>Ï�Á¦[¾Èü{Duëm«î‹ kxÃ0Œ}>–3±ëÆc‚—a†a†a\éIÏnrí¥;äö�ê™§�kxõqyⲈ"Ó#ÝwTiŒ�Ü_ù$"8ç² ãdp·È•úäãö͹óû•Ï"zÉ–­­¯rŒ¡ôíççFÑ+‹(ÅÝÕ ]šïsQ¡º�%&î/gsÎá½/¤+cYÓ® ¤Ú eŸvµXCø!rü]ÏØœ5�a†a†a|Ø”ñ…»@û�dJdáèðB¶£ÚFw×e5väså¸í%»Ɇg§Lþ¯¼Äõ¢Œ\1bñc‰søH›(ún­¸S‘®ˆ(¹]½s¥}{adôÎ]µ‰õÖŽð·{ù ñŸ;K¼à¼Nù(dtâ]ô õB­Òø|Cĸ%}-Öᆱ÷Çj&\ß.Ìáe†a†aÆžÓo—�ê>*OÜöuÒ׎ê,vðûE{­wx‰dQf» Õúüzõ_/z}ÈæèU6dHMdr�Š^½~(ÓðÎñ6ý ³\¦[ú®Þj±kÚ“tÜàJ=­²ÓþãϽË+ÏW\^š¯0ÑýÚ¯_ªör[¾b˜ÓË0öäƒû=¾W7¼ Ã0 Ã0 ノ­t?þú÷ÆïÉÎÉ!8œxD< Ùý%Û÷™ÛÁð—é:6ûsßÍ0N|øæŠ¾ýjÝ}®âòê£ ]Ý`ÅSŠL–7oË)ê$Qλn÷ÜÐKV�+k®çÝ®�“"(·�Žç&åÚ2u —0½nOg›èe×ýÛæ§Ñc‚—a†a†a|„ƒ¬ëÿoþAààh)5Œ\Ùí$�R7J÷§Ûn| u»¬Þ»�Ê­ºP£ÇkøeÃ%»óÿí¯‰]Óq—�ËÞ¼%WiËÁý7FKök–»@ðUÛÀ»þë&‚ܢξ6¢—¢Ÿ­v¤aìÃǶ­ÃƼ Ã0 Ã0 ãƒ�³ì ëós~%©ZˆHvK ήÞÁb ÷Åg ¥æZÖ»ŠàU.Wúrf<ëPËnk2lãšT±P¹,»P·'Îm§—ˆ^ºÛÄW0åõŸ}Ä¤ÈØ½6¹õP}Ÿéôƪ Æ—_Mô2ŒëõµÒ¾ÝÛ8kÃ0 Ã0 Ã0öÏ{·PïÚ>&.ŠÀ¨ ”ª_eÙv�Þ¹å•÷h¹^x™ÜËÄ®ಭžiþa¹Ü -ƒøÂ$öP'žHk×í6Ü=Mn!¯KºÛ¥´´õxšÌˆ"v©òV±ËfŽa|þ¯&=Æõø˜6±Ë8¼ Ã0 Ã0 øÈ$Oäâí(S߯z9öGÒ_°ãvÚÞö.Þ¿!ɇÙT¶�¤Ôï’©³«w&q8ÝöY¡ïy�l]R…¤}üdßÖi¸<»¤·êéø2ò§Ï¢»Ïf|™õËzÀúÝ0ŒÏýñlb—q&x†a†a†qcèëÉÙãb`ÜlÎB€lÝÓxGzw—~Àl[Xòomÿâ=FývÄçVM/�ê�£3Ã^Æ{»«ÇYw×Å×NûBƶ•I¿ ¢VÚr�Vß“§ºH{åÒ:bÆg™‚&~X¿†ñ?–Mì2.Ã/Ã0 Ã0 Ã0nÞ�°ž³-=)޳6fýÆûDª*©œW’uû´z99@θ±²›(™+¡š`â/šˆlËöcõ‡È…«‰ônRzé±ôŒ&4¥"Â_4�ôÒ5JzÁì­ë˜¾õ± ÃxÇio+¨a|Þïøöf¼¼ Ã0 Ã0 ÃØßã^=÷Xxp²œ½¦uyÎbÛVïØþþpµ¾SU4%RÊÂ×vÝ$ãmÛž¥tgÄÜ2îu¨ 5‰<´ÖþhsA'¢×ô÷£oêÂ+ýPDßA¥ŸZ¶dûÑ/ zÅ5ÌzÛ0>òBl¢—a|¦Z»Œ«PY†a†a†±¯È$1 Š€Ò;&ÒŽÍKuk3ú¢í)Û¶z‡öß¹|Õm…ÜO1S"¥8¸¼l;ãÝ;`ºÙª[zÉT5éÛV'·/²—ŒQ|ãµÖ ¼Ãxž^)ýÐO ™vYÅT@ó:¥[NÇñF?Þ¤/œh‚¨¢rÞŒÌÙe†aìó­};4®Š ^†a†a†aì52ü[\+I‡MäÁõ :ñUȹÒVÂèó¢I‰1‘Ñ+áôªÛ··£vß¹ˆìÔpEÙ’¶ÆÍ"•éyžgD›w’0¹õý¡ç/Lˆôqƒ½#�-IQUI)GNö—î?(û J½hTTä‚Wdýh†aìï­‰]Æ»`‘††a†a†aìçÑïîo”"veESœl4�c[lÇÀ·óÇÝh�âÄK)’R*õ»ŠEw7êw�)Ä·Ž7´E™)f1 )pÖ·x™Ûgêﲉñ]28²tÒÆ:Yhz±kpß©ä:v}¬gêçÁTÈ¿š7KÅf…a|Éùÿ%b õBÜ0 ãöb‚—a†a†a{ÊöF) U" ³à%(nغE¯Ý(>± £·´óôüì5Wg¥7^D/ÆFç>Ëí»´7úô*í®-QÉÂIL¤X”¤;mÏ?ï^'&z½Çz´-Ñj ‰ì£ ûæ,í;”£Ëk|wƒ'/þûv» ã`¢—aƵÀ" Ã0 Ã0 ÃØctûTêwŲËKS½Dq@î#ÛÑ#;uoT¯ø`?…�íˆG¹ô=îFÜõ1’“Ÿõœ–Ùº›Â#ƒ0™Š/÷“èy¯ã¬è%Lê$Ýäœ÷»sÝО:¼ÿ©K±�Š !ºHLÅ!8DÜg˜kÚ�}¦�åã6±ìqŸ\e ¸¨ïÊïU�A�ÊnÔÐEB¤˜ú.Ù^�T¶g ¼ý†ñ—‹/0Ík‹ý}‚a† ^†a†a†aìÛþŸ^èÝЦHŠ�”hDHƒËÂÉDôÒ]ñf÷'=›u¨zΫ™^–ýkÌÉ{P‘+ˆ^“Ÿ·váu_ôL“)�@û¾(Ñ“)‹’L\0Nä‚úQç 17Oôâ’7TF¦èDôÊíâz)±^]hÛŽ&TYh‡‡’²L¶Ã÷Îëæ|Q¯ÉÈ–köœ²=.«CÛM®Tú)Dº¶¥Ý´Ä˜.Nï|Ë cb—a\§ÏÔ/õÔ&z†a€ ^†a†a†aì)»[ÊZ\C)Eb¤Ð³È"Ù=”ÈN¯~›«ª—ÈdCù¬ÓH/}%rëZý쯶íBÛN\\ƒØ8©µ&½ö‘P[}s£º@®~3�_’=SRBé6�z‡W9i‘}‹éèl—¦EÝz*ùïëÚõƒ\yJœçÏ“¾AUáKU!A £0™bœX"ÏïãË×!Ã0®Ã²!*—�~êOhý"±Š†a× «áe†a†aÆ @ícò!´ÄС©^$\»dP²v6–ß‚m!]Þþgí)c» M®½Ó+’R ÆÒG”’Tr¶ÆÚU°:l¥DJZdv….Î!Q‡à³à¥28ÃäÒþ<ûÛ[Ò’ï<ë/·ªÅ¦%²0Ǧ1(]׺@Œ:>Šöç6¨ c—� Ã0¾&x†a†a†±ÇL7í³˜’R †–ZR �"¢š¯RËK.ØÐ7ô“ÜWJ›KqáõÂd ¹ÖZŽ�ìuH}'Åë}²›Ó[eüO\! ^!$º6ƒ¢)_#8Dó @¥O¡Üi¿It¤ÞFÑë]Ä.½pS[’ cŸ—‘}û7 øX¤¡a†a†aûÉ$nMTÆÚP1C †Ž;4FÄ%\_—HòÆóyñc·-õ¡.üûtyK‹én÷”{Mã ‹Øc飀¦±Îš|àë¿M�È § Ť !t‘Í&6‘Ø%ð •Cœ+n¯Tb�ÑQS,‚d Ý´t›Ž…ño’Ýsð*5Šøë3_&Ú°¯å5ÄÚÒ`Æ-Ã/Ã0 Ã0 Ã0ö�²‰Têâˆô5·J¯&u¼Χ²õ¤;΋©„sµŠ]·£i•Ý ÷©óårÑKÎ{Pͱ“šs�µÐuÄr줦³Oõ®Ü’�½aSKkËtN”^m¤Ýttm ´ ©ç¢¾8ê\ÿ;å×ô¼™f{¦ç¶Ê%1žçü,HvØ¥,BfÁ«£m;b¨ËzæòíDvZ¬' øâ 5©Tªo½ì øaX¤¡a†a†a{‹L]^ô‚J$¥ŽZb×’B‡jŽ5J´á®›hØð™n*ßî�å‹Å.¸zÜ[>e�%GNjŠÄ˜c'chÑ %DÉý"}ä¤qÕNêà ³ "ÙáÕFÚUK»îè6‘Ô)$Á©Ã©ÇõÂJé*s<î.úŽ÷™Ž÷éº4þ—c$… ´‰nh‹ /Ų1­»�ˆý#YÏ\ç!£Ö?Ƶžº»Dm�lì†qÓ0ÁË0 Ã0 Ã0Œ½E‘"zépŽF4Rè†)âHYPщËë\ýFÆ ·[ݶ“ö8³ù~¦Ñ.¸÷(v )÷MÊ}CGìZ4‡W Lìz—>ýWYÀr€Ctmd½êh×�n‰�B…‡ˆjJ æºhü¾ÛmÇèÎ,À�-*C µ"xmí:Ò­]_ËÑáµ-|×y¨˜``ìÃgÅEÿ†aÜ4Lð2 Ã0 Ã0 c�)NŠbSq¢9/ERè]Kè]^)":ÖŠr²#z�A>àw7§uwCÛÎlë‹ {󺕶-b ¹_bh í&»ïb(ý¢[5¼¦ }ÆÅCN¶ýC¹6—:H28¼6åÛÉãðg^Û.¯±/†+t<»mkËù¶ι<^e»òe¥_4 ±K¬K¿„6’¥ÔVÛêÑsNÆõ%¶P†a|êïÊä_z£wÎ º%x±ÛÐmÖ9Î0¤�š$×d›Ö?º�ãY®þæu[HÒ"® Ž”"aY¯ZV'kÚ»¤h\‰4T"£\©£ãQÏ™zkûE/ü½ì˜¼¦3B´o’#ÐNi×�Ó“ ›U—Ý]©�˜t[Î.û‹vÃ0 Ã0ŒwÃ/Ã0 Ã0 Ã0ö)»ï:$¹ž—hÊ×¥@ B7ž*_ãË=’ôî‹3rN~ð­=îË¢ oï_›n Ùÿ“…+Á x(uÓ²ëNc—¯vM ]é«„H‘¶¢ �Ë~ø+çÝáWò%5A@Y¯:Ž�O98Yp´:ÄÕ 4ç< _²Q>Oä´¿§–3­0÷²³Vôή|ÙoÅLv«Àê´e½ìh×’Ã;‡ÓÒ[+Òí• Ã0 ã-ņq.VÃË0 Ã0 Ã0Œ½<æÝ®óÔW”* M�ZB·&´kb·Ac‡c¡'»r¶ëóèdóYÏÄ‹ÙFôvËO4EÊ  4¡1»ŽÐn›uî Íî.7©õe»Wis½¸3P‡&GŒ°YNŽW,OÖ¬O[ºMD£ Ze‘¥-CŒÞ ÔØ¿lý�Q0gÇ•5þçòm’C#tmbuºauÚ²:íØ¬š^*\ÆDV³ëÌEÃÆ†� Ã0Œ/‚ ^†a†a†aì-29ϵ¹4Ÿ‹â&¢Wl×tíŠZ4†â$šF Ž‚ËNZß– £‚I2tkS~ây‘,zå¶M9^²]ÓmV„v]ú¡CH“vŸ¶¬¾ï ºÝ³AÄeW‘T!$Ö«–Ó“ Ë“ «UGì’G’Çi…¨F28–&}»£½èç¦Ü†6×�k":u MB Ю»\»k¹a½êèÚD  içqt| ½®ñú§öI`ØØ0ŒÏø¥Ó0®„ ^†a†a†a܈cß¡n””ºQ¢Ð»¼Ú5a½*u£"hÜZzÑ+?`©g„ ÒŸF¡ËŽ·§->m|ÝúÑ•^¤H ÙÙÕnVÄvC -¤€h^¢¥~”~”—t+ý™7î²SH<â*D*BëU`µjY�nج±I®¸¼*Õà.ʱznxL•íwW™r+º¤÷v�†½PÕ‹V}›Ž‚W`y²fu’û¡k)’óUUÎøÄÌéu�§¡ †� Ãøb_; ã2¬†—a†a†a7Å! Š’R®åÕ­i7§Ô›u»ÆIU�s‚¢¨@D·kwéîÎý9e“n÷ñwi”¡ÔÐè’s�Ý]Etl7+ÚõŠ6;DãP¿klØw¯ß¥·n„_g(Ca;‘^¼òøÊQ׬9`Þ1¯hª•1»Ëƒß�j`«†�¢ŠÊÕ gÈ·Ï#r�²”›Tì%*�àÑäH]¢[GV§-ËãëUGŠ‚$?ˆŒCÝ/±½k?MÐ0llܺÏ]Q[›ßéƒÿ“=•X\¨ñVLð2 Ã0 Ã0 ã†pkÙnÎõ¹²ä•—Ðm`³¤ÞP·‡T¾Æù&o4K>€vªçÊÛ�Þ{�G±?:e§åF×\„ԑ†n³¢]Ÿ’º h—¯#å“è vÉ{>ûmè„K7S§‘ƒš¥GGSÕ,5wîrçð‡‡ÌjOåsŸ%�y(c¨ n:µ¦£ýJ/aë²î}»o¿§,v1©ßå¶êz�äÚhêA…"›MdµlY¾YÓ®;ˆ‡”:j‚ˆ€­%û= Æ þ–cý{ñ×où|^’ŸÏúø ¼ Ã0 Ã0 ÃØïmŠè¤ RB’7éEš"ZBëÑ?£®æÙ #×;¼†GìÓ åìsÉÙW0vŸ½pîë½1mÞ»¹J|¡Hqxi‚I݆°YÓ®s»wí B‹¤ˆ#áúþRÞÛÙuÓÄ®á/É/yOçm¬J/½ŠPU5‹æ€Ù¢áÞ7G|õí¾{ø5ß}ÿ ‹£ ©Ñmˆ1à´ËGªˆDÀ!¢¨Žã}œ‰^: ø»`Ì 2¬aÌž}¹Ò3n y:ñq©àúº]C½3WtêI]bsÚ±|³âôxÍêtC»Žhtw—/ÀÊ\��ùÎ��67MÐ0.˜’¶ùnŸ÷K¨‰^Æe˜àe†a†aÆ>óN6æuLbC² ‚ Ú‘"h't››Ó¤šáëÞyÄÑ‹,z¡Ò#R~,G× uv.}Ap%ák¯½ßâ—ÑÍå'‚Gq)’b[Úû˜õò˜Íê„°YQi‡# ^^*F½ 7Uìßß¶è%"e³]†M÷éæû(CeµdÖ4|óÝ·|wÿ;=}ÀÃ'÷¹óÕ‡3’kY¶¯YµÇ„ØRUb%ˆG\«ßL˜óE/a÷úO4×?dÈžyyû½t:Údpv�’— ‹Änè‡:h’¡‹,�×¼~ñ†“7§¬O;ÂR\Ê+•+5¿˜èœg+§_tNšØe”©h›ì†q=¾'ÆE˜àe†a†aÆ^3Ý‹^ÃïSŸï†GجØTK\½ jÀ9\]ãÄ“4{-R¹ßàYQ]]rá³�á}ü›l‹rrÝ$oì÷ZLÿŠCñ^5×íêÖtëSÖ§K6«%a³FC q’²0F»Þ'Êð¶ÄN%)V8M[]‚8qÔuM³˜s÷«{¹ÏlQã*eÝ-a™Hˆ©%Æ.×»Ó„sŸ”¹s^›Ÿ»tr~yÈçûv\¿o± IDAT—~¤VÔsÚômÏ|^Ý–¡Þ“:^ÚG:œx4 ¡MlVË7§¼yuÂéÉšnH�ÏbWïð*®°³óÀ6ô®ÇÒgý°÷}xçìU"Ûd7ŒëòÍÈ^ÆÅ˜àe†a†aÆÍ9.{íƒ3…D/ci ÄnM:=A|ƒ«f(�à¤ÁáJ™#jvÕ¤×;Éà¼Hà öý?Ä›òeÑÉ%)î¢aèèßÙkˆâ4�FRhK”á)íê„n³„Øâ4â‹ØÕßw÷™Œâš(¹ªƒÕkp3N£ïªª¢©îÝ»ÇýßóàáCžüð�?æÞWGÝ;—ˆ©#iä`v„j@5’4 Q‰1‘H¸R�M‰éoÿ|:Œ‰Ý‘òi*Ûí>¢~ð£ñö×§o{Œ"Qéö)»E=]Y�¶¿>åøÍ)'oVlN;RQ‡£ÆQ!â°Ê]×x 4±ëæô%j5†qs¾(Y¬¡q!&x†a†a†qSŽ}�"LÉø»¾¦”H vR\UãëqBåÎ ÎÕ幚Wܰýÿ>²•ŒÅÅö™AèË¢—È$ÖQÀi»„ˆ¤©#¶kºõ’v½¢ ‰]‰™L%Qsí/ÛPÞ5ç¹ú ÎrIòØrÎáœc±8àÎÑ!<äÇÿú‘§?üÀ£'O¹ÿà{š¦Â×B6¬»Q#‹ÙJ ¤@H‰DL$J=¯$àŠä5¼�Öôê_¯žûZ?•èõaÃøªÎ®2oõò9!}Ìa/v©+‘¨ÙÝuz¼æøõ '¯OY¯ë­êpxñ8ñp®³Ë¸KŸ­M†a×ú‹¿‰^Æy˜àe†a†aÆþá¾åàV&'ˆËÂJÒaCØœ²YÖ9ÎW8ç�ZñUSêïôR™‚—‘�÷pzíÛföTÌE8—]F"%JOpªxÀ%ECKlWt«ÖËcÚÓR»Ü]ŽˆSE$M=2¶ÙÿÖŸÇbJyDªjºòý÷ßóèáC>|È£Ç�ùîþ}îܽ˼ip^Š+ÏSIMí¢ŸÓT�EÓ5”BjÊ&e�' ˆ( (if(%:t:RÎA×Oô:ï�¯PÏù½æñ¯“z]“>ÉWæUÆáqT¤]œ¯yóò˜×/ŽY-×Ä6At¸rÛì<-Ž0•i¡4ãË.|å¢m †aÆ>b‚—a†a†a{ÄtSX/¾E™Ü–š¢H hJ„MÕsÎ1kjêÊS9ÁûªÜÜ—‹Nõ¢­ñ«½â}ÜÎê˜â\ºòÉ•=z/P) ‰6„õ’Íé1ëåºÕ ©[#}œaïîÒ”ï¬ïÚš·tÌãaÒ”c%EðÞsxxÈwß}Ç�?þÈÿüÏÿðèÑ#¾ùæŽŽŽŸÝ_E"Cðx©©\¤v3¢„¦#Q"‰€†HŠ9ê0û”†ŒÐ,øNß·öÛ§½Þo_þ;½àš!u«Ó¹,忱n—£"ÆÀfX¯xýò˜7¯Þ°^nˆ­â’daL\¾—ô5¼äŒ f|þAb"—a†aì?&x†a†a†±§\î÷½ZB K�)�q³¢õ5ë¦Áy‡¸,"ˆ«³P† ÓªFJ©h$ƒ¨—9½t�·°eûÕooÊîŸÞ=çJŒaêÖ´«%ëå6ËcÚ^ìJ]vv•Ú]¾)®Ô º’ÈçE¡OÎ{-=ÓA–ϼóÔuÍáÑ!wïÞåÉã'<~ò˜§OŸòøñc¾þúkhš†˜IGÁƉÇ;¨4]‡#‹0ëeËÉjÅñê˜Àšä#ê'ˆs%Ö3 ö.Eò�·‹ÏgÃ@¿t/Ÿ'ÂMZZÆöž Õ¢c¤dñË©Ë!x�g×òÍ)¯_žðò¯7¼yuÌêdCh§Ž /Uqx‰9¿ä0àì¼3 Ã0 cÿ1ÁË0 Ã0 Ã0Œ=äj›íƒCQp¢xA±SºµgUUˆsÔu�Ìf[.&!! Iq²9}•š^S/˜ì]ÛÊöOšÛ2 T IGÞ¶× ÂfÅæô˜Óã×l–Çtë%.n¨4àûš]P.SŒKzK7ûG—”êù¢×à8Ñ)蜧ª<‡Š9gÅ®ÞÓ&’#"�d—–K HÄnM*1†›Ó\·+¶«!ưÅŸœhïÓa³»oÙè•1OÏë)ªà½£ª*¸{÷.ß~û-OŸ>åÉ“'/B—HŸ]·ÇôÎ.Å‹à‹«Ë‘ 4t„õ)›“×l–¯i—oH›$n¨HT’¨%»»PE$�µ¡n±Ø%"hι¡4Öt3^UQUêzÆáá!ßÿ=ÿøÇ?xZD®pttÄáá!•÷eˆæ_}”¡j¯…�!qr|Âo¿>çç_â?Ïþųçÿá´}Í:sôõ‚oÚ»Ü G8„¯*Äi‰øŒ$b~ýÚÿS"w'`™gÛõë®OM¯­ECtgYɯϕ~£ ³»‹”/‡G’'E›Èñ«%ýþ‚¾âÍËcÖËí<.UxWeÁ O–¿Ü…a†&v}X—š e†a·¼ Ã0 Ã0 ÃØ?dø‡Ëëxm‰êN‰fÑ‹ˆ†–¬PBŒ(‚óÙ�á]…x²›WD3éõ‰âtÉ{ægkyíëÆëè ÊmXâ ‡X„h$…–°YÑž³^³9yC·^’º5NžH% '%°½&q~׫¾ÓgÂ%6³ë½À•ëm9ª¦Â{Ï×_Í7ß|ÃÓ§Oùïÿþož>}Êýû÷ùú«¯J͹ҺåþZÄDqRš\‰!²<]qr²äùóßùé??óŸgÿáÙ¯Ïxþçs6qI�5mh³`TM…¸¾|í'8‚H,ž´2d;º3ŽÎ[ï+zéG^B¦¯uòÆ(Ô"võ»úDÔAÊήnX/[Þ¼<áå߯yóê„Õ²%l¯5ž ¯£»K¬z×'\¹Lì2 Ã0ŒÛŽ ^†a†a†aÜHdZIÕ±•ÏAö¬¤@ê²X�’â¼Cœs–Ã73�HR ‘n”ÚKÒ{Btô±èÞÖ¦Ò­óÞ�5ÔñJЦ€Æ–n½¤==asò†öô a½D» N#ž„b ì#¢zk«wíŽÏ^¨J1¡(•¯¨êŠ»wîrïÞ]=~ÌÓ§Oyôè<à›o¾áààW\])ÆâDêE´<¸�*1%Öë5§§kž?Î/¿üÊ/¿>ãçgÿá÷?Ÿs²|Cì”” *œ¯ )ÒÅD !ptwÎâNSj€y„ˆÈ•ʼn„¦8m£\´=ªD¶~â]D/½àò÷Á™ÅÞ,qË(v¥ìêòâQ„”ÍiÇñë%¯_d±ëäÕ’ö4@ôdy«j|õ�”׉Ýê`ã¹–QÃ0 Ã0 ãÝ1ÁË0 Ã0 Ã0Œ�ô›ëÒo3g�PM$-5½ÚDŒ1GÌáÀ9O­©ÄkŽFtyS\%Gœ)’µòlúîs›�碽ph"uR·¦==a}òšÍòM®Ûµ9Å¥\·ËIaC„a9mÇÞæ1™#/µšðÎÓ̹ÿý}>xÈ�ÿõ#ÿüç?¹ÿ>wîÜa±X î°#)¥ì sn½H)ºŽ““^¼xÅÏ?ÿÌÿýÿ?Ï~ù™çüÆñÉë=(JR!©°:íX®Wt±Ë¢oJBU×T�×çÉã?�´DêèÛÛŽªT-ñ89ÞÝéõi§ÔTäÍu¼œd™ c 1*ݺãôdë¿Þð÷Ÿ¯xóò„“7+bK¼*¼Ôù>2Š]²åLݽ0±Ë0 Ã0 ã0ÁË0 Ã0 Ã0ŒMÞVï]'e3»ˆ.Á‰¢šJ $!¶+Úa£[iBK3?¤jø&×3AUP\vÔ¨€¸!Þð¢Wqýe;Pœ& GDR‚ ›%Ý*‹]ëãWtë%Ú®q©ÅkÄK¾�Ð;»ÓØBýh}º¿( ©]E°ªªj¨ÕõðáC=zÄãG�øþûïùîþ}ŽŽŽhšfËF/tÉ(º¦Ù´-ÇÇǼzõŠç¿=ç×ß~ã—_~å×_ååË—´m[D*E•"äÔ¤˜H1²:éxù×11*!*]HÝ]pxw�«â«Üþ}D¥”:_}¤"©8¾¶E/&£ëìå‹FãÙËg]ÐsŸEœ–@ÃTB Õ íúÃ%¯_žðâÏ×¼üû˜õ²%´ 1·¥§ÂI…£Êî.í#óIFïää5‰¥†a†a|&x†a†a†q£ÙŠSӼ͜c %»�Êž|"‘R uÚ”@•”#NÀ 8çò&xD<%–*U2‘Ôβ2ÍèÈb»œFD„–°>a³|Íúäë“—¹fWÊ5»¼(^Š«k«^×n;|xŸî#½ ‘RYSJ¤˜¨êŠÙlƽ{÷†Z]Ož<áñãÇÙÕ5Ÿã«�ÃwÕÑÑUxL‰§Ë%þù¿üò ÿú×ø×¿þÅß¿àÍ›7t]‡Šâœ'©fó£8<Q#)6)ð2³^·„.Ñu‰”„ºžQ«ÇÕ’ã*Uq½³,å¸JÈsHetXž½®æðúøb×8Öwû§wa9-—Õåy®m†ÿÿ|ÍË¿^óêŠǯ–¤…ªwv9�ÇõÿÎ=ê ½÷©‰]†a†aŠ ^†a†a†aì-ƒ„$—ßhŒ[Ó¡Ö–“Åæq9²O$¡HQ‰­£# ]U娜 ‚W’\“lj¢EôR”„+êZÀ¶c?În¶¾g;]åQ]®N†ÓT„Áˆ×0 ^Ú!±E»„5.u�Ž�ï#dg—f—è<]ÂûÔrÚoq MMÓP×5÷îÝãþýûçÞÝ{<~üˆÿþŸÿá‡~àáÇܿŸ¦ihêºÔÌb»ò]eë”Rb½YóòåKž={Ƴg?óÓO?ñË/¿prrÂryJŒEÌt)Q†±k ûôTnF$�R l"'¯×lÖ-]Û±:]ñÍý{|›îqx4g¶¨¨¼  %T\vJ" Y%•4¼öó£ wú¸LæË¤âñ÷£x6޵íúX:N‰áÛuêÆGr¥VêÐèHÚud³êxñçþ|þ7¯_žpr¼¦=��*sDâ_a¢9îT&‹�L¥éê Š)_†a†a¼ Ã0 Ã0ö��™ídlÆMA&ÛÇ“ÍcÕ‹†ýè½r¥öQ}¨šHªHœœæ¸¾,uÙÕ$©#jŽtxDŠÓKuô6I®ÝÓ `9âíbWS~Í—DÊù×깋ĶÄ&“v’�Ûä�ÅI]NãøÞéP"�WRãñÁSEODHAѤ¥v—Nú wÑÈäIßæèÒ·.[ûi¨šÅ¥\fKðÞsppÀ|>ç»ï¾ãûï¿çé“'üø_ÿÅÇùꫯ¸sçÎùËtqH9ç@•®mi»ŽW¯^ñ÷‹üöÛoüôóOüú˯üþûïüý÷ßtmGˆ±ÜÝ•1>�+}t_v6õõ¥"�„M$…Žc–„®CS‚¨t_rtgÁì ¦ª_{p‘ˆ‡ºTdàXâú4ÛÄd:òô²†»ðcJÏñLA/hÉà×ê¯n=IV‹%‚#‹]žÔB¢[GŽ_�òæÕ1/þzë¿—,�7lÖ‘ÔI®ÕE“c³O®h(õÕ¦¯EÏÆ9^Û1}]^”\õfrù˜2 Ã0>ÁG…N>Û>ÿsÆ.&x†a†aìò‘¿Óî¿*—OüdvÐskgÆ–²¥;b×eãBÊî¿ô¢—j®ëEÂ;Gåa^;�c^ µ$œ¶¨ú"(ˆ¢NQ>;q$‘=Oåµå"G(±KÜÖŒÐé¿ç uƒXtÎØ—ÉcôÿLu'´ˆyº¡åúŠcã+sš@’:œF*É‚—hÈbFã˜ÍÙ¸Ž ­Z ëvm¿Ö]¡�Kž‹¥3N½O°nÈ…Ï­W^ãvo« )Å,¨TŽº®ùî»ïxðà?üð?üð<à›o¾áÎ�;Ôu�÷>×÷Jiˆ.œŽYWâ —§§¼xñ‚gÏžñÓO?ñ믿òüùs^¾|Åf³&v!�Çáµè¤%ûK×ûK]07„ð%IC®ëuÒÑ­Ûu¸áäõ_}s‡»÷Ž8¼³`q8C*E*�H*1K šÀÅ�3=WèQx{ æ¹^;—ÈVd¢L'Jšœ+hD<â<^j× ê¡¥]žòêÏS~ýåO–Çk6«HÜx\Ì‘…^kÕXó —]£e¦©Ê~þm‰^£ÏÔ"H^å£àKmº~ù&²ï?†aØd`‚—a†aÆ>I_Ÿú¬¢—|úö1nôð¿d½»P1 AѤJЍ½cÖT,fóÚ3¯çhG®O•£üÔ))%D="-Â’…ÄçS Ôi®Ú4·­¼Q½´Þ—l�mß²\®(J|£Hù]¾.  -5˜DJÀ¥I!×ðr O*Î�D];Dj�QÅ .µhhÑ8y“H:é]D\îl»l2²=l½Â0Ò«.o28 {‘I5‹Þ{ªªâðð�{÷îñôéSþñ�ð�þÁÓžòõW_1_,hêz+ðOJwºlC‹Öu›õš?þøƒ_~ù…ÿüç?üë_ÿâ�ßÿàå«W¬V§CÜaîã>RSQ\/"¸âV”ÒÖ½ špDD!´-Ý& qEØDÚM ´‘n m"uP;qøJp•G¼d¥Ä,.ÉX×mŒ9œH½²+n·c¾yn)/V·]®¼/WÞH/|é xi¦Ð>n°©*¼V4nƬZ€8’[S©Ò­àøå†ÕiGê$ÇöÑ…ø<÷5¿é_£P<_Û£D+†õsÿ:j4×nóòªßUä–@†aÆ-Ç/Ã0 Ã0Œ=@>áfFëô©7Ü>ù߸ï[ΙñÎý«zyMŸ÷§lôg³ÞåmêŬáðpÎâ`ÆbVQW9–MID-u»TKl›ËNu$qà<ÎWˆ¯�2�U² –÷ÃE‘Ê‚äØ;…â·Ùš¡å}�Qh¢ÛNÙZ(òã:(L\©©%Ùr)¢‰1C‡ÆGÀK¤–DíïJM/É¢—s)»*—k™Íˆ3B×CGJš#ï�ÁE6®2y—®HÃû¼.cïm/EÄe�©¯�Õ;´ªªb>Ÿs÷î]=zÄ£G�xúô)Ož<áÛo¿å믿f>ŸãœËãiR«ËyŸc5�G5¬W+þ~ñ‚?ÿü“Ÿεº~ÿýwþúó/N–'ÄðÞo½>WÄÕé¸Òâlì_¿Ãg1V½¦å#Iž19$B·J,uMì«å†åëSŽîrpgÎÁÑŒÙA“ë{5çRU@,‚W®í•çMGv/v•ɨ}M¼¡MØŽ ÆI­¬ry¬M$��*E¨r8ñ8ñxWáðÙ¥%³zÎÁ잊† Ò-8š³¨^8¥K �äûã!�Ï'ýX�égžl×”�™ý6Ó£aØ÷Ã0 ø2&x†a†a\w>‘³kú˜¶ObìÑëãÏ�IM/çp¾b1¯9:\°XÌif®Ê1rI#ŽDþ7‘R$%Ð�ÏuUÓàêâ+ �ôQoUÞâwåEpZÒÕRÿj—E 8»8è�[¨ÅIÅàæÊ›ï%:NSºM1ŸB Ŏеtí†6xIÔ¢¸Zh‡«²àQyÅ‹âQœË×Tx�¡±c³©�'†DLg÷ð‡ºIr•õæ3îÞÊt�•H}”^~³Îe§ßb±à«¯¾âÁ÷øçÿ“ÿ*µº¾ÿþ{˜Ífˆd�L5»!»º—JŒ‘õzͫׯyöìÿþ÷¿ùé§Ÿøé§Ÿxóæ §§+RŠxçs ­"õ1–:}»}Q±‚CJ䤺RïùJ¥^�—E¹˜EÒu×±Yuœ¾Y±|}ÊáÑ’;_q÷«#Žî�îÌ™-jêÆã‡ó‚ø÷)Ù1¨¤,O\‰½ë+¿þ”ã!×ÕS†ˆÀAà";­(¢—àÐâÞêaª¹Æœ¦ìðrRQù†ÚϨ\CåêR‹Ë3k8ZÜ£’†F:\·à«Ã×Íÿ¦[:’®IIqΗ8HµæaÎNįËÍu¹ìK�a†a{Š ^†a·ˆó"Ó¿45 ã–ó™ëyÆû}˜�õ­>ªðÕ;JD¨ëŠÙlÁá"Ÿfó_yÄecT$õ[ìÄ⺠] ®6lº@L�ÄQÏ4³®j�ªF\¾F|�÷ "Mq£8T ©e4²¨ôág;ã2|‚�bWù ÏŸõ‰¬!(¢EÜJ�‘©ë¡#v-¡Ûº–v³"„–Æ ©êE�¸Þy*ç¨�,v¡8§8ñijš®¡iB×ÑR›i©¨k¾®ÈTlyßåSH¤^ðáà`ÁáÁ!ß~÷-Ož<áÑ£G<~ôˆptç³Ùl¨ÅÕ?F/Pi¤T•¶í躎ׯßðûï¿óÛo¿ñóÏ?óìÙ3^¾|Éññ1mÛN„¡„¨LD\ÙvéöÛ�нª >¼Þ�çû:TÒ»½b®óFBcB7Ê&âæ”nY¯9¹³êzÍ óEM3÷43ŸEÔÊgG\©}‡+®(Å.&‚—¢Ã÷Øi„¡¨ËõñR/~•(Q©²ð•Íd„ ]Ì‚lP*0§ò3Õ!óæ€ÊÕYðª,š#*7cF¢Ž |»äøá ŸóÇæOÖݧÙÙåkãõãÉM†¾ á©;ÓaZwï=?³ý$îi«Åb†aƾb‚—aÆ-A.ù‹xµMnÃ0øôëÀ§Ú˜3l¬ž?ÞÞãAUM]q¸˜sxpÀÁbNÝ̆:_Q³˜”w´!æhÀ¶ÝWKÚÕš6$¢ ³ÅzpHUÏpUƒ«f¸rÙ7 �f÷—xB*^•1úÐ ®(™ÔçÚªÙ%ãe¥²âèJHФØCKì:´k ›5]»¦Ýlèº5ÝfCÛ®‰¡%ÕšŠ( hW7TTTÅËâJT¢8�Êã¤&Ìf³¡ ¤˜ˆ.¢Å­t›Ö¿”Röy‡÷ž;wîðýýûüð�ð¿ÿû¿<~ü˜¯¿þš»wïfQDd·ú¶ê–òxëÕš“å’ß~û�ÿû¿ÿãßÿþ7¿üò üñ!„Á6¾�Œ—ÉûÓ³o·®ófÏ ”ñL�â«ð$’&’FR ´m`MÇz¹æMãXÎ9hv(“61qÊ0 Ã0 £Ç/Ã0Œ[€¼µî„‰^†a|&tgñ1ŒJ㇗ð�uè|åñÞ3›Í˜/æ4³šÊ;¼ô‚m˜Ä ùe„Ô‘º–Ø®ëÂj�]$ �ˆ�¯QWá|�«gøª¡jæøºÁùWÕdÛKÙùWâæÊåá­Ê¤îO_Ç+»`Ð,@h,Ž®ÐH1�BKŠYðJ¡#´º®%wW)´�Bð¤VI­ƒZqx©²ó§dJöõ“¼÷ÔuÃ|1'ÅHŠ1‹0H’F;ÞM‹E”¬|EÝÔܽ{—{÷îñèá#?~Ä£Ç�‡z]óùœº®‡:]cdáø`I•«ÕŠÓÓS^¼xÁ_ýÅo¿ýÆ¿ÿýo~ûí7^½zÅz½Î£aW4Û{ÐŒå IDAT]cå²a/ &2 äÓÁuåPWêÎ9Žˆ'i„�H -íÖ´«ÀéÉŠ“Å’ã˃ÍÜSÏ*|#TµÃW_I>÷žªÊõв ˜ã3'ö)´Ìƒ¤YVJQI1‘’æHÑPmÑ]—èB`³nY­7´›ŽvÝÑT º®¨ÓGõWÌî0¯xWQ»†ºZP¹¡¢‘È×wOY}·áøå ýñ‚® ÄHI˼”-‘K>ùú§·pÍWäSµï$†a†q#0ÁË0 ã†#o©u";6v°gƧdk“NÙÞè5ŒwOùß]çàûl‹UUÑ4 óÙŒÅbFS×¹Ó$Ÿ¯ß„ï… RGìÖ„Í)±=%¶+RP’BHí6DuDT|qz5TuCUÏðõ,;Àš¾™á}…óâ}Ùè—á3Z7û‹Å�])†UZB×ÛMvvÅ,tièИëv¥XİÐqANí<©u¤¶"5™eWï"“’�ç$ÇÇÕuÅ|¾@£ÒuífCHip(í}\ê%*kLŠˆ£ª+<|ð�§?<å?üÀ“§OùöÛo¹{÷.‹Å¢ÜG·„À©è¥ªh _¿~ÍüÁ/Ï~á§Ÿ~âùïÏùóÏ?9~sLŒqât*áÄrJV‰†šn—|¶ãeœQ®óå‡µÞæPÔù¼²kÌãP%’ÚĦíX/7à®fóšù¼¢žUÔsO3«¨çͬ¢ijêYŬ©ó庢ª|vË9‡sY+vGú&L bH„.B$%„DÛFÚ6°Ù´l6-«ÕšÕjÃfÓÒn:æÍÚšFùöη`^R¹šÊ×T¥¶—“šä”{w¿¡]w¼üú÷îþÎf½a½ZÑvÝßù¹Ä®ürkE¯O9Ïí;‰a†aì?&x†aÜì£Âw8pžlÜØ±žaŸk™*Ãøà�ºóêáìlæï~ò‰Œîï=MÓ°˜/˜Íg4MCUù¢7�÷wEHšcûbèè6+ºö”Ø­ÑØBR$åç�‰*Ä”# “¯_‘üÿcï<·ãƵ%\cç¨V–ÇwÖ½ïÿB3ö(K�ƒš¸?‚dKr”mYÞßY:ÉØH€(Um™å€;*êÐr\whƒ[8//V>æru%©¢ì„&º0A–¦¦F—H•¸%E ˆL}ÉL¹ÂD¦bÕ'ƒ— ,Ë R qd!u9DêWV•9W./×q |~ä!ñb€ÈT8ãÎbãUÃ/ ˜ªÔ-ú”ã-Ë‚c;¨Õjèöº 8;=ÅéÙ°··‡V«×uaY–î'Ý&¥¶”RBd¢8Æz½Æb±Àõõ5®¯¯quu…ëëkÌçsF£šÍ&êõ:l[ÝvçÏÓ/Zùžeâ8Ær¹Äåå%...pyy‰ËËKÌçsl6DQ )„r:¡p—•�3!Ê%͉ñåÎV9—Xéõr]§$ZœUj\1@êö‚6Ë ™„„Œ%ÒHy†ˆ§€%U|¡¥ÎGn1X3®®üwyÂgõs«š]Rès@HÁ”ë+“ú+Ó_iš©ÈÃLÉ»ÑCŠí*Bø�"d�Ãò<8¶K׳ÎPó}ˆv½Þ{{#l·*n2Øæ<}´ZþI>{Ñ"9Œ ‚ âå Á‹ ‚ØÙâ(m&Ðþ3A? ½ˆïC_<Áé_é=j%z1U‡Ê÷Q«ÕàylÛç¼ôÌlüCª�ô$‰Ç1â8D’D" cÁ('•’®8¡œ2F€ã`ÈÀ Àµ •ÿ3Ó1†ùûKf3i¾˜TÇ#¥vS嵡Œ¸…â‹)-�³âgõºy ^Ñ@"K‘ÄâØAGH]\×ìÊÏÙb½�×òràù²LÕ7Jâ©2‘¤ß`T’Kã…çÜ8»:�öF{8::Âßÿ�³³3ôz=t:8ŽS‰*„”;Bô8J†!V«Æã1>~üˆ>àææ777ÃišPŽ2åJÔGªÅ¬GµÀÌ»Èok Y:a*Boþf†±ªìUÈ^yø%˜Ô¢W ¡„)ˆ4ƒT¿�@ƒ(MÑY¦Çºr±¡"v•E%õek§:·¤,¾«>T£ê÷—’3U_lâa`» Ðn¤`u œ9`à`,ÿbphÝnÃá«Õ Óék‹ëSQç,ÃŽ�%Ÿ¿J}KñAùgÖð"‚ ‚øHð"‚ žÛêP7Ô´ÿLÄO‚D/âÇÎk¬ˆ=”B(wç¶íÀó<#x9Ž‹[…í9´Î$2�8Ž¢0Dš$B¹w”�!uÜׂ+ûpJõ~”Æ*ž+®#êdic[E‹d!våÕ– OŽÓÅ;sA«\Wˆ�¡TIÿƒÒôwõ*�Y¦D«( aÛ6,‹ÃqœòI ™¿�½\×…È„ªåǪÎR"JQ€ìÕê^2_øäõÙLÍ*™»-ËB·ÛE¿ßÇÁÁNNNpxxˆÑh„Á`ß÷aq®>³®c¶+Oä׺0 ±Ùl0�Nq}u�ëcx{{‡õz¥….˲õó/Ør£|ô×J²ò˜oIØ?1fÎ¨Š¤Æ”?Pw±C’å�flI&-„I]‡Nšdæ­„TëPVú]®?Ê2-É»’�¡*ÒY€>uü–´‘)6Ë,g+Ì&s4ëmtZ=0·x>ÓbŸeÛpÐl¶0±\.qssƒÅÜQqЦ¦¯¶ýgç½/œ$rAA|$xAÏnn”c‚ ~tÍ!~â`B FŽcÃ÷•àåyžq}=’ B *~. B„Q„DoxçÑ€¦Æ i«Z˪0S©Mr ®¿ ãa�Æ¡’×ë‚ú‰êõTÔžXט \ű3íîÚDòç”~#‰$‰†¡Úðw]¸®¨´�r“)Û˜ªååR"Ž}D^„,Ë�¦‰®åÅŒ ˆ½âq!wju™¾â€ã¨z]£½NNOpzzŠwïÞa4¡Ñh æû¦6—qdÑ/ªÉT½.!V«%îïǸººÂ?ÿüƒ««+Ìgs,WKdú1`qnb ¥”O/ÜŠ^yrq÷-¢×ãx¾ò²�·×cA{¼r«—&ìP=Š©1Ì¡…P]ùKhUh‡¢ºJãôùU+/M!$ïÆ<æçàH£ Ûu€å|…éx†^g€d˜Bú³˜rwéÿY‡e9h6› X,hµZð|r • L$¦¹|º­å—Æ)�ØE|ɉJA¼‚ ˆÏPþcÚÏÞgÑ&5AñJ1ñtÅF8lGÕîò}®ëšÈ> CÇÔö¹„ªK•D1¢HÕîŠãYVˆOŒëÍîܱ(+å}Jj(aDJp&P$Ô1ñ&ËLÂÒ˜¼ŠÏ“‹\¬T«˜ˆYe_ý/›«¤¬�‰k #æ¤ÒTÅíqË‚ç¹p]UÛŒs^¼_IT°m |/FìûHÓqƒ ¡bå^ûra§Ä×X«Õ°7ÜÃÞhÇÇÇ89>Ápoˆ^¯‡Z­fjuÏ‹]"Ë�¤)Öë5V«nnnpyy‰ÛÛ[ÜÞÞa>Ÿ! CdiîTãN9ÎJø€Rî4 ò±‘�5ù¸é¤ñq©ïº~[%ÊQrH&Í9%×ÑŸê™<“L ÈU}�¡:Šô‘°Rx§,ü]e×pñŸúì‘i"°Y?`:™b8ØÃfý€š§êøY7¯¦ŽÎó<´Zmôz= C,KÌäLÕWÛ¹Þ|nœÑ”Äk›'ØovSC‚(AA�àEA|j¯£òý³7[äÌ â;‘fŸ ^xl·Ž®ÅĸÅaÛ¶‰3t%æH¡"ìLdŸž ¥�H³ Q! CA€$޵ 'Ñ$ŠB>%±«´Ùnöå¥,m s|²äDÙ-ÿ#KArL;ÊX)£°¤Y¯K¹3gZþ¢¹Â“‹^²âNJÒˆçÆç8.l›A•8cFg°¸Ã\Ï…ûÊ g…HÒ´h›<ñõ]€LË5±lÛF£Ñ@·ÛÅéÙ)Þ¿�““¢Ñl�3V�B”• K©ÆO†˜L&¸¾¾Æ‡ðï¿ÿb2™àááQƒsVe•Ø) ‘ôg5+]/(wjhí6aîB+�0Yýw¦Í[E'g¼ºiÏ Ç¢9­J¹‰ •l'¼S²Ò3¤qËï )!2�‡Í¦“æ{slÖ´›mãôÌ…f¦Of×uÑj¶Ðíö0 1›/°ÝXòuE c&âô“ML¢×«]‹Añ{B‚Añb˜}Ú«&â{øÜ>]cˆoSRæõ­,[¹vrwW¾Á]­#Tlš !”[)Rq#K3dB+×+’ò³cÖìÑ˲èôôx¯ê_¥¨=öX;bØq³°�è9©Ä„ªc¬zòå® ‰,ËLM.%È(¡0ÓòÍ})„ lÛ†çûðã¡A�8ÑÑ�Œ}ñEà»j‰~åšD¢¨%È´¸Q¯ÕÑî´±··‡ýÑ'§§8>>Æ`0@«Ý†ë8z\1#ŠTúW™ˆ’A`±X`:�âêêÊ8»&“ Öë ’8Vã Ü@…8ƒ�«ß°!ÿ±†¹@ûù‹´,½Oá4¬Ùã“‚C>ŽfÜ}Qrq™óS»Ç+Ÿ¥?œ(Ž™™ºwÐñ¤@–IA„Õj…åb‰åb‰v»ƒz£^´Y¡:ÂâªN]³ÑDÐÇp¡â íÙ Y–m$¿|*Û7ö)AAQ�/‚ âE¨T!Ñ‹ ˆïàs›±L²§¯1´WH|j’Ú–egWgÈXîV‚ÙèfŒAa¯0Š!’8A&2T,`¦†OQ«é±¸“»³J�r” Ô›ÿú±RÇ*·‹4©¢^ا?¶»ØÎ¼>´g«#éš_C–‹}qŒ8Žà8¢¯=½�£ï¹ëųï�|ß÷1ppp€¿þú §§§‡è÷{ð<Žm«1£ß�éÚo•=À¸ºæó9ÎÏÏq~~Ž««+\__c³Ù¨Ã,U+éì©N†_%yí|€§œN¬ØžÙa`ìk&XöHÃÈ…—B€«¾^–¦ˆ„a¨jži'W.0Æ+wŒ©Zi®çÁKSxQŒ4K!d„LdŸoÃïXˆ<ç`*R&%¤P�°¸Û±ÑétÐívq||Œ““œœœàììý~–eÃâüQ¿æŽ¬|üdB CÁãñwww¸¸¸À?ÿüƒÛÛ[l·[„aøÌpùÉ $öåù•›¡FôÒcöÙ¦’òŸé©¢ZÌŒƒ,K±Ý>`6›b6ícµZb»í¡V«Ã²xé¹Jø²- õZ ívý^ƒÁÁ6Àr¹€È2”k…IÚ$âu/š¾tJ ÚÛ!~ Hð"‚ ~*•zëAñÃnÄu¥«R\\^Wª^¯£æ×àØ,˪>®T+¯ÝE¢(B'È2ñㄚ|®dìÉ÷0¿gÏΰ_ù>EÝ B,Û�8„i�,S®¬(аÝn• eYàœkѰxlQÇ©ˆ�ô}Y¦b ³4ƒÀw¶e©®ÒSÍÁJ޵\ø,»|„àÜ‚_«¡Ói+¡ëø‡G‡888@¿ßG³ÙçjŒˆ¼æ A�kLJ‰4MEÆã1nooq}u…««+Üß�1™L°YoTÝ·ßi͆×ò—ÿ¹7�=ãú“_p ÈŠ*uÍ9!Õ8Œ¢È¸ò¦Ó):í6ø€Ãó¼ÒØÎESÛqàû>:�†ÃVË%&B¤:ºsç½?9Ž?ó‚ ˆqe¥ËA{;Ä„/‚ âç.ˆ@ DAüÊb ç ¶eÁs•àåùlç‰8¾ÒÜ”e’$Aæ‚Wñ“‹\0zô{ö²“箳èSN£¼þVEªÞ•²lË®¸äÔ4_Ô&³mŽãÀó=¤YŠ$IóX9¬¾Cð’Oºvtë•  ¨áVnGÎ9|ßC¯×Åh4Â_ý…¿ÿçoŒöG ¨ÕjU÷Ÿ€þÙô…vweY† °\.q}}�þù¸¼¼Äj¹BGȲ̈ƒ¿Ëšíµl†æ5ê$Lé­ÊHøÚcZ¸º›”qãaó€Åb�Éd‚N§ƒZ½ŽV»µ3ÀTd¡m[¨ù>ºÝ†ƒ!&ã1üš‡4Mvj³øDÍ4»‚ø5‹¤GË‚ ½âM@‚AñËG��×F’VÝAÄw"KE°¤”ªn—m—Q­VƒçyÊ�Ä8„j~b…»«ìØ £ÐD !~ÞdùšöÀsmIH$I¢n&u›rÎÁ-nÜryæuДèåy²,CňâHжþ¦&Ê•öé7±–z,X–¿æ£Ùl¢ßïkg×1�pp°�f«¥ÆW�åãc@E°ŠãabµZáþþ777¸¼¼ÄÕÕ¦Ó)6›Õ^²¨ G¼‚Ó‚)Q”ƒA2®Ö¤ZôÚl6˜ŒÇh·Ûèt:èõzp§"~2Æ`q žç¢Õja0è£×ï¡Óé K3ãd|î\’å#i×ù‹»�tÁÇ—e7A¼…y™ ^¼‚ ˆ_¶0zîMÒ_Aß…,M(j¶1µ»|¾ïÃqŠ8C¦#î8ã…8"J‚W"Žã/«ÝõÆ›UH‰$I‘eÂ8·r§—ã8Å<_qA)q,�Et\¶m+Aà{ sì3Ã@ÿ� ^Žë ÝnãààÇÇÇøûï¿qvv†N»�V»]w%÷OþY˜vh©HÄ Qb>Ÿãööÿüó>|ø€ñxŒétŠ0 Õ˜Œ+�„x‘3ûe^H‹^yX¢”q¢¯é­vûûûGcéÉàœÁõ\´Û-Äq„~¯�n·‹ ° ¶@úôûVœ‰¥Ÿ™d´þýÔ©.©y@÷MA¼Õy™ ^¼‚ ˆ×wCK7oAÄKÜ�3µ•mÛ|ßWQ†žÛ¶�h‘×yÊ…!’4AE‚Q¨âè¤�ÏÆ’½ýæÔõ�ôOB$IŠ(Œà:n¥]9çª]Kóx^ËËqxžÏó ´¨˜G%~ûª¡ÜéúhwÄÛq`ÛºÝ.z½ö÷÷qrr‚££#ìïïc0˜Ï`Œ7(ju•ÝYYšbl±^o0�Npuumœ]7×7XoÖ‚@Õ<Ë3ø€ß*ò'?TÉ^�«Fî|ÿ¾Å¦ÔŸ+§JôÊköåu¼æó9V«À²¬B$×�¹ªñÕl6ÑévÐï÷±Ùl°Z­ÇqQ?î©c/‹_Ä纋 û&‚ ‚ø"Hð"‚ ^ÝM›Ù ›7‚ â»æÆlÛ�ï×Ðh4L”aîê’�U7’Tµªâ8./]éOޜΣ %“FøËÒaÂqø±o\^FÚÙз8‡SŠ–LÓqÌ¿YHÜÕ*u’ô{ ¡ú×ó\4ê àìì §§§8==Åp8D½^‡ï{TßçÇσԢ)çŒs¤iŠ$M±X,qssƒ‹‹ üûÏ¿¸º¾ÆjµÄz½†¼/c¬p BþV.ž×$zåÚ”|Á«ƒêõ)+ ¡i’b½^c6›a>Ÿc±XÀq]Ó­K©£ ÇA£^G§ÓÁ`0Àb¾À½s_ô½0Ÿ x»¾¼§ÈÙE÷MAñ�àEÄgî,‰'ï(ˆŸÖÜtóFA|+y|�ï{¨ÕTí®\�QsLUìR1uJì ‚ÀD&I)ž¬:ùÇMÎe‘)¯s–‹ƒŽã€3U/Mu€Ši3N:ÎÀuü¡ïûH“i’"FŒ4ûÚúh¬ÒRFª l|ß�ïûè÷û‡899ÁÙéöö±··‡V«Urü ˆLT]L‹U™È�Æ1Öë5V«®¯®qqq�Ë«K\^^b<™ ŠB$I¢Ä²¼Î—¶‹åãë·YÓÈ4ÊÙwÒ‹Ûq"f"C†X¯×˜N§˜L&ð}­VK»¼¸îV5æ8ç°ÍfÃá³Ù Í»¦Ë£Rd&>±Ò’î5è~ôåN+j*‚ ‚P�àEÄÓ‹fZ1?yÃ%éFô×ÜÀ‘èEA|õ´-Á-Žš_C³ÙD­VSî.n÷‘™kôN´È2$iŠ ððð€ív‹$IŒSÞ°–òÏÝbdœ��'MT›Y–۲ฎig#@i±ÌâJðÊëye" BñÅN/#ºIµF�Ú2£êm1„¶c£Ûíb8âôôgggØßßÇh4B³Ù45Ǥæ³qpž VªÃÓ4EFX¯×¸ººÂåå%®®®puy…Ù|†‡‡¤ibj„±Ò¢¥ÕÈØï±˜Ù�—|¹‘ξy9÷#Î4“dXêθéóíÃÓé77·hµZ‡p]WÅ2¦aÊÍÍf£Ñ³Ù �N›ÍI’ ™ŒW>Gå:Dë\âûnS ‚ ‚Ð�àEij+fºïz¢YHxù©PLAñMó‡vç8Ž_;»ò(Cã¼AU€�R"ͲJ”aÇHÓRÇÓU6Çñçn2šÈBV¸¼¢(‚¥Ý[®ç�Ù¬ËÏåÌ8ÀÒ4U¢W–¢Äçëy™’X¹È%�[�s×qàùÚí6öptt„³wgx÷îz½Úí6ÇQ1•ù{Iij¾•ë9%I‚ LM§�?âǸ½½Åýý=¶ÛRŠBlc¿ñb噘½—ç¯îœa»G¤\XB SËk¹Xb2c„ ày=~¥É&TB§ïûèu»ôûè÷ûX¯×Øn·UÑ€,·­m ‚ ‚ ^¼‚¨Þ÷ÑŸ‡}öF�œ^ÔöAÄë"ßPÎëLY–˶àû5Ôj5ø¾Û²«b+ü&¹Û(Žcc˜¦¥ˆ=öÌÄô§®›d.v©É9¢(gžçÁu]ã°bŒçVÞOœ«ØC×q‘º)/AǦŒðõL篣je ó;×qáz.ºÝ.F{#´1s IDATìïïãð臇‡  ¨Õj°,«g‰'D*)% Àb¹Àt2ÅÍÍ ®onpssƒÛ›[¬Ö+DQ¤Å®ß¹/©–Tµ9ôµ Y–áaû€ùbnjyyž§®'yD¥Tã‡s×u�nûû#l6,—Kl¶•kÓ…Ñ¨Ý ‚ ‚ ^¼‚¨Üðª<â)X¹™ÈmDmOA¼Žå‹,MLGÙÙ6\Ï5u»<σe[;sKáPB—’ª»U/0š{*�—OÆÊÕ”‹TŒ1x¡¼L/Ñmª–ãÌb®çÂM\¸® !DáØÒõ‘žïwiϘ9ýšª³´¿¿�¿þú '''8:<Âh´‡Z½ß÷•ÃORî#KH ‘$Y†åj‰›ë\^]áüüXÌX,Æù§õŽßvíO¢ËS«N•‹™‰ Ûí‹ÅóùóÙÍf�v[�i ©]�¹£”sŽN§ƒÑh„år…»»;,—K3®w߆ ‚ ‚xYHð"‚ø¶Û`âW¶?‰^A„™dEìâ‡íØð}¾ïÇQŽN®Sâ‹,bë¢(B†ÃPÅëe…˜¢¥jkÓ†y  nmÃNÓ̈†ŽãTb$sˈ^¹0éºæ+Îr!닺Ÿ1Ôj5Ôëuåê:ØÇÑÑNNN0�ÐétP«×�‘¯&$X)Þ:Ò2I¬V+, ÜÝÝáââ777˜L&˜MgØÛJü"€+ga‡øªÇJ©hL??¦r�*I#z�'c´;môû}Û©£=w#5kµúýƒ9:�‹¢(B’$¦Æµ=AAÄ��/‚ ˆ¯ß' ~TÓ‹ ‚x<70³�Ï9Wu¤¾W^¶m!E¹qÔ"¤Põ£âĈ]yí®LdêõóÚ]_R[êOZåõ‹Ì¤ŒJ,¤çyHâp«ýTŽ´, ŽãÀu=xžŠ‘L“©Ž¦üœ(À9çÍfý~'§'xÿþ=Ž��±¿¿�n· Û¶aYÖ“q–¹à%¥„ÐâF�ÇÆÑu~~®kum†‘©×•?��™X;“�øZãêJŽ.\>s]ÑBV¹†Ûýý=ƒÂ0D£Ñ€m«ÈΊÓP ^½^ƒÁÝnÓéB¨×¢–'‚ ‚ø±�àEñ¦ïÖ�r"{k�D/‚ 0Î %ž¸ðý"Êиzdñز+#MSD±rwEQ„8ŽKQ†¨<—xj>fFB�TÑ�q+§W@BÂu]XÜ2í_~®ê7žç!K•Ã*M3%*eÏ¿¯ã8¨×ëhµZ888Àáá!ŽŽŽp|t„þ`€V«×uÁ«:¹ ~Œ)±L�(аÝn1�N1™Lpuu…‹‹ ÜÝÝa<c½^!IR¤i¦ŸËJŸ¥¼œ×6{åb×ïËK/ü>ß"SЇ‡k8ŸcµZ¡V«)ç Žî4b¸Ž6l6›èv»è÷û˜ÍfÆ)fæì4‚ ‚ ˆ?¼‚ Þ8²(Eðf §AQž8gÆ-”‹]µzÍD !*Qzœqd2+¯¨¼’$Ey#¼ˆï£–~ÜòL9›P4QÙåå8Ž©¯• �y›–#àò~˲ ašÈÀìÅKJ Çq0 pxxˆ¿þú ggg‡èv»ð}߸ov låbWþÞY–!L§Sü÷ñ#þýð7×7¸½»ÅjµBÅ:ŠNêç³Êg) Ÿ«;öëƒoEìzj%ø½¯õü¿)çŸqóXÃåb‰år‰f³ Û¶a[VÉù)!„„mÛ¨×ëh·Û ˜ÍfX¯×Ðe¿Lœª7ùØ’T+� ‚ â{!Á‹ âOà�:½¨žAÄÛGíËj$]éß8WÑvy=(ß÷áùÇ1BKá¾Ðσ„j#;¯ß•ר"« ù{QW<=3TVåšh·`qK;¼8ØnFs]išª(Ä$E– °,5ëËRq•žë¡VW‘q§§§899ÁÑÑÑj6�ØõÔßÃäîp!2dY†4M°Ùlp{{‡ëëkœŸŸã¿ÿþÃt:Åb¾@…ZœËÇ z†j<âÏ?)¾öá¯cô¡çg~øç^ƒR²=ô‰ÚfúQa½^c±X`>Ÿ£Õj¡^«Á÷}é Y¢œsÔëuôû} ‡CÌf3xž‡8VÑ�O¶‰]AAß ^AoÑéE›�AÄ ¦þ_VE¯\„€ŽÅ³mžçÁ÷}8ŽÎyáÆÉ7±Ku¸r'R.vÅqŒ,ËÿuˆùƒšužíVÔèB@ ‰0 !„€mÛðkªO,-ä‘‘Ê!ãòÊû/MSdYŠ$‰µ3êu|ƒþÇÇÇ8:>ÂÉÉ ÐjµÐh4àØ68çEOiK�”Œs0Î!2›ø°yÀl>Ãýý=>~ø€ÿÎÏ1›Í±X̲,g’© ¤ÐƒNê�ÌÌÿÿTAé7wk½šc—R�'D§Rü)‡Åò13_Ì1™LÐn·ÑëõД�űü¹¾ça0`³Ù`<c<c³Ù Ë2uä5ß@Î.‚ ‚ ˆ—‚/‚ ˆ?‰7\Ó‹ ‚x{ìn�¢WÕ!¤Ü]<׃çyFðRs«2R*Q&‰“ŠØ•&©bòøÃO‰ ’ô¯Gk &µè%…‰% }™;îr!²ÜÁy_9ŽƒZ­†L‹RI’¨:_G³ÙD§ÓÁÑáÞÿÏ{œœœ`4a0À¶mX–eÆH>.ÓõÅtŸçñ…˜N§¸¹¹ÁõÕ5>þ÷———‚q!º†+�Á�Æž¨?ð„�$¼¾\ƒKL>1” —gªÿó¸Íõz�édŠ^¯‡ƒƒ¤ijÆ5vÖ׎ëªXÃ~½^­V i’" ªs•ýá” ‚ â�B‚AÄŸ¶EPrzQù+‚ â5£æªªÀ%…vذjžïûp=·»´›K@€ƒ+Ñ‚1e—"ŒBl·[A ¯L׋Ê7Ÿeñ"ÏH^´¦@Q{Hîˆ�RJdY†(ŠðððÎ9,Î+Î; )¤é˲àû>¤”F0s]µZ ûûû8>>Æáá!ŽŽŽ0ôQ«Õa[–vêHåæB5Vº/£0DO&¸½½Åíí-®®®0¾c¾˜cû°Uβ\쪔ã’%N©f™$gןpÊdzÁ6Àt6EoÚÃjµB§ÓA­VƒmÛB@¡�a€Å9jµZí¶‰6Œ¢ËÕ2Ý­ ‡Š• ‚ ‚ø6Hð"‚øCoÞåˆ7¤^AÀ”¥E†B„(|ÊœqØVQ»Ëu]Ø:Ö®p5KH&�L!2a¢ ƒm€0 ‘&)¤`\×î’åÈDâSó°j¥\*jŸI¡\Uqc»Ý¶mxž;wz1®úF‹I¹S/wËdYÛvÐl6Ðjµpvv†÷ïßãààý~�FÃØì$ km±—ÆD&%Ò4Åæáóù—øðñ#®®®ps}ƒùbŽ,Í ¡ë–ýª•‰]¿©…( ‰m°Ål6SuÞ ôû}8Žß÷ ¡€d ܲàyZ­z½†Ã!–Ë%,n�±Ä¼.Ó±ž"ÔÏAAß ^A*ìqSÙñÅ~Ÿ�¡6‚ȪFñ¶§-íb`�°¸UÔ}ò|%x9.,Ë2Ž 3¿i!DJ‰4KEÂ0D†ˆã¸RO'Ÿ\Té&Vúã Úˆ.š‡•âþvò’õJ½uŸ¦)Â04‚Wîȳmû‘Àdq Œ3#pÎÑn·Ñét0�°¿¿�v» G?7wÇ`'Æ„�HÓÛí«Õ ···*ÂðúWWW˜ÍfX­WH’ĈeQœÿEjù¯Ä’$Áz½Æl6Ãx|Àýý=¦“)‚0PB§,>ATƸdR(qjÌ&I‚4M1ŸÏ1¾¿GW�O!„ŠíÔµä”Ë‹1¿VC·ÛÅÞÞnooÑh4E‘97òèUº¼A¿4u¯¼‚ ˆÇ‹–ÒžÞoµýCEÉ‚ Þ&;qrŒ1X¶r yžgC¹‹K¥ –\HHEŠ4)Ü]¹»"»hþøúùv×%µÈ•Ç¿å�É2�$I†!Ç�mÛFø`œ0õz­V �N½n�nõzõzžëÂõ<ý&P@˜:³,Ãv»År¹Äl6Ãõõ5®¯¯qssƒ››¬V+„aˆ,ÍÀxuŒÐ ž[«ñ-M´j˜Íç�LJ Jt×ãZ–\‡¶m£Ñh ßë¡ßï£ßï#ŽcÄq‚$‰??ðØã:yA/±¶*´Ù¯>–—X›?u)ø¢ýG/ ^Aij7ùäô"‚ ^Ó•ž•œE¶­Ý]z“¹eȘ‰ÝãL $iš"ŒBe˜&©zU®j�Ðn=§Ð\òü€T¹�¦­UJS—È<^ di†(ŠL½## ˆ~k6›ØÛÛÃp8D¯×C§Ó15Ùò/ÆE““ÇÈ¥iªêum6¸ººÂåÅþ;?ÇÕåV«6› ’4��ÜâE½±ü˜% ŸÄÎÚ²4�M}.)…æó9¦“ –Ë%Ì8Γ×ô✣V«¡Óí¢ßïc8b»Ýb³Ù ËRs]“å�ç'æÙr²t^A|å=?äk»Ø7Gã™ç1I¢×O_Òz™x��àEA|vüÝëן¸V–øŠc¦ÅAÄop3� ê/¸Åáh±Ë÷}x¾Û±�b\GzƒXB"â8F„ˆ¢I’ Ë2ãðÚ�Däó[ËD©_ ËU7™vÅ.õ=Jð²-�Àu]ø¾_ĶÛè÷ûØÛÛC¿ßG«ÕB£Ñ¨ˆRfúÖu»¤þ}’$B`½^c¹\âöö>|Àåå%nooq�8Ž‘Ä $®EÓr\&ñ_[>·\,×Ôß’T×òšÏ1ŸÏ±X,`Û6jµš¹vH}0ÆL�¯<ÚpµZa6›!Žãò}ç˜ âÛ¯!òWÂ7.¼dióB’èõó;Ž ^!$xAŸ^@~ÇMô¯Zÿ|ñû’Œ â÷˜‹J;1–eÁó=ÔjJ,ñ}Ží€3^.r±K UG* Cl·[D¡¼DV�ä£ ’¯ï—\ ”E›çB’�BEjqIJ‰8Ž•;ϱMÌ[·ÛÅh4ÂÞÞÝnívõzÝ8e€ÇõµT%“™”ªop}sƒ‹ós\^^áâò“ñÛ`‹(ŠT½®We¼P ¯?÷ÚòÉ5e!ˆKmÿdR¹ °X,0™L0è÷Qó}tÚm°ÒØÍ�^–eÁ÷}t:ŒF#ÌçsÜÝÞ!UË+$¼ßuïC£‡øU÷ü/2~_À`-é`»Ý"Ë2jççö´ƒýe÷4ñ«îù_`ü¾è©Nó1Aüñ�àEAü¸Åk)üµî1½Ê&§AÄk†�s ¶mQ†žÇvÀ¸D$ ±K#„@Å‚ÀD¦iªÅ.YkòYŠŒ>Ÿ˜×M #Ý+Œ�óB€ªö˜êU?-ƒm[°mõZ{{{8==ÅÙÙNOOÐívÑh4áû¾ªÅ†Ç_e§˜”Q)¡a<Æõõ5.//qww‡ñxŒÕj…$N*1—R>^Œ˜~—²ê®ù†]7ªÿõæ/AEü¡þ–eÂ(T.¯ñ£½=AËRc½|-’z {ž‡V»�n·‹^¿‡m°E–fH“T9R%IÏÝOtŠ=j›òwj‚ ‚@‚Añ6¤|ÅbÈéEñê§ض×uáyžŠ2ô|ض¥D ‰Çq†Rš i#xÅEí®Ç×ýW¶ÑüÚG>>.Ʊ#*Ön©%|¶m£Ùl¢?èãèèïÞ½ÃÉÉ ŽŽŽP«ù°mœóB$xfã?Ë2$qŒÕj…ÛÛ[œŸŸããÇ�øðá–‹%¶Ȳ ŒñG1…OFÆíŠ]ßÜ]’D¯?`M[¾¾H)Gj,N¦,–K<<<ÀuÔX¶, &òS»=ÏC»ÕB·ÛÅ`0Àf³Áv»EJˆ'¯ÎÓç—.ãH<3UÐu‡ ‚ $xA|ý.Ýo}}£}ˬ–÷"ÙîÓü ”îE7£ñ/9t‘~Sׯ,Ë‚ã¨(C¿¦Ü]¶cƒ=#våõ£òÈ»0Ç1Ò,Sµròhw.ÐMÝ_AÄ@‚AÄ·ÜXß°3ðmm'ñs6¯†°&ÉEF?þ\–tš½¥ëO^·ËâÊÝU«Õàû>\×…mÛzž(bÀʵ»²,3‚WˆãY–VD�Š™H~BZØF>çæ)¿Ç[,T{©]g)ÕçR<)åq‡�f½^'''øßÿý_œžžb4¡ßïÃqÓ�y»)—˜´Û+o˼?‹…qu�ŸŸãêêªâ�)×û2cb§OžêÓ—]+Òjñ�˜o˜׃ Àj¹Â|>Çl6C½^G³Ù„㺕±Í¤„eYð}ßÔ¯Ë�ŠŽí(ñ˜Jy}úÜ¢ ž ‚ ˆÏ@‚A¥»6‡Kþ#QºÁÚm+âçÞܾ�ì~½⇞c´Çüæ®?Œ1ضÇuà{>j~ ŽŽ {r¾Ð‘zI’(¡+†a5Êp÷ñ�&ù/]È¢¦ÏÎïßüxb ÐQ…y},©…/Î9lGŶ[mìïïãàðGGG899ÁÞpˆF³ùl?2Æ´«NBH‰4M‘& °Þlpww‡››ŒïÇX.—%fî:ÃŒx†Çn1‚x±5ª£A¨hÃÉ­V ý^žçUc:‘ Á5ßWu¼z=´[mÔê5)�¤ÉÎuŠlMAA_ ^AToÚô=m <Ó>ù}'ñKÆæï¼™]6$zÄ8Çhîz“×Û²áy<߃_óá8Žþ,òI!CH�$I°Ýn±Ýn…‘ÙDfŒU²k¥É+üÖuÁŸ¹�»·rgœ�²,S=Æ9ÛÁ`0Àññ1Þ½{‡wggîí¡Ýn£^¯ƒs®*-Jå¢@¹?¥”B Cl0�N1žŒq{{‡»»;,–*Â0ï×òW¾hËû§\[Œ ^t}ªk&q‚Õj…ñxŒ~¿�0 Q¯×Á§rÉeL^zž‡v»�n·‹V»…F£�8ŽAõ ¨]•RÒ&‚ ‚øHð"â‰] Tœ^ÄNÛ¿nSaç�\Ùï{zñ¢j‚·qý©!c Üâp]¾¯êv©º8VEÔ+ê3 !�¥¢(Rµ»Âi–ª¨°'³kið|Ñ)V«"£„„¬,Ë‚çyè´;èõ{8==ÅÙÙŽ��qxxˆv»×õ`Y„�B@êÍÿ²x)¥D–¦ˆâa`¹Za¹\b6›a2™`±X Š"#”Ù¶­ê{e¢*@æÃI�ùÄpc’Qü ñ™éåi'gyIH¤YЇ‡Ìf3Ìf3,–Kx¾�f³Y‰íÔ'ÇA£^G»ÝÆ`0À|>G†Øl6êü�¥ƒPâÿ'Ç*�g‚ ‚ $xñÜÍíÊ?y#I¼Ž±ù;;½è´"‚®?»Ók^ K©B 0ÆÁ9‡ã8ð|µZÍÔí²,K=z3Zÿ7Cš¦Fì ‚I¢ãÁ-l¾yÜì¸àr§Iù»ã8¨Õjè÷û8;;Ãéé)qxxˆN§ƒf³ ×u`œ*òq½¯\´”B ŽcSi6›a6�aó°Q޽(‚mÛ¨×ëȲÜY¦j|)¡`'¶òù…-‰_wž~÷5è÷lçO·Tm#„Àv»Ål:Ãd<Æø~ ßSõ=Ï«žPŒÁ²-øLÕò�FX­VX¯×˜ÏçHÓ´ÑùÅî.ÏAA$xñé›&‚x�üî¢A‘/5 ±«Hdƹã8ŽŠ3ô<¸®[uwÊ‘.•è%¤0‚WEˆãi¢Ü]ªÖ‰^ÏΫðLDäsmǃÅ-X¶…V³…Á`€ƒƒ¼ÿŸ÷x÷î†Ã!z½|߇mÛ`ŒU�]¥/!²,CLjÂëÍãñ“ñ³ùóùq#K3-ˆ2#$$I‚4MDZL!ž¨ß_æ<ýÞAö†Ï! „a˜Í窖W»…N·cD.}28·`Y6�ƒ–Ë%Æã±Ç”X_œkB ˆAA_ ^AÄï¹±PÚ{#m– âuò9WˆÔʹ¨Â Û¶*Q†®ë²-pÎÕódþ<å~ÈDfD�\ì2ŽŸïÝi—o·V×Sî-Uc¨,p0pV­‡Åg�F­v øë¯¿ptt„Ñh„Á`€Z­˲LÔd.¦1Îa寬¯(Šl·X.W˜L'˜ÏçX.—X¯VÂQ™¾Ìë°©qbÃu]¸Ž‹ÈV�AZ¸Ï>—/"Hûƒ·ÛÎL�Giš"%^MÆèt;�FH³ ¶mƒs®\Œ¥ºsžç¡Óé`8 Ûé¢ÙlBJõZRªhC#à~I FÏAAüá�àEAü¶�Ó‹ âõòYWHéú­6€°ÂÝåy^Eð²-»òÜ<ÎPJ‰,Ë�$‰¼’X¹~¾Ûñ†Å®'û¢RçŒUjqÆM¿Ú¶ ÇuÐï÷1ÚáÝ»wø¿ÿû?¡Ùh V¯²h9)ÀçZPS}�;»0ŸÍpw�ËËKL&Õ�y$%tM7-xæ?çÀ8ŽáD²,Cše�B§X2PN7ñÓΡ4M‘$)Öë5&“ úý>¶Û-’$1×5}Á3ãÙu]´Ûmôú}t{]´Ûm$I‚ *ÉŸæ<�ŒþÒ‹ ‚ â�àEAüÞû äô"‚ø=ÙÑ!¤”àœÃ²,x®ªÛejwYvQËfW„ÒÍq¤âð¢(B’&B@Y,$z<î-liïVáîÒ?—Ý%œq8®ß÷Ñï÷M„aþ•×ër¶mWœ]ùW.X !�& 6› Öë5îîîpssƒûû{Üßßãáá¶mölX¶e„‚<¾RBªã±À’8AäEJðJSÈÜQ¦lÔóÄ]‹–êÙåцËåsÇÙívM §”BJpý˲àû>Z- :�Ç1–Ë%€Ì\·ÌyI‹]‚ ‚ ˆOB‚AñÛCN/‚ ˆßü:.UVWî‚p]·"xY¶ŠÆ“BB¢ˆ jw%)Â(4õ»’D ^R œ6‰?ƒ2o±G}R¹ÍMüÚññ1Þ½{‡ããc¡Ûí¢Ñh˜úCåØ6ó>Zô’RBd¢(Âl6ÃÍÍ þûï?|üøãñëÕ™ÈÐiwÐj·à1¯pÆ $_1˜˜¸Ø‹áû¾‰µBTû©5­ˆ—¸†•REX.—˜Íf˜Ïçè÷ûð}R6Ô#KÖ-˲àyšÍ&ƒö÷÷±\.U½B$�ù_Ð5Œ ˆ·}¥ëA/ ^A­‘ ‚ ˆ_ ×QwŽã V«Á¯é(CÇ…Å-%ºh¥\KJ Uë&Š#„aˆ8‰U”¡< wñüü)K®.½¹®Û[Û¶áû>Úí6F£pzzŠ““ ôz=Ôk5ØŽc­ü{¹V‘qš #, Ìf3\]]áòò···¸½½Åf³AǪ®WÁ‹=ãË_§<é—cájµš¼ò˜Ë||ª°ù¿ˆ—B�O‰,ÍV«&“‰„›Í8/y(Kq�y´áp8Äýý=�†‰j•fìïÖÝ#‚x3kɾû5‚ ¼‚ ˆ·²É@M@ñÛ‡e[p]¾ï£V«Áó<ØŽ ¦ÝZÚ¡…Y(�$ ¢H ^qŒ,ËJî"ªßô%‚’ÚPÏ]t¹àÕn·qpp€¿ÿþýõö÷÷±··W8ð, ²,ÏI¬¸XcH…0b×ÅÅÎÏÏq~~Ž‹‹ ¬Wka€KXZ? IDAT,ËÀ˜ª–eâ8†ëz&Ê0¯ —_>r¡4MSD‘Š6Tã@Óµ¼v7ÃÊÇHß·e•kSEج7˜N§èu»è÷ûªÖœãÀÖçKyüÙ¶�V«…ápˆn§‹f³‰(ŒŒ€Ï™ú£¶A¼Éµ­×‚x!Hð"‚ ‚ â—ÁƒeYpž§jwù¾Çq`q BŠBÜ@!¦ˆ,C¬Å®(ŠÇÊÝUZðgË]»nã’Ú­ƒf›»¦|߇ëºèõz8:<ÂÑñÞ½{‡““t»]t:mضSz/iÜÖLoüK!�¤)Ò4Áf½Ál>Çýý=þûï?œŸŸãîîwwwÆ•ÅS}Î…ªËeEp]Iâªcç¬RË(w§qK¹¼òñ“ ^J(Õm E¯J{€Ññ‚'œú& …Ä6Øb>Ÿc2�bµB`P1†º@žyªeY¨Õjh·ÛèöºèõzêÚGÈ2±{Õ|ü¦•¥qMAÄŸ ^AAAüRžtwY6g@¦ÄÎ9Ïk@)!% Cl·Û’»K@ˆòFéûTô™‰Ô±…ùïhÇœ„ã8pýAÃáGGJè:88@¯×C·Û…ïû°¬R]-YÄLî:ë‚ Àr¹Àííþûï?\]]áîö÷ã{l·[Ss+â2‘A&êø„°UÓ�3ÎÕWѵRÕñ܉6Ì£àrwŒ4ŸU§C%B‰Dâ›Ï·ÒØÉݧ‘v4N§S, <<<À²ÔµŽYV!ΗÆo£Ñ@¯×Ãh4BX¯×Hâ¤rž±ŠÞõ„¸¥Ç5�g‚ ‚ þDHð"‚ ‚ âÇóD±Å\¨Pî.U·Ëó<8ޣĮÒãòÇfi¦¯$A‚ äîÊ߈0í ·ùc‡—ª£fYšÍ&Z­Žq|r‚ããcS¯«V«Á÷¹pu?Ãó}´Ûm%3†â P¢³c;hµZ�F˜ÍfhÔxxxбŸ™~ä—©´4ž ‚ ‚ø!Á‹ ‚ ‚ ˆÃ{­E,—¼\-xù5¸® ˲ÀC–eJìâ\oñ2H!‘eZ‰B„aˆ(ŠTlmì~V¸¯òÎaœ�CE©uÚ †üõîÞ¿�ã#ìïï£Ñh˜(AS¬¤N©RDR2d™rV­×\ßÜàòâççøïü?ÌfsÁ¶R¯‹©ÂlO:΄@%lÚ�±<–e)Q4ÞNœ¢eYpm(„@š¦ˆãÈE¾¼1h¼?êTË£C¥r(n6L§SÜßÝ£Ónc8¶mض]œKZH¶m­V i’`¬Åæõz�,Í�È$è^~iŒAñçÝ€’àEAAäkÃG‘sÄÛágoñç›­ eq¤pz1®"è\×…ëºp\GÕíÊÝ;Ú�déq™e„ˆ¢a „®$I ²»dõøÛþÖî`¨´©ÈÀ”›Ä÷}4›Mô{}âðð‡‡Ø?ØG¯×CÍ÷�ã.ïU¬*\¦©r²l6kŒÇÜÝÝáææ××טL&X,Ã@ÇN–m~ \×+ÿ>o{)¥‰®tlŽë ªÆ›ý¸†ã¶Ž<ô…oÄQUß-3c…1@J½ˆtí+¹MsÑk¹\âþþý!6p¶÷‹ë¢ƒçºhµÛèØß! $i‚(Ž*n×O�m‚ ‚ þÄ›^F‚AA‘/© Þ2ò—½¯¬FkéoœsØŽ ÏóŒèeÙ;À(bëÒ,Eš¦ˆÂÛ`‹ PŠq,½Àø}k›Äùæxþ]!8SŽ­z½ŽÑh„ããc¼ÿ§§§èv;hµÚð}¶mÑ…Bú¿™”�¥ºjišb³^ãîþ>|À‡pww‡ûû{]K+Qu´vÚ—i1.—Fs V>^¤”HÒ™È`Û6×�eYÊcÙ•Ïi\cŒÁ±HO‰{a¶íÂÝ&‹÷&Ñ‹ø‘WÛ\$Žã‹Å®ëâàðëõµZ5ß×5õ$„,$v×óÀ8G¿ßÇþþ>6› –Ë%6›ÍÕ)$±‹ ‚ ˆ?¼‚ ‚ ^;&ò«øñ¥�Ô>o¹ÛV¿ø`W"‰ã:ð}µZe”jw¡ˆ”Ã+Š"„Qáî’B¾ÜgzE'ÃãMmö(Æ,Ì—8>„P…®òúVÍfívûûû8=9ÅÑñ°··ß÷�ƒŠs^�eù¦¼Þ ÏëkÍçsÜÜÜàêê ¸ººÂjµÂÃæi–B ù¤cNJ ¡‹p±Ò9\®Ë%…ªòšmŽãÀu]u|Œ?õcÊ=¨ã2s1UJ©E·7så#~“ ¯‚m€år‰ùlŽétŠz½†F£Û¶•Ø¥Eªÿgï<×ÛÆÙ­}ì’%[r/)ó½ûü�h¿{’¸ÅMn²Ä |?@R”í´If&qž{.�mE¢HE,®õtkÔõû}677¹»»ãââ‚û»ûVøö$ˆˆ]‚ ‚ Èä‰^‚ ‚ ¿�áïÐ+¬û^(íó’ûÏ¿¼�»‘uZk‚ÀÕíŠã¤¼qå9Á«+²,#MÓÖ5d¬E)í>á…Lô¶‚Ì’‚»œ7ú82ís¢W·nW†ôçêÚÛÛãàà€·oß²µµÅÊÊ ½^ÏÕëê��‹«YÖRƒ©ª¶6Ñññ1ÿýï9::âòò’ëëk!hÌ"VѪ%Ñ«‰º4Æ´[Ö:»”­kƒÑŠlEY�¦)a¶}FùjIô²‡˜®�`aEQo¨T·–—ðÏB¿ã”‹ÂCš¥Üßß3¹žpyqÉp8d4…!¦+v¦þ½×ë±¾¾ÎÍÍ ÃÁ�I2a>O ^jáV”Ž-‚ ‚ ‚— ‚ Â/Ã#'Ó�à%ˆ]gû¼¨¾ó/ÒŠ2 <Ï#Š"’$!Ž£%·NWkÄ.cÌBìêÔª~ XÃó;^=×ávìÓ?U·-;¯©ÿ͵Y3ñ½¼ ­4aì\Nãјñú؉]ûûìÔ5»V×V]M¡º.–µÕÙ]—]QÌf3¦Ó)gggœœœ´Î®óós¦Ó)óù¼#”Õ+¯\´åb{šèJ[?¥ž?¤•ÛèF°JÓ”,̓pñuí£fÝQ Ñm_+Ë’ªtïob0míz¾¦GZ”•Û ¾gì­J7†ÝÝÝqqyÁx}Äl¶Õº[½ZìRJ¡ÝHǬ­­1��GL®'Îí˜g‹c^ZXAa ¼AáDª…ßË/9£¤}~‹�géÏïßéö �Ü­ÙÕu^5î®$IèõzÄqܺ»”vbH#®h­±ÖR–%yîâìfdYÖÖƒj�=<™§¬Zl¿ýòzÿôýû±ØÕi_¥gçÄrÿæ‡ÃÁ�ñú˜W¯^ñêÕ+vvvØÚÚbuu•^¯çÜR�KÌvŠ\5í¨Æ8±«ºNOOùðá>|àòò’éý”y:§*«6žrÉyÖ&jù„hŸï`­Ø¥êÿŒqµ�²,cžºhC¥žç꾩gú}#xµý¨ÈÈó‹yöXùaǾàÁÇÊÀú]ßú,®Þßßs~~Îúú:;;wm¬«ïûMQ»VôŠ¢€ñhÄÆú:×××diÆýýýãCô³c±ôAA~îoL?öúT/AáE`M/ü ë)ßñ�P�öùëßÛ>ö¯]°hí7aºIÞ8!'X4ΟfjwW–eëêYªÝÅ—ëÕt�)¿Ê¤káø¸?·Ï=*V§–¢ïó|ßìîî²··Ç›7oxõꬭ®Åq[3È6u„jñ¨»‡ÝíÍ W“ ‡‡‡¼ÿžÃÃCŽŽŽ˜N§˜Ê¸öî8¾x\¶Q¤j鎥œ`ªš­S ˜ª¢È]´ax¾GàhO/Õk–ѬÖZâ(&‹œXZ–¥‹€{®©¿ç¸~¿ó�êX¨-.Zôáá�««+&“ 777¬¬ô[ÁY=ê¿A]Go0:—×hÄÍÍ žç¹˜ÒŽˆ¿|¯‡û뇌÷òÅWA„_ìúT/AáÅL,X»¸àÿÙæ»m÷§LÆ ‚ð; ϵøÑ¸m¢8"Šb‚Љ]M,¢ñ¥[·+Ë3'T˜Å`߈Ÿ¾~EwAÿØnƒµív+ê˜A½,,c1ÆÅA|RhÓª~]�ÄIGð²K"âw÷q— �þüd\Ãõá,u±†×××\M®‡¬¬ B·1­è¬=íy$IÂêڣшóósÂ0t5 +³ÿT#~«Ÿ«CÊq!‚ Â?ü}C/AáE�ä:ó ?"v ‚ð/(¾ô…g‚ Š"â8&Š"‚ h]9Ï V�»«©ÛÔÔí2Ö´ÒÔ€zyMüŒàÕäÿuE¯%‘Ç~íz�Ǽ:xÅë7¯ùã�?xup@e…^¯×¶o³ìÇBÐ CÓé=WW>žžòßÿû?þüóO.//¹ººZ¸í”sð)T½ì·õ§Ï´�V.YdŒ!Ë2”RD‘«§•Æ÷üVhPJ-œc´Õ„aH»XÆ,Ë0Æ`*ƒÁ,ÚV~ÀqÛD©¶q£(¬rcU–gT¦âæú†«Ë+Fk#666–ØV²ª]Šq³ººÊxL¹¼¸d´6b{{›••|ßwõï¬ÅºŽŽµÏó ¬�Çl¬¯s5¾br=!Ïs ‹T7þÔJ§Aá÷D/Aá%Î:È%¾ Âß=Ô>½–&|;u¦´ç†�«Û•$ÄqÜNìv�sÉZ‹1–¢(É2W·+Ïrª²ª]<#nýŒa¶?¶­—H3™Ý8ÝŒ5h­ ƒ�ápÈÞÞ¼}ËÁÁûûŒÇë­«®©d¡К‡R kŒs@å9“É„““ŽŽŽx÷îgggÜÝÝñððàœQ¦ZX�õy¼Wž>g[1àkhûˆZ5ÁËó<猣%×[·o)¥ð=)'xEQë4Æ,‰­ßóÝC¾|ü®_;ŸéÏÑ«é¿(°Æ ^\^^2�¸»»c´¶Fœ$Nðr¿­[ç{+++Œ××Yߨ`|qIš¥ÜÝݵã¡{¨Vl¶ÒAAøMÁKAA„¿D#,<™ð­'ÿ�³Æ# £6~Î÷ýÖeÔFÏÕ“ÁÆ8¢( ÒtÎ|>'Ïsʪl…sò6�_]ë²­ã.5ûôïf2Ûórq~Áíí y+ií÷M§·¢×3Ï?~ͧ>É4â\š‘ENµÖ.õ¯n%¥m˜$I+<”eÙöÃï>~„p&¼ä³î#�e97··\]]quuÅêp•‘R„aX�‡ª=üµçDZ½Æc¶¶·¸ŸÞsyyIY–‹¾þÜx!‚ ‚ð›!‚— ‚ ‚ õ…,Aß÷ £�0 ‚—ZÊ=tnˆ:«ª*ò_^¦2mD�uv"šHÃ_Ûþ´ö‘èe‰@ml XkÃ�ÕÕ5vv¶ùÏþÃÛ·oÙÚÚb<‘ôz­ø£pÑã}¥µnEË<Ϲ½½åðð�wïÞqttÄÉÉ ···diFQ–è:šÍb]”ZgýT«,=]ïç·Ú~EËØv7[ÕqöÕŽ²’’L¹ÈË –¶©a󯁼ÎX„Ðsm™å™ë_Æü ƒ�ÏŠtÂoŒToˆ¢(rîïï˜L&\^\°¶ºJœÄ èÄŽªºO‡aH¿ßw‚×ÖõXª1Öt¢DAT/AA~gDðAAá‡Ð¸•”rµ»šºII’EÑÂ}ó¨v—ro£j\;u”a–e”U¹äÔ\´ß¢t /!ΰë¸jjý,Úu;èyaèÚt4Zcoo�ƒƒ^¿~ÍÁÁÃá�^íêêšßšåiÝú�²(È‹ÜÅ«]\òñìŒÞóçŸï8??çêêŠtž¶íoµn¯'b¶�7üáýª�Éo"mÝ_*(œ[&Ò¶Ïi¥PZ£êum\ˆJ)<ß# *�ë°( ÷ƶ‚â÷íH½„ÏuMZUišqÏåÕkkk¬®®RŒFu;ÖA[Çt†¡‹-]__g´¶Æ`0¨—“bŒqǻԋAá7G/AAA¾›FP±Æ¢´"ðâ$¦×ëÑëõˆ¢Ïó–\F­ ǽ“²,IÓ´}äy�µf¹6˜uF XÛˆD¿n»uëMµuµèÔÕ²¶�zôý€ �ÖØßßgŸ7¯_³¿¿Ïj=îû>(…©ß¿$.*…Ru´!�f“«+ÎÎÏxÿþ>|àüüœ‹‹ f³™ƒÔBŒ³Ö:7É'Äœ¿WäYö®XlëÞÊóŒù\;7aí"ô´Fkݺ·Ñ@k÷º HâĹ­« æ~·í¶>[›I¾ë€_Ô*¬ª’ÙlÆåå%ƒÁ€�ÍM6³¬·:ƒ+Ôbwãò¯¯3�)Š‚<Ï)Š¢?¾ìºAAxY¢Ë¿‹à%‚ ‚ Â�»ÈP =M$IBÇDQDK®…Æ5ÔLþš®»+Í(Š‚ª*—>öÿÕõBæu!ª+,=®Õåû>+++ ‡Cvwwùã�?xýú5û{ûlmo†!A´âØb¹µƒN5“ìU;I>¹špt|ÄÑÑïÞ½ãðð�»»;¦Ó)UUuv©[/c]˜a³ì´�+Ouûc(Ë’,Ëðuzž×ö·îûÑ+¢8¢¬JŠ¢ (r'˜…�ÖÖý@øî!²Ó—ìB°MÓ”ÉdÂ`0àîîŽÙlV»8kÁËZl} {u-¯ápÈx›·.®¦]Ô#—Њ^a„~Ѭ‚ïélg(|²_ØÅ¸g±EÁt:åúúšÉdÂõõ5AÐï÷QJ9y¹¾!kñ}Ÿ8ŽÛ8Ó‡‡&WÒ4íÜH DïAá7»u¢—ÁKAA„…ÖÏs±rq“$ aâi¥Õ± œXQ”ÎÙµˆ2ÌkÁ«Y:Av/MKp.¬ÅßÍ�‰ åœrAÀÚÚ››¼yû†?þøƒ½½ÝZì,-Ë>vv5'k1Ö2ŸÏ™N§œÔB×áá!‡‡‡\^^ºvÏ27Y^?×éj–ýý×£?À5U;e°�àU‘å™ëƒ¾×º ŸÛ–¦Z#x5ç4¬°¶žï¯_»}"z _CY–<<gžÎɲŒ²,ÑJ/½O}ÆÜÕà~¥‹1µlíjkðxž›ÐÞÚÚboo�·oßòæÍÖ××Y[[#Š"7Žsu51fÍr›C€¢,¹»»ãââ‚wïÞñçŸrzzÊùù9ÓéUUaLUï×Åzü z˲pjÉmNe*|ß§—ôƒ°�ÙlD¼¦ï*¾çC&®Å®Ú%f*ƒQæûD'ß,§¾Ãa&üZ}·ªJÒyÚ ^ÛÛÛdiJ­Kу©�s­I¯ÇÈÆëcFã·w·Ìf3ljOXA„ß¼AAAøjÀ./­µ«ÝU»e’8iÅ.­õ³oÖXв Í\Œá|>ïDZ �v¯n¬a·(1ËñxݺS¿@3b±mÝ-ß÷‰ý˜~¿ÏêÚ*ìïï³··ÇÎÎv[¯+Žc<Ï[L€³Øö…ãÉ�eÜÜÜpzzÊññqû¸¹¹a:�’ç…ÛŸ´ª·Ž�üùF 1©q£k „<Ï™Ígx¾‹Òô<ش™®EZ‹%Ë3‚4Àƒ±S™µ$ñ·R)Ê‚ûû{.//™\]q}sƒW»ƒ  j\œÖ¢êuQ³²²Âúú:···Üßß3ŸÏ¹»:ÖÆnÿ˜ ‚ /¼AAAøjºs¥ ‡—Âó= $I’ž‹“Ó^]ƒ¦S;©¡2yž·u»\í®¢€”ª#áž3Õ¢WóûÒ?ý"¢—µ¶u¸U¦"’^ÂÆæ¯^½bŸýý}vvvè÷ûôz½…Û£x‘’ g—‹H+™N§.¾ðä„?ÿü“>0™L¸¹¾!/rŒ1(hE3cAýRâÊ¢'6Â�µNô*ò‚Ùl†ÖšÀwuºtõØí�(\}¹À‰…iíª)Ë’²,Ÿˆ«‚ðwQ•Óû)W—W\^]1™LH’„~¿ßŠÙ�“SYÛ a�àussÃÅžç/ÜŒÍÍ�>ÜŽVý3¢—:‚ ‚ üÈà%‚ ‚ ·Qk �Èâû¾‹0Œ#¢(Z»`Õׯʲ$ÏrÒyJžå”e‰µ¦#Š=/hµ|f²ög½Üº¸FkÖi±n®VW†ŒÇc¶6·ØÝÛåõë×ììì°±±Áh4Â÷}ßGi½Ô>J�V S‹\Æf³\\\pttÄÉÉ GGÇ|üxÊÃÃéÓë÷ñ=cmír[¸¯ºb@QÜÜÜ0™LZG×éé)?~äöæ–Ù|FUUØ—jäøB_q®'®yAQø¾�Vz!Àª^„V ¿îÓI’´B¡©Œ¸a„¿wDµ ‹ëoÓ‡)—W—\]M¸¹¹¡×ëáy>¾ï×µ qñ„JÕµÿz¬‡lllp}}ÍÃ|ÆíÍ ¶wkAWº° ‚ ¿"x ‚ ‚ ‚ðM¨ZÄjjwÅqLÇ„á"ÎÐMÌvjÆÔޝ²v$¥iJžçm­¤öuç¬ì?,z¹È=Ú‰f?ðé÷û¬�×yõê•‹1|ýšƒƒVVVˆâÏóšsî ëÖ¶+t55ЦÓ)œóîý{Þ½{Çåå%דk²<ël¶zyÆŽ¯F];9—W–gmÌ¡òÕRˆc³¥5žï·‚Wã+ËÒ}žÅ@ø;û´Çg³“É„É䊛ëk†Ã!½^¯;Œµø¾�ÖšÁpÈæÆ&×7×\N®Ð�˶¯QXåDt鯂 ‚ ¼dDðAAá/A+vAÐ:`!Ð4µgŒ1mÄ\#xUÕrVÜ?"(tD¯çD�‰5.n/úaŸµµ5vvvØÝÝeŸÝÝ]F£ý~Ÿ Ðz©âÎ’³  *K*c˜=ë�]÷Ù^’0^±u»ÅÙÙ9çý ²,£( 'Öj…j*z)'z¹ñÖþÐMAAø·ÁKAA„o ²š8­$Yrwc°Ö¶b‚R ­4…)\Ý®tgؼþQ÷Œz*¶üίfyQ±:\eoo�ÿùŸÿáÕ«Wloo³±¾¾ k±«[£çqÛEA–çL®¯9<<äèèˆ>pttÄô~Êôák Zi´§Û}ñ³òw r�£Ðb™Ïçm[‡�ë«Ý.РJ+üÀ'"¢( ¢0"Ïs¬-è”A„N#xWeEJÊÝÝ———¬­­±¹±Á ,]ÝD7@´ïQJ' £Ñ˜ÍÍ)£Ñˆ•••ºÆ_Q;ºÔQžŠZŒ·‹ÞÿcÎ ‚ ‚ ÿ>"x ‚ ‚ ÂoÀ�еkjwu£ ?pM[Ø^­3ɸh¸4MI3eXå"[Ëþ ôC×CkM¿ß§×ë±¹¹ÉÎÎ{{{¼zõŠ­­-SÖï/ [�ÝqÍ*åYF–eÜÞÞ2™L8;;këu]^^r{{ëIJ¬çµU»)_µß¿s»æúVÆZ¨*òs¢WEhO£µ~äª[8½šútq;— ´âó"¢I~Ð8 ˜Ê0›Ï˜\M˜Œ'LXÍ2×w}¿íƒÆ´vµWú}F£ëëëlll`­!MSŒ1Ôw w—²õqû}.¯f}í£#AAáßB/AAAxáüÈNJ©¶ÆQÇDQ„ç{`�¸Ðˆžvµ¼lý\žçÌç)óù¼Žˆ+Ûuû)“¼ žç±¶ºÆÖöoÞ¼áíÛ·loo3�¬¬à^]gdz$v5® k-¦ªHÓ9·7·óþý{Ž��9==åúúšçúúcÝë–âjÑ˶G‹úÂydñ³qD¶nÞ¯Z‚ ‚ Âß�^‚ ‚ ‚ðÂy\¯ê¯ ”B)Mà;‡L’$DQDà»ÚS�;fésëH¹¦vW–:wWUUíìhà×®é¿ÞVÖ.¹®ºÛ߬b;El?›ºPaÒëõ ìïïsppÀÁÁûûû¬­­‘$‰«%õ¤mÕ“v˲ŒÙÜ�Ÿsxxȇ8??çúúšÙlV·ÞòTô³íhŸï/™V~²PUy^�¦®žWSÃKêÉþoöIãd¬j‡X‘."®´�¶“)~áGôU'v)µ8Tó<çîîŽëëk&“kF£1žçGÝ4BSgmAH/é1�ØÜÜäúæ†(Š0Ö´7$`‘Ë8——µ˜'N/ŧî‘PÌÒZ«Ï]ê³ãÏ=ÐAAjDðAA„߀O 9_‹Rš ð‰¢ˆ^¯G¯×kÝ]ZišiÔF¼±n†ue8OIÓ”"/–×¥»Jö_r{Õ"VWÀz5¨”v“ÑÆ {�ȘÚT‹�ÃÕ!{{{Kb×h4b8:¡K©Ö™Ñ|‚VMܘÂCUU¤iÊååç~øÀûZ躼¼äáá�¢(ÚÏUºqZÔ)‘�µûòÅ­Ïô\P8—KU‘e)ÓéÔµ»Öm´a×íÕî­ ðu(y�ÅR••ØY„¿±Çºq0Ï�sóúúšóósV‡Câ8feeÅõ]åÄ&kê1JkÂ0bu¸ÆÖæ6ççÄqL^8¡¶2[;•RµÃË=‡­ëý)7Öw¯viú|=”«Ðè:ÎöÑ€Ú¾P¡ì?0~˱(‚ B�^‚ ‚ ‚ð»ð'é ÏsoQìjw%qBhåj u�1ÍßUe8'MçäENY•íÄê3ôÏ›¼±ëSÿl] ˜{¨…+¢ž ö<çìê÷û¬®®²µµÅÛ·oyóæ »»»loo“$®­Ê²\ÄèÕ"—b™g³ùœÛÛ[NNN8>>æÃ‡~8äæö–‡‡)eY.„EÕqÖY–Ä-e›¨±ß7f¯5æYëjÉåóÙÜ9eâ¸vÛ©6²»_tSË+‰¢ˆ<.¨Œs{5§›Í—Ùvá{‡¡Z°nâ­+Ê¢äîîŽËËKFkk¬�FŒF#‚ À«ëÏÙf`W¸Z^++ŒÆ#V×V VÈòŒ¼Ì©LÙÖíRªn †j!|щV\øÎkÖÞи»<”Õîuuý;ÕªV¢žú‹Õ}õ-C¸Ђ ‚ ´ßùEðAAᙫ…Úé¤�àû¾ºêÚ]aè¢ á J7î!×DÎf3Ò,£*«öµŸæß©ƒ´˜Ò]ÌœÚz&µÑ§šz[Í I’VèÚßßgww—ÝÝ]v¶·Y ˆã¸­ÕÕu޵?Ý”µîææ†³³3Î>žq||ÌÉé 777ÜÝß‘çY» UÏX7Ë}~J=©®kŒ¥¬Jò"'Ïr²,Ã| $PA½?¯§®§æù^]·.¦ªJmXTUõDè„¿<äZ‹ê¸M­qÂúl6ãêêŠÕá*›[[lnn £¨éäXêÈBQ2 X­1Þ3ËçLç÷T¶D{ t-Øc0Öàþ+kÑ«Î,T]‡W}TX7(*[ÇZ�Â9ÍTíôÒµ¦Ð¨ö?Pèf°{4Â/`êÙQYAá+¯]ë_EðAAá™k÷ŸVO{AÐ ^Qá׎%cLë*ÒV·ïo¯4M™ÍfdYFeªOŠ3?ªž�íþÝ»ºxž‡çy¬­®±»·Ëëׯyûö-{{{¬¯¯³¶ºŠö|øÀéé)ççç”eIUUí2œ‹¢#ÌtWM‰øòÌžk±ÖP–%™Ÿ‘¥YëRô<¯}érŸXÔò²ÖR%y–c¬¡2U-H ?pÜíˆ]ÆÒ4e2™0 ¸¹¹aúð€ÖÎq«”n³�àD!ýAŸÕµ!ã�17÷7\\+l^�n¯ c*¬vr—µVU ·«ê<¬j\m~ q¶W�®+Dê:ÚV¡¬êˆ]zéw–D0�UÏÅJ�Ÿ“eYë†Á.êÓüDºܵ˜_u!cºX·GE ‡CVWW988àõë×ììì°¹¹ÉÚÚq·Yz�HõläcU1›Í˜N§\\\pvvÆéé)GGG\\\pOQnfùýªSc§qzµ‹‹ß¦¶Y#$Ôíž9i–â>žçµ}º�Šì¸ñ´Òm$eQd¹o˲¤²Uý9M'„¿ÚWë>dãR3ÎÎf3nnn¸ººâòò­aáy•±Î]«Ý@¬=Eù¬¬öo�¸º_…ÌKj'W‰Õå”v˜«QèܼZ«úÉÅMʪÖáå~º¸BkÃâ§S™Z°sÏ5ïWV£”^H`J£jm…¸4¨±°–5už†#º§åØA„ß÷KÔòw¼AAAxJ=áêû>aGNì ÃÏóê ËåºGX7ÙY”åBðJ3м 2†¦4Œ‹Äúy&(Ÿ‘L¹u5Æ¢•"ú½>;Û;ìíïñÇÛ·¼ýãÖ×Ç$IÏÕ„ª­aƘ¥ø.Õù¬ªª(òœÛÛ.Î/øpxÈ»wï8==åââ’éô¾hp.ê‘‹«;1,<{ lmÛ–�Ù¸}Ï'÷ð}Tíôêöm¥�vžyžÇñÂéÕˆ¾"v ßÕGë>d£OSWÎZ˼®ëwyuÅøò‚8I®®:³Uí²õ”FiÀ?òè{Œ7G 'âA„ŸiŠ2ÃØå�öÚsß÷ð<çfÔ¾F{º¯—/'j¹Ÿ¶¸,Ue0¥¡, Ué¦2ØÊ½Æ…êÚ¦k±K·Î0êxDÛ-H¨4K Õ3•ÀìbåA„ß÷ºµû5@/AAAÚXÂFPÑZ×±YµØ.œ]À¢v ÆÔ‘qY–‘¦)óùœ¼Èë×ujc}iE–®^ž{þÑÓê3W<Ýíz¼ÈO.£~ÚºX1­5QÒëõ�Çlll°¿¿ÏÞÞÛÛÛŒÇcúý>žç·†‹yXäEíªj÷Ûýý=·7·œœžprrÂéé)'''Ü\ß0›=P%ªv=7—û\4¤{N!‰†Ý6Yô�nd¥1†<Ï™{s‚0¨ãá¡ö}Á.âQœóE!IœPy‘´Q�?s\§ðsÓÆ§ªåÑN)…±†¢(x˜Ï˜\_qvö‘Á`…Ñú*±J\ßTPÕb”ÅP‘ãEÐD G}Æ›C¬—QT1†/Ðø�Bû Ï÷ð|…ïi´ïáùºu;vënÑusÕ‚—»ÉÁ¶"W‘•äyA‘—”eIYT”yEUTNüªÀVu„¢Q`5Æ6B˜ÇâÖýÌÀ¬Û1^uî+Î*‚ ‚ ü>ˆà%‚ ‚ ¿;Ö‰UVY4n²Ó÷}¢:Î0ŒB'x©EM* �€S(*ëbÞšº]óùÜÕLjb-_íìzR‡êWX+¸ÙÎĬ꼶³]­ÞeÕqË6ui”]úwc UU†!q³>óæí[Þ¼yÃÎÎÛÛÛôû}’$Á÷<,ιÕ]¥œP¢=ÏM—%Ó锳�9>9áÇ~8dr=áîîŽ,˱µÈ†RõDx³]´ÛõdÚGÙ‹BÝL¶�Òlûa™ç9J©%ç¢ïûxÖ«Í#�~^¿Ï|â$¦( ò¼p“þåb¿‹è%üUš(Íîí¶îSÖTÌS'x%ý„ñ戭Ù:€0 0Za1Xk0¶¢ G†¨ï3%¬o¯â%•ÉA‚È#�¸åùÚ¹»|7Ny¾Fi½ä$m¯ŽÃ«‡ Nì**ò4'KsòÌYš“ÎR²yF‘•™Áª¢Âà0¬F+Ϲ¾T#xuj~Y˜Ú¦ê[êj`ÖŠÜ%‚ B‹^‚ ß7‹ò^K“ ‚ ß{겟|ês[Uèû>Qµµ»Â0Ä÷¼6⯩qÔ֤¹—gWS»ëq «¯9á©O�mÇêd¿m»,¶^÷G¾±ÚÔ.¹óA�$ k«kloo³»·Ë›×o8xuÀh4buu• Z×Ƹå+…V‹º4eUQå9³‡&××\^^rttÄññ1?~äãÙGf³Y–a*ƒÒM»Z¬m•®/‹…íÆ‰èµ´+ÕrÏj„cŽÄ ð}¿uzéÖMÂ’Kй¢("Ib'0Ìëø6™v¾ñÂáùÒoµTÛš;-FŠ2çvzKxp~9b}²†ñ ^_y”¦ ªJJS�WóbNÁ ?¶ G :`LºÂ=¼@£=Ðzm¨<�ÖÊ ^î`A±,xuS�2¬0UíðÊò, ,JŠ¢¢È ²yBÞˆ`iá~Ÿ»¿‹¼¢, ¶*1UhWï —Í¨”nkѺ¾:ã5ËXõÙÖ·rq%‚ ¿"x ‚ ü• ”a>ÃÊÜ• ‚ð#Î'�Ä¡n}#jQHiM†$IB’$­à¥kÁ«¡‰½²ÆR™Š¢(˜Íf<<<�ç9UU-„.ûé{E—ãs¯ûDý/·]ËS¡KÿÆÂ©ÐÍlsÓn’w!Î Æã1ûü¿ÿü?ØØØ`4†a+Ž´ÎŒzrØ«] Ùlæ\]gg¼ÿ¾º...–�p¸è¼%ɯS¿KøKßÚøTL¦µS²,CkÝÖóR(T°,æ6}BkÝŠÁMÿnœ{Tn™Ëµà¾oÕ�³å¯ëÂÏÓ ±–çvçã½dºUÿjµI£0TLî@—¬�¯0ÇX?EGÖ'/3ò"#/S²"%+2Ò<¥Òsúk>~¿‡±– ´Ei‹UÖ]Ø(‹R”Á¨Nÿ­Ç4Ý9”–6Á:÷•Òàû E�X¸xÅÊb*‹) yVR¤ó‡9³úñp?g>ËÈçN 3 ­Zy€WKÐÎéå„1ߨº7­zt„w[׊è%‚ ¿ "x ‚ |ûìÁ¿vy$¢— ‚ð=§/õ‰sZ÷¥¾çqEQë~i¢ T§R·vWš¦EÙÆÁ}yå~Œ@Ј^Ÿ*ýå&FUb ]÷™ÂS®žM„AÈÖöûûû¼~ýšÿùÏØÙÙ¥¿Ò§×ëµH×¹Ö8½á¬(Jò<çúúš‹‹ ŽŽŽøïÿËññ1“‰‹0lpí:ªeAæ›PO~ùíéÖízަ>’Vš4L ³°Ž Ô çÞÒò^çø(Ë’ù|ŽçyXc]ŸêÖŒûî ø¾ï«ÂO2úZËóÕ¦–e˜æ/[UmÀ¡2*Š|N5M™Üžs1é“ ÉPŸ´˜“�Ø•’W9eUP‘ãÇjŒõp‰„« ‹kÚOXDÂ6ã‘Q Õ¹kÁ¶ã¿sx57#xø¸Ú\Χå[Ö*ʼ¢ÈJÒYHo2»ˆŸ‡{ŸÙ4eþ�Qä%E^a�¾T-ø7£¶FaÑî¢È¥Ð¶kÜŽ�öqµÈÇ¢×gÏŠ‚ ‚ üâˆà%‚ð-sÿòäA'båÚLAøJl'3Ë65®š£ëð²h¥ñ<Ÿ0 ]œaø^íìjî¤×j!XcÉ‹üQ”a‰1Õ7žà¾m[>…±fY”«Sn2Tµqƒf±ýZ+üÀ§×ë±±±ÁæÆ{ûûìï³µ½ÅÆúý~�À÷±Ö´+­SÇ;v’²(¸¹¹a2™p||ÌÑѧ§§œ��qssCš¦Nüaß-'“|Iø¶ãù¼ŠÒ‰“išâiWË«�ؼ¶ù½qzA@†m|'ÕO²a ½~Ê÷øuªM7z³­) k°TX*J“c+Í,»ãn6ázßiÂÜ'ÍçeFirJ[PšŠÊVT¦ÄØ’Š CU ]U+xY.Ò¥k Õ¶wìãa{!v-Œ�uœ«­Å©fÃ|ð$^@)â^HoÐc>˘MSîç̦s¦s²´$Ï*ªÊ ¬�¶¥Sn#‚éZPkÚÍv~ïž+¬‚ ‚ð!‚— ·\ òïM#=W¨ ‚ |å ¬ý]-b �U”V�O9Á+ŒBüÀo£ ÝùH9ÁKáê¶t¢ Á«,‹¿i3>캮ºëëŒ]�xñè¼®Üöa@¿ßg4ñêÕ+Þ¼~ÍþÁ{{{¬®®…!~8�ÌX”n C)”]¸ã¬µäu½®óósŽ��y÷îþù'———<<<�eÙ·»·¾ô=Aý›ßR~á£Ãº8NJȲ ß÷ñ}w 4ý^=ÊÙTJáiëÛV.Š‚²,Ÿ¼VºCØó‘†µèUßÙÖˆ\Î�Z;±T…Uè ëJRÒâžé<ævêá—Y>§¬rŒ*1í¶Ëj7—jÜ\ÕBìRö³×Í��V§ É�‡ÕŒ»èŽXV×ó#<5–fr?Š"â$&Š#Â0Äó¼O¾·2EY´‚W–f”uí®çœ1ŸÂÚ娬O¾»ìŒRO+%=ÿ™µ³­6*SÕñ�q3�ÙÝÝå?ÿùoß¾e}}�µµ5â(Âïˆ]ö™íjþ®ªŠ4M¹¾¾æÃ‡CÞ½{Çññ1'''<<<�ç9UU¡PxžvËSMN±ˆ"ÿ&M¿(Ê2ˆÂˆ,Ïð|ßs‚ïã=¤•›´ojyU•s:6‚oUUXeëX7Ù¿B#Á¨Gž[7¦5¢—¦J,•Œ´E{à…Š¸ï³60m YYKM¥ *[QØŒRкZM¹ŸF5ÏPæ›zæs"×ÇÚãúYJÕu]Ä!ªr‚ÚÕ:TßׄqLbÉJÂpµ"éÇIÈíõ=JO1dTyI™[Àë¥@YÓ¸É,íÏåóBÓÚ�0&S‚ ‚ðRÁKAA~3šZXM].O{x�ØÇ$IB8±«��jßk1U…1vIè*ŠÒMò×ÑS_^‰Îïê9ërs7¾íüÅç)?ØÄ*­ðµÏÊÊ «««lnn²··Çîî.ûûûlmmÑï÷I’¤­],ýì>ò<'Ë2noo¹¸¸àãÇ�r||Ìõõ5÷÷÷äymšII&üSÇD-†–UÛ¯Øó½gº¯Ûo�32ŽbŠÜ ^Y–QUÕÒëžöyióß¾Ï=£¬«±ejÁË´suõBúƒˆ•a�µñ€áh…þJLÔ÷Q�¥"ÇØŠJ•®FæQ\¡í|^ãë2Ÿ�UUK£î'‡îçÞgë!Ý}šmGòæ|c0µìgQÊE¢ÊóðëŸ}›€¶ø�O…$½÷)óiN™YŒ-1Ö…&šºž—R®¦õÒÕ“CM}Ý�‚ ‚ üÒˆà%‚ ‚ ¿]—hogÇ1q»Ú]J·Ñl°ˆG¬Œ¡( Ò4e>›“feéê¬4¯ûœèõx¢µqÁ4õ¶@µó’­CF5õ¸êéÓF,² Q¡]nÇŠ`;ë„uÛêû>ãñ˜W¯^¹z]oÞ°½½Í`0 ßëá51võ2[?@í„kþ \ݧëëkŽ��ùïÿËáá!——\M®ÚºN�ØÕÖk¢î>• &ü£4b¦µ–ªªÈòý0sÀØE{v�}Ýþ«”" B°�9y‘»XC»ìF|®ÏË~ÿ�G`˲©Ž1´†t…DÄý€ÕQŸñÆ*«£ƒÕýaŒj¼¬®¨T…±%%•«ù…iks-¤®ºŽØÒsŸ�¯ì¢n×_Ú¾vìm„®f SX¥Ýß¶BYƒ“¼,ZUài´RÄ+^¸B”Dôû ýþŒ«àË=©ÊÉM‰­À]§'zhp1‰tb;q¾V‰³KA~DðAA„ߥœ»Ë÷â8"I¢("eøLÚžµ–²,)ò:Ê0�“çUUb­YÔÌú I}Ïù¼ì#qnù®}W§ë h°6þкzK™¯ST IDAT¾ï!+ƒƒA+tíïï³»»Ëh4" |ß_r¨Ec-m–e¤iÊùù9§§§ñîÝ;>~üÈýý=õûÕ² giëõ,>C&a , UU’å9Aš’e¾ï·�æ¸i­ºy¾·¨åU”äy¾TÏ‹gúµì÷—Õw¾~wÖqƒÖÖµºJc¨ ÐA  "Ÿ•a�áÚ€µñ £õ!ƒa�¨ÄÊ3Xm0”ÎíD…Uµ»«ù KµÃè ÉÎýÅ'Wzá®ýLîg·°Î6´ËÕ´œÓÖy²”ªë|µ~´ºî£Öè@j�Ö!¾ïáVY´VLƒjF‘ZL^RV]»ÚÜGÖÂV•kÅÙ%‚ ¿"x ‚ ‚ Âo„ê¨F‹º]!ý^Ÿ^¯G†h­?YËZKU–dyF–:Ñg)²O-”®OÕ.z2Ñÿä£,¶SÛê¹ä­Vøê8¿Úw‹±kÁZƒVš(ЇìïïsppÀÁÁûûûŒÇcúý>Q=�-¬× ùÝÔÛžfW——œ_\ðáý{þ|÷Žóósnnnxxx (Š…›ëQ¤�Ôsúù� c e]›®.{½¾ï·îÅn=9W—Í ^ÖZç~ÌRw¬PÕI©ÕöbûNc,ý„>d»cS㫲nŒªTEe V—hßÒ& Vû¬�‡¬­¯2XíÑ[‰cåY*Rws�5ÎÍ¥ªN].Û­Üõ©ÎþEÚMùæLÃÅGØf€fÑ>�c… TÍ"«zýS;yµB‡šÈ÷ñ�ç{$IÂu|‹§5ÓÛ9eFUZ<|À§jj†á¡Ð®f—R_¿á‚ ‚ üòˆà%‚ ‚ ¿Íä¾çyø�O†ÄIeXOê/½¾ãh1•!¯ã Ó,m�,Ƙ¥×Û¸±¾ð*x]Ø<¯–kÌ(–Ü]�³À÷5ž’$ ãñ˜Í�MÞ¼}Û7oØÙÙass“^¯‡çyh­±Æ,R»¢—1”ÆPä9Ó‡îîî8>>æèèˆï?ðþý{nnoÚïØË1ŽÂOq<´=Ï8¡ª‰íô<�01‘Yv>v¥A�¦i+~-œ`‹jtÈ~�}¨;juú’Z÷\­.ƒ±U§nW ^…A”ø ×zŒ6†ŒÖ‡¬Ž$ý� òÐ>Tut¡¥¼°  `1jShŸ]›Î:~…ãÉ~vüúª£j©u®2[ѶÇ[;ø¢Ð Ú��ïx¾ïŽ1kÛ±º(KrJlYQÐhL-z9™~²6‚ ‚ ¼lDðAA„ß ¥]-ª¦nWE„aHàKõ©š‰ú&†¯ª*ò"'�§Ìf3²,£,5ªÚå³ìhxŒ+íR‹^Ÿš‡l®Nüßâ3ºŽM35kŒi…7…"ŽF£°··ÇÖÖ››› ¢(Zv³)µX¯f[”¢¬*f³7··œžžrzrê~~ERPUª®ãödwÖñ Ö·DQD¯×k�c,h»TOHÜ^/¥³|Ý‹šQ¬²•¼¨œè¥œ³Ë�`°š0XKo¬2ÚX£?Hˆû>^V—Tʶñ‡`kwW-©…ÔÕ<÷œ£´»ì·e0>Ý¢NþâR:7'<ÖÙLCèV«V©4µƒMÕÒXZá…Šˆ€AÙGi�ö|š©?#}È(³ £*®ž¶N3´šÇ¯%€½!MœÇ‚ ÂKB/AAAø�PN”ñ=ÿ‰àå wWW°±Ø:æ­lëvÍçsçîªÊN”á#·Ì3sh�ck1õÿ‰èÄúÅOÄ.»X§:ÿ p4cÜÃ÷�#guu•½Ý=^ðÇpppÀp8deeßó.®GWGX»sf³“É„�Ïøïÿý—?ÿü“‹‹ .//É󜪪°Ö¢•^zÿ×ì áç£,«ª"Ïs<Ï#ÏsŠ¢p‚—ÒÏî?­5¾ò‰¢¨uûåyŽ© •©}ˆ’Iæ2ž~~7.„(Sÿ߉]®îÚ ˆ�ÁZÂÆÖ�ÑÆ�µñ€ öñB žéÔ誀:ʰ‰lÄ.µfh•]Z7«��÷¶³<Ê?ÊH´�è[ÕøÛ›w¤Â`ÐÚài­= ~¢” Z+¬5“�Y¸ç ­ªpº#Ðý@±ë…ŒáJÆ#Aá×þò¾„^‚ ¿ê`.“d‚ 3êë¾Qÿ‚hO·Q†�àåûþ²s¥ÞLW ˶ñnóùœ,Ë(rçxÚºF�›ì¹ ´ÚDõ´�íçë]9! ”nnÛ_¼ÔS×QÒDaÈÚÚãñ˜ÝÝ^¿yÃîî.›››ŒF#¢0¬céT[KG?¨œxf˜ÍfL§S./.8:>æää„““>~üÈl6[»°Î­Ð¼_øUŽòOOZ»zu‹hÃ&²PkÝŠ›mÿïüîû>qS®˜1[ØúxQmœ›Ì/¿�¯åµð³”º#`dXÿ¬°ºj_DQßg0Šoo®²2ìõ<”oÁ+0ª¼¨ê@ 4q† ·ë²ØåþgÕó•ý¾sYw·_<ÂêµRÍ;ëu¶Ýš¶´‹—)êv3X*Œ´Eš¨0¨únÜ÷ý:þð�"5”i‰5º]¾”õ�ÙÒ'ÊåT·O¨¯Ü÷2p ‚ ?ð{TíJÿžRŸ›DðAøE/JA„¿y }nòGu£ô~Õ-SxžG®vW/ ^�ØÓ^@ÔN—®à•¦)yQ,Å¢T-f=Ž|fÔ£ÉÆŽ¸õ9­H+Ufé¼§Ž[DAà$½„Í­MÞ¼yÃëׯyûö-›››$IBEÍFµb¸]tD SU”eÉíí-?~äðð�ÿýßÿåøø˜ëëkîïîuú[Æ.êrɹú—8>·ŸŒ±X[¢rE𦸾ß;xËBW×åèûÎå•ç9QQUUý0‹H7™3~Qy�zRë¥}m; ê~j­‰ƒ˜8ŽÙØØhëu½zõŠ�ím666¬¬àÕbE#èµ÷úwD‹ª#tÝÞÜpzú‘£ã#çì:>áêêŠù|NY•ÎåÓ©ÿeë \©ËõÂ.½-T•!Ïsæó9�!„à{þ£IûE,›ïûDaD’$­`\–¥|±{ѽ¥ ئNV[O«rQ†õÃ÷}Â8`e5fm½Çêz�d%ÂÊ7Xm©(1ª¨Å²&¾°þ,µèDK2’úa[ò7µ�ýô±VŸ~U}Ü)Õ|àðð�ÃÃC®®®¸¿¿'MS�غGƒÉyúe�ÖbLEžå.4ŽÐžÆó\LÚc�W)ç¢ Ã�Ä$”eé\‘Yޱv©6�ð²úÊb4°�Ê9°¬­¨lIEIxôVþ?{oö#ǵ­ùýÖÞ1åPUœDФÈstnOžúÞî¶�k»á†� Ãèÿ§~õƒ�~²áv·íÐhÜ{$QI‰Ôɪœ"ö^~Ø;"#³²ŠÅA)­‘¬¬"cÜQ¹¾ø¾Uqr}Êõ›Çœ\ŸPMê;bŽ[ tttƒØ5héý²;þ¼ÿ±¾Ë@~ðl´ò¨‡>/©[²÷6U݆5JÈU1ÉXˆ÷xq4ÓŠ£8GÚ͆ÕrEˆÝ„ôzñ ‚Æ/xã¯ÉÙñŸK;ý5 Ã0 ã—Ã/Ã0Œ·üÞösÿ)ob—aÆÏ=ÞëÞ Ì±ô^Î%ïëü�g§‡„ݘµþQ—�]UUÑÔÙÙU–E±ãîúqå÷wa+tm6Úe¨û îž'_·ÆjÉö„'";ñoc÷Œ ”UI3i8::â“O>áÎ�;CŒáÍ›7¹vrBÝ4I”Ió|A¯®®ëX.—¼xñ‚çÏŸóå—_òÅ_ðôéS¾ûî;NOÏèºÔ³¬�±,›îWÏȱ؅i…õzÍr¹D­CýëÆÑ†}lhS7t]GÛ¶´m»{$Èû"ö|’V|þiw�s¿é¸_•(HrgÅØé( ˜ÌKޝO9¹>c~2¡™Wu‰Ò÷ì’P6rFéÞž¡{ßK4Ëò†K°ûŒ¾ç5%\,¤éùÏì/0”þјC c~2¤õಸ\ ­ˆaÊj9g³iQ k±U4R—G—â$Õí¬#Õý~^W\~û^¶»ú¿AÌýe†aü˜àe†ñ6_Ý~‰ö-ö¥Ê0 ãçéÏ ¼2<þ~&ÿ>¢§v®îïQzKxïiš†ÉdÂd:úvm§5”FQ×¶,—K–Ëåg8îWtn%½®é°ì½øÜýô›s²â†ÅLŸë¼c~4çÎ�;|úé§ûŒ[·nqãÆ�ÁÕÕ¿¿_¾‡Wžîf½æåË—<{þœ¯¾úН¾úŠÇ�óøñcg Ö› !¤(:çÜvÙì¼ü›ú^vëõ'npJzïÓ~á¶ûZ/b9飯гùŒ¨‘³³3ÚM»-Ëùãå]v­�#©�ؼtÑôÀ4䵯1Ο1’‹kÔ‹PR©H ÓŽ -e娦G×&Üü䈓›s¦GUãÀ§(Cr¿®8ô Òm„¡Œ·òù³Òûpx½ÿ¯9[ÑK¤�°åܘ?øÔto et“ˆ"(a×Å{ªÚü!Ü<ήKج7¬�Øv¤—;P‡Û—…Çç2Õ Î_ºëd;\6�Ç?ŒŸf7ûy�AÛ� ããÂ/Ã0Œw©(†a¿bv‹qò¾§üÞ“5—ä\ÕÛ¹äF©ëÔS¨®kªª*ç"ÙrL[×ulÚ–õjÜ»+.²�÷ÉÕÏ‘[Ú¶º-Þn]fÉ¡’zº8çpÞ¥eh&|rû›3�Mqc¡Œó=ÅbŒƒÓæÅ‹|÷Ýw<~ü˜¿ùë¿á‹/¿à‡~àOú‘N’˜1Ī>~SëõÛ[“¼Ù¤hòJ± Þ{¤ )Ƈ!À°Ï$—×d ê×Äó>š�Û5ïùo±›éùÃÿ*CÜÅçÚ®~¥³„³èEŠdEQ�èз«C]¤l fG G'Ž®M˜ÕT�×�]r„©F¢Äìð9\·£ä…ÛF^·ÍäâØÂŸnsÇÝ�QtÇ�¬#1l_ÁëC2ô-‹DMž/D®tTê™OQ…ÕzÍb±DuÅ*¶h ¨†o¨8Ø;WŽ@½ôkßßì{²9¾Œ÷¿{ýÌÇ¡í¾†ñÑa‚—a†a†a\öÅúþ¢›ŒJ½h´-…ްïÊp¼�o/²Àvü÷8ž˜ãËøØ÷aÛm ããÂ/Ã0 Ã0 øè;®~øsË^3¬}7“s_$Á«®ë¡wר±4~oÛä¢þjµb5^œ`o]Ð�eH¨Ԙ—ÃIšÿù|εk×xðÙgüþ÷¿çÞ½{|úé§œ\»FQ;½ÈPEœÛû8%ª²ÙlX.—<{öŒG�ñÕW_ ýºÎNÏX,ÉM–�]ý š»ë×ÉUD¯¼³§˜¹ì\¯×Ã~WUe‘"4õòòÞцëuM½©S�¦Þå5ê�';JÃO\e»hòï_ñøï?£ë „”š—…ú �N[T:\©”•g:o8¹>gv<¥žx\ ¸_¨ý­wˆíôÛóßbÛ¼FìzÝnñnãüE1Áùžè…»¡¦†^£G÷Ýb¹G—ƒ².p®æèdJÛ¶tmÇòlE×nÐ!"Šh÷#?ut^3#×{k†¿«Ìñe†aü´˜àe†a†aüÆ9\�;_럗KÞµ‡xÕ{êßµ??;Ïäºs޲(Fº±c©ŸÝ‘j½^³X,X­Ö´í†R?™WXåö•—g[Ðßïá2\¬?êµU%óùœã“cî޽˽{÷ÒÏ»w¹~ãGó9UUíºpDvÖ�ˆC`³Ù°X.yþü9Ïž=ã›o¾áÑ£G|÷Ýw<ö<õVêÚ‘“+m¾ÞÑ¥Výüm�¹·OÔä8ìE¯ªªhÛ–ª,qÞãp{=‡Æ.¯ŠIŽ6TUÚ®EÃVdÖÁáµÝŸU†\Å�ñêðþØ»‚äJÇb¸ì‹äƒˆ ¼W\‹ƒi蹕]Zªq‘º)™O˜Ï9:ž3™ÖU�ó .¢SÌßp ‚Œ¦ÔoÙ6µïo46é•—KßÛÒ«¬Ä×ÌÞè:Ä!jî“–ï:‡ÃQÏ*Žº9ëuËr±BÖ %Ä@jèQ—Þ;ºøã½§ ç¶·9¾ Ã0ŒŸ¼ Ã0 Ã0 ƒÝž&;»¶|ã¶zákõü{姘o‚¢ú(@'çEYÐ4 MÓ ‚×øícwIïLè#Û’àµÅö½»ÞfyFîvã5«Kûq�eYríú5îÝ»Çþð>ÿüs>ùän\¿N3™à²‹+EUmÅ‘]—Xˆ�ÅrÉŸþô'=zÄ_|Á×_Í7_Ë—/R¼\ˆÞùA6ÐÁÑ¥DµÞ-6JlÅ©®ë’àU&Á« �Bñ#1BÒQéÄ�‡ª¬h& !nccŒÉ9)#[w¼/i¼Ånãî�ov,jŽR<$zo¶>óH‘Iä^硚”Ì�&Ì�gÌ�gÔÓ_�øìè\]qçü¢‡.jÐÝ‹Þ|ûЫòÒEÑñË$n›~‰5 .EõÖ“˜²^­YœNiÛH×­ ]Dcê«æ†s�l{éaÃü϶�G½ì�?†a†ñ.˜àe†a†aWæÃíìѨS¤ˆ“¥V¦ÞW“É„ª¬pÎ ÂV¿0ý{C Cä_ß»«w£ K¯o»täPØ�NŒ!‰tÎá¼c2™p||ÌÍ7¹ÿÙ}îßO·»wïr4ŸÓL&> SãB™À°|:Š/|õêß}÷OŸ>å믿æë¯¿æÙ³g¼xù‚Õjun'ma¸cçö�J×6í†Õj…÷MS‚ë~¦ˆà¼£,Kš¦a½^³^¯ó»Écèm¤>TF‚»î Î(W´«Š'í…í‹zýìnÝŠV*x„ª.˜Ï§œ\?bv4¡žT•€ DIâ‹jÌB¦ìÆ$úœƒù×ÍøRUúz¥ç"@ Ò!¢H!”µg2«™_›Ñ¶�Í:Ðm6h‰¡9‚圈(6îÿ¼‡�˜èe†a¼?Lð2 Ã0 Ã0Œ+ñÓ\û½‘vSÞ2F/ÙE’àUVåàð*Ê'Ž a·U.ŠÇGQ†+6›Íà|OûmÑ�lÀ­@c$„@Y–EÁÉÉ >äÁƒ0ÁË0 Ã0 Ã0ö‰Ûn:2ô‡:Ð5ëÀorѤÏý~‘¸"º�/ã5S;>œ¤Â{]oc “P䶥¡_Pzo�¶K}‰Æb׸Ö~äà›¬Pé{ϰ+Tƒëåèèˆk×®q÷î]>ÿüsîß¿Ï�;w¸yófŠd¬*‹]{ŸÒ÷[.—, ¾ÿþû]øÍ7|óÍ7<~ü˜W¯^qvzFˆ!AJš·�m0r͈…»ã=yÔã Õ!š°�íEÛCÑ B—}_½†Ó>Ûi7:¶.+º÷¥ÿQ¯¹ñ¨¢¯{öeLF¯�AÃ~¯ˆð� @[‰k;†ªÄ,`Å™W@ÓTÌæÓm”aS"žaò{öºuÉ»®nýxVä,Q÷vT!ŽÖ™€vÃEå˜L+¦³†fZ±:Û°жŧõ¯2 3Ô Ö¡|ôëðc_Mô2 Ã0Þ¼ Ã0 Ã0Œß8ÈW;±Fâ¶…å!íNßñÓdÔdTBÍ-`Pѽæî‡fw×íä½§(Rß®ù|Æt: ð½ãd¨«Š$ÇW „.°YoÁk'Êp/žíM—8 J2Ä †ШD�ˆ³ÙŒããcîÝ»7ÄÞ¿Ÿ[·n ½ÇœsÄþ*|¶óŸ®ïOç¶mÙ´-ϾÿžÇOžðèÑ#þøÇ?òäñNOO9[œÑu]v_ø�žbÛeµ#¸ )Z-†Èr¹ ®kêºöõqñvìò*Š‚ªª˜L&¹؆"ôÂcLÇ‚¬î� ½èrîÉ]1l4|HgôÀ¸4ƒ��¿Èê~;ÇëO=O㚢 #�¨¥/˜Î'_;âèxÎôhBQIŠ0¤K±‡ÄÜ4R†æ‘úSÏôG)Øì�÷ûn’ûài/~¥má G5)™Ì*¦³šÕÙ†°ÙЮ:”òQä®`鵓Ãϲ¥Mô2 Ã0Þ¼ Ã0 Ã0 ã’B–²uuì)†‹ÁÇWäÒ(BOFbר­q¸½÷Ö½éÊ6ÆÐm$½X4vœŒ{ õ¿ÇiÛvè+´Ùl]xëÚhˆÊÎüjŽœBÁyGUTÔuÍíÛ·¹}û6<àáÇܹs‡[·n1ŸÏ³('ç”(É–,º�¢åNOOyùò%ß|ó _}õ�¾zÄ—_~ÉóçÏ 1cÜ#^ï\1w—±·GèxWÔ$Ç€sn8~zQë"——ˆ Çèf³¡ªVĈ!îÔÝ{‘{ø©)J¯`ßá•$áxpäǧêãJ§¯écôs—þu<@~X{Dú'9šR$‚‹øÊ1�5Ì�gLf U]"ED%‰-Éáµ+Üè{{ôØjï{=ËÞù6;óŽ-ÙeG>D"ÎCYyêIÉdZÓLÖ¬Î:Ä)Ęûå鉎Ž!“·~Ñ¿ÈLô2 Ã0Þ¼ Ã0 Ã0 ãÆ¢–ˆw"ãpUÿÈ2•žýŸŸ`ðbÈÖ1%ùÊòw.ëIÄ)«’&GÖU/v¹<{¹ÿP^®#1FÖmru Q†] Ä8œTu\c¼d6rLšŒ]'‘{7I7<7©n޺ɭ[·xðàŸ}öŸ|ò 7oÞd>›QUåNï ±P5&äJ/_¾àñã'<~ü˜o¿ý–o¾ù†çÏŸszzJ-ËvÞ�㺕7�+� èHÑîïŘúß­–«'ZÕÙI¸í«5.àzç¨ªŠºnhš5• kZÍN¯^YÛI+ý2á{¬wxéžÐ>f2™¤øÂÜ?,Mw;ïýô±nµâÇäéÓ§|ñÅù›?þ‘§Ožòýwß³X.’Øûât/žõn³¾°,‡£ ­~e\4.ìÝ !E‚.ý’ª®“€ón§OÞXÀuÞS9¡®+š¦!†@ !t)î3îŠèãÏÓ~ªYS$;Œò~�쥳¹ƒn³íˆsà8Þtg<ÌÉ{#qáüš‘s~Õ_ó~�#i5÷îrà GÕTÌæfó e]€Ï."‰ûHë^ IDAT 1»‘öúwÙ°sñÚÖ­‹v…WA†þ^’ÏÊN"ä‹$ŠÊQOJšiMUø2¹ÀT;T=ìD ëp‘ˆñËò>»h ò“j˜¢ÖñÓ0 ãCÁ/Ã0 Ã0 ãd_,º:‡b¸ôÒÉsFÅG饦$le©+÷ ù~zÏ`ü�SÓì„/7º·í"*#?ØÖ�Ñ;“ôÀü;qxç( O]•4uE]U”E�Ï“^H“Aí�ØÚõ†ÕrÅr¹dµ\Ѷ©àÞ÷ÿ åƒ{d·¿SìÖÝRdêו„©²((«Š““c>ùä>ýôS>|ÈgŸ}Æ­›7¹vrB•{uˆÛí©Ò‹]½Ðµ\.ùñÇyþü9ß~û-ß~ó-Ož<áÉÓ'¼|ù’ÕzEawêcà†X7Ä@Ãx§K•¶kY­W4ëšõº ,KÜà°ÜîŽIïv”eASWÄ®¥k7t]—Ä®^ðÊñ‚ý~‡1 Ñ9â0æbkD²sQûÜ}ßÃ>ßG…r)¢qd$ ;Ù�¢ˆŽ2½DôÒ½Ç98žíu»ÂþË�¥z�DG¢UrwL&Í´¡žÔÉÝ%‘(}Ÿ¯QbŽÓ3ÉëÍ×êuÙ;¦u½�Ô#Ò9AŠÒ1™Ö¬çÍ´¢j<�*±‹Äk¨ƒMR>ÞVg¿6ÄÃ0 ãÍ1ÁË0 Ã0 Ãø@ysÑKô’È®K Xû�Stg‚‘ˆj Ž •„ô¸$l(X ;‚—²í]%¨Ë—ä›Ç©KïÏŽ —…0ÑÔ¿JðCôᡵ"(Þ eQPWMÓ»»Î;4Äáõ}=ÕìJY³^­X-—¬V«ÔëJ5}î^¤ÚNÿŸ‘[ew=ç¹T†ÈGU¥,Kæó·oßæóÏ?çw¿û<àÓ»w“­®“ &ÆÔιºT•S¿±—/_òí·ßòèÑ#¾øâ =zÄ‹/8}uJÛµCŒá¹yì3±”K\/†ñ†£UvKª*«UC]¯pÎ%×o£4ÑË¥c», ]‡b‡†$ú«F4ÆÞK–ãã4ωf·Wv‡egì¹è¿£ûùÇF�~ Ât戺½èAŠÒÓ4uSQTñ‚º„$zI’-Ç‘†oõéòÓ-ׇÏ~ áXôÊý¹ »°œÃ—©¯ZÝTT“’vÙH¾p%ïÅÃÙÕÆ{Ã0 Ãøh1ÁË0 Ã0 ÃøÀy½Óë°³Kü>¾‘]YÛ)ܨwneW”€+_E]PÖeU¦ŸuIQe�Ën*çö\IÂjºíbŽli×Öë5›•°Ù´´ë@èÚ%ƒED’ L·þ¯äË?½§¬‹ä&h*в@œ$·”0šŸ˜ è1Ðu›Ízˆ2ìÚ$¶‰“'8Ò»TsãžÁjq>|kߦª8ï8::âæÍ›üîw¿ãŸÎÝ{÷¸}û6ÇÇÇxïAdx}*¤o§ÑG0Šs´«ggg_|P¥íî“£+}»â6ÊðMƘݴǷZ§W=Ûþ¬¢×x¹®ôÁ2z“îLB‡óÙá%D¸Ô?²¨=U“D¯uÙæ×¤}^ˆIΉ†a?ÿ€hÆûÀ/Ã0 Ã0 ãƒ@ÎývQo­½WêþwÒó¢ÖèZüá~Š)Ì…GQú¼._@Q8|áÓ­t”U*”•uIÙ”).°.²Øåñ¥Çû$x‰Ëq„2ž¿T D¯¨hˆ] k[6›–ͺ¦]õ÷[Ú66�Ðno”:4@𢥤¨ j êIMY—¸" VQGL…múh޶^¯Y­V¬W+6톘û]m»ûÈ𞇆ìõß9¾œÎ;Š¢¤©kæó9wïÞåîÝ»<|ð€póÖMŽ��©ëš!„w̰åUéB`³Ù°Ùløá‡xþì9�}Å¿ø‚'Ožðý÷ßóêå+¢F4jЉË=ÀúKþå5Ž.±«ù�Ôëòñi·•Ý…ûŒj¤ëZV«Uµ¼¼÷IHî?N•\Œ¾()«†²Ž›€+t�.Ä$!© Îƒ+p®Äe� W Þã‹ W”¸¢Ì"— `~ˆW”ÞÕ%n+xå™Hb—Æä:D¯M¾µ„¶#†–ص;4vH ’Ý`QhH"H„°Ýî]‡¶Áè·ƒ‚Îv æè¼>Î�|qDï¶­'E)ˆSp²£KeÔùqÔ»ëuÑ�Ö’«ÈRòÑ‚o6Ï¡èËÞé%Ã.•Ü^"‚+ Šr7¹xµB<Ð�\ÝVÙ6Œ�`¸Ð­ûÞ0 ã&x†a†a¿8c�¥ÿ:;²ö"ÀÆn¿ðêVìÒ¾ 8ŽÓÊbWßg…@Ð@ C�æ«¿EUPMJšYÃdV§¢å´¦jJÊÆgwW�+=âÉQ†Ùl!‚s£½<Ÿ»_ʳÃKÑ2½C$„HìÒÏÐÚ.fçWËj¹byº`qºd³ji—‘ͪ%¬:T ªÒSN<Õ¤¤šVEš7 k2vJ$ai³Ù°8[°\,Y¯Vt›?ŠE"/Øb"Y¸Ó8¼N ‡÷%³ùŸÞ¹Ã½{wyøà!|ÆÍ79¹vÂd’" U·î«ãN¿.É[®ÝløñÅ ž?Î×_Í£¯ñäéž>}Êéé)›Íf𖈹¸tW.•«T‘?¼ŠÎz¬Ê{\Dý(Vx*žËPcŠmcWJï2èºX²Xzвėžª®“ë2·J}¶rÈŸ8pEÕP(Úˆo�:Ý¢xœ+)Ê E5¡¬ªªÁù$re�/+Äˆó ¹Øi˜�\$1\w"KÉ.­Ü§KSñß÷®K )Ò0vhÄ.¹¼b·&vb»!nÖ„6Ýb·&Ä_¨$Ñ�¾ážQi¤ ªè%Ûæ¼ÀñËï/}t^ò‹S\á(ë’É´¦™T¥Kã±äsPc8¸‹áªñ„*¼µ[îM<ýYÆ‘C�èγœû›`»§¤þ�JŠçqéd Û' Ã0 Ã0Œá Ø¡¯`£óù÷èV˜Ù–¸F1vÐÜO¦¹È7•."ñ•à*GÙ”Ô³šfÖ0;š0=š0™54ÓÔ«¨=¾J}@ÄçxÀÜßkHž›$t]ðÕR·‚˜ªËŽ�_””® lÖV‹Š³WŽê•°:Û°>kYŸ «3Å©§© ꉧœ8|•„•Hߌ+u×QD"!„ŽõzÅbqÆjµ¤mÛ$8¹Ü˧_«šÜãxÆíÒmÝbIîï˜L&sëÖ->|Èï>äþýûÜ¿w�ÙtJU×8'Y$‹Û)öñ�Y Ø´É!óòÅ ?y·ß|Ë—_}ÉW_}ÅŸ~ø/_½¢m[¼ÇÄ�¦q~û Dåƒ*"¼w7܇°hWM•ÝæØ o”mtæH´ˆ1ж‘ÍzÍrµ¤ª+&“޲¬‚ÿ4E•Jîé‡x\Qã+ÁW_E$8ÉzêœÇW U3§ª§Tõ„²šà‹ _”ø²Â5â<*)ú”|\(½cJ.8 ¶Ë$è0n㫎¨ÔÛ+¹¼6ÄvMlׄõŠn³¤Û¬�MIìÖhð -Q;DQ%Å2êF8Xqâkä¬/ÞpÛý1ýóN( ¡ªŠÔ'ª*RŸÇ¾dŽ4ÔyEÇ­Ï"»ÛK¯Ôóëcu>È[<8̸wöŽ÷±¤+ eå©'eUà ‡æ^�ªú¡¶‹3 Ãøù†Ú�ño9ÃØ£0Ö0 Ã0 ÃøÅ¾séå_¾9kˆÍ“Ý÷z�ôW¾9Eµ#j‡J€|%~Q;|]ÑÌ&ó “£†ÉÑ$ \“’jÒ÷éÊŽ)Á‚Ëý¬ˆ£hªm®ßàìDÝÁo™»^6ÙV~©RçôuC=uÌO&l–-›EÇúlÃêlMlÁQRº_A� qZ äž=’údÅ>"°Ý°Z-9[œ±Y¯s‘o+mŧˆÆÜÓÄË v¤(6%ÄmbY•L&nݺѸwïwïÞåÓ;w¸vrBÓ48ïS�£È°¼"ïó:!„@§§§<}útt{Â?ü ¸vý„ùÑPêºÞY»ÇÇÇÛHC ,K&“f÷ PQž{@UU”åá ïýÁ÷Úc›¦"$߸f ‘Õj}¥êÁz½&äÊ}Ú¶c³Ùœ{|µZe÷ÑîcmÛ¿Çyùòåhž49éTqâh»Ž®k‡çV«ÕðÚårõqŽ?W-èˆ^¯?I.0TGý»tpßÊ%cŠñæë@û¿†Ssú»@D²ã²ÛºQ4!ïç2Êé5 Ãøm§W›¦�—ƆE†a†a¿ ¯sVHŽþcLùBùý‰°-ȦV Yì’äæR í@"Î)¾tÔóŠÉ¼a~mÎÑõ#¦ÇS¦GªI•\_¥Ã ^‰º‰2Ò$Ò»¼Æ‘�…._ºÁwNɽ¦$_]žR%B¥%M,Ñ.Ò­í2°^´¬ÏÖtëHì � Úr?,/BAAH}²Ú.õîZ®–,WKº¶KëÍåÏEŽ©jê&ãí±u~©*EQP%ŸÞ¹Í�7yðð3þðùŸqïÞ=nܸÎññ1UYRø,ºÅ˜Öˆs{WÒç»FBP¼wL§nݺÉÉÉ¿ÿýïrì!YÐJo. oÇÑÏÀV$b C¿5ÕñsJ×uC�y¹\I@ëE±ÍfM×uĨ,— 4*‹årxÍf“÷Ïå‚õzÍ«W§ùsôç^ó½à¹1!d—f¹b¹\á|I]'Q$jò:)êˆêˆ"à=R E]PùuD|‰/*ŠzBÝÌðE®D\‘BE@Q|/K�G£sí‘ËI#¿R¶xê84ëgNñ ^qqœ„–�¯v½ ]×´ëê‹^_äq.Ÿ7]ˆÁN€žîçþúNôo½pòNŸÜ‹^½à…8ŠÂQUUå)*OW¢Sˆq¤‚xŽBÃ0 Ã0®† ^†a†aÆ/‹\ð ê�(ºuwéèƒÄÕª¶÷U’@¥C|Ä{¡¨*&Ӛɼfvváå}]úÿvÓéE¯q£=çÁ‚+„ÔîNsä1(~ô7†a†aåw[†a†aƇ‰ìÕ·Æ¿ï ‡È­Ü#%ˆ.%%à ð�§™Õß8æäú1G׿�L©&Eí‘Ô¥×+!‹e©ðÕ?¦ýgh…³­�yéÅ¥ÊAÔ2M1‚2.ªJvhIÖçÀW%N<±…ͪc³ t+¥]Gš¢b^�P—S*ßPºŠÂ•xWP–%…/(Ë*Ý/ Š¢Ø‰|ݶ'”EIUUL¦Sæ³9ÍdBS×e‰s)²ð|°1)6±m“³çìì”ÓÓ³³·!„°#ˆ¿Â£|¤þî÷+‚äâKq’³+O3„8ÊZÚ¶e³Ù°Z­X­–œžžrvº`±8ãôÕ)úÓŸxñã‹7ŸyÝ•YdˆêÌTŽþ\¯7à–(¸ ñ5âKðÅñd¯Á9\UPV/Ž88·|Š<”‚ˆGÅgÁl{Lö‡N½xœE}¾÷Êîo$•­à�bP5;²’@&¾@\D´Ä5®j(B‹oWë%~}‹šèJ´]» „�IÀáp’£TwGš+H>û=u üiZ8èî-·LsÞí¸»œg{1ƒÄóï»’˜%{Ÿû‘žËßË:—­ÕGOæ^^> ”â]¼¤¿€fÛcÍD/Ã0 Ãø81ÁË0 Ã0 Ãø@¹¸±×V÷ÒQ´àVì Ò¤Ã×B]W4óšéÑ„Ùñ„ùÉœùñ”ɬ¦žUøR ˆ¨Û¾W D¨˜=Ž¡bdåÐíüô=~Ts™6»<Î-Âh¶=F¶îͱJ1;/ú— ÀO)%µ›1/n0)ŽidFå'TnBåk‚KiYbPbˆÄwfÿM·‰ˆà OQ”4uM3™0™L˜N§TUMQxŸbϵ9­�¶î›Åb‘Ü]Ë%«õš®k !ž[wæì2®‚÷ï+ªªºôu•¨‘#!–‹%‹Å‚ÓÓS~üñG~øá¾{ú§¯NY¯×çú¢ízNvEARˆ]í"ºnQ·Æ(:ʪÀ»u*ž€§Ë½¼¢ù–úz©x—#ûØB—â wåóÈvlºlŒÕ�×ïuÙy:öÕfI©w¥ó¥ñAÅ¥±G œ®DŠ W͔֔n½$¬—C¯/ ›ìøŠ ùçu¨;ëYÎ \½R7¾Â`{Ñ�¨¼'ÑK/\CýØä½Kã_‘ûw9õ”ÜwzíMW_7À½õ mŒÖ\ŠÔÍñ“^ð> Ô;ý8m†aÆÇŒ ^†a†aÆ/ËÁbì¡øªý^ ¹× Jt¹_‘n¼ªºazmÂÉ�c®ß:a~2£žVT“_ ®dˆ=ŒP é'©÷—ìäæë¾wrËtûš‘‹¢½R¼b¿,º·$:އ€¬QLbê;qâ9*nqT^縺żG½¶”Ý_*ù~Ô�ÄÔ“¬ïq¦ªZÆ\Òo,G:—Ü eY3™N˜MS¯®IÓ¤^]YìÚ6ÚÚ�n*þÇ¡¯Òjµâìô”ÅòŒÕjÍf³9Ãø�¨êŠª®¸~ý:>H½¹Ökž?{Î×_Í¿þWÿšþôcŠá„¨t\GuÄÚ*ëVñ­â‚àÕ#D :B'’c‹Ô«ºdëèÒ!¾ðü8ÊðŠKÆÑƒ#ðè§îö% iû£ãÑOéM�d¯˜„/^—^ß;ºr¤ ¦ÌñQÖKNWq�¼ Ñ~(¹©vZJõ ÈÎܤDž ’#³h®ç®ª¢Äeݰ^4,^y68´Û4 õ¢]j]˜�9Û T=gNu‡¤-åÀ²¾mÀáþ:�'ˆÉÜçÒ…Î;¼Ë=ÉFgœR$ç¼ñv»íLx9´þ/ÕE� Ù‰ç :É”©/æöÜnb—a†a|ô§Û*0 Ã0 Ã0>vjL㨮m�²�ÚŠ{rWpRDʉ£™—ßœqí“k]Ÿst}F9)Rl‘WÄ­�îK$jî³"ù*üá㕋ñҕâ—,D®¹îGˆ�Ž«;|~ü÷¹5½Oåw{Éh¹Ï‹^ÛÂõ8J‘^|ÒT­vQp…à¢#M}w”A\Ú÷°¥IÈpK®®$v1�ΨªŠ²ª†–3rÞ26ÌiŒŠÆÈz³a½^³XœqzzÊr¹d³ÙÐuÝÎÂí$FZÏ.ã#ÁyÇ�OïpçÓ;ü£ôùêÑ×üoÿÇÿÍ¿|ŒªG)À•DI·Ž‚Ž´ æ^Ar/|êß5Š-Ô]*{šÕ ”äñêõQlråguGãÒs£×� Ø¿8Ï›Š cTºß_¬àP4‰ä¾¤t_”ˆxBL—´ë%(DÚ$ÐèÝQ"Û±/9cupØ^}¨x/]½¶ŽÙa=e1¥ww‰“ÝÞ]¢£•§®ûa,–×o¯ßÆo&v]| ä#JÒöI./‡8N>ª:r{†a†ñ1b‚—a†a†ñá2ª¬®.IÂT§� ÑuˆWЉçèæŒ“3Nn�prã˜jVâkA] Hê …h¶â6ºÐé*¥Ãçîº(vgª».(Fêþ3çŲãòvír{ö'îÂU ¯}<»ßòú‘^dË—xð•Ô£ Bì"1¤ÂÞŽÀÔ» ²ÐU%MS3™L™L&L&ªªÎñ…ì.®KŽEÀaزÙlX,R¯®ÕjÅz½¦m[b ¯ßô†ñ‘ XU]ó·þÖŸñùçŸóÅ�øŸþ×Î_û#¾šRÔS|5…¢&P@Ž/ âˆ*ÉÝ%é–Æ=¸>%TÆé®£�Õ fGÞÏœrÙ o—ŒÇαç¬�l•,ý¤‘Ö¸ )„b¢L|Q²:{Å Gܬˆ Q! !Ž2rA½ËÒõîµwaëÀÝ®IÁ“Ã6Ù s;åkÖ¸‰ýûkúŠBí%'LÙÙ�ó¶Êñ“2rï©^å Ã0 ÃøP1ÁË0 Ã0 Ãø0 'Ã×qøtÄ+¾ñ4G%G7�¸qç„ãëG"~Ð IDAT̯Í�¢té–# “(“¦µ�.ÔK®!?ôè6†Š ž½è½¥kø;×þ3îý�•o±^òtwêν�LÒºRÉî �á*öÝõªÑد×Q÷'x—" ›¦a6›3ŸÏ©ëš²¬ðÞ'WÃ�µ$ù¿ä ‹t]`µZ±\.8==åììŒÍf“úŸÓè’•hÀuîwï=ø³ÏyððÿæŸýïÿ–ÖO)š)RÔñ ž(> ]BœPY¤î\ÙÚˆÇÕÐOK¯ÇŠ$4‹€NðEA3i˜ÏæÌfsf³UQá}ArmèÐû«_Üqÿ.ÕHIì:;;ãlqÆb±`½ZB ÆøÚåµ¶5ÆÇ;`åÿ!#‹WÎ#¾àè¸á¿þÇÁ¿ûúOüÏÿæ)ËHŠ/„](HvwÉ~g*Ý?Nô‘g¿� ~ü²E�½Òþ[êòz x0�Li™‡g}ïôò4ÎS%Ęœ ]h!—SY¬ÐþSdõöÇí‹ü¹? £Þ‹—ŒRÚ‹^rî©ÞéÅ�sŒ\<ï±ø9À.Ù,zÙ£óaÿ3íw2þ{#ÆìÚÓK>Û?î½è@ÿ<Ÿ Ã0~U˜àe†a†a|0è9Ÿ•îôíRøˆsÐÌ+fÇSNn͹v󈣓šj R¦×G‰�o1w�Ùo®¥²ÿ©û¼�³AeÔfûú‰¿Î_Üþ+®5Ÿ¼Ïµ;{̺f7[¿„"ŠxÁ•B¡.fSa½ðUU1�N™L§TuŠ/×glíÊ‚C¨£1FBl6–ËËårº6mKè:¢ŠôÒ‹W¹a|øVÞg%×Ó·±ƒ©ï–CÄ#®À¹œGÄów‡ë'sþÇñ Ï–]îO˜Þ££>z—}°²ô½.V_.Ìþ;TøÞ1º@`$Š') Qú”õ*‘sàJ¡GÝ%±KDP"aãˆaC6yeAIqšÆw7v÷…¯×¹Iuÿu’ àz wãÁ)Ž Ur¤¬ôž–JÄBô~.¤ÿ3À ./Éî¯×ëX&týšÿö”wTœÕŽbÃ0Œ¼ Ã0 Ã0ŒÝsr¯-%‰]QR(E%L�®rµOæߘ29öPnˆn³ȆØÂ‘Ø’ë«Û²ìU‚°†w,�ènQô¤ºÏ?¸ý_�" Æõ˜`C´!�ªÅ’úzUçÞçhȪ¡©&Í„ºj(\�¢ÉSùvëî’Q߈!ж‹¯^¾d±ÞÔe†ô'M;[]0І0ÚQ”€# 8�„í` ÞyœóÔÓˆ“=«1°ÚU$h@ÄápDB½`'æõàè}É™òvD¯QlaZ—ÆÐ½m-ý2èèŒ2@eÇîuȇfüœÇëÐ+MÜà¥Üy^ä�ÅãcüëÓ+ã·ñ5뽟zìÐ1>@Lð2 Ã0 Ã0>�o`äÂb̨T\T‘Ô‡ ©š‚r^rt}Âñͳk ÕÄ%g—O¢Xïꂘ5(Í5®Ý~48vK“Âëèöß«|ÒüÿöAåëwZ3CV.}öâu*9ÂqüJ—Ë´âpžäîªKʺÀ—ïsO."ªB$õ:Ö�jvu%g×j½fµZ²8[pvvÊz½Þ‰0T%÷Cû†lü:ÕDÄå(Ãgè’ÛkȻˢù|RñOÿã‡ü³ÿçþí³ÅHôÚ=>ôÐq½s_ßÃÌŸîàÇä@#Á�IöãŽу["nû~MB @ê«TÖ”©CGÚ�9 ¹“#.GJöïº^PSÍŸ§FÊã·è%-µò¶Õñ²ÊÖÉ…Ê6MO·¶ô§Ý:iÏ _#ÑÐ Dî•ï´jôü”eçñ~[²íqyéÜØF2 ããÿÊe¿fLð2 Ã0 Ã0>œo`#q ‰@$j Ò¡.à ¡™—Ýœsý“Ç7š¹GËŽŽ¥E¥ƒ,w�‹ Ú©ré…ßú†;EÉ«»Án5Ÿóçwþ ¥«®ôúw{Åa—Åá è°z‘Ô;'ùg*G  8ñƒè¥xœK 1º. ]kÎÎNY,ÙÕµ!†¸ÓëK¬>hü*‘‘Ý«%œÇù‘³+G÷é %miª‚¿ú‹ÏÐñ ÿöÙrgZ" Ú_�1îã¥;ц24C“‘ˆÒ»ÙúqÈJJCT}MœåoåÈ:ÿ»¾õ~ÈÐsMuëÈS4JŽÉtéÅQž?³Úv1 ãcÿ¦ej—ñÛÀ/Ã0 Ã0 ã—a¨`�…'z³¤ß"J‡JÀ•P6Óãš“3æ×&LŽ ŠF"mz-�mÅq¸¼~Ôóæ‚f/{ÉÁ’Ûë9©>åÏoÿJWÿ+ôê_rû¢jßnH{qQ!vÉ&’})–0*hT6› ›MËb±`¹X°X.X­Öt]‡Æ,vtKØmã×3€íˆ]}Úàì‰]âFb—ìMC©JÏ_ýù}–ÿ×#¾|±ŽyíáòúãéjÎ9,õ} ßx\?ß‹ñü´/?Ép:P!;ã*Š*»Dc¤m[4$¿oˆT³H‘zxíøX%=~~¹äÒµrÙâö1É=¾diØ‹*I7ÝŠ]Ãk²¨µ+”åi�.ÆèÝpv„½ã©Cw}tCßÉÑvŠALö¶ÉÁ¨KÃ0 Ã0>xLð2 Ã0 Ã0~1t_{;‘R©¡oW=­™žL8º6çèúŒfVâʈúp1Ývúuõ…C¹Œ.wu¥Ùx»bã´¸Æ?¸ó_½sŒáOŠèठ�©ºè�ÐâÄáÄ!’œ‚C‰U´íèÚŽÅrÅr±d¹\°Z­hÛ>v,ÓʵƯzìÚ´Æb—‰][Á+€.îÆUWÿÍ_Üç¿û?ñlѽ¿yÔC×sˆÓã5E}yƒOM6¨�_/}%�D‚K#yŽ@õ)Fµ¨ð(EÔm‹ÆÈJ#!tÄ !zw˜œŸÝ׉~W4z1lp�å^O‚Kë9‚%*ƒ£ˆa uœ—_v·�¾ãùç·ò·Â•wÃCÑ,te±+„ˆF|ŽÝÍÛIå­öÃ0 Ã0~yœ­Ã0 Ã0 ã—D©D³»+€ øšYÍüÚŒùÉ”ùÉ„zV eD]—nS ¢èþÅó£ˆÂýÛî•Ýr®�ýÕñRñçŸü—LŠÙ‡½¾Gë8Y#Q#!v„ØÑÅ–.¶íˆ$ÇWŒ‘®kY¯W,– Î^½âôÕ+gIðêÚ6ÇöëyoƯiÌ:àþLbWŽ1”‘]w—ʾØužù¤âŸþý{4Þ]å(~ý+TßúýÐWe÷f¼È9µML½#BÈ1‡‘\‰+ŠzB5™SOçøz¾B]IÄÔµÚzAlỬ 9WLÉbWï4’¢É «.—\öãûóÒè½;b¨I+ûÛå}œMw—BŒJèÒM‡HÃtÜ�Ñ779†a†ñËb/Ã0 Ã0 ãF¶qN"YèJb—ºˆ+Õ¤dv2åäÆÓã eS@ˆ®Ký½$½ç¼Ì²ßœþ§[†ïÆεæÖG³ÖÇEUÕHDèB@\‡‹ ÉåÕÅ´ë–årÍz•n›MKèBŽ0LS¼8Ò*†Æ¯=·'wâéÝ]•$tèxTÚµ±ä“kþêïÝâ¿ÿ—ß]rÔ\Ë7~Åv®eïþÕ$„qòìnÔžîã\z¬ëµv�X[×SThê(€«(ª 1Êõšn³!J»4¤ÈUÛ…u+2öq¶zå¹½êN�# G"J׺ˆQsüoô¢§ôç¼ý8ÃÑÖQP±XC^·—_¤ˆ©ìùçt§§Fˆ]rwu] t)»ÐåØIÀ®×0 Ã0Œ�¼ Ã0 Ã0Œ€Ü¿…ˆŠ5 ˆ�øÊQO+æ'SŽo19ª(G(:¢dÁ‹˜ãˆt¡õó• ïNÿ6÷�þð­ïTFTQDS°¡h@€„N¶^·ØAØDV‹‹Ó%ëõ†ÐBiJ}M×vbã79tew—xÈq†ˆgëÚ‘}¿ÓkùÛ÷¯ñ=_ðÿ=>½tÌ|“ñõíÞ·�q•C}¸ÆÜÃcÌè§\4?»ÂY/z…<]/.õQò¾RŠ©š5]»¡Õ˜új@£Kó&šçQó9@ÎÕûØîàÕÔ›K•Òü„. Ž×~.†h˽Åß»†µÑ ŒòÛYtܼtÏÖ¡eçö˜“�WmטĮÐEº6m+Q7H°&4†aÆÇ� ^†a†aÆ/È~±3õíR*_zšyÅüڔ鼡™–øJˆ. býëRRQÜëÃõóP¹)ïæ‚÷ñ­{•ìÚÈ�h$j  Cd£-ah×›ÕÿÏÞ»6G²ei™ÏÚÛ=nRÞóœÓu�®ºš¢1Àº«¨®6þÿ° ›/ØôÆ'˜� UPU0ÌtÓÕÀtŸsR©”7wß{͇½ý¡�R™©kh=iž …B!�íûâ¾^ת©V5MШ½cC®zŒ cŸ¸»œËb—WÐÖ‡®’xgç„|ïsþàëó:îÏT¿³Ž¢ì|©*ÄNÀH‚¢ó%¾SNfŒšB@ë h@ÚD¸))âpy‘v‚»žbLçL@©6TJ]ê:$çPP\‘ö¿ß†¾;›?å´a[ÆUÝí\LYŽÓ?U!¥ib:NuHµàt˜ÖÐRò†aÆCÆjx†a†aw„nn¢Ð¥2 ¨�ø±cötÊáó¦OÆ”S�J &Ò%$ç�ÄN2»mþ‹ßbRÌ^Ëk †ÿR½®†õjÍb¾àìlÎÙéËÅ’º®‰! ªƒÊg»““mú c_¦-éMMÒ‹1’Ý]mí®�»Z&%¿ûë¯?iŒß+äª{˜œqšÓF…F…(|�+Çããé!åxŠ+Lj+QçÑœBRs-/ÔÛ½߸Ý[‰äT¼BID©›@ÓÄTÏK³°Sºº]×¹C�ätá²î´áÌjEÆA}4P*ÄHrw5�ºj]ýÉÍzž†a†a” y;×9䣺ßãšr�ëM¶“DJïüЇ*Ä ÔuÃjUQWM®á»S‰.�¡\µï†a†qß0ÁË0 Ã0 øCr8R#“�å”bì™N˜Ž)'~âu±»dù%çÜZrÃ…ç¿ûìû9ÈýPZú H®8$ÙqàW®pˆk‡õΆñàgªn�t�t×mmž5ÝPŸzÁî„¿ú�—{ךççŽË¢Ò XˆW Å?šPNf¹–®@Åe�lðn7² VIé U•õºfµ\³^W4M$ºQ´¢WN «šo1P½ÿƼû‚\¶êôbWòÓ9ÉBhJ]5¬×u®ß¥h2xe‡Ý®·Ô÷ô]Ã0 Ã0î&x†a†a·ÎÐU¤QbJQ(ç•râ™N˜L(§¾Ä+äÚ]mý®-Óm$즓A¯x5ý•=<.ÚÅcÅ�Ë‚—/çe`mhÝ`†±ÿ“Õ9k�Îqù²Z¢�?•o¾>à‹ƒrOW�«8½¶’ÓŠ_àË1åxšR–c(RZȸ»„ÈMÉm�¨”¦�¨Ä&&AeU%Á«hT4 ]�·VÕÒ]ŸÛ<^Wnú žïnØè«r!šêwµÇ§Z'‡Wh"õ’æ×Nœ¼¼ï†a†q_0ÁË0 Ã0 ø]ÚÜÛØŸ¤šQª1Å1GŽÑ¤dr0b<+ñ¥C<àt�ÆP7nÝ¿Øåu3|ãð/P¸} @ë¹ou :—^ÎK_÷K¶ÛƱm6ÚêÞ�³Ëùìîj_Ò&P½Þ™§,<ÿó·žîÕ4³ùäåN¯aE¥VÀŠ8�ó%®áÊ1®£¾ v.¯V¤ok9}ÊL¥®g"‚Ë)-»”yË5ëeE¨b!nwSE¤u8k—†‘\kê:ªL>†s‰>áfÝ-éFdú§Q M¤ªÖ«šÕ²¢®›$F*)åd7~õ=ƒ­y†a†qŸ1ÁË0 Ã0 øuTz¡DQ¢"ñPŒ<£i¼FÓ’¢ðéÌ5‰c}Щ êí‰]N<_Ìþ̃kó+µ‡nûDHi ½àü®´†ô3ö¹R—n‹m;¼nÆÙ5ä;Ÿ?Á»»>ôšø¢÷¿Ó‹¡I AÅ!E‰+ÇøqryiNk˜j~ATéêx©Èµ}€¡´’ÜD.9ˆ‚ÒT�õªf½ª©«@hRÚ�¡Š¦Ú]ù÷z—‘öÜJäfƒ‚ß8øµÔîìXl|××ò‘œ]^Ò×,zY*CãQ"nàîÌE75ÓŸ¾÷Í'·<'\% àûD/Xm®ò™/z]cC»Ò±Pqˆ÷ørL1ã‹âKŸêx©ôµ¿>å°·ÿË®çÛGé»ÖåÕTIðjê€u8u™y»º“:ØGÝ|?sz]ý‰´ÕÚ…J JªÝµn’ص¬¨–5¡‰Ù2¸Ù+¼a†a<& kÃ0 Ã0ŒÆÇÆUïQG•çëÝ]â…rT2™Ž³àåq…ƒ¶Æä(¡ >Î0ýž\R{ãúx=ýƃí:ri÷Ѽ׭_�^ðr^ˆ!ÕCÙî’ 4öqZÕ­Á ÒnIðj]=¨ô"ñ íÑ·__ßI»\nâÒ g— a\õ=7$èß¶N`¶ê¦¶çqe™\^ÅçK ²¹R|âò ´)ucIÝðÿ© A©«$®,çK&©ÎX1* ×ûŠ(ª.W$ÛMåÂIU®ô!䆯ÂM¯M—ô¾ßízé„ö&—ª š:²ZV¬æëäîªzRZáZ²Ðµs Ëý<™2 Ã0 ã&x†a†a< äS"QÊ5d?r7räQ5ÉXQ"8Á•ŽÑ¤dz0e<SŒ ¤Èî.�¨‹¹.þ|7‡¹f£§»±ÐÜzfû9‡¤ˆ Þáœæ›âu+ mA@ã�£Wlj¦RŒI ÛØÕÁ«�óe¼Šç ¤«áuùÔö±í‘n ÿ§�mYH5£š*R­*æg æ§‹”B¯ÀåÃåLÎU¤Ü5Ã^ÝÝõIç w7º¶6=×·Hëî‚”ÔÐ!x4@¨#Õºf9_±œ¯¨×�4»ÀÚ×ÊÅÝQÞçø2 Ã0 ã>a‚—a†aÆ@ôúur_T Õ.¥¡x‡/=åxÄx2¦ˆÉÅNTûm£ö×F}½ñ÷|òÅžU÷ÐË;K×iØHm˜Rºa1?ã1̾t�]ÚÍåúQ·¼'ßx1}°kØGÍM²UKLúôˆIÿÊ/Wà}�/Š$xyOZDܹ‰êÚÛF©31§Ñ«bNk¸fµXS-B¥¢Ô!Q:¯¯6–¥:Ùõ.vÒ]G•¯]UÃîz…ºPìv m÷9 X�ÃTˆÕ<‡yESˆêpâö®O-læÒ´zj†a†qß1ÁË0 Ã0 ã¾³åìúXîŸÓ‹$b ˆweA9.MFø²@\Ng8¨ßÒ¿†�t3ÞxcÏÆ¯ö®c]ZQgðÔҰuyõ}JÍçe<D—jPµ5¼î øýٳɃ ³¼Ók¸øéÎõ°ó‰ÃùçË$zùq½Øµk}¸¶6¤hœºTÇ+ MY/×,æK–ó«ù:ÕŽŠ$Ñ+&Ñ •sΦÝ;xóõ»n¯'_åïÉ>yn5%·cïîuÄZY-kó5‹³5«eESEˆ§I“sb×E½Åêx†aÆC Ø8�ó?˜h»¾> lç^†a†a\vþÄýл†AHW8ü¨¤( Š¢Ày—cXý¿¡Ôuù»Ý ^ ʧ{Òt#ÔE-Úö•Îàââ´ ú·i¼ ã1Ìœ’Ý]²×[OgcF^X}`­÷±3tžc¤-B¹5ï´s.ÍOÞã¼G†î.ÊI×üó}ÏßÛ=¾†é%‹V®KS¨�®ý§Kæ'KV‹ŠzÐXà):±ëÒ”†;[ÄÖ<Ã0 øÏt‚—ªn�n<€“fµS��'„w0 Ã0 ã²s…{´/Eœ÷e�Ï›ó¹öŠFTb[í+�n|†¶ŠËÍSº)Óâ`/Žþåb×ù“Étó¼äln­Ã%=g'ŸÆ^Ï•]Á&R¿¦8¼§%³Ò³Í#yŸ“ IDAT;½è•+em­ëÎ9�´›$Õ0Yà�Ä%$¹»ÚÔx¢!¢YpQ Œ'%£QÁx2âàÉ )â<Î)Q7¼©CÝ! WoÙ¿±¶Ùª—µxg?†®®”ÊPÔUdµ¨9;Y0?M‚W³x-q8É¿§C‡W{3Ç×0 Ã0Œ{�»·Ñ�÷�Tš³ë²Ó?« n†aƽf#I¡€Ë5¼’èåqÞu1圩¨‹5é…'…7Œz:ú<4÷ýÈ\ð\Wº(;],øg<ªk,é��ñä¶/»œ¾ñlühÙšïÛ:^Šñˆ+p®Mi(I”¼ö²™îSbÒù„<^<…+<±šudyVqv²d~¶by¶¦^’Òê©Çåß–Áõü0ÅáfÊÃóÛc‰sÉI×�ÉîŸËé$=MXœ­™Ÿ.8}·`qº¤2L¾Ú:_çêwíCÚ½ÆÍ0 Ã0òŠ]ôq�Ø}øI ‰^†a†aÜwZÉ«¼„¢(ð…Çû$xáúRÃ@¥œ;û¹ž�^ïA›ø1j%£‹ N0½Ëx|ZBé�_wpeúùÓÉ£\2¶[{Ó¯šÓM:�ø"«ó¹†—¶kHzp­bׯc‡‡“ïJ¼Ht„ZY-+ÎN—ÌO—,Ζԫš@²Øå©27Ä,Q²©'r®jÜã¾Î‹]hÚ¤»ð ŽzXœ.9}·àôÝœå|E¬‰éuNÚú]¾K‡¸7-©›é ?õŸÅ• Ã0Œ‡F±÷×é�õzÌšÊ0 Ã0Œ‡pÆ"€Ä9œo·$ª´ÁLEQÉËìèútÜ]Üù†y2zñÎÏ¿F‡‡+§uõ) o©ñ ãÎÆÌVª3Ù%3Üî•׫'“Gy$vÇ$i¤”†i^ݪ!×~¤º:”¤*[)­^îRà¥$*„µ²:«˜Ÿ¤z^~ä)Ç%ÞûœÞ°\Tò-q®­³ÞU!Ó—È};öÛb×Ð7pkIm=¯8}·Hµ»æ5õ:Bðx <½£Î »€Cˆª� SHŘ€#6ëeÃÙÉ’bä)F“é„¢tx. Î9DUG$æ‰éÆÑ�Û6»Õô&cJ¯²Ýí‘f[ìJŽ8Í¢•x¼<¡�jÕ0?[qüö„³“%Õ²AkÁãñRæ:_n Mî—?Nr?¿�qÏNX Ã0 c7&x†a†a·� êo)Ðç\þ*Ýíëýÿš•:”bn-ã¥dRÌ|³ëU^¡»7µ¾ cýÒ§œ¼ôÚ]áÆ3u£DvÌ@·ëòšMJF^¨Â#�KŸüO³Ùº¸Äå´†â6êw ò²æ‡×Ûví>¸îý$ ,¢P…@¨êä<*çL¦cf3ŠB˜HNi(I؉’\Kª1ͱšw^’Ó¦3ô‚¹µõâvNú£=¨Ø¥.§"DSCm ZÔÌOVœ½[pz¼`5¯µBtˆ8)ºši­�&ƒ~tŸ>ù=žo÷\Qo@À3 Ã0ö¼ Ã0 Ã0Œ[%ÝÁ®mÉÄ Î Î»¬tˆ‹½˜Ò�Z—Eø¸Åàˬx�ÿÈ�Ü ä$¦bû89u]ý܄͔^}…»ÛOiè�ãõlÄÿ8]?òƒ¥›�%­/’SOŠ\–†íƒ}µ¿Þ9¯Î¿K+Á‰&7’’H(MYœ®8™œ1— q3¼/Ò’\Ï­›P“ƒMóM"íÚ©;î6è´±[^oaéI#P7Ó¶© Q�Ö°^6œÏ9þú”woOYœ®¨×Ñ"%/T×½Ò¿ßùæú´¾±¯«ÿ�¥5Ì¢×5�½†a�¼ Ã0 Ã0Œ[§ J¶%qZÑKr=¯Îá•£ŠÒ¥¦Ê÷ÎËíŠ^åsDÜ#=ZÚ \:É ÚÛ¥3Œ=ž·Øåîbëû›Î /ÊG.xµ­=ôýf!#§¦ªÛ'¯çXmgs=/š$¿—S‡—BUÑ„š¢\à �ó0yF¥Ã^uq­’–jzÉ`ÿõ’àÿuɯzÇ^[s+¹»<’ëv…F¨×�ÅéŠwoOyóÕ[NÞž±<[k‡‹ez­zÀmˆ]çkw™ØuqŸ¸[ÑëÓÆª¹Ä Ã0&x†a†aŸ„|p !‡Ûš\í]ù> ^�îfï…•ôºVäê¿ÞÞgœO7íÉ‘ûøß”¾–—Þ¾ÁÅ0î`¸´‚Êpò<§z«»ò|öÈêx ;ʼnö°ä¤«ˆ¸¼¥IJ¥wôä•äÚkxé%ó«hÚ'§>Õ¥ÔHˆ‘õ²æÝÛSÄ)eé@"³'Óƒ|ïÔ¶ˆ—k%/×­‰zÁ_¿§Wz�öÆ“›_ý6„Ãìbœ ´G{ t1 ëEÃéñ‚wGs޾zÇñ›S–g¡R$:|Ne®K…xþYþÝ«§;½nf †a{ˆ ^†a†aÆG#ú±ql’nºvr®<Žî˺;Ýw‹]7͘OöíÈ}Dóé¥E»,\hì …áuÇi=ŸÎÊǹæìü¦?&­à•òå¦ã¥ƒ­ÿ½…½Ìž$mý^JÄ#ÑS­ªºB52*=Î�÷ŒÇ£Þ“&šjyÉ`îmõÕ�–¸@ôº®± ·ë�Q7ÒhÿÙ…tl§1@¨a½¨9>:åÍ—ï8úêïŽÎÄF‰Çû2 ^ä4ˆ;/[À>àøâƒUOl"!DÖóŠã7'@ÄyðEÁxZPL œp•˜×J×úÔ¶Óúê¹¥y§ñPÆÈIBaëÈjÓFOŒ�P-ëEÅñÑœwoÎ8y;gyVS¯A¢§ ÀI‰£Hí—¤0”�s‰¡ÁÌ0 Ã0Œ‡… ^†a†aÆÇq^Õœ²©¿?Eš‘H{—{¯§ô¡¼a˜ªTÉ |LÇØOíxoz¹¶N`¤×o;Š6æ²ÛÝ›é¸À‹ô±�¿~žÎøý¡‘,RÈŽÙI7§ê ê?Zhš1�:T=ŠG5âPêeà8žP7eY0�€ŠQ�wŠO$b@%dg�öŸGcvC³QÍ좌†zO�LÇQ[‘0 …NSCb�FG ­aqVqz<çí×§¼=:ãäxIµ $t.ΖÓuw¯·Û åaªÕ¦wÒ� Tç=’› GnLé÷ÃM!½/à#~wÛ18úzÕn÷”\mV¤d½Æ¥gRóú…â¯5 ¤n<Þ<ACr(í�X_G’OV2t0³nÏ�mêÁ´7.ÿïP|÷óØ(•6ˆ«8>:Ã!xÆÅÄ#>¥áSuˆ¦:`­Ë+}¦¸yˆèÎ^©ù3ë{�nÂe%Àô£�ÕÇ_ûVìÝpéÀµõºD 4xB#Ô«@µ œ-xûõ)ïŽÎ˜Ÿ¬©–m’@æ¥ìÜ]�Kì¢ñ.ƒ½“�h(ûy Ã0 øKLð2 Ã0 Ã0>ý€€á…¡NM"–n ]ÃT†éÏô�·ß÷&ïZ/dDéÇ{sÌ®Àì²ê•ó:]t¶�¡ñ`&5½|“ FÏ-wóñÈ3.ó:>°ùG>é·7gíÅ’%™zY(­m=*®±ü�\2³¶S_ƒJ@²Ø¥­‡)íhX+ïŽÔu¤ª#M£Õ HªsÖ¶ êSÃFX/•åYÍéÛo¿:åøèŒÓ·KÖËAbJeè)S ÄÜÖˆëÿæÆ§”�5Ð Ã0 Ãxؘàe†a†aÜ!ÚE%5Æn#Æ”ZH6ëzÁ°îJu»Ù”b³âé£<2—µjJfBcÿæ£]ºJ[#é¾ñ|Vð?N×b6¹9Y0fiÇ .í3ãvkDN˜'7/Pž«¡¥}+ÄìòršÄ?%ù�!6 q¥œ¯A Q AyV=áɳÓÙ)'Žˆbûĵb—ä›?bªíÕy£ýzè`TEE.ð¦õŸFu°þvN¹ÜÜtÃËðXH/~ 8MIŽ’6el„zY/æ'§Ç+Žß¼ãøèËÓŠP� Bªóå´À‰õ8q]zÄ ¡mc…³uÌ0 Ã0ö ¼ Ã0 Ã0Œ»£»²à²è¥ÙÁÚïrhïjlL‹'�è€\%Ü»»t«ñ­d—ñ°§#ÙiwTòÓÊ{¼¤·<6-ØÜrÝ5¼´[ z¡K‰1¹†µ«Õ%]}(:O”^¿Ó«-i(›óá0í¡äZ^ˆà4õ&ŸE¥•±b½® A‰A‰¼x)(Ç_úþ}�$qK"Bè>ÕùÔ…Ú9³d`Е m^ÃlÕj Àïq‹ ?û@ìêÒ<¦ÚZNR�2G�×Ô¡*„¦»ŽßÌyû挓·§œ¼�+E—Òâ»ßõH»úˆ]²Ù‡ Ã0 ÃØ/Lð2 Ã0 Ã0îUb „&c$æš^m �>= cõwÎË ð&ÅÁ#?>U±‹æô“zY’°›=.†q}È{種*”nÉï.`~8)éñÊs�ÆÍ^ÚÞ0sšÜ¶ŠWZDr6½ãžæP""—#¨àˆ!Ь‹Ó Õš:P¯kg>�2;œàG?*pêr¿ Ù=RúDÚ:_w7¥‹j’Þºé}³ÆY_w¬w‡éŽvº¥vIˆªéÆ·!v¹Nô’6Åc~ÞÉçF©Ž—8êP±^¬9=^p|tÊñ×§¬±&¥0¤Hi"óæpÉÙ%Ù9vá85¡Ë0 Ã0ö¼ Ã0 Ã0Œ;E�”ÐB‰Ü ýQÿÿàîì¡Ó"0oªŽ×ØÏÙ$Œ¼À½¥Ã8ê{�®a<Œyè\gßеrͨ®öÐÖ ¸ƒ¾>›�óHµ¢£*¢šÒú!¹d@CHiq[§°´©þÚbw8/eÇ‘Ó�è•;“H­©ëÈò´bµ\³Z¬XÍ—,ÎyõÙsb€éᘩ#¥C4Bv3i»RI¯œÞ0ßA" èf�̶�ë†eëj>¸‹ýr›© {±Ë!*8u)¡ºns~LÁ¡@\Á: Õò”ùÉŠ“·g�B$8œz|¼Ú÷Oi eã/ï»t�Gˆ­»†aÆãÆ/Ã0 Ã0 ãNѨéŽö:CÈ5¼è ÜóCmÄ*e� êæÂWãbú˜Ž}c“‚³ƒlV)­›vô†órû>64 ,›BÁÝõüÙø1^Îgû>·ª�HÔˆÆ@Œi-q·BÈŽ÷¸»O�\I±Kë' ž¢s[ÅÐc`­�“¸ Ô�¦ ,ç+ŸpøtÆô`ÄxZàG‚8�s‡fAM%µIçÊuš×Ô8h’ö†’‹úµ\ð)†ß o8‘Á³C'—tN¬ôØw¢•w# WRú …›P¸…ãš‹Yd>©)݉sˆ­—Ëwïôb—d7ߥkÜž/á†a†ñˆ1ÁË0 Ã0 ø;òÍú¡‰4MC‘49¼”ìÞÚ%§ì¨Ž²U?庹ñã9»šxx¬†õ»²øeûH/‰´µ¡èE“×*½“Ò.çÓ±j'ÿHŒý�C:f(Òa»ë}ÕvY“|A½ZŸ*xçÑ!±&T�e¨¨VkæóÇoG<{ù„ç/Ÿòìåž½xÂô`D9*RI/uDñ1¹½4 ƒ>«ƒ�Ñ.m°æ¾.]Ïï¥9Ù wßâ ùù6ñpÿoàêj*•”Ž0z 7f\Ì—SJ7¡ðFå”q1£Ô%õ™°:‰¼�Ì)ýiž£K1u0ôx½WìÚã5KÍÝuÕÓÃ0 c¿±3dÃ0 Ã0 ãVÑ�)S‘¦N) 5(Û@V JuJt�¤h¹¡À³0*&�ç˜ šs'19òúú]†±ÈEã`8a ry¶Æ˜» 0OÆÅ{•îÑ ¦Šj$††jbhR/b›Ìp0­}Z‹u¦ã�|›NôÊïåpD�Éñ$ÉyåHu¨‚J½¢Ò„@ljšuC PW�jÝP­§Lg#F“_:ŠÒ!Î%×—Ä$~IªC§:p~åz^ŠæŸ÷)#‡Ž-9·8\àëAÙL+ا1LBW*…'8)ù)£bÆ´<`2> ôS ?a\N—3 �Ñ<ª¹òöË3ŽgsÖË5ͺÙ�Ó²ØuåUî£^r­Îu�[ü)µ«ùº Ã0Œû‰ ^†a†aÆí£mÒAŒÄFiêH¨Óc í�ïƒ_I÷½_\U䲋 BéFû}(´m¼þSïj‡”ÆbÔîñC�´ñäÉSJsÈ[=_•ÝA󶆗R¿]øâÛaTxœaßÅgÝ]‹)5}ŸÖPC 6 ¡iÐ’à E\ëòJb“\ǮЕ�üø÷jçV'.¯n®{GJz¨�'ÐÐV‘³¸fµ¬8;]r|ôŽƒ'3ž<=àðéOžÎ88œQ”W:¼çA%¢$·WÔô˜\ã+’C¥O(ç;7À¦ØÕÕè’,n‰ä4ƒ)ñ`J�ëÈz!(±Q¤1?a6yÊttÀdt@YL)‹ ¥ŸPú1åt†9†ªàø«9゙s�9]Ÿ‚æÖ’]-{Q‹_´Þî½æ›tî@ù67™a†q_±+<Ã0 Ã0 ãnÈõnz-½åúŽc'µßõR‚“Tå+â’T¥Žjêа^ÖˆåÙ’ùÙŠÅYÅr^Ѭ"¡‚Ѥ¤”#GQzÄ»d–Á¡©mrþ`G$ʶ赽9]¡¯,8©dÇON¨iSb®Ó%6‘¦NëülRð¤ôŒ¦S&Å!³ÑFYðònLáK¢ÀH¦ÄµðúÅožÓ¬'‹äŠsÒïŸðž±·ãÈÝQÀÎ!eK�a†a\;&x†a†awB �¥4G"M¨×5Õª¡¬ ŠXæª&ùns$¦’6`Ô ].gH¼ÞÀÕÄ?Ù[1D¯r„t�ÌJ!%Ý‹Ú]ø‡ÿ•?ú£_ò›¿ùWø­ßú-ž?Žé^Ææ 5,9¥¡Ý]½#BžM‹ý¼.H™&Y÷JbW79CM¨+BS¡±Aˆˆ*¢±¯óõ0z\~ìˆ$ÑKˆ8�xqïqˆ4"ÍJYÄšzuÂòlÅâtÅñÛS&ÓãɈÉ4m£qA1*(J‡/®(qÄ%÷—#ßX2´ïJ”Z7›Ê@rÌ_c¼bˆ„ Aј„­õrÍzUQU5uÕPW�º <Z1–gŒ?1-)ý˜¢S¸Ε BtcêÃÀËç¯øìå[–§sŽýu¨aèð’ÁX½låSKj†aûŒ ^†a†aÆѧ=Š!ÒT‘z¨V5“z„hòx%WEDs¯ Źr"×ë®û)�él½¨5¹_Z‡WªÁòðkxÄùýßÿwüüç¿à‡?üßÿþ÷™Í¦64%zÑhÈße�]cÚÄm¼fsÈÈ{ÞûúæÐÙÈïíú°»s"@¼"Fˆm¯º‚,x¹.n/âÜ@öÛkë~²õ¿Ë2TRœ\Nzèq¢:Bh!ÐT�¥¬™Ÿ,™Ÿ®˜NϘÌFL§cffS&³1“é˜ñ´¤%÷—/W8‡Hö0n‘$z‰ôeìhSáöÎFÍõëF“ Õ4„:R­*ægsæg V«5«UE]7i½åxy°àåaƒ<)ûe1¢ðIìòR"Î�‡0‹¼|þŠÏ_Ÿp|ô–ÑhLlbWKRºÎ ï-/©f«2 Ã0Œ½Æ/Ã0 ã^]ìËõ½•¥ 1Œ ¸ƒR»÷C$ó<1F4@½¬k&«1ÓFñÑ�D\çîÒv²Ð¸’Ͱôµž,»ñ^N%z®Cȹ^"ùu%rbrxéž8¼†¬V+þÅ¿ø—üþïÿ;þÖßú]~í×þ¼Õ÷z¬“ã%sfª]Q�w)9è.·>ë 0)÷TðÜÔÐ=Ôá £" N j$†šXW„fMl*Ð�Ä.Éõ»:ÁëžÊ;ºHrVåT›¢]ê=7Õ#„\—ËCP V¡¡Y+ëyÃâtÍx<§”ã$t�Æ£ô¸t#�+çÎ âòÜïr=.‘VKÚ08Æ,rÅ M$4!¹¸êšªjuCUÕ¬—YèªjªºÉNa˜ù5ïÞÌ9{² ~qêqZàÔãµOjìœc2óâÙ3–ŸÆÑ›¯ùêOŸñN•õjEŒ×§\|ïXÓ÷zÃ0 Ã0,vg†aÜ›À†\óe§ÞË[x ã^ ·{‚àħÊ8ÐF©×�å|ÍlUëÁ§T†š‚n‘A\Pdë]ÿ'¹ñ^N$çb«ÂŽ›Ú€j{g¿æà¦2ÌxµOís||Ì?þÇÿßýîwøÑ�~Ä·¿mõ½l¶ìÔõ\ÿ)EúUâ•Ãë76N&û*ÌîÒ%¹ì:«ý^Ú$±+Ô1T8 ¸Î¦ÛC™µD$u9‘î³+³äD"N TA b Ä*RÕ‘Jˆâ¼âÙÍåð¥g4*³èU0{ŠQ™Òz‡óïââr].¬JªÍ”ÐB¨«: ZUÅz�D¯¦nhš@SB�Sƈ¨Cp,ŠŠ“£9'ÏÔ_ˆ‡Çãqê’ é/Âx4âù³§4uÅW_þ)ÏŸ?£®ÖÔÕšôâ>séY�Íí†a†±�˜àe†aÜ=z3—œ‚‰^Æž0ˆ·ò ]úœÀq—¨«}#8„ ŽÕºaµX³^TÔë@1)òç)õ!9\¹]�%Õ~o£]×ç¦ùéãëkÝ‘aSìjëwÅ]P„}šlÿðÿ+¿üåó¿ñ—øá�ë{Ùbb ^ƒz^sÏÎAÅMÝj0û½më¾|  §§”êOÀiDhS® Urwih�pDD.J4ùa…œ¶M°ÝQ—Þyö1¯yÿœ,Ièü¢�J’½@‰xDBªÁEꣴõ¸4%¢�‚‹ˆSêBY >×óJ_}^oÓÖ¥2lëxAW¯KU’ë7jªÁ™…¯¦i’À"!„¼fª¢à¢§½Ù%¬•ùÉ’Ó·g,ΖÔËŠ‘Q”NÚ×9¼8Ä ³ÙŒçÏžñòåK>{ýëÕ’ùbNÓÔ9Äì"Á0 Ã0ö¼ Ã0Œ;e‡¸ÖKÎá{™èeìºÓ�óïÃÝ�‡�Š7"ˆ:PÉ) –ó«åšjÕ0š–ˆ¤$»¼úÄTÊv­úë½J?~d-5�v®[éÅ®üU#�"ol�Ÿüä§üâÿ‰¿ù7È÷¿ÿ—988°Éèñιß+c4§Öã²Dyí|t3Â׸,¸iQíÎ'¤ál£ .»¶$âb@CE¨V4õ*¥3Œ ¢qÃѵYa-×cûØ5tkÖǼæý³_ÏÚº‰i-tÇZÄá�˜\Ós]«$ÒF#“(ÖÔ‘†NQ—&|PQ¢Æ®n˜t7A¸­ó÷v…ði�H9?Ó×NKk»ˆËiuP$RÐZXž®8=>eq2gµX1P¸ï|Nåè’èåÁ�'èaäå‹—|öÙgœœ¼ãë7oX¯Ú*mú¨§'Ã0 Ã0&x†aw~qv“!Ó+—×0Œ‡À–Ó듎ù@mÐÌ�:š:²ZÖ¬ëeÅhVâFE®å…:„Hìîü×n>iËMÉvdñSN–¥Üçé÷=?ÌADÍή¦Mgø¸ÒAUUÅ¿ü—ÿ?ùÉOøÑ�þ&ßûÞ÷( »Œz<Ón’Ö;É!×ñ’ÁGP—&Ÿ<íè-Oº¥wÜŸÊŒ7±èh7×·ÓºCq¢HˆhlˆMMS­ˆõBYìr]Ãþ}ä=ít™K/xnXñc_så¿(ÚIO­Ðª€—ú¦´u.}r·‰¢DbtD"Q]r€ÅäþŠd÷WûO“à[Õ ²Ø• ç~.m}-@RѯNštÝ#ɵµ\þJ^›³s8Àj¹æì䌷GǽyËt<ãéÓgùõškˆå÷Ù:E IDATšŸ®`:�ðüÙ3¾øüsŽ�ßòå—šêx…HˆáÃN¦îx K}Ú.N Ã0 㺱+5Ã0 ãn·—±ô†Æ¾ Ÿ×¼—ý_—ï�Ä&°^׬kgkƳ’ÑÄÃ8 b¨ ÒßtóŽn„}¯ÜF—¿pô^›òU¨l¨bvxѺ»T¯—G1µ½å÷~ïŸð“Ÿü”ÿøÇ|ë[ßÄ9g“Òãš�ÓÉDNk¨1">Ò†ÿûŠ^·7"&#¿c‚¿î“,¹ãßOž^Xh ÄPšŠP¥ú]D"aãõ0°]Ð>*v}Hkë'|ömyF.xG¸§:t®û%âp‰âób™ÖϨ‘Ю¥ÒÖçê°lû¢Kj(ýŒ/*øýêѹÂé·WRªÜzUqzrÆW_~ų'ÏyrpÈëW¯ù"½³ôg Î;¤ñüÙ3¾ñ+¿ÂÛ£#þ¿§ÏY.–, š¦IÙ%ýmsŒÊ=˜QÌše†a×� ^†aÆ]\Ý]KøãcÂ,&z{�ìÛÇiï÷©æGX¯jVó«ÅˆÉá˜2¤z"$dáK>±QÞŸú°på#ì^9˜Å®¶vW Ú—,zÄüÑý’ðþ!¿ñ‰üà·yùòVÞë1œ¸H'#ÐÕðÊ®»“G6c‚—a†q»×ìwIh–AÄ0îÅŒ0x”Ò© Ú@µj˜Ÿ.™ÌFÌžNM �t‡wìt*qp¡¯âªum.;W<¢#Ñûº¹2*±QbѰ�¯íñN¤1F~úÓÿÀ/~ñŸøáÀ_ý«¿Él6³!½oèp†ä9­¡ÆâßÖ„’V6ØáËáŠóÑ^Ð{wá¼úéKîp¬÷µ·R)ªÖ­³Ë.êŠf½¢©V„zMlê\»«uéÆûè%•Ööc%Ýñœn¯Šnãæ/§}ºN•¶ŸëF峡�ÕI^Ãr\;v¢}Ýå·•$Å,„ÈülÎÑÑïŽ�9;=eT”3߉lm:QD(G#f3ž=Æëׯ9;;c¹\²\®°bV†a†a˜àµÇA ;Õ3 ãÞqËή‹.þm~4Œû4/ä°Xvx‰:4B½jXž.YŒx²<¤9ã½Ã'Ý‹¨J”xÎê̇‹]—¿¦�^öïtYw¶Âæ�û‚¤z]A‰!EcvxílÃÇ)~ÕuÍ¿úWÿ:§9ü¿þëߣ,ík¯/ªR¡À4÷Ä7Ä÷Öç¥7,vxUoèjðnÅ®~/b¿Å±!ÖõzI½^ÒÔ+4T8 8¹¨~׿JÞ±û—Š]»’ûm®‚½<¸;ÑÞf"Û«õ }oÒ>I‚×|ÎñÛ·¿}ËÉñ;¦“)ÓÉ„B²SM{ɹ, ¦³Ïž=ã³Ï>ãôô”·oßrvv–\â1ÚÜe†a�»Ûóë³¶°½çõÖ†q7sÒ}‹/ìÉä(¦Þ=Þ5mŸÖ³6M’º$¸D!T!×ñZ±<[1ž•L|IQ ß+QòÝþÝÐÖ­šTº‘`lç4 í–ÇíQ®º‹ÌYÚÍ%ƒ¤_9•a¨³Ø4en˯ûÔd’ûÆññ1¿÷{ÿ„?ógþ=¿û»?æÛßþ¶Õ÷Ú§‹ª¶”‘öXš D‡F—ç1—…¯vœè ¡ÞÍ,ØN/—ìø˜—vÕ¤’­š[BÄ hhЦ¢©VÔë%¡Z¡u±Áñ¢8í�a)µ!ìÃ-Oï«ãyù�¥k‹a½KĆo 玓ž½Þ·Þ GÁEÄYWgó9o�ßò§_}Åd6ãðÉÊÑ(¯Çùª"â(Š‚'OžðÅ_0ŸÏyóæ óùœÕrÅj½²yË0 Ã01&xíùµ™!vœ|›hw͸oCoOÄ.›Î÷¸Ú'ÑKÄ9$:PG¨ëeÍêlÅòtÉt6¢{Ü´Dˆƒû÷S o˜Œé*K~›&i—®å¥Ä‰ßÏÄOJ®Ó‚ ´µ»š\¿ëœ»«õ�Cþø�ÿÿïÿC¾ÿý¿Ìoÿöoñúõkk”=»°íç�6¥!š7‘TI†3ï ø Þ ¥wPÇÝ'_÷ëTð‚Ÿí¤bN_˜„GLî-mÐX›5ÍzE½ZÐTK4THlp.¹»œ€Ûò-íÍò/»X®Ô�åüɤn_,³ÓIÖ®“WqwõºÙûÛ>ÆHU­9›Ï9zû–/¿ü’gÏŸóú³Ï˜N§xçÒÍ'yßDR-¯ÃÃC>ÿüsæó9ò'Âññ1!ÖÕU»#Ì0 Ã0+vÛ¡ñ8¯Wíü×0n5ÂaјËl3àz–êƒìÚí¾,½ÃáÔApÄu¤ZÖ,N–,NT‹ŠPEh§‡ÏõG¤+éõÑÍ´ãEN-ÈÑA*iNJu¼\Jo8¨›¤Ýd}•êGWœ§ˆàµ½T�¯Ø•Ä)—UxAq»Ú])•a“Ý]KªÕ‚P¯Ðf�R“8ÖUM3—×Ç­ ïŸÛA¶S!~MrË )½gûΗ¥bŒ¬–+Þ½{ÇÑÑ[ÞqxxÀd¥U^µClP”¢,( �/<£Q ¢D‰Ùö(;Çvʦ wgÇ ¦þ)öé÷ö¦�œ?êÛ_p©ý4U¼BѰÔ”. ù�g¢?ú£_òË_þñ­þÍ““S~ö³ŸsttÄëׯ˜Ng˜îõ0G“l�‡]óMr‡òKÈFò¸­ï™»„ÿôߎy· ÷ÿŒCÎçÃÓ ß¨v_‡®.G„Ø urv­g¬g„õ‚X­pÚà x4ÿ EˆÁkó�^茖‡Þ3oó#Èfú”Á‰ÈE¢ÙûâL"’-U¦Ó)“É„ÉdÂáá!ÓÉôü{d×Y�¦i¨ëš““NÞ�c¤ »SÌ0 Ã0Ù™ºˆ9¼ Ã0ŒG¸æ¯Ñc{ÕŸ‡–ëlû\®›•\^1Fšu`u¶æìxÎhTPŒ<ãÉŸßDp@çÒ{HÛÝ}å|Œ¿»pãGу„6•¡ƒ›@¨� Ü]V½ëSQU~ö³Ÿó_þËÿÃßø�¿þ×ÿÖ0ê"ZQ•Þ±¥¤ù'fñFÒ&ªYYÑ­ O®4.3û{þ!L5䩿ü“ù³véð´wh‰FDÚT4ëõjA½ZЬÄz ±ÁiH˜(NÓ1’.­¤ÍW7uÞñ1m{™è%Y¼Z¯×œœœðÕW_ñüù3>ÿìsž>yŠ÷ï}N%ªI sŽÑxÜÕòzñüOŸ=%ÆHUW„`ÇË0 Ã0&x†a7ÆC3´5ýÔâ!Æðàú³ž/nßVóJ)Ár‚ЪÈüÝqJ1òŒ&%S1ò¼¢¦:>§³’]bׇ‰^¥í]ÿè]îÒµ¿ YèRºMg¨Éݵٻ°àñõPUÿößþ_üô§ÿ�ÿøwø‹ñ{]Ê.ãá ¦~L¥< &ÁKsý?I©w�Ãkb\>€Zƒ['…ºs.‘”–PRÆZHˆh¨ëÕrÎzqF½Zª4u»4‹]�CÌxh¸œ—XUiš†Å|ÎÑÑGoŽ8y÷ŽgOž0™NqÎ�ŠÞ{¦Ó)OŸ>åå«—¼~ýšº®9=;í2I®?†`i Ã0 cßÏ+¬ Ã0Œ›â!ˆ]Ú4†ñÐÇÛ>ôç”Ò(Õñrâq8D¡R§KÞ½9áäè”Óã9ëEEl@¢$wE›Ý�üUIêŸ~ÜÌ䤨Ó~"ƒ¯©íJ¬’³+Ö¹vW6§lßÍoÁäëãôô”úOÿÿèý¯üÁü!1Fk”w’£¤Ás=¯ÐoÙ"):tzéLÒW“oî{ ¯ó%eçgkS:I›�Ø u•êv-S*ÃÎÝj$¶µ»†imÝ£Eýƒ”ªB`¾XpttÄ›7o8>>æô쌪ªòX¼¯H¼&ž›}ëÁöÝŠ)ËF»·bWJcªØÕîŠ�$‚éð(m‡ ö,t5¼.ãä䄟ÿü¼yó†×¯^3�Mïý5Ùãžgepí¼9&${Uûú^ÒK¸�qô§oüññê^�qèö\4øüznFêÝYʼn&¡+Ô¡ë”Õâ”z¹ Ö+Nžˆ—ˆ—ü{•^>ô3X ¯Ú)éÓUîØÎýŠÎ9T#£Ñˆ'‡‡L§S¦Ó ³é¬wpçš_ˆshŒÔUMS×ÌçsNNNhš&¥çô:µ»Ü Ã0 cÏÓ­†—a†q# Œ>¬˜�]ö{7�[��;L5Ô§6ô¨ø M Š5gïæD H¡�øS?—©–W$lµ… ƒ×ð«œk´áä {Ù;†¢hŒ MLή*›�sb×f.21Õýˆ1òóŸÿ‚ÿû?ÿ~ðƒßæ7ó¯ðäék˜{zæ0¬<5 ¢'³WDir0Þ¥!#¹öPç2ÑsÂÏ>žÇD¶Øå’LW÷¬uÊ5õzÅz9gµœS-çÔ«k\lrÝ®Ø×ûÊî9ÑÙ¥öúœDåb_•ˆã õ UUÑ4 GGos-¯ç<{öŒð"⥑5ÆØ* ¦³Ï_<ç³Åçüé—_rpp@µ®!@“Î/T6Ó†a†±˜ÃËxÜXG2ŒëVú€‡—9¼ [ïî`×d3Qžl&»Ú¬ñÕª”¨q‚8Á9¡( ŠÂšžï³­”|²ë¡lÿ!~eöçx1ýìƒðnšZwïE‘ï=ZÙaAN™œ]�Њ]q8Ïl´Ðù†{ÀÜ7‡×�#üË_ò‹Ÿÿ‚ÑxÄ«W¯ðÞÛ‰^£ñˆrTàÅá½CEQ‰¨‚“›I4ÿ™œRKô|ˆù\½¯&vIû!„îãæÈ z—F%Ö)…a³ŽÄ:¢4Ò±Aßq,@xëœ��ñÏÿÙ?ç'ÿþ'üøw̯þê¯â¼•`¾·'@š,U”4÷!ùŽÚ´n"ˆºóñyÅ]?`N‘[™_>ì¯D¹è†³RÛ|)¥¡×€h@cM¬ÖÔ«EW·«^ω¡‚Ø pqÒÖîÒ­]– Á«á…Uy8®è½By|´7bk®V«oß¾å믿æ‹/¾àìì ¡, 4‹^šÇ�óžÉdÂÓ§Oyñâ¯?{ÍÙüŒããcTµžÙLKzyŸ°<†a†ñÐðßͯöê^îyÁ‡¿ÇÌ0îäêÐ0ºÎ#sxû¾ÔÝeÇÑ÷�×ÉŽÞ…²:cDÒs”Eˆ1ýÐy�8‡‡÷N‚kˇlÜ Þǹ6G“æ@i›zëóÙ¯òbòÙ•Úí¾ˆ]ڞϋl´­´?Œ‚ºš]IìÒ,võ¯¶M÷ÿM<÷Ùáµ= ÎNÏøùÏ~Λ£7¼|ù’ÙÁÌ ÷qžÝ•U¤¯)%nÃÏ*]=/á¢dorÑä¹õú¯Ž—ü¿ç^òÁ¡zùÀŸ\ôþ»Ä®~�rÚÁÁæ‰SÝ®fM¨rÝ®ÖÙµüužL^lµã¦ïBD7ÞSomŽÑóß ãìÃÏ¢¤ôŽ*Äb­4ë0pvi»¶Ü`ʹt“ûÂC¼Z¾þêk~ú“ŸR×5¯^½b<ÛÄöN(T·ê ". õçÒ^\¨³1cêý¼‰WÊn-�–NåÎzl^9»r‡¯Å.?Ý*”¯yEµ‡×�©óyžó‡ùøÃ ,,, µÌ÷ºy§ÕþX‹Bž‹ª–¿ÜÛz~CxQ ßÑiÆÛ6÷òí¯J]²e]rSWç¼\æ4ƒ vùWÙ–•G)fn)ˆ”n-ïÀ•¸bB1>c2áýËåª<úâRAAnÀ©Gíð„�ñC¨\§%‚ÔácÜÖá9½^ËÙunýÅ¥V^UV�V´ÅžÒ£WfàÁ–g=ƒòº:A« Š¡]u"ž.|­žÐû–˜¤HLç%½0õ~ÞÀK W«î§�j�Æáq¥î®Âár‡w!ÆP]ð% ½ÛÀî³]þÍ¿þ7|þãÏùò«/ÙÜÚ”•ò^?`OëkØE+_—' ÉS-T=C[›æÃù44õªù[—ï§�$ºð;Å­ZÔ½ºPæ_ú7tíæªo>Ìír¶À—9v2b<<&žQŒ†“!Úæh_`¼%R¶yŽFÊó?ä•©‹N¯¤äyÕv½Ý¦§ZpáçGžçÑívÙÚÚâl8$MS¢(Âsá-L’$c‹‹,/-q||Ìéé)£Qû©}k;xÅcoë8+Î/AA¸™ˆà%|¼HëÏšHKG¸N…Rä½>–íýnó겟ÔM0UÅz×t”`” Ь¥;†*#ÒC4 ­ �¤‡61xnªmC«Ëû ‚©0W檉3^Õ²½hÕ½®ÿëâùÈKžÁ×k`ö`2õwéðŸÒa]yÀ¹°úœ¯òýwÄ/©‰·‚ÿñßÿüÃùÙÏÆoþî7ÌÍÍÉ{÷îÏæš]ÆŸsµå+ïl¨3¾Ž÷‹PÚÇj5³èüÎç/Ýg÷S¯Ô%uª]IÔ +Íô|Ô· UK‚»ZàšÕâ§÷ªÅ)íJyŒ¯fwÙg ŠlB‘�ÉGC&ÃòñŸOPeÄ.lus3b×uqü%"Þó¹Â߀½A½É»r.^²ú‡µ–ñxÌÑÑîï“&I#z…û«FHÖZÇ1sss¬¯¯sV9½†ÃÖ–Xk«‡¨7Ý|äj9AA¸¡ˆà%|´¼~Ä’ ¼ÝO…"´ÜŒš ï… Ûü{^žË~â5à*óU%z9EHp ñ†ŠçåØâÊ£ Úkzé,&˜4EQ¢°avŽ+qÊb•CùÐLEy<…ÃyÏ˲üËÝžfó*ÖÔ÷l®3o_žïÏ+.]YÓ8 d…¦¹V�©Ö�ίF×Sç ի ïn,EQð�ÿ÷?òûßÿžß=ü?ùéOHÓTVÌ»:‘›Ù%ý9ãP%®øJTw•ÛË{ÐŒ«f F-‰©½+^&�µ©ýO\é ó—-ç%¯ ž5æÕT´Sx¼W3®1uî�jfiÛ‘ƒµ«Ëáˇíò ÅxÈdxÊdæuÙlŒvÆ•heCì!áqZ]Þ®ãÀó¡j·÷\¶õ·Þç“ñ˜““ÙÛß§_9¸ü%n?¥T¸¶¾ÎÉé);;;1™8JW†D]m¹^Ô+AAøPÁKá&õJ¤¹(ï… È6ßbf„}óS]Ï㪺•�' ÷vŠÈ+:¦Ï\g‘ÅÞ KýU:ý”Âçää.#w%|‰Å¡”Å+�RÁí¥ð5� S3ëij÷W®Ð«þõ¢×Z›×.ºÇfçlª™ÁU}§ ZŒ‰ˆt^—5`¶ðøÒOc-¹Â«&5ðÖ2Žø÷ÿÛ¿çŸþŸâá7ùô³O›È/áÝU®óûþ´šÕb˜«Ì(•ÐîCÔ•Û ¥[sµšpÄfm?wd`*U]܉ýkîØ¾¥fùÖ 1EUšzÒê¨Aߊ th,ÊY¼-°EN9QLFdãa#tQL0.Gû©«Ë¨Êæk)Ï_Ÿ³FjÜ-85imïÎS”eãòÚÝÝeaa�ååe’$ÁƒÑõ>C3Ó°×ë±²²ÂéÉ +++ã¼#/òjt�ªÄ.±l ‚ ‡‚^‚ 7¨1"î"y/A¶ù/míò2€óÁ°D/*B)C¬#æ»VÖXl°:Ø í%LÊ1ãrÂ(?Ã9 ® ToKœÒ(b·¼²hå‰urN :g±jfŽ´ïâ¹"9ìżàþ3N3?ûÎÕÎ.UÅ*¥0:ÂhCdâ(C5Çàr�/Öz¼w\íy—Æßmg÷Ù.ÿð¿üùã¿ä«¯¾bcsãÍ㻄7*®mÉ©iÝû*4лðչʵêpÆ…ˆCãQ* ®Ì:ÎU…"íg¢±Q(\k*•º¬Ê¿ú^=3Ê]aX-ƒ÷èÚÑÕD4z ÔP èÊ¡å]I‘O(&#&ÃS²Ñ)ÅxD™�¡ B—j­Z' IDAT¦º)K¤ÀÔ¾5oCi­ëd;þ`ñdU߸mY’eÇÇÇ<{öŒ¥¥%676èv»t:�a_)…1†^¯‡Öš³³3VVV888 Ë2†ÃapxÕÛ’w¯wÔ“C¤ ‚ ÜXDðA¸9}‘é÷ò9^Þ AøÈ¶ù™?}^Dšé,ééBC¥x‡“&"Mææz¬/o²½¹ÍÆÊKó«D©!.GDÅ£c"“’Ùàô*|ަÄy‹Ç‡ šY—™Ÿ�óµÛâb ¡:oï¸ê…Ÿÿ^µcÌZ³sb›oZaV—V£ƒ³Ëèˆ(JˆLŒÒŠH9”Ó”©Ã•.8ÛÜëNn#ÿó¿ÿOþô‡?ñ³ŸÿŒ_ýæW,Ì/È[þöªè+ÝcÆ³å ‚Wc «£h]Íör¨Ê3¥¦!ƒS¹ZaÉ£ð¾í«ÝYÓé~Í^Š»¤>´þ¦Ÿº¸4TN®P?U_¨ñAðÂã\�-sT1�|Œ›ŒðùŠ Ê•ÁÍU¹Átkf„øGÕ¸pÞäŠá¦ãëØÝ+~v OY– ‡Ã0Çëð�ã“zý>qÇq#`Õ_ã8F+ÅÂÂB¼ö8==åèèïýôvÕqYA„[‡^‚ 7±g"È{!á6?;õÊ_¹€žiO8Ä)œó˜ÈÐïͱº²Êö�û|öÉg,-/ÒŸë�ñDeBuéÄ}²r¨1ʇdå„ÌM(}‰'ˆ^‹¹ xÍ.ÛìLœ‹Ë|~ÎÍôßêUVÄôyU=›kÚ´öÞƒ B¥4Úâ(8ºŒ6ct„V¥4J+´�°]�·àÝkÝT5»z„€z¾×?ÿó?7ó½:�ެ˜·V@ý•÷8_1š©\Þá]åüòå J‡ÕW¥4³!‚Óç0x¼Kí«�aŠÆÕs\»8K˜�8ýZËM®‘�‚ƒ«ªT¹À�·(ìtvãs¼Ïq>'r9Æex—£\�ò%0ÊW�sÕa}ÔuªžqèåíƒÄ¿èØãkK5±†0??O¿ßŽ­°‘‡‡x�V Ç!Úpy™ÃµUöö÷ˆ¢ˆ²(±ÎÍîþ%Ë!‚ Â�G/AAá†Ñ–Ô…Ö“÷Í4— …ÒiÚeii™­Ímîln³µ±M¯ß%ŠÖ[Tó—Æ]r—cÆ18…Í=ãIFYºÞ¥=Ê(°åêH±Ð0nM´™‘¾j)Êϼ†ó3|.oÒ¾PóªºM]xÞ{¼õ8þ®1¡‰mTDbRŒ‰ÐÚ 1(LåþRèÄà:ï ,-eaqÎ6s„„ŸñhÌøßÿÿåŸþ _ÿîk~ô?’ù^×P©.ß«/qª¶æó]”Ï+¡ªqxÕâ×Ô1E%`‡9ƒ ¯ê8SG¬ÝÈSq„ºµXÓ¿¨êÌŦÁ¯f}æuU¢™ªfs5ß×bVåîÒAMGy ÕÍT/å P%J9¬v”ÕÌDK X •x¦\�f+¹é©ÔJáÃÞ×ÔÔßXägggsppÀ`0`0077×Ì𪯊QZc´¦Ûí2XZbee………ºÝ.cƸ,§=ÂËÏî ‚ ‚ ÜBDðAAn µØ5•”|¥tµýVxÐÆ�&)ƒÁÛwîòé§Ÿ±¹¹Å€86x_¢¼Æ{0Êàp$.¡Ì-ŸQ 9|~Ìp2íБ¢ÓMà�ÆÛz„Ž Žƒ¦áê[™…Óö4ô°5çkU]|~^æRçZ䜚Æ-9‘Ë[W} ͼ8VA¬ÑD"4­B Y+�ÖaÆWÚéŠ"/±eI‘X[ž3z½<žM¸Ýì>Ûåßý¯ÿŽO?û”‡ÿ��õ ”–ïõòrÕE±¼57ËyPõ|/‹ÕU ^õ÷ÚŠØ(:ÚáU´^…pÁº�ß\$àf—ï\–m3ÏHÕËæêêb«¸B˜ [ÊUn®Jü ÷ñàJ°%‹Q ±D’Ô Špˬ&/ÀYb½GkÐ*Ô>U-{]|¥*}Ì{“ªÄ(�u–¢¢×óçÏY\\duu•…ùy¢(Âsa[‰ã¸‰5\YYayi™CuHY–Xkg÷T_M“’(‚ ·¼AnrY¡ ÂLAl \ççlxï‰ãˆùùyÖV×ØÞ¾Ëýû÷Y]]a®?xÊ2G¹¥ÎGxeYû1äšÉIÎÁÎ'ÃcÐŽ(6ÌÍ÷¡PXãÐF¡´Â«*BQùVÌ -çA½\çb}k"—R3N/ÕÜ©Õööà½Â;_õº=αËW ^ΣµG9�Qo=Úk4£¢eHpw)¥QF…9_JSd9¶,ðÎW./i%t{—÷üñäÛ?Ë/¾ø_|ñ‹ƒEY1¯�ºÆZ§hÍô­Úçƒ�¥œÂ+‹Òå ˜j^–ÒÄÚc\ÆãÑD/_mjQ¨cõîÞLÅ:?ã«Y¦J¼¢rZUâ›wïJ¼+ÁxoÃr«P“"Eu¿å‘q…Á�jPiE„.4äŠÒUOù$«Àµu÷j¹gVº”¬�ö´À9GY–œ�Ák0°½½Í$Ëè(uÁµª”"ŽcæçæX®\^Ë+ËäEÎp8Ä9W}ëX(ÈAá¶"‚—  lžxùŒ%Âûà=Öž‹-¦ &yïAépµ¥.ùVT‘Ö†ù…9îÞÝæþƒ{lmm±¼¼L·ÛAWMÜñ§0˜Ð(³eht�Œ8x¶ÏþÓ=vö99;Æ+�Ž4§Ý3²aŽvaþU}ÓZ…±8õ(�*ñPµ¿‡êW§òjæE‡™=€sU“¯„®–Èe+áËM‡ÎçÖ[ JЍ¤ˆK´Šˆ�BW ©ªHC…Bx:ÝÎZœu•ÃË7 ?áãÂZË?þ_ÿÈ?ÿÿÌ—_}É¿úÙ¿"MSY1×zf×>É»ðíLœùyµV;³Þ)<å4J‡bdó‚“½'˜8E™tÚ€2U ¢B£B]ªUúÆÌ¥fGÕ®R.×¹œ-«[�+ ¼ 7�%1ŠÄh:IŒI"t¬¨•Ç(ÂM+´|ãó˜26à4ÎÛéù¯R(_M «kksdP×wБsí[v‚2ÝF�sŒ'cÙßßgŸ……´R¤iŠò•Ÿ±ÚžµÖ$iÊÜÜËËˬ¯¯39Ø? ,Ë–Ð¥dãA„[Ž^‚ 7³%"¢— ï·½cZ&§ÙX?µ‹¡þYÝŒÕÚw×ÂwïnóÉ'Ÿ°¹¹Á`q€‰T㙊šÆ/”®Ä–Ž2/Ÿ±·³ÇÞ·Ï89=Á)Za"C1.ˆˆ º”©¾jEHS¡¬¨±úgÕM�srѲ(ø hÑÄV"—¯" [b—s>˜+ª†Üìè>Ì'#Ä–yIl,:Ñ-Á«»TpNhÑítQ(в ϳ œÙÐp–§�“ñhÌü?þ#ÿõÿý¯<üæ¡Ì÷z›uÖÏ–\i)öç+dØ÷½l~lدmQpòü1qÚÅÄ)&NÑQ‚61ªšé§t-�U5áœÛÔWµÕ9W ð®ªEAäòeIYæ”E�-2Ê"Ç•9Îæ�8§1I¿‹Ñ]"£ÐÊW5Çc”Âh�Vàc�Jc\SL"¼-(Jf$¶¯ ¨nuMò>Ä^‹è¥DÜ¿Mx?+;ç�Çìíí±··Ç`0 ×ë± h. ©ï«”"Múý~¼ÖÖØßß'Š#TÞ:VËœ8AA¸õˆà%‚p“û!"z ‚ð–ñ·f¦±€ažŒ¢Óé°°°ÀÆúwîl±µ¹ÉÂÂqWM«jöLËÔP–%“јãÃcöxþl�“ÃSʉ…¢zveéÂÜ,çÁyœV`ÁiU9º‚ÓkêðRèHaŒÆÄ†H› ¨©ØÕn.[ëð¶Äž²°ØÒ5î-ïƒÀåj·We¼j»>šgòªJsYÁ$š™×qh]¹Ó“„o„¯(Žè�Òítȳ,4·}ˆJn Àôý~×§{Ï÷ø·ÿðoùô³Oùæï¿acCæ{½•÷¸Uü^85¯7:;#p{èmÉødŸ¼º¢8EG1ÚÄhUó¾ôT�g*zµklí­o¾qvY\Ybm�-ƒ»Ë–9Ζ`‹W˜Æ$.ÁEƒÂ™à.­c #­46hRl‘Sä�à&ÃS”~6"Ö_¾î”¯~ÈÁÌß # ðJ»Œj}.òáˆj­%›dœžž²¿¿ÏÒÒ‹‹‹ ƒpükmãõ÷Iš°0¿ÀÊê*Kƒóóó”eÉh4j„1%W}‚ ­F/A„Üiúò¹K„·ˆç¶Ô?�»RŠ^¯ËÊÊ2›lnm±¶¾F'í`´n†c)êtÁ ¹Ò1<²¿·ÏÞîÏŸíqv<Ä—©GpYa«YZ.¬_ A•+@©V§ZQI�� s²Òˆ$NZéaU­2 WP:‹Í=en) ÛÌ$k÷b}ó�Ÿ¯3{¼ðÎS%ÙdBš$زÄhƒÖ ­Ô…¶nd Z):�.E^`­¥,ËàîÞÿ–®˜6ßúãŸøóŸþÌ/¾ø%_üê ––òƼ­>O{‚× Ï gïW)?Þ’�QptÅ ÚDAìÒÑL檪¾j=�+ØfVðªE¯ê«-ƒæJ¼µxoQÎâ5XŸPª.U¸B£L‚‰bŒÒ(*Ñ ÐJ£#ƒ1 [v(Šç,Ö–Xk©ck¯ž+¨*ÑKÍŠÃÊ¿¢~åÛÃ…Û´»(UÅ«æ¸W£áˆýý}ƒëëëäyN’$cÐZ·Ÿ€(Š™›±†KËË ŒÇcÆã1Îç¸è]‚ ‚p»ÁKá†÷Aä㸠müÛx>uý u=ý¢Ùg© qÇ +ËËܽ{—í;wXYYfnn­uÕà —ªÄ(k-Ež‡!÷»Ïyòýcöv÷8;’gÊkŒŽP4žjúÇÅ×çý%ëÍz¯¯A9M¤b’(­ô°ÐlÖJMçti…òEˆ*´• vÎÅuÙºP¨‹ÚßÖZò>fxvý>�n·9–ÕÛ½ÖSwø`0`eu…ápÈÙÙEQŠØ%‚ "x ‚ Ü`ä㸠—Õ„k­ ?°¹óöÆ ¨]§ž-£”"IÙÚÚâG?ú÷ïßgqq‘$Iªž±o„!]¹Áм`8²¿·Ç£ïñÇù#{ûûäYŽw>Ì»Ò*˜*ÁG�‹!¤5GæÂ;ãx…òMD¬SRÓmú²õ¼œZðrÚ£‰‚ç¡zìÌÛqáŠõÒƒƒs–¢€,›0ž¡DQTE;µçMÿVǨ~k-“Éçj§—GF™Ü€}þ&\ù"ÛÀ»©îWÄøµ§l©sÓ½Úõ"Õ>ø¾” ‚½+Ýe®y–ÙçQœ‹ôUüi5/kú'êçñƒÊÔŰšÓå-Îæ”EDžEt’Õ­ƒXÕÌ;¬–W)EG�à•eʲ (\pÙ¶§9^*Àû™•Ôˆ^rvýÁÓ½ðPä9GÇGìíí±¿¿ÏáÚJkâ$iîà]°lÇqL¯×cii‰õ�uNOO9<<$ÏókßD¼lo‚ ‚ðÎÁKAáq£â[©~?„+ǵ¨ @9ïš_c˜ŸŸg}c�;[[lß¹ÃúÚ½^/Ì®ªJJMc��g‡G<ÛÙeçé;;;ŒÆcʲÍX¥ÑjêÞòW¾¸V«Ø×Ë]ý‚»Œ2D:&6ÉôU¬aYX¨�AùJð¢5 ¤å\xa¯LÍŠdA¬]^c¢("MSŒ óÄóCíôPªĺÝ.Ýn§‰5”hÃÄ{Üß•Rüâ?ç׿þµD¾Ï÷Û_}—z—Žt�µaûî6ËËËôû="5�Õú¹´ëeYrzzÆ“'Oøî»ïØßÛg<SEÕû­aS‡W£,úû5�¼à­˜ùNQ‹^¦}ªíi–Íæ|i¥«É6íl®WXQWü«v·•eÉd’EÁ=Ѹ¼Œ ±dÍýÃwZkâ8¦ÛíRe3KGb ?n>ûìS>ü[[[�x,¼µŠ:-/Ùç¯B+×Xµ¼šÖ0ߪ¥�Åêž²]ãUP·fÅ~5»Œ À9œµ”ENQäyNdtSƒÎçÅ)­1&"ŽbÒ4¥(Â<Á¢,ÑÞјxšxO©I¹íN…‹bò<çlxÆþÞ>Ïží×ò2ÆDÍÜÏzV:l“sss¬¬¬°²¼ÌÒ`‰ÉdÂÙÙ6³(]ÏÝô¼ñ¡P²éAá½ ‚— ‚ ‚ðz\“³«yº&㊋³©ªxA­5iš²°°ÀæÆ:÷Ügss“Áâ"�N'ÜÝû¦±¥ ½U[–ŒÇcŽŽŽxüø �}ÏÁá!Ù$Ã^ <ª•ï¥Ôì=ü•¯ÚW"›®n­LhÐVbW#(�V†j)©…µK×é æ8© ïIhÌÕ.¯,‹˜L2â8!Š¢æ)¦bW½\AðêQ–a–WQ”•[Nœ^«««|óÍCþâ/~„1FVÈ{E½Ò= «ÚÒCê’ÂÑ®C¯ñ§/<äRZøcÎYв Èsò<ïÆ˜Êå5{_­­‰âJð* ò"'Ï4Î�«kÓZ( ‚p~» N¯¢(�Fìïï37?Çòò “É„(Š‚àª¨â‹Ãvh´¦×ë±¼¼ÌòÊ KËK ‡C²,#ÏóÆ•XYee ‚ Â-B/AAá½¢üt†LÛåå*±E)EšvXYYakk‹;ÛÛlmm²¸¸ˆ‰LãȪc ƒ�Îy†gg<þœÇ�óôéSöööO& õÌ|š@)D¯W7µÔv‡pSJ7B’ªŸ�V¤j¶ù /þ[j¶w}él­V3¸žwV7�1MÓïªfwʲËd’Q–%E‘S–³³t„—n·ÃW_}ÅÏ~ö¯HÓTVÈû©†p™¯®(9í¡«æ¼ŸNék„í&-U½@²¯¾^–—ø îÓúñÖ9TiÉòœÑxŒ6†8Žˆ¢G]£ýtÞ¢c4IšÒ±–,ËÉ㜢,q¥Ÿ‰`l^—Ô$�é…õ×¢(89=aoo�ÃNNN'—Öç–ã]Rã8¦ßï³4°¾¾Îp8äììŒñxÜ<¯lk‚ ‚pûÁKAA¸qÔÎ.¥FºÝ«+«Ü½{—­­-Ö×7è÷û£«Aô…©æP�ž�ñäéS=zÄÓ§OÙ?دœ`afWÝtuÎ7‚Q=xÓvôÅ&X•˜TÝZëª7uUÔ_ëx/¯&¬©iÓúew ¯ÉQes…{§Ó!I´ÖáoOWtk–NеŽn7^Þ»*ÚP¶Çc ¿øÅÏùâ‹/dN×�@½Ù]šø ©:�Uµ%ùÔ]Îm§i¯/t†ù&*Õ㪺‘çãñ˜(Šévº$‰ ³»ÚbWµ`ZÒ$Á9Ëd’’eÎ;Ê²Šµ­¦Yqz 3ç áû_|J’$rttD¯×£ßïW¢„Ÿ®rEý~ŸÅÁkkkœœœðüùsô±³,Åá,‚ ·¼AA„‰÷ÇÝn—••îlßáþýû¬®¬Ðív[1}Õ*W•÷ŽÉdÂp8dgg‡ï¾ûާOžrzzJY–�ûªn’]%èEÑÄ%64}Ö«®µËKµb §JU#|µïþª¼ä¾u3¸êå5ц“ɤjû”o¾yÈÆÆ†ÌéºÅ„y„þMK/ªh¯öà:*µªAxÊJôÊòŒ¼È‰Ë88Mµ9WwFkT‘º”n·CQä•KµÄ;/ó…Ö±:tй0Ëk8rttÄÞÞsssÌÏÏÇqsÿúا«côÜ\ŸÕÕUŽ��YXXàèè(ˆ®N/AA¸�ˆà%‚ ‚ ¼W^ÔÊŒã„ÅÅEÖÖÖ¸»½Íý{÷X ¦ñ|çfQÕͬápÈÞÞOž<áÛo¿åéÓ§ŒÇc¦Ï4 éªfjYÚ—,ùå-âY±«}ßéïƒ87ûóëÆ9OY–dYÆd2&ŽcŒÑÇ¢ jGZÇôº]¼÷äyNžçx_âœ8½>$66Öùúë¯eN×B¬P/¬±/«4þ<¸òÆ¢5Mh¢s¶šÇ•“å9I’V³¼tõ¤µûPšH…í°St(Š"8T³ λKÇ‘ BìUˆñu.Ìò�'óüùs–ÖÖÖèv»Á}]]�â™^€ÒëõX]Yi¯ú¢�¢(^mçAáF!‚— ‚ ‚ð^i®Ï®b¸ê(Ã86ÌÏϱ±±ÁÝ»wYߨ`°´D·Û ŽÀŸ—ʲ$Ï2øþûïyòä ÏŸ?çää$4¯ZÝ«ób×›Íê˜í„ÕW{™j‘íòÁ[ok}†W䜣,C°žãÇ!ÚPµ,aÍÔ ¥ˆâ˜n§Ã¸Ó!Ï3¼‡¢p-ÁKZÏ·•N§Ã7ßüŽŸþô§Ý‹Âí/¤/û•Óçxy­j�(hÜ1yQ0™Lˆ£˜(2�Ó¦®T®ª�Z)´¿OÓIšObœ÷8?+èI ¡¶Õl ÍñÖyʲàôì”ýý}×Ö‡t:â8&ª~Åô1I’077ǃÁ€………J8_Ë2Ê0AAx·ˆà%‚ ‚ Ü|%Ðx﫦gÊÒÒ<àÓO?euuµ‰2l\RLÝIanLÆÉÉ ;OŸò/ÿò/|ÿý÷œœœ�åU«—žû‚ ‚p}ˆà%‚ ‚ ¼w¼§qwá!MRY]]åÎÖ›››,,,�Ä1Ú˜Ð窄¥ºsjË’ÓÓ3žïíñôéS¾ÿþ{ööö�FavWeägÄ..™åõCfÆ4ËVÇ&ÕO®ÎžMš´G_]ñ^GNètR”R!^LëÙ_‰‡u°,{EAžç8ç'¢×-ãóÏÿ’¯¾úŠÍM™Óõ!ó*ïm³›OËÞ¬¸u™–ðºµ_E†g¶eI6É0ÆÐëõè”Q¡µs—|¸§«g šÊ啤¤�ë,eYRúR¶ß�}¯]¶ý™CÞ{Æã1GGGrpp@¿ß'MÒ4mŽË¾Úö´ÖÄIB¯×cyy™ÕÕUŽŽŽØßß§,Kœs­mO1sâðÊ'Wî0‚ ‚ \3"x ‚ ‚ ï•Zèò¾š¯aó óܹs‡»wï²¶¾Îââ"iš6M'UEòÕ•sŽñdÂóÝ]¾ýö[ž<}ÊÞÞgggÁÐü­Z€âB£)4ʪi4J‘çÅk½Ž`:›:Ï.üòS¿�ÇÚm8™L#”Ò$IréòÕb_Çôz=Š¢žå¢¢¼(^·‚��u>|ÈgŸ}*sº>p^¹V©úâfjbý»ë¬éµè圣(‹ ¸�'¤iJ'MIÒt¦æÔˆP»LCý©g)yçqÞ½pî¢ðñÒŽvΑgCàðð�ÝÝgôû}æææèõûíd³ýׂìZ�¸··Çî³]Æ“1Y–Ὧ¢€ë�öš¢ %ŸSA®¼AA„÷‹Wxïð„¦S',--±½½Í�;wXYYa~~­õLŒaeX–EÁðìŒgÏ‚àµót‡££#²Iv®)$/ÿ¸ÂÐѲ¶|ó×ÔÌðò­+ϯê(¿h¶×õt¼w”¥%Ë‚Ó"ŽzÝn3ËkÆñV-kÇcÈóŒ,˱Öᜭœ^Ò¡»©ôz=>ü?ùÉ_Éœ®�„תUïH{¯E/ç¾ôäyÎx2&‡‚qœ4ËR;{Q •®â“&1Ë2liñvV„˶<çæÓ“©{Ûû¥yvvÆÑÑûûû Ò$©\°/D‰"C'M lll„HÄÝgøa¸`¤vˆËÆ&‚ 7¼AA„צ]ñC/xs»4�n‡Á`‘­­->ýìS¶67™››#ªÜG�먾)EQ–œ��±·¿Ï£G�øî»ï8<<œ6D¹Dèªþh˜/SÿN5³»ü%²¼®Î‰]¯¾fÞÊ;‡sP9ã±&Ž#ºÝ.Q7�çóë ž§Óétèu{8k±ÖUÍ?ÙÞóóó|õÕ—üÍßü5I’È ùØëñ-Ø­³øÒCY–…y‚Ú4qªMÕó¾™å¥´"‰Ò4¥( ÌÄ„ùK¬N/çü…XY">bZÅeY2�9>>foo�¥¥%ƒAs\‡þJpU ÐÄIÂ`0`<ñìÙ3æçç)Ë’ñhŒuŽs#À~øI� ‚ ׊^‚ Âu}¾ácÜñý+ôk.œj“ÒŠ$MY^^fkk‹­­-677Y ˆã­u#^é*Ðy�+ NOOyþü9Ožòÿ‚ ‚ ¼DðA~øçJùÐ&-þeÉ{MO¨çGˆúÓšfHüÖÖ?úÑ�ØÞÞfee…^¯‡RjêÔR ]‰2Ež“gûûûüéOâÏþ3ÏvŸqrrÒ»^¯0]æ��¯'&L½ìo½Ã:M,tXÏu´¡1æ‚Ë«q§)E7˜sŽ,Ë(вš©ãνR9(\ÿû¦øüó¿ä·¿ý-ëëkoà>dF£ñ­XÎzŽ`]wŒ1ÄIŒ6ºÝÃ̯PFÎ;L³,k¼eYVbW+b®q+™ç%T¼œeûÌÍͱ±±ÁêÊ sóóDÕ¹Fû¸¬µ¦×ëa­eue•õõuÆã1'''L&”ò8ïÑè x¥ÔKçÉÉüKAAx»ˆà%‚ ü°Ï’^Ü]‚ …àîpî>Þ{LÓëõXZZbkk‹{÷î±¶¶¢ £ï\hxV³¥B#É“å'•»ëÑ£G<~ü˜£££ª¥^,´âŽÔK<̨z žW*‚—Š^Áœð^Ú²Þ{œuEÑ8¼:�”$Išy^ç›rÚ§…µ–n·CQäáyœ•Þ[dkk‹o¾yȃ0FË .ÝŸoü2⛋Ê¢d2™4BV-vEQÜ]L…¬ºÕ÷­çxÕsë‹"¤ ³Ç\5ãö+Š‚ã“cö÷÷9<<äèø˜(Šèt:¨sók‘µßï3X°±¾Áññ1»»»ŒÇãéñ[�?�h ¯W\ $Û© ‚ ¼uDðAÞüä|háMë‡Rt:VWרÞÞæÎ�;lnn2??�i5Ÿ ZLY–œœœ²³³Ã“'Oxòä {{{dYVEZ½šú4�ßu5oÖDóÀf–ã î}—POp[äyÆdb�»!⩚çÕZÍ·Zkâ8¦ÓéRÁÝU–%àÞÈY'\ÍÜÜ¿ûÝ×üô§?%IbY! jÕÍ�U(T¥×:Äö&Ú°r—6³Û‘ªUômEÓHâ Ïs¬µàÁy7[{^æ<>ü}"(RÍödKÛ¸´88اÓé07?ßÄ%·©c|ØØÜààð€��&“ E^TÇ=AAn""x ‚ o„8»AxS´Ò ¡ßï³¾¯­­-VWW‡Þã«&TíÚª£ôyò8ˆ];;;5Wù¿z{ù]†ÃáëׯzˆŒºô7¥‚Cå¶h7ž§Ž 5#xË7ïEÅM´ažçäy†µ^\^×õ-ŠøÍo~Í/~ñsæçeN—ð*µjt;ΫÚè¼Ã—ž< sã8&I’™ºÓˆ^*|oŒ!IÊÒ’$qœ¡†)§ðο’sWø˜˜“¬³L&ÎNÏ8<8`oo�ùù–——1Æ`´nŽÓJ)”ÖDQÄüüd ê*"hii‰»÷îrïÞ=ÖÖ×YX\$IÓ¦!U£u°Ê²d4²»»Ëwß}ÇÎÓ§2�±ÖU}'í(Þì�—õÁ<7º?术¢ 'ŒF£ÆÁ¥«ùi33uãéÓ§<}ú”Ããc²<Ã97mŠ6�kÓ•Þ¤‰¬š5/¸ÏÍ|§pÊÒ’e£Q˜ç•$i˜çuIÌžRa–ÞÓívɲIx�Ç{{û6VÅ[¿(_)ÅO~òWüö·_±²²*}zá½ÕªQuœÇa)Ë’<Ë™Dâ8ž íº¦+—0¯}#x¥iÚˆÞ;œu²1/­ñEQ0�ªhÃ]ƒkë뤕«¹v6×5ÛC·Óa0°¼¼ÌÒÒ‡‡‡œžžR–ÁÕܽAAx¿ˆà%‚ ‚ ¼U¼Wå//-ñàÁîß¿Ïææ&ƒÅE¢(Âùi\UÝd B™g4ñäÉSþô§?óøñcž?Îp8œ^…”±·Bp*½®kL]¶ðêªÙ^ïÿjð¶wË9bÂTpäu;�FØÒZÏDNÖïk’$t»]ò<ǹ0Ë«=‡M¢�wïnó»ß}Í'Ÿ|r­NDAêëìþv‹–�wa†`–gèÊUš$ÉTdo—ø*7Žb¼÷t;ÝFp(KÖƒ—�pÕ±N…Y¢6çNNNØÝÝeuu•ápH¿×#ít0Æ4ç Jk ÐévYpŽååeVVV888h„³z[ÑKAn"x ‚ ‚ o�0SKk�Ž4ý~ŸÕµUîÝ¿ÇÖÖ&KKKôz=TÕÔô0#Øj®Ëññ1Ož<áÑ£GìîîrrrÒ48g:Ko¡¿Y–%Ö:¢È¼â#ê+Âϯ‰Ù˜› ý&TW½‡¥q3цãÉmtµ¦.¯ZÔZC%zõz½Ð¸Îò&ÖÐ{iÿü/eN—píÔµò–¦¢@K˜²6Äj­Éóœ<ϧцÕ1¢vÿ*ˆ}L’&tm·ª;Y¨;8ÑØ…Ët-o{–×áá!ÇÇÇÌÍÍÇ1ªªÓíó’8Žé÷z,,,4‚×p8äøø¸¹8ÆãQ¢x ‚ Â{G/AAáÚ¨çAÕÍL­ ‹‹ ¬­®q÷î]îÝ¿ÏÊÊ*�4�Š]확*DžðìÙ3=zÄ÷ßÏÉñTìºà�©ç¼\c¯©(Jœ³À«^jæû™]áîºQZPkÕy_ÏóʇÁQ'hm.}µ¬ÛíR“Éçl%~¼�ç4MùÕ¯¾à‹/~I·Û“øBá­àœ£,ËÛsŒ¸Ä•[Ïò ³3’$!ŽcœsUýT4彬¤t¨;iš’eqc­¥,½íÂÕ‡ºÊI®”¢ÈsÎÎÎ8:«««œœœp|tÌþþ>Y–M÷A%’— ‚ ¼oDðAA®‘i3S)E’$,--qçÎÛwî°}ç‹ ‹ÄÕŒ–ÊT= |ëª(ý½=ž>}Êãï³³³ÓDæ]ˆ>Tº¡×Ûä,ËòåQaçu7uþ›+þ]¯¤Ø— ‚—#Ï ÆãqÑív‰"ƒRÓÙ&¾µ Œ1tÒ”¢Ûe2c­Å¹µæ½âc³\üíßþ ÷w¿auuUJ‚ðV¹m‚ו5ÇÁ+Ïs²,#MÓéœFÅ…‹êØÕzŽW’&”¶Ä;_ÍôÑK¸â°­4 È‹‚ápÈáÑÏŸ?ga~�Á`@n®9Ϙ‰6Ôš^¯ÇêÊ ggg<{öŒn·;Ý=×:GTA„7C/AA„[ÂM– êÙ®à7ÆÇ1‹‹ ÜٺÃO>am}�~¯GœÄS±«~|5ª¾ÂÿùóçüùÏæÑ£G‘eÙ¬³«‡Õ¸Ê®™<Ñ|¯¼T½&.Á{.³øÜÜ–¬ÇZK–åŒÇ:�q3¯Ësá5(¥ÐÆTó¼zXë°ÖVëÏñ±ôžïÝ»Ë7ß<äîÝ»ÓD‚ð©÷Ó�p ñ„y–StBT£1íõ%5W5ÇšNÚ©„v‡u¶y>A¸ìøæ™Fižžž²»»â WWè÷û¤IB\E:°ryÍW±†+++,--áœc2Épޢ𠳼Aá½"‚— ‚ Â-á&¶îT+ O¡š+ëµÖt:]lÝÙâÁƒ¬®®Òíõˆ¢ïŽv¼PЄÚͧZð:>>¦( ´®ÜEï@ì°ö^—¯”K~Öž7æÏ-÷ÍlÊ:g) Ï$›0�‰¢¨™«S_õÞ^rÝšååœ#Ë2Š"ÇÚßm1 xøðk>ÿüÇı|ÄÞå~æî}Ç8ï)Ë‚,ÓdyFžç3tíûÁTðJ’„N·CiKŠ¢ ,J,îBnl}9‚—!_ýÉ”¯.êðÞszzÊóçÏY\\dkk‹Á`¶«ÚáÕÚæâ8f~~ž¥¥%–——YZZb<s||RE Ÿ›U'‚ Â;G>� ‚ Âm¢ô>ý§ðáãÏo7|A•Rt:]ÖÖÖØÞ¾Ãææ&«««ôûý î ç?‹Øõ‘½ïð^ßôvdáU Xÿ^¡èõºlnnpïÞ=Ö×× $qîZ_�ÏÔáåœ#Ïsùî»ïxüø1ÏŸ?çôôkmãìr¸©°ÆÛ¿‚úµgã¨éÕ¤/úYQè’wöænw>‘“Éc"ºÝI’4¢Wûý¬_chvȲ.EYbm˜oò!™¼´Öüõ_ÿ”/¿ü;–—WPR�…÷ÄmŸßÕ>Æàibd³,c2™GqˆReöb‰v=­¯¢(š¯u¬á-*·Â[?�òÏYZÎò££#ö÷ö ÌÏÏ7Ç4¥*¡¬uŒë÷û�àuTÍ+KK–¹ê~TÎõ«E¯éEl²a ‚ Âu�ocH÷LøxNxoÒ¸ ˂һ—Ÿ³©é×Úñåo@MA>:¢™s?%Gác;i–ó/áV|î„Ëk˜l W1¸)‹R9­f—KUñwžn·Çêê*wïÞãþýlßÙf~n­MëJæÐ0B…ç«£ Ÿ<~£G�øî»ïØßß'ÏóKV‚¿|Ý\çUÒ~ê˜LƯ¸^.³ní.ê§ß„8Â’,ˇÍ,µ$If^m[ôŠ¢¨‰ƒ*Š¢‰(+Kß\ý~ÛX^^âë¯Ë�üc¢H‚2„›Á«Ö¨Ûu¼ uc4a´!Šƒ£Tk�‰Ì¬£¸¼´Ö!‚µÄ®:¢ö‰¥’#�ðÑœ(¿ÿh(¨â½åí^áã� \ýiRV�ð>·;Å4¾OG†……E¶îÜa{û.ëë,--'Iåîò�˜"‚•գј½½=¾ü=;;;ìíí1›¨®vtá…X¼f¬×5WÌÊéTŬ5³ª¦3»üìIÀ-9øÔbæ4Ú0ću:�¦Ñ|þõÕsN”RU¼a†skÝ­;º%IÂoûû·C¿ß—ý_¸Q¼I�ºÉÇUUMk-Þy&ñ„dD‡$Nð‘¿PkëÇÁ}ZÉ$f°à¬›q¯^Z³ßô|JNÖoÉgªÚ®BÔ`K0õÞaKOÆ2¿7ÏÑÑgggôû=”ê`´nŽsZ):iʃÁ€ååeÎÎÎ899¡È‹Öy€¿¢¡˜Ù(ÕåÛ¥¿­YÀþf|LñðÂ}_Aø0‰¤ò ׉në«lú‚l«‚ ¯Q•ÚÅhú½ÿÿÙ{³ßH–,?ó3ó5ƒ;3Iffš§–Z½LÐÀ@ÿ²´@ÕËLk A èR·ªê.É%™LnAF„¯fó`îd0“¹Ýär¾‹¸$“Ass3óó³ß9Ægƒ€¸³¹¹É›7oØÝÝayy™0 ÝÎh€ê«R.”eÓ锳³3øùçŸùðáƒGJ—ú®NgxW ±ï½:IÒ{?w¡É«Uìœ(díÞ·}+FW§rªvÁg‰ÖL£ˆ8Š£ˆ0 ç>_}Þj§WÅt»9eY¸Tc…};×=Ï«êtýž••á'"‚ð#H’äQ¯ZÙŸÓ+ »ÁÕÿKÓ´³<ßkÆ—Ú%<n¾ç†.µn;±=3ÙÇ�G}ÕÑëÑ¢æú]žçŒ®FœŸŸsqqÁh4Âó<¢(ž�æz>W ?èt: —‡lnn2�øpò�étêö÷|±jÎUÏãp})ûϲ8½Až’‹Cxvˆ€ H_Aøüñèöp¤š­³ÎÅÓa8²½½Å«½=^¼xÁÒR?šWè:H‰ åyÎåhÄÉûªt†dYFiJ´š¥š Œ¿-“ÉäþOV,LÕçv�Û»Fú‡I»4Zí¢³†¢,H³”$™’$1Jk‚ X(Õ®‹8Ž›”QY–aŒÅš‡íôúÝïÞð·û·ìîîˆÐ%kŒúáÃÊ}Å%WÒZ;'xeY†ïûxž×Ôíj^Q¥™ó|¯©%éÆ'šcdÄU²Ö~–7X,×ó¼`|=æâ⢽â8fiii~Tõ5ß÷‰ã˜åe—ñôô”N·ÃõøÚÕ�3öÛô±Öë|½¯âìºÙtâôAx^|–àeϹÂÃ^kȼ~³M¤1„Gp}I_á!áC7¶±[çìò´GElln°»»ËîÞ›,- ‚°z­-•R(­(Š’¢(�FÎÙõË/sy9"­UZéæOZìWÕWù¦ÓiýQïÛZ÷:ÒZ{ ÙŠÚŸÝ¥6,I’”ëñ¥5aâyÞ\±-ðÕAÁÚma-äyVÕ{X ‡Cþí¿ý_ùÿâ"do ðÀ×£Ö2�&OäÃ,4ÌÄrW °(ŠFL¿Kh÷}¿I»ZESÒ+õ¶žõý›ýÈÇ=£( ¦ç<ÿþ=½^�ÕÕU‚Öæ�zR¬ëÇu{=ÖÖÖX]]e82�L¹ºº¢( W{ý™÷ujÁ…Q9Ýç6£Ø�¼¾^wÑZkØÖJÎ.¸ðžîͧ1Až_$xI öÝ3ü¸ Ñ‚ ×— ÂÂM*§’u”Æípît;lnnò»ßý޽Ý]ÖÖÖé÷ûMêÂÚ.Ô|7†4M¹¸¼äíÛ·üüóϼÿžë뫹T†uhRQv~À€ëÒ…}æö†;\^0 Z«º«îÇ;ósÇâêy•dYÆd2!ºÝNø»€VJZkºÝN%tʲr\<â8â÷¿ÿ=ý×M·Û‘ ^x4<¶”†w-¬›šJvÞS;´ò<#Ë2Â0Ä÷|”¯æJ!Õ/­µsy…!eáÆª$I0Æ`••…»°­tã(œN§œŸŸs||ÌÚÚy–¹tšZ£ZbkÝߺÝ.«++¬­®±º²Âh4b2�b’­Á*{«_ÞBÂ6s«ºù»öµ3ç&sÖmMغÑöæ:ãiGûä²Ax^Ü[ðj§ñ·VD/™ÐA®/A„çÃ|ý.‹«Cåƒåe677ØÙÙaww—µõuâ8Æó¼™¸ÓËLi__szvÊáá!‡‡¿{×솆›»öí,¥Þ�Çãñ=^ªùZ ƒ}ú,G U´êQÍzÖBYº4cI2e2‰éthœ^7Ïa-†…aD·Û¥(Jò�f霑ªPú‘\\\VÇñ™+à�<½.|3¡Ðc@UÕßËÒÎ91™Lš4b7ëê¸×¸ÆpAçEQ’¦ eYP–å;Ï¿û�«Óµ³óRࣇ/..žüg¬]^µØ†NÄ'Z+5/zµÓFQDE”¥Ú«á¹ä…»&ï¢(¸¾¾æôô´½:qL·ÛEi]Õ ¬\…¸´½�N‡åá�­­-®Fל~8ãjtMiJŒ1ÎoÕ¤iþÔT+§öNóÖ:D-ÈÏ×ôéVß¶õ{UsæÔ¯ÞɶßHÕÚ˜ ‚ %ÆÉõ"‚ <äOAîâ L‚ðT¯…:�¡1† Yê÷ÙX_gwg—ׯ_7EÝë`cíbPÕë&“ çgg¼;:â×_åÝÑ;&“qµ[z&vµS!ªÏÜrü­2c Y–Ñé|ûºN·kh<²na-yž3�Nñ}ÏÕ8©D­æ“µÒ‡5®‹(¤ÛíP–%Æ”?Ä嵺º"×µðèIÓìAÕÂûžc�1†<ÏIÓ”é4À÷‚¹Ú�Íü�E+ š™ÈÇÍkËÒT[IR.ÜXó£PÚý�ç9ÓÉ”‹‹ >|øÀÊpHº¾FGhí¡´7?—[KŬ®¬±±>buu�Ë‹K0�g¹¼T½¾™mjoò™®ÚÊSkcŒª¤«&µ¡½½òii^Ê*”Ò­×¶?oýÇêí7êvÅEkA¹/A"x ‚ ¢{ÞêæP„*”ÒÄgq³¶¾Æö‹l¿Øfss“¥~¯*æÞÔ¶¨^oŒ!ËsF——¼;>æèÝ;ŽßsvvFš¤cQúŽSêK.ÞoøÙ­e:�~Á« 2=Z‡(e1¦$Ï]jÃd:mÒ¶SÖ5s”RxUm�N§CQ8ÇFžS‰^²Ñ@îM’LDêׯF}dü¶³q¤3êÔ†žï5./«fî«\ø^)5—1ʲÙ�^ÂânhqõFÓ,åêêŠÓÓ¬¯¯1žŒét;„aŒç©Ù\XùÓÃ0b0°:\eme•óe·Æ�¯IJµD*E•[°`­m6µk}6z—{c±TO™ªráןDU5EU•ËPݬ ¦ÓJ;­ì'§_Ûþƒ‚ ‚ð€ÁKAnÜÌ57‚‚ ¸ë¢Jeèy�°¼¼ÌÞÞoÞ¼ascƒ~¿Oîy•Û@+Õ¤6̲Œñõ5ïß¿ççŸæðð�ËÑ%IšP–å·;Ð�M¿‚$Iî÷çUýUÝñ{µ`Ä�Çèòª?Š1pAèñd‚®RuÚ'uÓµçuJÃ4M(Š‚<‡²,äb„ï06=Ž1E-¦×N_[§Ruã�çy„�«Ñ¥”r®.*7råHç,­ÓÆqŒ1†4MŸ…3NøŠ› ,K®¯¯ùprÊúú—t:]´ðý`®“*¥ük––¬¬®²ººÂht‰VŠÒn}¤ JYÀ [ÖX¬-]Zgk\½/kš;;çø² êšuª©É¥¬¦¶p)J{hå¡”˜æùM °ê¯Ï]fízaY™Ô™Åé%‚ °pÀáá!ïß¿gt9"/òGÓãñø3& uï9d±èea?c\:I¦Óiãòª�^óM¤œ, ét:UŠ1CQcZ™DÔáãcÓä}Z‹µ k,eQ�kݤ7ô<ß÷[ãlåvQ O{­Ô†QSËKºÙÌ!N-šÕÆÒÚÍÖY–quuÍéÙïŽOèv—è÷–étz®>–ªÅ#—FS+Eø,õ{¬ =z½{=!Ï'XJPàyÏ¥-JY´2.! (]¥ ¬][Õ”hQ ´ûjÖ8§µ1%¦´ÆäX«±Fa­Ĝ۫õÕ*4 KåkD0UÝ ©F³r/,‚ <2DðAøìÛmáÉžW‰« ÂÜUÑN åû>ƒÁ2/w^:ÁëÅKÖ×Öš´…õ%T‹Öвd2�ròá¿þú+‡‡‡œœœ0™L1ß2•áwæúúêžÏ¬Ò=ñÄKQä¤éLðr�¿Û‚—Ö.ÐÝn[¥½Ì² kóY '™uá£\]]=³Ol1lYB–“¥Nð |çàÒZϹiuUWRY…_='Ë‚¦Ö`Y–"x ·æÕ²2eYF^”œ�ŸóîÝ KKC66¶,[´r˜ëC]©R�ï±Ôï2.1\î²Ô�ÈRËd<Å*ç,ô´"�¯ð|ð=ð<�ïi´Vx´f^ôR8�Êj·ÑÄBYXŠÂÕ·ËsK‘—ä…¥È ¥cœ¨¥•�R>E%zU�¶èå„/ÕÜÙJl³r/,‚ <"¾Hð²­Obƒ‚ðT×’E®§Çu$'ëIŸ[Aæ§*¥évºô—úlooóúõk^¼xA©�ïûn‡|=,Vu»”RdEÁõÕ'''°ÿvŸ³³3Ò4¥,ËV�ã_/..eúhqŸÃ(Š‚étŠï{Îuxž7„¶Ö6®Á ˆã˜8ŽÉ²°.Å¡ Ì‚ðI.//ÕñZ¬«Çõ©û£O½‹…¢,Èrç* ‚€0w‚×Íñ¦Æó4Aà†!aRNx¸]ËKü+Ïñ–|ÑÏuMS¦“ §§§¬®®r5ºd¸< Ž"tbM‰1h…ò4ž*èDŠÁRÀêJ‡Í�Zwñý¾oèt¢HEa膚0Ðø¾Æ÷žG#xi­±«V¡,Ú9¹¬¢,-En( C^Ь$Í ²´$M Ò¬$Ï Eáı¼()òÊV= ~¨yÌjP¦½j§W]L¹yZI|CAxx|±Ã˪Æõ-Â×ÜøU‹BY >–uY¹ ‚ð¼ÐZÓë÷X__gçåK^¿zÅöö6q]¿B)T%`Ô¬%KSÎ/.8>>æàà€·ûû\]�œØ¥n¬UúDåvâ?´qöüüü3_ñ\' W_'M“JÌ ‰ã¸©ÛU×󪺪åët:dYæR…¸.ỌMa”øøµ}Ÿ9À‹ªÒÍyÚ#¬Ò£AÐÔóš›cÔÌ©\×òÊó‚ò–Ó¸P2=\úK;?{/¸7O§ ggœ�~àòòœµÕaåÒò°6£,3”�F©Œ(´ô{>«+1×[}‚ O/GšÁ C·Å>qõˆBßWøžj¾j]=ªES]wËX…1`+Á«,-Eéœ^yV’¦9É4çz’0O™L2¦“œÉ$eá‰ÅZ×wŠ¢ MS’dÊtáê¡ÄM›8±‹ª�¹ tGäy—¢((Šœ"/0Uš¨Ûm%�hAÈó‚Édúôæ£Ú¦î+-µlVeSÇ+I’Fìš¼ªû¬›‚WQ”eQ�5®v j½ÈMo÷kœ ãÒã»oO)ó¦jiÓÌUEž2¾qy~ÊÙ‡÷¬,÷ð´! ¦Ì1eJ¡ ‹)3`B$¬ 5E֣߲¶jCE¿Å•³+ôˆ*——§kw—Â÷p5Q]™°F“³•Èd­ÂT) KÆÐˆ_YZ’e“iÄd3�æL§ÓIÆÕõ„ñUB’ΖҬ¤È‹ê}XÏ=TõµÄ”K�ˆÒók¸Fô²wÄ7Ô_éÔ©!å*Ax|u ¯ßZô’X³ðT±�${ÆC¿ísþðÂW�Z¹žíücÛu+Ü®vcœ†>½^�ÍÍMÞ¼yË/ DQ\ÕJÑcª`‡¥ÈóœÉdÂÉÉ ?ýôùË_8==%Ï2Œ13!Hæf@ña&ÁI’”$Ié÷ý{Ž)êÞcÏ“K«qY–äyV¥6tŽ‹0Œî|]ýû~ߥDÌóÌ¥Ê,¤¾Ž ÜE-ò<Éyé†è5¿!c&0kÈ‹œ4M™L&�¨uKôªÆ­\ýÀN§ƒ1†Öz¸paà~ÆCá£tP]š9ÚZì�Põ%¡PŠ”o)½É5-‚ðpñ¿É»ü†s—k´ð<ÖÞøôa¦3mö€Ë!|aÿ„gÜ?}ߣßï³¾¾Îöö6;;;¬­­ÑétæœN3ÁØÕUI’„óósŽß¿çðà�wGï¸_ST©£ª’è.PÐ.äUC3Ϩ‡s1O§Óª¾TïãÓ¸ªvƒ«EkX{ÛõõDç¬ZôJÓ ßŸ†�Ng–ò²n�Ö) ‚¥q“¦1ÆŒ1ÜÊ8&à¯étú„?¡e6I´ÇYåëvV+Ë\-/ß÷‰£¸I•Ú½´Ö( ¨Æ–’$IÃ�<Ë1ÖTéíff{c–ûâû8Yh>Àî5^ÛXû{­\Õ,kJòÂ0¾:ãôý>K]Åò’Ç §ð‹§Ë*µa‚1 Ö¦(:qF'RXV=:2 D)Ô�Ò¥‡vI «¯³G%oQ?ù­ê­jp©Y=.K]£ËÃk}в¤ËtšsqsyrÚ×tbËèRqu�0™ædYA^””¦ ´Æ8áËj'D+U‹mº©áùQñçì,l®eõÍßTAx€øÒ‚ |ÍýÁ�ŽÕÙöW»é?‚ðE‚Åb�+�àyšN§ÃÖÖ¯_¿fww—­­-ƒžçU;ÞgN-…‹1%£ËK888àôô”ëñ5y^ +÷˜­„1¬­RÖA«{yXy~˲d2™²ºzŸgßLj±ën§ÀÓ€\jü (ÇQŒµ–0 çD¯¦”ªRÆäy¯©åÕ8¹™ÞPž7ÓédA ª§µF«F ¬Uw¦$«ö,ËÜ#ÏŠ ½æFZ¥ªú‚Qщ;äyáÆyã¥õ¸ÔÌUßbÜ‘Tuë'5÷½Û’£¡É •¥49Öä$ÃÙC7ÎY[ñXY†^7À‹=¬I(‹1¦L°¤@†j¾æ@ª¨~.«NáÄ.0ÎÅeÛ{6÷©[✚;bwqhl%z)««W¹³ÖÃ×:V�& ; –V–;l­¸¸s~~ÅÅŘËÑ„«QÂ$͘¦ ÖøXB°…;^k€…?—¢˜Ú•yss�}g].AA„çƒ^‚ |ÙM¨z8N/+é?‚ð-¢Nôò<ß÷, ØÞÞæÍë×¼|ñ‚µµ5¢(j_9³ ÈʪnÓùÅ9ûrv~æÒLÕE(¬mê:P* Û 1&&[î�$}.G>|ˆ9ýròAxúª ,S¬Í°e�µ¥sWêùÍ*ó²¡n7³M-êÉŽQ’ÖPáa"‚— _~»ðPÒˆX!|I¿‘þ#³›v¥A!Š"†Ã!/w^òêÕ+ö^½b¸²Ò¤1´væÄ—ÚÆW×ל��qppÈþþ>ïOÞ“$‰·”mœ[7Å.Éuxy9úœ­ÚŠg,ÔX\¶1'z�'Tå¬h§6l�Ë '¸:—WNš$®FOžS%|„£ÑåÓ�“>µ âÆ=ˆ1†¢­’$!‚fóFû}ê9@{Ú¹Oã˜,ËH“´ªaiæœ^ÂSœžl#nÕÝIYå.åLNè*06›ãy%alè÷}VWVW|º� O�P6Å�¢ìOe(�£T%pUb—¥ÊFDs ÓÚEÚZ_©Y7W7ºý¢šc3Ï´„˜JS-ט²(J´ö@yx±%ðÀ÷¢p‰Aßgy9`u%æä슓Ó+F£Œ«ë‚¬¨×oÕ1+PÊs)•ž;ºÖÞC»÷ûÆÊŠè%‚ððÖ‘"x ‚ðµ‹G „ÇÚwAÄ.A€–ðà@Q±¾±Îîî.{{{ìîîÒívñ<Ï=«Ng¨f5«Œ5\]]qttÄþþ>ûûûœœ| Ï3ð°³ôPv¡ ôðƒççç‹ëpÝjÏ� :ÏlÌqÁã’<˘L&ø¾ßÔ€ókü¯Ó½YU9IÜØ_š’,KI¯Ì ´Önܾ±¯B)åÒNôŠ¢ˆ\\\>™ÏòÕÎ^Z›*¨R¨æ9IšL<íÁ|ÝÀZéfœ)*'ª1S̽R¨*©ùõˆÖ>ÕÃ9¾J°…Kã§Áš”Ò\x%˃>›^ím°»³Îp9f©ïOg`JTU§kV—«vu¹¿áeöS«Ÿ= nË^ö#Ÿèó®¸ùu‡m÷äÊ…V9Z^ÀR_}ÂÈ# zý‡‡`GL¦Ó$ÅÚ²*ì º½ µ S}õQ?Þ>'cƒ Â�˜ïEðA¾ê¦ñæ-Ù£9n Ž Ï�™[«ª· q³4Xbss“ÝÝ]¶·_0 ÃÐýŒAW¯­)Š‚«ëk>œžrtxÈþÛ·œžž2�&ãÒþ)­æR(~“”…?˜NyóæÍç´8w‡vž‡ÐÕ|ZKåò‚$MI’)a `a ºWk—WYºTeY–U)“žWû B›§X¿ë~+8õÑ_[œ ´,�蕦)a•J)´Ö·Rô¢ ð}ˆ"Ò(" #÷zrLqßš�¿¥Pw’Úçd+gVÊ °x^Nà[–z>›ë=vwVØy9äå‹eºEà;G—5�»t~”T=o&¤Ú²`#Ï|þB¥æ+n©Oö}{�;õÑ^zÓeÖ^‹ØêxŒ-…RO+âÈ' }<¯W È>TÎíóócR²<£4~u]J£�¾UfÌ>³«åfí@Aá·A/AáKWðÔÊ‹Yª¹¥±Kx¶—mí02Î…åù,—yñâ;;;¼xñ‚ÕÕU‚ ¸œ9“¬µL§SŽ�ßó믿rpxÈñûÆã± ò(ÝÔ§š]yO£Êñññ§†Å[ß݈fN„ç©SEÎdâRjO„aˆnÚ¨ê{Z©F|M’)Y–‘‘a‹Bjy Ï–wïÞ=©õäçŒ!÷Ù8aŒ!ËrÛÏÿ©MVµ°žç.½nEM-/Ïóæç·z^¬jY†a@§Ó©¥9Ežc0Xkföá1ß¶8qÉÖiû '`©ß+éu;lm Ø{¹ÊÞÞ:/¶‡Ä¡!ðK´ÊÀ¦( ´2(eÐM½®Ûs¿ºk†ŸÛy×®'¦î±J¸ã9 Õ#u¿©ÞcîºR–Úše­[Ë) Qàû!a†ÝnÏó\Êa{M’M(MéêxY‹‡Kõ¨f×ó^´ç"zÍšV_‚ ¿"x ‚ _½ˆ,1G+� ác]¾'¬µø¾O§Óaee…��Þ¼yÃÖÖ½nß÷o§—ý.IÆã1ÇÇǼ}û–ýƒ}F£KÊÒ4A§uÙFüRUHã)ÜÞ�Ç×\__3 n�ƒwü0쬞›VS÷ —Úк;IÂt:iQ¢´¾%di­ñ}Ÿ8Ž)Š‚²t¢¶˜«Ý#Ï�ëëk®¯ÇOirúöB’e.­a’$xÚÃ÷}´Ò�ÈUÏ‹Mp¤gÊ¢$MSŠ¢ (rŒ1RúõIt4‹²Æ9—LŽR9Ú+èu=––b¶·¼ÞÛàÅö�•aD•øºD«­rÀÕìš9ÄZéïšûì]ÇÒîOK}Ìǧ,(ZJҭ̶5)/x÷¯3W¾R`1XSPg©ö´O¿ç£µ¦(VPJãû!ÖÂåeA–äE‚ÂCác]bìJ3þÔ§¾}°V}ª=Ð8#‚ ûûûœ�ž2_S”å|Õu÷êÙßýÔvÜZ%S�£=ß¿ÏÞÞî‚ßÞHLt¯è¨}^N¯Ö†rc,EQ’¦ “‰�ï{DQäujùÂ9ŠÀ÷±qL'ŽIÓÔ9Ål¥ˆ]Âóáýû÷OÆÕøÅ#ªè·]˜MUÂ:”¦lܤaG1¾çÏjÚÙ{¸ªŠ@„Qè¥y�)KŠ¢'éã[Ýø±©JÀ¹»:‘¢×�ØX_bçå Û[Ë,":¼:�a%vQVCãû–Ç÷e‹’;.¬–›üŽ£œ�åŸVîíU-ŽÙJ›+Aé*¤¢ÛјaL’,‘¥Z{X{…) в ,2çòR…¾ì|þÄO´Ð,`Û­ö9N/«¾Y‹“u�¤5Aøþˆà%‚ ‚ð„±Öb�Åb]ýߣÛí²µµÉ«W{¬¯¯Óíõš:I¦rk�K%§€¬(˜N§œžžòË/¿°¿ÿ–‹Ë ²,u�¥ÁºÝ¿í¦Kõ‘* Öív�”ÇQåàà€óoþç[ikT]$äSçäÙO« c\�­'A@§ÓE+…ªu[¹vUx¾O¨q§C7Ë0eIYº‡‚ð\Æóƒƒƒ'2|ù˜3á­MV9WŠ…<ÏÑZ“ey‘˜ÏzMJC…róž¥Ý¦� èÄWo0KQ©ªÆí&[¯ð8®×?,•«@Q`ÉñtA§°2ŒÙÜðòÅ*}z=ÏÕì"ojvQ‹]ÖÔrê7êmÁö[jÛ¬ÇîörÝDßzF�ŠYU ©0X l †’À�XêäëKUJkÍt’‘&Ói�)œÝ([³´Ò*ªÅŸaÎ vÃéuÏ`Jìj5­ˆ^‚ ß¼AAž8µxEÃå!ÛÛÛ¼xñ‚íímƒ�K%×vw¹a­¥4†««+NOO9z÷Ž£ÃC>œ|`:™Rš­A+�iײP‹ F,âáÞìÛZ„»Áþþ>Y–Eá‚vv- ©¯îÙÂʲ ËTUÏkŠ"­ñý®�Yí‘e×× E¡8?Ë)òƒÁØZ¤vbW�ÖPqW%4·]txöÞ�ÿ€¯N½A¾+"x=Q¾ré$‚ £_ ´ŠÊíòí÷ûìììðæÍv^¾d}}�^¯çÖºZ\J5Ï·Æ�¦)>|àçŸæ—_~áÝñ±swåyI¨jbСÜwò°W+‹—\^^²¹¹±¸ÝÕ,µá'ßß>ü6ø~kT×F.]�¦ ãñµ«£�àŧWt»]ʲ M3Ê&åX)¾ð¤�.¹¸¸|:sÓ÷»•ûŸRÎM[–%išr}}�VÚ‰X�+oí¾UJøqW)T­µyQ bª1§|MÀú·®uù­ƒë¿íñÛ…õïLm§jÁ˶Rfx^A/V –B6·ì¹ÙcÐ÷ˆ#ƒ§ËÊ VBS§Ë6â�šK¨~`ÖbɧÖ\miË6¢—º«^ûÇ›.Êv>Ak�L Â@³ÔÉ×–ÈR‹R>¦`ssÀÊr@§£ð}ç좼T%xµ�bóó¸­œOê3ú©ú¬åÒÇšÃ6Ü}D¯ûv7ÕlJq‚1Ígœý¥Z63@Vá{^ÇØˆ¢P–p}5e43™–˜4ÃX ­ãÖUúÑêoÚ–³LÝö|=ÉÕ”ˆ^‚ ßýÚMî"êÜ5é[æ z ‚ ‚ð×¶Ù­Ç1ëkë¼xñ‚½½=^¾|É »ôL¡AW"ƒÖºIex||ÌáÑ!ûûûœ��‘eYó¾_rƒ^¿®þïæïü㛺·Q»˜s<[Z&8k©I’2�NI’iÓÏšz^­Ú^Zk<í\�N‡8îT}YËXxºcºµüã?þ£4Ä‚vYð�³á¦?œèU�¥I’�¦)eYÞ“j×V;…jÇ�@¦µv÷Ûöq‰]ObÞhÿhçÏóMQG©JF±Öd`�»«ÓѬ­öy±½Æúú˃˜8Öx:GÙl¶kšÄ~ê®è“j'ÿûôc^4s¯·_ÐìWõ{«½Ú4ŸÑmâ¹)è),Z¹G]ÓK«O—Ä‘by³¾ÖgssÀÖæKýOe@6sÏÙek�¹})Ôk,kŸ~àOñh6| ‚ <mJC«>b_î‹~Y< ‚ ‚•@ é÷ûlnn²³³ÃÎÎ[[[�‹fþ¹³ôqY–qqqÁ»£#Ž�8::b4‘gy#xÕÏUê¾)üîéþzàë˜ÃÃ#ÎÏÏYYYý¢uÚ¬d1ëúUmœ¬©ååû¾ïãûþ­>¦”ByaV© K²,%Ïs0c¤]…§Çùù9‡‡GÒ·n|Ï}³ú?.ho¬Á9Y–5N/O{xž777Õ[jÁ+ Â&­aàä6wï%ÃÌ�[ÛÌ-æ^�He-(ƒµÆdø^AàC¯°ºÚgk{…ÕÕ.Ký�ÐÏðTä31f.%¢ý¼ø‰£Ÿ¥¤UUëž]^}‹Õƒ½£UYp$‹j²ºkJãRZ+ Š­5Q¨¡`Ê.×צӌ,+¹ºcLޱ9Öj”ÒX¼êݽÅGe«¸ßsX+‰ÓKá›ò¨kxYIo¸xé"b— ‚ <ïõ@%„¡ ÔmllðúÍkvwwYYY¡Óé,»”RM­“‹‹ ùå×_999a2™�çÆÖõºf7æu ¨�¯Qî·h{ © ‹¢à§Ÿ~feeµÉ´÷ÅKRYËV}ÈÕŒËóœÉd‚Ö¾çÍR¶ÄXÃvN¯º�ÇqÇ¥»!È ÂSá§Ÿ~¦( iˆ� ¹£íðšÍ‹ÖXò"wâUP‰ê�ߌ1õ8Óv“ú¾ß¤5Œâ‹m6~È}÷� z4'½eZªýI•Øe \zœ0P,:¬®-±¶ºÄʰG·à{­�È…-AµÒZC�¶ðÛMÞ–ùZ`î3ØÏîë¿ýB¢�ΰþ�Å*”ÎI¾O§ã±²Òeš,3™¤ŒF’4Ç•} Z׬Æ*»81ã#Øõ-XD/A„oƒÿØ?€•E¦ ‚ Âüú¨¼¢(bii‰­Í-^¿zÅîÎËËËDQÔ¤‹i‹]J)Š¢`<svvæ¯_~áäà É4¡(Š&xx3Ë7­ òø‡øoü«õ/ ‚ð+Γè]ª‰pYŒµ…«³£µ«Ó„!¾ïÏ ´®4‹m/c iê^Ƙ*M™Œ„§CžçüÃ?ü7iˆ›cè\»YM©¹ q0¯¯"/H’¤²ÂÖÓ8ÚñIáûÞLðŠbʲ¤( WËË*½~ÈÄÁíÌ|õÆ›&mp‰«/U¸Ú]aÄòr—õµeVW—»t#‹ç•ÎÕU9»¨Ä2·›Å~·žû˜›¾¹¨ªî¯­ÅRb­A¡ð½ˆNÇc¸Ü¡(`4špz:"Ë3²,§´¶Šã9±KaçœnÏZðÑKá› ¥ AAžØOk‚ `8²»»ËË�—lnm±<†aSÓ¤�1†¢(¸¾¾æÝ»wüúë¯qrrÂõõu#"ˆsÆqtxÄÁÁá=žyW4Ô.üöÙbgý0ËrÒ4a2™�$NhmêÆÕ©4¡q`A@§Óív«:;.]’D¢…§ÂþþGG’Îð®!ôÖP[oȰ�žî¾·S9IÓ4%MS²,›ÕòªÆ•zã…ªj[APÕ Œ‰¢ÈÕ Ôú+í½Â·áæÆ‹³•` |ÏGšA?dmµÏúÚƒAL§ãÈ�­ Z×u©fu»fU­äD·ÛÙ:[6`ªziE‰R%Jøž¥ÛõY^ŽY]é²¶¶Ä`)& ,Jå(ªZi8�²¶©å¥¤KKM/A„¯�‡H‚ ‚ <¶{aÕåÚÿÁLˆ¢ˆµµ5^½zÅÎÎëëë,--55‘êçÖ)œLY’e£Ñˆýý}~úé'�9??g:�ºT†­úëí¿ù\ùû¿ÿ{l•âñ£çëV�3;WÿEÂh³†0ÆV© 3’dÊt:uµ¹Ú5vn80<Ï#Ž;ô{=¢(n‚ÑJâEÂÀÃù/ÿ¯4Ä�±â–Â2?¯©fÀ þ\-¯zŒÉÒŒ4MQ½ž[ÛS›ÖÏóˆÂˆ8v‚W•#¬:ÄØjhþ«™-Rl äøž¡kƒˆµU—Îp©… Ï3Ôu»´²h…oTÛÝeEìj_f�5ÝT×LõP�EcÐxº¤S �+ÃëË,/Ç„‘EëU¹ï”-gïaëöÑ u;Có�õ· Â'ÁKAáQÝ«ùOõ¨wÜj­éõz¬®®²½½ÍÞÞôz=‚ p»Ò�f———œœœpxpÈáá!¤IJY”·þÞ,"ñ|oºÿùŸÿûûû´[áóD–ZA|ö�ºi 'º€t’¤L§—®°(0Æ4— º¹ïk—WÜéÇ1aèNh” �ð¸Ùß?àOú“4Ä}çEÛÒÇoÊý®,Ý“fi“µ,˦FåM´Öø�_¥5ŒÃpn>ÑëÇO ³e‰sx9·QA)–1+Ã++=–âHá饊–+É8—WUÃKÍ ]µ sCŒ±Ïpojâ©æbs‰ iœ^ØU‰^aý~ÈêZŸár—^7 A©ÜÕü²¥{MKôR .]áÆ9˜ ÂG¹·à%C© ‚ ÂúãmœCUª¦²4h­]*Ã�]öööØÛÛcuu• šÚ^n‡èüún2žðþø˜ýý}öö9>>f2™|"ê žµ‹ÆZËþÏ Ï‹Ï|�ôÞ[mrã—Ú0e2™0�NɲŒ¢( åJ´ÌÜ^žç†�N‡^¯G†âò=y^ð‡?üARÉ.N̹›U{,iI­M�{« ÒÏœ¤Éœèe[¢z;�ªçyD‘syÅq§cæþ®œ¦±rµÔ å2(U¢UI·ã³ºÚc}½ÏʰK¿kSZ•hjÑʼn].­aõþªem¿¥¦>¿ ½YškKµ/K'ÚlŽ%EëŒ^×cmµÏêjÏ¥“Œ5Z“`MÖ̵¿²í÷î= ‚  ÷¼dí&‚ ‚ð°pÁ8š]é¾ïÑívÙØØ`wo—/¶Y[[£ßïãi=˜©êx•eIš¦\Ž.9z÷Ž£ÃCNNN]ŽHÓ´zêiU¾ÃýõW À‚õ§Ÿ~æÏþ³¬•¿ÕvyUnQ¤© H'Ét®–×­›­ñý€8vµ¼ê:;Jé)%á1Œïð§?ý‰ŸþEcá ÁÝñ&`¾8 |³–W–e�àu{Ž� ^u-¯8Žªz�ÞÜøbe&ø!aæìªë@¹z\¾ïêH ‡]†ËNìŠcíRÚÈѪeš×Õ�§ImX¥ØÃÞìnmiõ™‰^M�;µàRt;k °Šœ8Ò,/Å,/wX^îÐï‡øžëê§¹ô“óõ»dÖþüqPD/A„Ö½á}âÍD.ã§ ‚ Âà Äc0Æàyý~ŸõõuöööøÝ›7¬¯­EZë&pgŒÇê ]š¦\^^r||̯¿þÊáÑ××cŠj§»bq­°ïúѰs»ëïýøAA§ÿôŸþ/&“qkG¸,š¿„Jƒ­Ò޹¾Z–I’0OHÓĤo^ªy­" CºÝ.�N§ªµãËù%ãñ˜ÿøÿOiˆ/Lî5ÑP–%y–“eYãòªçÈùév>}j�ÚpV/PƘßtùsÇ¿*eœx¥ ¾qäÑë† –búý�0Oh•£TîêHQÎ ]óa^ìjþ­Imh?£Ã=¥‹KÍÏÙ·ÎŽ©jtåX›ây†8öXêǬ®öY^îÇžv)$Á ¬û*[í¿îÔ¨/üOá©¡¹Ç”"b— ‚ ÂÃÂb±ÆÕ;²ÖÃá�­­-vvvØÝÛc¸²B†³píúG¸´qãñ˜>pttÄÛ·o«T†cŒqﻨn—ÜÏs}uÍÿóÿ=ÆÚÏZ4Û›yü„íc)˲Im˜$)EQPÖ}s®õœë0*—W§Cw‚:í˜ôYáñ`ŒáøWWWÒßy|©]^I’Ì¥5¼9_*¥*'©O†M¯FôBæÆï¼èiPöæ/œÈâ®W(:Ÿ~/d0èÐï…„(U ^Ì»‹æça5ûÙÞ5{<÷yûn‹e]ÇËÚlŽç¢H»Z^+}†Ë=âØÇ÷*'�-[~9©múÍNËgÚ⣬›A„û/ n¯¸,ÚÊd"‚ ‚ðhâÆŒq»ÏµÖôû}¶¶¶xùr‡íímÖÖÖèÄñíµ š¥tËóœóósÞ¾}Ëáá!ïŽß1�(Ër悱w§‚/¶©ÄÄÑèê~î +��O5i½yßCQäL§S’dJÖªµƒRP‰bµ¦µvõ¼¢ˆN§CGøžWG%Z)<<’$áßÿûÿ�÷ïO¤1¾ÑrËÕy‡paŒsyeyF–fd¹s‘Ö;޵Ö.N5®×µ¼¢(r¯ @{¥tt©C/³ùTøÞË#ƒ­êwù>Ä‘G¯ÑéøD�Â÷ŒKcØ^¶•Bï£Ë®ùS¨¤ÒÔ}ÎFµ$BkPÊÕVó¥áh”"K"å¿X{g×CNR3á§Ô-Ÿx5úŒL¾´b$‰Âh”auu€³,‡RÎ5¯¶ÑEUA>›hf%!‚ ‚ |ÛðÄ‹E/‚O­”$ 66Ö±··‡ýý}ìííakk iš¶bK÷3¡î—µ˜N§øøñ#ßâøø?1Ú^ù IDAT~Ät:…³nþ…%âÂY¿fPb.׫Ó–½®¥Ô­€Ë"üá÷5ñM/"ÖµOmi�4Í' ¨©[×Ck�$IàœCVAìâ.¢ |Cnnnðÿãÿ!ήïaDg†±¨€¨ˆPf%â()‚ÒŠT77ò¬à•¤ R“¡6ª,áØ��ÆîVnöRIå3Ö Üû1@Üy†8ü¿{Ù z‘ƒÖ qLÈ�A!M´² ¦N9Ü–¯èk³ÅŸ ‹ÛŠçZ‹À¡Þ¦ƒRIL c † ’DCkçR²ó-­,‚ |ÑÞ1¤4˰ ‚ Â÷)è„jca�pBDHâ£P·ëoþæo°··‡ÕÕU$qÜŠ[ J)@]U(« ç8x÷oÞ¼ÁÙéò<‡1&ÄÛ¤¼Ñ2úoö4;3Ë8¦_× ·”�K÷¹sUU!/ dE�8Žýà ¹õ³>(µ© �±0¦në} Â׆øðáþþïÿ?žJƒ|7ýâçZc ª²B—>½aƒ/ÃÛÔ†Iâů8ñón]/Ô®ñÞ¿V˜çYAíp“R�¨¼âÄ‹^ÁQj­…e»`>å™é¢›dzÔ"i¦½¼¬¢ˆc/xyÑK#ŠDÞýEàÎU·Ð‹$,§op»ØäBÚI‚W„8Öб‚Ï8é„^Ì^­&‚ Gjx ‚ ‚ |'øúNA3…Þ~ÃODHÓÏvžáõë×xùò%vww±ºº†8ŽAJuu-fêH9\__ãðè8>>ÆÙùò¼hŸÛÆ#p#©±0Ûm=¯Å8Ç(Ë*Ôª�àæão�.Eg#zåy­u:ÇÐZPáúD+>65y²,Ã`�¡®*ð. qy _g|Æã1þñÿÿóþ¿äu×ÔµZ8JÒ÷ÒO>µaUUˆ¢i’¢Nâ6¥p3OöÅu­4¢Ø»¼Ò4�sÆúÚ˜MjÃþ<ÑÌŸÝ% cÐCW]sñ­o‘&ÄIŒÁ C–eH“qÄÐÊB55Ò˜½Æ½ÚöĽŠSÂrzŠz=ÔÔY i ‰½0™FHÒI¬Q€L#ŒIû ‚ _†^‚ ‚ ß >ÚV±\8ÛN‘vwwñÛo¿aooÏž=C–emêÂ&�ÖÔŒ2Æ ®k\_]áýû÷x÷îŽ��qq~R³.°&&Ñæ>QJDĮٶ˜iÇàòZ„s77c\^^¢®�4ÞƒoŽÛ÷Š1EQ@)B’$Ȳ D´òíßV ¢WÇ€Á`ˆº®a�ƒ1F\v“S×5þíßþ ÿðÿ'&“‰Ü΋jTò·ŸS˜½8e­EUUÐZ£Ê*$u­54ë‡WóQi…ˆ#ÄqŒ4Ma� õ�¯ç…Ù|Ý|!ƒÏcgÛEb…/k¥�& ²Ái–"ISD‘�¢º[Öte7»�¡Hͧ3¾pÊîÄÝî«Jq¬‘¤1’ÆåU5ß÷Ï�ô… ‚ðˆà%‚ ‚ð�0_û©ùÇ1†Ã!vží`¯^½Âææ&’ÄáúN�¾»k:�âòò‡GGx÷�1O`¬EDzö÷-.P[·¾.b×âþó�»ŸÓ¸“>~<Å?ÿó?ãÙ³mìííAÊ{}ªqÑÕ¹á¦-›Ô† y>E’$`Î�¥^ðmµŸ~Lk�4M1Q×^6†áœׄåc­Ã›7ÅûoÿÞ¾}+ r ö¢×¢{ÿk¿—PO¨®ë6ªÖºu“.ûµÖH’Öz!½ª*8ëPs Øù?ˆfþòþ‡oõ7ÿÀ“BÛ¾†—Ž4’$BihEð¥9¬f‚Ã+ü8ÝñHæ‚eMÙa=Ú¿Ö98®’$ò‚WAÎç0”(‚ ÂÁKAá» P%pìÚXN'ØØØÀîó]ìïïãåË—X[[ó镘»€>àÝ,DÁItƒããc¼ÿoß¾ÅÉÉ”eqg½.¾ý†ü{j­2§ðî:õ æº¹¹Áÿøÿ++#üÝßý^¿~…4M¥ï€ç\‡MPºª*äy�8žB…þtÇ%Û|¡ª|0瘭¤6–FY–x÷îþûÿñæÍ[¹¶z�'ί¶–W®Ê²ôuº’dÆÝͽjy¥icR”e c ¬³°Ö…©�o€™}¡Î™´‡,‡Jf"·êBÑÜÇð/´VÐQ­TS•š >•a?3bÿ•»ßô ‹»ð°ž#ŸÄ°½_Âÿq¤‘Æ^ðJb ­}�5AAX"x ‚ð5v¯ßÏ‚ üâÃ%qWçDi�Hk¬­­aoo¯^½Âîî.Ö×Ö�¤iëäj‡Ððo/ä8==ÅÁÁq~~ŽÉdcÌB'™«ïòÈøü ù«©ßÕôÅ�ýDÊÆíõþý!þõ_ÿ Ïž=Ãø‹?þño°³³³ÐIðK7ólV°p¼'zM§ˆãY–!i@‰æ¢„(ŠÀ²,E–eAðr°VÚXø|¬uøøñ#þüç?ãOú>~<•FYʼ8çüú ó3ààÚ±%Š|ºÂ$IZëNøâÆ�íÇÀ§°L’ÆXca•õ.Òvž½?¥!ƒA2ñ>~ŽP Q¤Ç¢Hµî.ßIAìê ‹ Â2F³�¾ëKk…(ŽG¢(‚R]*CAAø2Dðái—º�X³²8AøÅavà^­8Š0 °ýløÃðÇ?þÛÛÛHÓ*¤2lú!Ào­Ežç8?¿Àáá!þ÷ÿþß8>>Æt2…56<µw:�{'›C� –€Ããç»&øyOý®®ÍyFôjšûãÇSüã?þü×ÿúcssû·‹—/_âÙ³m¤i†(Ò¿öýqÇÚ�™Qצ9!Nb â8×:ƒ¹WãNkDÒ4ÃpXÃ9 kM¾îúM‚0‹1eYâôô øÓŸþ...`E9}‚{Ÿgzò°~̰֢,«V(oÆ”¾˜îÇ}ÿS*¸¼šZ^MMe˜üxOàÞ,}»¼IP¡Ÿ’8nEIß7à ¦Ð—ìCŸ¦S° ¥…{E{�2Š4”jæj~\AA ‚— O¹Wl—ºþÙl‚ð«™M陇"Â`0ÀæÖ&ž?Ž—/_boo«««ˆâ8üLW›¨q{Õu�««+œœãè臇‡8;;ó©ÛØu�BžOÕ«äÎ’Îçqt×¢tW·ûzVðš­µ8==Ãù/ÿ˜�(Òxùr»»»ØÝÝÅææVVV1 [ÇÁ¯ÒÊ|G{6NŒ¢(‘ç”Ò­ÛÂ÷ fúÈ×òJ`í0¬õ. I?'ÌSU&“ nnƸ¼¼ÀÉÉGœœœààà=Œ1Ò@_}¾ä§½Âüè\S'H’¤­›é)‹¤ZëÖ ÖÔ3µiÇúÖ»Å÷�u´´¿ãf²Ÿfr îRÆq­{/ ‚ñÂy…©£¹ôÙšnÍÞM­X ‚—Š4tx�"ppxÉ ôÛÅmA~Dðái–¹Ÿ¹hj6€,›A~¹ð@sJ€@ÊŸRÞØÜÀo¿ý†ß~û Ïww±¶¶†4In ]�ØåœÃt:ÅÉÉ Þ¼yƒããc\^^¢(ŠV좾°Õün‰ô,§{bWCàÅq…Qås¦1o޼ś7oÛ¯%I‚4M°²²‚çÏŸckk ëëëXYYÁh4Âp8ô%µ8µßz“ÜÙVÎ9eYb2™´N‹»þvïØˆ‘¥U–ù{ÄYÔu-© !šq³yL§SL&SŒÇc\]]âìì>œ`<£,KTU%�öõÝ“�k _Ë‹ºZ^�{Ë»µ×Úò‚zÚÖ3ÆÀ±¿Æšq¬;è\GËLÛØý>�Í ¾ÂaÍÄ蟰lÜwJ”"o¸F8MDÍþ”ÄAôõoÖÞîûN)@+_ûNiÕ_Ÿ �¿ÏA„DðáÉö%�]²Î@§— ¿ÜÐéƒ0B'ȲÛ[Ûxýú5^½z…ígϰºº v®­�Ð<”R¨kŸ^ëúê ÇGGxóæ->|ø€››TUµPŒñc¯ ¶Ëä®vî:ºKcØ¥”||À¢ª*TU…››1ŽŽŽ>g}}[[›XYYÁp8Äh4ÂÊÊY6@–eH’q‡G­ý©øïº}o/7Ú4„^°ª�çSÄQ¨åÕKmÕ‰‘Ö ,à ¤¦ó/RJéGÆZk êÚ§”kœ6EQ (rŒÇcL&SL&ŒÇc\\\àòòJîGÜs<©Ñ+Œ×Ö×å*ŠI’ÀZëkC‘jݺ͡­T+Œ•e„t k팫wfœ¡å¾ïŸrs‰f¾Ösi)´‡<¼àåÉV #©Õõm&nž›°½Ë‹Ai‚Vþ ×|o ÷ß"v ‚ Ü�^‚ ,}=»”×�¤7á?É�{J+¬¯¯áÙ³gxõú~{ýÏww1È2¼Q hkAXqÎ!ϧ8==ÅÁÁÞ¿ÇÑÑn®oଛaÚCߟy:AXØw}ò¾&mÜ]¾^?iÀâêê WW³AüyѧIÓÇQ[{f}}ƒÁI’`uu¥}N–ePJc0 Š4â8i…2yÑÜÇî÷,¯±1sÏ7®¯¹S"�s¤yÖ:-â¹4 Ü¤U I’`0ÀY_Ë«Kmèäâþ ôë¦5Ÿ÷?vÂUc|�Bç,Š¢˜~«ªBžç¸ººB]ס~’iŸ#"¦ð˜q†zõ,™9¸µJTUŠªª •FœÄ3µ¹Uz5¿§WSÏ«Ôûõ—=·3>ã¥ù;^ЃçËP*lL©?WÇ…Ôy“Žî‹vø3ÿ"Tèž¹!~…\œ‚ ÂS!‚— K_Ó~éæ�æƒ ²á¡ ’mllàåË—xýú5^¾z…gÛÛˆC­¦¾x5ŸÊðÇx÷îp||A>�H&A–µ¦}Š}‘8½AøUhœ&«««xñâ~ÿýw¼xþ«++ˆ“¤ ÔÏ‹*�«¡qw½}ûçççÈs_“¨­3K¿q31£=áÿT)­¾ÚôÞÿõõ €›¥½n#~@– ZǘOQ¡ ¦%AnÜX›››ˆã[[ÛØßßÃë׿á÷ßÃææ´V RèD�³ 8ǘN§8==ÃxOÓFÄ{<Î1ʲxÐs›4Œ‹hœMóE1#P5_«ëº÷®¯¯gú¸qHQëTi®å¢ÈÛçæyqg]£Ï½¶áS{�';›ÚZìï kl[Ë«ÒU/ l#z�Ä}�8Ž‘¤ ’2AY–`æÙÔ†DKþiI¯ñ­÷_}¹ƒvúo¯çå[/@Ü׿Ž~ñ›’o}�g¿Ót³ôƒ ‚°Äá%ÂRÖ´´ÄMÖ¢ ›ˆ^‚ üìh­1±¹¹Ù ^;»»ÈÞÓ¤Ašw¸”e‰««+œœœàíÛ·x÷î®®®`�ñÁ·ÖÙÅw¦�“ñõkΙ‹ƒøó5¦~uò¼Xøyÿ²mÛ’{µvð(Rxþü9NNN0�æÈ2Ÿ¢1‰ã™Û d6lk™ÕµÁééþå_þÿö¯ÿ†étêï=̺ÂÚûjQŸIm�¥¬-áa— ?‰Cj~CÂŽaÙ¶.Ä(Š�$Ië@íϵÍ!ÕÔòjSÇÆAì\Ó‰¨åì¢h ÷Î÷´ÿ¢{¾sŸC‹›9¡í š{ÕNpi�pD2=É NsÇCB›7'{‡ر¬ƒA„¥^ŸšT$ "Âý#=ñëËÒW~°ýíÏ0°}…­ ¶Ò4Åöö6^½z…½½=ììì`uuu&µ[÷sܦ»¾¾Æññ1qrr‚Ë‹K”Uj5ݲ(íS›Üpö;ü3uä÷~»ð7¸´é§cšDImºªðffXv˜L&8ýxŠõõu|89Áp4ÂÆÆF{?ͦ5Tˆc…ápˆgÛÏ0�Nqqq�““�`øÔ|Öš6m‚§„…j1_®"ó]ËþQøN®9ZÞïhæÝ¢(E>5k¤5¢8© y&ÌߤLuÖ!MSdYkmpHr›t™Ë–eí›qqfZî˜À·ÿÖ™þÁ¬{º¾zzVónö°=—Q«›Þï/øq×îöD7i¹ýœÜØòæc”¼„;CAø•ˆ>=�äè¯ ?Æ’Z„o ýL7kSâj™íC!HÞºQü/"òi�FÃö÷÷ñïÿý¿ÇËý}lll´uŽ8Åú�}�¢gggxóæM›ÊpšO[±«Ÿ^�ù®�ƒYN6“{æ[¬¯çêÒüÐíGh¯]RAÌ BVUU¸¸¼Àññ1Þ¾}‹$I µµæëx5ŽÉ8ޱ±¹‰ÚXœŸ_àììÌ>= 5PäQhÈ[-Èýóë_ ûñE/Aø®¹eº¿ÁkÞᥴbzïÞ%@‘wdsʘ¬±°Æ¢65Pá–”çF�{'6GúÔ˜@�xýWõ) ;‡�kÝB=ñ«_OŠ‚»hÁ"–n½!‰�Ý^C>66fD¢ÙÌ’!�°cëlpw5}ÊK¾~¥A~5PÃK&AAˆ ŸéÏYöˆ1§ úÏã(Æp4ÄÖöö÷öñúÕklmocRúÔ„ý(`­Ežçm*Ã|øð7770ÆÌñvÔƒ¿.<ŵ5S¿ë[4ýOd�¦¶<õ” c ÌÄââ⇇GX]]ÅÆúFëÆ ¦€Wè ­5F£œuxþüÎÏÎQÆã1Lm:¡š�×¼pH½Ô¡_0xCüí‚ð}â¬C ŸÖ°,K$±OU8S/³·†PJ!Š"ŸÚ0K} °ªôâŒs`7ûsŸ»ôXö¨Á_,<<â/ù‚5¤OãÈÁD¯žð5ûÊÔ et;Ù^b!Y-X#>´O]ÚÉþ<”®&û3œuþá\ë�ìÚ~â—àAøþg™%¥§Ã=3K /AA¾p+ù“ÆšZ¼ÄtHm@¦—Êp0`oo¿ÿþ;ö_îãÙÎ3 ‡Cÿ3½tG�[Ë9‡ªªpyy‰ÃÃC¼ÿ>|Àåå%Œ1] _ø†Ïýí?›r©«Cõu¯oú¹\8­£Ñ;1q:�âãÇ ¶¶·±±±�ÕÕUŒF#ï¼6çü)t­# †C<ÛÞÆo¿ý†¼(pyu‰ºªQV%œµ ¥" … ¯4¬÷õÎuN¯8Ž'1â(†ÒêV-¯fŒ×Z·ÏM“Î:Xk{k„e¬3ÂôÃ_ö_sJZæ’Ù¯‘¬ñBb—x¿Ÿ†ö�ë?áWÈ]-Å÷>�ˆG^”t6Üm­Lž»8d¢AøEf—%�ù!x#‚— ‚ _¼ïýÙ‚3g~—t0´ À7‹9¥5´Ž°ººŠýý}üþûïxñâ677»:C ^Ã"Ïqvv†ƒƒâãÇ�¸¹¹3‡ þ¢Ÿžþª¡6ØùIѱ—j©K¹$,kPjÄÄ<ÏqzzŠ$N°»»‹­­-h­[Q¹¶™ÁDÐZ!MSlnm¡5òN>œ Ÿæ0Ö ® (²%'¿ÖOMZböAúªªP–%Ò4E’$ˆAÏÕ l>o¯$I�f©OLêu>˜/>ܼ„uÙ—šT¿æ²u¶…qÜZ†±Ö|h^½×° Ak)GŸîØ[7P“Ë�à,ÃZ cü£¹Ú:^ôXW™ ‚ ts�^‚ üûK ( ‚ðŒ?¡pD0m¥iŠÕÕ5¼xñ¯_¿Æþþ>VWW¡µž©1"¨ žc0�q~v†£Ã#¼}û?~DQpÎ�ˆBŠ‘O¾éuӻÚPKO-ekÓÔÏbêÔ¥ÿ¼¼¼ÄÑÑVF#h­±²²‚,MAJ…Z`>•† ©¬Y†­­-<þ¯^½jƒÓUUwýÛÖC–æÏ ù+D„ïma@L3õ¼Š¢ðU² Ji�¦[c;!ÒÒÔ»»Œ1¨ëìÖÙÖeÊà0—÷F�6æ¿ØQÓÖ$ .4ŸèqŠüŒ/‡~ ÎG3ÁX‹º®a¬ u¼Ð -²³\æ¬Û^˜MÖ‚n>ˆZ�ãÜEpìÅ®º60Æ?üvÖI Y ‚ Ÿ¹>ÁK„b9-‚ð£�?>¨Ní©ÕÁ`€í­-¼xñ¯^½ÂÞÞ†Ãa[Wˆ™AJÍÔâ²Æàææ'''xøoß¾ÅÅÅʲì^D2x~ËìÄÖúÑŸ.Åà·¸_9Ô !çÓ[E�Ë«+!I¬¬®bggZ+DQ Eª«„ã4Ë £»»»¸¾¹A^丸¸ÀÍÍÍü~ªu,ao&+Aø!x€CZÃÆåEQëâ"¦öàJnÖ‘F’$`ÇA@¯|:·Úµ÷~+ßP¯’Ñ�bfŠw1ª”>Sôú�Ì4�̧Ð/ÆXTµ ®¡Pw±—Ò�y¾bšðåóîüÈ­è5sA±wy1#“&<,3ˆTïЋ6)‚ |6"x ‚ðå ÝÞbt™{$žÛX ‚ |µqí ÆŸ&(Ç1’8ÁÎÎ~ÿÃïxýú5¶¶¶0�EQ'xõ~µs¦®qs3Æññ1Þ¼y‹ããc\]^!Ïs_ì»ÿ{$@ðÕ!êê²ué ™oGlfNþ÷k¹³Dw–Ñmƒ·i®ª²ÄÅùâ8Æöö6¶·¶ÀÌX__‡ŽU¬kúF!Žc¬¯¯coo“ɧ§§˜N¦(ËeUÞêÃÛ=÷Ðþg— üxë„PƒÈøÔ†Q!‰ØÄ‚ˆ|=¯&�R~Nˆ¢œ2’*A’$0ÆÀZÛÖójæ�¦&!óL$,rp33§_¹Š0ýøû­æï&8v0Æ¡ª¼àe¬ƒc¬@Ô²%e¹s.ó�Ý2·Èñâ$3`j‹ªªÛ¾b‡VðrÒ¬‚ Â"‚— ËÙôÑr‹Ï,‘Eìá[ŒkK˜¹M9Ç VVW°»»‹?üáxýú5666�¦élí0ÿƒ|Z¶¢(puu‰ÃÃCüù/Ƈ0žŒaŒéNÅò÷�Ìðgw0ͤ2¼«†w5¦æûKBpKlÿ…¶Ekcpyu ÇÛÛÛØØØ@œ$XYY¥)ÈuâzîÊÑÊ ^¼x�ižãèèWWW¸º¼BUWÝÉvÜšéžôY·úXÄ.AøñÖa¬0¡–—R¾þŸ±J+h¥Cù¨Î‡DDmÚâ4ñu¿êÚ;½ºñ‹g‡.5õÜJ¼xùeö[Í¡ Nìb¬ó¯Æ5dŒ[± !õ žlµ|O»vu»@ /xÕÆ ¬º~rL€R«Ùüˆ‚ ‚ðˆà%Âò–»O©“õ® Ÿ1N0–05™?ñbóÂÆ|8¥ŸÎÈ;FÖ°»»‹½½=ìïía{{ƒ,›I]H½#³Î9äyŽÓ³3áèè'''¸¹¹�1ÆŸì¦P@�Ä ¾ÆØ*qúö: ûš—y®‹Ä�÷T×!Ï�™ʲÄ͵O º¶¶†ápè…¯() EÔ¥6 $I‚µµ5<ÛÚÆÞ‹�Çí=i­…c„ptkæà¾àukD¸õÿ[Ö#ïOæOßð?„å�7œõõ¸*/\UU­µwlCaÞªH ˆb_Ï«®j”Qæsætê­ú)îJŸJ·nÓ>`ؤ¦É»1íÖqfïîÊó eY{1Å /´øF!Ù`>YïÐ�sT#Ú Î9TµEYÕ¨jkGíá-9ü#‚ |)"x ‚°Ü¥î2W¨²áAãăñç×Õ¡ùMü=ã^œjÂ/Nc7Á¦ð&´ÖȲ ;ÏvZg×Îî.ÖÖÖ •; ¢W#~9ç ÛßÜÜààÝ;üåÏÆÑÑQ[·k6õfÒâÝë¦â{HŸã�ÚSó×O¿îkãPÛEÚn‰k,ΫDa,pÖ¡( œ�ž!Žb¬¬¬`ggi’  ¡â4“n’¡µÂÖ7ÖñêõkTU�"/pyq‰²*»Ú;MŸ·©¹; ; IDATÅÈ;߉€^‚&#Å­›hþž¢GÞ„ŸjÑK–6Öôê9Ç0ÆBQ�ª¬P%¢(F§ˆ¢N\é;½”Rˆ£i’ NeŒº®amç4íjx}Ê•D G„fKöɆîûÆ÷6?QÏÙ庳L RpL(+ƒÉ4G^xÑËØÌ�ÃËI¼'ž…{Kp Q#¡€ð0Ö¡, Š¢%Á¥4Ø)Ÿ†RÖF‚  ‚— O±Aø&ÃN[Ü�—sj¹­µ4SgiÑßÙhžÞÔrbxQC+�A6Àúú:vŸïâõ«×xþÜ‹]išÂ¹pª;¤RkD¬ªª0�Nq~~Ž÷ïßãí»w8;;Ãt:� ˆÍ´ü�xÎ’2ûˆ`³ дM~f çò 0˜ú¢ßym<úþdY— “Ãs3 ÎYÔ†PVâ²Dœ$Ȳ,-ÝÂ�™}-/øC0i’ NR$q‚:ªÂë¹;oàN�Ÿµoq¯bWÿ¹í(C�Ùº1¾G±‹ÛQ³9ÔÓŒ«Ü‰*L¨k‹²¨Q�ËKÁ±?fƒø/ƒâ“- ]ED{Ñ‹ÁXFQÖÈ‹ Uma-|¿@'Þòß� ‚ðk!‚— ‚ ?øþœgCÇÜm°?;\3) ï.És¯Ë‰Rn¬ãÅ‹ØßßÇËW/±±±é‹×‡: ï™z÷<ÏqzzŠ££C¼ˆ>`2™|ºM„oÏ¢T›4“'³Mi(¢á×Ak 0µÁx2Æéé)Þ½;@’d†ŽF3·3ƒœƒ"BG>µáÎ3ì>ßÅÙÙŒ"/ଽh¦Óûi³fÈ %SÿÇ>ôk줄¯2¶û-DÔÖè êºB‘H’UUC‘‚ÒªKOHhkj¥Ç1Ò4A–¦0¦†ckÍÜ Áñ23™Ì,WæÇ­[k~è²á¶ÿeÚß?)>øúbWYFmy÷�uUíP“i…ªŠÀ.ör`HiÈsY eèìZ{v¦ZÒ:ÝûáÁ1|ÿäŠi…ºrpÎ ^‹ÒMÊêHAøDðAáGߟ/Ú[/a“Ì÷;&æë…4�íÉáðï&•áÖÖö÷÷±··‡çÏŸc4AkÒÚuÛ|"ŸÊÐ9‡››ãýûCâôã)lpƒÝ‰?øN ;¿Ò%û) iñõ,,©7z÷¦±nêpvvŽƒƒ ‡#ì<ÛÁÚú:´Ö>ÅhÓGÁIé«««0u�ç»»¸¸¸@Q¸¼¼‚uÖw]c6À¢À]ï´:s—}ôž+‡ï¾”<Ÿ>1”É…%ËÞÑ a¬pÎ×�"*‘–%êªFEˆˆ ulZ¥…Û´†I’ ˼àU×ê6=òí)�g¬ë4·ÿ6wzèr×bji*З:uh�Ó¹v©M›§ÁP°Ö¢®-Š¢ÆdZ¢(RXG€£à [,ªˆèÕ[Ï.­5z«["8G0¨J‹<¯0ÍKT•…³fÕöÏLO“,‹A„Ç#‚— ‚ ?é®�»Zóf~P÷»·ü¼ðÓ[Aƒ8Š‘ež={†W¯^á÷ßÇÎΆƒâ8îmèC0žÎyg×t:ÅÑÑþú׿âàà××רMݾý»N]K†¼o¡WS�?]=Å…:^ÍÏŠ(ñõpì0™Œñá쬬bwwY–amm £žÓ«É”òN�áh„ç/^ / E�ËËK\_UUÁY†"Õ ^LscÄœå¢SÈn÷|ˆ2÷Ç#úĘEX\ÏG®+Ax‚Ä4sË9gQ×5ʪBQP‘†R*¸Kƒ£×q+vùï%I‚4IQÆ¥Kœƒc†Cã|™¿§›Á�zc÷Š)?v>éýâ9µ�óÓ˜O­xw.è»Ç¬þhyËsæ×Yÿl¨Å ÎêÚ!/*ŒÇSäE†ºv°‰ös4˜HD®¬�»þû¼9ý¾ób$PUyQc<)0™¨*ç,(¤®¤^µKzRÑëG¿XÌÝO'H ‰^‚ ‚ ü„n…&ñjƒBô€�3ñ=ûÿ[›ejÿÑÌŒ(а¶º†��¼|ù¿ýö¶·¶�  "8ë�!DÔÖî²Öb:�âìô ‡‡‡øË_þ‚ƒƒÜÜŒa�õõ?ˆ>¡ÙI€û›@³=pWq#tõ41ê�Xžª{hf|˜L&°Öb8×å ¢8Æh4ò÷dÿgƒ[sjy13®®®p||Œº®aŒñ÷3ù€êm±kæÊB§ó)Yï©ç¿N© wwY„å�ù­Ó‹½;ÛƒªªP”%¢8Fš$3Ž^fØ¡9¡•F'0©A\ĈtŒšk°³ ]^®IÉ×/ ˜rð<¡¿ò7Ðí¡%,€¼ÐЫ•u÷”wk,òiYéë’û“ öƒÍĽ´ÀÔüÂokD/Ç„Ú0ò¼Æxœc:­PVŒÁ€‘+ï"ê5î›Oæ{ü3D/"0{wWYYäy�ɤÀdR¢¬Öi8h¸ð¼¯5�Ñ]ëý¨wd¶ÿ m-ê¸ ü�ˆà%‚ Â7fvÝø3Ý.BÁ¸£þQØ�¸ðùü×çZP[‚æÞ…ÿü?©«EÐO[6óÍ¿;�"DQ„••¼xñ¯_½Æóçϱ¹¹…Áp~žºŸëÕ)Ëxx€ÃÃ#œžža<žÀZRªßwl‚%xóm®á¦+éÎ Q¿îJ~Τ®’¾{Ò E“þ*ô�µEQâòòGGÇ G XYYAÇБß*±sím§µÆh4ÂöÖvwv±¿·k-ª²†³¹Ÿr_B�Á6XL�ÐÅäÀ°`8poT›íè1p ©—þìö(G œ¸ãçAX8®ôQÍ>Æååм “®­áõj$Ppë:hRSv‘žQZû'é¹¹f¥!¿â%ë�� ÓƒÉxŒ££#di†õ� lmn‚F#Dq ´iÅä„,M�µ5ìîzçfžç¸¼¸BQ”!S!÷úºçä¡Ë�ـɂٶ’W+€Ï%? ²Ó'/5s�5ãqHµ9#ˆ§(¼C¥ kDæ~º{þ ¯è™t´Ì`8Ô¦FQˆãÕ`€$I@!½¡_«¸Ö‘x!=Žc$IŠ4­Q[TƯs”w½8æ 9©.Ía3>õƇvuð¨H>Ï W<·"ê¯ö{/Åq?t×Úm-(ú”¨ðPYÿ¾ˆ³o‚q¥,-Æ“ “i�¼p¨kB¤5 M½/‚ƒм½*çµÿ"Yu‘ü©ÀŽ`¡®En0�ú~™æU­aY‡uµHµkê§Z‰Ø%<öZi–ó²8„¼AAxBî dÌŠ]þ™ÎÙµ—w@¸Vè‚ õ/ˆCl—‚¾ÐÂAÑæûí»iwòÜ~äÞÉl:;ˆjŽ»2LŽöÁbíC+ÔŠ)Du„,˰¾¾��Ý]ìïïãùóX[[C'ÞÍÕ´M/8m�Áx<Æéé)>|ø€ÃÃ#œŸŸ£,J8ç ´nØ|o;Æ.îS]'|²Aa>²q¥¡¿I¿µiAò¢ÀÙù™¯··ó €4M¡”ê\œ �´ÒÈÒ ››xùr7ã1NÏÎQUe^ ¶u[;�‹‹]Ý,,˜,@¬ÈÇøü8¦ÐûGo £Y7)õ­à2Î98ç°‡ZCÜ ‚aÜbêD±0hTó‹ÐXÌ_ÑóEU¹3äھåÈ2^j> JÔ®+˜ÎZTU…²,Q%’8†¢Z«Þëp»P!Òˆ"F’¦Èj‹²¶ ]{AÜŽ Žƒ¿Š¼8ÐÜÎ^ðRáuºš¥ÜÌEt‡„Ý!³•–º±„½ Ä�¤æ@̇JKAÜëŽuÂW+›óc—|çLË·>[ô‚†c‹ªr˜L*Œo*\ßT SÄ‘FG`4mØTz]è±½ãÝòƒ–P?øe>óª|Ë=LÀ¤�Ô¥0l¿§àXÁ:ﺻºÎqu�c:©PVƲ¹ržòH—ˆ]Âç^7rÉÂ�EÔ‡˜åöAa¹›djëI4[ñ¾»3›ÛVì‚õAafXrpl|€8¤#(­ 4�" ­5tä ¿«æ¡”¯u¥zBX/"ЦCd玜õµ7Œ±°ÆÁÖᣠbœõ¢—b M1"(i| iÊ¥++«xñb/_¾ÆÞÞKì<ÛÁ .„ Bm ÎÎÎñîÝ;àèð—W×°Î�”Æl͉æ'Ý—íøï‰šˆëè¡Wyw�Q¿¾ ëë ‚Á Tu�ËË+è(Ææû÷ŽFÐQ„ÕÕU¤i ­B0¹÷ŸÖë`ãñ§§¨Ê§õG”eÑŽAŽýfa`�…ƒ�%†ƒR :Vˆb )èHAiÒÍPP A�š½ÞØyÇ«µÆZ˜ºFUû1ÌÕÎ0Ø0Ø¿,Äþ½"‚Ä݃@¤š‹» óP—3mn ¹£þ“D…ïdœ^îu¸ph'j]èÖZ03ª¨@‘爂»KGqû9‚àkxª(Fš0ì˜V5T^‚-P[ëš²\^ƒÒ�&&�öcG3^…�J5‡1Ð/7Æ´îß~=äÎ��…c 8 °³Ø‚œ±óŸÐp­Ojö1' =ÊéµxÙÂw>5¬ŠØŸ`D¨ê “©ÁÕu‰³³)Y‚A6B–Å"((_ãµw}42Í}NúNCߌÏy[wŸêˆÍº¶U§$¢¹Ó®BêM Çc“i…³óœŸß`2­P× P´"$…k}ùm,b—ðE÷— ?âðAáI!îB ÍIè6z{ªÖÁ'ö2^ì ÎïèòéÀ”T¤¡"BkèD#Š#Dq„8Ž¡c Em`I)ðñAÝ.ZÒ¼8ЬµpÖ¢® ªª†© êÊÂÔáQ9ØŠáj‡@�×ÀÚô>Lˆ¢I’bsk/^îaoÛ϶±²¶Eá41S ø€¸­jLÆ|<ùˆƒw8>þ€‹‹Keé]ÔÔîêEaæÜkKÛŽ‰Øõy”¾ çS»f~d‡Oбµ1ˆ®.qüáF£ÖÖÖ°óì™O5EPÍÁ�VŒ 3�ÚÂÎÎ^¼ØÅdrƒñøy~ãÓ®‚áÈÀÁ§/„r ͈µE :ñbWœjÄiŒ(ÑaSA¼o/ŸJ•” ˆBšUÕ¼œƒ±¦6¨êUU¡® \í`K/~™ÊÂküæk˜•`Ã�`¡Cà±½Ð9EÀo| cUe1™T¸¸ãêjм0ÞÝ¥4˜4—Wû7Üg²û’µšLG‚ ¿3‚W—o^“ ‚ ‚°Ì]8·E‰Î#Ô¤˜mp=øT_LÖÇvb…8‰¥I!DH²8|Í ]qCGt¤¼Ø^ªIs¨f^­ÐÆÜ‰^MÀ¸6¨ë umak‡º¶( ƒ¢¨QN+”“ ¶´p%ÃÕÖÖ0–AŽ‘Æ`0ÀúÆv÷Ÿã·?ü†û/0ZAG*¤óç »ôw ¦®pss�'pðþÞ¼}‹óósÔÆÌÆ#BÊEÙ«×w“FªŸrn!ÍõŽ»Ý_³§´¥·¿Z7P×5./Îqt˜a{k ϶·AÖVWAD>ÌÜd#NÖ6V°÷ò&ù ..Op3![ÚNY8å¼°k$ƒ Ù(F2ðãZœj?ž%QAÇÞåEÚ‹öÞ©Ñs¶)Ðzã{‡—s^¼¯M S×°Æ� `+‹rZ¡Ê+E‰"/Q—5ꪆ©\m`­œœ‚# MQHÝÊ]Cî„]°ê]£w¥«mê%R/v*×´ðs�íœÞ˜®Upz…uE]U(ËU•¡®k@'Ò>òî.ÆaAÅ„8 XT¡t%”#�Ž¡u %ÐQ èÐHÇ^‹"è(òé�U½Úñ¢Í’Ú‰^Í{n—D!•³³Að²pÖÀY65œ©`M [—þ󺄳•Ƭñ©ÙA…DÔ~ìp¾RVSï 蹪|ÜPî[L~êû*( Ž}ͨɤÆÅå««¶6‡²”  SÌp䫵>´Þ?â]}­…ÁÏÞÿ=ºõžKdÈ3CÝ® `Y§PVŒÉ´ÆõM�Ë« n&%Œ!MzÉNôzбKá×#êöß2ú ‚ ‚°|M�ŸC_÷Á… ƒÁäàÈÊÚAG€J4t¦‘ Sd£î‘bÄi„8�'þ¡#ŸL)­š@1ßN5×-|üïmêw9è±Ö ®}ZCguí�ç5ò¼B~“cz3E5©PM ê¼F]¸Ê‚­�ÿVlî¬ãùÞö_½ÀÎógȆ�Vmº ïÖ¢¶MʲÂùù9ŽŽŽqpðïß`:Éa­™9gì߯Ô~ú~˜=Ýq;\ÃwôXS7n¶„Šôë·êES׸º¼„‚ÂÎÎvvv�Ä1²àʰֶ5k(Ô ÔaeuˆÝ½m\OÎñþà ÎobäyC5 }\:h¤ƒƒÕ «ë# VRÄ™¼¼Ð¥Å :ñãéÎÁu»–WÀîD'î¥hµÎ ¶ ¶[9”Óù¤Àd’c:™¢˜ȧÊ¢B]˜ÒÁšl¢8Uá\?ûŽŠ©Vèü.óé »gumïvÂ�;‚4bÊ;ÙÉ5.r/xU‘FU•¨ë Jkèp?3)ØÆi ) GÐ#© 1GÐ.˜ ã Qœ"ŠDqê…®(†ŠbP”ܼT¨Ë7›i·C0;Y±k²3[07‚W½LW—0uS¨+ÿÑ/~9S�­ îwb f׊HM�/š·ˆ!BÜík�rì^¾í}ݨInpq1ÁÊJŠgÛ#ŒV"(Eˆã8ŒIŠUOôz˜äòÐç}­kðñÃ*=ð9tk-C]º°ŠŸwƒ)8h0kX§P”5®oJ\]Mqu�c2©P &Ÿ^’{n°¦"Ü’[GÄ.A„_ Ii(‚ ÂÃ6�Ù,ÎÅ2»Z®Ý31,[ïòR>kŠŠ€8¢$F:LÚG2L‘c$ƒQA§Ê…c‚Ž•Oq¨ *¤=Y8jê\ô�ëó§SùöNX¬*bÄŽÀN!²ÑP#«¬¬g¨ó/tåå´Àô&G�W°•ED1žíoàÅËlí®c¸:@œj€,¬«ÛßG_ÛÇ9Ôu�«ëK¼�¿¾ù+N>~Äx<†1¶;9Þ¾_nÆ?-<mª7êÒ¶Çè¤Ab¾%¼rëÚ“HÌ7Ù:IÙYE�›ë+œ|8Æ»ÕUDZa�e b�"(ÕTÎ ‚:aŒÖRlî®âù«-”|…뛓<ò¢V#Ĉ³Ù0Á`%E’y'‡Šêú×VÚ…4®ÁEscVÿ}÷#Ö�ö¤ä*rþ�:@¥•¥ˆW"deŠÕr„2/Q%ʼD1­PN+“e^ÃÕ 6l¬õ5¾Õø¼V3OZ v- ¦2ªý„Ôˆ,™ðƒŒ §:‹ã.åg#ì`m�ªÒ(ËE‘øƒ:)ïB²! “Q&å]^Ã¥0Q�(Î%Ypx%€Ö>-_›Ò0ÔïR*Ôõê‹Ï|Ë8L˜[¯57#iXù±Hi¥àd€ÈÔp¶szÙº„5l]…W�Ò!ÛvýBp f(t¢‰o7· M^p€Í¬áø¾ ª]}4Ò`«áX£,-®®§�Ç8»`8Rˆ¢i!Ò ¾ú"Ö"áëö�£oïôjf/B/Wøg_ϳßÝGwÚlÜ­F»ZÞÝŽÀ¡6ÀÍx‚“�W8»˜`<©QT€µÌ@�Ë«/vÉÄ ‚ |"x ‚ ‚ðé­1?`ûÙ#æ9ÑË,@–¼àEš@‘‚J’L#¥XÛXÁêÆ « Vˆ³Qª@Ú 4ƒTxSÔˆ­_ è¹·z¡“™wÔ|©-ÞNkÿQA�B`7a‚s ° `JSXäãã«ãUnq„í½M<õ ›;k¬$P1Á‘…a€  HùŒ; 0µAQ–¸¸¸À»ƒwøë_ßàãÇL&h­EQHëáµïþû9]ü«Þ½2j4{­Íô ólª©Õ8»Dëú†]H3ÿbçP›cçpòá’8Æ`�assI¢‘d Hi?ÖpãQuP±Ã`5Æúö»/·PÑÉ%!�*d£ƒ• qA7) ³:&@9°b€B½B¸öóænï"`ví%43®5Ž Õ‰_m¸Ö"(Ĉ@œ€Ý Ô2¨Š E^"—˜Þ丹c|5VÆrç‘K÷„žà1,È_!pδ `Ê ¾VXH‰Å"z ?À`Ï4¿ hoÌÖyÍÜsF6‚’ƒµ¦®PE¨7C'¼0å@°¤ZÁ *%1bÅH#—0Eˆ“tì/Ò1@ÝÏ»Ö5î…ò®õÆ îjtòg¸/‰š ´OO¨ˆg¶`ë…/g*ت„­JTeŽºÌýÇ*›ÎÔ Wwc%DÞJÖTÿóã…:`hêµ=/h÷[c ¼³ˆš²�AH)ÊÖT ηXY‰1j¬®$ Š@ÚÁ…wÓ8¼Ô½ë+¾õ¯o.v=úçèA¯½øo÷ó÷ÄÇæŠg¦àÒŠà8‚µêšq}]áãÇ+œŸ�1žÔ¨*50E@˜S¨mu™A„/G/AAîç¡Î.ôÊMQ®m‚ Š:"$ƒÄ§*¦ÈV W2 ׆­dH†Þ¡bi€µ““ Åd\'5.nœdh?Î…›÷;—¢…š°�…à®õÊü‰iÒþÔ5Å QJPIŠ(eT«)\å!ÆÆî ë (eÔ(Pº±JB=|qŽkp}s�³³s¼{ÿïðñôÓé4¤%óõ‚šB“Zlq8BT“os[ÌõG“:sÎáÅ n'{ì_·Òž_Ÿ&R7kKev0¦Æõõ%Ž?(¬o¬`sk:6¶Ö1ŒplaÙø‡«QÔ9òjŠšr$+ k;Cð` i¡gâ,‚Š(önV¥½hÏdÁÊõ§®ì©—*�z~‚;.¦ya?¼¤òHêÚ€ *"D‘‚JbèL!ÄÈFÞy¶º6D1.QLJãÕ¤‚)-\mÀ†º �›¡pQû¦”¿˜@Ì Å,Zd–§ð=�÷-�›Wo}ÑÜÌ ç€Ú8”U •W ¸†J |�-†‚ )àÀì4¬" RÐäi††ŠR@'p:( .Pš­~s›)—iÆÙÅ÷.꺹«½TÓäç*¥•¦HCéJ'PQ ×PI� Ëq™ÃÔ\/í¡µ•O Ëa-ÇM�/p=áæ¶S´5/Ý'zQ¿ ¼x¨TfFe,Æ“çç7�¼Øµºš©‚R1ˆ,¸YŸ6ó{¨×8ûûø“Ëä¯9”ÍŠ]üD¿cv}?ÿ»úmîÝ]¬Õ˜L-.¯Jœ��ññôW7%ªZÁ²Q¢¸uwq{pBA¾¼AAøt¼çSûèù@uŽ+ïêrl`¸„#ƒ8N� ¬l °¶µ†•õ!VÖ†>Õ× FœE Í 8eaa}p˜,XÙp²4¸"‰eÇÜå]dî‰ÃŸA½Ôss–î�Êæ^ …¹KåE¤¡I�b¥Ò8B’ á�k±J°¶²‚h¤à¢¹CÇ$ȼkƒì[[œ]žâí»wxóæ/8:z�óóS8kCÚ;ž¼fºc>À!jÉ÷pc<6PsK¬¾rßaƵцX `¶O®al‰µµ!66W‘²•é(‚…�å•+Q™“òãüSs 5p!…­`XG€f@3ùaL–ü!� ã$z±æ.5S'x-JØ¿šK7ñë IDATðc Ï(ýx¢à`‚»*ŒgZAE„4‰‘ŒV0+¨sãë^Oq}qƒ›ókLor”“Öui) · fjÄMÊUº³åévOˆÓKøNù„Û˜\‚èÕÔ×Sa�ᜯãe¬CQ°ª R]ZD4)°Š¼àÄ.§‚CFk@´+8Š|ª>VÞÁÅ~Ð`l+ŽwNËv,hÓÎ-r©Í¯.¨]Q—LŽDŠ P¾V©(ˆ^6 ΰU�º,P—SÔÅe>†q ÅЬ_[‘k—l* ÇÄ|k¤˜YñÜ#zµ’T3�( …Î:Xk�çc 2…­�Uln:h¥'*¼'G€â� –p»nj“*{á(üõuûùUȲ׃‹ªÆr;5sUX/C�)ˆ¶H`,a<)qv6ÆéÙ NÏÆ¸ÔV”„G ´é I’u ‚ KC/AAµñ¥ùÝvï%L޽ÔåÈÀ‘”Ciè4Â`u€áê«+XÝ\ÁpÕ‹]é †um¼ å©[R"Úàòòé¿Z'W+t-æ´Z÷Íß ¹Þ†¾ &9 ÌE>í�"Ý:¾tD § )BD.1(1Áu¥à&¥™b”­a�¬ V)4b”y…b’ãøÃÞ¾û3Þ½ÅÕÕ9Êj  "ÇŽ¹ç ˜ýKh&%| ºz�³«ûœèždH�³«÷�nüÝzÞЪ.a\…³‹�x´‚tc¸‘Ae V ƒ¼š`ZŽ1.o0.®‘WS”œÃFH9D‰¥˜ˆ¼Ë•ÿöÞ´¿�œKöü¹p•lW?}çÎ÷ÿRófævw=µyÓJ23�3/€ÜHJ–m¹ì²õSI–¸f'Áˆ|ªg!Õ—0dÔŒ*­ yß“^d×èìz¦A™ô ÚkX "ñˋبø’Ââ KY:ŠÂPÖŽ¢Êê…ãîfÏþ®Å7Bh<â§9^IŠ£ÓÝÿúÀ•ät.e¥WÆ�[ðRX÷¿H–‚)˱¿u ’U^ ¡˜CÀ4�Ò EQ ‘ð’¨ò Á‚±€%ˆUçŠ!¤¯žìê\AIÿ>"‘Ï¿ÚǯlýæŸt )RúçJ¤¹Ië&±11ã œ+0®B\…u%Æ–1gÌ:´kЮÁO†Hwèä8‹ž?Î2«(zæÚ:‚xe‹˜B¬µ]×q{ÛòáãŽwîÙnw©)Ë SˆIê.ñ�’Õ”0_XΞãóÖ ßnUþ%Ï �¾ÚÙ*YŽ•�2»„*6éôàðÁÑup{×ñîý¿ÿyÅû÷ÜÞwCФJdW$q³•aFFFFÆs#^Ÿþh|®ß:!ŽTt a‚$U—DÛ¯@‡J‡­$Ú^,ؾZ³¹ÜPo*ªU�«,¶ïZ‚Maïˆò©>ÿKc³¸·ú’£¬ŒãÏüC€ùÜÖð|â�žöZ‡,²@ ¡I­&©á£&†£¢ ­ë<{Ï]sÃõýÖõ–‹åkÖ‹K–å†Bj®>~äýÛ÷üŸÿþùÿþÏÿÃüÉîp3ÉÉÖ%Ú�éQš3ÓŸ¬ úþHãKFÒëIó©'»BVx}Ó³£“úõðœÌ§±®(W7øŸß v«×Zµ•§\ß_qu÷�»Ã-÷í-�ßÓ†¯ �Ž@"èûÆéð󤆉ž­_½‚@u’™rî�èÄÀUy@wp¤×HcNCHMÝ”Ïe)¡4Žra¨–õEÍýõŽ›�÷Ü\í¸þ°ãîzOhCÜ !šQiˆDZ€K6eòy–[Úþ ׸<3ç‹»NÖB“Ù6±ô*x¼ZM Ý+KgЪÄÚŠ ½­¡àT]TÌ ù\ÑüO1„ ¡6’á2»¾ÈÙÙó”1fõdÃöÊNdäâ°)ëK“²O“ÝaáJlQż²²Ä•5‡ÝÍîŽÐªUœ€ÔiI-:¼‡3ù«Ô1FM&k=�öl…ˆA¥aØññªáÏ¿n©« ç «UI:ÀÐ6‰ÚMÎñ¨ìÒ³;«ôÁq"ßxlÊg¯õ X†ŒÒ~:Ú˰Ù'¾kjA"Þîî=ï?ÜóûïùŸÿyÇû{𯴩�*ÙrÚaœûc•‘‘‘‘ñ’� ¯ŒŒŒŒŒŒŒ§!}âÕyg  Bjõxé)ŸÆ8A*G½.ؼYsñzÃæÕšÍåŠba1•¤<›@�¤zŸah 'Ó®D®éÂ>�qDz.9îE}à?%‘Æß÷D^ßïw´ö;ª="Ñ‚ER;àé|Ã!íŽB šn‡­oiª'5o?üÉ¿ÿίü¿ýõ+?~Äw�@´A¶FªnÚy]džßÀ&㳦„0¨¹Rv�ÕNò»†F]>“Ï{nôéÊ¡ÓÝìqF«¶Üînï[ª�ãõÛ-f¨×®2\Ý}àãíî»;öþž.]J¬}Q‘:Ö­Ñî5Õ�™e!<Ô,�«¸Nk™~rèè@àkïG˜<5e{‰ÄŒ\a1êp¥P-m²™-qu Öšû–vçÑ΂ ª˜`bó!V¯dS%Ñêp^ŸrÉ‘¿§š§^Æg ’s*÷aۂʨ Ò¤KÀщ : Z-h¥ 0HEÁcð€×d§fPYõê.í•d2Y&Ô�|Õ¸ÖyåH!¦=±b`ò*z+D##‘€Ø1Qíe]�X‡u%˜Häµ&ª‚‚oðt ž^åcИ9˜Ö@2Qu TßC¨ýïUâ­ÏS3&fyµ‡HƼ¿§*ËeÁfScŒÅ, Œ9Gb…ôx=(ç/"Wò¿eyþ c\ŽÖÐý5J�VËÓqÉ.¥ Ǿ \]ïyûî–?ÿºá¯¿n¸¹ ´�Cµ*„°(ŽÞÎ0㌌ŒŒŒçD&¼2222222žþqxÒ}íª‘ôêÓº:mé´Ã`KC½.Y^Ô¬/l^­Y_.©VÅ …¬“ÂÉÆ°'¼HÍâ±Ñ¡'Áëò¨×¢>Ò˜› MÑ�@›îcíe£�X"æz…¯ÑŠQ¼ {¡éZîv÷ˆ/øãÏ?øí÷óû»ß¹¾¿b×íR3Ø€‚�»”UÒïûË‚Iº‰çotd| ¦d×9««ù°›¨ltTۤѕæsœ=�#õ)£ Ù�¨ÆHDy‚z~GØxSñÛ»-ºèXjÊeÁ}sÇ]{K£{:iðÒÅœABúîGÕØð¸gê’2ɽš7¯?="»ÕqþÌô>½²+‘í(M�õ¨Q�"P®,Æ.)ª’¢¬¨K®?Ürýñ–öÞãøÆaTêSK|òžÄŒÃ¨¹?Ê€ÉE4ã+×Fªƒ¥aÌÞŒj#�Å‹#˜ ãjl¹Ä-6‹ ¶Z!n�Ú¯Q �¤à’DnÉd…2’ mÓ™þüuóêH5ô€z”$8¥ãz0å˜!ˆ“rÍ c±E"¾Š’fWÓÜßᛡÝ'â+Z öÛ§LÊÓêõErôrúýzné79nÑ4”¤¤í:®®sÃbQPWÕÎÕS`{[JM¤›Œ×î!gñø u~áQ9½ýCFòézZôÌ{NcƒÔxïh[áæ¶á�¿®øí÷÷¼{ËÍ]Ç¡±ÃñJ”“®Ü¾ã¾½§Õ£ƒí‚áwTG¢Ëô/¨'Vž`×–ñí1 µ—!#îÌ´‘IR”2dw dWnð´@%ª»”M¹]z.§vcËk¢ŒŒŒŒŒ/G&¼2222222ø@;ÿÌ]b&äSoe˜š»>eÖ˜\Y°ºX²yµbózÅöõšåE�, Al@mšÔ\½m!“FñøjäôNl O)/ýú]û"´žåèyt’Ñ[<D…‹¥SOh Á¶”Ë‚j]SÝÕmõÉú,5ˆ¥o%+�¡É¥ú ©’ñ÷â˜ì:þz`6%UWVt=óÙx¸~Á$�D&Y$ã={•ªÒ¢Ú¢ÖcT«’źbûzMµrP:i8¨§£%˜– ž ½u¡ž©añ)娽'ãfö¤�/’=¬ðš6ÃeÈþ™v‰C¤¦zûªdÉ&:ªÒÄ(F:¤°”+ÃÚÔ¨\PTŽ�ïn¸r7ìnü>Ð5¬QŠh´J4©Ž�6æOkºfÒ+ã©"'z&=­ã)­^4R51oË‚­pÕ WG¢«Zn)ë5®^‚«ðX”ÑÎ00±D콋Ó+ÐtíŸ*�N;¿.:~¯[ >>§sunÊÌÍàÄP%UcÆ8ºƒC»ÚÚ¡!ZG÷ÏeR�šÚ)Æ?ž*�ŽëîT§8T=­ÙGkCkΪª@Ê‹�ÃÔ%Ð!té‘Ã黜ù{OŽ‚Î7Z=~eú‘gÀy²«'º¢í¦ÅÁ7�««=oßÝóë¯øý·÷¼}wËýNðZ¢Z‚€‹ó"©îüܑɮŒŒŒŒŒ¯D&¼2222222ÎèT9j#¤�ÿû¯¨Èò±á«Áxʪ ÞTl߬yõ¯ 6¯V¬.K .@"ºÔ„dùÕ“^Äü®™¢kl‘ž8¬L>�¤ÔÐgè›BúÕGb$ÛtšÚ=¶ƒ•ŽŠ,R.N´èiPßá=¨ Ô›’ÅnA}¿Ç¥Ùµ„Æ£a’[!“]Ò:m)eÒëG€¹ÓÉgœ�ᮽ­aÆ×ž�é‰8Û§ë­Æz^'Ìþ–”ªx-Jƒq`*a¹­¹üeËöõ–jSb+!Ø–F{¢Ë£&’ýQ!Ö¿žð@=™Ð÷™=æÒð™ê€i{ùüߎT«Ý¢·h…™µ£H$®P P [àªW:«¶Hê Üù=]H‚Œ¤Z�uш9Ru ý+“^?RM™©Fõ´®L•ßðjbQ)°Å·ØP¯.X¬_Q­¶XWcŠŠ ŽƒN¬ “Æ}>1¦ÖÆ:ÿµ|â=è“êÇÃ=^IÉ™Úr|�ùïÌp}4Œ3[€XÄXŒq1;ÐZºý�‚z‰„{"Ý-½5­õÌ»˜S�:QÅ©Th  BàÃÇ=]»£(,‹E�µŽª,(J‡�¾D’ëÀ¼¶ëlm:?’rœË?‰ìÒÉzZf³aÈíRj ji[Ø7ž÷ïù÷oïøõßïøí��¼{¿Ç늠1§N´@ų» ÙG6####ã["^GÝNÈ®á' #¹CTvéP0N(Ê‚õ«›×k¶o6l^­Xl+ÜÂ` �†&Þ ¨vioßâ §ÏÉTÍuúªæ¿:j¢ÊÜ•ðs�ÄÃ-Ù± $“\³áð)‰¼óxMÖ^Àš˜]& ‚�¤UY–ܼ¿f»‡VñêS›8©„tò˜ý³o­~æ! *Y}ô©Ã$:œáTÙõ ‘¥ÙÂðÛbÒZ|À’ëX]RæV�HZ‰›Šå¶æâ— —¿lY],¨V¦TÔÆ¶t�@0!ÝNÖË‘$¤7×’GÇŸ’]œ­Súàíd|ܳ·?nYë X�RÊ7LY<ƒ®jS²mW„°…ÃØkvvO8@hZTFÉç “”«�ÖpÍ\WÆSAú îdšÈér‰¨êòš”]Æa\�KÊÅ–z}Aµ¼ ¨×˜b�š‚;ÚN²¹Îj‚ ñŸ+zNgË'}`Åó@…Q¢üøÕ� ¬3l’J›x\‰MDžÁZKc ˆšHm…-žƒFÚ,Ðgœž«wóMÇú·™* 7=(4mÃí}ûww”å[4¬�  êJ¨Ê2êï´›¬¹„Sjo²)J®ÐÏ_Û¦Oú‰¿éÑO†QÙe‰*-‡WK×nî:®®vüñûG~ý÷{þøó†›»Ž¦³ %PåÙ5}Ýy-”‘‘‘‘ñüÈ„WFFFFFFÆQ÷æXÙ5ù(œš 3e—t`•¢vT«ŠË7^ÿç%«Ë%Õ¦ÂÕ)RcXºÁú íÃÉÃ$[çé '>…Ç�ì3]G~eÏEÝœ³Uì}â6ÜX Ѝ�}¦*[P׎Â9ªzAY”xßÒu �vï£q�¨‰O9ð�:4oä[î>ÑšÿA¡ŸMà9þõ¬ŠFõá{÷Ã>wøŸï¼$u猗3“Y5©34‘WQ¡*V±•au¹äõ¿.¹øeÍöõšré0p=ÑÕzD ¯cõéôI:Í‘(M¯]ž4âÎT·S㬱O~Æ:p¸ÏXCU�H® y')W§o:‹sƲºX⊂¢(¢-#°»>phۤȈ:bbÝÒé+8&zžf•WÆ�sQ9™+ãoÉ®¿±¨)påŠb±¥Z]°X_R.6‘ì²%ƒWSJE»Õx g¨<ª¿zÞw)GV€gׇ³išÓzDz��4ªD²Š8·�˜Â"Æ`­ÅYW5ª´@Hk�àƒÇôXiÓ•<@îȹW9ù’¨LŠ÷7x¯Ïû{š¶¡ëZÊÂb ¼º,)ŠCï7úÉÙ?sÌ’e±È¼â~;²K¾p@è™+‚ýµ‡=IåPŠø¥–¶S®oîùãÏk~ýíÿþ÷{Þ8°ß � !©»²Ë¦Õ«<²ñ‚çcs32222^,³]vúÀ'ÂŒŒŒŒŒŒŒŸ�)»z©ß¡Û[u¨xpW[– 6—£²«Z¸…EœL@%Þ^¥WtÛŽÛ`ûu.:kFh�mчÖ.Ÿ¹–yÈ-PÈd ræ�’²«oOm«‚P`­Cƒ§9ÜCèØ™{Ý#�ÔGË3���Ø™Ïhe|áHøÇã¿K�>ê0f�ÇÁQøúÌÎp òzûYê× ¬š�‘“&ž¢¨�O°!ÒËŠå¶äâ—-ÿ±e}± Z—ØRPãÇŒ.sÅ(G;äL½:ÍÞ™é)ä±yû)ó²£Ú-G%ó¡Rzlc¥ÑÆðXç¡’H0õ¨€1‚5–ri±ÎTé:ŸÈ»Bð„Bçc «±q:Ïâ‘3å]´i<»É�gˆk$«Z3o�)90�*M›]‚¸ [®(kÊÕÕrKQ¯±å5ÑÆÐ«à“2ê˜.9¾¢(gÅëßznÝ×ïä}Ä8•™Néí¥w7 ¨`¢’ˈI›{⽊†œ2T %ønfò8Ï’=ªwzdq={]éÝ©×Uâ Á³Û·t¾¡,îX/?"Þo€%ue¨ŠkLܹ¤àñ(~Fzéô²?=‹g ±|õù:½h<ÆÕú“«ât©Ûo=ëUq‘¬ ZBAÓîv-××~ûíŠÿù5*»>\µÜíÀ‡¨Q))’2,žw=“¸;�r¶-)_=�32222^Üì“Ù|+J¾@dddddd¼˜†gÉ®ÙU$î¯õêéBƒXņz]rùfË«]²¾\P¯KlmPëQ¢uá9²ë8 ^>µò�3F;*©!{ºvÑÏô4”£c1mâþ �é N4ƒ}ª$KÖÞNmHqŒÍfõ ð˜Âá¬eÅœ‹†Áö· Í}Ì.d é£îÃ0%µÎ�^<ð™T§ ôÌý~ìºñ½‘I½Ï¯ß‰ÚŽ£ÈH¤ì-ÄFe×rK½º Z]àê5¦¬QSÄÆ|¯¾!„ÙÞ}öëù—\ÿÏþV?u}›V¾±^ÏË€"E1b1â�¢¦P" &£pÐ@× øA´§‘úµPªœõÌ:Õ“Â`†ú!b‡äƒ�ƒpuÕñßÿóžÃ¡¡i=ÞëË—Q¥dÄ-B;:Æõ«rZÕdJ_>gít‡ÄÃÖ†çÈ®ñ»Êñob­ ½�¡@�ª£õw;ÏÜòÛïùõ×wüϯﹾñìw!X‚–(FŠt­0ãêþx3ÆÙÍjräãýuÇ)/±2žã“r¾zfdü³àæÓWžñœ‘‘‘‘‘‘ñÏXÂsBðœÛ嫃™LÌîRã±…¡Z—¬.–l^¯¸x½¢Z =Ù•vÁÆF±g®ìš?‘ Í“/ø¢òÅêˆÏkþ|ÆÇéžÍ“”f!2^"X«Ôê ,1(¾ëèÚ–{Ùã»A=R£ W I2 ’çyí}¨“Ÿ`XÛ§�!‡Kú|£'|H>5Å:>ÚçÎ@þ˜ýÉó1ù#3¢i$»¦Ç\%’]AºHÜ׆j3ûÌ®z]¦Ì®”ï…ODP@5 ê®q<Œ;ûj7ÊgŸQùfuëÜ1Ô¡al&}HU©Éð@lN[k)p¬e‰CÓ6´m ¾õ„Ð+VI�j;˜×ž{Ÿç#Ìi†2’‡úƒ×�ï>Or>㓇Ái‡dÔäªB�>ƒË�1Wâê5ÕrK¹ÜR,¢² [¢ÆÔ¤Û�а!­ßs(~Řй c_ƒ{RoVóRmÓÚi#‚+£j4Ü€÷-m³'h¬7£�_ ·S4“­F2©ÿý3À±@o!kh´bÕ ´!pwçѰÃw11oÊ{°Æ±\ê²ÄZžHÒµd ñúëϹ�,ýî+zn:‘ƒˆmîxpªÞ’£õÆÑÏS¢U¢›€b’z1Z†àPuÂÝ®ãý‡¿ý~Åÿ÷;~ûãŠ?ÿºãÐ(5A+â¾úH’EÂKPýÄ¢ó‘‚,¹de|gä!˜‘ñÏCÎðÊÈÈÈÈÈxém�3»Úg*…ž´Ñ@ ££EmÀX¡ÞDe×å/Ö— Ê•ÃT2]�Ø$ø˜Ù%4œ GwåÊ¿ýâ&£Çç3Of-…YzDÜ�¬šØÓÎ`'TËHzu]ÿ.WtmGØ�¢!Ä�Ï©Y"z6.=ãoýð{ªð:;z%©�D¢Ý¡<¬a”�­9ú{nR}‡¢ÏëCaGGGQ›šÍ«E$ºRö .à%Ù·öd½†aöΟDŽÔIú`�­®~4ryÌ›½®aü�¤—ðÚ sAŒÃ––zU±}µu\¡ 4ttêÑ \lS‹2u}ªvŸ›3ç á\ 3žõê¯sº $Ò"(ø>oÊ\¹Â-VÔ« êåW¯0E ¶$ˆ#`b*‰ìÕ¦Ãóé÷,”Ïÿä¢�Í×QÒk#UÔ‰ÐROð­B»§ó±zÄÊ?©SgêÁÔ R5^ƒM$ïEL:øÅ%ÛD¥ -ûCËÇëÌG‡†Ãá@×y~y³âõeM]WXc&×sÐt]ˆ×‡Þ6„HþéÌ^Q¾°R�Û7F†_fù[£•£¦µ¶œ%·¦ë{râRÞbŸuV¢t�p8ÀÕõž¿þºå�¿nøõ×üöûG®o:Ú®D©A–ˆ”DE—±GÄ£N”½šëuÆ?f©Ïùñ2##ãoA&¼222222^r;GW¥¤ØðôQ:Ôã¥Å:pµc¹YpùË–Ë_¶,¶Em P°!^ÉÊ�ƒ¾U�¬§Ïùµ}åù�ÏWÓo½µY¿/|jå$Ö:ŠE�1!¬¡í:v»�¶ CcìÙc”ß{*Éó ÁG—rkèó§Tˆ¦¬x¢j £¸Ê²ºX°}µf¹­#q_‚ºHŠyéRVK˜4õÌ©{l§ý·ªUßbHÏU'cîÜØô †¿+‚+,åÒ±ö+ ‚ïí¡¿#t¼QèŠ`0¨XDs»Cù¢ Ó÷q57¤2ži1%»Æz’Ô]ªx…NÄa«õêåjK¹Ü åqU´2Ĥ/™åvý|cu$—fÿ–S%ç(Ü4¨&RÄZŒ±‘Ò2‚�ï¢"¾ �:|"–dHD�&¹>öÒz¢‹™Mk¬=¥|€Cëñ¡¥in¸»»ÇûUªA)\8ÊÂR8‡1aTðk¼F >’OriJþéd4}i}ž“^çÞ{Î…NØTQ=ïY.Ä\3q(QKÀâµÀ{ÇýÎs{Ûò×Û;þëÞòïß>òç·¼}OëKBˆdRƒ”ébcæÙ4ñû2»_¸–$“]ÿ@dÂ+#####ã¥/ä'‹øSÛ�¸ jcˆQŠEÁúrÁÅ/[6¯Ö¬¶ l-ÑÆPB² ˆ&j IDATÉ®~÷ì§}I~ž¦þÐúžìêUÀk˜ïoNÊ u†béXú›ýŠvßp+;v~�÷ªÑ¾ÇLš½ePÆw>×2QpÁð=ã;ξ89Rƒyþ_HõÌ––ª®Ø¾ZrùfËöõ’jUÄìA3Þ.föÄOX÷–VçªV¢¿äØmªíš7Sä¬_zöZ!3YŠ4¢ÇÓ!ÆâjËBl›õ‹A;Ï!´hë žd™¢=é¥C®×cj®ŒŒoº"J=ù)iÓkˆd˜ýª Æbl‰©–”Ë-Õê’r±ÆTK°U´13XSå³9öìv†úÕEŸ÷ØÍld5æj�ɱ”?"‰L×Q[âÊÚ|@Uñ¾%„Ž‚΋á|6â¸â’ùuZÇ)l{›UÑdKkhº½óüñç5MÛ°ßïÙïw¼yµd»)X¯,u%”e‰àãch—TWc'j&IkàÁ×Q?¡k•Ç*ñ±QäQÂ\ú·L~ß+ÌRFOé‰\›Ôn,�7Üïw»=ïßßñöÝ-þyÃo¿äí»{nnÍ ìªÀT EÌüƒOÞÇ÷¼ÞýT$³ž7ÅÎxöÜpFÆ?™ðÊÈÈÈÈÈxÉøÔ"^RƒXSãWØ@µ,Ù¾ÞpñfËærÅbSlK°ÝÌÊñÑÊ%©™>ïɶMc³\5 ÛI»Ä�±¸…eijÚfE×t„.p¸ÛÑ6 }ˆ¸Å$k6}¡Çò‡œJ‰ðH¯|H¾cQëéä!4eœƒ)¿«*KVÛ%ÛW[.ß\°y]a*®CMˆ¹]Rþ &Ûª±©Ÿe<Óc3M'¢ùdÍ“øHªNLÃz‚]F%ÇðŸÆ&´ÁVk+B§ƒ­áþ~G×´t]GЀJÁЮ“^§cVáY ´ŒŒ¿ãb}nɘ֗’›±XWáªå"^¶¬1em uTv�äu¥a-T¯¯]mœæ8ý]ËÉþ¹Í̺n¤ �oÉ.“¶H²6´ÖRÔñ®!(Ms kèvžO¿+Lžsò÷Þ¾p°1´É¾°ÓŽA]°4�ps³çý‡ÿþý¿þûþuÃÛwwÜÜx|¨ñºÀØcêdh“ònJÏßÇ÷&»~&}YOÆdÍ\FFFÆ)2á•‘‘‘‘‘ñ2;:L#Ù‡ÿŸl9žª»®²” ÃúbÉöõ†ÕÅWÛ¨ì2ÉÆ05ˆ•�ì u®"“ïù‘÷ï† ¢“°ö©Ñaˆ`<,‰í›z]rÑmèš–ýÝ=!èö�ZŽ arÞ¾wáe£o��UuM¬†¦WÍí‰ç=çǬ=}S‚F‹B±JQZëší«M$í×EíPסÆ5lÌëÒIʱrëÜ+úI”ªGouÖF—ñ8“6F€GŒ .Úî—ìï–h¸{º ²˜‹Ö7Ç ™ØÊø¾k¢TîØ4„d¿ÄU¸Åšjµ¥\lpÕ q%ØÕH$Uaãªê±:ösÏÇiœÞœO’Ê+QX B±%¶ZP´ e½Âw Ý>àC‡¤µhl(“T,=ÿ¬ƒõŸ j'‘QŸ«GçJ‰j K9ª®À‡CÃýýŽ››¿¼Ùðæõ’E]PWÖÚD$E{øÊë�äv Ú“^ajô7ùY¾`D¿‡Sű;mÓ Æ"âPB€Î mgØ7ž»»×·Þ¾»å¯··üùö†?ÿºåêºa·�V‡�È"')’:Ìž¬J•ãr˜M¡3222^2á•‘‘‘‘‘ñbñPã6Ñ_’,½’QÊÊRo 6—+¶¯×,75¦/A<ÁŒd×`á"šr>Õ$þùÐë¦d¢Møxƒ˜FÃ×Õ‚`©×%NíþÀýõ-mÛÅfO0tu)t�Ñ–&ã;žçH/‘ÉØ?š}™ôz¶c?þ5XA;ÖYܱÜÖl_oØ\.©–¶P¼ xÓ+T#iO"͆f¸Lf�¾€#)»&ªˆÔîmU�O7>^ú¹’šéñWaÒ¤1liq8–›ŠÍ«%mÛÒ6]çÑÁÇ=Í’TªŸÝ.–/ü[FŒdÛ“ ¯Ó�åóߨj&»ž½‚ͳBúóÒ7?‡,. ˆSŠÚ²ØT¬· ÖÛšz]bJ›l[Å1‹�anêh 5=ËòRFûx$$mÙ3oåjú9àAk RªUÉêbIshÙßí隀”ÐzÌ0Ì™F¨äŠ”ñ÷ŒpÕ3dIÿC\L�‡-W”‹ Õbƒ)¨¸x•Dv1f~=2Œ_q~Z¹ÇŸ¦ê7!h´4ÄZLQRÖK|×Ðvh÷ô~wv Ï4Óúþ(“( ø¡F§¸ÊR¯JÖK–›šja“-«'ÐÎò�kä˜ù22Lç¡W;»ßÏ5äûw&“w©=!Øç¥iT�cÀ”Bµ*Yìk–›švײëü¡4ªÉ(Q§¶^Ÿ77ôLÎXFƓǎWäDHogèÆaÜW¯)l½Âuü›2(»‚Y>2”åØyÚÔT‡¥„™µ¤€qز¢KÊzEÓèP¼�ŠwÅTÓF‡c¥×Ñó�äÔÊ‘òHN+œºÙ¶%,!t´�g¿ë¸¿ßc]KµP.^tº!H ´ -*M$½zµ-*ÑîõÄŒ¯€È¸élºwæÜõDç;nP,ÒçÅ%•—ª‰d­FKF  m‡ƒçöîÀÍíž¿Þ]ó×ÛQÕõö–«ëMkh;ƒJ™2ºJ�2f~a'd—=ºJNÜÎì<�£³~ú®¾�L³—bFFFÆ‹B&¼222222^f{gü.œD]1L!TË’å66ˆëW j=^Â�×5ͺá…+»N›:“£+ópõø¡H™2"9ÃëOig»02_a ¾¢�a‡¥¨ êUÉr]³Þ,(l@iaPvy�¨ÍèOSÌ©šd“Ìfë×»5ýÓæ£ ¤‰ž ñIÌ×ñªˆ�6aűÜ.ð‡ŽýÍs A£¢ªM÷5“\›O}ä_?Ú€“#{¸ï L&Sò*ÚÂajKL±¤\¬)‘ð b ‰pP‘™²+“]O_�ö—ÆiM¶†8Œ«(ë„@×í9ìK4t¨÷}¢=a.³ EO«$r\äỖh“Òu€Od—ŸUý†åú „—qŽ®½CÑ¥E´mð�¡kCT¨iܬd X ÎZœµÑ"Ù¦·)”ùZBûïƒÅl´Þì:Åw�ÎC×e¿�*´››;®¯ï¹ººåêã-×·noÜí[vû–¦�ÎG²ËØbj¢‚ËÅñŸˆ®~Œ�*¸‡ì@-×_~›//@yõ›‘‘‘ñ‚� ¯ŒŒŒŒŒŒŒ1É@U×ð%¬âJÃb]±ºXR­*liPçÁ(˜-ddn�˜�ëЗH­¸:q¢ ½ýΤy,Ãñ÷±Q\eíXmW´á°Sv÷=@£ã1×O52¾Ñùþôñî¹MÍ*ͤ×xüžãPLâÑúü@Õ¨î t8'TË"Z®+Ê…ÃL‰{ñˆ¦ö®":›ÏŸñ2>©,øçÎÔIöÍ ,�¿?Ò*Š¢Ï›SÊEA½ª©—Õ² !Ðy‰Fí³Óνã-YÙõ�¼0ê?àJoÐÜ“W‰è°®¬±U�­–ˆ«Æ2%Çô[Ô¶ƒžôêIIÿ®½’Ú`\IQ/p»¶¨ð¾%„4R޽E´êÌPò êw²híC1“Ÿ#1/F°eE½Ú²¾ø^½ù¿Yoÿ…«^!Î@(P JKð{ºîžë«{>¾¿a·»Áûˆ§* Ea)Ë‚¢p8k±‰ø2Iñ5zÄZB ø@ŠÁ{¥i=Mӱ߷ì÷ »]ÃnwH_ ÷éûn×p8�¡i+ڮī“Ô\¦BMß·˜ôüfX¼êq>ÚÉê÷Ç»²euWFFFÆËB&¼222222^8Æ=בh ê Dk/qŠ­ uRxUË[‚K÷“‰%¢<Ù¥?Ù±ef;3Ï¥×1]ç­Hx b)À-,«í‚®în¸«=�„Nç™iúc6^Ä<yÂ.òIC/^ôeCž¡j ”rŸA¨!ª»è¢bÒ:êeÉz»`±*)+…'H"[ˆdKOþË#súÓUK½ýSþöccBz%²^û|ºI|K$%nŽP0N(ë‚°*©×%Õ² t í¡ƒσ¨e$´¦d—žÛLve<ïÕº_1!º"ñŒ-°e�+زF\…Š�‘cÓñ(_0«^4Tgk$E&΂ƒuB�-«˜�Ö6„®A1G·dr6?ïøËtÅ&£Õ"ƒ…ŸIÂ,E¹¢Z^²¹ü^½ù߬6¯)ÊUäˆ\�HxT;Úö–}#¼ýð'ÿõ_×\|KÓîÏrQ²¨Kªª¤¬JÊÂáœÃÕ^}N¨¤M3!f˜u�Ç{ÅwJ×ö‡HtÝÜÞs{{ÏÝÝžûû=Í¡¥í�W‚OÖ‡êP-“M¡EÅ"â±`lRuEkE3锹kÁ¹9ôã¯Ç32222~vdÂ+######cøðªŒŠq‚«‹UE½ŠÍIW0ÅÃD ñ¬�£óO°|ô˜êùwÔ+¾†½žyÎtb¶�`\TF,VP¯*Êe�úßx‚vµ• ¥–I¯¿sö<íp�dW)¯è…w_ž[ý0jFµªX¥( Õ¢`±®X®µClœ_Óz&çg­L¾ËÙšu¬Dú™Nîi=”™}ꙩ 1g¦?žŠ"V°¥¥X”Ô«ŠÅ¦¦k‡}U`¾ÏŒ6fã–ü#Ë,™þ+׺Œo±"êÉ.‰[`Ë ·X⪱jú<#y–Yÿó6ä?MžÍvJDº •×ÄŒ.[àŠšª^B×Ðv4øHs©?*áŸ:ª:+^óMI=q/ƒºk zT0¶¤¬W¬Ö¬7¯Øl_³Xn±E(&H‰�Ö‹ ´¾åöÎðö]Ë»w{šæž:ªê@YZ çp…Ń5’Ü G²‹‰u¯Š÷�à•àÁ{¥m=MãÙšhSxèhÅw¯&’wP‰-q)£Ë"bÀ›lͤÖêÏe®Ç?2á•‘‘‘‘‘ñÂ1oÞê Ô2ÎP/JÉ~ª¬ ŒS”.~%UÄùæï—6D~$Ï‘¯$½è³èÔäPe¼™Ž�\M)!5;°W9ª¥P­JªUAwh#ù8äxyâds¢ÉMˆo5{žzh{UŸjü ª?pžÍßpäôùfú¨&JÇx î=bÁUõ²b±®Yl*\eP“Ô]t1o } og²ßÿl¯ïœíÞÏx^ÏÔCíe,dccV€¤¶Pˆj…B(*G½*Y¬+÷-æö€v@ˆDe¬ŠáLÝík¤Îjin²f<ÿŠ()»$Ú¼‰+±eMY/±e ¶@ÅÔ´ÏwúúösÖ ¾hŽöj"“ŒžAPó¼\YQÕKB{Àvxߢ¡ëÝS�TºO ½„hÙ×_œŽUó2y‰¥ÏG]/X¯·¬Ö¬ÖT‹ÖX£ cU»ŽÖßs··|¸¼}ßr84øî€±`L"÷Œ‚4x4$‹kíun)ÓL,"!Øçwi` ´B‚ÚDnÕô´¡¦ûF�Yß³±‰äêßÿHð îœ[¯äº›‘‘‘‘ñã"^/zü�¿ß]@¶ˆMâåzAYØRÛ+ÑÀg*c’Ó}2ä‡>H_¶ïZè³L�vD&R…”Ñ0o�§&‡IŠ»2*UêUÉáþVc`{ð 8ŽiWUDdl ë?ê$üS&Ñ“oÞ[¾Ø/}îù9¡š$Y³pNRnTEµ((j‡q’nç#QÖ78åt2ŒÊ.y¤è·xs?t=±%=ê½¢UëTf¡“ƒ)N0¥¡¨KêuMq³Ç‚o” >©" gm!'dW.\ÏìóúÜ.Å ÆE…WQQT5¶(Á¸ø÷ÞbîY,�å§®ú5æØÄ4f¤Å*bWPT ÚÃ=¦( ¾AµwsoÕGHq9Z¿ÊäÊ„î‘Aí%Öʪf³½àõ›_Ø\\P/—eïjc1ÎBGã…Ûû–ëÛ†ëÛ–›{�oïíh®>fOjˆk; „æõP ‚Ç« ª&]§"k&bU\ñkÌáRés¹Ò©IN×ü¸©×ÏXfg�WFFFFÆ�ŠLxeddddd¼DÌš•‰èÒÞÖ+€Q\aX®*VëUí°0ŠŠO»ðõ¨•qÆ\ꉟzå‡þ˜üù ‚MÖ÷ÉõèýꙆÂÔ)Y‚EbL#éU@¹p,Ö»›{Ä)¡ ñÑb'=ƹ½æ:ÍÇ8wTr—âKFÇ{œ=·Ù+¼Æ<¯IŸ)L|y1Ku(hÀK‡ï³»œ£\F;Ãbá°E$î{ZL'©$S³¾éœÌö´$¯Ÿ÷xGe£êCï½'seÜ"ÒK/'uAµ¬p•Cœ F³’´oÄjÜS1ãu˜PBŽÂËx.Lí€e$NbS"¼JвB\�ƒIJÝ4.E¿x<Šþä CúÔ9W„M­KUáETW¹²Â•5¦¨�ö€úf°‹>Ý�ðð:N8&Çæ÷š˜²FcÅ”«µX.xýæ5ÿùý'—”U‰uŽBŒ½‹ªÁZC�ý¾áýÇ+>^ßq{×phÀJ‰±ÅX7CÚP&ФMFõd�8‘Ó÷œrÆÄ$ÅZ¿Y£×ãwéK4ŠôjÝi©ÌχOì�ÁŠC¶o®Ñß™ðÊÈÈÈÈÈxÁˆŸ£§–%‘죸ÒP/+êU�«,bGõDT��­€Ó¸ö£FÂ?ÿH}á=~ÿg•XôĈÌ2rP£ Ee©—E<'Ð$ÂkЇ¥f‡>üºÎ·ëõ':_ßil<àoxÎR2Š¼Ò¼SéûQˆÊ‹¶:ü²306UA£]a�€8¡Z”ÔËŠ¢Œä V#¹/!æxÍfFß4Tdò_ƹ1/_X†ãif™[ôY^•£\”u�+-Þux<ªb#ÝÐo ÐÑnROêgFÆs�êcRÀ XŒ‹ê®øU‚+ðbÆU�όϫß}Í—Ÿ\áõå·—ÁP/$rÇX‡+JlQa\3ÕdÌT{tõ#Ó§}ΩG'Ö†évÖ\Y²X.¹¼¼äÍë׬×+вÀZ�¦:fâ5^ e·?puuËÍí=ûÆÓyAœÃˆIÊØ”Ûª!qOò¡Óµ¤Ì×–“ì/M;o´_¯ˆLŽŒÎ�˹ãq,{|�ûì9�OE&¼222222^:Ò–ä˜y¢µ¿3¸ÂQÖ%eUÄ |"¼Ò:%¼¾¤¡ñÂ!‚Ì’ÑOO‹ ™5± ¢F°¥�MâÊb�!Ø�lÙA“› ßõ´öäÕDÙrrnÓüx�I7-5›4KW>]º&s©ß�®(^£�!V±¥¡\”TË [ÙDv�dQA4ÉlI,’©®Ïõ�Ôÿ‘¢Š×E ˜Âં².©Ý.Й6$J1¿{êÝÎ7äü®Œ§ŒLy¤~ÌhXædWú�±QÙU-pe…u%Á¸h 7˜ã¿õ+R«2&ød£C–WR/‡±[D•TèÏÁÌÎð¸FM¢Ÿ>C"2(²{ÞËb±`³Y³ÙnØlÖÔu3 EP#,†à�ï8ÜßßsssÃnׂ€8T-:ä¿¥ 0³qU>ãú#ǵñÌìU±fbÕ;³1”gœwù#AFFFFÆ÷E&¼2222222KE1F°…¥¨eURTÆ1#»æÉ_Þ8Õ)œK’A}g±…¥¬ ŠªÀ–†Î*Á(xeú_>/ãiL�£±y$OŸwîìÿÉ-®ž­v‘ê�¡W©zõ±–Y°…¡ZDRÅQ©ŠIùƒr>{gÔJæYô9gáì̽‚A#‘ðªÅ¢ Z”І½4<�¦ö³ä¡y‘ÏOÆãuù±!r¬¦�Ûá�ù]Ö•U�+*Ä`l¼*÷^›S»8™Ûg|EM™’^=á­BŒ0&^®Ä¸x^tBöD»à©!áQi’O !ÞV'ÖªÎYVË%Ûí–ívÃz³¦®*Œ5CÝ2Iq¥ªt‡ŽÝ~ÇÝÝ××·ì÷û¨T“”§£§qÌñ2ŒÛȾn$ {AޤYÃV‘o0ï222222¾?2á•‘‘‘‘‘ñB1¸œôæMTYg)«’ªª(ÊWX0}hö$Q!o®ÿf�‚ãÃ:y‘¨¾+#áUV%¾lh÷šÔ ¡¿O¶(ü;O\Ox ¯ÙÙ{ˆÒ||,dºëéÐd{zW&#g±IE‰{Š“/™Ú!Îæ_ž;_pÎ äižNúŠ®…ˆ\é(ê[ºd›«ƒunÌŠœŸ™±®åó“ñ \=7Š#á%bc±.YçÙ1&�é”37˪“‰ 1Wï¯:5:½vê,ÛT¢Ý$Æam�ublú½²1ç•#þ$Ÿ© ÕI)ªªâòò’_Þ¼áòâ’ÍzMU–1· ‰dñzÔµ‡ýž›ëk®¯®¸¾ºb¿Ûƒ*6­¦¤™õÜ IDAT«Ls´ä˵0¹�y«Ã:Sä{L¯ŒŒŒŒŒŒ¿™ðÊÈÈÈÈÈx‘ÝfуnKÀ8KUU”u"¼œ%%ÈTÝE6çÿ†§æú8c-¶⤬+šBél‹v‰¸dtÉSɤ×ßwÖ¦*¯ñ¨÷�·þç>»ëS–…9Çëó (AÇ%6)UË‚¢JÖ¬NbŸzP�dרû‹ÅQ¦'.ã“Gÿ¡y1UÙôI<3•W­s]å+1W�€ªóô¯þQ`®¿Ës%ãyG²Š€‰ /ãJœ«ëËPDd$^u—Ó«x—_¿JWÂDÜ(‚ ¨ÊD�W`­CÄ‚˜Hˆ!gµ¡Ÿmƒ:åëÄʪâòâ‚7¯ßpyqÁzµÂ97T$3ÍÆ �ýnÇõÕ5×W×Ü\_³ßí@cLZ ̯Aæk®;ýæ›O,(åoœKß™ðÊÈÈÈÈÈxÁ]�z›ÄŒm¬3•Ô]bc“X £2â ú_¾¢å¤\a)Êç:Ò �~•‘LÉ*¼¿éÔŒý­3»ÆIó4Âkþã}38<é'M$–±WZŠªÀ•SXŒU�I•cŸ~ïÿùzO¨Q:îë—±K=ÉàJ-l‰�kSXÊEIYXgèŒÆ¼B™ó3ù×é_YD4.‚D¢ÂËX‡±ÆHÊîRÌÄþPT5'DWÖ¸<÷zuÐ|õKŒÁØk ŒucI¯1kzž¾ Ä Xkpα¨k...xõê’ÕjEY–ñºß¯»z"+|×q{{LJ÷ï¹¹¹a¿ßã½�¶—ý{èó'U?iÃù´"ü]�Ïß—§LFFFFÆ3 ^/zîÓiRxEU„Ã8ƒ˜ø�uPN z°Œ¿÷|¥vš‰¤—+eYà ,øØ`˜öˆsÓþoÃ4ÃK¦ ØñyœÈð#½bÿu´tÊxꉈsÅX¡(®t¸Âa�EL7ÏíJ�FIR×>£ePIæ£ùÙ°;â U'uL©•,t«º¤¨ láÀ+!Ìp­‘Ùej|¤ŒŒç»¾Ž€âî1ÑÒÐ87fD©‰ £If—è¤^è©&1ã9Î� „¢N’RÒñ<‡„DZ-oùâºëš1†Â9‹Û ...Y,8çP�5KÒõ?õ©mÛrssû÷ï¹½½¥m[¼÷Ã#[k†uÁ°æ‹/hPâ•E´Ò1‘`ÉôÈ÷ǃ¹“†–>�4–I[/ã3ŽÿPÇ,Eá(о–02÷�ä/99]¢=F®k_qúü™ómÎ^Ý(ƒj¢( Š¢ˆ¤¤5¨›Ú§ÓIò¼ÈøV•cò /cb 0ÄNˆ—Iâ¦è�9¥�WÆ7X ¥º¢IÁ…1I…ç°Æ¬oR��‰jWNI¯Ï,!…+X,—l6..¶l6ªªœmté / �¶mÙív\]]ñþý{îîî>Œ·�l’Tù?¡�®|æmuÊ"gddddd|!2á•‘‘‘‘‘ñ‚!2q 2ÑÆ†²´¸Ò 4‘]ÿ?{_ºÖÈ®,)UÙ`°�Þûœ÷¼{ö^ Ë5H™÷‡¤*•¦fjÈX šÁƒ†””¡ˆ| »ú�Û*Å$$Ž!Q<™NP”Œ±Áªí‘ƒöÐ{õI¬SôD Š-<ÓÎP©Ë— ‰‘ì2„¢4('ÊIk ŒØ„ž`‰1,›3:IÞva9Gve]T Se�¢(`‹ÖtpDgîR„‹(Ñ :?o5dÃØ"p¬Ï•ì ©'»‚•!À)�.¹¤‹²Š¨¤cówA‰‰ýd,¬-‚ÂË€1½å¡Pfc(­ÔÏÒˆ Ö‰rRb>¿ÆÍÍ }í®²_Ï�1ýXâ®CÓÔØîvX.—áÅ|Dtõd×-@ª�U( ÅO€^ …B¡Püp"éEêCÙ˜€,m,g!éE<ܯïo5+>¢�BÒ&©¼S”elÀÌ™TÉ ¤Ð\þ{"ÖV{òv6QŸÜzQ /Åóg JÕ²,£º‹B,KóG2‘&ÿ^×Òòè0ï»Cžè/c K(ŠEaa¬�„VšZ4IJþ¹iô; ÅÛÄqì8‰2…W$¼z…¢Âèh'(Ùõ¾ -([Kƒ¥!Û“^ÞXÆU3Õ©dµÿHè™Ã"<ïÅÅnooqww‡ù|í m_�+_ÿ�s¨ª=Öë5V«Öë5꺎—-†¸–Gº�ÚP“Ð&½2ïâ¿ù@ P(Š'¡„—B¡P( ô…³M Rlicý.DDTeuoôÐõ¡Ý“*Ò«ñŒ1°eP¯À¤Ï �SJt½ß{¢ç�‹ù­nÅÛ`\ºŽ`�EQ( c²;ý2P]‡÷ýÏké0tÏ)¸Ò':ÛOÉþ�@0D€%ØÂ¢°Öx#`:¯wHµ ûza Åʼnd8E2Řd,`,’Mžõu¼G êß5ò DVª›FÁ™€l$Ë­�E`äœÖk÷BÖXØÂb>Ÿãÿçðïý ×WW('e¯êÊ×vˆ m[¬×k<<<`»Ý¢®k8çúµ?_ŸB<ž&ûè{�£÷jvÂû’iºoT(ŠçÃh( …BñƒÙm×àC0Ö (-l$¼‚ªˆãÁœ{K=eR>ã˜kx`¬�MŠq4NüÚUjr$›¥ÓóMÕ]ïÌb”æG­òB�;éëw…> ¿œ=i=¾f<§ŽãÐQb=Â@N¦¤²µ6�`�Ì#`TAI¡øóž�YîíQ“ÂË‚ÈBÈÄ]Ð@¸ J¯ÇG½âͶAÙ—•x&ö•±6ª¿ÆdÒkãDØ[L&Ìçsüûþ¿þõ/Ìf3”E$¼ÒÚ×vfFÓ4X®Vx¸¿Çv»EÓ4ðÎ�/þÌ}=ññM‡Î{7ù{’iZ …âe(†²¬Ù­H9ˆ«z’P( …â'†D0‘„Z^Ö€¬L°.LDËPV%%vt“ðü삼éÃK°Ö†~¢´�£x 4,Šè݃ô�O·\£x›vð™¢2ÞúOVeC…�d)%ñ³ÀYHÓÎy›9üžé[>ªXë+*V�1‘œ¤gu6ÉXÁ¡P¼f1íWK¡Œ7'À˼(wï ¹�åC4ù¶û�¯]±FWRW›@J¦jx½¬Æjߤ+˳Ù%‹~ýú…Åb�r2Öûh ŽHvu]‡ªªðp�~ÿÆv»…ëX”,19:&}b�R$å{HÅWZUµOtœÑÖë>H¡8‰âðLGr|ÆÍg) …Bñ}�P‘ð¢TïÉT˜¨ŠÖk‘ô"Ò̯>¥¼(õ“�±±P:‘îÕ>½¥á“Ã`¸ÞÏ-ÅÛ€‡¾èoý[ 2Ñò³�waþDC½�=% ¨½XãÛ{Å<ÊÆ"Sò† Œ 5$ Ñ#|×AÕ$�yŠ·XP³;Aácz"aÉÄ�QX|“z(–úú‚Kï7&»$Sé$¢‰LïM$'s½=wd_§õY(гË+,æ ÜÝÝa1Ÿ£,Ë𛄞øÞû@xív¸¿¿ÇïHxu®QP³œ”@Ÿ˜g;g¿¸;5çüŠûL%½~ö–ê¬S/ÿ('aðŒ5V/:* …Bñ�wÐÙWO»¡.B®ˆˆ?�7šC�Ý]¿¤}ßòSí kC¢8�-µTú$ôþjôè]ÿ`©3Xï)Þ¨é3Q2[Ã>a{'MÇÈôª�¤àP¼$Éëþ.©c ’¨�4ÏPIJã¼S„UüœÈAÇ_�Ц@¦·ØüúãN¾o_Éà¹DHáë\aÝÇ9\œ‘ÂìÄ8Hõ­µ¸¼¼À|1Ç|1Çõõ5../` �…û5'}t]‡}Ua³ÝbµZa½^£i0óh}zä¥}\›êR§Pü5Û-zÆï(Š1ŠçžßãYRF…B¡P(¾Ó:ÿœù÷G÷žÞÎP}DØx' =%½^ÐÎoÔVÉ‚’2°tÍ\o)}z¢‹ž7"ž¾©+ï<*å´yöY¢rN8¨¶€¨¢q»Óa¯Iø„þ¼æËÏ‹m/l)‘Á2+w¡Ð_&->çž�ЛRj¤S¼>rÐé}ÐAl¤)òÕ }ó /DY½�,ú‡àÑ^ébÉSÑœÎ^pˆ¤—1(Š——ÁÎp~}�Ùl†ÉdUP UªaFÛ¶ØîvØl6Øl6ØmwèÚ.*ÓBí®ðë4Þ7|ô^E8…âï{‚'÷¥”-z,W(Ïžhš>Q( …âANl•bkLžÞä^ "ÒM÷#mþŠ¿�›±¤D¡hýE4X�qLß¼¦éé;e@>tÓšXâç´ÕçDÙå Å߈µå¢—ŒáquÒL×~rCÓçFñòOö3yÍ¢gαŸjh$Æú&ë?‰õ·(¡Æåƒè°ëâR"q_eQ–\_Ïñ¯X»k:�ÂZ.Vä$©XMÓ`½^cµZa·Û¡ixöÃð‘ƒ=}éÆþì`¡PhÌ{æT¯IÚt ðÂK·Y …B¡P|SÐ�ÿ–äÞs”:Ü\§›­¤»ë??×?™ï ·‘à æ!‰cÂåfÞA§gzFýö]ºPÞB½DÏjÊfBªã5²^:qÕR0#«ßuF90:¹ÊkŸO<ùŸ>â?ûBMÂ3t¢& þ oèѤƒÄ %+C *1I©ȯCâ`°�TüÍ‹}ÄtúóýTd´ÖÁõæ–Žø3[CA¨Î!È®6 ö¶gúj¼ñ“¯†,fê.c0™LqssƒÿýßÿÅÍí ʲˆ{åÌB1Ƚ "¨ë=îïïñðð€}µ‡s"I6¼²Ï$»äIˆ|vˆxkaÞ½Bñõã�üÁ8W¥—Bà„—B¡P(Šï¸£.ÍJVÉæü¯›Äèžú¹x¤méIf*yåV>ù§qbìi­Ñ÷´µ‘7&‡ýqQœl¯Nõ@ì¥Lá5>‘Òë^Äg¶Ï‡Íyägtrå*�£¿\ 12<$M…½ór3ççÍÄÎ�{Qß‘¿wùû²›:qdd¿)C¼Çiª]ÃÇûö‘d—JHLØóô®hd<¬’ýã8öA‰4F‚Pe°3œÏqw÷ WWW(ì`a˜ƒ™Ñuªj�‡‡,—KìëÞ�- Eä‹ì½ä‹÷öO|× Åx Ò+ç�*½Š%¼ …B¡ø¹{écû/ÊŽý’îCRÿ_žæ‘TËë…–VŠ?ë7‰ �Püœ²š^y¯ê±þõH7Å_6–ƒ Ûc�—¥àR‘ûGûéTí7í×s=6®Ê#§mÉpð‹©hø­ŸãúzŽ««+L§ScŽÖ}èºûý›ÍËåëõmÛÄ:_rð<Ú� …âÜ:ù†'Uz)~8Œ6�B¡P(?:‡púûy­¨#k6Ê,ø4Éó)½¯ïâ ÃíeÒÄÛ_Gvõ*¯'&\*Þ%¯x]Š'ÛéP�!q¾ ‚º5åXñ¥ÓèÝf!»XA™O@H3øÌÑZko·ŒÈ?¥|¡å)'¹Çëf!!ÆjUú×9%Ž5âÚJ4ØSV+^Ì’Õê’Ê®\?ŽG„TÕ ( Ìf3, \ϯqu/2ft%½„®ë°ÛUX¯×xxxÀf³AÛ¶`/Ñ¥\¡P<ãPþ§ËÊÁ½.…âÇB^ …BñÚÍÄÜ@è-žasG_ï%}݃.åÆ/Ñr�àÔ–1ÐßÎÎn4Óá[ñ®]•}f3D¥OÆ ¸œø:§ÑêÕ+Ú_o›!H-+uÆ%]ÒQ–Ì–\å¥áì�™d­”4ž<‡~;–åÅMÎIRY'’âµCQ²8�H•L½É‚Ä­RˆDyTÑñ÷‘; ÊT¢@$º„áÙƒC�̬6à36TCσ0d0™L0Ÿ_ã×Ýn \Íf˜L&0”Ý�OÀÌhê›ÍëÕëõ»]ç«_Œ1Ù�sŒn–ŸŠ·ËHf±UBñcï77<ˆ¯ô�sï=g’Íg"'{8ï#II§½(�lñt)þlÓHÉ�B 1ñß&‘[YŒèÕAIED)¨è8ü�ýOÆd(†~�ƒ™Áì!Â#^œNâ:A0ãš^D0D‘ðšãׯ;, \Îf˜”eV22^n‚°`_7X¯×XE«ªöpŽG{çã!¢Ö¬ …¯®ÙõÜ­Vz%½? ji¨P(/Ý8|õsÉO>7É×NP~UÀþ°ŸjV0ƒ=ƒ½ô ¯Ó§‡ôÏìÂ!Á#죘¦M>mÑ�«ï&9Yà£ï� Þ¯šÔ«2()Âñ±þŽdí,tÓò[öªÙøóÍÇÓ-—»z¦¯Y$¬;ÉLòÇ[êjç(ÞjïÓX”ý; 3[Ãý?僢¨ï[äØž°§‹$ìƒ8)¼ì O†%ÂÑ:�ˆ²²œ`6»ÄÍÍ î~Ýáêú “I cm¶¾‡G÷ìѶ-¶Û-îï°Z¯Qïk8ç *Âè‰È¨+¿B¡¹‹ܦ)?Jx) ÅKÇòµ«Gô‡õŸ¸¡‘ãrö_²o¾Ø†3st IÇHvyçÁÞÕ]BÑDã—òÂ`ïC’8*¼´ƒ>g×I?£“�‰¾ Iì#‘2p(§*´ëý3ã‘÷ ç<¼÷¡æš$¿ í—¯5±©ï³#: °¨åtCjBJUã8ªU…¢… ÊŽhS¦xëÍ’œøÿH@`/ýzÃQ‘—Ö:9›4[£x›p=K2¨µ€¨eˆç^Y4$'3›C91¾W‚¨rgöÌ>«»v¼4SVý‹p¼E�«Ù ‹Å‹›n \\\Àsà@H`´M‹]Ua½^ãþá›Í]×Òíäs( F6†µý©9"ÅÏ…^ …BñÝOôŠ/ydÿНH8ܲ ¯!ù˜,ÀFiÑ´ãgõVJ¸13ºÎÁ;ŸÙ¶}ôñIÑ·úÈÖðÌLËm™t½ér—,Švx ßù~~�à Ž¥¿ÕdõÇ­t2þ©ì®sp1–±çS†d£¾¢œ=V(^9Fó~kÉ¥ú~$ ö>‘(Ì5Ÿd ½”ìúÄø’êÍeVoiè= éu¼J`|C. %†e¬Ýuw{‡ÛÛ[\Ïç˜L&áYE¢kx~öu½Çf³ÁÃr‰ûß÷Øn·ðÞGkc:< E�>¹ƒ*½?Jx) …Bñ³·Ý!ù+“ï¾sð]TÅͱÉÈ.Õ£|Þ! @Ÿ(îºÎùAñŽ…�/=N£ï"‘!¦xÈÈ=•C)Žyé…·üoÝ'ç^£"ê,�˜ì|¸hÁQ‰7êÐ㙥ý¦ø³±™ÅŽl|愳„—w�D¢Pø€’]ŸSh_"Ùå=Ä{€s²Kúõ` )ògý'"‚1Ó)‹9nïn0ŸÏ1›ÍP–åw(·3ô¨ö{¬V«þ£ªªpÉ¢¯ÿ¦½¦P(Ž—ŸÏÚ>ZÛP¡øfPÂK¡P(ß.}¡xe» Ñΰk\–(N ƒÑ­4mô? «%‚0à£k:t�{¬DäçO¨Çj É5�:oÇúäbÊqz�ë<\çÁŽæŽI?]¢Ä×ÇF3‚Iø`/Y8{‰—,ëÉS½M™L¡øÃȉcŠrÅWª å=˜Ä;Ü«w‰$ÓˆiLÿؽPê/$Y:{@ød=¶q¯*ë¾z£!”e�ËË ÜÞÞàöî¶'»Œ5Í"Ð9‡ív‹ûû{¬V+l·;4uç]°g'âK¡Phü’¯µoQ¥—⻣Ð&P(Šo|ŽÿAÙ M|½¦ÅÒ-X �nÛ»¦ƒk»PÿF;°ah‰6ú'ÎmaÀumÓÁµ>$Šåà0¥ýó ÓêýI*³†DÎè)óm£bâ:üÇžáZ×v=™B @2"E†.“Ÿ½„~\_õõ¹"ñßF;CÇ�¨ð2d2e†d½œõyì?�IŠ?Ї=’Ìž]¬ å`8ZæC1ÅqÒˆñ¾šœè"†H"»\PwÅ>2ôXý¬¸—ÍXÖX”å³Ù 7··¸»½Ålv‰²,â( ãÄ‘`ÿÝu6› îïﱎꮦmCý.Œ¤W­P(4Œ}­£Ù¨$¡._Šo %¼ …â;ãO�ãÿö ÍÁ{Ò=ÚŸŽ“hVHl¤Çèš6^1)&ÊÛ=Õc!սùhté­' „S2?^]”x'k�åk·¾Ñ<Êëw�ÿ¥Sg_ÅÆ2Šä= , ]ëàÛ쨴Cüˆ@ûæ\`’?ì£ØS±�„ß1ÚºC×t`7(ŠCíÈTWÉô;ôNú¹BñûeŒk"’)ì\סë:”…ƒ•I´540©ê—¤Ñx~}¥'Wûï½.¿f2è¥c¯D‚»'¾„!Þ�] v] ½¢twTÓ1µrF‚GÊawU../p}}�ÛÛ,nn0�Nƒ}aüƒÔK©~ê~¿Çf½ÁòỪ‚w.Ú#fÄ4@ýÀý»däé–[ñ¥UT#‹i«Šo%¼ …â›ÞÏ*ÿæ Í ë)Ý›ýÉ¡>Õb¢} AõQáå<Äs¸ªzHzt„Ú"¼É?ùu€ мt�GÛ´AáÅ’Ä)�O§HH%½ÞuNQª;4¦OÇa9×ÉŠWMŠ Éá¿`i^® ¢ÂSbD6_À¡.�(ç›ø�2·a�A°4ô€o=šºA׸pÁÂFrÙ]^'i!59£xË=‘D¹`°yˆ–†Î9t] SNa'Q½ƒtÙ'¯,Eg÷ãOïØƾæU=C”µTZ;ƒ�!Ø�»ìZÀ;�pøˆ9¨Â²™p´²Œ{Ú¢°¸¼œâz~�›Å ó9¦ÓɸwâúÎÂèºûýëÍËå2Ôîbït‘×u3cŠŸ}°ûÊC@I/Åw…ÖðR(мùúÛ^³îÁÞa“+4ܺïÅ�ð */Ÿl¦"5>è¨þ—≶¦—}øy ±L$$Ù1\l'Ûºƒë<ˆcÅ1ª¶ûàc"a¬ì¢Ô©„ÓsDÉ®·_’�˜PP^�éÕC]ëÐÕºÆA¼ÀÂôÿÏ�;¯�Oý”²øDb `'èZ‡fßÂ˧5‰F¶“©J’dEׄt)Þzu¼Dˆ /ïZø®…xß*}Ì×Û>g�ý²GÏO¤—·rhçT»‹„ö`×Áw |×úÇDKC3þk¤H2ZŽcßM¦,æ ÜÜ,p=¿Æål[GÖ_h¼÷¨ª ›ÍëõëÍM¬ ñ*žKÇÏ÷ž¢]üƒƒ ý…¯Y¡ø.PÂK¡P(~Ü�þï+Rš×%Òtä[·«ôÊ.#�4–Hxu�ðê<Ä#«}?$&#HwÈÏ�}tÀn…ŸÕéçI¹&øNàZ‡¶ }ä;pPLà [%Å[GÓ¬©éuPÇK0Ô—‘QPñf3+´7™ƒ¹ÈᶯI( Éé.: œµg^=�9!,±¯’Rµ/ñ8ÕîÊb£ÈáLÒÞR¼⸊5¼„=Äwð®…s8Zæ¥:^Ô‹�ôšÉ£­J¯‹+’×Zì¹î`eˆX»‹] ×Öà¶ „${p ½�‘íA.r° 0™N±¸Y`qsƒÙÕ¦Ó)¬µƒí¡”óÎ9TÕëõ ëõÛímÛ *2y É‘Ç6Å÷�,Nz©þüo7ßð¥^Òw C­·¨"ñ¡öM×tÑ2¯C9)`„ ©>Q°ÿɼDUxOλd§“Šš?g> /§š7u¨OÄN@bAy²ÿì¬Ï’ÈÚYoHî–†òè¾ö'ÔÛopS IDAT Å7Ú!}“.NáK9ZÅß %¼ …â§nÈžÚ”0sAªúèSòb”ý–P'ªuhª;Á䪼ŒÀ†Äêt°AI¯ÇÚü°q¤/|j–’D%Ú°Á \ãÐTÁÌ;�xB“Ä&©¼ä¹¦=ó^KdzeWþ!YPíÍ‹âMqÍ}¼õŠ–Õ�0Ãw@»w¨«P“�»Ø v8̧õNgÇsw y¼?étb}ï5Ä0d!là[F³oÑîºÆÃ;8�a Kê±Lñg;Wsïa(,îZ¸¦Öy®Ù ddˆùqO%ñï�c;�¥€ŽÇöwhcúã7'ÈuéÒ뾌pog>ˆë@ìAÑÎ�zË�AÏ$»Jôõ¶Š²ÀÅìóù·ww˜/˜L§0Dðñ÷I‚ Ø{�®kQU–Ë%PUU´»l.EíŠ}ÎûÛ§ÿ¨¡ê1”ðR( ÅùÍÎÝìQe×gwö�ñ¥TYÜ\ËØïj”Û×' C kC 1Y½¨qU•׺ƒ¥zßïD}›ä·†ûÿÇ÷�lº‚ª+�X�P�ˆ%X€5ûûm�¶v†FBŒ j¡��•4²2Ì »œ AåÕ×ùP¼YžAbIª9Š­ÁÒ°A»ïÐ5–²† 0ù… R­¨Ÿ2›ä aÉ!Ù•© óQ«E¦·4$&x/hêû]ƒ¦nÑ5ì6�{'[þ4¦P¼b‡{zôR·Ñ>â[ø®†ïj¸®S˜‚e¤Q]jG{gÅ›Gö¢$�ìòm ß² ìBí.ȱԡIü+ñÎÂÅô7ónonp{sƒ««+XcÀñ„@ QiïœÇ~_c³Ùb¹\b¹\¢®ëXìpé P(~ÔªòM§¼*½3Œ6�B¡P(NmnèL.à=6ˆš¾úýMCqo°�0ÁG«ÚÔhö|'$„¡†EH/„-E,OÔ¼8µñ  ’]ö–‘ÓWþ_®J5Õ¢E¡„þàNÐ5Í®Å~W£kà Ä¡.Ž�é“ÅJz}ÎD:¤åÜx`9‘$Süù©<­)qˆ; ­;ÔUƒ¦jÐÕ]¬{—ÙçQ®!?àOè¥çÅ�p’‘æâôïåmlaÉß š}‡jÖ×zˆú¤Wé�}l…âOüùqöC¡”!†|îjøvPyA|ýÂñó0N}ü<ämÞï8â„þ öTw¾«ß‚Ä ê®þù¥URV'…Xcpyy‰›ÛÜÜÞbq³Àl6ƒ±vd=,ñ¡œë°ßïûú]«Õ MÓè|R(tM9Οh>H¡øt¨ÂK¡P(OnvÞÃ�Cò_¤cû›ý¹O¸Íê;ASu(¶5ê]‹fß�ŠvbCQp±}}…@߀8ê"†$ªösó©AD 4]}m¯¾1ñkdHÚwû ˆØïjÔ»¾e10(†Ä²�γ�žHy®ƒúBéž·Œê{¥¾=@¾SÖ!©» x�®q¨w ªí»í(/`/¦L´gíÍ&û>ÍçÎ÷™G‘a öµåžÕªã1}`z3RûŽÆ~43$*oà» ¸«w5vÛ MÝ�=B¬ƒ…�ìr唲Œ4û¢xË�ÐÑxJKˆ,pPy¹¦BQ^ ˜\‚(¨DA¡ZÃþ‡:ŸLÁ}rnÑ÷Ò=K@ãlªP/“ÈK)’@v‰‡ø.««ÖÜÁˆ�ý• %*ë%¬½mkŒAQLp=Ÿãßÿþ7nonpyy‰²(@Dý~Mbí0Ð6¶›-Öë5¶Ûm_»Kï®(?hÕø�ó}¦qB#­MÅ…^ …B¡xrƒCïøØŠÏ )ÀûÅ Øôˆ 5VÌÖ Þ5hªåÔ‚f“˜<`„*9>»[+£l�ö·Œ[=ÕÊì ÓÏÃ?C²—ÄbÑ1Úhe¸ßÖ¨«ÒFlPND5Kx¤Au¡íþ�‘rtŒ6Hy=$» –†ï1ÇBB"X㳇ošŠQmk\nö(/Š`Ó*€�5W½÷vøèó|…ò¢íH}мf×0þ%icÓ° íB"²ÈB„à:FSw¨v5ªímÝAFÊa›%”ŽŸküYç�âmbFþoêWQZCq`6à®AWïQLj”®EQ”°Æ†å:J�èÄHý‰ªÑáòÀ9Ò‹z"jÜ<Ñ"›’oÁ`qHxÕèš=¸«Ô]”ïk13MýzŒl-6Æ ,'¸ž/ð¯ÿ777¸¸¸€-Š>^&ûéßMÓ`³Þ`½Ú „Wçž1® Å·Øíÿàò|�å„DoW*¾(”ðR( …âçnÝÑ—'(ØN…”�³ƒ8�®ñ¨w ö›Ó‹rM kBÍ ®{q´·Ê«Þˆ–28hëþ+:<>d‰Ý¤îB¨{t�GµÙc»Ú¡Þµpµ‡qFr+Ã÷¤¨Ç=:(óúú]'1OêÑÈZ ÃLTñõ&Ó,oíÞT‚h½­±[—˜^MqÙ2LA caqQÙu¨ÓÏàŸ6»ä‰˜ÆsÞVY’@x‚oƒjx¿­ã%оc�ØøqŠÜ:—vQ(Þx Ó0ª C�¶Ä€x°kÐÔ;˜ÉŠé%ÈZÆ„šOL‘ É–òìâ‰üÈö<&½d´ë9Ý2DùE‘ ´³.X…Ú]{¸¶†o‚½¤­%Ò‹hXo‡—$`aXc1™Lp}}�Û›üºû…ëùeYÂ��‡—×ta³Ç¾ªððð€åêÝ]çà™ÇïJ×p…â{n/un?¾TÒKñ¡„—B¡P(?v{:|êV˜^Y$Â!yã |Ëhv-ªõ³ëKHPa@ÆÀ°›X—¨·6ÌH/õzÉÚ™zJp8=™þgÁJƒ?„XÀÄ®vØm*lW;4Un¤W±�ØhfpH¡(Þ‡g»DzZ}˜ìçùòz"£q¡=øê˜–xd�ôä Að-£®ZìÖ5f7-ÚÚc2± ÒF]kì‹>gÉ1’Io?ù’ÄõYôoLdœ�ñ§$#_› b�d—„C¸Öc¿k°Ûî±ß5h÷¸5 *Õ�§‘êU¡ø°Q²k¢diHa_#€ÙRï`Ë L.f°E‰¢(A¦€‰tK"=„ÆsççÞý9CzщN F1àãYCº]³GWïáºä[@\pA(4;<�ÂÓ¦z\, K¸¸¸À|>ÇÍÍ-îîîpuu…ÂÃߊÀPÐùyv躻ݿÿÆýꪂëÜH¥­u9Šoº>ˆîHž‘MPÒKñå „—B¡P(?5·ªQª-1Ô•"f€ÜÍ®Ån½ÇÕ¢AS9L¬6¶,ýMÞdãá?xm1ëüM�¹1(!H•E‹Ä@œÀ×MÕb·ª°[WèjqPw…ß ª°�T’ƒnÖ³Çôj¬áE™©õEì(0,’Ò÷ÆýDÙHMVÅÓá,&'ážjyˆg´{‡jS£ÚÔ˜m œbR0&š¹R^[mÐzh§6äDí£AÚbZ²)¸ ¶¬»u…íªŠê.1ÅZ„ƒ¨<¯·ŠwÝ=é%ñÂ"EØ�» 0j÷[Ø¢D9™ °% ,…K'É Zp¼ÖüÎm)‡ožŽgòq•¾ðW&®¡D€È»®­ÑÖ|×@\ b©Fî××AŠ1°ŽIY ÖZ\]]áîö·77X,¸¸¸ {Úø;D2AµçœC½¯±Ùl°|xÀz½FÛvÑ Wç�Bñ36˜ŠçÇ|…âk@ /…B¡P(~ôöôÀZFbBžƒ­!Ä‚;�ºê@E…Ý¢Âl1ƒ¸( K`pP„™t68(:þš³…È·QHœ;ÐP° ‰è’�aPmµ]‡:’�ÛU…j]ƒ‚ÅEfiÈ–¾@˜<>¸GCrl6ÆñKCÒSD‚5R¯ìÊ^‡~y™P ——ìUaNIëà9 ¶Ë “«¨$%lQ„Ä*Ë+D$íƒ,:·Dv­w ­ÙeQ€=£k‚ºk½Ü`}¿FSu€3 6±ÚWˆ€GÅÐO¾íÅ;ÆóÄÏP¬å×U#̾kÐì·0åÓé%Šb c-Ȳ+èÁ"ñ•¶UÈNtzôÝFõaù.êçî�½!euÓ(]QÕeH`ØÃ°ƒw-º¦BSíàÚ`†ÉªÇæ1ŠŽbT@Q¸žÏñ¯ýÂíí-®¯ç˜N§ ¢Hb%‹âÍÚ¶Ãn·Åz½ÆÃr‰íf ç]¶p+ …îН%¼ …B¡ø‘''S²@¤ÏÎ %,Ù3\íQ›ÕºÆn]ÁN ÊËÖ€ `Â�~IY¢7Ùþ~7}RÈþñÈXÏT]ˆDØ@ÁÕûm�jµÇ~S£Ýw 7…E BTxé5ãOŸNÁ”ÎŒÞd÷‰H(„DB $Ð�ÎK4ŸöªÈ6Xª¢'�E,|Çh÷Õ¶Ád¹CyYââz†¢$˜hm0þ@� ½�ž£¾�RUÎ}�N4�Ĥu´1„DªpçÑî[ì7{ìV;T›=\ƒ@vq²dÖ!:TÇà0�­“Bñž;£8žã?Lª ‰‡¸]cQì§è¦3Øb;±°v°æ”Q…*ÁÀwõ»­£"߬ S/9éRJ'Ãg"»H†VàT»«FWWh÷¤kñ½‘¤9ˆM’yTöµÕcP–%æ×׸ûõ óÅ———(Ë2^ñ±Rm[fFÛ6ج7X¯×X¯×¨ª Þù`«¡H¡P(Š/ %¼ …B¡øÁèÓ‡£C» 7›Å ˆµ¼\è¶{¬Ö°S‹éÕÆ€�6|d‚5¢ ØË¤„Æu,ž�ïEvÅ CˆÁÄLРê‚;Cx‚ïõ®Åú~ƒíj‹®v€#¶�ì" Ãæ(¯ø$dõ»Î7+ü<•rêKñfQ gê>Ñ@xQ¬Ï"Aéµ^îPΦ¸œÏP”Ska †Ä#è3ü(õývàUF£NÏ~åK(UåUIÙS†…røV„²¦�V¬4§€±Ðî;lW;l–;ì·uŒeŒ°½>•ÎÆ|�Ú³*>!¤g;—PGŠAâ ¾ƒ´ ººÂ~·ŒÁLQ›a²‘¸9CÏÊ8^Hþ\?ŠÏ•Þn0ÕíJma A½% ïZ´û uµE»¯à›= wÁê�ÆVˆ‡�;,½![kqyy‰ÅbÑ×î*ËÖÚ°ûMꮨÞòÞ£ª*,WK¬×kì«=š¶…g¯d—B¡P(_ÅxS§' …B¡P(~NêpÔ]‰ðržáZ�ý¶M“ÙW‹li@Û''„‚N‚„£¥›ŒŸï'B(�]tÕp©Î Eë5°·¿÷¨65ÖlWUH{Ó÷E¨‘ƒcu—ê>aeI²d…”¦eIJ¼õê.ÅÅ1™Z¥ï&µWˆe1­ÊíÞÃQ…‹«)®W˜N L¦fba`ÁQ/ )�šuÕØ”+ÿÞ9Jæs©š×’]rTäTLËë&;V”§ä ¾c4»›åÛÕõ®…k< .‘ Y“-ëS‹U?Ÿô¼ªxÿ™Ó¯§IÉc„ƒúÐw!¸ºÂÞ€±(Š ÊÉ`'0A£4ÔCÅ)âxA$=É�* u\é ±‰I¸|À] ¼šÝ]]Áw5ˆº`w˜È±ØdÉðY»ë�£Yꈼm!LIåh'é»®òØ­*¬.—0–ƒ­¡�@ €¬E²1$áLÙt\ê7â…ë¡é¡Ð8Ò #ΟǬüiO U:øŠ$Pñ¡�-ˆ ]ãÐm[lW;¬ïר­*ø–Al`$~D…WP»Fµ4‡ò'~�^X¡xñŒ;`‹)ª¼D<„;°kàê ­-ÐN/QN.`JÊ´>›T?z„ƒùF”_�ˆ¤� Ãü¯ŒÇ2zãVÍv/Ñ·7Ÿíc.„!®ƒó-ÚýÍ~‡¦®À®�Ô]àþwGQŠrm]ŒÙ"¡v×õnnnpssƒùõÓéÆ�1}›¼0Ú¶Eµ«°^­ðû÷=6ë º®…°høQ(Šƒè®GÅWC1 ÎÇ qtð* …BñÝ0ÔC9®—B1�o"éeöè�Vö˜Ì¦˜^oaJ‹bbQN À VÁ �ibð�\Ëk¼&_ð7m¨ûTK˘²;ã¡­¨·þ²€Ø îêûmƒ‡û–÷�ðj+#X*`„`¢Tl¨Âjmø™½¨ìÊs{'¨�á¶9ÔÖð]Ú”]ëï#Y¬‘ékåq'p®ÃnUÁZ‚-€ËÙåÔ€.2B‘ìŠdÌa s0åN‘^oCvÑ #ÏƬ3ß;Lÿç:Äú]$¡&—x «ªõ›‡-Ö÷TëÒ…Ú^‰ðJÚ°Dt够\(ò:^óïONÍ'"�‘x©‡ƒòH`@¦@w±C7½@mó ™ÞÕ6].å\(Ûoåcû�^@VG«W¢Ç�QQ¯´+®A ö¸ÙuWµC»¯€®ƒ�‡¢TÃKzûàÀ¡™Œï’~�.Ë××׸¹¹Áb±Àõ|Žéô"^È^âᵫvX­Wø}ÿ›Í]Û�…ãÞXçÊßvâQ(:¿?ÅSÙ#9¿ûS( …Bñ·"®ýIÝMù­ù>Ÿ8ØTY²`Ïð�`¿m°ú½�1„¢4 ”—„”`ò`C\–$–Ñs‹àÈ€ì/÷¯Úøçw–‡÷‘lSÝ.k¥Yˆ'´{‡ý¶Áz¹Åê÷»u…®aˆ£x9S�”yšü}»ž£�8yÖ/¯cDý=æ%'/™ªJ�=«�2;«a6Ä’�ð4°�Š—@âûÚ£Zï1™˜]]À–„ ™`b-Œ ¿Ë”Ó“2šÝòî43}ØãÑyôŒ‡HñHR3 &°\lÛåýÛu…vïÀ`8X²ZR€$^”ˆ ا¦È9%�Bñ¾ëzû¼¤béÀÎÀ·{´ûŠr"[” kú ‚’Ö”h•Š‘*4FxÉ7fÃU–!ÂÈ_ÒJñk:±®cöœN·/ C¸ƒoë îªwpÍìZXv‘>c€=D8^ø<úËÜ„Øæ¡¦ì¤œb~½Àíí-®®®q1½€µ,k®¥µ_à¼C]רn·X¯×X.—ØV;8ïc¿ý%ñžþ+4•¨üDñÇçå¯3ž¿l¸ÑÆQ|1ÏÄ:x …B¡ø^›ÔaBG‹?EËUHV^<Ä9ÔU þ½ PN ØÒÀÚ ˜iêÀ½¢‹ –3’QÜ'säô>ù/Íi)qÉÈ®˜èŠª¹Pç†zÒËŠ…󂦊ö_¬îר7 |+Ñ"ÌÄ1�2èon°/ÙƒÏ'½BûÓ(¸€¤’<õ òdòEÒÜ Hzi²æé~ :×íH/ƒÜ2êM‹]Ya5›À–¦0˜^L@#>Å2„�2 ôTBúµó’Þi>ÓQfb«ä¨öâ¹·•Ȯǒ•!·Œ¶ê°]Uxøg¬ k�ñ6�]TûC±1áO5Á�®oc©P¼l] HPuJˆ"ì[øÖ Ýoal¨å5½¸™"RncŒAñ�¢ˆœ«Â™+½èÄþºž¸ÁÆðLÜˈ‡@2 Æx{‡®­ƒ²«ÚÁµ5à[–Ä 0ðâpϤo³le&° 0&Ó ®çs,·¸š]a2™ÀX[B0dÂÞU�óØ×5¶›-Öë V› ªjï}_×�ˆ¾^-NùZêñ¯à<Ðo™ º�RüÑyY·çwfÚ8Нˆ"wý�§ÎE …B¡P(¾•^ùö•$³¬21Q쨸4ˆ‰â‹2Ø‚YBQ ’@E2C9�ðð’ՙʒ!}i¼å8´‡{¯·ÿúÇ—ß¡þPݧ£$µ«éI.¢hç%ð@×y4»›åÿ¬°YnQmkø&Õ»)b�¯¤¨8¡È8Y�5#mˆÞ¾1¿í1#½Î¼qJ& VJDc�ŽÚ]b‚,έ±ŽQΘ�þÔ õÄÀíI“ôé ¾äú»ØÖV ÌÒº0÷v0¡(-ʲ@qA(¦Æ „Ž4}ßO-ÇR€£s“‚žxgôÌèòüŸ¿–ÑX£ëÉç^#ŶäÓó!ýVOvQOtÁˆt�Gµj°]î°¾ß`³Ú¡Ýµ‡`wˆ¨“DÞ¿ŽØ“ç&Ÿô«xEl9§R1™ÖÓȇø®Ù£1ey�¢œ¢¸˜òdJ²™ DŠ™A¢\ù5ž£‚¼®Õx]§7Ú½¼õjÙ=Šƒõ»RÖø`ò,IhOxt]ƒ¶†m½ƒk÷ß�ØÃîû ÄcI®Ù±Õ‹U‰ûŸÂX[b6›áööw··˜]ÍPNJcâK’Ì~šáºÛÍ¿ïï±Z¯±Ûíж-xTÓñëm[¾ÒžA¾P Ö�”âíÎ˺µ8šSºÏR¼e ~ÃñT‡æzHP( …âGí?ž¸¹6�4 ‹B 03¤e4ÛËÿ¬ÀÞÁZ‹²˜`z]¢4Aé%œòý1‰J<$oúút6¹xOø=‰¯—<ö¹¤‚Pv3û Ô[‘ v^ÑÖ°ë<ê]�ÍÃ÷ÿ¹Çÿßöë]íA.$ç 0°Ì#6Ôé%§^«¼Ãñ?Z2}ß�9=öÆ‘×Û3Ißö#9‘]2ì¾avjjŠæ¹‡’ñ\ËõýC±Ú‹C(Øê%JŒkÁö¾{k,ˆ ®ïf(ì4¨ôL´"%Ä8–H/î_]O={N"Kˆ_…µ¸¸¸Àb¾À¯_¿ðë_¿0›ÍPÁìH8¾ ¬ˆEmÛb¹\âÿþßÿÃÃÃ꺆óîkëèÕ¶ïÍÇ·Bñ’óò�œ[ÚŠç,O/Äò† m¡Ì¬B¡P(Šq=¨aO@™‹$¨¼,{x¸½ÇNö...1™L ˜ÁØKPi`¬� Cà’"Y:7Z¿åö0ôAÖœT{ÎóôÊœ3�6Ö° B »’RŽ`'h÷¶Ë-–¿×Xý^cs¿�«Ü J1Ñ~Í‚R¢8Þ”¦ì°q’Ëú¨}Ý·vR”3½Lcn ’·tt�,R*”(Ýüçrü<2ÜøWu×Ë)’ñ胈i¨ë2ÌN‚ PÐ\ŠxסنÛû“ÉÖZ"LÊö’€‰E„‚�V0e=´7|Í!�N'UNŽ@É£ÐɧÙ¤Å_œBO´)åÔ�d‘CJB0£‡º]®ñØol¶Xþ³ÂÃPoZtµ‡õ ÁJ2Õ/Ä‘ºë¹J/Ò¥îµ[äÌoJO«H_о…A³/†5ßXL0�Á CÈ{„¨NõGÏ2ÞfüY—Ë»¶žàÙÕÍ™µo|Ó"É2´# ìÀÜ‚ÛMµE½Û ÛïÀM ò-H áÅá²&>åqþ ¦–ePw-æ ÜÝÞáfqƒË‹ Xc£bKúµœYà½GÓ4X­Vø}ÿÛímÛ…‹^’,_u ~þèS(>ï¼ü“•^_I½©ø{ÌK†Ë[‘^…¶¾B¡P(а‘¾ÂØ2/6‰h±á†­`çàk�Ú6Xý³8ç¦WŠK C@H#Ön'I¹à” IDATÄÑ ú¢ÌÞð3O‘^‚—øh DEEWÐv°(àº.ÔìzØà÷ÿ=àá¿+l—\í—h®ƒÂ‹`BãåÏ#ÈH¯¨)ÒCÈÇ –üŸtPÇ+Õðz�º$%95AôV'¬S3:ô‰…µÂoàkÆæa—%6�ÙÍÓÅfR€Œï5{cˆ‰êÕ—ÔÓ£W¼<¡FÕ¹²ZC+­tæq¨_y⿉6†�¼2lGð� Þ6Xý³ÂÃ?+¬¯±_×àŽP „E #%‹ ç Ñe€o°>ØNŒDãüÇøÜj6è³A�$بØ%ö�¶F- @Ø�„QLÆ * Ä`P0䊚/S^ËŽû‹ÈTÚÇû¢?׿¿­0ˆ†ú~‡»!˜#ÁÂЉ–�-\× «wh« öÛ5Új éö î`ÄÁÀÃ&r ’@˜™Ø’qÿ“ÛIƒ` a:™`>Ÿc±X`1Ÿãj6CQ–µ¾Â+öÌhš»ªÂv·Ãf³E]×ááBVÚ£*ë¥PüÌÝ%�÷V?) ôñUcŸâY{Õ?Ø�=¿”öY(á¥P( …bØ\dvƒÉî+Yv µ¼Ùxˆgxqh«kÚÂ;"Ba @.aí– „‚¢BŒô}Jv`d0�^‘8�A#õ^‡‰Ç µäÜ6ÿ;· b0™²«u»Ø@<ÐîªU…õï þó€å?k´•7+9Ùe°Œì’ËÈMñ‘1óšÈ&Ï‹‡¦‡ò¨]æé” �^a´0”@Û±AÙå ®atµGµª°üg‰å–Ø.+´»4�¡„"Ô킉‰|ƒd6ù×­O¨�#%½>$²Ë‰=R´(‰6Ɔà]ƒÎs + ÃÆXbŠ)¨¶¯÷è%‘cÔG’ãJZßq`§õ6fÏoKvÑ‘nÓ`¨oIÚÌ‚Qîà\�®Þa¿Yb¿]¡ÛïàêLFvuǨºC¬ Æö±ÞÆ\\\b±Xàææóù³Ù eQ '0i0�ôÞ¡®kl·l6á£i0�ëJ¼�B¢þf ÅO]~ìôט§xÁæ‚^9¼øcFY /…B¡Pz¿Âm%ÝK}p{xâI¾Ý ê“,† 1II+CƒkFm¬ÿYÌèºkÏqq=�½°°e¯ê¤´ÇËÀCº!]é¢s|%/;TгÇ{žÎÊ“Y�Ýx~LÖ'oÅÄÄOHØ�œdB³oÑU6[¬þYaõ{�Ýj·5»JT`6�d#‡<:¬ >Óç$ŽS¢‰¾À¬ý4º(’\tBá•ÿNúw^Çdµt0¶ï²ÊEB}˜-��·T °sàš±}¨ `0;@WÝ%.®JÁT‹Ì`å¢Ç:_§ê·=èñõ˜NDåçŽÃʈ٠/ˆ„)yGtYo…H0be,|Çèj‡jUc» Äýê¿kT«:’öe¬?haØ ¤ýÙ¥øèØ«´úŸïFyc$Ôa$DòCDÜ­ƒ¹Ãôâ åÅ ÆN`ì¾OèH¼ò3\j96¶%—ãR27|$ECPv¤cÔÛÛ‡þ»Äïÿ{ÀnU¡ÙvðQÙUb’%–3²«OvÑQ‚ó³È®q«üì¤O ¸†›ìO ¼œôJDXæè©xÇ‘:NV• !8\Ó¡ZÕhš Ì.Ì8fæ…�JK:ÄãAòˆ(”^4gž&»Žï>ŠÉØÊ0Ýšâ;FJ¡˜Ì•üßÔ+» [tM‹fÛbó;X²®o°]îÐî,—(¸„‰ª.H¨AhÈöˆßÅÊðKŒh ïŸr9þ—é[?‘^ö4ìÁ-ûÂD„Œx6l�¬ */a�Àfµâ™)”"'ö"t¼£dg÷è6êYûÆãW&£ÈJ1î˜h![$¢È |çỠ쪷KÔÛÚj•].’]–¢ªK||¼d'6ØFø¶öß3Ö ,K\]]áî×/ÜÞÞâj6CÙÛ–ŒLhsA۶ج7xxxÀj½î /`Œ‰õÇâ;¤O=-)Н°þÒ÷Ï]¨�¡â³w^¯%½”ðR(ŠŸ(9{¦ÿ¼Õ퇃ýÐæ–—Ž’ÌÖ�,,€0C<Ãí=¼s°†a´M‡®s˜-f(. Ø‹€ efzW-m¯é(�ò¼WK:Ÿx„Qí‡<ë-€í“¼F ¬XH'hêûmPÀ­þYas¿Ãö¡B·w@gPˆ `(c'Ø#:ýHgÊ×Úž?1vDÎ'¨5wöI½fR]/¸kбÃî¡‚à»Þy\5—˜\(/-Èdm(M•+¤(ö°ðÉÛœ/òÊ1wœ|9Vx凯ìûÙµ]¢Ü’Œ†¤¶X)@Þ k=º:(T7÷[¬þÙ`õÏûMPvÕ©T‚Ä(@}ýAÒ•]ñÍbG¼°ƒ €·`/žÒ\MhHf‡é¬ÃäR;…5E°6¤ð(^N�7R`ÏvnÑH&Ð/Ý?Ëaü8ü¾H¦¦:ÿk�¥½eˆ#Ü„A °o!¾A[ïÐî·¨«5ö›ºýÜîa| #�˜˜ 5¹Ú¦�k[{´uƒzß ë\ǘÿšcRN‘nÇŠÉŸÆôª¯Tg()6Ôôê??²ñy2²èH·u41‹óPŸîUWbAIÍ E¨áå ®uØ.÷Xý^áþÿððŸ4Ûn/ oQ`‚‚‚˜E�!ålúZj§Èµ–ø"séоagÞ'ÈÇç K馸ÀCTšLF, 5÷Zö`îP¯tu�¦®áºm³Àü×®äÅ…�5 l|ˆ$ñÑÞð°¢Ö@äËQ¥yåT`<ŠBÃÂ*Y\~1j’jâ€ôJ„—w@½k±[íñð¸ÿÏvË=öëÜ Œ(©õ¥þebãç¤|U(¾Óî9A�è) ÁÂÀ‰€¼û¾f4¾ƒwÚ¶Á5s Ǧ;¹„1AÉíûÇ1qDQñKQÅ�ƒ]Ê¡’+Ôù¢Wʄɮd·bƒ¨º¤ƒ Ê.DËÈX³«\JþÒÇXŠ—‚ÂÚÞ�-,...p}}�ÛÛ[Ìçs”eÙ«±%Ù�ÀÂ躻ªÂòá÷÷ØWÕP»‹B|”^M&Ã-݇ýE‡]…BssŽHñƒÏix9饄×w[\5)f¾Kì8¸-¥añk šd¹Ó'?b�ª�ˆ …“¯5· ìxÇ`/'(. Š)¥�µ%` B ‚ÀƒÁC:X¤ÿÙÉ÷1ª“$ý§ç쉎oãÑxƒ?ƒ&;Õ¤dNH›heHbAlO`|ëÐÖûÍÿ¬°ŒÊ®ýª…orFJXSÂR ë}�áÔyX»ãX3¢#þÓBV$½Ò¬�Æ;uÉ>´Ï>7üÑÑJ1ÌåÂܵè|‡Š³…÷ç<\çqy=Åôj35 ÒÂX ƒ A$Ö)Ìž•p î#:w¤{A°Ç€¼ÎBRʈݢŒô¢P[�L|çIY |ˆøŽÑ¶ šÊaó°Çú~‡Õ?k¬oÑî:øZ@ÞÀPPvY0„¿$‹×TôìSú[ÂûÔ��â}¶ªñë@V1l¼¸°gxñ`öð¾ƒ1a�˜x‡Â;˜òdJX*�ì�‰õ:¥ßc™G7s}Ý/ö@ÏÓñ£Ž+šÒxêа¦ÑèJN°04‘x#áG}çZ´õMµA½[£®Vèê Üí߀Q‡ÚhàìBU$“mp²<§z‡€È`:�b>Ÿcq³Àb±Àåå%¬µaí=h×9ì«=¶› –K¬V+ÔM3¾˜I¯áÒ•<×&Añón Ź úÓH÷KŠ/4½â¶ãÙãR ¯÷î”�^tEo{+ºÇåêñßÓ¨¾êÛú> ª+Šú®Ìà» I´}aÀ ڭDz[c¿«QïZT›=wW˜ß]¡œ°d °¸`%–÷a¬‘ ¬rÆ6~ùíêq ¿$áC}BøxôÈhsECížž õ¹‚ù�…‰„—ï®ö¨Ö5–+¬6Xßo°]íàkÜ$Z0T €…á"$�Dz·þ©NT6;ˆÏ³cT¼ÃlÈ^ùMüHlQ¼N.˜Þ{p²TÒîú”@,G×VÓ­ÿ@öXš†À( ÒAÆö¾FSw¨«»õ7ÿZ`ñ¯9.®/0¹šRË€X\$êÓÌ u~Ò¸Èä«'æ1ðXžÓ«ÿ¡s¨òˆ­WŒd•ˆèÿ³w¦ëmëL�~$µZ²�dæþïo¾[»Dèùp“å%‰ã-]çÑqlËI��FªZ]²cËÉZ+U‡÷5þTGU×úÀæþÀê¿ëŸ;N›#§m µ#×"’]ä8͈�M\ì ø˜­üaŽÔ3’T±0ixµX2¼ÝBÚå/dmž>Ú†ºâ€âëŠñéÈxvb<™SŒgdùq9N2BºG•�¾×6GÒG Rû„÷KëC²«ÓÓ?º)#mzj8§¦_W£áÌäÎ!êQð¾¤<î)[»5‡íŠú¸£.wh}ÂiM¦žÂ)¹$—¶´_{ á‚sñûf£UCâ7Çìœ0›Î¸¹¹áz¹äj>g2™ í ÛðŸN­¬J¶Û-÷÷÷ÜýüÉêþž²,ã{œ‘^Fª|Ü…°õ34|”Ú…|þÛÉò$ÃÇ­¥½°Üa„×ßü Þ!Ð)Vë2þntý˜ É—NJä÷¯‹|ÐÏë³'ÀÕôxéYw)d’ã‚´ö_SžJÊSE¨ >Õ„Ê£fÕ˜±‘�’ ’åqW¯si7-(RO†ÐWHÈÐÊ«„Ò#½?=s)LvdCv©-Ç"im¿Q—þí¢]Wp„ Bå9í*ŽÛëû ?ÿß=«»Øãæ¸+ÉBF¦YÈãµÒ§‘8kúÜÈ Ç%ã¢ÇÚØ[ðÖ7CŸr½hmH£´éŠq�ÂËŠ3ï9·´÷v{ÏuŸ¦MXì&㫊ʗTU�¯jÊcIð A¨Keêa<ÍÉ !+"‰/.E,RÉ:øgŸ}ÛâÅ õp¬ ͇6…]'DiME‡¶h y/82²’B5€÷Jy¨9îŽlW;V?·¬îÙÜØ­øS@OJŽ#s£hŪ�RŒžrLûýÍ>@2Õ*¾l�€á�BHÏJ´íÛ×ü.Z>hH6{4ÔT"V{B]£U‰úš|©»¶©—HÿzœE_ùÀ‹Ã“&éÛl00²ËðkFŸQé¥|ƒ6üS·½%ÓsãÔ¯¿õAè;Sz ' �þböc$$¶Ç>¯÷:9+úÄ»®Àšì}B²úÓ*Pn*VÕ–êT±Û츺™3¿�1[L˜ÌG“WŒÒÎh@ªÁ£q¯3*ñD{ÇpÁL_€?X ·ÅOi‹ ÍÏ]{–.õèr]�-uH‚_Û‡õ�íêÀnµg·9°[ï9îKB)äaŒÓ,’]šE5E¯HOWaûcÉný–}>Ýg§çE q©NFSFv€“HŠ…PS{_üšÃ¾d~³çj3c¾L±l6¢ed£$»%ÐöÐ"D½ª6=µšBm¿€Û�_CDé­ô¥Öô2±˜;´DíÇ«frÒYºDx­át8q:œØ®¶lVk6«=»û#‡mIuhép>FƦ_—Kª.iš3¶ù�yƒh¯eŠ/Ãçu­õp×§/Šà•Ì‘Kén¡„J_•T§åé@1™ÅG"¾\6ÂÉ(¶À“Œ@ h̬¼ô,åaFð§Û)DºNƒ¸¤Õt1º^O-§‰ø’h_(UMYWT§‡Ý†Ó~GuÜQ÷øòõ�LK'�L9�­ ›‚ýœYºn‘ØM„ÉdÂr¹äÇ�,—KÆã1™sÕA¼{Ïö~ÞÝñóîŽínÇéÜÎppm, ûÝXk0ük5ˆÏ´¯æËo¢6|½å÷3¼‡^ã¿£„u�Zf0üµæ£(‡,)±Ïë]ΡÍÊ_»þ^©Œ�¬ù4ªÄã½§ÞW”û§Ã‰ÍzËn{`¹_°¼½bq{ÅláÈ'Å(C2pYìß%ÉÖG%*&B*_HÓëÅ•¶öwc+] ôThiútiÜ-,¢4ä” <øJñ'ÏéP±¹Û²úoÍúnÇænÇq_RŸZÇÂpž,¿œ:\²Cì/i^=�ÈAaÅÈ®�–l§ÿD˜kv÷I¯ßi§ø ‡—áýWLñžoïÿ¦·YgÙ%Q±äƒ£ªKªSEyÚ³ÝØo�v'Ž»Šº „ ¦³ã�#™K-¬²¤’ÐD~u¤:Ò¾%òÓIDÙÃàÖô+lb™&òN’l:�¶Tœ,[…j†sIÙê…P)õ©f·>²YoXý\qÿóžÝúÀi[QÑ"Ú¯—貨RI±K›k×/QlÄ›© _/Ç<%MJ¤Ú© œ$�§*^+|å©}�–'ªòHU�æLª+ÔÏÉGS(&dxœŒÁå8qq„´'ˆ# „¶××°OŸþöµ9-éŸÔW™hTa%ͽÑåQ_£Þ'U×�ÃnËn³â´ßâË#Z�­pZãðdÈ8ÑDviê«­Êý¼Ïb'†mâ#­½vÓÒ홢ˆ^¯}áõã K¿ †¿¸Àý7™‘]öy½ûuåŒøJYG*;¤®ôz[‰j­S ÊN�”ÇÀ~}b³:0[L™Ì'LçcÆÓ‚ɤÀåÄ]»™ Ρ.m+–Ð’@]yGǦ퇯Ü´m�MÚfä]¡Gƒ¦Þ6N’ú!Z|í©NžòPQîKŽ»#‡í‘ÝúÈn}à¸-9íjB r\pdR�IÑ£¶¤ëK1 Ò#¶´ÝÁ=ÜM~þ)t….Ã;å^ƒâX$·R_9z–†O ÃÛW$äáJ?‘E�m©ÓN.¬‰×:*P��¯·œö‡í‘ÙÕ”ùbÂ|1a41šŒÈGyá�Ì!Y†s „´€àthå%ŠªK¤×ÙB¯%ë“«™ê€¬�ë’& B–ÔkÉÆËÇ~rUUSŸÕ1öê:îNì6{öÛ=ûí�㮦> T#²Ï[BìW˜%;ÄaïAé6>È%ŠþcòF… ¿CÍFËpžßõuVÒkðåZu‘C|,†ÖŠ?J_êÕqG6šRŒ'ã)£É WŒqy�sE² ÍÒfœxûf³Ì…l@_ »|¢Ÿ�‰è"ª°2UD=h ¾Æ—e|T'êêHygãÛ`0üYŠùÑí Å×`ø�·Ø#¤—^¯y¡?{oK/ƒá î3K ìóú—¯çY¢ÑšßJ¯g‹�ášÂ«:‚fÔU�÷>öõº?²žì˜þÜ1[L™_ÏY¤Ka4Îb_œ\bæ’Ç]ÀÎI¯ÿVGµ%›^_œ¾í—ô¬ ålo -©þ,êÉÉP¯Pƒ?ùT>²]íÙ­vlïwìV;N‡šòà ¥jbaX 2ÉÉ\�#o÷_»ÞUjw·•œ®÷Îãd×à lP¾g(/°nÓ^S¸†ƒMªùB˜/ºL:‹lý>WM%;)=]ê×'dd’SûïkªÊsÜ•ìVGV?·Lç#×s–×s®®çÌ—WL¦#tûºÜ!@@ÄŠº€„&µ$>'™¡ ƒ€ôzCÃVáÕ8‘¸Gˆj®²¦.=§CÉq[²ßXßïÙ¬vvGŽ»¡RÔ ®!¸4CBŒãG–®I£k¶´·C» îSŒm#° FzyI£ôŠÃ*Ä>§D%RH]ICðø²ÂW‡Øï*/ÈGòñ”ñtŽ/¯M¦äã)Y1Á¹\Þæ&ˆKšwת5)�µkž -O7äÄ|+Ó¤ÂR�p¡†PG’k¿§<ì9÷œŽ;ÊCü>ÔU|®ú¶W—ŹôZ=«ÂFƒúPÑÕdL=ú®¯p=#ÜsL§Ë%×××\_/™L§8‘vÃI£ÜR”ºª9áu÷“Õý}KxI&g­Mj0~³ñ�•^¶‰ÚðÒ¯K¤—^¯u¡mmd0 †5‘ç¬H¡ý‰±Û©ë”Dó¤»Á¡©E­p ¡Rª£�ØõžíÕ„É´`4É(ÆÙ8#9ÜHp…Cœ‹ê/'d©ÛyßÊGÏvÖ ’¢³¾8MûU%xE½|À×5¾Ô§šúTSËØãfwⰉʮ㮤ܕ„Z�*'ó.‡%ÃIUbäqWvc¤çÅ�îÑ׫=Nvþê¸Öó«.OrZOÛ=¼kôÌ Rz9Ã[W".¬œ†Ÿ|[c�}¯\O1å Ô„¤˜ªCàP—„ NûŠÝæÄt¾�ÊÕÙˆb2¢çäã—;\ápˆ\îRcпK{ ¯AÜ�aA¶ii‚¢éB_—ø:àKO]zÊcû’Ã>‘^ÛhËX�jêR!¤8¦©ÏWÚ´Ð^-e¯—Er*Ò› ̈Õð5³ŸÆ|ïÒïô×Mœ×ö~pT¯>ZOu¨ ¾"T%Õñ °Ñ”|4&/&dÅòdE|¸qYʰ$•ä—õÅ6èø×Xj@ƒ§V�×B¾B}‰Ö%¾îPÖ‚à=þ8TÇ]Åæ~Ëz’3šæLç#¦óqì‰33šŒ¦#F“‚¼(Ès!/2\‘#®GxI¯Œ3ؾvÖÝK»^8>4Bí •Ržjöû#‡ý�ÓîÈißÚ®ªWBPê²æ°?±ß8Nœö'އ&–Uœ5Õ) • U²žÕ"ö$õù¢ë7è†úÔžW�>¨K›ºÚðõãFßVø±H/‰œqmߩƲ$Än¥ž¸ÑF5àëŠêx@É�¬ +Æ£)“ÙœñdŽMÒcŒ+ƈËQqIbé’j|oeØ·ôÒœ#)¶ aîñ¾&Ô5ZŸðÕ_5_�øÓ Ÿ®PŸ�àA=ψ€dB´/4]Ò)¹\{M8ËŸ�Í�&¾S]‰ƒ"^ß¿g±X0�ɲ,ÆH ©×`zÕ8ŽÜ߯¸_ݳ^oØï÷xïÙÜ¢¨J�ì²¹Ú`0 †÷ÆcJ/#¼~wüh©Â`0 †÷�›~51xÑ[È/ª™“§à{é÷g€Xúxõ”ñ§ŠÓ^8í Û#ãéˆñ´`4)(&cÆ“‚|”S‘ø*F9.sq÷®ëlæDÒÏz¶[±p¡ÕHp%¢Ë{O]×ԵǗ5å©âp8pØ)÷'ÊÉòXRŸ*|¥‚w©ŸMŽ“çFQÍ%Y*H7g;´èyôÓðsú‡ŸŸá÷î½p±;Ê´Ošw�_¼‡´g¡)Âc&SFv½g=ï.ÞÿŒÏ÷óǘ"éÏhúzyB¨ñAZðøR)5ÕK›& IDATÑsÚWŒ·GF“#ãé8ö*œ�)Š<ƲQF1ÊÉ2ׯ0I�mâû�G�¤“HjŒÁU×Ñ6¶ø:P•];NœŽ%§¤ðŠÊÕ@¨%\šÇ¯’µ„—´—kÿëŽ$Õªû †FƒákG‘NéõØlÝ·LüTbo/qi­*AA£ÕaT€ H†¯J|U¢¾Â—%ÙhÜ’]‘ðÊPç"©#.*¾œ#Ë2²,ù¤ü:S:iêgª!ÄÍG!‚'Ô5u]§÷=ª_ŸÕ _ŸðeI¨Ë¨ø URriì÷åâ¿é‘]ÍÆ§.zè/-y"Jëƒ>8ŠÆö‡NpYÎx2áúzÉ·oߘÏgäyŽHT¹6V«"4PU»í–»Ÿÿ±Z­8ì÷ÔU™,båÕ™]ƒÁ`0|øõ;Fx½üÂY^c0 †tnj[˜¿ô {ý.¾]áßiTäìâ~`�ÖïǪ⴯pÙ— ®ò"'/2²<'/rŠD|ey,ìd¹Ãe.Ëã÷®o¿Õ‡££®«DrÕTeEU—TU�¯Sh4–¬:$¼Î‡Aw' "™‹„P$…<YŒcíQëƒâËŠÓ®ÆåG²Ü‘�2òµñ¬5q-#Ëb¯¯öß�}ë`Ë€  Þ+ÞÇ8UWžªª(Ë*«=uÝIJ:>§¯„ÇÄçäÁáÔ‘¥Øm 5W÷µ‰×zÉ^¬wߨh6ü[3…>:SËÓ‡ûy5”™‰6¤D»çƘPñh(Ñ*P�?��<‡,G²²¦ŸWTw9çpYÎd2f2“�ÇŒG#\憽¬Ò4p:�8Ž”e7ÕuYE(Ô¨¯‰Þ­Q�„šLÓ¿ñ¸´5À¡8Õô}è4ìÒï:ªÓÆÉAÏzµ*('EQ0ŸÍ¸¹¹æû÷oÌg327Ì­Z;Cï©Ê#›ÍŠÿýïÿ±º¿ãt:¼�ÇÚl8Hª³‡™€E8ƒÁ`0>Îgf#¼þ´pg0 Ã?07ɯ¼[ÏÖªáÈôÁ^I…žØç%Ú縖ôŠŠ/¯à«@�­½Ñ'“¸s9�Åá<ÏÈŠŒ<Ïɳ¬ýyÖ^Y– Å�Âû�ˆ®Šª®¨«š²*©ê ß�\>´}qDSÙW­C$·2ÉqDÒKšb1ç6…—‹$òd¢Æ#϶œä Ƽ<}¥›¢á@½Õÿ—&Ҥπ5*îY—>Ùbx»ÏXû÷e¯0ªgw� íÊT¤Ul4Z'É®TcÉ×I†„¨^õ�Pyj!Ã…¦°ÿ¦¯p�îHzeÑÂ� QA´éP!ƒëqÞ:þƒßÊ¥«jøÔ÷mïó ©H Çe²–âÉbø;qô5_²g½x*g]Ý$]šÔWt¤R$ís ÐØ|‘±´V*ç©Åƒ«“5«à2Iñ‹ÖF1~mì  Jð�r•Ø»K!‡¨�µd4ª0¤GxI§MËÙÕôë.éu”Îêöìúé3¤¾Áðåâºþy¯:9 N®Aâæ %�r é^K{hâMOPìr¤7räµ£ðŽ\Šø{ér-"1žûYuÀU(OPVd!à4$¥VìÁÕäw"ùÕöÔ’Ð]=¨<ÒÿòW¯QH') Ážl©ó,c±Xòíö–årÉl>§(ŠÁ†“>ÁW–%ûÝŽõzÍýý*öî ]ï.�á7>_CksháÌ`0 †Ï#¼ž‚)» ƒÁ`sÓïAÎP=8à¾Å_ó“hgˆ™J*ÈÄ]Ä*±¸Óh T»B‡ªâEÓïæf9ɧÄyo¯Ne£ƒ{E_8F ¯ð™èc÷Ò#Jyêþër]Ò+4ÔPcþR‹ñK’aYÐØ;0’ùž@$âCê€ÕÆa@�JO�•‚#¤¢wKdIz´¥ ˆxué¹Q—�6õê’žq¢C\w1äìÊ=´¾5e—á Ç‘~ÄÖßêréû¦¥ hR%5÷pH›‡z÷^辆ô�ˆà4'«32Ÿ“‡‚"ääÚ�])6¨àÕS‡ŠÜŸpþ„«ŽHyDªŠnû޶*-×öêÓ–ô¢÷hˆ1þJà&N£‚årÉí·o‘ðšN#áE;›ë¢!Ú7n·[6ë5ëõŠÃá@a°¥ uÒFd±xf0 çÀ¿Ix©-½ ƒÁ`ø[�gðÈZµ„¶•KÅŒXjpQÒ•zì4}3¢rBÛ>H…AÃ)èyi¶k­5¤¦:{ºFÍÕüÎI£mèÿ—ŠÊÚ/íž³|ax0†WÏÇôEãì=n†‡dWóõ¡¢¹&}˜�ù ÁNTÀâÇî@›þ5Y��1¾i´@llU\z­€Ó÷D‡ãB5Å›†ôŠ1JÛhúĹtx}]E¿"/-Ù…€SZ²^ú$Õ[OÄWí½j³ÁÀVY†6çÑ?â½Î^³»Ót¶Iñ¨8¢µök®͖N=�\”\¹S §moª+¢ !¢d¢dx2<®}tv„]®øw®%ðûÑ ¿É£¯b–'¢íK¯˜>øÖ9G– ³ÙŒoßnùþí;³ÙŒ,Ï›Múꮪ®Ùm·ÜßݱÙl8ì÷Ôe…(8׳ÖÎÞÖ5[Ì}Ø`0 †O��ðRÛkh0 Ã_žj{ÐçžýXg‹®÷Cc—Z�7µÚèf#ФÍ�ê+ôªN•B³ ;¨I¯?$%šNÚÇa0 ƒáuqÎ;?K·)@b<O&\_ßpssÃb±`:�‘E÷Òå‚>‡›õ†Õý=w÷w4t×TT‘•ì#åA³×îµÕ6 ƒÁðÑj Íæ×OMx‰Õ ƒÁ`øÐx�©úL`H¯ÏQϺPRï yœ°’I!\xÂ%ó¼éaõ§*Çú\‚fCæÝÇÛ_;¶¦x©J¡íå•6–ü0¦çðuÍv·ãþþŽ»û;V«Çã±=·ö<ÛÙ‡Ùâ‹b¶Á`0 †·G_„.|fÂK-Ï0 ƒá«¡-/H¿—Eÿ·çEßÁ_µ5á¶äû°5ÆåÜaPUn_~ŒôÒ³É&&Æu|ÝñÜ’[=¢«ëã¥-9¢Æz~îUVÿ‘³å—>r·Ÿw<ÿ�\ »ú±*õðÒK„X£ÊB.ø«ê3çc«-ƒá½Â‰>cä,iÔFç‚¥Ov‰ N†?£û¾µHÔž™j«p’³¹­ë»ª/Èa^ƒ6×$ðR s.ÚÎf©w× Óé”%áeÊ.ƒÁ`0¾r‚Ô/_¦™DžNìÔjŸ]Dœ›í�ï|¾ô—:sýújeP,²Úò×COÂÕ©º:Ò뜌µ4÷s.êäA‘A\Ð_ª:<¸þ¤ž<ý’�Í’Áð±�>ŒÉz¯U‚ 8—È-'8çpâpIER39q)Ïé~Ö*À–tb ­þlód8{…¹TC´ˆÍóŒÉdÂb±àÛ·[®¯—ŒF#œ4hËO­¢úp8pwÏÿýd·ÛQ•%Þû®ókH4_ò�mûv¥9\›üÔ&iãCýïÏ™Ööë†÷¿–s=¡6þj¼ê-lßcEñù/Sv ƒÁð•S#.UÎw3?Ö ª+ÖüÆjà‰f ò ?ýíôÆ’›/;¢¥!¹8#½š]ôoR&1ü] dâDW'Õç_§ýzIµuq„=¾hz.Z™’Ë`øá¥ËUζڈö,T;{>'I–„Ò#À¢¾SmÅç?5¤yË!šù²È f³‹å‚››[–Ë%£Ñ×ö/kN*„@]×ì÷ûhgx÷“ÝvGUUѼPz†Ž�òZ5^/@SoXQ«žºEåMnQ1ÒëKÆ÷¿»0 ûÍÛò>¢¥ß²44u•Á`0 †¿œõ¿à7úÄW¹ðoy�ç:u=‘ß苎ù÷$#»>ïHÕ_øŒ‡Ê.ý‹¦Îú>‹¿¾Ö—GÖMé�•Žôê6ò^2.“GŽó©’sßnK.ÄÁÞs çÆyá²µìÇ"Úª6[‰‚6–Ñ�R¤/6n·%µ—¤¸%(vˆ“é„ëëkn®o¸^.™Ngäy–ö¤cO]×5‡Ã�ÍfËýýŠÕjÍñt"¨­4Q£UdAׯé 3ˆµ74¼lùb0|€ácŒ—ácä-o*‰ð[' ƒÁ`x‹¬H^²ÐG¾?ï•#O/^P±×ç~k Ò¿7LŸ[—­�²ëRŸ‘Ï´8×^ËyïÏâužó·®Oÿ‡m]úü¢Ép<]Ö¹>‡úä½^ˆQVì0>äršôø“:eV¿aW£^j#�*"Bh”MíË´R±Gu¥ï ç„édÊõÍ5×7×,–Kf³)Y–§Ã–hÁ˜ìu×f»á~ûw�N§¸ùDÑN{ÛYFšPˆ‹Ú mã«>ò ƒÁ`¸¸Jy¥×‹ /Sv ƒÁðÐÛˆ Ƴ / \.è>FL¼ÆÕ³Bò¯&»ïnO­/FO<±oK'"(% ’øîg=Ó€ïêß»žH{ó;Všò‹§ü[w›¾ðûËqL/œøù{És^w(éÆ4}õ•>þbò‡ñHÏb¢Å(ƒáSåQr·jË{Ÿõí{‚½ª½t öú(×GDp.£( fó97×7,‘ì�Fˆ“–ÐkûfeY²ÝnY¯×l6v»u]]°rìæõÁ|цlmeº*gn5 ƒáËÖø€ /Sv ƒÁð�’…T¬ù×çfs–®Tv£>ëOÓ.+$ÿîø}¯�Tçïû€vx VÒ'?{%€T|Gx‰oE%€B FÓ#¤‡R¥G†ˆK…5E•£ 2°S’'Ç­<¸ ÎÎD_çÊ…÷üU¥×kűK– çcì%Ïy�Å›ö~&gϺT>~„åú£ÐÔWzYŒ2>kõÛvÇ�„«�C‚<Û!F{Þ†� ùCyY–1*FÌ糨îZ\1�LÉóE£Maÿ˜U©Î ¯ýžà=N¤·%¥ò°¬j;7h²Ë¼Á`0>tíæm‘?·¦7¢Ë`0 †š1蟯o壞Ú3*œËùË�¾¤³�{RÍ¡p�¬Âð;8ïA"<"_ÖiíQÓ理4ýµB*8žÙª¢øø·ŽHXIM� OI¥'Ê�áÕÇ^ Á¡(e8R†=¥¨8Rs¤ÖžJŽF¦ng¾ ‚CTÒ'®w2à3äù�ÑÝ_/"Bä‘Ïéòkÿ©Òë5ƒ˜>d¸Ÿ‡¿5ê¤ëÏÕÿ͹Y¥>8ÑK½å6�§�L>Œzv.°E«áäQeŽüƒ1ÝÍuÒö´zLÝu¾1HϬPû4½ÊÃTÑß¾U^8�§ç9ç(ò‚ÙÕœåõ5··ß¸ºº"¸ÌáCè†!|]³?¸¿»ãþþžýá@]WísrïüƸf[æ÷ªéÙ牃Á`ø4È-v ƒÁðI×�P¬ý¨sÿÓú•ÞâùÑbý°bñ|ŠÇßíùKk%�?¿¢¯5*Ÿ¾\ï÷í»È9ÍGK4" ½R_óiÇï£%a ‰¢ .'H‰×U8p ;² øb1ÑA�c}`_í8ÔNaK©;*ÝSq Ó G�A]ûUûß·;ô5ž‘ı݌à¦ÉÐÜSº«Ó6Üêú·¼l ŸëÆôégþ¦Òëo²—Çk½ÿ9Å%g£çÁ{Ék�û¯Ÿ^40÷¶¨5¼iõ×o€?ùÛ¦�×# ­VÍ%I¯Ç"‰œ½‡þ+'¿›û:Ùfƒ“ ¯ÉtÊr¹äöö–ï?¾sµX�çùîªøºæT–lÖþßÿþÇÏÿ~r<[˜<1¥éÅ8*ƒÀ®–>ÿ¹¥K¤Ö·Í`0>rÑ__P ƒÁ`ø(«Éß\·éÇ&½^²ð|½‹£¿÷ò†?F—ÊŸ èó¾H½Äv°Û½ðÍînE5ˆDUìÇ•ÚØKC-)ˆjEŠ W‚«¨9q ;öÕ†pªáUbªžcyäPí9…>+¡¨q“@V…ŽÊRI…HAƒOÕ•¤òÒ†òÊ@’”^’´Œí¹6»Ï¥×°JzD×Erð1)”2¨ž>ÖŠ3:ìw”^Ÿ0Ž>="õïe«¯×üXŒô2|”ûÿCœVšÎI/M„OŸèRÕ‡Ä×y/«^·çHŽç,ûd“¨´ÏϲœélÊòúº}Lg3œsÉvPÛsC•º®9Žl¶~þüÉj½¢,ËÁûh;{^ö;>׿‰ÊÓñÝð0µúJ§csŒÁ`0üé´ðfsCn—Ü`0 ƒá!~G­bøí+ýj©ocd ¢aÍ®³gj¬ # 4’] á � R/ÉÀ9Aœâ¸\(F£«Fž’=ÛrÅÝ®`T�¨êš|Û ¥®*ʲäÄ�lÓ›1ó0EFŠP¯¯„Zñ>¼¢^Q¢õ’¨C$ÃI†HŽ“8@ŠkÕ^’N:*Á’Uýk}®òz�jŽÝ;‹ÙÃGº7’^J@5*�C£HN7RT@É/M}ëÃÇH¯—ô¿:ßR!·uäEÎl6c¹\ruuÅl6£( è‘w"‚sU¥¬*¶»-›Í†ÍfÃápÀû�±î¨%´^ ½äìçFt½p¼éW½�lŽ1 †? ¢ú†¢+#¼¾ð‚ÏÒ1ƒÁ`0þ`Q‹íè|»+-¯öj] �hi)Úñ?ñ‹vÊ­DF ±ç!*»$)¹œ¢NÁ).wä…Ãå— y‘1L¯F¸©RÊ�mµ"ÛAvÊ(ëß#¼4(Á{J9�Í„é͈ÚÍÉg¡ö„ÚS—žª Ô•ÇW_ƒ¯Z‡H~AÒ1:‰K‡Kv†Ië%g$—ôUZ}è…ÿ¹EžÝ;†w�Ùƒ!Ý�WJ7 ^Rwñ¸"ÏÌÏ’^¿sN(Š‚ù|Îõõ5WWWL'Š¢ˆj5:åZ£^+Ë’ÍfÃz½n ¯|ï8ôùâ‰Uø­Að§~Ëm ƒáu‚é[9 áõÕ~ú¾óñŸ4Ü5 ƒá#Ì¥Vëø$9ýœG;ž‡ÆÑo@sŠW�']!\dÉ…¢ÈÈGŽläÈF£qÎh\PŒsŠqA>ÊÈŠø³ñõˆº(Ùú5õþªºJ„W:žôßÉÈæÂÌÍÈ狲Bƒ¢>àk¥®UYQ•5Õ©¦<ÕTÇŠº¬©Ê_|zmB´;Œ‡dDUW–,Šïéu±6ðç’¹Œ¢(X,ÜÞÜr5¿¢ÑΰyžsmJï=ûýžûû{Öë5‡Ã�², !¤�!=¿B}Z¹%ˆ)» –Û Ã+Ò—l·üáõÅÇÐßuäUƸ,˜•ª²æt8q:”w'Ž»’êXQkªcM}¬ÐÊãC€RO¯>µ¥=ò«ÙAÈIÚ[·6 ë.ÄŸøyC†Er«›1�`¯þŸ™VA5´„[–eL&æWs–Ë%777L§Ó¡º«é9¦J]×Öë5wwwl6›Dv…öìú‚Á`0 †¯#¼ o–cée0 ƒá¯&MΑþÕÄó$U—¼jõBìÅ5¦‹ó匫匫ë)Óù˜b’QL\´5,„$žŠ¯%©×—‹ï)C;Céý\Û¹!õº$Îq}»Ã×&»Š*½Ô+Lÿj¯ÅbÁõõ5Ëå’ÉxÒ³mŒGêœ#„@UUö{Öë5?þd»ÝR×õo³[¦3¼tl[ªd°ác0|áex›D» äÉ †·Ïžþµ@c0þ™pժțW�H,ÅW‹J.m’H¨ òLÈŠQTq]�˜/f̯gÌSf‹1ãi�AV€ËÉhI®@@5¾2Ò^JG uÇÐ/ܺÆ)’v™ÇŸ)Dš )\$ÅTÈ'ŽQ•3”³1ãÙ˜ÉüÈt>b2Í9lÔ‡šêè 5„ªBÖhÉâ¿%ëŽWyÔÒêagÁÖ`0¾Ä|{fe«Í÷1Ô_$�ÎUÚªmoçh{whû û IDATÝÜܰ\.™ÏçŒÆ£hg˜È¼†üj¬ ×ë5«ÕŠÕýŠýnO]ûîü~%á0®ËðÁn\#`¿h@–ËÝr-ã6~FxÞfoh0¼áýö�åÃ[ †Ï½Öt¯ý¥¿kþ•M‹Q�×jÔ)’ ù¤`:Ÿ0[L¹º¹âêfÎìjÌd>¢˜äd#ÁŠJ�:O-¤Gœ¡iT[Ý"5U)Û}¤(!ƒ‡ª´)ýþZÚ=×id¸LpÎ1Ê2ŠI´\œ/§œsÛ+›#ûõŽÝúÀa{ä¸-ñ¥GÕ!•cNr2µÅÁ®‹<¸¢ÝJ[†+rÛ‡j0 Ÿ|¾í}’¯*!„!1ôêµyqÁ¾™eF£777|ÿþ�åbÁt:e4‘eÙ€ìRUêªb»ÛòóîŽûû{VëûÞº®)N<~¡Œ\0¼ü¾RDåï¥G6¿~!Cä,ÃVôé-iƒá áex3˜½¡Áð†÷›þ›·˜Å–_ ʶn2|¤á¨2$‡ö�H´/ x‚ �²‘#ŸäLæc7s7 ·W,n挦Å$Ãå Î£®&ðZ£â£²K£Â MÖ…�/TªDh²„’´ãà’]`Ÿì꬜ânû®£V·³SP‚—áÈȲQG>ÊЩ×؈ÉlÌx’SL òq†Ë…Ó¾¦:xBð^b“¤.‹½ë{ÂÅž-Ò… Ûµd0 _ YîÎÓ¿Â+NeúWI¯g󉤘8ií onn¸½½e~uÅx<&ϲ¶‡WcÍB ¬J¶ë www¬V+¶ÛÇãéŒÈ“Ö¾ñi¾Ë’dïÞZ™ô2|ýB†Èp �%ƒá·a„—á}Ù&†[7^ÿþú‡×g[~1¯î­ôí’>ýxnl% Îã© Ô¸ŒF“ù˜ùÍœùrÎÕÍóåœñ¬`4Íq„¬&8ŸÔ\5Aê¨ò"] ±FL7�$²«]œ iÿº¶?vNi®wÜ ·¤]!²zIwfš<<Žq.þe¡äSaâFä#ÇäjÂÕbÎþúÀö~ÇænÇa{ât¨ ¡î¬¢pˆd‰t©—Ë…^/7æË«�!ƒÁ`ø ± úc©vêã†Øê+¼Îûk½å$0ˆçyž3�¹ººâöö–ÛÛ[¦Ó)Y²2ì#„@]×GVë5ÿûßÿØl6”å‰ü`ƒ‰Á`0|ÜŌڦTƒá•`„—áÒï.‡¶] Ã+ß_úïÞR[~3¯–›$5|‘qL´0 @|«ÊÂ)Å´`v5âêfÎõ÷k7WÌ–3¦W\.HÿÎSÄMÄwý¿z–†4 )éb¯67’hˆTÑFQ5X½Æ]œ¨ž…ª†:Óפí¦‰ek8G†d.væaTŒg#æ (¯*®–3F“œ¢.ªÕN-UyK»E™Cž¢�>XœhUj¯:‡Š‘^_% X`ø‡WÛ"<è‹ÕWm5ÿVÕ¨^nÕ] ȯ7U«È0EÁt:e±Xp{{ËÍÍ “É—¬ ·¼*UYr8¸¿¿ç¿ÿþK„W‰÷�G¹. ÷ƒá#æ0–Ð  #¼ ›;Žá‹�ñ7ZHÙmt9¶|¤k¢|ÜÉ”^ÏŒ%» zMmÿ$RQÉ É”ñ¤ ˜M˜_O¸º�qµœqu=cr5¡˜8däQ§§¨x‚6$W$ÍÒ+" í Eäá˜�nÃAó5Ä'ŸõÈjÔ]‚àh4\-!v–‰ô(°VõIGæpàâù‹4â Àáò*Wä…0™�XM·l×'Ê] :Ö¨B–Ž*sY§�ëÞý¬c— ~û!nN»á ¶¾0.eœƒ9ËÉP¥ª­`ó½¢ïµ½iã<6�Y,ÜÜܰ\.™ÏçE1 îšsªëšãñÈv³a½Z±Z­8Žé<Á‰;;O¬'’Á`øá&ó‚ñ|DVä¸|ËŠ=§êÔow†¨à4¾¿Ó¡Ò«;1>È`ë ƒá3Ý’æ™3µ×¥¯'Dãñ˜årÉõõ5Ëå’ÙlFžçQ9ݳsà½çp8°ÙnY­×¬V+ŽÇ!Ä™KœtWR²Ùlfø\y²�×z‘$Úæá¶¢5^#¼ fqj‹R×Ó–S>a¬3¥×#Ë››þn°ÔË4ŠtwMï3Ñv¬6]²"ùûoI£iÁôª`ù}Îòûó›)³å„Ñ,'�fž ©GW²+¤µ*Œ *‘n§»ˆö”dÝ1¤ —Í:ôáèÑd+Õúöo4†º¯D8;’2Œ>ÙÕü¹&=Xè‘OÑâ05Ã! .ÚR9Ź8¦:æZ—¨Ëâ¨òÔ±­J&y\T«|èyÌö¹l}a0<'ûª®§zX5–†ï“o ó€,säyÆl6ãÛ·oÜÜÜ0�N)Šq®�ûPªªb·Û±^¯Ùl6ì÷{ªªj^ýƒ‘z†¯½~ø V 6| =ÒËÆ�ák%êýµîëÞ2Fx>Äï’m[”¾À˜VƆÏëLéu¶6°›ù Æœ>r±ÒEºþX½U›Jì¨åUQ©ÁÕ#a¶³ü6çæÿ,¹þ±`4ÏÈ')Ašþ\5O$�Ò»µoRAM[KÁ®—ÖÐܯ/Ëù±·7=[æYƒ6+‹$Ñè0N$ç5ºÎLQÿR$XNÒ5Q™"…2šç,óùhŒÁ#lîv”Õ�'„€J‘l¯2ßûïÆÇ‡,O4ØúÂ`ø¥› Uy=^õ‰¡î½�8Š¢àj~Õ^“É„,©¹Tqq�Ma]Ul·[V«»Ý–Ãá�¯ÞkÿJ�F˃ 6š_�ô2ëMà Ößû;ƒáÃÖh]ý_Fx>ÜÂÔ¥†OŸˆ /�uïñÆ¿�x؇e±æÍ®±´«zt½ê B*ˆ¼D# JpW@1É™- –?æÜüX°¸�1[ŽpAò€:�d—DÂKÅ3|‹¾ÄQÙ‘]g´–ô¾ê¹Ùˆ gg3ü[|–ÂÐ&QãÒè÷[Ñhq(Jh^?G‘åL]ÆÂ¼’Åâ_µ«ñ%xO�‡�áDz�üµa÷b²ë£ß“†bl:3üÛ÷€<«Ší+¼Þ…óÒ®¯X^äL§S‹ß¾}ãúúšÑhI.†j- �Ú{Ç#«ÕŠû»;v»¨îò>ôlm‘fxë!ý ¤—‘]†¯ºþ3.$ëúÊ/i„—ácŽu#½ Ã?ëÞ4?þŸúÏ“^xúR <=ë…Õ'ŸTpâz‹}!à êñÁS;�:… F³‚Åí„å·ßþï’›ïW³œ|*�4«A‰E0i­c«KŸ{׫KzôR´*”óá’H»¦°ø�ìhN:ˤªl-û°žÿÕ¥!Ú³NLÇD¸ô»t�2—q%s²Éˆ|”“ç›ÿöìžpòÔZ£!.D$Ù8öŽßІ†Ïb †vð·ý»ú›)+Àó^^oq·ôçÛAÎÙmx#æó9×7בðZ^3ˆHš»»ó¨C ,Kv»?ïîøïçOöû=Þ{TÀ¼“—ævF2^íüÒËÆ¡Á`ø—âå_¨=áeøP0ûƒÁð¯Åº7M$~5®Z þˆ«ç/õÑ´ü‰´î-É {li‘ð’hIèr!›dL#–?®¸ýqÅòÛœÙõ)@ E]Hª®I/ ‘ j),yHE5;Ízd×c÷Å%z«ë¿%�ÜL:|]áb–/ÉÖ°ÿ*Ú{‰–^“®Ç™öÄó¢ N‘LùdÔ)ÒT¨«š%¡¬Ñ:ý ‡K«k ‡ ƒá3̯ڑ^æ�†@úIp: ç„ñxÌÕÕËå‚årÉl>#ÏóVzÖ?f_×�GvÛ-÷÷÷¬V+ŽÇc´é=;·‡³ýåã0’ÁðÚ÷á‹I/=» ƒá_Â+/2�ð2|ì±~¾óÛ`0 WÿÕÏï ¯}µÿµé#×zzkê-â x~2Ñ$Vœ5 ‹«†/9"‡MìUPŠD…‘ìÒÌãòÀdž³ø6çæÇ’oÿçšérL>QÈ|"ºê–(k‡y"»†ÝLú¾…úøÍò‚„þ­JÙ,}ãÄ ;ô¥éTÖ�}Õ€'dEÆøjD–E˨òt øŠ#'N¾B¼¢©ßYìë%­úîKsº2 _2ã{Éü¥¯þþ-ÏöL7úÖÎp2ázyÍ÷ïß[ÂË9GÚ>Ï%uš�ÃáÀÏŸ?ùùó'ÛÝ–ÓédjÃÛÝYhod—Á`0ü=áeøT‰…g Ÿc >ìàb0X\5ž ›iñO¯o´ëÛåeRaÅYç¬úçÎH6Ì o4T †w�öXíþTA“j+ód#aº±ø6çêfÊl1b4q�Çþ^�º×ëK[;¿s2(¾Q›Q ŽækD^}tÑÁ•©'š 8ò±cz5FýœÃ~ÏñpbŽøªDƒ'h�¤ÿT/Ójç×îS«HåíÞGôS•™ÒË`xÛ[.YÒþz ü“»3͵òp^êOª�e9WWWÜÞÞ²X,˜L&EÑöÓìˆEU9�¬7Öë5«õŠÝnGUUQfÅðë¨÷Îu¬>f0 ƒxh„—áó&6©>zœý&Á†¶á-óƒá½aK|)‰¬J¸4YfJ>ɘß̸ù?Kæ7ŠY†!ÚâSϯæ¡Ýâ_{õ6¡íC5xÂâK>é¥lÎLs‰>¸ã£½aCª’gŒ¦fœn—Ô¥G½p:Ö„é%¸è“• ‹úèÌ%ý+l9›á‘Ɇ…Áð�æâžê+’d¯0'�M+Åô¥(r–Ë%?~ü`quŨ(pÎÅÙY‡3˜�ÃñÈjµbµZ±Ùl8øÚÛghx74yæ{(½¤GÛ¤j0þéXÜí�5ÂËðI“ lR7|ÂûkkÎ6X ÿÕD׈¢¢�v†’+Å$c<1_N¹º™1™�ÈÆY�O6†ɲ�RFÏÃqóM¤Ð@c6ø×‡›N¤çÌøìÔÓW¸�)9[’!õô’€âqNÈF„‚ÙbF]zÊCÍ~{¤òõõÅ¡¸´‹^xH«‰ål†—çH–ë o4¿>­~jçNýûý½4‘k"BžeŒÇc–Ë%ß¿g~uE^8w~ ‚†@]×ì÷{V«ëõšÝnÇéTâC0+Cû.÷ßEé¥gÇ`¹–Á`øg“�.áeøÉ…y&¾j¼–‡I¬Á`0|ÍX'3ÖLÁ)ùØ1[ŽYÜΘ]O™\�ÈÆ²€ºâ[Â+Ì_/Òõµ^g9ó‡Êz^ZËëSO­7ü­´Ê6"épà„ÑtÄ|1ç°<²ß8ø§ºN6“4•ME^ÜËËr6ƒÁ`ø×'üFõ­ ³,g2™°X,ÚÞ]³é”<ÏÎ+¢x(Ë’ívËÝ]ìÝu<žðÞGEZæ¬>ò›«FµÝ¯týß.×¹”îZ®e0þÉØ{!áeøÜÉÄ3Ù`ø[ëB1¥—Á`ø7b]3«kRxá"J1É™_OYÜΙ-&Œfn¤à<ÿŸ½7]o\×µvH5îíd®ýÝÿÝ�gï5+qou$ÎR�'•T¥Ïxëq9qlI–(‚Ä 5Qì=Sƒž7(¸…¯t"W_Ñ«g@áCT�Jˆ¨³Ù(…xÁä0Át‚¯<š²Aã¼@ ÀÇM·¢—pÌF!ŸÑÎF‘éQCø†¯MqØK’XLÆÌçs¬V+¬–KŒ'Xc "ðÞŒ1ð^Ñ8‡¢(°Ûípww‡ív‹² ‚—µ6¤A|ì{þÿˆü±}ýqµ$ßpìõ.c�+‹b囌a !äoûC€‚ùFƒ †o“oÛ?#åϰùÿôÛ@¯œ“Ï8"„ oŒa:A�06d“ÓùÓÅÙ8�I1*.Š5>ÖѰHàAªÂk÷Ýã¾ïâ(�‹~ð�¸×Õàjg ª"&1HG)&³1«9\éP+¸Úêç Hþ¨Çå˜�B޲¹í¤z^WK¡]ÊÃöù­è}�É�Î0M3,– ÜÞÞb±X`:�"MÓ˜Ú=F#Kø>PEÅ®õz�_ÿþÂ~¿‡÷.F?k°-ôö“Ï2×Óœ�rœEùêüe­_ ^äû (@ ùÆ}ý3Ú5ë~�Ÿ‹aýšï`° ùÞw¬Á …ƒÓÖ(l.È')&ó1¦ó1ÒQIBºC•^ì‚( rV�ëRì:_; ûŒo>F’Aç(gÑX¡–—B âãa$�‹ñt¿r¨N%›=ê¢ µ¼¼á«Ì¢3RâµTŽÙ!äÃ:þV$:«i¥½ØÕFZ½—!l#®.#¯ò<Ãr¹Äíí-–‹&Qð?¼ŒUe‰ív¯» x9××îú©‘]äóŽ¿ä£€B¾¨{@þ²+c’còýç’Ÿlø©‹Ͼ7ù„|1ûW–«‡J¨ÍeÒ v�§9F³Ù8…Íd vi|pÞÿœï/*gRW�¸t ¶µ¼âù5In1š�1ž�Ã5¥€Uxm pQ ô¢ÙËηðº�>n!äíûþ^ôÒ =μˆ`“ïÁ1Jƒˆe­E–e]ý®ñd‚4Ma­í"Ô¬µ0"€œw8�Øn·Øïv8�¨ëˆÑb´ö?Pž?B!>9xkÎ/ò�ÆhýýÁUÃä'Û‡\÷K9×%äkÞ»ÚGwµi “,Áh’a4Ë1šdÈÆ �úP·K¢8ÓòÆîXIôš}<\›ÊÊÁ‹�`3ƒÑ$Çx:Âx:By¨Pž*8uð1¥¤t±sú`\ö»H/Ž×ÈO·ò¶÷–>(ëÕT¾zöŒ×4«CcÐfÐ�‚Vžç˜ÏçX,�F]® q™.-£ª¢iN§#¶Û ‡#ª²‚s®Û^?žxF.xòèµz0Nx¤ÍB!¯?py½ÙDåyuJ9%_hœ»l¸ä'Op�·˜³~R›Ø?óžÿ~ö«!ò‚sÅ.ï¡^’é(Ád>Âd6B:JaSoÜYDÑ0NHßœ4¤ßÓxñDײ=É UiÓ:@ÆZ˜Ì g˜Ì'(%Ž»jÛ@5T[3jâöqV4¸†�¥ä½(*&B·$yûq ëÆ‘o9Þx† “A¬x~}. q×otªÖZŒF#Ìf3¬V+,—Ë x 11ÙÁË{ïʲÄn·ÇýýûÃu]Ã;ߥp &^ñWr—„sF�‡ç„BÈÇ e^k¸ž´�ÇRIp^@¾ò�ÂÉ-ùÑó÷°bšb×7í¿¿p»¥Ýùó»8Dw9ˆQ˜D��3ÌSLæ“X»KBD\7rÕxók/¯@.N¾ˆlÄ«ß~ôKm=r|üî¾¼` Ldã³E¼¶›Êc u çÃ2< ‰Š…t«Ã¯ŠYr©hE¯x.Då}&ßbÜr&¾²&ßh¼q­v#—) ?,]Ý0s¢†Å*išb>Ÿãææ···X­V�F0Öt╉‚—sU]ãxÔ3íºkÑoùÁž%Þ ú’kóïÙrÜÂyùã�_g�2pùô¡]I+ ާMe¸\.±X,0›Î�eY—°ý!2YQ•%އ6› Öë5ŽÇ#œó±ö' oÙi¼äcŒ„"Ÿ£[£�#„üxXËü ÿÁÅŠ7B!Ÿ°¿þ&>Ú�—OÏ[±KÅG±Ë"ŸdÈÆ’<ÎÄ.�. zÑpX»ãeg¾–î§öœ†s.FaSA:J‘�ã5¥ð*Ð&¦¡„‡Ââ< à÷©&Ék÷=t¶²&?i¼q­}Ÿ}·|Ïóèç×µX¢€Çãq'vM&dY kmÿö�‚Õ4 ŽÇ#¶»¶Û-¶Û-Ê¢„ïRëYäòõ(î÷»Ï�c_MÞbLÇ… „ àE¾ÿ¤ƒo4þ„òygiß ›¦‹ÿO.|¨É¥�à•"ŸäQ\Ia3X…‡ëÄ•¾Áèõ†DžuæõÚ«¢ñzH'|™Ä ÍSdã ù$G6.PÕ�(¼*ÚÊ_Ò ¶x'öÏ„ã��hßmÜFy=Çt"‘¾Ý "ˆXk1O°Z®°\.0�‘¢»ÚcoE¯¦ip8±Ùl°Ýn±ßïQVe%ì?YJ¢g £ÁÈG¶?BùîPð"?Êö3Eç3æF!¤Ï›äÈFl*ÛÖíj‚Ø%×ªÏÆôy<ß/8ÿ׬\œàa¬Aš'�3Œ'#Œ&%\Y¢>ÕP¯¡ŽŠ^ó”Êo÷JûgBÞbæÛÖSŒñ»ªR¶ …[Ñ«ûýµo7¬|š&HÓÓÙ7·7X.Cí.km—¾P¢ð¥ªðÞ£,Kl·[¬×kö”e çÜyM²‹ûùKD»¾RíÆö:^Öl#?oLÇÈeBûà ^äÇ ùÁyíó::!äu�¹>�iÅ4Š^0 ±„•I¨eRÒЇª Ï]�©sÁ‹b×ó&O-à—˜ï­‹Ö’àü4°’ ‹‚×xR¢<8ÀÖ�Sr˜jòáè‹baÿLÈ{µmé×5ÑKõìñúsËÖF(ŒÉ�e¦Ó)non±\.‘ç9Œ1g·¤ˆÀ{犢µ»îרö¨ªjÕ%]íÉË:a_"‚J^k3ìÐ~úØŽM€¾ð¼?4<%„�ãnú¥!„¼Ë 4¬úV Ñ]6 ‘Dù(E’Yˆ :Hg¨W¢»ZÿçûϰñÏ|—B¡êááàÅÆÃ$¡–Wˆ¾³€•.BÏîŠâ¬¨ ¯ !„¼cO/]ZÀazÀÇŒq' µé _y.ØF åyŽÅb�Õj…ÕÍ óÙ I’Ä4,ñXãgºÚ]Û-îïï±^¯Q†‡×j^múF9ó"äGŒ¥ !„>…‡¶Ÿ^„%/() IDAT�«óFzBys›£èêp™HRƒ4³HG ’Ô@ÌyÊÃ^&k·1»ºUݬŠñ·Ó†PûÔÃCbŽ#Æi– ¥°©�t×§¿6O¥5$„òæöUð{¡ ƒ4†m„WŸpøu­JLU8�±Z®pssƒÕj…élkmø{kÇã1×u…Ã᯻;¬×k”euÍÝŠ\׿­B!?döúp@Á‹òp’Ä9!„�·Œ¶é ‡1^âa­ ÉB„W–§½à£ºT>¦?Ú)%•—Xx‘ÇVï_œEi Al Q^@Ò] cÞ´Wvðèœ�òpúÈþ!„¼NO?»®Š^%0ß:­¡1Ib1�¶µ»–˜Íf]:ÃË=ª*ʲÂn·Ãz½Æz³Án¿CU•¸zx¿ùŠ„BùŽ~…ÇǼ!œ òƒ¡ÀMÞÝÂhkiÂÃâ0IˆîʲyÞGx…”†¾•½¢íúÃ{^º¨ºÓ>�a{½†) ÑExeȲIbÐ/m C}8˜�k½!„�wéï놻,†ú¨à%¯`gEÖZäyŽù|Žþù«Õ ãñišvû“ÁþT=ÊAí®Ýn‡ãñˆº®¡êÃ7“G†œÑB!?ųðèÔ’‚!„òÓ „|X›Sk-’Ô"ÉÂÃ&0*½8Ö&\t%?"Q^£î1…á@ðŠÿ{ñ€ØÔ"ÍR$i›xþ6Ɇ×YÎ7~~õyÙ!ä•û÷¶——A}+y¼ßöÉ—áS¯�â¾¼Fùóù777˜ÏfȲ ÖZxïÛ7¼÷pÎáx:a½^ã~}�ýn�¢(Ð4MHx%‚˜ÉŒ !„�ïã'�ç¼ï‰7žNB!äg&ºx :�ÉGÑŠY¢�(¦ØÔ I ŒÄ ¤à‹íôzSe~ýk2œL(¼Dg¢ÆØÄÂZk-ÄH×›ˆhŸcòA®Éþ•^좋’B^¹¿–ëW^'bë¥c�ç9¦³)–Ënnn0™NC*Ã+ù �s(Ëûý¿~ýÂýý=N§S»¼F)Oδo‘†‘B!ï=€ÁÅʇt~¬ß i(xB!?Š]äãÛ`/”˜�àe�±±ÞTü»DÁE䡳‹ ù•ggWHøi/c Lba1Ò X]lWçlÕ+Û–óKG!äM{ò�ăQ>Âl6Çb±Àj¹Äx<>¼ZË ªhšEQ`»Û� ^Î9xÕ_Œ‘]„BÈ÷Àè3Þó;˜Ò�BùAœ­˜¡F@>I›‘9d Œ " B´Q¬¥Ð«¥§4ŽŠÛÚTúã+ÓÉŸÏ ¼÷Gžç�ÀÕ¦\Tê}ݵÝlp�Ýn‡²ªà½ïk|A!*»!„�o:�},xû¹)ñ)xB!? Š]ä3bLŒ²1éêBÅ(/<\É­:ÈsØ5ìŸ.vÉ+vç/Älb!ÖB�ïê«E�¹˜�°^!„|Ý�£†ÿž!¢ÉY=Hk-¦Ó)nno°X.1›Í�çy¹¢à%ƒú]EQ`·Ûa»Ù`½Þ`·Û¡®«>l zB!äûNkÿÆÒ3¥!!„òN;ú >dŠ~¶_:žÙ~>” ÑJ¬�±6¤Ë3-·�ô’þtt*)oxcËà\ëÙÉ7V`­�˜>ñáƒÚ€Åè¢$„�7çé«nS{±ëZ'~u§!²+˜vƒ,˰X,p{{‹ùl†,ËBýÇ(tubWLgx<±^¯±Ýîp:�P×5TFÌ‡Ô #„BÈ׃‚!„òN¨|¬³÷9Å= ÛÏ;´Bôß$ª""jC‰10"YŽúè®G›.Ûôàܾ.2ØfÕ‚ø(&ÔYƒT^ôLTWy¨ré›)!„}áX¡‹–Rí"¨nS¯Ú\UÅð_×Ï«Âû÷kl¼æó9nnn0™N‘$Iˆè6æ\ôòMÓàt:a³Ù`·ß¡, ¸Æ@÷~B!„�ßÁ”†„BÈ{3®½·Ã÷�ÒêûžòyÛÏ+µÀG^Õ(x ÄÆú]QðêþŠtuu¤ qÕ–„¿Ë Éû7ß/q®Ïï²kÅÐäÉO ×DbbSz>Öòº¼ryµ»Ä“¼ï !䑞ù;Héj'¾^´0l;öçC‘L¤ïíUaŒÁh4Â|>ÇjµÂÍÍ Æãñ™pÕ¾ßG±«,Kìv;ÜÝÝa»Ý¢jkwaÆbB!„< ^„BÈ;£1i¡ßCèT`ûyõ¶§€^¬íV£‹‘îƒNÌ YÚ \b¾ä‰öý3}cOÉHñoúTå½zB‡®I‰~G1€1Aøêã¿ ñ:[ø`FBý®år‰›Õ &“)Ò4…1f)&�˜b·i�G¬7kl6[ìv;eï{AME¾`NgB!„|¼!„BÇ"ù¨–wömZCYëÂÁõ„¸òtR>òl4Öb�F'éå5‰g{°â^.ÞIÈ_7CFzòêæV¢½Vƒ+¼¦¸Ì«nETºƒ¸xV¢›$HÓ³Ù77·XÝÜ`<šÀÛo'Öäò^á}¨ßµÝnqww‡Ý~‡²*áœCA&¦¯!É@/B!„ü ^„Bȇ‘]äs´Ã�TÒ…xɹÀ%m-¯ÇZ¬rí÷+0Œ©»¸JáÑúDcÚÉ�Ú\xO^¿-2Ò‹�?³©�‹:]½Øuv�©v�ö� …ˆé>ïûî¾·ÁmJÛ.z,,‘°6Åh4Æl¯››[ŒF#ˆ\æ)Võh‡¢(°Ýnñë×/ì÷{TUï|'t�Œ×”B!ÏÃðB!?:É'h…¡>x â…T ¿•e/"’¿B‡²×@芧X½Â»è$Õó5ÿ„¼jSä) ä¥Vµë¾ŸScq(võŸ—ÁK}çßGX lƒÄO �eæ³9–«%V«æó9Ò,ë�LFBÚCïeY`¿Ûc½^c½^ãx<Â{�þ+D1�¡]„By&¼!„�JÙE'5ù4 ….E/„=ëƒ]ã¯ÞKàÜéÙ_õ õð¾�ö"ä�Z!!äOo ù­ù좼bm-Äè.íþ»øø‚âJ¢ÛX+,ÏsÌs¬V+, L§¡~×ù! Ĩ*N§ÛÝ›Íëû5ŠSÑE�‰„ÔºÁÞPô"„BÈó`JCB!ä'BŸù¨¦wæ°jÕ�:^¡¾�>”èt„¤JòDcf£~­¾Aht’jëÿÔV× ŽGç<\ã¡N»š_Å Bù<šù·ï¯;‘ë‘Ï‹ T4Øà<�¡„´†Š>µ­1ãñ777X­V˜L§ÈóÖ˜®gû9àšÇãÛí»ÝûÃeUP3LǨ4ó„By6¼!„BÈÇÐú°< Î÷ŠGˆôj#¾d¸ž¼wÖQìz‚ÚÎp\Ò¯Ú_†Ôåá�ƒk¼×.¯­ëB!äƒûñ‹^çfWÏSÔ^Ôc죶b%0Qˆ‘NÔ’A?ïc�/c ¬µ˜N¦øçŸp{{‹ñhkí™È6~¯›ûý›Í»ÝEq‚s D T}ÌñøX¥“�+C6žÂöCÈ(xB!„�w¡M›ÔýÞþàÞù   D/1ƒÚ]]N½K§jo9òbë"U¨z8§pM¼^.ªajB,mWýs"M!Ö�_欖eŒýùPDÒádðFh½ Œ µ·ÂÆ[ÑÌCXk‘g9f³non±X,�å9̅ب*¼÷¨ª Ûíëõ‡ÃUUÁ9ß&}ªE¦2$äú¸š§àË�«Ù~yXËB!„|ØTKUàp�GS5QD‰© U ñÁYÙ]!Õ®D—ú t5�CS;4µ‚—zVÃÏÂ䆄òîÈEÿ+òxÜ&4|((µªXHa f�ưM`«1XÈò ³ù Ëå«›f³kûˆ²p0Áïë=êºÆñxÄz½Æýý=N§¼÷ݱ Å.}v=OB~Êè¹p¸õE®™ ®Û!o/B!„òþ“­Ö‰…�ÒÐÕAðjêæ,U0»8+û�Éy<ÿÞ#DâE±+^áºQR.~~lŠM!äMˆëº:[ƒ×®¾]Ù„œGe‹HirÞ¯‹F£‹–«%–Ë%¦Ó)l’œÙú°!�seYâp8`}¿ÆúþEQÀ9wVW¬ß¿vi„�~DÅañ×W³ýò>0¥!!„ByZç›¶µB`‚MCJÃVìr�GâFMœ” kx…U圣½ÂD·¿2ÝÿÚ^ È™“RÒKµ^®ñð�B= °1�ÁZºà,}jϼ‚äƒo6Aò™ì#^_Ï ©å7·ÂyÚ@iÕ®ø7¯mºÚA*ĸ~AÄ IL'Sܬn°X,0�N‘ç9Œ1èBÀÚý©¢¬*ì¶[¬ïï±^¯±ÝíP–exëÐ<èùwá=K¾ã8ìOÌÅŠ/|Ý?AzC¶ò àE!„BÞ�3Ñ+Ö\¼šºAÓx¤Þ¶rÚ¨¡èŽƒœ¹ X)ê%ÜÇc¬äìu�u[ºs¬1/Fx¹:^ðíªƒ³0ºpô‘£ál›|TGÄS@>_ÿüší;¤|Æ~‡iü-¤²UÛWúj�ˆvµ½I’`2�`u³Âr±Äd2A–e0ƒzŽÃ�–e‰Ív‹ûõëõ»ÝUU¡«$¦çãB¾ëxì²L-ù!ן]!o/B!„òNô‘Da±v´T Nᇦrpu߈ö`*D/iÝgÃgòܳ¯�\“³‰øÙŸ£ˆ¥¢ð*‡ªŠõ»:ÁËǤ?ÿTJCÎôÉó®†þ›–Þ‚ ;ÂÏkªOwÇø_VGQ£Êtå³Ú`2X¿0Ì2l�A–f˜N§X-—˜ÍCtW’$P¯1=bƼ*¼÷(Šë(v�TU ×4PÕs‘Kpáæ]üŸò¼êû�BÈC(xB!„¼Õ¬–“Ù3‚&E¯¸´5Dy¨WøÚÇZ^Þ) &¼O< >¾·MÂ瞎""¿¹"gϽ³_í/ÃT’¨k‡ºlàju´�¦­:�ðX¿‹üUw*×k ýI·Ì~™´"êgi —íò<ÂöÏ»÷¿Š�tb¢èÕVÓB'Œ ¬µH³ÓÉËÕ Óé Y–ÁZ ×Ù~‰yn�s(N'l6l6œŠš¦�ó~ ¸ÉÙ¸¡7+\äòÒ†E±êsNh‡!ämIäAÏ{}LùY«½A¾Úud[%?µm|žYí¸`úÜcï�fˆ[ N,ëCU ꢆ«³>]ž†úPª:Xí}á%CG˜|“ ÿúw¾œ¥Ï‘Á¡ö!4k®®Q|øFQ—5Ê¢BS{¨‘_€ÁY.ªöHûÚyÝ5öAäÅwÕ_úºéd$�/kR¯Ù|~é¡ð}^ÍDEûz¶–!öáª]Ý/ƒ<Ë0›N±\.p{{ƒùl†4I`ð�°Î5 ª²Ä~¿ÇýÝ6ë5Šâçš>Œ-“|÷á?9!„¼9 û[BÈ#ó?ö „m•�¿lŸ¯9sþ¬ùÞu1øûyf¢X› UÀ;W£TªàÛ´†"ªþBO9�(ÒaÚ¥OÑ;}ÞÖÙ¡ t*^°ð‚‰õÓà_{”§å©BS9¨5l2upyôjã`Mþª+ü›[‹��üE{z‹æó”ûÒÈÑß×ìRÄÔÀ¿Ù¶Æ>\(L—j0Æx©‡z# &ãnVKüçŸ[ü¿ÿü‹ù Ib²6b+<7u…Óñ€ív�_¿þÅúþÅé߸.í!D¸��|í~åáð—vˆBÞ™D”CBÇb„m•�ÏÜ.ωÏ7«—¼¿O›'}J)EHiØ8ÔU�òT¢*¸°Þ@Ä@4ˆ/þ¬Â·ö?v�_ò ÎÓg®/6Œ²C—Bê�Ø¥m¢Â¹å õ»NÊS×(àMH; ¶;8÷*L5IhøÉ7jO¯Ø•é´åVÌzÎû~ÿ&�¶¢· �LÖ~ÁZjw­VX.—˜Ïç�G°ÆtïéLµzTU‰Ãa�Ýv‹ÍúûÝuU…ýźžÁüÐn�¯ #Š !äc1<„B!ŸŸ�^îÏÕ?¹LYËڢƣ.œŽeˆ"*´iÅã� 0¨+ÕoZþ¾æÉ«^-à³y;ô‰×Û‡:|µM9Ù(š²AUÔ(NáÚ¸Új/®ËóöG!?•¶¿}˨m�üyý.míûyZÃ.zWÆXØ$Až�°X,p{{‹étŠ$±Ý~µ­ÓV4Îá4¨ÝµÛíp*Š�ÊÐDL?NÐþDéàA«B!„�ç�p6J!„ò¹9‹•ù ‘^/�ìê¾Gÿ‰P�+¾Ú:´š�Ò°8(OêÒ!«ÆšXÄCàã!xô2�ôÛ”ÏtÕ>O¤—>ãxÁÑéu Lzé„ÈòT¢8–(‹®1½Ø%½©ÏnÍ„òÃ�ú'Þ~ü+–©„ôƒÖb4a¹\àŸn1�N`m2H}ØŠ]áwç�'¬×kl6[ì÷{”eï=Œ˜ c¥4„BùcÌó&À„B!䣑/{ÔKÑwòH\ê.–�7•CqªPK§uÙN``aÐFÉÅÊomÝk¼bO 8�.8{³À„t…^/h*‡òX¢Ø—¨N5š²�:�çÛ ­öÒG,È•=_¾No&!äçð‘]gÖçE^Wê- ººZÆ„‡ðÞCŒ`4a±˜ãææ··ÿ`2™ÂZs±Íp Þ{Ôu�Ãa�»»{l·[”E‰¦iàS°‹–‚B!/Å„4 Ê^„B!Ÿ›¯;Z»½ÂØ3¼ÒŠ]A\qµCu*ƒÀr µ¼Ô!Š]&Š]Ò)5] «Ü?¿]ˆ\C±+üÑQôR4¥Cq(P T§ ®rP�þz´ò¥H¼ªÏi „ò³ì·~±®¯½LˆÂÀkˆÈ�ÇX̸¹¹‰) '°6¤4TÕP–+Ö†tΡªjì÷{ÜÝÝa»Ý¢(K8çú:’—ûÖ>�3-!„B^kxB!„�w&¤:j¥#�zES;TE…Óþ„òXÀÅ:^P‰�³z�¿Œ¢×Ógý©×£ØëqØ x5QðÚ—(%\åà�~ ]©Äš+�‰Y×£ü!ä'ðÞ–I䢦eŒ„~ôøù›* ^¡ê¡1"[ H³³Ù Ëå‹Å³ÙY–E±«=tâWUU8öØl6¸»»Ã~¿CÓ4h³K; øûE!„r /B!„ò®´‘]�Þ1g¤M¥øÚ£**‡#ÊS ßø˜b/F�Ey ”bʳÐg\�� ƒ¢Áë¢îšÊA[ÁKC·êE•—+{ o{})øBû*]—Û¦5lû†«ÂV|éÁߢHæU¡^á}¨Ÿ)Æ Ë2Ìç3,WKÌf3ŒÇc¤i:ø`,ªŠ¢(°Ýn±^¯£àµ‡s®K™ˆK�nø}éE!„�’œ h>iõB!„òÝЮ”—�PxxçQ5Žû#ÆûªS…|’ ÆBÔCÔ…-œ \ŒòúÝYG—þQý ûN¼20j *pµ¢)=ªS…òX¡>5ÐFC”LpTêy¢Jy¸3<¬Ýõü—l’„�÷Bð ºë©¾IÛÜÀ¸â RíjdÂ̓<ϱX,°Z­0�N‘¥Y—ΰ3.1»i‡#6ë ¶Û‡ʲ‚z¶7šˆ+ÆA(éB!ä™$ç£ ®�!„B!o‡¶ÉÑV‚Òø ¨ê¢Â~+È'9»#²qŠT,lb:aF 1½¡ï3òõ#[òèÙïhå§ zµb—œ ©ÇÅ¡By¬Q—p«¦»ZíJ‡i { ìI¥jï ýÆ'›nZBÈ»"cL× ·ýÐ0â+YA+˜ã˜Š°ÿ½�ôRÖŒµ�Æ¡v×Í-&“ l’@ÄÄ] Œ‰ûQ�º®°Ûíðë×/ìv[”EÒFìϰ�¼¾[¹ …|•Û�-•B>3B(ý„B!äœís[¿Ã„,4µCy,pÜqÜpÚŸP— àð±–Wë-ë“$’ߢgסO$*w‰H[»«hPì ‡ Õ©�«â ,,Œ˜6PÏvfƒ‡^™kè÷>Õ»!ïnc»@+¹ÚÑ^ZKÕ> a�%�.å`l�Ežg˜N§X.WX®V�ưÖ˜þý­ØæœCUVØïv¸_ßc¿? ®kxïq–AQ¯ .r6z ä+Œ²!„| O!„By/.3Ê`ý•Àx  õ®ö(�%v›=Òq“d£°1m-/„H¡(¦ˆÐÙðÔ¹×�À%q]½¨¡+>´\éQ*ì×w꓃¯F-D’Nð:ßþÀ¹z¶Ä9Æ�‰^Ǿ °!_¥¿—¾§Ç•HÚ.ÚKûh¯3S#Äò]H³ ³Ù «Õ77+, äyÞ‰]C ï½¢ªjOGìö;l·[Å Î9¨÷è/…Jo0äiFÈg"ôÏÔf !äC¡àE!„B>ˆ^ ¨…£Î{øÚ£:ÖØoHGù4Çx:‚MIc)ÈYI(úçM]¨"]Í®öÌ…ø.u_{Ô§§}�ýæˆbW¢)=ÐÄX$!ì,}áE5–©#¢×=y»!_²¶QZ"Wï"¢º†Ýsûúà"ÑN˜‘•çæó–Ë%–Ë%æóò<ë"»†ûöÞ¡,K�Gì¶;l6[�'8ïÉn£È¥íÔUFÈgQì"„��‡‚!„BywbI—íN$�…Ây ©§}�4O1™�0žŒ�ORdÖÂÀ@EÃjqÕ³…ì�ûÇôwGõ-è®þ4Gg¦.D/£â-Ô)êc�Ó®ÀqsÂq{Bujצ;ìÓNž×ëº<»zq®‡Õž¾:„BþÆÒ Œ´µ.ÃCcÿÛÖÚ¤5›1Ê P=7 ­(&ØÄ`2™`µZáfuƒÙt†<ÁÚ¤M€ìJŒÖªë‡Ãëõw÷wXßßãt:¹.lõ5¢P•G,íùœc­Áp–BÈ'€‚!„By¬ÜÖþÉk¬"VR¨†”H®ö8íK˜Ä`:Ÿb2ÃAžÛà¸ß‹:KÛËSGñ3ÎuûÜž íR[µbWˆÒ ) C]®6ª®»Ž»Ü €KaÕBÔ¢«ï#ôƒô’g\1Öeô!„�7A$FY‰i B¦Œ&^!AS…�öÔXƒÄ&˜Œ'¸½¹ÁjµÂd:�Ñ]¦-ÆÙÕîRêºÆn·Çýý}÷8¼w1ë­û˜‹m”B> ¼!„BÈˈK¯‡±;ºm….´°°Ý ¤Îó®AS6±žÔY–ÂZA>J‘@`Ò°ºÜÃAÕCPø>¥ÞÙ‚õvµú_ù§¾8×VëYú˜ÂP,ÄÑK�ÀWÚ‰]Ûû=N»Má �…õÛE ´WKõB^IgH!äÏ îozZéúþ^Üê­ˆuñAmWŠ\I)èÑ×ö²’ IL¦SÜÜÞb±\"ϳ(pµ© £•U@Õ£,Kl·ÜßÝc·Ýát:¡iš6”ûú7yäkö‹6ÈK›Ž¨0ï{ݦ„B> ¼!„BÈ‹Ñèƒ{éÿ�ôÓõ.=ÓI^ Ô{¸:1»õbù(Át6†± ’$ +Ù5Æu;ˆ �T£³¬­¢xbmù׺mº)9¯£%Ñ+|ï>ý`ûS[+M`!jàœG]8û »Í Û»=Nû®R'0jaÐGwõûê¯(]j„òš ûv}†m�}³„”†f z�ÕìB¿&D[Ûxeó^ÃâA’¤1¥á ‹%Ò4‹Ûí2 C$ˆ]ÎÁk³ÙâîþûýeYË.æ¡Þ¥í¢ ½>Ö }ù«&$*Ϭ±^%!ãBˆ* IDATß¼K�×hÙo�O/B!„ò§³¦§e?õ‘«®­ðZ+Ì D|ãP*{ÄvzÀh<ÂcŒM†D,ŒELoØÄcò*rÃEì2øÿýNÔ+Î*»ÿ{¡©“ðTp^†¥=Ÿ}*ã/x�6@}r8l lïد�8î Ô…ƒ6h[·+FvÉP2lÅJý³ïÌUÑ„2èׇ=+zÅç�ðÓÚ,;h£­BJC�Ê’Êå2=ûÕ³$‚�}‰ÑXyžc>›c¹Xbµ\a6›!KÓδbš*Ð4UUb¿ßc½¾Çz½Æ©8ñ €š+¿ÝÀ@~sVÈ›A„§œö6$ä3AÁ‹B!„ü1ú‚IÎc•œ†5·ZÑK`a$J)¢P4hJ�ã®Äú×bCí.›¦06…1"à.ªhH΄‡eïåÍç€ø‹9 <òjç\l_Ñsìá÷êE/‰`¨á%ÐFàKE¹¯°þµÅýÿm°»ß£Ü×ÐÆÀh£Àΰre_2t»ÊïÏ,Å.BÈ�áéZ†zí½:¨¹¥€ÊËk`ú°LD uc½®.¸§¿êÛt…~ v)E)‘6%®À‹ÉdŠÛÛ[ÜÞþƒÕê³ÙišÃ ï}ÿTQ×öûCˆîº»Ãz}�²*!V_R~WyÄV*=©ä+ †ßnLó9 }CùiPð"„B!;¶Cà±êYÒ½%DwA|¬• ÀAÐ4ª“Ã~{ �$ òÑb,2±°&�ˆ‡‰Y�ºü`ã½H£q^ú_çy_Yþâ³×ŽEÑ&¼þw9[)ßþo`¢ÈÅ./€4…C¹¯±_±ùµÅæ×§]‰¦ô!�a›öm˜¡ëEùÆ�‡•÷!„``ƒD5£zùÞ.}lŒãÕAŠ¿n¥ÃE®îcæÁˆÞ*b•®ÁbˆB´íÃb lÒ×îZ®Bt×x4†µ½]è�YQ•öû=6›5Öë v»êºöCôÂñþ !m­H:ìÉ'¼¥ßbàxÖü_!ýoBÈ„‚!„By†u¿[ ÛË4¡’—``¡,Î;Ô§;‘¤)lšÂ9�™c„’Iœ šñ¥ý wœû»ÄP5î³H5—çéµ_»Luî†l£³DMLe(€¸Úã¸+°þïëÿn±ùw‹ãö_*¬&0��HLgxq¥!„üŽ×ë/e(^ÀV?ˆQˆ(Œ *ˆV,°Õ.•�îá8„ ˜#ªÑÕÿ²Èó óÙ77+,æ3Œò Öš�6Qµ‹ 6´*+ì6lÖì÷;œN'4uƒÇ«t=ó;«0J…|®1mÛžå t?¼uÈ[ß „|2(xB!„�w�x_ Nç–óI:L¿*]ê�úÔ ª Xka¬…Ba�µc$ƒÄ&P ÖC·Ã>šK/êˆit¦ &n¢ŸRôÒ‹ši×Ò3ÊE-”NìÒX‡Ë¸JÑœì×Üÿßëÿn±¿ß£Ü7°È`‘té ®¬äÿÝ�B‰}°>Kî‘G;ÖþYЧ é ƒÈºüøs¬a)Ú¦)lÅ®øž�à%mt4FV#nO`­Åh”a6Ÿáæf…ù|Š,Ka�é Rƒ¦€wEQ`³Ù`³^c¿Û£( ¨ú¿÷¹w¹�éY%ŸkLKïvÍäóAÁ‹B!„|ÀäHbDÕS2JŸ�)$å â–ªÂ{EutØü»‡jpöyï0óc“I$105NB=0 ]—Ûé3:¬îÕº&¯%;ü3^¾*}˜"êI? Ž¿¯ÕE¼¸ü?ˆ]¾šÊ£Ø–8l ¬ÿwƒÍ¿;6\©oâ™¶ˆqa0x^ ú}!ä±þ1Ú}ÎbŠkµº<äÌ*F;¦¢.ÄE pPm ZC5�aJÌ`»@¨C¨zÙh ÚÀû`C›"ËsL¦cÌ3,W LÆcX#ásqa…‰‹+ê¦AY•Øow¸û÷ëû5Ê¢€º�VXÔ\Yéò<«A?*ùLtÒ1=„ ¦uí|D_¥îÜÛϵÈw‡‚!„ByïiÑ£µ¼†ïéÿï%ÓÏlB¤WYÁ¹"Áùg‹l”çb$Fz9(…jÀvQV QèjE.¨ƒ�U"‰­ Í,f³1‹)–ËFãÆhÜG\!€Â55ÊS�Ýv‹_¿~Á«,¡>D‹Ñëåù‚Ï£± ùx¾DCB>ÈÐÉÝ‚^p# àE!„B>pb„AоÇ�Z­øe`b5/p^á�Gu¨±½Ûð +ÞG³ù,R± Œx8ˆz@<~°}E�‰tP¿ëá”éqñK9ê¿™võÏDÏ#¾ ÚpÅפ÷Àhp�Šˆ�Qoá� )Ûûõ ›ÿî°þïÇMWÒ$5ƒ†æ,�¡Èó�zx¨„B^Ö##ŽûßbÚÁ.²+¤" BUû^ƒZËø0H= &öéÒ.ïðhP£A‡ 4(Ñh /cÙÄbºš`¶cº#'€Q8m‚…Ó ”U‰Ý~‹Íf�ûû;lw[Ôu„9ùs›pYó“v…|�»˜BÈGBÁ‹B!„|Úë:ýkÀyʾø¿�†´N±8—ªÂ•»»=ª²€úÞ5XýÏ 6I‘ÀÂÀ&Fp‰ kìÃòx ‹À’X·Kû?u‘UÅ«Gä8y«âUíɸútø�NÞDÀ·©êeÙuÀý·Øþ»ÃþnW(¤I‚¼¥Q(Ÿ"ƒ¨º?;zB!½u{Fç9´7¡·÷ðñ5Å®µì[ÁK jQ« ÖjÍÂϼöuC¤n+x•¨Q„‡¨µ†Sï�T¤ƒÙj„érŒñ|„dl¡Æ…x2T ¬¨EyÂv·Åýv�»õ=vûê¦9ÿÖh&iK!„ò(xB!„��e˜’¯ý}€¼eg±^j‘@ᜢñ5*TØÝí!ªmæ'Œç#¤Ó6³ka­ +âÅ…7€Î‘œŒ¢~ ‚]¤l?2¹BÊÀ‡î¸¿sÐ�§³ê#áú*.ÒÕ@3!½”!ϨÀ¨\87uÑà´w8¬ ¬ÿÝaûk�ã¶D}ò�Æ"ñé`õ8·‚^4û“ÄŽ¢¬oAùÉèÅoz^ÃJ/Þ{Èë£ÝÑÎ>Á«ˆÑð€Â `¬À¦ù(A6³Hg;Ì06¤4¢]0³6@’y“`¢9L©¨+ƒÆ5pN1š¥˜¬rLV9Ò©�¤ÎÔPm¢�00jx§Ø{Üoï°Ù­±?îPT¼:À ¿jÒ-g€?;§ä­†d´`„B¾4¼!„Bȇ£—y‹Ú×c$â“´Œ†è%A#€�C¹­°®ÔUƒãáˆÅ–Xþg‰ñ|ŒtœÁƒ TMŒèòðv®êœ‹±ÞÈ0ß":íäBôzå3r¶íáæÛsÐ=«�hŸ†ÐÀÀ¨A]רNö›Öÿ°»?b·.pÜTÐRa\« ,Ò° „¢ÓëÌ„dUy¹ë‹b!äÇp£¬x ÎÈcQÂÚ¯¦ˆ¿·âÖPäòpám â‘X›ØÄ IdyŠ,Ï1šL0ŸO1�M�ç)²,�5"Æ´Å+=ØF¡ãÒ…AQ¨Ê uÓ i<&“æÿ3Áä&‡Œ%Žç!�Xç1…‘Î9ÔUƒÍþÿ®ÿ‹õn�SuBãk@BMm¡ü¶ äïl"y¯æ,WV¬Pc´!!„|(xB!„�Ï�\©Õ¼úø®Vð1q%2` ððE…¢ªá½GU–pÎ*p�ÇÔé8ƒZ�1¡‰D¯(tyT´ßïл1pJ †‘]ÏuÖ=WºTÙú]A� «ë!Q슿‹7€h#hE±¯pܱ¹;àþÿ¶ØÞŸP=ê“Â: ëM`4Äri÷^¯^þ"„ò”ÓGzt½¨»uŠ]1L}´H*±æ¤Ä(¬¬I` Í,ÒÜ"˃ؕ�2ä£ùxŒÉt‚ñd„4I`#}ŠZ1ÁžXoa\3²*AU�PÕšÚ¡qy6Æôv„d*¨m�}½A¥'5°’ µ9,RÀT§ wû_øïú¿Xîqª¨´‚ iLtéxu`Jò\ëHôñã1eäÅ.BùPð"„B!ŸAWT+ ƒ´~ˆ*€B$…WAsòh\¯Te�ãþˆùíÓÅ ùt„|’ÁX�ˆB%ˆ^ŠXoD¢½Äw%´´ýCØKÜ×Ó¢—þǃŸŸ�¢›úTŽ6Væ ÑW£¹à ´|­(�%Êc‰Ýz‡íýûuˆì*� ´N`} ·•Äè°(ÊàK»B!/e˜*W5¤&lSÇBÚº”zÍ%NxÔ#0‰ ͤ£iž!gÈF)²Ü"Ëdã4üž¥H³Iš Í2$Y#¬:¡)*M¡6£�QAâ 2ÍàÜÎ5ðNá½"IRŒæ)\Zc_o ;�Ħ°°ÈL†<ÃJ m€Ó¡Ä×ÿ‹ÿ]ÿ¸?ü±>¢ôŒ´v&D˜ õ ƒËHeÓÛzB>å½û�Ì!!„|(xB!„�OOpŒi_WKâÊpmÓü¡KÆ'>¤&L!@íáÔ£@ukTÇ Å¾ÄtsÄd> ŽÃq‚,·0‰baŒÀµš–x„H*„5 ;@Zç�ô>�.@ .t�ùS¢S°§‚ã0œ@½¢)ªÂ¡:Ö8íKœvö»#ÛNû§}…¦ÄYX�ŸGS!Ji0ÜûåqëSÇ÷/ÉàH!_}Ao¨g=kNVh´#ê[¹ËA�‡I65Hó1Ò±Åx:Âx6Æh6Âhš#gHGÒ<�± “6H ¨qðV!â¡2ˆ.“U¥6Ú. .nˆ+6âWðÃcìª×µ+‘øÖñʨAj3œš øZq:•8ú-|R¹ƒ‡ÍúÆÁûP{̨ív']„r+s™Aª<¹b�hLÈëݹ2<¡ØE!_ ^„B!ä  ½óK‰�$¤C ~D�ªÀI×Ôð®AÙT(�5ŽÛÛ#¦‹ · ,oæ˜.ưóÒÜÂZbœD{õÑèÃëÚ+Ýq�'ÿkSê_È^½(ÕŠ]A°²š±«rhŽ NÛö›¶÷{ìÖwŽû®òЀ·0H`5…‘¦Ý®¶‰¥.>–žñUÈè"„|c{ôTùà½â;{ÑÚU¢¯àáÅ0i‚lœ`²c¶œ`¾ša¶šc<!§Hr I0€JEë|9x¼ôK.ÂÞ| ×êSìjŒZ–ÁûÚŸü §—¸ØB|Xna\_32©MÖ ^UÙà¤hÞÀN€¤6°"p…ƒ¯C„™ñ¾KbhaQX5ðŒöûìέ´iCî`U¡à@þꎊV¬ÅE!ß ^„B!äóý_ éê�àRZRmU10êcá­à°ój ÎÃkŒöÒ ¾V¸Ê¡:8îÆ˜Í'ȧÒQ ;²0™�¤ÆÚè� i©péT�"ŠFªÝ!uE}Îzb9ûIÐ;EÃwñhš¾®PŸj”ǧ}�Ýæ„Ãö„ã®ÄiW¢*šJgêz ‚W_·ËôÎÌÁ9¾téµÃÓç‹_t(B~ý"…†H. âR_§Ë…´�ðÁžY I ’QŠlœÅˆ®Æ‹1&óF³òIŽtœÀf“jB�/� ®·Qí´õ&µ�HF'µ©½t¬Géã‚�Ä’•Áy‘X12,Àb›ƒx¯@-éT°üÏ É(Åd>Áq_â°?¡8T¨‹uÙ@›Õ¦j‘HÓé†c0Ú/½šúÞ~2løk�Ùž7Nx�»òÊ0‹BÈ7‡‚!„BùÔ´ÑB­+L¢‹¬‹ó b”HÀ’蚣Š$ÔHQßx¸“DZ*QžJìÖ[Lf#LLSÌ–ŒcäÓòIÖ9ù`´w¶i¢4¤jŠžÁ�âPB°6¥”QÇçà ‘Á”3Ñ+ ^j‚ØÕx¸Ê£ˆ"×qwÄa›N‡ M©po!šÀ …EÎCü&ÐÞmÙîÿ\ôº8÷‡Ý.À§ØE!}�+fÅr zE±Ë©ƒ¢ é µM_h‘NSÌ–SÌ—3ÌWsLSäÓ Ù8…d¬ÖÃ[Óú¸½ xA&Ú›P+Ú¤S‰õº<¼ïj`PJLMßwëÐ6EÛê!€10ðPi£Á œQhŒòIŽyáQ »6÷;l×{l×{4Z¡Qö/IX$Lk´ª&¤-Ök†Dc�±hïÉç³éçÑ—~|:BÈ!?�äAÿ'_£?ä0‡Ž‹ùŠÐ~ò7÷Ž Æª2ôç¡MkØZ±�èP¨ñ+äurp�‡6uíP¾V4¥GulP*Œw%Æó1FÓÒ(Þ‡Õ÷Þ+Ôùðð€«=ê²FUÔ8îO8N8íO8íN8ʰ‚¾ô@c!>ÖY1Aì2"»Z9íRì:?ÉÏLÁødJ ör„�ï1ÿ‘g~ª3⸺h«X¯Ká u�°©A6É0šæ˜ÎcêÂå ÓÅãÙIna35ÞøXû+DwiLƒèá ¢1^««Úuõà5FxõéßZ®ÅPE O€6‚Ú·u¿bZDÀÎŒMa2‹$5ÈFI&°�Ž ²‘A–›PWòPµ‡º&ÔÊ@¼Äˆi¬ÀÀñKDž9O}îL–öêMmúI| ò•û$�©> !„¼„Dî(….BÈù�¢!´_„¼Ý=!/¾‰.õÒ’ôJkyE]x¡Mh`Äê!ð€z¨sp'Á±v(GlïOHs‹Ñd„Ñ$G>É0šäá1Αå)’�Cá\^¥W†B^Lr¹Bó³G‰+.VúBÞì^ãøŸ�W¼§”·!øƒ›B¯ýÞ-h— ×(x‰Ä'Òª‡ª�÷ W)j8x4 d£ Ù(Åh¯ñt„ÉtŒl”!¥H²65°‰…X�$¦¼D*Ò�©eøŸ¶þI…÷Aôr�‡k<êºFSW(‹ eQ ,*§å±ÄñpBq,ÐÔ \í¡.¤N50Ha� ‘4ü,{ž¾PúÓ-´û„ò¸¿áÁ‹�{î¥ ÑÕÑ¥mVL?h<`ÂïáØbt– BƒÛãÔŠ”³o1üûY2`ôyçô,««ß5xŸÆ\½*jÂÁÇZ�01L]ˆ€¶òÿ·w§‹m#ɶ…wd‚ƒÆª®îóþïwîé*ÛHÈŒû# HQ³lSâú\*É2ʼna3"š¨Ù¢Ñb9ÓbÙhy6“…²|n›•îÂZiSª™sê‡ác õÞ”:íRP¶½wæ5gÓG„^lôŽq?À¯ÞÈÑõäSÎðšîoò¼ø„ìç_±kwؽyOÖ÷:3$J^çr)ËeÙåSŸ\÷ëVëÛNw‹•æó[5óFqgÃG�… ‹A% ’+ß3›¼›¾ž”KîÊÙke—«ï“RŸÔ·½º®S×–�¾+U\}׫ïj5WŽ 9ÖsžAÁ‚‚šZÑUÚß×0·k,�›œ¼b{²¿Ùš¾exh&˜”-+yiaèµ}`3 Z^œéìr©ë¿.uõ×…Îÿ8ÓÙÕBͲ‘Í]9v5ìJµB,×€+ïÜ–dîƒô âlçëm¸¥ƒ�ãÀ?»^ÇÞâ)óÀ¬ÜÏ:ëËÜd–$E)Å…´T£?ýJ³Ù\?.îôãìVwß×ZÝlÔõ­‚'E�Šj$+•É¥`:ì¼acíø#�ð�ÿ„^£æÆÉy�æÓ>I�J/:òÞ¯þ°•É&­�¤ìR”ê¬-WP’»K)«o³²úRõ†ù]’Å Ð…Yý\ßÑnÁÊçh%ˆ ÓÊ*+iXÎå¶²+¥úÑ'¥¾Wê’ú¾¯/3¼”ë�éX­¬\¿)Ô?±¶j,•]µycmvsŸ{_<àák¦=òïåM¥Õ`�®¥¬^}�¯Ssuù祮ÿºÖÿ¾ÔÕ_—šŸGÅe�š\fuY/W’[ª×½_Í5Üb~$äñ§‡=w™�MèÞŒÌCËe¸ÞR�5~§ÎÚ ÊÊ¥õoˆš5�.›F˳ Í 5ÍL!Þ¨O¥•ov—çÒÒ¬tö�e¿[å%ªôbû¿~Ké„^8:ͧ~R±?ƒ7âu€¯u¨5œèÚ\{힦{¶mÕäõ�$å:×¶œÂôéì�œå�”R9i!I1Õù]õ:kÀU:< ³Ã¼^wmÑ4 Îõ2 Åk[CO%ó,ɃB²á\çØÚ©Lá*'§-ƒÌk냓ºê2âcðÊÍ‹O§D8š¬Í =ogn—E×ü|¦ó?Îtñç¥þø÷ºþוήæš_Ìæ’¢× ,iˆË|¬Æòm»Ä�mÝcÛÀ—l'_~´<´äuéõÖí°YiÙ+WZ<Ö·¦Ñì,êÂ/š™fó…bˆº™Ýhu»Q{×ÊsRö²ó¡:YARÞ›âõØL/{Ác6Î `úÛþ{¡ì[À1i>ûpöQðº=vkøªù�Ó^û�×á=O칤Xƒ®\Ú–æLå}êž•s™�5ÎfÛKiìøpg£¦V¾=A7ÄRÛ9)Û?AAÑLf%À 5äÞE?„uÓkÛŽŸ÷—Ë“‹ðÈËänýÒôÛÙXÙK°“­Vh5®83-.æºþ÷µþüŸ?uý׺üóRq!…™K!)‡T*ÂÌ'�W~¤>ùW-{ÛŠ÷¶»jèUg�Õ¯c› ³f®³ó -K…c�ì»ú®•zWîSÙ"zycGi›dÃ²šÆ½­Ò‹° »û€ñ«`u'�à ŽCÃ"À×0 ½^~ÒáA»$‹òñ}öVO@æR ¦rrSµ­ÔÐ ±„W¾Óxj ÀÆÛ±ÝÿÛqÕïXmeÃßKýÖøVûÉ=}ø·0iºµûîwÀë˜Änè:·«ÎÚÊ–¤à²Fš_̵¼Zèê¯+ýëþÔå_WZ^/Ï‚²RHuVW’×V†yl_¨¡ÆxoÛö ·£“ÐËÙ”Ø3-·?—å¡¶×­3ÍÌ\M‹Ë¹®»Ë²¬M &mîZµw½r—$•j± X¾6¯·{ø�,ÏWzváàðÅxà yÛ‰Áíœ-“¹ËMrÕàËLò(Õj.z<ÕÙ*Ãÿ‡Öˆî¾½Œoß}n¶­ÉR�Ã5Ä]ÓRÓ3Œ»¡Öc÷{2af¨ó§ððõtxÛÄèØƒ×Ûí*¶-s ¾—ÍLËË¥þõ?êú?è�ÿ\ëìúL¶0ùl;ÒÕK–¤¡�a ƒ†Ö}îõUÝì]Û¶7oGw*½Kƒ0ß½œk§òÙlx£H¯a¦e³ ºü×…š¦Q0)šé{ø¡ns£Ü÷uÞe™�Ö ­�Í÷Šì^:Ó‹° €SAà€Ïç_¾ä í½Sþ¹Koÿ·ÍŸlû¾m©m“{1Í—†¦‡;çÿ†¹aCèU¯i;è½eFK�0cOÍ^¸m±Ò¾ÐüpkÃékñR•ê®,i¾œ©¹ltõו®ÿ}­Ë]hq9W\yãµ…aª�W »JÕSß@Q:ìú$Óñßôjî²WU ïUTí¼£n…½´n,AŸÉš¨Ù2Ê|®Ô_Hž•sRßuZ‡Ný]Û~°Î IDAT¦Ú¾×mhÝëcþ56�|´‹¡í¬cÀGo1\ÆÌ!/Wè> ¼>áÑÔÛæ#Øk–ܶ2«bí�!›œ`Ò¯C#O¦MÆw¡�ïP¯“»¼_6„k;7å¯Íù­xÑ)QNöÀÁׯ!hÒ^sØÃßÎrÌJJJ²(-¯–ºúÏ•®ÿçZ—ÿ¾Ôòj!››rLòàÊ!�a—OîÚÂpŒ—&Û,ûÕ•]Ã#÷§—Áó×á{[*¯�7I^•¹,F5 ÓÅK5Qe^—»n½nû;õ9+{’²)[TØÙ˜•çþô=ÙÝœúXm øÈ-Èï?Jµ#=Ða¾ß¯Gà…ÓB’óªÃ¼þ€×çŸú`ìu—ËÁ‚øê%Kx{>l{Rm{¿'më—ûXû§*Çl“^P6~ØÞK„¿â5å‘i“R´é÷^N¯èÚeßÎîÊ*AVœ5ËFçœë�ÿ\ëâ_—Z^-Õœ©VvypeË5ìZ&m66tÛ6·�l JEïGok}çÂfïÙdøÎޝ�ïèÈõ_'ÍzƒfAs‹ŠáL©KòìR’úu§uÞ(uYÉ{k”•dÊ›M¦KhRf½³=µØÿ|®�:ð'�À 'Ç'{Àìç~fìÀëx}þù�É?Ñ€¾¯;Õ^» ¯¶ï ß~ÞÅb¯¼ýúC;9ד¿16 ½ü‘Ê1ÀîkítV×þëj�³e¥-Ÿ[*3»®–ºøã\üûZW]iq5W\HŠY å#«V*Y–[’êü/«oå+¼l÷ö§o‡píÎ{Ñ¥½e üŒ��qÚeiiè’×6¾Ù¢,šÂ\:»Z”É–½+µ½Ì¤û›�º\ZA&¹‚Ų¾ñc²ýá ?cׂï_ŽÀ 'É�79?u(™x€×ðúŒéQÊcÿ2™íµwšp{ªÒ¦åb{?ÿšš.{áå¦×¸ÿ‚ãO^xÅ?tfj»†Y[¹„^ÑQç×gº®a×åŸ g¦<ë¥&ËC�õeµ�¡¶m eYîªmú¶¯ôöÈë¿|¹~aEð+¶w6vöµ7/ÅÚm•—ÌååæRp™‚lµ¼˜iÑÌ”û¤¾m•sRÛuêúN9')§I[`“»íÍ�±�{àlã89^8YNÊ~ð0„ƒà8^¦Çæ§ö´ôË€×çã^Ÿ=ÄÝþÎÙ¤õ’=ýüœœEÛ½¤mŸãf{ÏäÝðÉk^æîµEÕô]üOmú÷èpó«éÏ?õÓ š~ú÷ƒFà«oc‡Ö²ÛªÝ!Üš|X?š™«Y4Z^/tý¯ ýñïK�]Í&o²vC÷Ürx¸Ý²WVˆ�Ÿm÷_¶7ŸËòfz™ËÜåÁ¥¦‘YÐâr®£²\÷«µÚ®×Ê{u}_f|I’7 &¹ oü�â£�ˆÐ €Ó@àÀ;µ¹_œrÿ\¾Je×Kž`ûõñº){âJ÷c¬!äò_òÏl×&¯î»oÀÉrïe!)DW³˜éüúL—ÿ:×ÙõR‹óFZHzeë”­“×*16˜æ5ÔªÛ‚'7¢Ï½ ûO] ?çZ}²,¡—[žôûve“¢lfš)èìj¡«¿®Ôõ®”oµiWÊÉ”R’Ìê›n¬Vy›A@àÀ±cîŽÑW«ìzëss¼’ƒ ØÃ°ý–NpÒ’–Äø¥ÏýŒ¯ÿ…¥¢ÇúÛ­ñ•zÒvVRVRòNQ®¥fJuן—Z^,Ï‚rHJÖ)«•«—[*ífTqYmè&eÙëŸP?iüœ%ì“%�wÂ*)+×g£‚5Z\Ìuýוú$­Ö­nnWrÏÊY nr™eÉC©D㥀“GàÀ'𖹃œÿÆÏû…üwíµAÑ£Ý�lr ÛâNîU�WòÔ½µ'—þžìøEÞv ¿Æœ”ÆQm1¶¿”u¢âøò]f%¹²²šyÐìb¦åÕRçœëìj©æ,Hµ�¡['Y/Y_*¸¬Î³í|.ÛN=·�yt+ç¯|âËëˆOÞò1]µM°I &³¬ft~µT×»înWº¿oÕÝvêsRÎI®0¹ga>ùÒÃ6€/�À €O⥡Çñ8ÙçÈÞçßód™œ²4ŸœOÝö&u?|/í™;ë�>Ò|Â'*p4¿�y÷5¶Îìòú‘åÊæÊAŠË™Îÿ¼Ôå_Wºøó\‹Ë¹læêµ‘[*U]–B.³©ê+»)¼èµ»lA샟H¦ßŽùÞ›==æ}eS]R©|=ktv¹�{Ðê~£v“tã·ºÝÜ)+)+Êj:™e �?V{鲟�ŸÉ ŽÓ]´@Äé:Žwoû#ÏÙgòùn½Áô§­ð²!`ãI�ϳ37ÚâH^§m·žM_wës)¸¬1ÍÎç:ûã\ç\hq¹PsÖ(ÅNÙz¹õ’%)d+?«ZåU*»ìõ;uﳿí‰÷»–´?³�ÔPée’å:Ý«ÜßÐDŵLA—×çZß·êÖ­V7wòÞK{C·¡6¬´ˆ´½}âGÖ;ð²J<¯?ä°¿�_q?orò†ã8àŽºüÅÏÛýK;Ïb|55ôzølá¬~á/áôÿfõMÛàÄ­ÖwY–Í‚â²Ì”:¿>Óâr¡¸²Æ%KÊ–$eÉÊ *Mƒ—Wž|{<¤‘¾Æ™3ä;>~dË .¹’\IMóåLç—gº?¿×l9SŸzåu’«Ìó ; n¿m"Õ]8´Í17–€/ôœþ2›J¼K`ðEwø8x>ÔÛŸRþªypjÓ˜Ó…/ú„Úûà„4~í¯ Õ[aüº4×3¹íVxŹi~6Óòr©³ë3-/犋2»KÑKÐ5 »v•íÕO�woK>ÇžêÞGùž›—v’–•뇂k¶htv¹Ôòb®ùùLqJ(é©6žþL®Õ¶óØÔqø·Ð99_ ^|僸g K8µ¡ú¼ÝmÏøTèÅ™x›Zä¦ýf²åO–‡¬Ùb¦ó«¹Î/—Z^Ì4[F…¦´:tåÚ^Öefò�‰á‘ý®Çæw�Òë¼íoövþÉ};KÍbP³ˆZœÏµ¼Xêü|©¼ÎJë�rr¹—‰kÁìm 8%^|q+½(^ÅŽáyK°øªn“ÜiàecuPV–×lÙèüêLgWK-ÎgjAŠ¥õž™×Ÿ¨óÀj•Øô¶Ìƒ¶Ã·(´“Zö�}wÛÒ%™¹\I Aͼ^ç �],ÕÞwÚ4y—•³ËÜ,݇Tö~øêhiÀ)ÚÊpŠ;Cû•]%2°Ð˜šyÐâl®ó«3-Îg ó o\Ù’²'¹m ·•Dö gç!ì�^&>¶óªìdY¥83-Îf:¿:Óò|¡feÑêeóÁ¶…ú°I  ¾./N”§ZÀ©™Q¾ÛVϬÆ"&)ÔÀkÑhq>×ÙÅR³³™l&¹e%õJÞ• ¤½=*?4¤îÉð Ó¥§q—Ë­ÌóRÈ Qš/g:¿<×òb©Ù¢Qœ™²ò0?mgMÛÎg–?_�§ŒJ/pJ;>Ó®º#ä“ÿKRö,7WœÍ—3-ÎæZžÏÕ,¢¢×å-Yˆ MÐl¼–…Ù½ÜRY²î“5`“j/–;¾â+™½ûøÉܽ|)^`ÿÈI¿º�=aøUû9÷ËK�–M*‰L ÑÔÌKص8_ªYÌdQ¥�¡²Ü“Ìê(0jïæPužÝ'|° K¨h&)˜,Íæ�–ggZœmÔÌYì¤<Ìb*ë)j[Åçìg�¿&òÒà !ð|8î_mÇjuW–ÆÐK^“$k‚â¼Ñl¹Ðâ|¡f¥`5ðJ’òîÈ®½}¨Ý°k¨7bÏê9OÖ¿MZo[0ÅÙL‹ó¥ægKÅY# AîR–+x–”•Æê:p ‹œ¢aB”Ëåž·ó»fQͼQœ7²ä浕á$–1¯Ý k{Ds= »ð&öp I¹¬sY4Åy£f1S3Ÿ)΢¤ì¹Lbs—?hÔÆúxÏú0‚CÀ'@…8Q^[Ö0ˤ&FÅY£0+ó¢,êaØ%ßÍU+»ˆT>€íµ»v—<++Ô&….SœEÅJÆYTîË,¢\+¼¦“ÔŒùi²^>eèå<3à”xžUæÙO½~àg²ÉoÛn“A¯ÿÏ23…&(ÎJˆfQ²d®mÈåãOm;æñ|p™¿b6ì°,TeY‰«äY®òa1Èš fÕÌ¢b•kž)®FÛÆTµJg½Ê¬5C¯ØKR­ð²Zu·z€¯.°À)0÷qžÓðÙ•KåÐxÅ &Y¨É‹¹‚¤`µZé‘T«Tv‘x½•?øbgáÖån¥ÂËLL!šš&¨iL!–ˆ¬\ÔëÅ »8%^àËÛŸá5ÌåÚ†^Y’+SŒA!Lƒ“í•Ê»ˆ¹>ný 9•íüK]ð¡f_ÁeQŠÑ›ò‚ËÌÌëz#ìàÔx€0­ìÊ2eiü¨ß3Wˆ¦°Wá5ü»”åʯš^†Â~†®Õu`åk3—WŒRŒR0W°º>Ý%÷±À‹µÀi ð§aœÕU?×Ë”K»CS­ð2… Ɇ{õòîõTý´U´]Uã7Ü4¶œÃ/˲à QŠA !˔ʺTÃ2Â.N�81%ìòáÃkKCª‡4ùð1}qÒ“_¼Ž†Ï>þ߇ª¼Zå‚JUžm×ë¶š�À)!ð'f;¿KîþÈJE�è…gOV QñõóÖÓ4úÚþ1•–†!˜b‚ɼ»nY/œ/p‚¦ñÕ$ )‰×¶}ÞNpâ/¸.|$?°LÓJ¼òyœñ5©sB/N �816~”lk?°ÚV•χc“’�výt>ÌO«�–í­§�`+—ËMÖ¡×)ÿî°à”x€“³ «&�•«+š´:ÜýçÝ+!ìú%ëi»rƯwëó¶¡—ûÞÇci%NæˆYnp:¼À‰²Ú¾°Ä*%çre‚.#,ùÝkèÁò÷Zðåcá×PŒ7\cÐ5þ„X�§þ4'ô€“@àN�Õÿ$ aWª‚¶AØpYüê5´k¯„^Ó›¶£œÌô"ô:í_&ž¿�=¡àëhXàôìUÉK5Ñ8öÉdu\Ô6HpâüW¯*·m¸å.e—r–röú±¿V·ëŒÎ“ž¶æ¶×¨ô3?-¼Ž´³÷]|!^कê®mÅ�òÐаVx¹ÉÍêä(êD~µrbßê:2ew…1èÊJÙÇ _¶3ñ«–Nè…í“}|û×|­`‹–†àälÛj,rwyÎÊÙåY5d±ñ’¦@Üu+n"åRN®œr­ð¾o¢ Ï¢Í!|9^àäØôÃ5öÉËi˜áå;—k‡Œ0åw®5-7y–RöRáå>Y/¬¼ü…€Ð ¾Zâ´Qõýðˆ¾øa�—³Üuž�Õï×–y)+õI©OÊ}–—…I<æÃá$P¿cÝ�ë©¶4L}RJ©VäM/5Ö�Ïþb}¥Ù^pʼpºû3ìÇ<ä“nðu�UÏr—¿YP°Ò'§¬ÔöJ]ùˆ1+Æ2;J$Ëõ´øûN�ŸÊ¡—Àϕմ� æ.yÎJ}ùÈ}®Uy»í ‡Ð‹Ã¼ä i“"„_ð9xá4ùi`¼j±8 ÀWf“fµÈê|.7¥>©ïz¥®Ty…´û3ÛÊ.סC¨—R�¡—¿o5=XZÃw)÷^×UR×%å<,ÑÝ /à-¿sT|ÀçDà…ÓÛaåùý;*½|Å£�±åÝô»¦ “‡ wm¯>ÉS982’¶í哸Ë;>^3>îHu˜Ý%y’RïêÛ¤nÓ©k{å$™‚‚¤™¡íç²Bðš_9{äÄA¯À"ÀIñ�]e>„ØYVðµŽzvÿn^#/ ’[©jK…Wî³=.5Ɇ*/)õYí¦W»îÔ·I¹s…djTÞÛmR 0·-9ÎÅǽdÐòŽ�€ƒ‡^ðõí•ndSî³RW¯~Ý*_)G™›ò4@1Sv—›�aŠ ÿ÷ç�®l2L*•a_)ô*ù ×eñ†£L³zÃ2¯m%Ý”º¬vÝŽ�WJ®˜M¦X?†ÐËÆ~ý´íÇG¿tØN‹SΤÀ1 ¥!8iV'y¹›C`e²•RÁ%陾—z™�hP3.¦²¬]Aò œ­´4\w5ðÊÊI’E…ºŽÂXÝed]œ/p²¼†)®\j°r™Õ­;mî7êÖ%T‰�¤Êl(“¤!;p��Tj•Ћôå¥Ì‡V†%ìò$yWæwmV¥¥a«»Ê‡<Ô€ÌÆeM³9N�8YC£Áì¦,)g©ï“Ö«�V·�Ö÷gê6½43© 2Åh™R©'Úɰ^hÙäÖñø2 µ’.–ê®^êÛ¤Í}§ÕíZ›ûNž¤¨¨àáAåK€ÓBྼýF‚%èš|Ç$¹É½´4l×�VwkmVµ«V¶˜©™‡zEÛö†»}ï›Ü#b™Ãk«.)ßVxå>«['µëNëûVݺ—’)¨´£Ü†]/]à+!ð'Á§ùÒ˜©X-ÑÊR NäI}—´YµZßo´¾ß(,Ma1Sˆ¡\>LgC½6`™†]§z=ó˜ÝK½–™yŽÊ]R»nÕÞ·jW�ú6ɲɬ¡U$àYöß á¼�å(x€“QB¯¡¶kT™•°+(”ö†]+‰V÷k5çQó‹YimB¹"³½ª¢—šþÌ)†^屺?µ„¬Ìæ’)xY'©MÚÜ·Ú¬JuWn³Bn­Ôx¾‚0@Ý®üÄM‚¹z/€_µsýNì�=²+×1 Â>ëòõG6Ì®É"£@7·r1K¹ÍjW­V7÷ÚÜo”Ú$Oå2Ó–†þ`†×þ �ðUxüDù.2Þ1ö4– àÍÛ +q‰,ÖÀ+*ç\«¼Z­nW:»^*µI³e”Å ó lAÚŸ¶ûÅ#ûO|ßÞR1vdË÷ÑÒ­‡a—Û¸ vÚLÖÚ®²ÿ“\©Íjï7º¿¹Óún£Ôf)ÕÊ<‹ÛŠ0ÂÌý¸k7D$ôàë ,€OÂŽë~Lßÿ;íÜÎ^Þ¼=)IÉPåeäÙÔmzÝßm´º[«]µJ›T‚/—*‹†Àå]£/?‡ÊocèC{È0.×  ËA¹ÍêV½Ö÷­n×êÖ�”¤àCUž�ÉÙîõû#_€¯ˆÀ ¯æv\§�\Ûwˆð¶ I©þ1…¤¸IYê6I«»µÖwmî;õ›$õ¦àq ½4i©WNµØ;îÈ×f6]FûCØeµ¥a”eSj]ÝªÓæ®ÕýxåÒVr'pj»¼~6—Œ  €SAKC¼M=¯äÇr_'¼IúˆÂ^'@™\AÙ¢ÌS�ãÕk}·ÑÝ�{ÍQÍ<*ÌI¥�ž|VÊulçz=˜ö‚�ÙïÚ¨ùO_K»73ù»i ¹ÆÏ¤dJmÖún£›ïw5ìê•;Wð ¨ÚÊpr]Óv†“�`µ‚ |e^x3ß™·ñ›pö >…Ÿ7|HØ5 œ,(x”Ô(õ­ò¦×êv£ÿÜ*Σæg ÅE#Íkàe^B˵R,ïÜ/7ÉÜõòÐëwmPý¬ {b ” +x�RTî¥v�ôãÛ�þþßt÷}¥~“¥Õ(ZSf®ù¶�äK&ž²ëÀ×Dà€÷á¬àÙM…ñöbˆZ&1‰‹rÏR6åNjW­î~Ük¾œéâê\󳙂™,4²àÊÊ’Ln©Ìÿ²\Zë™$÷±vìð‚x>úËáW„^¯Ý·U]V[Ez2õë¬õ]«Ûï÷úñÏ­Öw­¼“BŠÇYk¶ÓñÀ­¸ýöú9ÅSýãè˜ G…À œ(ŸÌ~Òö³©ÌðRTV£ìIý&ëþf¥Ùb¦‹ë•fË™–a®Åb.÷$)•Ÿ6É•jYW¹îÝóì¾SOv<†åð¡—ÕB·gÿmX¦ ¨ P>{T×&­î6ºùv§»+­n6JWðRÝ,–J°� kÒΰ¬ˆ�%MØu²Oóíï|i^à$•¨dzÜÇïKAÁJÀbÕ·½úܪ™¯tûýNóåLÍ¢Ñò,È¢J•—¹²»Ü‚†ðÈ݆ìeÌ“ÂQ/‘÷…^®ÝÉe‡þ}ÿ6ËŸ `�BR êÛNw?Öºýv§û+mî:Yó¬Vw…2çkr Ã×Û‘^¶s+8AÓ° ðåx€å¾ö1ó¡ÕžY ÊžÕÞ÷ºùçN± jfA³YT³ Š‹¨àCý–×ê.¯ÍÆJ/û)�Õ>Î4ôzí2ÉòL1GÉKCÕ¸L2Y’Û˜uœðä»_Ú×é!ùõ™(Ƽ�8¦mг£§†ê«áÏö뤠®Ý¨í;Ý}[Ir5³¨ÅÙ\:W\F…y”Çz=îÊÊåZjòâµ:éÐÜ©—ç2®�OÞš í?«Þ°ì‚‚…R¥•åÖÕÞµºÿ±ÒÍ?7úþ?t÷í^í}'oMÑLV«ºÊç!,Õb“Œ°Šû�Ü=”OƒUx/€é¨툇ÅChã5—ÜÔ¯]wßWjæß‚Ô¶­®þºÖ",CP(S»”Uëº<ÕZ$û ¹]Ï%=¿t)j:»kŒ }˜†¥Þ”jØõãï;}ÿûFßÿß�~üs§î®—õAæ�ÂÐÆP¥º«´(ÜVyíTuQ¹õuÐÎðF^à¤Ù¡oøáK ùܤXƒ—Ô¶êR+Å[eOJ9«iæjš¹¢šR©d.³!ô’äYÒÁlí�÷þH‚±x®´”[©ÐòZ­¥¨Ôfuw�î¿oôý¿·úç¿ëöŸ;Ý_KmP“gŠš�a—ÕV†&+íÝÆGëô¾ûZ»ï@à@/>¶€/}$´5TM+–l¬*²zÕËeÏRÊêî³n´’,*„™ºÎuñç™Î®– 3SlY�²¹²l;ÏË$ >¹Ý·~}Ü‘\éèOÞ�³²Lã2²Z…ånR.aPTî\}—´¾ÝèöÛ½nþ¾Õ÷ÿ»Ñí?+µ÷YJCU×\¦()ªÌí깯#ª»¾Â.?õ%ÆÇ6»?åºq¼<}à_Þ� żž€Ÿž«q—yý“)x–{V¿îÔ¶kåäòlê»,Ï®h�æçQ3›I’²²d½$/•_ÑËÍ™?8&{Ý,¯>.ô×þÀä^»Ér)i3E5J]¯ö®Ì<ûö¿?ôíÿ~èæÛ½îl¤ò\Q¥ºËlRÕ5F�5ô²:³kzÛöªUŒ#<Á c¿æå†×š¯ŒÀ §w ãÛýpöwŸ>>€S?†´¡€¨¶Ò›ÖQ™IÁ£\Íö`3IýZ¥=Ÿ‚܃Rr]\/u~}¦¸0Ùl¦£d¹|xùìîÛª¯ÉQZ Þ;žîYIìП?s¼üâA;|ØèV[Æ2kËMʦÔeµ›�V7+Ý~¿×Í·;ýøï­î¾oÔݹÔ6 k%X£¡²ËÆ`»G­c Yg =ˆ+Ç•tdíÀOEà…“ã&: ‚† ïØ=—ù¸döÒR)«™œÕÆŒÛ`Ê<ÔÙ[%ôò,mVÝÿXéûß·úößïºû¶Òê¦U{ŸämTLM­‹2«a™…á–ž¸�Ý]¯åte½¾I$ø\¼pšö*½Žáî¼èXì˜î |¥ÄG�¬Æ.2—ïµ 1•:¤¬ `M�‚RJJ¹UÎYwj•Ó} €rÐE{¦³n©ÅùL³EPhL!HLR’›É•ËÇävrýÚwŠ¿J0–'“¿Ü|· íG”>écx¸†kû]÷!ä‚©0Îïòdʽ«ßtjW½î¾ßëæÛ­~ü}«ÿÜi}Ûª[eyR£è�ÌB¹ãu=uÀú||5}§ëºìP©ÇÁ¿í „À §»?õqó|ßuXõ†ýÀãºCðéÙËþͶþDPP&M¹ËÜ”ú¬îÞ•ú�RoZ¯z]ݶºüWÒåõR—× -ÏÙLŠM�+È-É•äòmÈ5Ìö²ÝãÂ!ürM[!úƒcH«_=wÈWîûpÙ!èÛ)%Û~ß뇕?QÁJEWî\í}7¶/>Ö7mî:¥Ö¥.Ö°k¦ÆfæuÉìùª®CÊö²#èCÁйq<ü»v>�8¦ù½ûuÛÖì/¸,íà× YŠ?r±Ò-¯Ô$¹‡zÙ\þž{¥6©ï³rÞ¨Ýôê[W×Jý&É»¬ÔÎ5_J³¥É¢Éb(9S�̳r=h ¥áa ½JµÙ6Þ²Ih`;ùÏð/f“ê0íN·šNÿ.4f@“Ñò(K–<(¸ÕY]AÙM9»úMÒæ¾Óêf­ïßèûß7ºûq¯»ïkõ›¤ÜJ–¢BŽ Þ(ªQPSÃ.鱊»Ý{»¿êÞ˜ìT~ÙsñGü+ü+îßGÞaàƒx¿{t²/o�ìKîc~åq›^RÊŒ/W­wþ%Ê<É[W›³n}¥v“´¾»×ý�¹.®çº¼^èâz®ÅÙLóåL±)³¬ÜjsC+­ Ãðw—²Ê¬/“Ë­V]ÕØj�¬öò·é|2ß=Ò,“) ÷w:¸LÓ¶…“‹5 2y’r’ºM§ÍªÕêv¥›owºýq¯û+ÝÿX«['uë,õQ!� š)jV¿“™[{£ÕvŽŒŸúþûC¯—\ÍQVƒùËïÿGÝž™}Ü}àƒxǰojO¿!�° ~óqÛ“‡e6¶ú³½f‡¦¬äA}ß+õ½ú®Õú¾ÕúÖt÷#èâÇ\›¿.Է纸:—.ƒæË¨f¢T’3—‚×Ö†^¬,™+{C))õ\cK+·´ÛÒpZf{ÿW½®úhjÛBS”©TsYR–r/¥.©o“în׺»¹ÓÍ?·úößïºýq¯Í}§n�d)Êr£àAæ3•Ê®RÝU+Æ$Éì@â;ËyûÕÇ…]¯û=𣠽~Gpäîo½»? �p,;¨�tm ì€#9nÛ;<ÿ>=ž3“y©² ç`ÕùWž“Ô¹’»6¹“w½rÛk}»Öùå�Î.Ït~1×òb®Ùr¦f9SœG…Y�Í‚šPŽƒ²’eeϪu_åÃó¶}¾y½o>LÞª˜dü/«aW­Ú*·$ɼTty¶ò‘L9¹r׫]wj×­Ö÷­ï6º¿½×ýíJ«»�Ö·m©èjƒbd^Ú52oËÌ/…1"Ü™0¶ó®P{fM8¿”¿ë¦ÝŸ˜·öÔ]&ìü^À1í§lÀq·ø»íǶÕQÁ¤¡Ýa�ÕYWIžzum¯~•´¾[«ùÛ´¼Xhy±ÐÅ纺>×ùõ™Î®Îµ8š-5““™Ë””¬„\¥ÅaRV†qm«¼´ »Bý< èšÄ[5~*_ËkàåQ9I©wåÎÕ·YíºÓÝͽî~ÜéöÇ­n¿ßju»Öú~­¾Í²ÜH)ÈrTãQ¦Xçt52þ˜¬ÌÓ0kl˜£µ¿”íÀßMÆ…ñ;C/Öàˆx¼ƒk¨˜ÒÎŒæ¡ã›�â:ewew)Iž]}ïZå^]ëj7I«Û�ßïµ¼¸Óò¼Î÷:›©YÌ�lJø­X&YSƒ0�ã¸lü\Ã-³I`äc»CeWÎ徤Ô+÷YÞK¹wumV»éÕmzµ›^›ÕFëÛµVw+­ïÖZßoÔ­{õ­— KQæM©âò(S£ÒÞ1ŽsÀ†%ãc…×dá¼�À»øN{Cs“Á“—xÇkääV‚ž¬ ¬(yRN®~�Õ·�Ö÷�¾7wŠ3Ól5_δ<_èìb¡ÅÅR‹ó¥fçsÍ—s5óFͬQl¢B c¦±ª¬„^ež—Ymè.y–çÚ1e唕º¬nÓ©ÝtêjȵºoµºÛh³Úh³nÕ®ZuëNݺWî]ž\–M!ÏT® ¦†]eî—{yôfaRbVÒ8÷írx+/€wB/¯íêkå’ùdfVù~�”jäcr™\)'圔û¤´É²èÚ¬z5³Nëe«Õr­ÙùZó³…ægeÆ×l1S3›©iJè› `& ¦`¦`a ¼†qbe¬W’笔{圔ú¤Ügõ]¯nÓN¯¤ÍªÓfÕª]—ïõm¯Üeå.�mÍ¢¢E‹µ’m¨æŠ5Æ2i˜i¶ß”p˜5ð^ïâãçm�Ò$Á±íå†�+Øt™\Q2WP£¬¤ìYQYž“¼ËʽkÓöjïzÙ÷�Ô…YTœÅY,aWlÔ4QM Š1*ÆZñeV«º†‹¥…aνrî•R¯>uJ} ½R—Ô÷½ú.)÷Rî¼|îUÚ/&I¹QHRÌ5¼ò B »‚¤P‡T‡í#Þ–�M–„]_à�¼>‚ÕyXå/¥�ß^€cõbfA^ÿÈl¬ ŠÊÊr/­sNÊÞ—àÉ“²%%¹UæwÅ ¢b jbù<^6^ª¥]ÃýÛ^}êÔ§®T•Õ¶†9eåìR²2“ËKÕVT”yPð  òyhKX¾‡G¸ ´Æ�k¸lÛþQ¿DÖÞ‡À à½&- ÇoYmsXzÖ&‡Û‹ŠẏÀ¨´9ŒäuÖWV »¢²r®³¯’I¡ÌëMÊ–Õ›Ë,Õ™a“›°°ÉåžåÊòÜ+ç¬ì.w“<Ê<*º¤Ú®0hòaÃ$²IÕVýzx|^¿vÕB/·í£´IØåu¦À ðx;\�äÓïÛ$›þàôoeÜ—‚oëŸ$“[�{�[TïYI®œ¥<\Eª—vWòòsî¹\»o«ºê¿l+½l¸l¹"“ICU˜L6 ºÔ 1×zÙôÁ[½…aF˜mçtÙ#Ëgø"/ð¼ÞmHzv¾sx¦×ô§ÆÐ§VƒmÇ��aЄy� †Ÿ µu ºQÓäû¾ ¾&Õ^E–,—KÕJ,«[AQf¥�¡Y,ß÷ZÍåÚÞòvùÞÝ&x=þø> �À»ÙNØ%i'_z”×Ö‡îÛ–‡5ü Cê¥ixVj¯²•¶‡c…”—YYV/<6ô¡…aýéñÓʯˆùØj±|,Ê,H$…ÉÏÙÎãòZ)¶ÿÀìeK�( |/p’|R‚õ¾Ðå=?=T_©~j¬ö¤ ó¬0μ*³½vç¡–ÊjíW Óäš„Y“Û�~6Ÿ|¯Vq™Õ°Ë$»÷Ȧ_úÞµN[2>Þ´�  |$/p:ör$?8[ë-WúÖø¦63ôíu” ÊjPå“dÎJÛÁq†Ö4ðšÆ^“ÀëÉû<‰§Lå> Á˜Ùx{;uXvðÞïܸ˜ú ú¥s´ð‘‹Oî§Ñ^ºI5€¨ðÂ£Ž¥²KÚ½Tz€)*¼pØ‘VR‘s€}^øTèhöxàS#ðÀ§Fà€O�À Ÿ�>5/|j^øÔ¼ð©xàS#ðÀ§Fà€O�À Ÿ�>5/|j^øÔ¼ð©xàS#ðÀ§Fà€O�À Ÿ�>5/|j^øÔ¼ð©xàS#ðÀ§Fà€O�À Ÿ�>5/|j^øÔ¼ð©xàS#ðÀ§Ö°|YÎ"Øa,_�€/É»rÉ ½|A^¾žv‘íX,΂ðõ0à À—bNžóäòÕo¾/_Ǥ²‹Ðë¡�åBèà ¡¥!ð‰Q©ƒ7ýÞˆ¼ À×Bà|R´îÃ[vøjhi|BTv°E…ðÉPÙÀ./à3¡² Àöl—xàúè¶¼&/ü*5ìúÈÖ¼^ø%ì'¶å%ðÀÏõ*»¦¼ø Œ!Ó÷wŒåǶ½àõÀgAàÀ/fιÃCÜÅ‚€#Ü^ðú à3,~*»žX6ÒXÚl/x}€× Â €_„Ê®'–Íäk* °½8ž—A^Ÿ|Txð+ðÎøá<*€“<Òí¯ÏŽ�8ä‚NÙ1·½åõÀ±£¥!üf´½€÷¡Â ~#£| Þ� /øM¨ì€�ñêÀëw¿ûÐ%Ž|zTvÀÇyUàu,ï>t¡€O‹Ê.øX/žáuLï>4©–zÀçBe|¼UxÓ»§÷ƒJ/Ÿ •]ðs<_áu¤ï>ä À§Beü4ÿádyÕs&ðIEND®B`‚Immutable.js-Inheritance-cheatsheet.dark.excalidraw.svg000066400000000000000000002102261522056416100343450ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/public eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dWXPiSpZ+719B1Lx0d1xcNLkv/WazeFx1MDAwMWNj8Dp3woFBgMy+gyf6v89JXFxcdTAwMDaBJIywXFyXakxVOKrQ4pTynC/Pd/Is//e3WOzHcNa1f/wr9sOelktNp9IvTX78Yb5cdTAwMWbb/YHTacMhMv//oDPql+dn1ofD7uBf//3fyyuscqf1dpXdtFt2eziA8/5cdTAwMDf+XHUwMDFmi/3f/CdcdTAwMWNxKubak0qngHhPObdj1n3tJmmu/5SYXzo/6X0wfbs8LLVrTXt5aFxu3zNCLCE4wUhcdTAwMTIstEZ8cXhcdTAwMDaH40xbWMJcdTAwMDElXHUwMDA1kkIpylx1MDAxNscnTmVYN7dA1GKaSYxcdTAwMTjDRHItXHUwMDE3p9Rtp1ZcdTAwMWbCOVpbSmlBXHUwMDA1p1RcdTAwMTCi6eKUtzH9K4ZcdTAwMTbfXGaG/U7DTnSanb5cdTAwMTn4f2Hb/FlcdTAwMGX7uVRu1PqdUbuyOGfYL7VcdTAwMDfdUlx1MDAxZt7T8ryq02xcdTAwMTaGs/nd4V3De/2x9jvufj5cdTAwMDFZ+z7oKviltXrbXHUwMDFlmLnAi2873VLZXHUwMDE5mreF0fIpzFxiu2eV5bTNvz3LXFxMz0mqXlK9U/zUr9dz9u3Nj5/H/3c59H6pZZ+Z6W2Pms3F1067YptJ+/HM1MnKsNqVn8NaOX9g2+ZcdTAwMWVYSUxhZuhybpeiiDle/zbXac/FkimMiV5e5FxmkiCMw/k9q6XmwF5OiVx1MDAxOUFqXVDdwupcdTAwMTLYp+umeHyuj3pjXHUwMDAyP8/b5WJcdTAwMDdcdTAwMTdcdTAwMTZPs1witKV+vzP5sTjy7z823Tc3PUe4l03k0/WjQvYyfV46TVxcRXDfzKN2njJcdTAwMDOa1sev3avm7Dah8U1cdTAwMDT37bFitdyollpcdTAwMTWlW0kxUbObgb3dfT1cdTAwMDIz6lZKb1x1MDAxM4MlU1x1MDAxNCaOSs7E4njTaTfWpaPZKTeWc/k314DXXHUwMDEwhubbR32iR7VWhqZY7qmQPVx1MDAxOaW9XGJcdTAwMDO/w1x1MDAwMy7IYvBRVIL2M6ZXsUVbklx1MDAxMoWoooRcIlx1MDAwNWf4QIuwKFx1MDAxM1x1MDAwMiCIaKUlWVxu41x1MDAwMlqWKvcxlCCEvlx1MDAxMkfw2ve/XHUwMDAzjtxujyOccpglQdfxwozYXHUwMDA1+msoQjDjmjCpl9NcdTAwMWJcdTAwMDJIolx1MDAxNPHF192Os45Ty3/FlvIz/8/i3//7h+/ZwTK6drlndpqlwTDRabWcITzXlVx1MDAxOZPnxVx1MDAwZkv94TFMl9OurVx1MDAxZrPblYAj86uOXGZk1O2SZ/LhusBj3U5zVptP6EeYkL16fq1Vqq/Huj55QVx1MDAwZqrxwouvXkxcdTAwMTja0+EqJnDBLUxBKDRcdTAwMTNSMLlcXHvf7FxyZlx1MDAxMVwihJCEaYIoZUuNf1x1MDAwN1x1MDAwNY0txbgkSFx1MDAxMERcdTAwMTTmS4tkgVx0hFkwXHUwMDBmmEvOpVwi0iUl3+bGTjChw1hcdTAwMWLczKwmXHUwMDFlRDCzr9e/fIdcdM5cYlZcdTAwMTip5VV/NUrMZVx1MDAxN55cdTAwMWWmvVx0xrN5gOVcdTAwMWLrtIdcdTAwMDXn1Z5DnyVcdTAwMTXCRCAmiHBcdTAwMDOhOSldajlNM1l85b5HTafWni+adtUlQ/BOhlx1MDAwZVCAxeGWU6m4TfYy3LJcdTAwMDTrbN87W52+U3PapWZxw7BLo2Hn2lx1MDAxZbxccnzYXHUwMDFm2e73Yp++q1x1MDAwZrZcYt+g+zeaXHUwMDBmZEZcdTAwMWYhVJjy2U3iMd+5nWyj+4xRXHUwMDBiXGJcdTAwMDBopMBcdTAwMDJWXHUwMDA117y8Kb9FXHTgXHUwMDAzR0hpylx1MDAxMFq+ynfdp1xcw1x1MDAxZIRkWmKNXHUwMDEwxj7KXHUwMDBmlIVxRMGwxXAzgJFv5f+c8lx1MDAxZoVQfsxcdTAwMTFQQO4lXHUwMDE1cFBcdTAwMDUyXHKsXGbXgFnfSfu/iFx1MDAxNGxhZFx1MDAwM6Vy8aNcdTAwMWSwpVi3Y0tFjTmDWCk2sIexTvXvXHJ79kdsXFxqjux//NmGR+079iA2qTvleqxcXGrHnu2YM7T7ZkDWb4VLUT9yNJiWXHUwMDFlkEaHXHUwMDFliaumw06LXHUwMDE5XFxTtlx1MDAxZW/tRYljrSyMXHUwMDA1XHUwMDAxko1AJDBVK8iGKbKEYoRoXHUwMDAy4Fx1MDAwN1PitWooopaSnEiwIcF08WM6XHUwMDE4SUtcYlgmXHUwMDExnERcdTAwMDThh+pFXHUwMDE5jmxRvamjauW5Pp45RyevJF/aXHUwMDA12ZJhvChcdTAwMWOmRXHu60UhhKx/u8A2wDVcbvSALWcrXCJsXHUwMDFiZ7InN6/le6d8e8qys05PX7dvt8O2PzbdN3/5PJbnLPNYk1x1MDAxN04nW4rn47r/1zpSPsZiYJhcdTAwMTIrt+7v7vBwXHUwMDFh54M7nErIW3yRT9mJWTGZy23j8PhcdTAwMTBcdTAwMDckjlx1MDAwMFx1MDAwN1x1MDAwZdLjXHUwMDExnc6H8HiA0nJNuZS+Oo+DdVx1MDAxZaipsWNp1D6P0FK++DpSn0egkK5d7Zme39nl0XygT4nqqHI5TOFOun/tTFx1MDAxZUblbWhPXHUwMDFjYMBcdTAwMDLKo1x0JVx1MDAxNJjPmmnAP4JcdTAwMDQspeWHXHUwMDAzru++1/+dsCBcdTAwMTVcdTAwMDJcbiQy1FX7Qlx1MDAwMVx1MDAxNoHURiqw11x1MDAwMFx1MDAwYvZcdTAwMDdcdLx+XHLrzLxcdTAwMTK74ssjXGJa+XZcdTAwMWZcdTAwMWNcdTAwMWHe8UZDXHUwMDAyZjeXfJqV8XaqNWv3atWjTiu+lVMzXHUwMDBl0mFpo+FcYqgsQ1x1MDAwNC/Z1tu6rywmKHBjyrSGeVtiwLuSXHUwMDEzpi0u4MNcdTAwMDXTXGYztDxlofA8zMr/rfA+XG6fXHUwMDBlo/BcdTAwMDDXXHUwMDEyXHUwMDEx6efKwDp47edcdTAwMTJrRvZo6X9X+J9a42Lfg1i9NLb/bDvtcn8+XGJYWuGWLbvvlGPAxlx1MDAwN/6uhb2BhM89UTSgYU9cdTAwMTPp40z3snGUXHUwMDFhTKRTarTr3dH2nlx1MDAwM4mlxTjHSFCkwVx1MDAwNlg6NM1cdTAwMWJljFtcZlxmTaRApCRiPtFcdTAwMTdcdTAwMWNcdTAwMWJTXGYhY6eaRcpcdTAwMGJcdTAwMWJcdTAwMTiZ6Fx1MDAwYqKRlFx1MDAxNCMsxKH6XHKSre5N5+iB5ujTq9N5iJfsJNa7wMhZXHUwMDE4v4GkgjGNld++qduHs4YjYChyJMVOMLJ45Gi9XHUwMDA2njflXHUwMDAxKcA9gohbj3Zn4SVbXHUwMDFjPVxcVIbNcWKUv1x1MDAxZD1d9/Csulx1MDAxNVx1MDAwYv9Ap5T4vE5cdTAwMWQkXHUwMDA3j05/QnBwgoBowjRiz9bh3GpiQfpcdTAwMDOUSmghXHTeRYGiXHUwMDE0cVx1MDAxN9WMMuwgSEbXrvbMzu9MwafxqyMtZ/e1VqNber2oXFzdtdHNVlx1MDAwNjqAgUW5JkJcdTAwMDFcdTAwMWJcdTAwMTN0lYMzjj5AXHUwMDA0KoGkU0pcdTAwMTnY8Fxcce1cdTAwMTdzcKhsPDJUOFx1MDAwZlx1MDAwM1xumkizXHUwMDBm4lx1MDAwN1xuPkvtXHUwMDAyXHUwMDE0hNln5DLqKIPdQeHdOM86g+F+XHUwMDFi26sjjMZ4frl3XHUwMDFlK9Pm7fPpMVx1MDAxZue7valqXFx1t1JoUFNLXHUwMDAx+jHQWs7YWihcdTAwMDHTXHUwMDFm2s1EzPm2Qlx1MDAxYSmC6FL2v+l2ZFx1MDAxYZ1cdEW3XHSVlCG/sCGsPF63XHUwMDA13SZSU8053U+VXHUwMDFlxGC+Y51+xe5cdTAwMDNPdX7y1YrdXHUwMDFl2LHykrX+8We7NSrXY02nYcdKsfPSuFQo953uMFx1MDAwNqtmabbnNPxLXHUwMDFlNFx1MDAxYYDp146OX0jt5e68/zLtJHQ601x1MDAxYtxvz85cdTAwMTlQZ6Ioh0WDcYlcdTAwMTBeTY8gWltmX1ggXHUwMDA1hlx1MDAwNXenPrzjXGbHylx1MDAwMnxcdTAwMDLRRowyslxcr5b0XHUwMDFj2IrgXHUwMDFjXGY6rbngwpVicViw0zs5LTWehuzoMvEwvOm1Zlx1MDAwNZFcdTAwMWLtXHUwMDAyO7lcdTAwMTD0nEtcdTAwMTObrHxhh1x1MDAwNEc1SyEpXHUwMDE43mIndrF45Gg33z1vyotpxmyKKCtg2EpldeJcdTAwMTI9XHJcdTAwMWa7rfGg+pStqZRXs3zo+Vx1MDAwN0pcdTAwMDVrwOeV6iD5eXRcblx1MDAxNGaPXFwoXHUwMDAxQ6P+/FxcXHUwMDA1+8nB8OKUgVx1MDAxZUW9cFx1MDAxYiGXIYTcRUQjJOhBMrp2sWd2fmd+Xlx1MDAxOFx1MDAxN89T1eRNq5OA5T7/rFSq1NxyXHUwMDAzTVpgq1x1MDAwYqBmXHUwMDE0YUFWXXbwXG4/hFx1MDAwNG5Js30mXHUwMDE4JpRcdTAwMDO4+OyfXHUwMDFkLEWPXGZcdTAwMTguw8TOXHUwMDEwTVx1MDAwNXIzK3e8XFxwLDAhjDDszkT9q3Hh3aAvXGZBXHUwMDA29ttcdTAwMTRfXHUwMDFiYjRG9PHls1x1MDAxY+SqlXrTOW20e7RzRp9vt1JrKsFApoJcdTAwMTLGXHTVXG7M21W95shCTGlcIlxi4sDjl0KxdMUr39iXg+Xmkany1faqXGa6SExcYovvXG7vXHKIWWiyZvOQp+ipeTSa/EZZ36mqi6Raf7b/+c/Lv+N/xP5cdTAwMTX7Z6xUqTjzUPVSu1x1MDAxMuvbrc641IxV+51WbFi3zT/awz3n51/3tNHgy5RPZ5VEsdpM5OvJp/rVXHLvjX2oRFx1MDAwMEknWFtcYklBTVx1MDAxNiY3gbcrXHUwMDE4g4W0gFJcdTAwMTCpqORUoqW5uXDuM2xhSbRiSGAjYl64wWiprYeFNyORaXVoNVW9nJReXHUwMDFm24mckzie7oI3hTB75liZSFx1MDAwNX9nICGB7n3MMUWCYlx1MDAxZXms/VdcdTAwMTUt4FfXxY5TTDZu07npPT6+y3cqKrr8JElJmPykXHI62j0j2Vx1MDAwN9GfNq5RIVUt1Fx1MDAwYrXGZXZcdTAwMWK6T7CwNCVcdTAwMDJcdCa5sVx1MDAwMuiKelx1MDAxMqRW1dNPP7llSlx1MDAwNFBcdTAwMDVMikg/Vz2xXHUwMDE0I1hcIs2AKsBcdTAwMWZsx3FcdTAwMTg32n+MXHUwMDBiIDp1XHLjXHUwMDAyXHUwMDAwXHUwMDA0JVxi+2/Rb4iNXHUwMDE1gNVcdTAwMTJhXHUwMDEyeWWAsHLvorpRRslcdTAwMDfJrfnEfUV2eUvPlP3OfoFystlcdTAwMTS0VGhVaCenek93qpuytyFcdTAwMTBcdTAwMTTQQZiyQopcdTAwMDNNcG/svoXVklx1MDAwZpZ2WFx0LG027iUzsbdUfofRf1x1MDAwMVZcdTAwMTTDeFx1MDAwYrXWNKBcdTAwMTaRVutfLoqIXHUwMDEwLVx1MDAwNVx1MDAxOGhRXHUwMDA38+yOXHUwMDE0PlH0XHUwMDE5e/ZcdTAwMWLF0K+NNlx1MDAxYUs+n1x1MDAxYeftaVrq4/Jzo1J5XHUwMDE4XHUwMDE3n09OtlF0QoUlYVx1MDAwNSHcpPabnOVVK1x1MDAwMX9oxCNu+Wn3wTpcblwi0+6b7bWbIK2UWdF8XHJcdTAwMDHXVKzvplx1MDAxMYxBXHUwMDFideRm+5ea17BmS1x1MDAxN1wi7Vx1MDAwMFx1MDAxZXNcdTAwMWT0RK/HKs6g3IeH/7NtXCLWY0NcdTAwMDdOXHUwMDFhdmJ2qVxcf0uP33N/Q1x1MDAwNI9cdTAwMTVcclx1MDAxY93Va+nkaNxwqOpWVa9/fauufVx1MDAxY5dBu/+Kgo1GMSxcdTAwMTFgP1xirFaTeZmgXHUwMDE2o0pcdTAwMDODQYhcdTAwMTJGvZl7glx1MDAxM8tYXHUwMDFlUlxiRpREPmGD67v/5FDLldDu621iVKXt4aQpcsP8hPSPXHUwMDFiu+DVfajgfCFcdTAwMTVGQvk6XHUwMDFheLBrk4PlIEw+11x1MDAxZSHWXHUwMDFmm+57PZvdX9LXSf2xolxulVx1MDAxY85cZlx1MDAxNctHhYTGvY+pW0V3dzSMXjLVXFy3N233eqmX19agLcrxK6/O+sRcdTAwMTWAujKMMFx1MDAwMlBGSrn1cY6CiH2srthcdTAwMDJZXHUwMDAwU0Jpznxz74G1KalghSNcdTAwMDRcdTAwMDN9ZaEqmf7HeFx1MDAxOaLT1Vx1MDAxMF5cdTAwMDZtdtNpQFx1MDAxZVxyXHUwMDBiVlWPb1wiqny8kDLv4s1cdTAwMTE6XHUwMDE5XHUwMDAyZdZ84l5xXd7PM12/s4fh3n44Kp2f6MvE8XjSQeVCecR721x1MDAxMFx1MDAwZsyZXHUwMDA1b49cdTAwMTijlWvB6WpBQibUR6hB5YeJu1x1MDAwN+tiiFxmKFx1MDAxZcK4XHUwMDE4OKKISuybuEtcdTAwMDJJXGLWSlBcdTAwMTOCXHUwMDEydeDB7kjxzlx1MDAxMy5K3f22+FdcdTAwMDZcdTAwMThRMr46PXu+XHUwMDFkNFx1MDAxZeVT+eih+dJcdTAwMTT5+OlWQVx1MDAwN4JYXHUwMDA0ptJUXHUwMDEx5fD20apGm7gssN3ALEeIIOFKqV6YXHUwMDAxXHUwMDE4IEFRXG7HsFx1MDAwMH1eXv/tVYhMoVx1MDAxZsPsXHUwMDA2XG5BJKPIt/Iw3bBcdTAwMWJIiFx1MDAxNlTtlor/l1x1MDAxOdNcZpmC2Z+Bi7NWazQsPTftXHUwMDE46OW8wl47Nmq/x+av+1x1MDAwMGOdasxdeu9nPECzU6MklnuLXG6o2SbAv10xlfpcdTAwMDb7XHJFv+zho4G5ZlG1e0fnpdvUQ/bp9HjUrM7Gylx1MDAwYnNcdTAwMDEuXG5KLUIlN0AlXHUwMDE4c2fDzuZ8hltgtHA4rlxiIcwnalx1MDAxMlx1MDAxMVx1MDAxM3ZcdKaNXHUwMDEywGmRr4eCaEtcdM04XHUwMDAy61Ihhlx1MDAwZtWYSXaKjnxcdTAwMTjKPGZnT0NcdTAwMTJ3XvJXyV2wr1x1MDAxY8ZDXHUwMDAxViXMgHvyXFzgtyH4inJhclx1MDAxYlDkXHUwMDE5XG5f7EnATCG3Ju3uSbi27+S0cCuyl6oxoU4p2WtcdTAwMWVcdTAwMWZ5VcvrSfhAq7SIQKtcdTAwMGUyQSE6XHJcblNAXHUwMDAwTFx1MDAwNCxMpXg/XHJcbt6UwFx1MDAxYZtcdTAwMWGOhEXvOVxiKeMuPlx1MDAxY2WCQqCUrl3umZ/f2VFQ7Lz027NGZZor5k5TnVxuvp1el7baoSTSokLOk42ldDdCmoOCQFx1MDAxZoBcdTAwMDJcdTAwMDZWISh8TJtcYlx1MDAwNeLoQytcdTAwMGXWT1x1MDAxMFx1MDAxOTBUQqysUlx0RYV/Q1x1MDAxM1x1MDAxMdioQGGqXHUwMDE1jj5cdTAwMTRhd1R4N/sv32zcvXdcdTAwMTb4jTOi8INi+bLeVrmrdLF6VUhWM+OH8cU2ys21RVx1MDAxMMaKgJ2rOHXVfDNvyNRcdTAwMTParNymgog2XHUwMDBlXHUwMDA3mEIm1Hcgwlfotlx1MDAxZMZqlkhcdTAwMTCKfcOMZGDNIKwk2HtqN5v5S3X7ZFSC+Vx1MDAxZdp2bFgvXHLnsfhvtfBNqP6c3Fx1MDAxYSb7s2b+n+1cdMiBqZdvzns76rR/VtKHr2axXHQooKGzf//HnodcdTAwMTL8iueOXHUwMDA2e85HOMfz1+nW6zFNqv7jeaGVKnqxJ4DIXHUwMDBihCyGhMJIUkrUelxug7CoUlx1MDAxY1x1MDAwMaXDmmPh9VkyymB42vSgXCKcMunamF6pXHUwMDAzXGJcYmWyXHUwMDFjXHUwMDA0XHUwMDEzXHUwMDE4k+VtXHUwMDBlXHUwMDBikeKy/NSKXHUwMDFm555KhelFPz25eC6Tk11cdTAwMTCpXHUwMDFlhshrXHR0XFxcYm9QwVx1MDAxYl5cdTAwMDVhkuDIlLmRkfP4r+qXOMhcdTAwMTfO7zSnmUnWjteqR8nc6Cax3X09U+BccthcdTAwMTRcXIuI/Fx1MDAwM06O5Fx1MDAxMOllb4btRMW+bXMuK2RcdTAwMWL/wEZlJUhGoaxcdTAwMDfpXHUwMDFmiE4xQ2UvmN1bhPxcdTAwMWJcdTAwMWJcdTAwMDbHXHUwMDAwSVx1MDAwZVxczt3pKKKQ5LBcdTAwMTLuXCLBUdZcdTAwMTdcZpTRtcs9s/M7e1x1MDAwN7rt25dR/vFevlxcPVx1MDAwZZ9cdTAwMTP3l1x1MDAwZtn8bFx1MDAxYlx1MDAwMiE5mFx1MDAwN8BcdTAwMDJcdTAwMTBFgPJkLfbI9P34XHUwMDAwXHUwMDEzMCVcdTAwMTZXXHUwMDA2ToBfIHeE87d3IDJYcEKgguJaSeJfYdBcdTAwMWIuuGhjaLoz7do1+UtQwSdRoWDveanBoLFGY6lfPU/OZuUzcSPluSCoaztn91t5XHTAbrZAfU2yMfxcdTAwMTBrgVx1MDAwNSbR8aOFXHUwMDFmkXlcdTAwMWRRrJHGUlx1MDAwYp/CRVx1MDAwN+smiEzJX7ZX8rdOpdo3pDBYx2FmsWlXKvdPyUFbVuLuO+3mLNa3u317XHUwMDAwv/9tj9sk/Fx1MDAxN1xyXHUwMDE5nlx1MDAwN+W3O7HSYNApO2Yo81xu+UCcTZlcdTAwMDCnbO97+f+ve9pogOax36+UX6unfHjckPd2uS6S2en2Llx1MDAwMa4sZSprIVxyhlx1MDAwMUer3dMpZ1x1MDAxNkdAJ4nEXGZx5Fx1MDAxN5hIXHUwMDAxkKjGgmo4XHUwMDBiqIqfT8AkVimmTZ1Uglx1MDAxOHXx0MOCn2qnmiBH7U5vlrmdlaaVo4Gukl3gp1x1MDAxNcYngEDjOaP+ZYy9lZOWXGJkXCJ6iY6+/OAnyPtcdTAwMWab7lx1MDAxYqc3T5dPp1lcdTAwMWFv509Ozu/G6eHZ63b39cyBXHUwMDE3N02hXHUwMDE55lbR3Z1cdTAwMDK9PkBMvYJTN62zfHbYPj5cdTAwMWa/JLdyXG5sVlfNo1DXg/RcbkSnmqFa/5lVXviXL8N4Q4VxIH9Kichtg7Ay7mK/UdY0XGJcdTAwMTTStcs90/M7u1x1MDAwNU5eMi+v9iTzdHmXXHUwMDFlOI1kvXt9tlV2gTKtd1x1MDAwNNFMmKJV7lx1MDAxZbBva7j+XHUwMDEwXHUwMDE0mEVM0Fx1MDAwMMiUXHUwMDE0TDD13XngXHUwMDBigKFcdTAwMWRcdTAwMDJcdTAwMTc4XHUwMDEwONN83o8zeHuFvcNcdTAwMDJIXHUwMDAw4lx1MDAxYfGoS6HtXHUwMDBlXHUwMDBiLsqw91Z+1Ib5xfMzbTr91Lk8I/bsUTcuXHUwMDFhua1yXHUwMDBihFRcdTAwMTaSptNcdTAwMWaiiniShVx1MDAxMLc0gplGXHUwMDEyXGZcdTAwMDBXu/tFkz8tLamBcEqpwXr7jlx1MDAxM/hcdTAwMTJt7myvzVx1MDAwMkuqXHUwMDAywlx1MDAwNHRgZCDov9BSR17X8PPKfOTiw2ZjfNR2eiN7yYQ9se2lSuUttr1e2vO4/ohcdTAwMWUtXHUwMDFhXHUwMDAwKbIj+/kpT4o4dfp4OTKdnnOPXlx1MDAwMFx0ZPbawkzTeVO+lVx1MDAwZZPzN2vKXHUwMDExaomlXHUwMDAyXHUwMDE0IS5quPBcIpqyR1hKzFx1MDAxOZhcdTAwMGVcdTAwMTSsXHUwMDAyL4pgTCxcdTAwMGWUXHUwMDA0XHUwMDA0S4HtoXiYPOX/JFQ5OmlcXNxVs7VcXPKscFN+PjnJXeV3QpV+XHUwMDE4Xs+plsDq/TOWZLBnkTBcdTAwMDR/XHUwMDEx3lx0WVx1MDAxNlx1MDAwZv2r+TeBXHUwMDExR8W/M2eDh+7LcaN7NGJcIqcy55NhxafLtlx1MDAxZv/eqFSKfF6pXHUwMDBlkn1Hp0Ah2DeQb0qEf1lcdTAwMGUsguP3uGagPny3QkJRSriLZEa5KVx1MDAxZiika5d7pud3Zt+DYuK+XmxN4jetsyx7Pjp7rlW3XG7ZV1RbsFx1MDAwNlx1MDAxMsaYXHUwMDE20lx1MDAxZHn1ts6KzZCAMbYo6DGiiGPJpcug/+bekcHCIMSyqoFUce67XYe9a+1cdTAwMDJcdTAwMTUwMzHZOvJWoLujwlrI/t5zcL9xRmNJdy6TTqbI5f1J1Vx1MDAxZU2ua8+6Vtkq4kZIZoHWamxik1x1MDAxNFx1MDAxNquuNa4/MqJcdTAwMTmxTC9sYYKcTN2tbyr+XHUwMDA1yj3cXrm5QFx1MDAxOGnNff3tKDjPVVx1MDAxMeOOc3dcYtxcdTAwMTfl3i52/Y3Ablx1MDAxObpcdTAwMGWc1q7s+a78L3jsaKBHVsfVy9ooNcxORqTdPS4mqzfbb8+bOmNcdTAwMTabdy0hRGC81mVcdTAwMWObcmNcdTAwMTjreay9ZsTVcnjh21x1MDAxN29cYrbJXHUwMDFieLiNXHUwMDA3Llx1MDAxZYuVXFzj+Zb1X18myVZKXHUwMDE3Wrmd0oYmYYg7lUzygFwiY1x1MDAxYnKFTatZqUz7ql1QaPHQPsS92k/Yw07zrJNcdTAwMTjdMUfa5YtqaVx1MDAxMsGGPHNIo5rq3b1cdTAwMTZH91x1MDAwNX3XmSRGvetcYu47SzmX1UHysXrXdTrXd1Und/Z0XHUwMDFjwX17rFgtN6qlVkXpVlJM1OxmYG93X4/MeLFcdTAwMWXMXGKk3CCyu1x1MDAwM6NVuz6aXiYvh9WHTjuVwU7i9dJnr9DrwPhcYlBcdTAwMTiPXHUwMDAyUFx1MDAwZdKHXHUwMDExXHUwMDFkloSpV4hgXCJcdTAwMTAnvj5cZlx1MDAxNuzDoGDSakkj74pcdTAwMTBayFx1MDAxN19HXHUwMDFiQVx1MDAxMCika5d7pud39mHo/CDdVrXbi8plyX5cdTAwMTndXHUwMDBmXHUwMDEyXHUwMDE3Krdccs0x3VxmLUm4YnNYQGS1XGKxyen7XGJcdTAwMTWoZWKWTdQy0VQzXHUwMDFmUDhYL0ZkwDBccmFjwFxcmsoy/kXSWaBcdTAwMWLD1L8niOmod1x1MDAxZHfHhWVcYkFvvynJylx1MDAwMKMhXHUwMDBm6W4lMz0tlU56beeu0Wok6fWlT90uXHUwMDFmhUZcblx1MDAxYoVcZlrm+cdcbo3wvD7hopLIt0LHfn6iU+hZiIVeIVjJkH9iL1x1MDAwYu5pYlxuTmDl7ni1R1xuXHUwMDFkq9iDct95tlx1MDAwN7FSrFl6ncU63Z8kfs/9XHUwMDBmW1x1MDAwZj5cdTAwMWEgOFx1MDAxMfZV/Ny56Jd7uI3tp66+XHUwMDEzPlx1MDAwZcwgL1x1MDAwMpXK4qZFkcKaXHUwMDEzurprScxcdTAwMDZcdTAwMDZcdTAwMDHZMls9RHi7nnAhLeNcdTAwMTQnnGhOXHUwMDEx8oFcdTAwMDKMqVx1MDAwNUeFXHUwMDA2e4uazjtLQDksaDg7XHUwMDFlJSbjWiY/XHUwMDFiXHUwMDFkd/WslEzfSLFcdTAwMDM0cFx1MDAxYyrCn3GNkH+RIXfDXHUwMDEzj1uTMVx1MDAwNeiwWzHixUNH61DwvCtcdTAwMGb0gHwxl7P9U0Q6fZKniZtp7e62cFlL5Vx1MDAxMoOryrDhVSxcdTAwMWZcIr1Zp1x1MDAxNPq0Tlx1MDAxZCSJjk5/QpBopVx1MDAxNJMrc+hSXHUwMDFmRYLUXHUwMDA3rjJcdTAwMDGYPGpcdTAwMGVcdTAwMWRavl1UMcrSfUFcIrp2tWdyfmdcbp22h627ZKtEe/r0XHUwMDE4p1x1MDAxYi1+KyZbWdxcdTAwMDJRiypufCrIxNCv9Vx1MDAxNmNsMyCAmWZ9x+B/NSqQXHUwMDEwXHUwMDA2N1BcdTAwMWashLdcdTAwMGawXHUwMDE5MVx0rNyHiTJWuow8b3d3VHBcdTAwMTnc1tlba+69N669XHUwMDAzjcaQxs93pCZ416nHnVx1MDAxNMm8XG6VzTpb6TfV1NLU6DdmpqPqWl6++siIpvItyeZnk1Cf/t9cdTAwMDdcdTAwMWJcdFx1MDAxMJl601x1MDAxMGs+ocp4Rvz7d1x1MDAwNKo3wfNcdTAwMTnmOOown0jU++ee9lwiO31el/69Kr3zplGxpjNcdTAwMTguN8etP9tHzUFcdTAwMDeO1u2+XHUwMDAzV7jKYvzUwd+Ain/1c0dcdTAwMDM+r5XWbJBOZu9fM0e3jnq1Z/GiTy2wnVg81diSkiCTXHUwMDE4XGaCzXyy/OBcZrNcdTAwMTeClel9il1bRoFcdTAwMDH9Ybqb/ydcdTAwMDFSXHUwMDA2pXLno4usqtGHs+vJpCxO49VdXHUwMDAwSYRi8Vx1MDAxOMHKIb3l9uf2YyBcclx1MDAwMWHQRO6Y9bd45mh37z2vyot3XGa5a0N+isRnKXHaqXS50p/NWkQ2W31U8amKXHUwMDE5lsQzSj6vUlx1MDAwN8nio9OfMMn02Fx1MDAwNGpiIf22vFxiXHIuwU9cdTAwMTSs6Vx1MDAxMqnIeXxYXHUwMDExd/HVKPfCg4R07WrP9PzOPN6uXHLj1VqH8fOy4IOa/dJ/TYmt7HxOQOs5R6DxQsi1iF+qxVx1MDAwN5BcdTAwMDBcdTAwMThuXHUwMDE5QCGmXHUwMDEyq0m1/K7A/1x1MDAwNbggQ2T5KCRMcoZ/hEwwKijMXHUwMDA0wELU+2a7g4LLzn+at5Xae7N8fZjRWNH66aZA5eORfVx1MDAxZk889UaPnXLm5HxrXG4vmJBcZjOmJVnLq2dcdTAwMWZcdTAwMWHQXHUwMDAyRoZMxDYxtTN9W/dcdTAwMWUsh49MtVWIXHUwMDE1n5h2XGKEeutaz3U70GLWJlwiQkhcdTAwMTS5iy5cbt32ctmGPfvnnLTGuiWnv5G5zlx1MDAxNe535OufeMZoUGV8PprQxlmaJu76pUFjkutcZkvZiLg5Z9qa51x1MDAwMGGGOeIuWr0kXHUwMDEy1Fx1MDAwMuOVICpcdJPuyk8ubs4spik32IM4XHUwMDAyln6gSFx1MDAxM0ePZ4lqvfCUcCadk1x1MDAxYjtcdTAwMTmfXHUwMDE10rsgzXFcYnJcdTAwMGVcdTAwMGJcdTAwMDLhps2nXHUwMDFm0vDAXFx7XCKkxEjtXHUwMDE2fbN45Ggj4D1vylx1MDAxZsdcItpgT7R1sXbcuXzQ/cqrc13OXHUwMDBmknXbq1dhuTnX6PMqdZDcPDr1XHTBzYXkXHUwMDFhiLl/qVxuXHUwMDE2mHenkWnKS2XU0aihXHUwMDA13MVAI2XmXHUwMDAxXCK6drVncn5nZp5I351ds+duu/JaL57bjkpOx9vtsHPKLIVcYpFcdTAwMDRjWFxi1+rccc4+QFx1MDAwNIXnxe+/d9i/XHUwMDEyXHUwMDE1XHUwMDEy24NcdTAwMDKXnFxuivxD1FHwXHUwMDBlu1x1MDAxMlxcXGLQmsi34HZGXHUwMDA1NzXf+zR7zyCjMaCfxatINou96UU801x1MDAxZk+vat34+dVWek01sZRQmlLNXHUwMDE5Wq+poz+0nVx1MDAwNTdcdTAwMTlt37T8S/U6ub1eY8BYIaS/rezdcF90taBSXGKtvsbj9lx1MDAwNTvrpsXbdvvJoG2/Iyff+Vx0o1x1MDAwMZTMo3aeMlx1MDAwM5rWx6/dq+bsNqHxjVx1MDAxN1De6M1cbqIwXHUwMDA0poCURFx1MDAxMIEwV65CZ/Muulx1MDAxNiNSIc3nOdjam/rCqVx1MDAwMkDBJpfNXHUwMDA0+/h2q6cwdsGwlkhcdTAwMDJkuVx1MDAxNqtDgJcwuJHyx40lpX2fSPLzm38vXHUwMDA3/069NdOc+qa4suBMNlx1MDAxM4g3789cdTAwMTl5iivYXHUwMDFme1CmK044tbCksCxcdTAwMWH6sJbiyoypXGZ6XHUwMDAw1q6At6d+atqm+1x1MDAwNYm9+XhcdTAwMDU+SnbiXHUwMDEyXHUwMDA2+21cdTAwMGXO3rJeKp1cdTAwMDLiPeXcjln3tZukuf6Tu09cdTAwMDCAZnlk3ieyKFx1MDAwN/pcdTAwMDSSgplkXHUwMDE0uUuW/aiVuvPJs2Bt0czUXFzBpiCrR9xWaFHQkNJcdTAwMDPS6NAjcdV02Gkxg2vK1mO/IcWRJYniJshMXHUwMDBiUzFw6Y5ejskr8utcdTAwMDRcZqDAmUPKU2c0XFx1kmyiY3bzuTPZyj8zzmRPbl7L90759pRlZ52evm7fboWycYK5ZVpcdTAwMTFcdTAwMTnxXHUwMDAz/srUeqtcImKZdsYgUkKaN+5julFsoiZhyphUXHUwMDFj+7UqXCKUWFhcYsQlSDin6MBqjIaB2vSnodYkilwirplvliFcdTAwMGZuXHUwMDFmiiVXXHUwMDAy4IZGTclcdTAwMThR2NXl4K/DWipBXG5cdGOKc6LZSlxiXHUwMDA1N/FcdTAwMDJEXHUwMDAw0ILJgVx1MDAxMdFcdTAwMWbeLVDszccr8L9cdTAwMDJqw+BcdTAwMWFcYonWXHUwMDFj9J5cYi6Fa1x1MDAxZtVccrZSKLCxNJ2XkGS7ga09TaSPM93LxlFqMJFOqdGud0dcdTAwMDGDXCLwy2BmXHUwMDEwY6a/NvZcdTAwMGVpXHUwMDBmsDZ/+TyW5yzzWJNcdTAwMTdOJ1uK5+O6v1x1MDAxZNYqIzDwYHPLlbjtj7fsXHUwMDEyXHUwMDEwT2p8rJhgXHJcdTAwMGK/XHUwMDA3aYFhY1PYXHUwMDAxmcBcdTAwMTSKsE/4OTNt47RmQlNcZoyJXHUwMDFlVpOmMEBcdTAwMWKwb1x1MDAxNFx1MDAwNmjNXHUwMDFlXHUwMDFlcFx1MDAwZt+MTVx1MDAxMZxyhmHmwd7jPGqSzIzlt5zxv1xuaFx1MDAwM8XUfDxcdTAwMDK6b8BcYlx1MDAwNlx1MDAxMUJMI2XiXHUwMDEwXHRCXitUWVKb2Fx1MDAwM1gr4Vx1MDAxY8XEbsDYr1x1MDAxZFx1MDAxZL+Q2svdef9l2knodKY3uPc3jLngiElcciSYc+aSrMWQtEVcdEdYKmDKgmK9XHUwMDBmQPl03Vx1MDAxNI/P9VFvTODnebtcXOzgwnbUX3NLXGLgXHUwMDAySmhJYEFepf7a0lgzwEgqgD5pL05cdTAwMWGTXHUwMDE23lx1MDAxOJFYUUMgydI9sFx1MDAwMEolLTBcdTAwMDMwiCesN1i4XHUwMDFjlt9AuVxulKefXHUwMDA2Siop8DrAPD/yXHUwMDFmXFwqT1x1MDAxYlx1MDAxYatE5L5ErFx1MDAxNFx1MDAxNXvA/YPF1Hw8XHUwMDAy+iuAMlx1MDAwNFmHsVx0omB6wLw1iOM11jTYcyb/XHUwMDA0XHUwMDBiSrVWO9qPUz6dVVx1MDAxMsVqM5GvJ5/qVze8N075XHUwMDBmXHTMRlx1MDAwZVx1MDAxM1xm6Fx1MDAwMFYtw9hcdTAwMGLd2kCp8SmC2GktuHdMv1x1MDAxZSf51XWx41x1MDAxNJON23Rueo+P7/Kdik99ID+cNIupMVx1MDAxOaVcIlxu0H+1keC8fIHEpiQ5UFx1MDAxNO2Kb1mGOVvI2PdcdTAwMDRcdTAwMTHMkOI+Uc6mXHUwMDFmOVx1MDAwM/tfKY1cdTAwMDRGlFx1MDAxZVY2UVx1MDAxOJw8+7xBqYFcdTAwMWZwUCy/zVSOXHUwMDAz61x1MDAwM3FgXGZcdTAwMDZBolx1MDAwZYVkgE0uI/WvXHUwMDAzyiA5NVx1MDAxZq+E/lxuoMynxnl7mpb6uPzcqFRcdTAwMWXGxeeTk1x1MDAwMIuSclhzTGSISTjmzO3jfYdKalFqXHUwMDEyx4D9MThcdTAwMDVTj4hshZV39Vo6OVx1MDAxYTdcdTAwMWOqulXV61/fquvbIJPSOJWVXHUwMDAwXHUwMDEyo7ArOGc5JrwyJu+Ifj1SXs9m95f0dVJ/rKhCJYczQ8XyWyElMG6LMoqkXHUwMDAwg55cYuraXn7r+UItpFx1MDAxOVx1MDAwNWNTc6De3u0kaZnC74JpbFx1MDAxYTTypW9iXHSVXHUwMDEyWVx1MDAxYZRGXHUwMDAydTBOJnRYoZ1hkPL880hcdKY/KFx1MDAxMvZth8y8TdpcdTAwMTY9V4F771xcfHkjUlx1MDAwMp/fXHUwMDAzkzJQTM3HI6C/XHUwMDAyKGfq9Oz5dtB4lE/lo4fmS1Pk46dcdTAwMDFAXHR0m1OhgSkwrlx1MDAxMPJxSTLT1Fx1MDAwNtRXalxuzFvSXHUwMDFkcbJZVO3e0XnpNvWQfTo9XHUwMDFlNauzsfJcdTAwMWRcdTAwMTRcdTAwMTBR0/tcdTAwMDFJyea/k9hxXHUwMDFmqNxcdTAwMDNszE3PXHUwMDEx7mVcdTAwMTP5dP2okL1Mn5dOXHUwMDEzPpE7PtgokbCk8WNcdTAwMTNcdCRNytWaN4JYXHUwMDEyXHUwMDE2XGIgINQ4Q7BcdTAwMTdcdTAwMWFh8Vx1MDAwMlxuQ4jWjElcdTAwMDFkxc+MRGCpXCIgOsY416C5h1x1MDAxNaJcdTAwMTdcdTAwMDZcdTAwMWMzn1x1MDAwNkfTjVpq6VtcdTAwMTWDukpcdTAwMWGtuyWZ5pxIwVwib1ZpKlx1MDAxMfz1KbTBcjo/6pHQX4GON5pcdTAwMGZkRlx1MDAxZiFUmPLZTeIx37mdXHUwMDA0oCNcdTAwMThh+s1xiuAvIz44tCPFPlx1MDAxZuFcdTAwMWPPX6dbr8c0qfqP54VWqlx1MDAxODRcbuBcdTAwMDRaUFx1MDAwMdxcdTAwMTnWUVfY916h4SBfOL/TnGYmWTteq1x1MDAxZSVzo5vEVmioXGKsksZIN33LpXuPZfbTjkSCXHUwMDE49y9cdTAwMTbcp0JcdTAwMTC1QIdcdTAwMDRcdTAwMTjwpoA21u5cdTAwMGWOS0ORW4yZXHUwMDEyQkqDZsjvPZpALMx+XHUwMDFhXHUwMDBiicLzXHUwMDFly77lXHUwMDA0VCCjXHUwMDE22pCj3ZprbkLCndv2RpuyXHUwMDEwKKTm41x1MDAxMc9fXHUwMDAxhNtDkILRIUJcdEZcboxcdTAwMTVcdTAwMTijn0XmlYetgPCx36+UX6unfHjckPd2uS6S2ak/fzZl8lx1MDAxMVx1MDAwNrtcdTAwMTB4NFx1MDAwN5NbMkx8XHUwMDFjjvtcdTAwMDCGmzu6blx1MDAwNENm9lo4rDfMXHUwMDA0qYlV1swktWC1XHUwMDE0jFx1MDAwMFx1MDAxZFx1MDAwM/qMvNnWhIGowbVm4ZpHSXjRUFxii1wiXHUwMDBldj83XHUwMDBlXHUwMDFlpr83YoLQ8Fwiglx1MDAxZGtBqVDEt1x1MDAxZVwi3dA6XHJcdTAwMDMgmqiZ/emLXHUwMDE47Y51kJiaj0dAf1x1MDAwNVx1MDAxZW6NRPGtoWhHTNzcwNw1XHUwMDEyaTFTNJNjXHR00fhcdTAwMWb2lSpvblx1MDAxMLVcdTAwMTlcdTAwMGaZZeBQIEW5qS+xgodcdTAwMThZilAu5ikwXHUwMDE0ZmJpXiyi0jEsrlJcIoVAnSSnPtahJlx1MDAxNleKakXg5O+o9FxyeJj7PFx1MDAxZSo6n1xufzzEgTvThvtcYjCRXCLPckEgN3tcdTAwMTDAI4nxXGJpYWpxIVx1MDAxN82ZXHUwMDFmNJ50XHTzJ0xcclVcdTAwMDJE8KPbXHUwMDA1XG69+XjE/Veg69bb3Gb3hnF4XHUwMDA1wHTBXHUwMDEyXHUwMDE2iLjehSsoXHUwMDFkXlx1MDAxM9XCxIpcdTAwMDMjllx1MDAxZXHbXG5oNzeZXFwxPpXZ6JZKXCKwfzkj2jumPYDZze1cdTAwMDM2waxxN1pcdTAwMTSWXHUwMDEwbcJ8lFx1MDAxNGtluDGzQPeoXHUwMDAwXHQ1fmJvy15T40dRQZWUlMLC7pP9Q5UlJFx1MDAxMlx1MDAxYVx0zk2e27fZXHUwMDE5XHUwMDA0s5efJ+FUalOK1Fx1MDAxN2W90ZNcdTAwMGKrXHUwMDEzmVpcdTAwMWSIRF7hx7RcdTAwMDZfitRfh7LAZEF5TclQ85wruTqAssT0XCLXioGxXHUwMDAxXHUwMDAz/+hugVwibz5cdTAwMWVh/1x1MDAxNSC7NZ7NTVhgJYxpXG7Lg0JcdTAwMDIhL8xqs1x1MDAxZM1AJLBSsI7s6Orc3IMntuZwXHUwMDA1S1ZJmFx1MDAwNiC51NWCZa9gdnOB140wa5pcdTAwMDbBO6dcdTAwMDJcYqFwb1jPUdZki4FoYliaNaz1XmNcdTAwMTZTWPkknIfhXHUwMDA39q+SiLW24Fx1MDAxMKgy8DxgKeywelxuhcHZq8+bsyb6RVOlfLMsdeDOXHUwMDBmXHUwMDA3faLYXfA+XCKgXHUwMDA1xNmDXHUwMDFlKIB+hCqT5lx1MDAwMlx1MDAxMktcdTAwMDH9VrNcIrFcdTAwMDLaJs1740DbsPhcdTAwMTBqg+V+ftQj8XtcdTAwMDW2yMJg1yvNwNTmXHUwMDE4XHUwMDEzxXwtWmlcdTAwMWFgKFxmXHUwMDFjV+pdM382V0pfxVpBXHUwMDEwXHUwMDE4tEgwQVx1MDAxMazOPlx1MDAxNq01r65v2lx1MDAxY1xumETsXHK6//XQu7l+10boxUJaxKx52qwy7uJjb9iLLVxyhq1cdTAwMDLqwU3KkDd2XHUwMDEz3pclgaIyKTgy2cF+Ni4npvhcdTAwMTaBuVx1MDAwNmnV/NuVXHUwMDEwhL35XGJcXFx0ILVCuVx1MDAxM1x0XFzYi1x1MDAwMrGXXHUwMDAwSlx1MDAwMFawyPeazFx1MDAwZY78612rXGbEXHUwMDE0jFxcJFx1MDAwNFZgTaylSVx1MDAxMtB8WLQ4ZURcdFNcdTAwMGXqQ6M5UOzNxyPwe1x1MDAwNr3cZLQwRpVcdTAwMDYrXHUwMDE2S1x1MDAxZuRcdTAwMTVcdTAwMTZcdTAwMDPkJVx1MDAxNKwxeCNs11x1MDAxZP3NhTDXoFx1MDAxN2FTXdk0jlx1MDAwNjOPXHUwMDBiz6DMO9WIYVx1MDAxM8hcdTAwMDGrKP3FVu/ffs7aj1K3W1x1MDAxOIKQL577x9ixJ8deYPqv6vxjKuTMx2hAyZ7r87//9u//XHUwMDA3UY6dpyJ9CollectionThe Collection is a set of(key, value)entries which can be iterated.Collection.IndexedIndexed Collections haveincrementing numeric keys.ListLists are ordered indexed dense collections,much like a JavaScript Array.StackStacks are indexed collections.**O(1) : * addition and removal from the front.Collection.KeyedKeyed Collections have discretekeys tied to each value.MapImmutable Map is an unordered Collection.Keyed of (key, value).**O(log32 N) : * gets and setsOrderedMapGuarantee that the iteration order of entrieswill be the order in which they were set().Collection.SetSet Collections only represent values.They have no associated keys or indices.SetA Collection of unique values.**O(log32 N) : * adds and hasOrderedSetGuarantee that the iteration order of valueswill be the order in which they were added.SeqSeq describes a lazy operation.Seq.IndexedSeq which represents an ordered indexed list of values.Also inherits Collection.Indexed.Seq_KeyedSeq which represents key*value pairs.Also inherits Collection.Keyed.Seq_SetSeq which represents a set of values.Also inherits Collection.Set.Immutable.js-Inheritance-cheatsheet.light.excalidraw.svg000066400000000000000000002101561522056416100345350ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/public eyJ2ZXJzaW9uIjoiMSIsImVuY29kaW5nIjoiYnN0cmluZyIsImNvbXByZXNzZWQiOnRydWUsImVuY29kZWQiOiJ4nO1dWXPiSpZ+719B1Lx0d1xcNLkv/WazeFx1MDAwMWNj8Dp3woFBgMy+gyf6v89JXFxcdTAwMDaBJIywXFyXakxVOKrQ4pTynC/Pd/Is//e3WOzHcNa1f/wr9sOelktNp9IvTX78Yb5cdTAwMWbb/YHTacMhMv//oDPql+dn1ofD7uBf//3fyyuscqf1dpXdtFt2eziA8/5cdTAwMDf+XHUwMDFmi/3f/CdcdTAwMWNxKubak0qngHhPObdj1n3tJmmu/5SYXzo/6X0wfbs8LLVrTXt5aFxu3zNCLCE4wUhcdTAwMTIstEZ8cXhcdTAwMDaH40xbWMJcdTAwMDElXHUwMDA1kkIpylx1MDAxNscnTmVYN7dA1GKaSYxcdTAwMTjDRHItXHUwMDE3p9Rtp1ZcdTAwMWbCOVpbSmlBXHUwMDA1p1RcdTAwMTCi6eKUtzH9K4ZcdTAwMTbfXGaG/U7DTnSanb5cdTAwMTn4f2Hb/FlcdTAwMGX7uVRu1PqdUbuyOGfYL7VcdTAwMDfdUlx1MDAxZt7T8ryq02xcdTAwMTaGs/nd4V3De/2x9jvufj5cdTAwMDFZ+z7oKviltXrbXHUwMDFlmLnAi2873VLZXHUwMDE5mreF0fIpzFxiu2eV5bTNvz3LXFxMz0mqXlK9U/zUr9dz9u3Nj5/H/3c59H6pZZ+Z6W2Pms3F1067YptJ+/HM1MnKsNqVn8NaOX9g2+ZcdTAwMWVYSUxhZuhybpeiiDle/zbXac/FkimMiV5e5FxmkiCMw/k9q6XmwF5OiVx1MDAxOUFqXVDdwupcdTAwMTLYp+umeHyuj3pjXHUwMDAyP8/b5WJcdTAwMDdcdTAwMTdcdTAwMTZPs1witKV+vzP5sTjy7z823Tc3PUe4l03k0/WjQvYyfV46TVxcRXDfzKN2njJcdTAwMDOa1sev3avm7Dah8U1cdTAwMDT37bFitdyollpcdTAwMTWlW0kxUbObgb3dfT1cdTAwMDIz6lZKb1x1MDAxM4MlU1x1MDAxNCaOSs7E4njTaTfWpaPZKTeWc/k314DXXHUwMDEwhubbR32iR7VWhqZY7qmQPVx1MDAxOaW9XGJcdTAwMDO/w1x1MDAwMy7IYvBRVIL2M6ZXsUVbklx1MDAxMoWoooRcIlx1MDAwNWf4QIuwKFx1MDAxM1x1MDAwMiCIaKUlWVxu41x1MDAwMlqWKvcxlCCEvlx1MDAxMkfw2ve/XHUwMDAzjtxujyOccpglQdfxwozYXHUwMDA1+msoQjDjmjCpl9NcdTAwMWJcdTAwMDJIolx1MDAxNPHF192Os45Ty3/FlvIz/8/i3//7h+/ZwTK6drlndpqlwTDRabWcITzXlVx1MDAxOZPnxVx1MDAwZkv94TFMl9OurVx1MDAxZrPblYAj86uOXGZk1O2SZ/LhusBj3U5zVptP6EeYkL16fq1Vqq/Huj55QVx1MDAwZqrxwouvXkxcdTAwMTja0+EqJnDBLUxBKDRcdTAwMTNSMLlcXHvf7FxyZlx1MDAxMVwihJCEaYIoZUuNf1x1MDAwN1x1MDAwNY0txbgkSFx1MDAxMERcdTAwMTTmS4tkgVx0hFkwXHUwMDBmmEvOpVwi0iUl3+bGTjChw1hcdTAwMWLczKwmXHUwMDFlRDCzr9e/fIdcdM5cYlZcdTAwMTip5VV/NUrMZVx1MDAxN55cdTAwMWWmvVx0xrN5gOVcdTAwMWLrtIdcdTAwMDXn1Z5DnyVcdTAwMTXCRCAmiHBcdTAwMDOhOSldajlNM1l85b5HTafWni+adtUlQ/BOhlx1MDAwZVCAxeGWU6m4TfYy3LJcdTAwMDTrbN87W52+U3PapWZxw7BLo2Hn2lx1MDAxZbxccnzYXHUwMDFm2e73Yp++q1x1MDAwZrZcYt+g+zeaXHUwMDBmZEZcdTAwMWYhVJjy2U3iMd+5nWyj+4xRXHUwMDBiXGJcdTAwMDBopMBcdTAwMDJWXHUwMDA117y8Kb9FXHTgXHUwMDAzR0hpylx1MDAxMFq+ynfdp1xcw1x1MDAxZIRkWmKNXHUwMDEwxj7KXHUwMDBmlIVxRMGwxXAzgJFv5f+c8lx1MDAxZoVQfsxcdTAwMTFQQO4lXHUwMDE1cFBcdTAwMDUyXHKsXGbXgFnfSfu/iFx1MDAxNGxhZFx1MDAwM6Vy8aNcdTAwMWSwpVi3Y0tFjTmDWCk2sIexTvXvXHJ79kdsXFxqjux//NmGR+079iA2qTvleqxcXGrHnu2YM7T7ZkDWb4VLUT9yNJiWXHUwMDFlkEaHXHUwMDFliaumw06LXHUwMDE5XFxTtlx1MDAxZW/tRYljrSyMXHUwMDA1XHUwMDAxko1AJDBVK8iGKbKEYoRoXHUwMDAy4Fx1MDAwN1PitWooopaSnEiwIcF08WM6XHUwMDE4SUtcYlgmXHUwMDExnERcdTAwMDThh+pFXHUwMDE5jmxRvamjauW5Pp45RyevJF/aXHUwMDA12ZJhvChcdTAwMWOmRXHu60UhhKx/u8A2wDVcbvSALWcrXCJsXHUwMDFiZ7InN6/le6d8e8qys05PX7dvt8O2PzbdN3/5PJbnLPNYk1x1MDAxN04nW4rn47r/1zpSPsZiYJhcdTAwMTIrt+7v7vBwXHUwMDFh54M7nErIW3yRT9mJWTGZy23j8PhcdTAwMTBcdTAwMDckjlx1MDAwMFx1MDAwN1x1MDAwZdLjXHUwMDExnc6H8HiA0nJNuZS+Oo+DdVx1MDAxZaipsWNp1D6P0FK++DpSn0egkK5d7Zme39nl0XygT4nqqHI5TOFOun/tTFx1MDAxZUblbWhPXHUwMDFjYMBcdTAwMDLKo1x0JVx1MDAxNJjPmmnAP4JcdTAwMDQspeWHXHUwMDAzru++1/+dsCBcdTAwMTVcdTAwMDJcbiQy1FX7Qlx1MDAwMVx1MDAxNoHURiqw11x1MDAwMFx1MDAwYvZcdTAwMDdcdLx+XHLrzLxcdTAwMTK74ssjXGJa+XZcdTAwMWZcdTAwMWNcdTAwMWHe8UZDXHUwMDAyZjeXfJqV8XaqNWv3atWjTiu+lVMzXHUwMDBl0mFpo+FcYqgsQ1x1MDAwNC/Z1tu6rywmKHBjyrSGeVtiwLuSXHUwMDEzpi0u4MNcdTAwMDXTXGYztDxlofA8zMr/rfA+XG6fXHUwMDBlo/BcdTAwMDDXXHUwMDEyXHUwMDEx6efKwDp47edcdTAwMTJrRvZo6X9X+J9a42Lfg1i9NLb/bDvtcn8+XGJYWuGWLbvvlGPAxlx1MDAwN/6uhb2BhM89UTSgYU9cdTAwMTPp40z3snGUXHUwMDFhTKRTarTr3dH2nlx1MDAwM4mlxTjHSFCkwVx1MDAwNlg6NM1cdTAwMWJljFtcZlxmTaRApCRiPtFcdTAwMTdcdTAwMWNcdTAwMWJTXGYhY6eaRcpcdTAwMGJcdTAwMWJcdTAwMTiZ6Fx1MDAwYqKRlFx1MDAxNCMsxKH6XHKSre5N5+iB5ujTq9N5iJfsJNa7wMhZXHUwMDE4v4GkgjGNld++qduHs4YjYChyJMVOMLJ45Gi9XHUwMDA2njflXHUwMDAxKcA9gohbj3Zn4SVbXHUwMDFjPVxcVIbNcWKUv1x1MDAxZD1d9/Csulx1MDAxNVx1MDAwYv9Ap5T4vE5cdTAwMWQkXHUwMDA3j05/QnBwgoBowjRiz9bh3GpiQfpcdTAwMDOUSmghXHTeRYGiXHUwMDE0cVx1MDAxN9WMMuwgSEbXrvbMzu9MwafxqyMtZ/e1VqNber2oXFzdtdHNVlx1MDAwNjqAgUW5JkJcdTAwMDFcdTAwMWJcdTAwMTN0lYMzjj5AXHUwMDA0KoGkU0pcdTAwMTnY8Fxcce1cdTAwMTdzcKhsPDJUOFx1MDAwZlx1MDAwM1xumkizXHUwMDBm4lx1MDAwN1xuPkvtXHUwMDAyXHUwMDE0hNln5DLqKIPdQeHdOM86g+F+XHUwMDFi26sjjMZ4frl3XHUwMDFlK9Pm7fPpMVx1MDAxZue7valqXFx1t1JoUFNLXHUwMDAx+jHQWs7YWihcdTAwMDHTXHUwMDFm2s1EzPm2Qlx1MDAxYSmC6FL2v+l2ZFx1MDAxYZ1cdEW3XHSVlCG/sCGsPF63XHUwMDA13SZSU8053U+VXHUwMDFlxGC+Y51+xe5cdTAwMDNPdX7y1YrdXHUwMDFl2LHykrX+8We7NSrXY02nYcdKsfPSuFQo953uMFx1MDAwNqtmabbnNPxLXHUwMDFlNFx1MDAxYYDp146OX0jt5e68/zLtJHQ601x1MDAxYtxvz85cdTAwMTlQZ6Ioh0WDcYlcdTAwMTBeTY8gWltmX1ggXHUwMDA1hlx1MDAwNXenPrzjXGbHylx1MDAwMnxcdTAwMDLRRowyslxcr5b0XHUwMDFj2IrgXHUwMDFjXGY6rbngwpVicViw0zs5LTWehuzoMvEwvOm1Zlx1MDAwNZFcdTAwMWLtXHUwMDAyO7lcdTAwMTD0nEtcdTAwMTObrHxhh1x1MDAwNEc1SyEpXHUwMDE43mIndrF45Gg33z1vyotpxmyKKCtg2EpldeJcdTAwMTI9XHJcdTAwMWa7rfGg+pStqZRXs3zo+Vx1MDAwN0pcdTAwMDVrwOeV6iD5eXRcblx1MDAxNGaPXFwoXHUwMDAxQ6P+/FxcXHUwMDA1+8nB8OKUgVx1MDAxZUW9cFx1MDAxYiGXIYTcRUQjJOhBMrp2sWd2fmd+Xlx1MDAxOFx1MDAxN89T1eRNq5OA5T7/rFSq1NxyXHUwMDAzTVpgq1x1MDAwYqBmXHUwMDE0YUFWXXbwXG4/hFx1MDAwNG5Js30mXHUwMDE4JpRcdTAwMDO4+OyfXHUwMDFkLEWPXGZcdTAwMTguw8TOXHUwMDEwTVx1MDAwNXIzK3e8XFxwLDAhjDDszkT9q3Hh3aAvXGZBXHUwMDA29ttcdTAwMTRfXHUwMDFiYjRG9PHls1x1MDAxY+SqlXrTOW20e7RzRp9vt1JrKsFApoJcdTAwMTLGXHTVXG7M21W95shCTGlcIlxi4sDjl0KxdMUr39iXg+Xmkany1faqXGa6SExcYovvXG7vXHKIWWiyZvOQp+ipeTSa/EZZ36mqi6Raf7b/+c/Lv+N/xP5cdTAwMTX7Z6xUqTjzUPVSu1x1MDAxMuvbrc641IxV+51WbFi3zT/awz3n51/3tNHgy5RPZ5VEsdpM5OvJp/rVXHLvjX2oRFx1MDAwMEknWFtcYklBTVx1MDAxNiY3gbcrXHUwMDE4g4W0gFJcdTAwMTCpqORUoqW5uXDuM2xhSbRiSGAjYl64wWiprYeFNyORaXVoNVW9nJReXHUwMDFm24mckzie7oI3hTB75liZSFx1MDAwNX9nICGB7n3MMUWCYlx1MDAxZXms/VdcdTAwMTUt4FfXxY5TTDZu07npPT6+y3cqKrr8JElJmPykXHI62j0j2Vx1MDAwN9GfNq5RIVUt1Fx1MDAwYrXGZXZcdTAwMWK6T7CwNCVcdTAwMDJcdCa5sVx1MDAwMuiKelx1MDAxMqRW1dNPP7llSlx1MDAwNFBcdTAwMDVMikg/Vz2xXHUwMDE0I1hcIs2AKsBcdTAwMWZsx3FcdTAwMTg32n+MXHUwMDBiIDp1XHLjXHUwMDAyXHUwMDAwXHUwMDA0JVxi+2/Rb4iNXHUwMDE1gNVcdTAwMTJhXHUwMDEyeWWAsHLvorpRRslcdTAwMDfJrfnEfUV2eUvPlP3OfoFystlcdTAwMTS0VGhVaCenek93qpuytyFcdTAwMTBcdTAwMTTQQZiyQopcdTAwMDNNcG/svoXVklx1MDAwZpZ2WFx0LG027iUzsbdUfofRf1x1MDAwMVZcdTAwMTTDeFx1MDAwYrXWNKBcdTAwMTaRVutfLoqIXHUwMDEwLVx1MDAwNVx1MDAxOGhRXHUwMDA38+yOXHUwMDE0PlH0XHUwMDE5e/ZcdTAwMWLF0K+NNlx1MDAxYUs+n1x1MDAxYeftaVrq4/Jzo1J5XHUwMDE4XHUwMDE3n09OtlF0QoUlYVx1MDAwNSHcpPabnOVVK1x1MDAwMX9oxCNu+Wn3wTpcblwi0+6b7bWbIK2UWdF8XHJcdTAwMDHXVKzvplx1MDAxMYxBXHUwMDFideRm+5ea17BmS1x1MDAxN1wi7Vx1MDAwMFx1MDAxZXNcdTAwMWT0RK/HKs6g3IeH/7NtXCLWY0NcdTAwMDdOXHUwMDFhdmJ2qVxcf0uP33N/Q1x1MDAwNI9cdTAwMTVcclx1MDAxY93Va+nkaNxwqOpWVa9/fauufVx1MDAxY5dBu/+Kgo1GMSxcdTAwMTFgP1xirFaTeZmgXHUwMDE2o0pcdTAwMDODQYhcdTAwMTJGvZl7glx1MDAxM8tYXHUwMDFlUlxiRpREPmGD67v/5FDLldDu621iVKXt4aQpcsP8hPSPXHUwMDFiu+DVfajgfCFcdTAwMTVGQvk6XHUwMDFheLBrk4PlIEw+11x1MDAxZSHWXHUwMDFmm+57PZvdX9LXSf2xolxulVx1MDAxY85cZlx1MDAxNctHhYTGvY+pW0V3dzSMXjLVXFy3N233eqmX19agLcrxK6/O+sRcdTAwMTWAujKMMFx1MDAwMlBGSrn1cY6CiH2srthcdTAwMDJZXHUwMDAwU0Jpznxz74G1KalghSNcdTAwMDRcdTAwMDN9ZaEqmf7HeFx1MDAxOaLT1Vx1MDAxMF5cdTAwMDZtdtNpQFx1MDAxZVxyXHUwMDBiVlWPb1wiqny8kDLv4s1cdTAwMTE6XHUwMDE5XHUwMDAyZdZ84l5xXd7PM12/s4fh3n44Kp2f6MvE8XjSQeVCecR721x1MDAxMFx1MDAwZsyZXHUwMDA1b49cdTAwMTijlWvB6WpBQibUR6hB5YeJu1x1MDAwN+tiiFxmKFx1MDAxZcK4XHUwMDE4OKKISuybuEtcdTAwMDJJXGLWSlBcdTAwMTOCXHUwMDEydeDB7kjxzlx1MDAxMy5K3f22+FdcdTAwMDZcdTAwMThRMr46PXu+XHUwMDFkNFx1MDAxZeVT+eih+dJcdTAwMTT5+OlWQVx1MDAwN4JYXHUwMDA0ptJUXHUwMDEx5fD20apGm7gssN3ALEeIIOFKqV6YXHUwMDAxXHUwMDE4IEFRXG7HsFx1MDAwMH1eXv/tVYhMoVx1MDAxZsPsXHUwMDA2XG5BJKPIt/Iw3bBcdTAwMWJIiFx1MDAxNlTtlor/l1x1MDAxOdNcZpmC2Z+Bi7NWazQsPTftXHUwMDE46OW8wl47Nmq/x+av+1x1MDAwMGOdasxdeu9nPECzU6MklnuLXG6o2SbAv10xlfpcdTAwMDb7XHJFv+zho4G5ZlG1e0fnpdvUQ/bp9HjUrM7Gylx1MDAwYnNcdTAwMDEuXG5KLUIlN0AlXHUwMDE4c2fDzuZ8hltgtHA4rlxiIcwnalx1MDAxMlx1MDAxMVx1MDAxM3ZcdKaNXHUwMDEywGmRr4eCaEtcdM04XHUwMDAy61Ihhlx1MDAwZtWYSXaKjnxcdTAwMTjKPGZnT0NcdTAwMTJ3XvJXyV2wr1x1MDAxY8ZDXHUwMDAxViXMgHvyXFzgtyH4inJhclx1MDAxYlDkXHUwMDE5XG5f7EnATCG3Ju3uSbi27+S0cCuyl6oxoU4p2WtcdTAwMWVcdTAwMWZ5VcvrSfhAq7SIQKtcdTAwMGUyQSE6XHJcblNAXHUwMDAwTFx1MDAwNCxMpXg/XHJcbt6UwFx1MDAxYZtcdTAwMWGOhEXvOVxiKeMuPlx1MDAxY2WCQqCUrl3umZ/f2VFQ7Lz027NGZZor5k5TnVxuvp1el7baoSTSokLOk42ldDdCmoOCQFx1MDAxZoBcdTAwMDJcdTAwMDZWISh8TJtcYlx1MDAwNeLoQytcdTAwMGXWT1x1MDAxMFx1MDAxOTBUQqysUlx0RYV/Q1x1MDAxM1x1MDAxMdioQGGqXHUwMDE1jj5cdTAwMTRhd1R4N/sv32zcvXdcdTAwMTb4jTOi8INi+bLeVrmrdLF6VUhWM+OH8cU2ys21RVx1MDAxMMaKgJ2rOHXVfDNvyNRcdTAwMTParNymgog2XHUwMDBlXHUwMDA3mEIm1Hcgwlfotlx1MDAxZMZqlkhcdTAwMTCKfcOMZGDNIKwk2HtqN5v5S3X7ZFSC+Vx1MDAxZdp2bFgvXHLnsfhvtfBNqP6c3Fx1MDAxYSb7s2b+n+1cdMiBqZdvzns76rR/VtKHr2axXHQooKGzf//HnodcdTAwMTL8iueOXHUwMDA2e85HOMfz1+nW6zFNqv7jeaGVKnqxJ4DIXHUwMDBihCyGhMJIUkrUelxug7CoUlx1MDAxY1x1MDAwMaXDmmPh9VkyymB42vSgXCKcMunamF6pXHUwMDAzXGJcYmWyXHUwMDFjXHUwMDA0XHUwMDEzXHUwMDE4k+VtXHUwMDBlXHUwMDBikeKy/NSKXHUwMDFm555KhelFPz25eC6Tk11cdTAwMTCpXHUwMDFlhshrXHR0XFxcYm9QwVx1MDAxYl5cdTAwMDVhkuDIlLmRkfP4r+qXOMhcdTAwMTfO7zSnmUnWjteqR8nc6Cax3X09U+BccthcdTAwMTRcXIuI/Fx1MDAwM06O5Fx1MDAxMOllb4btRMW+bXMuK2RcdTAwMWL/wEZlJUhGoaxcdTAwMDfpXHUwMDFmiE4xQ2UvmN1bhPxcdTAwMWJcdTAwMWJcdTAwMDbHXHUwMDAwSVx1MDAwZVxczt3pKKKQ5LBcdTAwMTLuXCLBUdZcdTAwMTdcZpTRtcs9s/M7e1x1MDAwN7rt25dR/vFevlxcPVx1MDAwZZ9cdTAwMTP3l1x1MDAwZtn8bFx1MDAxYlx1MDAwMiE5mFx1MDAwN8BcdTAwMDJcdTAwMTBFgPJkLfbI9P34XHUwMDAwXHUwMDEzMCVcdTAwMTZXXHUwMDA2ToBfIHeE87d3IDJYcEKgguJaSeJfYdBcdTAwMWIuuGhjaLoz7do1+UtQwSdRoWDveanBoLFGY6lfPU/OZuUzcSPluSCoaztn91t5XHTAbrZAfU2yMfxcdTAwMTBrgVx1MDAwNSbR8aOFXHUwMDFmkXlcdTAwMWRRrJHGUlx1MDAwYp/CRVx1MDAwN+smiEzJX7ZX8rdOpdo3pDBYx2FmsWlXKvdPyUFbVuLuO+3mLNa3u317XHUwMDAwv/9tj9sk/Fx1MDAxN1xyXHUwMDE5nlx1MDAwN+W3O7HSYNApO2Yo81xu+UCcTZlcdTAwMDCnbO97+f+ve9pogOax36+UX6unfHjckPd2uS6S2en2Llx1MDAwMa4sZSprIVxyhlx1MDAwMUer3dMpZ1x1MDAxNkdAJ4nEXGZx5Fx1MDAxN5hIXHUwMDAxkKjGgmo4XHUwMDBiqIqfT8AkVimmTZ1Uglx1MDAxOHXx0MOCn2qnmiBH7U5vlrmdlaaVo4Gukl3gp1x1MDAxNcYngEDjOaP+ZYy9lZOWXGJkXCJ6iY6+/OAnyPtcdTAwMWab7lx1MDAxYqc3T5dPp1lcdTAwMWFv509Ozu/G6eHZ63b39cyBXHUwMDE3N02hXHUwMDE55lbR3Z1cdTAwMDK9PkBMvYJTN62zfHbYPj5cdTAwMWa/JLdyXG5sVlfNo1DXg/RcbkSnmqFa/5lVXviXL8N4Q4VxIH9Kichtg7Ay7mK/UdY0XGJcdTAwMTTStcs90/M7u1x1MDAwNU5eMi+v9iTzdHmXXHUwMDFlOI1kvXt9tlV2gTKtd1x1MDAwNNFMmKJV7lx1MDAxZbBva7j+XHUwMDEwXHUwMDE0mEVM0Fx1MDAwMMiUXHUwMDE0TDD13XngXHUwMDBigKFcdTAwMWRcdTAwMDJcdTAwMTc4XHUwMDEwONN83o8zeHuFvcNcdTAwMDJIXHUwMDAw4lx1MDAxYfGoS6HtXHUwMDBlXHUwMDBiLsqw91Z+1Ib5xfMzbTr91Lk8I/bsUTcuXHUwMDFhua1yXHUwMDBihFRcdTAwMTaSptNcdTAwMWaiiniShVx1MDAxMLc0gplGXHUwMDEyXGZcdTAwMDBXu/tFkz8tLamBcEqpwXr7jlx1MDAxM/hcdTAwMTJt7myvzVx1MDAwMkuqXHUwMDAywlx1MDAwNHRgZCDov9BSR17X8PPKfOTiw2ZjfNR2eiN7yYQ9se2lSuUttr1e2vO4/ohcdTAwMWUtXHUwMDFhXHUwMDAwKbIj+/kpT4o4dfp4OTKdnnOPXlx1MDAwMFx0ZPbawkzTeVO+lVx1MDAwZZPzN2vKXHUwMDExaomlXHUwMDAyXHUwMDE0IS5quPBcIpqyR1hKzFx1MDAxOZhcdTAwMGVcdTAwMTSsXHUwMDAyL4pgTCxcdTAwMGWUXHUwMDA0XHUwMDA0S4HtoXiYPOX/JFQ5OmlcXNxVs7VcXPKscFN+PjnJXeV3QpV+XHUwMDE4Xs+plsDq/TOWZLBnkTBcdTAwMDR/XHUwMDEx3lx0WVx1MDAxNlx1MDAwZv2r+TeBXHUwMDExR8W/M2eDh+7LcaN7NGJcIqcy55NhxafLtlx1MDAxZv/eqFSKfF6pXHUwMDBlkn1Hp0Ah2DeQb0qEf1lcdTAwMGUsguP3uGagPny3QkJRSriLZEa5KVx1MDAxZiika5d7pud3Zt+DYuK+XmxN4jetsyx7Pjp7rlW3XG7ZV1RbsFx1MDAwNlx1MDAxMsaYXHUwMDE20lx1MDAxZHn1ts6KzZCAMbYo6DGiiGPJpcug/+bekcHCIMSyqoFUce67XYe9a+1cdTAwMDJcdTAwMTUwMzHZOvJWoLujwlrI/t5zcL9xRmNJdy6TTqbI5f1J1Vx1MDAxZU2ua8+6Vtkq4kZIZoHWamxik1x1MDAxNFx1MDAxNquuNa4/MqJcdTAwMTmxTC9sYYKcTN2tbyr+XHUwMDA1yj3cXrm5QFx1MDAxOGnNff3tKDjPVVx1MDAxMeOOc3dcYtxcdTAwMTfl3i52/Y3Ablx1MDAxObpcdTAwMGWc1q7s+a78L3jsaKBHVsfVy9ooNcxORqTdPS4mqzfbb8+bOmNcdTAwMTabdy0hRGC81mVcdTAwMWObcmNcdTAwMTjreay9ZsTVcnjh21x1MDAxN29cYrbJXHUwMDFieLiNXHUwMDA3Llx1MDAxZYuVXFzj+Zb1X18myVZKXHUwMDE3Wrmd0oYmYYg7lUzygFwiY1x1MDAxYnKFTatZqUz7ql1QaPHQPsS92k/Yw07zrJNcdTAwMTjdMUfa5YtqaVx1MDAxMsGGPHNIo5rq3b1cdTAwMTZH91x1MDAwNX3XmSRGvetcYu47SzmX1UHysXrXdTrXd1Und/Z0XHUwMDFjwX17rFgtN6qlVkXpVlJM1OxmYG93X4/MeLFcdTAwMWXMXGKk3CCyu1x1MDAwM6NVuz6aXiYvh9WHTjuVwU7i9dJnr9DrwPhcYlBcdTAwMTiPXHUwMDAyUFx1MDAwZdKHXHUwMDExXHUwMDFkloSpV4hgXCJcdTAwMTAnvj5cZlx1MDAxNuzDoGDSakkj74pcdTAwMTBayFx1MDAxN19HXHUwMDFiQVx1MDAxMCika5d7pud39mHo/CDdVrXbi8plyX5cdTAwMTndXHUwMDBmXHUwMDEyXHUwMDE3Krdccs0x3VxmLUm4YnNYQGS1XGKxyen7XGJcdTAwMTWoZWKWTdQy0VQzXHUwMDFmUDhYL0ZkwDBccmFjwFxcmsoy/kXSWaBcdTAwMWLD1L8niOmod1x1MDAxZHfHhWVcYkFvvynJylx1MDAwMKMhXHUwMDBm6W4lMz0tlU56beeu0Wok6fWlT90uXHUwMDFmhUZcblx1MDAxYoVcZlrm+cdcbo3wvD7hopLIt0LHfn6iU+hZiIVeIVjJkH9iL1x1MDAwYu5pYlxuTmDl7ni1R1xuXHUwMDFkq9iDct95tlx1MDAwN7FSrFl6ncU63Z8kfs/9XHUwMDBmW1x1MDAwZj5cdTAwMWEgOFx1MDAxMfZV/Ny56Jd7uI3tp66+XHUwMDEzPlx1MDAwZcwgL1x1MDAwMpXK4qZFkcKaXHUwMDEzurprScxcdTAwMDZcdTAwMDZcdTAwMDHZMls9RHi7nnAhLeNcdTAwMTQnnGhOXHUwMDEx8oFcdTAwMDKMqVx1MDAwNUeFXHUwMDA2e4uazjtLQDksaDg7XHUwMDFlJSbjWiY/XHUwMDFiXHUwMDFkd/WslEzfSLFcdTAwMDM0cFx1MDAxYyrCn3GNkH+RIXfDXHUwMDEzj1uTMVx1MDAwNeiwWzHixUNH61DwvCtcdTAwMGb0gHwxl7P9U0Q6fZKniZtp7e62cFlL5Vx1MDAxMoOryrDhVSxcdTAwMWZcIr1Zp1x1MDAxNPq0Tlx1MDAxZCSJjk5/QpBopVx1MDAxNJMrc+hSXHUwMDFmRYLUXHUwMDA3rjJcdTAwMDGYPGpcdTAwMGVcdTAwMWRavl1UMcrSfUFcIrp2tWdyfmdcbp22h627ZKtEe/r0XHUwMDE4p1x1MDAxYi1+KyZbWdxcdTAwMDJRiypufCrIxNCv9Vx1MDAxNmNsMyCAmWZ9x+B/NSqQXHUwMDEwXHUwMDA2N1BcdTAwMWashLdcdTAwMGawXHUwMDE5MVx0rNyHiTJWuow8b3d3VHBcdTAwMTnc1tlba+69N669XHUwMDAzjcaQxs93pCZ416nHnVx1MDAxNMm8XG6VzTpb6TfV1NLU6DdmpqPqWl6++siIpvItyeZnk1Cf/t9cdTAwMDdcdTAwMWJcdFx1MDAxMJl601x1MDAxMGs+ocp4Rvz7d1x1MDAwNKo3wfNcdTAwMTnmOOown0jU++ee9lwiO31el/69Kr3zplGxpjNcdTAwMTguN8etP9tHzUFcdTAwMDeO1u2+XHUwMDAzV7jKYvzUwd+Ain/1c0dcdTAwMDM+r5XWbJBOZu9fM0e3jnq1Z/GiTy2wnVg81diSkiCTXHUwMDE4XGaCzXyy/OBcZrNcdTAwMTeClel9il1bRoFcdTAwMDH9Ybqb/ydcdTAwMDFSXHUwMDA2pXLno4usqtGHs+vJpCxO49VdXHUwMDAwSYRi8Vx1MDAxOMHKIb3l9uf2YyBcclx1MDAwMWHQRO6Y9bd45mh37z2vyot3XGa5a0N+isRnKXHaqXS50p/NWkQ2W31U8amKXHUwMDE5lsQzSj6vUlx1MDAwN8nio9OfMMn02Fx1MDAwNGpiIf22vFxiXHIuwU9cdTAwMTSs6Vx1MDAxMqnIeXxYXHUwMDExd/HVKPfCg4R07WrP9PzOPN6uXHLj1VqH8fOy4IOa/dJ/TYmt7HxOQOs5R6DxQsi1iF+qxVx1MDAwN5BcdTAwMDBcdTAwMThuXHUwMDE5QCGmXHUwMDEyq0m1/K7A/1x1MDAwNbggQ2T5KCRMcoZ/hEwwKijMXHUwMDA0wELU+2a7g4LLzn+at5Xae7N8fZjRWNH66aZA5eORfVx1MDAxZk889UaPnXLm5HxrXG4vmJBcZjOmJVnLq2dcdTAwMWZcdTAwMWHQXHUwMDAyRoZMxDYxtTN9W/dcdTAwMWUsh49MtVWIXHUwMDE1n5h2XGKEeutaz3U70GLWJlwiQkhcdTAwMTS5iy5cbt32ctmGPfvnnLTGuiWnv5G5zlx1MDAxNe535OufeMZoUGV8PprQxlmaJu76pUFjkutcZkvZiLg5Z9qa51x1MDAwMGGGOeIuWr0kXHUwMDEy1Fx1MDAwMuOVICpcdJPuyk8ubs4spik32IM4XHUwMDAyln6gSFx1MDAxM0ePZ4lqvfCUcCadk1x1MDAxYjtcdTAwMTmfXHUwMDE10rsgzXFcYnJcdTAwMGVcdTAwMGJcdTAwMDLhps2nXHUwMDFm0vDAXFx7XCKkxEjtXHUwMDE2fbN45Ggj4D1vylx1MDAxZsdcItpgT7R1sXbcuXzQ/cqrc13OXHUwMDBmknXbq1dhuTnX6PMqdZDcPDr1XHTBzYXkXHUwMDFhiLl/qVxuXHUwMDE2mHenkWnKS2XU0aihXHUwMDA13MVAI2XmXHUwMDAxXCK6drVncn5nZp5I351ds+duu/JaL57bjkpOx9vtsHPKLIVcYpFcdTAwMDRjWFxi1+rccc4+QFx1MDAwNIXnxe+/d9i/XHUwMDEyXHUwMDE1XHUwMDEy24NcdTAwMDKXnFxuivxD1FHwXHUwMDBlu1x1MDAxMlxcXGLQmsi34HZGXHUwMDA1NzXf+zR7zyCjMaCfxatINou96UU801x1MDAxZk+vat34+dVWek01sZRQmlLNXHUwMDE5Wq+poz+0nVx1MDAwNTdcdTAwMTlt37T8S/U6ub1eY8BYIaS/rezdcF90taBSXGKtvsbj9lx1MDAwNTvrpsXbdvvJoG2/Iyff+Vx0o1x1MDAwMZTMo3aeMlx1MDAwM5rWx6/dq+bsNqHxjVx1MDAxN1De6M1cbqIwXHUwMDA0poCURFx1MDAxMIEwV65CZ/Muulx1MDAxNiNSIc3nOdjam/rCqVx1MDAwMkDBJpfNXHUwMDA0+/h2q6cwdsGwlkhcdTAwMDJkuVx1MDAxNqtDgJcwuJHyx40lpX2fSPLzm38vXHUwMDA3/069NdOc+qa4suBMNlx1MDAxM4g3789cdTAwMTl5iivYXHUwMDFme1CmK044tbCksCxcdTAwMWH6sJbiyoypXGZ6XHUwMDAw1q6At6d+atqm+1x1MDAwNYm9+XhcdTAwMDU+SnbiXHUwMDEyXHUwMDA2+21cdTAwMGXO3rJeKp1cdTAwMDLiPeXcjln3tZukuf6Tu09cdTAwMDCAZnlk3ieyKFx1MDAwN/pcdTAwMDSSgplkXHUwMDE0uUuW/aiVuvPJs2Bt0czUXFzBpiCrR9xWaFHQkNJcdTAwMDPS6NAjcdV02Gkxg2vK1mO/IcWRJYniJshMXHUwMDBiUzFw6Y5ejskr8utcdTAwMDRcZqDAmUPKU2c0XFx1kmyiY3bzuTPZyj8zzmRPbl7L90759pRlZ52evm7fboWycYK5ZVpcdTAwMTFcdTAwMTnxXHUwMDAz/srUeqtcImKZdsYgUkKaN+5julFsoiZhyphUXHUwMDFj+7UqXCKUWFhcYsQlSDin6MBqjIaB2vSnodYkilwirplvliFcdTAwMGZuXHUwMDFmiiVXXHUwMDAy4IZGTclcdTAwMThR2NXl4K/DWipBXG5cdGOKc6LZSlxiXHUwMDA1N/FcdTAwMDJEXHUwMDAw0ILJgVx1MDAxMdFcdTAwMWbeLVDszccr8L9cdTAwMDJqw+BcdTAwMWFcYonWXHUwMDFj9J5cYi6Fa1x1MDAxZtVccrZSKLCxNJ2XkGS7ga09TaSPM93LxlFqMJFOqdGud0dcdTAwMDGDXCLwy2BmXHUwMDEwY6a/NvZcdTAwMGVpXHUwMDBmsDZ/+TyW5yzzWJNcdTAwMTdOJ1uK5+O6v1x1MDAxZNYqIzDwYHPLlbjtj7fsXHUwMDEyXHUwMDEwT2p8rJhgXHJcdTAwMGK/XHUwMDA3aYFhY1PYXHUwMDAxmcBcdTAwMTSKsE/4OTNt47RmQlNcZoyJXHUwMDFlVpOmMEBcdTAwMWKwb1x1MDAxNFx1MDAwNmjNXHUwMDFlXHUwMDFlcFx1MDAwZt+MTVx1MDAxMZxyhmHmwd7jPGqSzIzlt5zxv1xuaFx1MDAwM8XUfDxcdTAwMDK6b8BcYlx1MDAwNlx1MDAxMUJMI2XiXHUwMDEwXHRCXitUWVKb2Fx1MDAwM1gr4Vx1MDAxY8XEbsDYr1x1MDAxZFx1MDAxZL+Q2svdef9l2knodKY3uPc3jLngiElcciSYc+aSrMWQtEVcdEdYKmDKgmK9XHUwMDBmQPl03Vx1MDAxNI/P9VFvTODnebtcXOzgwnbUX3NLXGLgXHUwMDAySmhJYEFepf7a0lgzwEgqgD5pL05cdTAwMWGTXHUwMDE23lx1MDAxOJFYUUMgydI9sFx1MDAwMEolLTBcdTAwMDMwiCesN1i4XHUwMDFjlt9AuVxulKefXHUwMDA2Siop8DrAPD/yXHUwMDFmXFwqT1x1MDAxYlx1MDAxYatE5L5ErFx1MDAxNFx1MDAxNXvA/YPF1Hw8XHUwMDAy+iuAMlx1MDAwNFmHsVx0omB6wLw1iOM11jTYcyb/XHUwMDA0XHUwMDBiSrVWO9qPUz6dVVx1MDAxMsVqM5GvJ5/qVze8N075XHUwMDBmXHTMRlx1MDAwZVx1MDAxM1xm6Fx1MDAwMFYtw9hcdTAwMGLd2kCp8SmC2GktuHdMv1x1MDAxZSf51XWx41x1MDAxNJON23Rueo+P7/Kdik99ID+cNIupMVx1MDAxOaVcIlxu0H+1keC8fIHEpiQ5UFx1MDAxNO2Kb1mGOVvI2PdcdTAwMDRcdTAwMTHMkOI+Uc6mXHUwMDFmOVx1MDAwM/tfKY1cdTAwMDRGlFx1MDAxZVY2UVx1MDAxOJw8+7xBqYFcdTAwMWZwUCy/zVSOXHUwMDAz61x1MDAwM3FgXGZcdTAwMDZBolx1MDAwZYVkgE0uI/WvXHUwMDAzyiA5NVx1MDAxZq+E/lxuoMynxnl7mpb6uPzcqFRcdTAwMWXGxeeTk1x1MDAwMIuSclhzTGSISTjmzO3jfYdKalFqXHUwMDEyx4D9MThcdTAwMDVTj4hshZV39Vo6OVx1MDAxYTdcdTAwMWOqulXV61/fquvbIJPSOJWVXHUwMDAwXHUwMDEyo7ArOGc5JrwyJu+Ifj1SXs9m95f0dVJ/rKhCJYczQ8XyWyElMG6LMoqkXHUwMDAwg55cYuraXn7r+UItpFx1MDAxOVx1MDAwNWNTc6De3u0kaZnC74JpbFx1MDAxYTTypW9iXHSVXHUwMDEyWVx1MDAxYZRGXHUwMDAydTBOJnRYoZ1hkPL880hcdKY/KFx1MDAxMvZth8y8TdpcdTAwMTY9V4F771xcfHkjUlx1MDAwMp/fXHUwMDAzkzJQTM3HI6C/XHUwMDAyKGfq9Oz5dtB4lE/lo4fmS1Pk46dcdTAwMDFAXHR0m1OhgSkwrlx1MDAxMPJxSTLT1Fx1MDAwNtRXalxuzFvSXHUwMDFkcbJZVO3e0XnpNvWQfTo9XHUwMDFlNauzsfJcdTAwMWRcdTAwMTRcdTAwMTBR0/tcdTAwMDFJyea/k9hxXHUwMDFmqNxcdTAwMDNszE3PXHUwMDEx7mVcdTAwMTP5dP2okL1Mn5dOXHUwMDEzPpE7PtgokbCk8WNcdTAwMTNcdCRNytWaN4JYXHUwMDEyXHUwMDE2XGIgINQ4Q7BcdTAwMTdcdTAwMWFh8Vx1MDAwMlxuQ4jWjElcdTAwMDFkxc+MRGCpXCIgOsY416C5h1x1MDAxNaJcdTAwMTdcdTAwMDZcdTAwMWMzn1x1MDAwNkfTjVpq6VtcdTAwMTWDukpcdTAwMWGtuyWZ5pxIwVwib1ZpKlx1MDAxMfz1KbTBcjo/6pHQX4GON5pcdTAwMGZkRlx1MDAxZiFUmPLZTeIx37mdXHUwMDA0oCNcdTAwMThh+s1xiuAvIz44tCPFPlx1MDAxZuFcdTAwMWPPX6dbr8c0qfqP54VWqlx1MDAxODRcbuBcdTAwMDRaUFx1MDAwMdxcdTAwMTnWUVfY916h4SBfOL/TnGYmWTteq1x1MDAxZSVzo5vEVmioXGKsksZIN33LpXuPZfbTjkSCXHUwMDE49y9cdTAwMTbcp0JcdTAwMTC1QIdcdTAwMDRcdTAwMTjwpoA21u5cdTAwMGWOS0ORW4yZXHUwMDEyQkqDZsjvPZpALMx+XHUwMDFhXHUwMDBiicLzXHUwMDFly77lXHUwMDA0VCCjXHUwMDE22pCj3ZprbkLCndv2RpuyXHUwMDEwKKTm41x1MDAxMc9fXHUwMDAxhNtDkILRIUJcdEZcboxcdTAwMTVcdTAwMTijn0XmlYetgPCx36+UX6unfHjckPd2uS6S2ak/fzZl8lx1MDAxMVx1MDAwNrtcdTAwMTB4NFx1MDAwN5NbMkx8XHUwMDFjjvtcdTAwMDCGmzu6blx1MDAwNENm9lo4rDfMXHUwMDA0qYlV1swktWC1XHUwMDE0jFx1MDAwMFx1MDAxZFx1MDAwM/qMvNnWhIGowbVm4ZpHSXjRUFxii1wiXHUwMDBldj83XHUwMDBlXHUwMDFlpr83YoLQ8Fwiglx1MDAxZGtBqVDEt1x1MDAxZVwi3dA6XHJcdTAwMDMgmqiZ/emLXHUwMDE47Y51kJiaj0dAf1x1MDAwNVx1MDAxZW6NRPGtoWhHTNzcwNw1XHUwMDEyaTFTNJNjXHR00fhcdTAwMWb2lSpvblx1MDAxMLVcdTAwMTlcdTAwMGaZZeBQIEW5qS+xgodcdTAwMThZilAu5ikwXHUwMDE0ZmJpXiyi0jEsrlJcIoVAnSSnPtahJlx1MDAxNleKakXg5O+o9FxyeJj7PFx1MDAxZSo6n1xufzzEgTvThvtcYjCRXCLPckEgN3tcdTAwMTDAI4nxXGJpYWpxIVx1MDAxN82ZXHUwMDFmNJ50XHTzJ0xcclVcdTAwMDJE8KPbXHUwMDA1XG69+XjE/Veg69bb3Gb3hnF4XHUwMDA1wHTBXHUwMDEyXHUwMDE2iLjehSsoXHUwMDFkXlx1MDAxM9XCxIpcdTAwMDMjllx1MDAxZXHbXG5oNzeZXFwxPpXZ6JZKXCKwfzkj2jumPYDZze1cdTAwMDM2waxxN1pcdTAwMTSWXHUwMDEwbcJ8lFx1MDAxNGtluDGzQPeoXHUwMDAwXHQ1fmJvy15T40dRQZWUlMLC7pP9Q5UlJFx1MDAxMlx1MDAxYVx0zk2e27fZXHUwMDE5XHUwMDA0s5efJ+FUalOK1Fx1MDAxN2W90ZNcdTAwMGKrXHUwMDEzmVpcdTAwMWSIRF7hx7RcdTAwMDZfitRfh7LAZEF5TclQ85wruTqAssT0XCLXioGxXHUwMDAxXHUwMDAz/+hugVwibz5cdTAwMWVh/1x1MDAxNSC7NZ7NTVhgJYxpXG7Lg0JcdTAwMDIhL8xqs1x1MDAxZM1AJLBSsI7s6Orc3IMntuZwXHUwMDA1S1ZJmFx1MDAwNiC51NWCZa9gdnOB140wa5pcdTAwMDbBO6dcdTAwMDJcYqFwb1jPUdZki4FoYliaNaz1XmNcdTAwMTZTWPkknIfhXHUwMDA39q+SiLW24Fx1MDAxMKgy8DxgKeywelxuhcHZq8+bsyb6RVOlfLMsdeDOXHUwMDBmXHUwMDA3faLYXfA+XCKgXHUwMDA1xNmDXHUwMDFlKIB+hCqT5lx1MDAwMlx1MDAxMktcdTAwMDH9VrNcIrFcdTAwMDLaJs1740DbsPhcdTAwMTBqg+V+ftQj8XtcdTAwMDW2yMJg1yvNwNTmXHUwMDE4XHUwMDEzxXwtWmlcdTAwMWFgKFxmXHUwMDFjV+pdM382V0pfxVpBXHUwMDEwXHUwMDE4tEgwQVx1MDAxMazOPlx1MDAxNq01r65v2lx1MDAxY1xumETsXHK6//XQu7l+10boxUJaxKx52qwy7uJjb9iLLVxyhq1cdTAwMDLqwU3KkDd2XHUwMDEz3pclgaIyKTgy2cF+Ni4npvhcdTAwMTaBuVx1MDAwNmnV/NuVXHUwMDEwhL35XGJcXFx0ILVCuVx1MDAxM1x0XFzYi1x1MDAwMrGXXHUwMDAwSlx1MDAwMFawyPeazFx1MDAwZY78612rXGbEXHUwMDE0jFxcJFx1MDAwNFZgTaylSVx1MDAxMtB8WLQ4ZURcdFNcdTAwMGXqQ6M5UOzNxyPwe1x1MDAwNr3cZLQwRpVcdTAwMDYrXHUwMDE2S1x1MDAxZuRcdTAwMTVcdTAwMTZcdTAwMDPkJVx1MDAxNKwxeCNs11x1MDAxZP3NhTDXoFx1MDAxN2FTXdk0jlx1MDAwNjOPXHUwMDBiz6DMO9WIYVx1MDAxM8hcdTAwMDGrKP3FVu/ffs7aj1K3W1x1MDAxOIKQL577x9ixJ8deYPqv6vxjKuTMx2hAyZ7r87//9u//XHUwMDA3UY6dpyJ9CollectionThe Collection is a set of(key, value)entries which can be iterated.Collection.IndexedIndexed Collections haveincrementing numeric keys.ListLists are ordered indexed dense collections,much like a JavaScript Array.StackStacks are indexed collections.**O(1) : * addition and removal from the front.Collection.KeyedKeyed Collections have discretekeys tied to each value.MapImmutable Map is an unordered Collection.Keyed of (key, value).**O(log32 N) : * gets and setsOrderedMapGuarantee that the iteration order of entrieswill be the order in which they were set().Collection.SetSet Collections only represent values.They have no associated keys or indices.SetA Collection of unique values.**O(log32 N) : * adds and hasOrderedSetGuarantee that the iteration order of valueswill be the order in which they were added.SeqSeq describes a lazy operation.Seq.IndexedSeq which represents an ordered indexed list of values.Also inherits Collection.Indexed.Seq_KeyedSeq which represents key*value pairs.Also inherits Collection.Keyed.Seq_SetSeq which represents a set of values.Also inherits Collection.Set.immutable-js-immutable-js-6a01d72/website/public/after.png000066400000000000000000000607531522056416100235640ustar00rootroot00000000000000‰PNG  IHDR‘’"µüù IDATxÚìÝwXS×ðoaO ‚PAEÜ´HU8Q´uÔYm]µu¡Uq€Ö¢–Z±­£ŽZ µ*?-¢àÀº@7*¢ˆˆ2Ã3@òûƒ �@@Æûy“{rnî=¹Ü7çœ{ß0�„BH0© !„P!„BA„B‘&c=xT«oô¶°-EÚ†L¯ÏÉÉÁž={°a䦦6꽟ž|Žl_ì`û¢�SD†œ•§Ç�ómgjˆf�™™‰íÛ·âãã±iÓ&øûû7<ˆX…C¿ÿ)÷_sž<­�þ=q*6lù霌vÂ-Ù%|^²Kª“pÚÆÿ˜à¸tBî�Yàg'µÊ6¸ví,--ñÝwßÁÐаQëê5½–?_]¨é«¾ßnFÒ0ÀÏI?7i‹•ÁY×Eêzi à¸tBq„_‹ù¬Jãnƒe>¨ÅCÙÙÙpuu—Ë—ËŦM›àíí-u=WWWlÛ¶ %&&ÂÄÄDø¼¤¤Dê/Yµþ%Í�5?îÝ/ÞíÉÊÆÊµ›a7z"¦Ìþ�Ÿ<–]¿uÓç.‚íðqÂ^@õ^AÍÇÒ¬ó]R æ-^ŽA#á»ï�Ì�Ã`0 ÏÖÃ’Ÿãɳçõ¾_Aa!¶ïú c�§‹mëÛ¤dÌ_²ƒF:bþ’x›”,Öû9pä éˆÙ_.•jjk³º888H< 2™L888ÔYW©×Xß=…⨓Pî3Àçr�¾B‚’‚Š?Þ˜Pdz|$©1ÁÔé ç-(��¬¨›—†_g¤£…L·Þ(}!|¹ ˜‹¼ã_ƒ³ÆXøm·j¨â²¾‚ô¥Èú~ÊÓ_‰÷š=‘¾T™^ªêq⑵}0Ò—j ?`ƒÔÇŸÏÇ“'OÀ`0``` RækùòS „Ï#¾�Ó3?÷:„l_ìî²a»îˆ‘Ø,èYê‰-ÏMÌÃÏ=+>ëüÔøZþ&Rž•§ÓøÑäWü6è8®¿)ßÁö•é8/K�ƒ¢Aw”q^£ðÚ(ö€R�Š ’áj�²äªc<ÿ›�óë´ŠÏúù5áëX]mA¹hpzuY;†#}©26Y�÷슰¬èÆ!pÖuù¯‡*zÂ)ôDú =pV 8¢jX„Ïå }™¸¯AúR ¤¯¬ö%UÀGÞ_!m©:r÷Ï@髈F÷DêûüÒÖÐ××GVVîܹƒŽ;ÂÜܰsçN¤¥¥ _{ñâEüùgŨΫW¯„Á¦sçÎàóùb½�ÀÍÍ >>>"_###áíí-ìÅT xyyááÇUŸAA¶nÝŠóçÏÃÍÍ ^^^UM-àÌ™3pssƒ¿¿?…=ÈÍÍ…ŠŠ ÊËËDfOÿq¯^ãîý‡"ËwîþãÆŒÀ¿Î`ÍŠ¥ðô®úf¿eÛNløv¯žÇƒðP<ö$=–f�;vï…Ý [„�†‹Õ°îgN.þð?‰>½zÔû~?üô+òó àwäW±mÝ᳃À• S8à#ìðÙ+þM¿¸—Ï�DÏ–RíCmmV6› ±å666`³ÙuÖU³ …W|QºêcVUšúPê6Å‘Wœ®ÿµá‹%Öäg àâ`™} àú¯„Ší tÜÃ�æg>È;¶HøZî Šr¡çƒÃ‚ŠÞÌòü—C¹·ôw§@©çhäù//^!ôL«KÕ¾rýW@¹ÏxèïN•¥úüÜÝÝqúôiL›6M¬\¿§81™Â~„ï]ŒÞ>°ìéB¬ÏX�y—g bÏ]ñ/U/²À¶ï‰$†½CçÁÆÂ@S½·’|7á?DbÌŽX·|Gãü7—u²ä禂©kŒÂ+{ hh‰òÜTaODÑÄ¥¯+‚~Ù›û(ºyZs~öD”,í!(ÎGþ9/¨ ø¬Z‰@þ9/hÍþ÷fAûË#È=<¿¢^t0 .xCgé)*«ø<*ÿ"O øQØ[BçëSàžZ[ì’žBPÌ…¢Q/tôÍ@Ç=éUAéÖQ”§½€þÎ(tCYòS°L?lT»Ô÷ù5D~~>´´´}}}p¹\ap022»wï*¾($%!** “'OöDÌÍÍÁãñŠ~ýú‰ô®^½ŠI“&aëÖ­˜:u*Nž< ˆ��ŵk×0gÎ|ÿý÷ؼy³°Þ£G�ƒ•+WbΜ98þ|Õ±´4”””ÀÀÀ[¶l�›››°ìîÝ»àp8puu›ÍFZZŒ��…寯ÆHII�››[½�¤Öá,EEE¬[½ Þ?îʼnc…Ë#"ïáRè5Û…ßô+Yv7Çö]{ðñ€Ñ»gØ •z?”ºÖùðÑ|ï± jjª˜3c*ùCê{À0¨«©¡¨¸–Ý,ðó�ß×û~×o…#ÀïtuuÄÖ÷(ú)¼½6C]M sfLÅøOfнfáüÙPWSæu«¤Ú‡†¶™½½=¢££QTT1¡«ªª {ûú‡/˜z&P`w­èUt¨š´Tµ›�‚�]P±vFɳËК/úÍ9m±2*š”€eÒº«.Tt{Ÿ]FqÔßÈýí¿!FÕ÷’â�`o{ ¦¦¾„ñîpè,9†Š&ÔǺ€³ÖT<àM܆Š&´æî«âxy Ú‹ýÁPÑ€úXzHÕuwwÇÁƒqïÞ=té":WÐÑŠ�Œ˜Lta‚·ÜBÿy} ÓUY/³qqÝ¿H¾›Š²¢2èšéHÎêîh.Dn%ÁÄîƒÿ‚H&ôªšëÛ‘xëâCßTõ5D¿\¬ÏX!Ó|CQL�N(ú÷WhÎڋ‹>P`Wì'ËÔ¥ñ‘P8¹G¾€æg>`juDyFø™o�±Ù  b;Ú �Uë±lïù¿ÈŒ®jKÍŠ`~ÖZs«ë±í) ýZ3vƒÙ¡3ê (ί "ÉO¡üá§Pú¥X½¢‡*¶MSŠô© ŠJ >ÙKóùÉÚÖÙÙÙPPP€––"""àì쌛7oBWWWxò}ûö-ú÷ï�S§NÁÑÑÈÎÎFNN||*¾°öë×Ó§O®7$$ñññˆ��­:&”*öýÒ¥Køä“OðÁˆmOxx8&Nœ¨©©�Ç㉑^½zIü‰‰'B]]†††066†‚‚‚°<:: À˜1cD–ËD`à€�ÐŤ3Nž>[mÈ„�ðÐóPU?Ñý²{¢î>ÀÓ˜ç8„§Ïâ÷õwëZgcDݸXqÂ*-Åz·møß?ç1ÎŒzßO€†ßᮦ&ÓëÚf•A#88XTTU¥›ÜÕ^"~Õ…r¿‰È=¶Ü“ë òá'“…pNä`ÉgröÏ@á�ß >~À`¢ã¯ù`(«×Ö hp[Ö܆ÆPRR›Í†–––xÏÎJI‘)xž„wÉ·»bHñÜÒ‹øpA_|vj2ÿùon½"/²À–0œõ6" /¯ø�ú0FV뉤`ÍÛ¯¡¨ª(Ÿ¹ƒØkPèÔj#¿�ºãF‡Ër¸°œeb�â{ÿCþ¹mPè`"œó¨>Rúê6²rUC,¼W0ØW(‰Weï¢Áê6DòÐÚ»ÇP4µö|�{W "Ï Ô}¨äz)1P4é_ñ8ña£‡²¤ùüd�Ž;bРA1bîß¿�®]» Ë�ŒŒðäÉ\½z:::Â9�êó!oÞ¼Áï¿ÿŽêÉBáåå–„Ñ–ÔÔT±/>•RRR„=ˆ¤¤$‘yŒ´´4‘m«ŽÃáÀÈȨâxLNÊzöì"""ðõ×_CQ±þc´ÞÙÅ5+–âèŸ'„ÏÙÚÀwßoàróÅ#’‚}lƒ/æÎÂW çáM¢è8¯†º:^Å'ˆÕ«k�ýûö‰SgPXX¿“ úàY,Ö¹|ƒc~#9%µÎ÷>d0~øéWp22ÅÊúöNVmKßÞ=¥zÿºö¡¾6«KåðUmÃ[2Q`AõãY( ; U»/êøÚ¡­Y{P² å Pî5ù (Ì{©Šµ3¸'\ÀÏIÿLÌ¡ðŠ/Åù(¼¼GêËÂ…¡{…õd‘””‰ÃYiO8¸¼þFz KMQ8T¥oÅFæËlDì¹ Ã¾â™ç” 8·X|È#¥é…HŠJÁ‹ 8è÷¨ 4�4ðàh4J Ëä2FÏ{~ Š�zTMŠ>»,œç¨Î*{û…¡{¡5÷W‘zÂùóAPü JžU §*è£ðÚ>x…⇋v'ð¢ƒE‚Ž0ø+k ìÍ}ð³ß!ïï5P½\d8KѸW-g#”%=EÙ›û(¼~PlRÝÕÕU¦v‘æó“µ­_½z}ýªžõË—/…ó!•A$%%áááÂa¬šó!¦¦¦044™óÐÖÖFDDJKKÅÞSKK ±±±�”¡JYYIIIÈÍÍÅùóç1xð`‘ Rsþ¯zï<-- IIIˆŒŒNª ¤¦¦ÂÔÔT⮑N†˜þé$áóµ.Ë��“ Ç©³Å&‚+Ÿ1Þ>{á¹y½Èº>Ÿ5Ÿ/^&6y\×:׺,Ãõ[·1ÊqŠÈ°“¬ :bÞìϰãÇŸë|¿oW} uÌúâ+±²õ«—!,"£§àö�»X¿z™Tï]×>Ô×fu÷à*&Òk›h—ùÛz¯1PÐ7«›]ÝïÛ¡3ÔÇ­×´fíŸËg½™Øä¹æŒÝ`¨j#Óó#±2­Y¾(‰Fº‹Jž\„Ö,éþ˜µfíAÉÃsHw1d<TUUqæÌ»'NÏ>‡g§cÁd)ˆ gMðƒ'§žã'óýÂûLÒŸ6üòs^ì5(V^L¨È•YLmÊaCÇ "C˜•ó! ßß%«Nl_AÑí?‘¾LWøù•½}\ñÙÎùÜ“ë�¶Pñ¿K‹«.2Ñœ¾ Ù?‚Œ-ý¡ÜwTlgˆ g)v’üåKÃÉ Ù»F"ÿܶÿÛ@‘oÎÒ\U�4Ÿ_C{"•âââD¶KSSÊÊʰ··ùÂR9RÉÊÊ 111ÂçS§NѰuëVáeÀ))_¾&Mš„ .`Æ puuE^^^Õ±4aþøãìÙ³–––"ó,u‘Q£FáàÁƒ¸zµâ K”——cóæÍ¸wïFŽ)ýˆ%`$g”"äš VçþPwÚLíÑV”—¡ðúAÝ8=·»€‚b«Ü�Ë—/£gÏž"“¿- ŸÏÇ�;w‰åË—Ëí2ò–Ž‚©øÖ²€ V÷¡Ð]q U-j�¶ò¹.T«‹ ´ûA¡£95HÚ°a>øà̘1zzzíf¿)ˆBi0JÀH!¤Á© Hmj^¹"Ëõô¤é¤-`ˆÜ¸YŸœœ;v ©©©X¹re£r†==ùA_WܹŸ�ððp?~Ë–-£Æi€ä#‡ÑyÅ*h ”—#ùÈ!Ä,üý.\¤Æ!MŽæDÚ $'W$LNN¦}¨ìi¸ººbãÆ�ðõõEBB‚Ô=”ÚžçççãØ±cpwwÇîÝ»‘˜˜(,[¸p!zôè%%%¨¨¨`ðàÁHMM­sÝ�Qœ�€Ç“'â¶EW<ž<Å5ö/ÌØoü·-ºâÑø±"Ë+ÿÕT’ø��qÛ¼ Þ|ÿ�Èkêªfl€”£‡q§—%"­û +ä‚x=#œœœpüøqx{{KÌø:nÜ8=zTìÄ>aÂbûöíb �œœPPP€�;w 'î+�}oo'‹•IËÁÁAâO�2™L888ÔYW©×Xß=…⨓Pî3Àçr�¾B‚’Š{x1¡ÈôøH¼2ƒ¦N'h8oAi|E‚B~^r|�‘þ�2Ýz£ôU„ðå‚b.òŽ Îcao¦Ryú+d}?éK5�õý”§¿ï5z"}©2½TÕãÄ#kû`¤/Õ@~À©ÛŒÏçãÉ“'`000¿w$77***rK=C"Wë3V`}Æ ,‰š‡Ô‡é¸¸:´Áëb³Ù°±¿óÛÆÆl6»ÎºêcV¡ðŠ/ C÷B}̪ŠQSJ݆ 8òïŠÊõß 6\rBA~ .þ–ÙÇ®ÿJ¨ØÎ@Ç=h~惼cUy¸¸'\ (Ê…ž[  *z3ÿÉó_åÞÐß�¥ž£‘ç¿\ü½x…Ðÿ1¬.UûÊõ_å>ã¡¿;PT–ª½ÜÝÝqúôiL›6MâkŒ��‘’’777 $¤Õ á¬v"áú[\÷ CæËl”T$÷ËŠÏ 0²²··Gtt´0µ‰ªª*ìííëÿæ¢gv׊^E‡ÎÂåªvóQ² *ÖÎ(yvZóí,VCE‚’°LúCwUEõ’g—Qõ7rûo�QõݨøA ØÛž‚©©/¶¥qáÐYr M¨�ug­©xÀ›¸ MhÍÝ'\Æ{y Ú‹ýÁPÑ€úXzÔ»Ï îîî8xð îÝ»‡.]ºˆ½&:: À˜1c PíxB¨'BÞ»óß\BêÃtL;1 . K+¾—7AÃÞÞ^,ýIm´—øC{±ŸÈ2å~Q–öÜ“ë òá'`¨hŠ”,AGß ü’ ¦v'ÞøM4:þš/ìi*¯Ù hð>Ö܆ÆPRR›Í†–––XÙ³gÏ;;;(*Òw;BA„´0üòŠl±ÊšJxzJü‹d�©T9|UÛð–LXPýxŠÂŽBÕî‹:úÏJКµ!»Pž‘å^c‘°‚±—ªX;ƒ{Âüœ±2–ù ^ñ… 8…—÷€e>HªÍdYØ¡0t¯°ž,’’’Äò“ ¤¦¦ÂÔÔTb€!„‚yïv�„–±&ü&žFÊùý8QåDzmí2[ï5 úæ`u³«û};t†ú¸µàú¯€Ö¬=às9à¬7›<ל± Umdz~$V¦5Ë%ÑÁHw1@É“‹Ðš%]Õšµ%Ï!ÝÅ@bZöúzogΜÁ£G�åå娼y3îÝ»‡‘#GÒ�JZJ{BZ^rÍ«s¨;m¦ö „z"„H/m©:ø\ÔF¯ Æ „z"„B¨'B!„Ô‚®%$-Zõ_DôöönÓûfl»¤´f«'i=•ä±>B=BÞ;ooï<ªÿô­<5ôÄ-¯¾]RZ½ëjª}¶KM� IDAT'D!„P!¤éøøø 9¹"écrr2|||„e®®®puuÅÆ�áëë‹„„©ÖY}¸«æóüü|;v îîîØ½{7ë­ßÅ xgH¸»\žó-yw£`¹ï 44`¼h ¢l?{Mç•.PÐЀ¹÷N©Ö™{'Ý}�‚†Œ,Bâ®Ro�ñ’¥`ª©�í8±ß|UµÎ›7ï±Eq/!(-¥“P!­ƒ±±1¸\.233Áårall,,;uêœ��Ñ£G”••aË–-"u �X `0àóù`2™àñxbežžžPRRj1m  ¡Ñ|à jjÿ½©Àç —¿X½fžß¡Ã¨Ñàóxˆ°4G�†«HZ)cJÒ>ÑpiVVVV ‚•••ÈòÒÒR¨««£¬¬ ¡¡â¿s¢­­-qNCWWOžr1 ¿@¿ ©qÚ8š!ͦ%%`\¸p!zôè%%%¨¨¨`ðàÁHMM­sÝ�ÑÖ“3ö>q º£FCA] ZZ0Z°…±Ïé § Bˆü´äŒ—.]Bß¾}ýží99cuovzƒ=Ñ©Þv!­ g‘f "--cii)�žžŽE‹‰”QrFÙ“3ò‹‹÷í¾|�>'è § Bˆü´´Œ~~~066ÆÒ¥KÁb±Þkû´öäŒEq/ñ|É"hô뇾gÁTU£ƒ¾ á,Ò¬ZJÆû÷ïãðáÃ9r$¦M›&1€PrFé“3¦Ÿ:‰§3?CçU«ÑíÇ=@(ˆÒ4ZJÆ“'O"''þþþÂ2WWW±ÞŒ¼´õäŒ/W-GIrb¿Z$2©_^P@}G÷‰ÒÚQrFòÑœ!­%g$Ô!„ÒjÑœ!„ "„B(ˆ"³êW!Iòh‚9Ž“¹!¤~4±NÚ´RE ¯+gpÀbëS£BA„´F•÷i0™LÂÙÙ]ºt{�<Ó�d‡^�î°áÈ EÇÏfÐAÒU>Ÿ�7oÞÀßß7nlôzëJî—zƲ.…ˆJ HHãÑ%¾¤ÙHJ²Ø”¿V((-Å�¾=a¸k7?~Æ{ΑEõDi€ú’,Ê[^Äm”çåáNŸž"Ë´‡£ƒ9¡«³H³©/É" ߤ‡YW.Ãd�«ð72LÖ¬EVèú ¡ BZ£ú’,Ê[Vèet5Zø¼Ã˜±Èºr‰>BäˆæD!„PO„BB!D!„P!DŽäyåUSK[À�ëú¬�‚õàQÍV� "„HÁÏÏr‡e¿Þ¤¾õ>­5HTÿW_BZºÙ�´jqqqˆ��‡�� ìííÅ~g½5 @A(ˆ"¥��„……ÁÐÐ3gÎD‡DÊ’€‘Ïç#22ÑÑѰ··‡�� ˜Ì†u²«÷&jöFJžCþ™Í(K�ÊJ„¯©^§òqCz2„P!¤, nnn¸yó&1þ|¹­»¨¨ÁÁÁˆŠŠ‚ƒƒ,,,d^GåÉ_ÒÐTî‘/ »ü,XfE‰uÞÈÎÉÅfOo:PõD©ƒ!ß+ TUU=œU]—ðž_Eéë(];€ÂПÑaÃ-ùü!**ÂÔä¬Y¹>™E¡ž!’„‡‡ƒÇã!<<¦¦¦bå ¹ ˜ÉdÂÖÖË—/‡­­m“€‚"”z�…úWhLÚZ17R=(ªj£,éiƒV-�ÎÉÀþCÇ`Ý¿(„z"„HR^^///áÄzcYXXÀÁÁl6[¦z’æ<ê›$–)(AÑÐÚ ~©¯îð-²¶‚ ˜+õÜHå%½ úl= ü1¶¹»Ò�BZψ%`$¤éU Y/çmh=B(ˆBiñhN„BB!Diµ(É"¡ BH;�¶€�‚�]Âç!»ä–µWÒøµ›á˜¿dl‡�Ã(ǩظå;¤¥sê¬CHkA—ø’VËÏÏqqqË,,,0{öìZ뇃ú@Ñ­ß›t;Oœ:ƒ…ófãÃþ}Áçóñש3X³a þ<ü+}ˆ„‚!Ò*))App0ž>} .— @<͉, >Ÿ/Ú½f2áààPg]¥^cQ|÷ @¹Ï8¦<öR*V¢ÅúBk–/XÝì„eê6 ðŠ/;÷…öb(°»Ô»�û}w‰<Ÿ9ý>æG¡ Bˆ,Î�;‡²²2,_¾ZZZ�^›Í†�� "##E–ÛØØÔ{ó¡ú˜UÈÙÿ@géI^ú@µì»åe(}u9f@ÿ‡·Âz %UèïNEáåÝàú¯€ÎŠ@™·û׃G1fÔp: BdƒÕ«WC]]½Ö×Èš€ÑÞÞÑÑÑ(**P•?«>L=(°» ˜: —óbBÁ=±e)Ï�rѹµÑ+ÁPÑ€Úè•à¬ë"Ó¶—”Àó{¼NHÄÁ½?ÐAÚšX'ÍJÞ÷¶Ö ²ü0•öh/VÊ=ü4&m…Á¯\tü%€ ®�‘z;_¿IÄÜ߀ÅRÄÑý?ASSƒBA„YXYY!((H8"IC0V_Uo5*È•�©©AY òÏy‰•†î… 8…¡{¡ôß\I}Î_Â׫Öcñ—sá±iTTTè` m g‘fãää„àà`øúúÖ:±Þ oBÕ&Ò›ÁWkÆnäü2‚òRhLö2å¥Hw1냾b½˜Ú¸{í¬Ûì)²<ìJýøiõ(w!Rªï— )É"¡ Bip!„‚!„"šX'„BA„BBšÅác~1þ©³ç†P£5’™™™\^#ÖƒGaÄxJ?CA„�:züìõÁ½[—%‹æaÆÂu®÷Àöïß�´´4©^Ëãñ°uëVØÚÚÂÖÖ[·n�Ç“ú½âãã›%pÝ»u|ÀÑã'è��‚!²+(,Dw ³FßWÒvIi°KJkñmooo °°°Î×îÞ½oß¾EPP‚‚‚ðöí[ìÝ»·å�ø˜LtïfŽ‚zö‡P!DDy9wï?„v@–r8x8v$ÒþòY3."º›áÁˆaàÞ»[±<3wzY‚ÿ߉*÷æ ýq4ݱNÚ›¡cÖ¬¨µwPýÿêJ’“ðlöLt^åö¤O„ËãÝ7�=i2z8„ÜÛáˆ[»ÖW¯ƒ¥Ç†–íÇàž…ÁŒYHõÿ†sæÊÔS©m[$©m~§ò&Æý{v!ôúMlÛñ#ŠKJ0fäpŒ5úõd<®®°°¸uë&OžŒž={Š”'%%ÁÔÔTøÜÔÔïÞ½>WUUETTŽ9>|¸¢ ÿÆ’t²÷ððÀĉñË/¿ ""6l@HH`Û¶m(..Æ?ÿüƒªa¿êë«kˆìëÅ_`Ѳ5"íD(ˆR«Èë!øç<~÷ûÓ§L’©nôdgt;V$€@Î�ëÈü/ðuÅFUæßŽÓg iß/Ð뀜×a±ëÇ&Û·úN‚ºº:˜:Ù S';áõ›Dlýnvÿ¼wo^n¶öŸ?>ÔÕÕ1þ| 2Dª:·nÝÂùóçáââò_óVµï•+WpñâEèéé5h{~ÿóÖ¯^Ž)“é�ƒ‚!õc±X˜ä8;~”}œÞðóyHûËOŸB½W¯ªƒ^¾SMM¬N‡Ñc·v ^oó„Þ¸ PÐhºì½õõD²³spõú-\ù÷ŠŠ‹1fäpü°}‹L¦†ñãÇcÈ�!瓌��ñæÍôèÑ�˜˜ccc‰ëª êÂd2ñäɨIh_ q™¡SRÓ0ÉqX,ýq4͉�vGUµaYt?X¶ÝvûâŲ¥ÂyÐn�„íÛPž›+~¢d± ÿɧHÿû:Θ٤ûõ <І®®ý14åÎ"í’ÿÉÿáÐ1?dgç4é„*¿¸/–õ^½ÑyÕjjø:ܾ}ß~û-šü½¬�‚®®ÍŸƒ™Ó>¡Æ§ BHËfl­�¢ç±?¡ ©I R 333°Ùllݺ&L ¡ B!¤= 9B!D!„P!¤YÈšÅW-)[mkW_’ʦ@~)ˆR/IY|Ûb¶Ú÷uâ¯þc4e’ÊÚ¶“2üR!¤^’²ø¶Ålµ¤'EÊðKA„�ÚÔ—Å·­f«•Uc2þÖæþ0;z‘ué¢È|˜yxâùÂ/eû!”�Ä{t¦6âéÜYbé]6oA¼û&DÙXCQ[4#o}Ù•kC~eC¹³H»Ô\Y|%iÎlµDv”á—‚!-e«%D!„�ÿМ!„ "„´VÖƒG5(dCëBA„´;®®®r]ŸŸŸ222dªÃÏIAîáùà¬6BÚdm·CÉÃsRÕM[P÷½"’&÷¯Ý Çü%+`;|F9NÅÆ-ß!-�SgB(ˆÒ âââ°oß>£¨¨Hª:9û¦A�Ýz[Âà—\h~öŠni²mÊêrݶ×o±n“'zZuÇÑý?AE…r9‘–…&ÖIólL&ºuë{{{Œ=NÕ•FÝ»wGHHH­“Ü***uþtmC®Þb2™°µµÅòåËakk[oÉÙ3¼ç× (Ê…  …7AA¯â7E”{�E~À s$Um”%=•iûÎ_Â׫Öcñ—sá±iB=Ò¾Užè ¯¯�éÓ§ Ëœœœˆ�;w Iõ!ªaÆá—_~�Ç“ËЕ……À–!3­ê°EÈØ€Ò7÷ÁPÑ„’ù@è,ý 5kòü–ƒ³Þ ‚Âl¢èêß"kû йRÏ�¸{í¬Ûì)²<ìJÔÔTé€"-]�EÈ{Vyà¬WY5´!D!„´4'B!„‚!„ "„È�¼ómµõå预�„‚¡“~+R_âÆúNúM�>y¡K| ‘’ŸŸâââ$–YXX`öìÙËröMƒRÏÑÐÛúL5m”¾¹�‚à�PîïÔ¢ö¯2áã‡ýû‚Ïçã¯Sg°fÃüyøWúð òþÕ–€±z¤òqõ{A*—1™LÂÙÙ]ºt””” 88OŸ>—Ë« T$w<|ø0Œˆõ~¤½ïÄÁÁñññàóù¢Ýy&µÖ+KzíEÇÁÔê`™‚β3"=�ÊÇÕï!–3¡øA_hÍò«›@PÌ÷Ôz”<üüœd±º@ERÈìÇAmÔ2¨]Pïþí÷Ý%ò|æôOpø˜¸„‚ijKÀX_’ÅÊe|>oÞ¼�¿¿?6nÜ8wîÊÊʰ|ùrhii‰÷rrpôèQŒ9ýúõkÔö³ÙlØØØ 22Rd¹��M�7-Ö–¸±¾äŒÂeåe(}u9f@ÿ‡·î xEÐs‹SÇH¬.?ë-²w�‡ºÓf¨ØÎhÐþRÂGBA„´(u%`¬K\\‚‚‚Dz0Õ{7«W¯†ººäœUû÷•U­DÖ»ßííí-¼«¾2ïV]êJÜX^L(¸'V£,å9PÎPÕs)~ö¶§`jêK¬›é=*ýœ@(á#‘M¬“f³`Á8::B]]wîÜÁ¡C‡¤îÁŒ3žžž"¿R©®ûeˆ/^ %%E.ûP3hØÛÛCUµþ$•‰Õ�·@Ïõ: /ï©·Nîá/ 1i+ ~å¢ã/y5w¼öÀeÿJž„ ìí#™öïõ›DÌ]ð X,EÝÿ455èÀ%DH 9ØêHÀÔžd±´´êêê(++Ch¨èBVVV ·Hê9L›6 'Nœ�Ç+oÈa•ÃW•Ã[õ©+q#P{rFAi˜šú”• ÿœ—h[Y;ƒ{ÂüÉÁQ}‚+´¿<ŠÜƒ³!()�j¿(á#iÎ"ͦ®Œ@íI�œœpüøqðù|Œ3F¤Ž““‚ƒƒáëë[ëÄz—.]`mm�³gÏŠ½gCƒaåDz}™�º7µ'gÔš±9¿L� ¼“E{`š3vƒ{j=2=??·"�ÔœWau•As�÷ç×Ð^p¬Þí¤„�¤!(w!í %|$D!„´4'B!„‚!„ "„936 F Diív°}…ÿš"HÔ,ì’Òš%¸JJ·v ",ÍaiޏußBPíRêú¶“P!„Ôa}Æ ¬ÏXÑf÷/é·(~“€ÿ½‰ÿ½‰âøWH>|ˆ>x "„�æì­È³‡RùOÒòš�+•r8ˆ™?ÝÍð`Ä0pïÝ©ûxòDÄ­qÁ}û¡ˆ[÷­°Œó¿tÙä%##(Átãf¤œ¢•‚!¤%«®ª9le—”&q(«úrI¯‰wßö¤Éø8:]·x ní‘ò®îH;á�n>»‘(\^òî-Ôºu<û|6Ô,{ ämb½ÛIÚºc��÷¬% wåÜ¸ŽŒÀð_W,`ˆþP–Fߊ–ýú£<7Wâ:zþá‡ò‚ú@)ˆBÚƒ^¾SMMr±¢¢Èÿ•”?èŒÂ—/ Ñ¯? èE,”;›P{¶#4œEÈ{&ï+·ê¢ ©‰ÂØçbËu‡Û#aû¶Z{µÑÿt ¾ÿ¼”ðRR�ðýwè8e}¨Ô!„È;@T>nÊá«êæ•�«ÏGõ5;M@yA�Èr3¯mxµy#¢ iæ1Œ-AqBîÛ°�'ÃhÁBúàÛS'–rgBi(Î"„BA„BB!D!ïåª"DiÊKÊâŠÝ]öcw—ýY}å¼r¹‰÷�€±¶4+Òn'¡ B©CÔ¾ÈNÈÅÂð9X>Ù¯²qïà£6³µ¥Y!D!rðôt,F¸�¦‘4�40ÜÝONƈ¼¦5'`$„‚!M(ï]ôºëNÏ ÛR¹‰\¹ôªÿ__Ï ©06t;IÛAw¬ÒL¦þå ^~©Øò¶’€‘P!„È™ÖZÈ|‘ C뎀ÌYÐ6ÑlyÚÀŒ„Ðp!M¨×TK\ó 7%Ü”|\ó CïéV"¯iÍ  ¡¯„4¡K­‘��‹CƒþX}Ò -î×dï×Ü ë{?ÒöQFB! FÃY„B(ˆB¡ B!„‚ii\]][Ͷ¦-`Èu}ÖƒGÁzð¨f«GH{BWg‘f‡ë¾–£¾ò†¬÷Ax¨Ä Q×넇R!„‚i ~~~ˆ‹‹“Xfaa�Ù³g·Šý�\!Dˆ!!! ƒ¡¡!fΜ‰:ˆ”»ººÂÛÛ[ªu988 >>|>_d9“É„ƒƒCƒ{)µõFJžCþ™Í(K�ÊJ„¯©^§òqCz2„ "¤, nnn¸yó&1þü¯‹ÍfÃÆÆ‘‘‘"ËmllÀf³´ÎÊ“¿¤9‘Ü#_@wùY°Ì Šë4$xŒtœ‚‚‚tÔgcÔð¡XüåçPSS¥ƒ…)ÑÄz;bgg%%%ØÙÙ!!!A¬\Ú^H%{{{¨ªV�pUUUaooß4Ф?òŽ (Ž<¯°Ñë|Š«çv%?ûx#;'›=½é@!„‚©ƒÑø+ j�šAEžt]B ùÙ`j°Qtí²}ÆÊ¯;®¨S“°fåRDÞ½O!Dˆ$áááàñx‡©©©XyC.®¾ªÞj2 ŠPê5ê\¡1ikÅÜHõ ¨ª�²¤§ Zµ@ @:'ûƒuÿ>t "Ë—0j‚ö£¼¼^^^‰u¹| ©6‘ÎdJ÷�DÒœG}“äÂ2%(ZB{Áï"õÕ¾EÖöAs¥ž©¼|—Á`@Ÿ­‡!ƒ?Æ6wW:P‘eTƒ0’¶®2XÈz9oCëBA„B‘͉B¡ B!„‚Ëü{ IDAT!„�V„®Î"ͦ¼¤—]¯!æÌK€Õ§Ý1Æ{8”¼ÎÎŒ‡ÂÇoý©‘ ¡ži«¢ö=@vB.†ÏÁÂð9È~•�{5j�oý)xBA„´OOÇb„ûhi@ÓHÃÝíðädŒÈkv°}©¡¡ Bˆ¸¼wyÐë® 8=3lK=ä&r©a¡ Bˆl¦þå,qùúŒÔ8„P!DœÖZÈ|‘-|žù" Ú&šÔ0„P!¤~½¦ZâšW¸)ùà¦äãšWzO·y ͉ÒºÐ%¾¤Ù Xj�ì„\ô'Àê“nøhq¿F­³ú%¾•�éj-BšåÎ"„Ò`4œE!„‚!„ "„B(ˆBièê,Òlª_¾+¯› /æâ×鈾W- ¥‰�;ŒÐé58!Ô!mÉúŒr¿#ýèÞ ¬Ød€Ç}p=Ö V*XôékjlB(ˆ�öÞ[‘Æ_—Í1r‚Ô5˜ÐÒVÀ—+ôû¤ˆ’ "„Èn—[ §éPCÒLhN„´( î*.`Ý¢D¼Œ)ƉP jHB¨'Bˆtâž—ÀéãX°”øßÍnÐÖQ F!„‚i�d�9ýGf;Äa¥›!|Ž˜@U�iBšåÎ"ï5@Ô¾ÚÁö•iH«zÆêžsûB]ƒ !D!„´XôU�BB!D!„P!¤uquu•éõ÷î݃‡‡‡Äz²®«)·“�¦F7’fó28w|ï!õQ:”µ•Ðe˜ ì·ØAÓH£ÕíËåË—±hÑ"‰•y{{Ó‡M(ˆ"o÷~{„A« ó cøÜûí!þ7/ó.Ïhuû’››+1€BA„�&2㟈<ÿhqÜÞ%²LÖûD\]]E¾ùWîêê ggg\¾|ŠŠŠ˜˜L&x<žX¹’’RE—›É„´É <==…u奶miª÷#¤9Ðpi6OþŽÁÉ©g1ø[[LØ;Zb‘5£®®.žÀÀÁØÖ >/‚^áô¬@|uo>5!­͉�f3ýä$t±7�¢ŠÊŠÊÁ+(…’šèý!²Þlèáá�ÈÈHìܹ>>>xþü¹HYÍ×B¨'BZ±êAB§«6fžý´Ñë,..†‹‹ ^¼x�Ë—/£G�ÔЄPO„´Eë3V`mÊ2,¾ó9:l„Ð�7ÄÊe5hÐ °X,ôìÙÙÙÙÔÈ„P!mú c1¡k®ƒ‘Û†áõ¿o½>«bHŒÁ`ˆ%6¬|^ZZ*V¯®ì¼òÊÜKBääŸ!ù^*Êyå(H+DØ®;èdm òYçDꢣ£ƒgÏž¡´´båZZZx÷î�ĺu•BªÐœi6ýçõÁ• בÍ�ŠŽ2ºÚ›ÀéÀ¸&{¿1cÆàÂ… 8þjÔ(øùù¡¸¸Xìž�ºÊ!Õz픀‘BHCÑp!„ "„B(ˆB¡ B!¤= «³H³ðøkRÞÞNnÐÍ…Õuf<[öVП™ "¤­ ÿ1 L–‚ÜÖGAƒ�÷‡†³H³JŠJÁƒ#�1ñ×±Ëåy³!!„‚iCJòx8·ä"Æí Cu¹­·¿ÁX¨>‹gøn]2 òùÔØ„P!mÍÅo¯Â|LX8t­õ5²Î‘¼ôÇôވÉë‹?.˜#“S†UŸ¿¡Æ&¤™Ðë¤ÙÔ6TÕØÉõêr²Ë1¨ËSÄäö¥'„‚iëA¥f‘´L�–\Š_w¦ãÍ« 2£&¤ÐÕY¤U«¼Ä—Á ŒX9A {þ0¥†!„z"„BZ:šX'„BA„BB!Di^ÖƒGÁzð¨f«G¡ BÞƒ´ „ì>/Ù…´ ¹¬ûAx¨Ø²k7Ã1É Ø‡ÿ·wçqQ•ûÀ? "û&¨ ‚ ¸a©xÑÜÂIARB)Ìk¡æ—ôæ†.!à™féOS“Ì›˜].7ºh©)Š{j¢¡ˆ¸ ŽÊ¾ 3Ãï�‘a6�X>ï׋Ã9ó gηçyæ|g˜ß,]±ÙEZÛQõñ-¾T#111HKKS»ÎÍÍ AAAÛ–&킹Ï<@É©oêt;÷Æþ€)ï¡Oïž�Édø.öÌ_²»£·ðE$bˆPu•••!!!ׯ_GAA **Jé>¡¡¡*Ë4ñõõEzz:d2å:U�¾¾¾ZÛ¶ì1¥c�Š ¿òг~WôRž>H ´hßVïm„QçAŠuæ#— øÈF´pê ëi{`hßQçvnÝø©ÒÏïŽ} Ñ»bx@1DH„D"Á¬Y³`eeõÂ�gooOOOœ?^i¹§§'ìííµ¶5÷™‹Ü­ØÌø7Šú Ð6úÙ%KR ÊoŸAî¶qh½.CÑΠ¥)ZoøÅ?o@ÁžÙ°™}@ïíÞ²}'|† áAÄ!}¤¤¤ $$ææš«çV·"' ‘œœŒ’’€©©)„B¡Îv;gÚw hå¤X.N9Š‚½!�dݤbÊs%fÞs``b3ï9-ê¨×¶––•!òãõ¸s÷>¶oZÇ‚¨–pb½©íâUCC(ÂÔÔ´Zm­§ï�õ4åa¥¼èÀbt8Ún)@›Íù*´=™joç�{÷1!øŸ02j��[?‡¥¥"†é£{÷îˆ��Ẇ¨ª÷ãʇ¯äÃ[/rå%X¶F…¤ …Wª¬/>º ¥…(>º -ŸÍ•èr0á'Ìœ»Ó&O@IJE011áÁ@T‹8œÕLøûû#!!7nÔ8±^£ÿB*M¤ /ö?‰Õ¸ È݈ i9,"TCFZއóÚ¨}O•^Œ&a+?,Z©´<éH<ÌÌLy`½ `¤F!;ØàùÄ»ò õ½î£¦íˆˆ!BM(Dˆˆ!BDD� 'Ö‰ˆˆ!BDD j¢wÅàõoU»zn’c[î´äââR+÷© ‡áõ,?Ã!ª¡�ßîŶMëñ멟ՆE}„F’c[Å—¶àú«lëÖ­ÈÎήÖ}Åb1ÂÃÃѯ_?ôë×ááá‹ÅÕþ]éééõ\¿žúÛ6®ÃÎo÷ò��!B¤¿¢âbtqsyáëJ^Ä Ìl ÊÌnðû*%%QQQˆ‹‹Cqq±Öûnذˆ��G||<222°iÓ¦†wÒÐ¥³+Št<bˆ)‘Je¸xé ¬kX²\$•áC‘ý]ŒÒ²”Ip¶‹ .¿î…‚_/>]þøÎõè Ù³UÞÉD\ñõþËžûß'NEô®<ÈÌÒ»­L&Cbb"V®\‰ÄÄD•ÊÉr‡ÂÂ… ѦM´iÓ ,Àÿþ÷?Åúµk×ÂÝÝo¿ý6îß¿¯Ôc�UõèÑ#L�:¯¼ò |}}qùòeźÂÂB|ôÑGèß¿¿R{M·«²¶²ÂÅKW •ÊøÇшñŠuª7ž¯ù–ÌŸ­±wPù{eedâ÷ wá4wìG¿¥Xž¶ ö£ÐmÛä�9�´…óáqìŒììaÕïUˆìCÛqïáÏ=»ñÒø zõT4m‹:šæwä1nýâS=q«>ù ¥eeð:Ç Ak�++..F\\N�:…€€¸»»+­ÏÌÌD‡?wèÐ\)@ 7ñØ�TÌ|ºÀàyåß6cÇ!óËͰî‹ÜÄpûô³:{nºN‚¶¶6à�1þ¸sï>ÂWŠ ÿ·Oþ\oûÒ¤I077ǤI“0xðàjµ9uê~üñGÌ›7ïÙî}¾�9‚ÇÃÎήFÛóÍî½X2 �£ýøÇÁ!ÒÍÈÈ£ýÞÀ'Ÿé?NÿÒÄ÷‘ý] Š®_‡y�ÏW0àÖÌÌTÚ´òöAÚÂù¸³*voŒ„¡EÝUïÕÕÉÉÉű§pä—D””–Âgè¬[³B¯ßaff†#F`ðàÁjç“qïÞ=tëÖ pÿþ}8::ª}¬Êa �@ Àµk×`¦fÿ/V:ëÏlŒö{FFFüãhÄ8'BõÊÔ´fUtÛ8�7lDê‡3ó`;Dˆ»kVAš—§z¢42Bë·ÞÆÃï÷¢Í¸wëôy]>}Tí—Üs"'7KÍÅ7Û6bü¸1ÕÊðòòÂG}///�oH>|8Ö¯_‘H‘H„õë×cĈŠõ»víBQQvíÚUíŠË¯½öÖ®]‹üü|•uÞÞÞXµj>|¨¶­¥¥%RSSµ†OM�bˆP3fkc�ß’¯kœ ÖĪ߫h8·—,R,sY¹ åO〾jß²kã5&:Àªo?¥å•ï«í­¾µåû}…)“ÆÃÉÑA¯vÝ»wGhh(5öäBBBЮ];øùùÁÏϘ3gŽb½D"Aß¾}qìØ1„……Uë÷‡……áÉ“'ðòòR™$_¾|9,--áïï¯v}êÔ© TY.“Épù·dØÚÚð�¡ `í,ªw{þý_ìØƒœœÜ:�P••– uÖ?aÞãe8Í áŽ×âÌ™3X°`’’’êüwy [[L�4ï¾ów>C„¨aJrl «WûÃ}×nZZr‡hàââ{{{„‡‡cäÈ‘Ü!Ä!"¢úÁ9""bˆC„š}«øê£!U«mìt©¬ ¬ðË!ÒI]ߦX­ö¯:ñWþþ"ê²H¥¦íd…_†‘Nêªø6ÅjµTƒ+ü2Dˆ4ÑUÅ·©V«Õ׋TüÕä’× ]»ö4į%ã’× ¥^A’c[$9;àŠ¯7ò/œ×«7¡îgMÕ•«‹~Ö΢z£«Š¯\S«V[U]VüÕT}Øn¤rŽ�ùË/ãÉÑ#°é§Ò¦B"AÁ¯qsÆ4ô½xå…^kMÕ•um§+ü2DˆT¼H_}4´jµšÂB“º¨øk7ÒéaËÐ~ö\ä; —•«ëòN&"=bJÒn¡¢¼¼Vž£¶êÊÕÁ ¿ "Õ­âÛÔªÕêÛ©�Š¿UYôì…ò‡Qz÷.Ä¢g/źÔ�9p‰\�Vü!‹q¶«kÕ�TT¨�@H¥€¡¡RQ̧m4WW®Vøm<8'BõJ[ÕÖ¦X­VSXÔUÅ_mZùøâNDì†û*-—•”ÂÈÎ2±Ÿ¯Wigìà¨vNÃÄÉ �~Œ‡¬¤™_mSîMi©®¬ +ü2Dˆ´ר©âÛ«ÕÖTM+þêb7ÒO~:¬4.‘¸1e2.ôëcÕ]‡%Kq}Â{*é—¯@zØ2\ðô@ k劼ºª+k ¿�kgQ½«¯*¾êÔgµZÒ+ü2Dˆ,V«%bˆQÂ9""bˆÕ„ÇÀa5*YÓvD jvBCCÿòm�åf!/zD!Èžn‚'k¡ìÊÁjµÍÖ~­ˆºÉýã'OcÒôÙè7ä óƒ¥+V#û¡Hk¢æˆR½Š‰‰AZZšÚunnn R».÷ËwÐÒÝváW 0³Fù½K(JX ãÞþu²�{cÀ”÷ƒÐ§wOÈd2|ûæ/Y�ÝÑ[ø"U‰õf"%%‡†H$‚T*DEExZ`0..·o߆­­-áì쬶"oSµ§¢n¹:�=—_~©R\Q `ÆŒ°×pQÝÃm`~†ö�T{)ùÙÈÿf*Ä7�ð•3¬&퀑kµ=�¶Ñʇ»ÇÀaÕêUÁÛo ÎOл-{"ÔèÅÆÆbâĉpvvV¹üÀ�èÕ«‚‚‚�žžŽ¸¸8Ì›7O ú„„.öööðôôÄùóÊ•b===5XDâqx¹ €‘So{Œ†‘Ë«€‚=s`ÒolfÆB|ã8òwM…]d²"0²ƒ TÂC_[¶ï„ϰ!<�ˆ"ÍS»ví°oß>¸ººÂÙÙîîD·nÝÂÕ«WŸwOõ,–§oÀ…B$''£¤¤ÀÓª»B¡Pk3ïÙ00âÔDH2~CÞדaâ‹€H”ýþ3J/|�¼¯ž …ÔÞT_iY"?^�;wïcû¦u<�ˆ"ÍSpp0nß¾�ŒŒ œ;w§OŸÆŒ3¡‰–-[Ö˶ÈC#!!A*¦¦¦:Û˜·‚±GŒ=`6ôŸ-v…E@$` @›-…006¯Õí¼sï>-‹„{÷.عõs˜˜°–QU|wVsy¡tîÜB¡ÞÞÞ‰ž¿Ó¨K—.8tè�¢gP•‰‰‰Ö�®­É»·äÃWòá-]r¿xâÇQQ’‡Š¢'ÝÓÏ1î1…qKPQœ«>|L­!ɼ®×öLø 3ç.ƴɱl„ˆ=‘æM~¢744DëÖ­1vìXÅ:8pk×®UIå!*///lÞ¼b±¸ÖæF|}}·uö^¼¦¢0n Êï]‚�‰%Zºö‡ÍŒïVï}�ü˜Y-vAEqå tsßx²f*J ª=7¶òÀ¢å‘JË“ŽÄÃÌÌ”‘üŸ4¾;‹š3ùƒú¾Ëª¦íˆ"DDDòQî""bˆC„ˆˆ"DµJþñªU?fUþÑ«IŽmq¶›’ß�‚ þ’m!jŽø_jôe>½†EVRŒÜ“‰¸1=}/]åŽ!bO„H€´¸‚g–‹DH™4g»¸àòë^(øõ¢â®ÚÖÉ{Ÿ­Ã·NømÄpî["öD¨)ô6äß«žðå ­­Ñc÷w€ô°e°€nÛv ïÌi¤-œ�c't®““–” ß嫸»zeµ·…¨¹áu"Ô¨%9¶UœÌ%¹¹ÈúzòÎ�ÅËßÿçzt…$·R) zð'h]'Üþ7oÃЂ;™ˆ=j³� ¦ÏÀƒÍ›žƒnÝ�ÀÌLÍ¿OZÖÉ{5 "�8'BM†´°Ù1ßÂÔÍ `;Dˆ»kVAš—§r_m눨ú8œE�šÒ|ˆ•,{y SäJ˜ué ɓǸ½|)rŽÿ¢ ÅЗ–uòÇåœC„ˆˆê‡³ˆˆˆ!BDD ""bˆC„¨�PWôðl77Hrr”î'ÍËù]õz̺ÞN"†Qdâ쌲¬,HrrpƵ$OCüH“Ž�¸sˆ"DÚ·w†ø�L<ùé0 !:på"L;¹(zIŽm‘äì€+¾ÞÈ¿p^iyÕÛr,ÎHÄ¡&F]ÑCgg”ýñ'ü§¹ó!Ú±H“N�÷”™��é÷á¹ 7gLSZ^õ¶œ¼8ã«É)è´"i ç«l�¼8£E¯Þ:·“¨)cí,j¼=''”¤ÝBÁ•Ëè¶=™_mEá•Ë0ïÑ�w2é+P’v ååÕ~ÜÜÄxt`?R1óé•û8Í™C ¸F­å A ¢ÆÈÄÉŸ­ƒõÀA0hÙ­†zãÏ=»Ñ#f/ 5d\"W£Õ0oÈÄbœíêZ½fqF¢jãp5âq‚$7¶¯´òõ…4?_1'"+)…‘�db12>_¯––(¾yCe9‹31D¨0vîðô¤/|"6^Cв];´°µ¸DDâÆ”É¸Ð¯ŒUÚ;~0WýGªL¬»¬\…ò'�qa@_µïDT©ãÎŒDDÄž1Dˆˆˆ!BDD ¢š m–Ï;;Ø@ëz��Ãà1p˜Þ�[ÓvD âIÿÈr³�= ¢dO7Á“5ƒPvå`µOúuáòé£*ËŽŸ<�IÓg£ß�70Ìo –®X�ì‡"­mˆ^lH�BLL ÒÒÒÔ®sssCPP�Úu¹_¾ƒ–îÞ° ¿�™5Êï]BQÂZ÷öoPÏooì˜ò~úôî ™L†ïbÀü%+°;z _|bˆÐ_/%%‡†H$‚T*DEE)õ@ä·£¢¢T– ¼ôÒK5j:vì(++CBB®_¿Ž‚‚•¶PXXˆèèh 8}ûöUéýT½¿&¾¾¾HOO‡L&SîJ ðõõÕØN’y ÖS¿…Àª ÀÈul>üA©"¿Ý6ºBµ‡"h�í{Âê½�0ê<PQZ€‚ØÅ(»²²Ü?TÚ€,?9Ÿ½³aÂôµ`�ÏoëÆO•~~wì[ˆÞ×"Ô0ÄÆÆbâĉpvv†@ð|S~×tB—/“Éd¸wïöìÙƒ¥K—<‰D‚Y³fÁÊÊJµ�›‹�;wbèСèÕ«× m¿½½=<==qþüy¥åžžž°··×ØÎ" �ÃûÀÈmŒœzÃØc4Œ\^Uœô³ƒ T@)¤”ß>ƒÜmãÐz] `︺ºÂÙÙîîî022ÒÙ.-- ñññJ=˜Ê½›��˜››«ÿïzëVtïÞ]c€T·"' ‘œœŒ’’€©©)„B¡Ö6fÞ³a:`<Ä©‰�dü†¼¯'ÃÄ3‘ZÛ‰SŽ¢`o$Y7©ÀóžKéå°_uËÖjÛ>Žz &½ük ¥eeˆüx=îܽ�í›ÖñÀ¥�ëÍDpp0üüü`nnŽsçÎaÇŽÕîÁøøø 22*ëµ<èß¿?RSS‘••U+Ï¡jh…B˜ššêlg`Þ Æ0µv¡'Püó:ÛäEÿ£ÃÑvKÚlÎPQõ‰k.á(»v’Œßôz~wîÝÇ„àÂȨvný––,òH j(/´@€Î�;C(ÂÛÛ"‘Hi½‰‰ ²³U?£¼¼æææ�H$8zTùBÝ»wG||¼b>D]Ïá�wÞÁÞ½{!‹UÖ×äaòá+ùð–.¹_¼ ñ�ã¨(ÉCEQŠwÀЮÃó€1µ†$óºj8–—@`Ù’2\©¼¯±ß¨øª‹�Ѓ2³ë%\*ÊÊ�¶p>ÎvuÅÙ®®H[´•ÞJ­k;‰"DZ,~4‹Ín²Ï/ó«m(½w}~9‰>¿œDiúmü½ƒ/<1Dˆê³·R›=ù—ºåUoË•‹DH™4g»¸àòë^(øõ¢RÛ«o"mþ<\¾†´E ëDÿ�CÇe¡¥ƒZ:8 ÃÒåxË•"D ™|¸ªê°Õ ÌlµCY•—«»OzØ2Ø�À«É)è´"i ç+­ï�ì½{Ðyý<Š? X^ö f�»~Ÿ³®ÝP–q_çvÕ&^±NÍZCîÊM<�Gö#3Ÿ.0Pþ ,‹žO XZôê i^žÚÇpÿW ¤EE|A‰!BÔì0àÖÌÌÔ¯nÑB黜q{'ßJ…E¯Þ€’Ô›0vræþ¤zÅá,jÖjû�[ÚZZ¢øæ •å¶C„¸»f•Æ^†&­ßÄÝ�WCœ•qVî~¼mßá‹Jì‰Õv@Èo×åðUå sùíÊóŽÌÄUÿ‘�eú ðŽIDAT)-wY¹ ·—/Å…}AR�y Ç©ÓQz÷.. ìGÀ!x _xªßŽ4kgQMq8‹ˆˆ"DDÄ!""†QóÅZUÄ!j¤eRšw:nņŽ[q(ä¤bi­…Ä_]€QS™•ên'C„H‹ _^FÎÝCã‚UV1!þóÛ?Ö2UÖ"Õˆx‚ž�G’þ¤/ƒú@Ô\H/Ò{p_sP'=ŒJ�¤‡Óí"Õ¹¨)@ú/\4²‰Qv ÔËsø�ö„ÖJ{D»Ak£Ý�døCe Ó)ÒŠAC‘ÇBŠÖ_1ª˜ :}Hk¤Ú� &ý�~¤�䑆àHº¡L‚È”›;b«G©ViûZËÁºúQªùËq€çØsÜTd f…Þä`%þå«E "äýOOâ{â q–8Iœ'ŽuÀ'NõÄ%â…4‡«ª“5ô´xUEsPÒA§§N§Oƒ¿†r †R@½4ÿ ÅÓ Ñüƒ�©ò i–¤�„Va1?J&9‚ïâäì@­é”Àkžj­Æx¾rù�Þ¥h  –S>å °8ò€ûö+gñ }RËŽ]*Eý~$u£¡ Môe€ X€-ÊÉ<À! Æ@,$B*LFU—@R= fÁ|(�2X«a=l†­°öÀ¨ƒ£pÎÀE¸7à.šíðºá-ôbÆÀØ3ÀL1+ÌsÁ¼0, ‹Áâ±T,ËÂd˜›…-Äʰrl=¶«Æ~ÆŽ`'±óX+v{ˆub¯°�8�³p]Ü·ÆGá^x�'â“ð,</ÆáKñµx¾¯ÅOâñxþï!€Ð x„áHx!D,‘Fd bQJTUÄ^¢½ëkDÑE| é$—䓎h~F’I¤�Ì'ç�KÈõäN²–l&¯‘Énò �M3¢9Ð|hQ´ ´,Ú4Z ­‚¶�v˜v};í´·t:�G·¡{¢o3•žMŸI_BßHßGo¤·ÒÓ{ †Ã�áLje…ŒÆ:ÆnÆ ÆUF;㽚†š©š‹Z¸ZššLm�Z…Ú.µãjWÕžªõªk©[©û¨Çª‹Ôg¨/Sߦޠ~Y½]½—©Í´aú1™ÙÌù̵̽ÌÓÌ{Ì׿Þã5¤ó4Öjì×8§ñPãK‡eÏ aMd)YKY;X�¬;¬×l6ÛšÈNc²—²«Ù§ØØï9\ÎHNGę˩äÔr®r^hªkZiiNÖ,Ö¬Ð<¨yY³KK]ËZ+DK 5G«RëˆÖ-­m®¶³v¬vžöí]Úçµ;t:Ö:a:"�E:[uNé<æ\ nWÈ]ÈÝÆ=Ím×¥ëÚèFéfë–éîÑmÑíÖÓÑsÓKÖ›®W©wL¯�Gð¬yQ¼\Þ2ÞÞMÞÇaÆÃ‚†‰‡-¶wØÕaïô‡ëê‹õKõ÷éßÐÿhÀ73È1XaPgpß�4´7o8Íp“áiîáºÃ}‡ ‡—?0ü7#ÜÈÞ(Þh¦ÑV£KF=Æ&ÆÆrãuƧŒ»Lx&�&Ù&«LŽ›tšrMýM¥¦«LO˜>ãëñƒø¹üµüf~·™‘Y¤™Òl‹Y‹Y¯¹�y’ùó}æ÷-˜^™«,š,º-M-ÇZ⬱üÍJÝÊËJbµÆê¬Õ;këëï¬ë¬;lôm¢lŠmjlîÙ²mlóm«l¯ÛÑí¼ìrì6Ú]±ÇíÝí%ö•ö—p©ÃF‡Ö´Þ#d#ªFÜrd999Ö8>É3rÁȺ‘/FYŽJµbÔÙQ_œÜ�r�¶9ÝuÖqã¼À¹Áù•‹½‹Ð¥Òåº+Û5Üu®k½ëK77±Û&·Ûî\÷±îß¹7¹öðôPxìõèô´ôL÷ÜàyËK×+Îk‰×9ošw°÷\ï£Þ|<| }øüåëè›ã»Ë·c´Íhñèm£û™û ü¶øµùóýÓýôo 0 T< ´n|d”´;èE°S°"øpð»Ÿ�Ù!�¡DhDhihK˜NXRØú°áæáYá5áÝî3##i‘Ñ‘+"oEG £ª£ºÇxŽ™=¦9š�½>úQŒ}Œ"¦a,>vÌØ•cï�³'W ±Q±+cïÇÙÄåÇý2ž>>n|åø'ñÎñ³âÏ&p¦$ìJx›œ¸,ñn’m’2©)Y3ybruò»”Дò”¶ £&Ìžp1Õ0UšZŸÆHKNÛžÖóMØ7«¿iŸè>±dâÍI6“¦O:?ÙprîäcS4§¦L§¥§¤ïJÿ$ˆT z2¢26dt C„k„ÏE�¢U¢N±Ÿ¸\ü4Ó/³<³#Ë/keV§$@R!é’†H×K_fGfoÎ~—›³#§/7%w_žZ^zÞ™Ž,GÖ<Õdêô©­ry‰¼-ß'u~·"Z±½+˜TP_¨‹6Ï—”¶Êo•‹ü‹*‹ÞOKžvpºötÙôK3ìg,žñ´8¼ø§™äLá̦Yf³æÏz8;hö–9ØœŒ9Ms-æ.šÛ>/bÞÎùÌù9ó]à´ |Á›…) /š·èñ·ßÖ”pJ%·¾óýnó÷ä÷Òï[».^·øK©¨ôB™SYEÙ§%Â%~pþaí}K3—¶,óX¶i9}¹lùÍ+v–k——?^9veí*þªÒUoVOY}¾Â­bóæåš¶µ1kë×Y®[¾îÓzÉú•Á•û6mX¼áÝFÑÆ«›7íÝl¼¹lóÇ¥?ÞÞ±¥¶Êºªb+}kÑÖ'Û’·�ýÉë§êí†Û˶Þ!ÛѶ3~gsµguõ.£]ËjðeMç¯ì ÝS¿×qï–}¼}eûa¿rÿ³ŸÓ¾y ú@ÓA¯ƒ{YÚp˜{¸´«�QÛ]'©k«O­o=2æHSƒoÃá_Fþ²ã¨ÙÑÊczÇ–g_t¼ïDñ‰žFyc×ɬ“�›¦4Ý=5áÔõæñÍ-§£OŸ;~æÔÙ ³'Îù�;zÞçü‘ ^ê.z\¬½ä~éð¯î¿nñh©½ìy¹þŠ÷•†Öѭǯ\=y-ôÚ™ëQ×/Þw£õfÒÍÛ·&Þj»-ºÝq'÷ÎËߊ~ë½;ïí^é}­ûŒTýn÷û¾6�¶cC^z”ðèîcáãçüñ©}Ñö“Ч¦O«;\:Žv†w^yöͳöçòç½]%jÿ¹á…í‹Cþu©{BwûKÅ˾WK^¼ÞñÆíMSO\σ·yo{ß•¾7x¿óƒ×‡³S>>í�ö‰ñiíg»Ï _¢¿ÜëËëë“ Õ^€@=ž™ ðj;í®09ýg.•ÖNDhýÜ.£ h;’æÄ4lBÍ aºSÛïÄ@À]]‡b¨« ÓÕE0–mMÞ÷õ½6`4|Vôõõnìëû¼ íÕï4æ÷Ÿõ(oê ù£êÐw¾eÉ<Õø¿uÿ¨âj¥FÃæÂ pHYs%%IR$ðžiTXtXML:com.adobe.xmp 1452 434 ýæÉ.@IDATxì�œUÕöÇ' 1AP°»[»}æ³[ŸÝ‰ÝÝ(Š…Ý�ýì �ffþßaù–ûÎ�sïÜ{§~W>ã>û¬]¿�ë·×Þ§üë¯F×´(/¯©.›]^YYSSS]UÞ¢¢¢º¦¦¼¢ºª¬º¢¦¬¢ºEUyUMEyeMuuMyey‹ê²ªšêòÊŠêYÕe®¨(«®®(+«¨©© ]6»¬²²Š¸Êù¯¦¼š§Êêê²²êÙåeD…gUye‹òêêòò²ê2Dˆ¤ ±Y-Ê*«Ëjc«ª!Ö2^”•#ßO*x¨©jA6*f—U�G¼ \SF†*É0ÁÊ*ÉIUu%ª"«d¥†|Qºj¤jÊËæ�BUVÔTÕTò·¦ª‚rÖ––ô*Z”Ï&ŽšÊ²òò³‰°ªº¢¢†´æüWU]]It-jZÌ.›Eúµ¥�UÖ¢X•W—WUήÍßœ²VT•UUVWTÕÌ&³³ˆ—d)F%¹¬-YE %g–ÏÙÀPYIê@ZIL•å•U¤[NåUµ¥¯­ U tYYeYÕ¬ÚR–«ÖTkêk•êk!5Bj^ÓjD«­!µ†ÔÊ_úšô5iÙ¹hÙ-n¾åÆ2ý„€B@! „€B@!ÐÔhÑ·o_ʸå–[6õ’ª|B@! „€B@! „@³F€3,ú ! „€B@! „€B é# ¤é×±J(„€B@! „€B@€€H5! „€B@! „€B Y ¤YT³ )„€B@! „€B@ˆQB@! „€B@! š"AšE5«�B@! „€B@! „€Hµ! „€B@! „€B Y ¤YT³ )„€B@! „€B@ˆQB@! „€B@! š"Aê­š¿˜ó«·ä•°B@! „€B@ÔÒë ø2‘ õ…¼ÒB@! „€B@! JŠ@‹’¦Ö›…à[n¹eÞ‘$8mÚ´äÂ&™G�\“�¼B@! „€B@�b rûí·[ÌæXc�5Š‘P£ˆ³Ça°©{Q IÝ³Ñ c€œ1cÆìÙ³›aÙUäb @‹š>}:�ª‘+N!Ј°ÑU}!�*ÓÄ”h ƒÌœ9󫯾úüóÏ¿þúëßÿ=ÃìOÓUëMˆªÄ„€(6òÔÔÔ*BÅ㘠HºG÷/¥ƒ«'.»ì²Ñ£G'I1„^j‘5ÂX‚äw &’³‚D‰3Ã#p† ’AÀ^=òÈ#M›�aˆ9ï¼ó¾ÿþûÎ�;ŸqÆ Ų¢*�ÔÂo¿ýÆb´Åœ_«V­8#Æ�§ˆd£x|òÉ'/¸àJ1lذvíÚ5Ì<ÿõ×_`>kÖ¬¹æš‹ƒxíÛ·o¤h7Lx•+C3ɇzˆqõÜsÏ�þùKB41%*±O>ùäÊ+¯¬®®ö°ë®»îŽ;îè�îøî»ï†ÊãÁÜ¿÷—CÔ#š»ëüÒ$�JrÎ9ç�Ö†n¸Í6Û”&Q¥R_@g\~ùåßÎùzè¡‹-¶X†œÀ€ Ìù þ"Ì×K2'yU`-ëºë®K’ªËì·ß~î.¥ -É’±R檀i¡Ý�zê©é¨2v~bæ›o>RD ä¯4À‚Ÿ<*Öúܼ{饗2¯ÇC-³Ì2¬Mù>Qü•|òF€ÑóŽ;îx÷Ýw#1,½ôÒ¬õËËË#þz¬#>±·sÊ)§tëÖ-!½à†nøøã�—Xb‰&V ¡99þØS>RGÇsÌ¢‹.ÊfÑ=÷Üà r|žyæI)\TÏøÄ„}“Ú¤I“ø^[’=Œ¢f¯î‘§¬ø²îÝ»cœ¼Â +cObܸq¬-ó4Nºn Cš¶aí¤Äp8pàrË-×:i˜a¹Ó!ШçîzQÓ¡šÜVôüóÏG-²y¡xZƒ�Kd,4R3fÌÙgŸÍ«Ã?|É%—LžmIFà?Ã+#%~dùB¢Nm¤ãAœA˜ <ì°Ãê˜Û“ uÌ�‚ &~ôêt†¬¬®|”±ñ¦PyP<™;v,D&Ó‰}ðÁ,…E‚¤Ã'Öú'žx"w9ÇÃRìŽ6ç ¢â˜Ä'‹`ÉO>ùä8È'Nd°RðH$¨¸ÔBÄ?ÝãŸþÉ+–#ÌüåXJ:ÉøG&&òC'åo ’.va¿ÓúlÎï–[n9ýôӱР_ÕÝýßÿþ×"Ùb‹-à’“Ng|SSÂ6*Î_ÌùÁÉžtÒIÅSçœÈ]ûÜMÿj#j]ªà…^`:  ü¥JlÆ\`ökÉ粺¶ ‡å&TJg‡bìbÔú-ìæ›o£A£"ü5�82 H¶nÝš€uϹH�ºcØc€æ°ý�–-[î¼óÎÊÃPCÌw!òDaŸzê)<ƒÀþûïo+¼BD\È88‹ñ¯ý ýÄ"… 4h;®ï „|óÍ7o¾ù&çJ ™¤â*+{à�Œáü˾ûî»ÐB Á2¶¾øâ‹èáÚ,Fñ±ˆÈùå—矞o�EòMï\« QtöHaKüÈ®Ýî»ïîC ©CBaå�R�›ûÈÍ$Ðs…=nS ‘äç¯êÝA® Ëæž{îzÏIÝ3àý„wÝuWþ2)¼üòË0VD޲�ÁÚG‘k�Èœ±ü’ÆØ„˜ItÁćÆÐ”° AˆãüÓO?1 ™*ňôðÃËä>D¬aºûÜ�rDýðÃ_yå• &ì½÷ÞqÉU\YÚÏBˆ`<[ØÑ)ayQj\’1óÁ?~üzë­·Ê*«¸¿`Øgüç—A¦”¯à;Ѐì� é¦äAâ AâDIÙ ’h�)H—.]0%¨—¡ªazï½÷8UÈꇥ$AÐÜ®ºê*SK 3¯¿þúEYÄàB!ᇥ.ç´1ôjnWÔ6ì?üðI0üñv ŽæÑ±cÇ•VZ ­ƒSÔ 4óÈiêLo,Y8çŸT(4xg/T1óއ1„æ§#¼öÚk_~ù%�� ”§jןó CÕ»îãâ‹/®÷l< ,°€ÏÑlmñ­½#F� ·–ÂØð,õ޶@Ì4‰ÈX×T± ++Äy«­¶ºùæ›ßzë-Pí é ¡°Ü �&0w§Qþùgx þã�?8 Â<š`` Â`ÂÚ©dí¤gÏžñûØ54ë6L D‚”¬. žPf¤x )" ‚jÇ&öüú¶-‹ ¨"tд™?òÓ¥Ùg}Œ~HU²’Ž,€Ã†áfG�¹q�…5�h8Ô»ñµlܱÔÀæ–GÄðO™› &·½zõZj©¥"bÄ€ÅZ�¥ 2ï¿ÿ¾)´ÖÆ|IGyá†íŠ lçè<�:uÂŽ1ç�)ΧŸ~j‡ÐP09†tÀ4ÀA+¶ƒí83E#!Øg@"éÒ;"><²‹Å P¸Qã9ÒŸ‡¬^Àdá…æ/•òÑG™<óW®Æ£(0!Z!Ú=zX�F$“¤ >?™‡Ÿ¢‘p)Vy¥¼9•öó믿’0‰+~‘¶mÙ&ìQhœ<Ò ¹+!¾ûAsâ´*m’–j,îß¡Cˆ-��½G¢²É7PuhŸ\²u´aÒE(üi¢ÈGlã³vR¬÷¦n¥¶¿àOY€õƒ‹'¼Ï†2qw†bfèì\3Ì[ÚXuD×cX°±(L‹T��Ô '�$½î&]_³1�˜©5’ º!"#˜'G6»øk¡Ò‰¹|ñä!\׆ …c»ç0„©Gf»Î™áÂGlŽ5Ц È}ûö5»’0fܤËYÆ%D¾ì²Ë2Gdâ�[õ1Vû•^OÚØ;ï¼Ãêœh{÷î�îè¸×,ÁSN7ñÔ‹çCÃ3, èoxàÅ“þ‹gXéÚXÖ‘Š9‘Éš‚¡ÍŒ4fâgœ§F`ÌZXä“Ô`ƒBœiÛn»-M(¸ãÀ[¸Üð¤½1/0Y¬¼òÊÞä\‡ÔDB¯ïÚµëâ‹/��dÅbͬ_0•„ñংЄ k5âoiÒô;üÃ5 ÙK2�0­SMœDYN°0c±á“I4–zÌcîóÌËWG8J¬”°S› Oµ²r°l`üËT…A«ÆdVÝÈМâVo6Ó& ¸‘àP¤s�ÛgŸ}6|KÇ^Ö-¡'°DŽî@-à°¾®…<~oó 7Ù2‚³ºÀ2 {¨§"G}!�Ž!?n$‚›q¬P6 VÒ"’ Ù�ÎùA‚¬¸âŠ)Ù�‹.º€…£)iõ…¾Ò�#ÀL¦Cÿ;3ӳpî‰!5Œ2Ãéå[o½•qÜ_!̘}O;í4/÷ì±Ç"Gpø¸¤çõ×_w¬ª�:ê( ‘¹æšk˜õ™'°æz$;Ô`Aî½÷^2`ú'ÚŸ&ñ¨®¾újss.¾7ƒ&­.²ôÇ0l·ÝvóPÅv<þøã–ë]èí„ÉÁy³™ŠKÎ1wux,¹l•eÕwÝu9ò$ð„v 5¦[j„ûG\K%*4Œ3yêa<¡›žÎ�VÌ‘¡'•Ù¦ßÖm«@ÖµÔ>í–Í@Ö’`Ž¿ñÆ™ìC09òÈ#QœÜ“eM½—£gîOS¤ ð¶.R7á=ö؃îc]†´öÚk[kgµÇu‘ê ”p>äd5’¤Ë¤!4uGÃ6�1ú;Ÿèм�“$3¬†M妩lºé¦ÞmMÀþæ”zÐݘ<üûßÿ¦¦ð4h·WG}4¾‹ÕAcf¿Ú’ …Ã(A¥K¨±e3„�‡ÕW_ÝX6p†ÅI[or‘Õ€k2Îå‘– GHCË8wÜq΀ÐDûõë‡9ƒ½µv™†ÐÔ#ØÒºŒbÀ’‚ÕOD |LRL3 ˆ›­N«hz:›«þ¶ÝÜøÛ–¸=²YŠÃÆ:Ô·çbžìîš$ YVlñ¾F;a`1Iè¯} èiWƀМ` v^2‡�!‘ä|f¹ØÑxñ  b,^=ÃÖÖL+N€²žæsÂ.–ÒAÿ².v(÷Ø�±°;³#ö˜¤Q¥Lº”žÌqÖ�hÞÆÓù<›²�%©B};,ŽÍŒcˆm(æî„5ØÇŠ@ð‚À_ØðŽaQØ a@ám‘Àê”Ø‚0„S··8‚y CD‰±öæ ±ÑàMŒÝ?½ÇE†åÜAäîN9�PÛ®XB¸`“eíÅo\õ&Éçî„Ë×$(°R<*«ïq^#æ`ÒgoÌÜ á\ƒ§ŸIÙl³Íâí-Uɉů�e³•…åSØ#LÀ‹™¤ÓѬ¡RŸL‹ôÆÀxæ½Í»«™¸Š%�¤‡Æƒ7çaÙÆà‡#ÒÆêãA|°Bßt•ÏÂÚ€XISkŒA~!å�6„F"4wÌCB³‚‚$ªH"`�É2”×ýbÈBe&f;“Ìx„2À@C�‡zˆ©…•Áo¼áctU� –L-˜Z°¼°¶K€¸¥¢élöY&·$8ú†p8˜áN®¸"¦œu3j3’)�Š�� n?e§—à|»‹Fñ¼öÚk‡Ê"ƒGX›�æ Z#PÂýòi‹¡°8Ås¦!Ca“4² �$¹Â&Ÿ­³h¥rùÈ4þØŸ¿úê«X"ij µ�á Ý [è<a~�v…¥ª) °ûØÚØìE‚@ØBòNÝò¼ä7™¡mØ¥âo¼1F=x6Œå`dÊŒ¤ >èá¬\mÒÅÿ?ÿù‹ râ3·¥‚ÛæÆÐ†Ö‚›Šcì2+Ä4<ŸŒóËí“6OËGç±AŸ=CW¤1gð3®T]yJØeBS�ÀB»‚¼ã Å¡I`eƒMMºzORÌ ��õëERa�òêã²aÏÄÓ­ù3Bâ` ³þÈXg£cöh¦=2*b-‚? Ý-¥ Ú¶NìÑQR«,OÎìØßÿý¸é\,þ²*œ‘à ê‘Ã&X31ºÂéÍÀBé,Øt0Dû� øûi°µÎ- |�y¬o¥ˆè\Ì,‘ž˜k‘QYÉÃ#³iœú²Ëðq'iT¹¦Xwùp¡k`ƒ`qÒ¼0#ñGÚXò‘ŠÙÞ<ÝÌI%ÃcÂl€ã`Z¯¤±¡Ôùö-ÐG!yÆvŠ�$æN¦xs’…ÉOöð0ß@1Ö3†t…¹™‘ÃÃ&´å ý�€T(b\ˆ~Ùe—±i„îÁV«# ›÷_²Î# z~ué2·B‚Xä bÞØ]=&œ»._¢T¨J‰Ç¿I3`97ó!o´".H¦w3|ÙbÃÁ=¾¿Ä+ôaóGíÄŠTe–wŒ�p<"IçûçlÐÑNðç7räÈøæ u„:ÄXG$ž%“ç/}Šå¬éW4$¿—×—ó@,ã—Ù4¨)Ô¤!PPFçdÝHб% Û‚1€3¹–>ÅÔP`¦¨#jŠÔ!ú-W¤n}9§FU—läXaëàš!Ýh�Ä@æ(H[¼�å:RyËL73†ÉÅÝyÔ`Øõ0{dñ@#�n¶Òí¸ãŽ¡ÇÅX6Ñ~ŒA …Ó†}6]ìÛ=x¦dë˜7½ÊhoƘ#Ì^…­XpSdÀ*‚QÈNàŸß�v™G0a³L’Æg@ˆŸ®aK�ÆX� –dîN¸|M‚R~5B¨x¥¤‹Ê»¡;,¸�lnyXfk-ÜPckUTKxC’àl³NÁXŠWÒ–òK�•°1‰Ä ·èCKDöÆé¸yp˜µ‡ºdssø�„VðÈcsC£¸$HJÓúb¦%xPØF7&ŒP� Åä® lSø�Õ'¼FÊÑÁ’`æf¦77ƒa²>cðŪÜB±¦1åÁ³ÄˆÏnƒ°gêµÅ1+6¾oÂ[“d¤³õš¹90ˆðú ©�ÖÞ âšy -øˆÙÔu$ãžCw°Ik¥@ûÂv:nËç’ ÊJ¶2†Å`æ�%Ží²‚žÉ„o1»ÀêÊ}(¾¹}aêµÃœ£ûìTÇaÌ;uO×q¦ê1£–ùá0Å>ž¢,†ƒÆÃT5/;:¬³R Eš·…ð3G–Ú­ŸÑ­£Â±r¢ Øî(… HBò.Ó`›:ô÷DX¡`fm áU“3'tCÚ;´=ÛkbX#tŒppŸˆ™{P�ÀNÍe�Ù‚Õš�³�3Í|0ªŠô5‚³nó10Ì n†>†5:£ùpÀ‘ª�È7ðGö½÷ÞÛÆp² ¤´X0zUyæ}”vIÇyÜ60ÅøúÕÇ%�$¹ƒ‘0¼|„8-WÌ&6aÕ½Q%ÏLN’´%ÎX1ùAQ†&šSÄN0ÞÆJ3R…eI^ƒ pü.t6§ä(AĬ•6iå¥ñ°9gM”Rj êÂɶ%8‘�ñöFT~¦Æ"g 0n��ˆyÐ<óûŸG¼�8ÜŒž2ÚFZ�Iæî„Ë×$(¥„.‰g¼R’„ eüØ$> É^Ù…¶i´aÀ‚»ióXÕ-ƒ’/KØF²Ñ‰ÅD^~‰2'ÚÔÌõÕÌ)a$>w„ž9¹“ôМ"”pÉ`Í1!izž®J03E<C.M÷N2ʳ‚k/%»Y@rT¬E°Åp}/IV}IÊ�)å_"þ$ôgÝ`´qè‰ÛWºäÊ¢b)`·EF$ã�Œ¼¾7›Õ†qÜÈuÔ~–ž¬à1B)¥m! ¶ž8”ÁÎ'ÔRDÑJY‡«�ø<2!¡ÑÅÒ›|¡k>Tû�ìñȈ}HÒb�¶ÅÛL~©‡)ú”†…<¿ðU½¸�5(J/f ~`“~øAk ÖžAÀöÍÂL: ©ˆP&‰;~ÐQŠ| Œ-y—iM=Ìyèæ» ´@,¡°TÂìÜ›‰%/fmè¦v¸›| øA˜³²A1``¿—¤Yóh£Uo&Q^ ~´Ø£%NjÍ·‚Ý�§ÂW¸ÉƒÛ•�çRŽ6‘œä‘8R_-|kæNáØ²$Àj¦ ™ñHÜöÇ}Üa¹ª{£ò‹ç€†f…%ŒoT¤lc%©ÂÂ&¯Á8þ Ú#¬«�å1¾nñ¢pšÎ?tSG°tAKäŒ?LÉÐ~}ÊðöÆž�Ï¡ƒˆ¹gŽ ó³ºþèÅÌÚZ=R¢$s7Hf^¾:PÊ£:,H¼Rr� Ø!Î>þøcæþ‰ÐnÙ£"†Yã÷s�3?yÖ–¬ k ›:4x±X|Ûæ“O>™ù|}ºt½ (Nº†š.lÿ¬=4I$MR#MöŸ¼hn³é>õèˆ0 Æ h<ft´½æ°Não’|¤; K5pë~1zB$¡føèÛ)»�\Ycs²#«d:�øÒâ �p:?zˆ ³Œ‰,_Q),JÜAøˆþ¨aá­�qɸAâžé|f‰–î­û3��€¯É!ÅA#é] GN©‡3»ãµœY¾PoYsû:�ë\Ú6ƒÐ]¨D=ž ½#«2é‘ÄfChêñì™K(?à �3À‘� tÝß‹é>q‡[³sÖ k^;ó‚q"ß1±çZj2”°0#‘8sjí4•$}�„lAÏm#òI×tÓù—¦huO=ÒJ“mRAIæ‚!®a§‹ã�ƒ ò)ÌC†6VÔ‘*ÌCrwØ“ã~Œ˜˜ò(–£1ñi.C)”¿%6î²á¯û@³rÉûÛîcŽº·ÌH„ác†È bnÖë‘âg�»CˆBw|ùZ”Â$pg¨”ˆdºG`g°·𡃳m`&Š�¤u$ÎÒ%šÒß.Ìâ, ÷ÚpöŠ‹Ù-ó£»X°²‡�2lBϺÕ2¡ä=4eð&ì ]‹)4ô?~gV½9΀@yðsóˆb؃×LYtrýGfpÅ€dƧŽoÙ;IT¶šgœ�Ü*š$lN2$d«7¶1Ê(Ù”í >öÁÅN\KfgÙ Æ$º=§üç-l7­ë:Hò‚ǧð¼ódÏ�kÒ8d"`âˆÉ©†buO�”7Œ³ÞÝÕÆòÜ ‘8 ËfVôdŒŽS—ÕFòj�€Àet�”IçÚe꽩GŠæ�49¦^[Hñ¥É¹™k1=ÚÐÁv›W°œ� l°‚¤F`@  y…‘$Œ�öýì0xÝ[»ÇFº[l±…]CÀî13:�þ¶:ØËeíU₤Q#Ï 8Ђ)û{Âäê8R%L%KXƒ jüa�¡ ÐÙá\ #>X¢qaG|�~�6,x膽 ‰3Ýœ°¡Œø!³`²ÂÑ#t‡ÁºóÎ<Ö"‰6Æzô"¤œ»©’/_“ ä)º#ïJñ²:¸yÚæ/,¡Î¹Ê— У¥4$¤�˜ÙTæÜ’·¬ãyÄ2¼ÊœnÖ· {hÖxš˜c Ÿ_ƒ*WJÄŒ>àAü€LÁíAŠn ÞJ] H“úõaAF˜Kl�´x™a¢²ÅCm®6uÌ; lq;7«4‹ªŽW<$ÏEö…BÄD®äÌ»‘ jT8Ös™C%yK®ÐKùvÜš<·aEÒÊ;uߨô]…$Y*™ t¸µyÀ´Í[HQüø¶^òv\9�™Éä±8åÖ‰”aóè2õØÔSÁ�bzXw9G$xdŸŠ/Fá°K=HšKyydqiþ�°qc:f$W4�”çÎ<Åt¨^Ls}™È½ªY?›.ªFíï-޵H»ð)H£ÊÞ¯êEAFªä9Ï£ÔøCß§°ŒöVj>¢l§ ìÑõ±tw6DZb}Ë×ëùJ½�f,fø™˜íñpjÀ¯9sû,w<¶ˆ1„Ù‹¼MùèE —Efp—oìõè‰ÏÝ —¯IPòT"Ž<*%C’GVMv%}œkÍ„ÅÕwÅ“DRGš�m`~‰NØ=ÿq‡‘›s†—¤L1%b>î¡hXOñ°¶ óÇ::2ôÐ:Ƭà…B BP!ų): B2ìýr9‚NÁª¥Œ‡]&›øS¾�{"ìfx|p$~ÝWLWFF2ÊcƒQ9òŽ–€ ßH<áhKaÍ2™¸d$`éÒ\"hrð„ã)#gn`hà›¦¤Aš„÷ºñ à tf É9Ò”ñdöô©ÈÄ0‡±³ HÝSç¬�Åɧ—ÙxÉœŸ¢¾µ­‘$P’Í(š3A˜ Ð*02nk 4X{åvCí-Wå±=èFRLùÈ%vv-­÷¶Ûnó6 çÔeœ×WS3q³Í…ò`ž‘…]NÅt "hSäÈF(íORÄì+Ì 6)®P ÖViÖû\½ÈÚ ×WåÚ×XÕÑCùxŠÅöÀ¸9±ÇßäÞ™VJOåÔ¨E]ä:RÕ½P9Õ`C Gá% ,Ñlå‘ãÛFÙCŽdæ»#üÈDn‚€±O¡!aÿ[lóƒ´ì»3$ÂeÇo…Ff|{•á¯�Bù�WùÆX� çî„Ë×$(Z¡*%‚ÂG_‡˜<ý=å§ÙÆ–«e·«š™XÈ|Í�Eþcç€éÕæJf7è‹?9bÌ¡6es9?Ï;OW\q…?æíÈÚCóŽY ‹@fÄÒ*U [6‹-õ ¨yÍüó<Å<Œ“oÇ¢cc,ÀÆ~øÃ< ÝXØ9I†62ºá@ýƒŠ¦²8ÁæÂà9¹¹€ÓÖ´,KÙ›E¥dÛ„Wfû€VNš°�­hGœòÀzÊÈl^1Ôră•›3$ÄñÿˆKä<Ê/ÙãP¥…e¤æó`×\s ð’%´,.¥Çfþ ƒÚgŸ}8Š»¸Mž[$©G$M!çjzó‡L´RÛc¿$Ç-•0PŽÛâ4æË..!žº§Îe¢¾ ÎEÀÞ�m.쇋ʵ9´+vTŽ;î8¦vk€Ï�ö4LÃ�OÐ1åãI³dJö�¤‚@Ûvù8UÁÏB™$nj =™6vÕUWqO>®Ÿ›dæ¿,qvØa“aŸÐºÉQ5\àŠÕ’Å–°Ë4�¦ž¹Ènl �4"™°˜„J×Ùyå—e"ÃÏo A°þŽ'b|ðÕS§µ;UÁé-F?ëk wß}·‰ 2ÄÈ•ÐA¡|�ν}´½„›† ù}L ï¦|Ò³8m7ÊÁ»·¥x…MÞ¨Š—‡ÂÆœÓHU÷¤“×`Ãlmèf\eĶѕ©Ê?ÿÉIˆlü™ª E0³ñŸ%x±Ðæ © 0PØš ˆŒQűÙf›æ´vî�dEkg=Ævºù³Áîü¯Ï#Œ tÖlLU$šk­Qÿ¨™õ2ÌlébÌeÄüÄOa£«ÇäswÂåk”ªP•’®�|>|8mŒX¸ºæ³˜ºxX,â‹þ¶àÈkÒìUû î0fOŸÎ8c9OŽ¥£²ˆ�€ÜÎÃÚ exذagžy¦¯ØÃäRºiÉæO`- È|mqfí¡)#”géàÆ _2bôa§`"9‰ó Y¯ÚˆÄ�ò±Àw‚¸‘!‰±½f}äô^NN†9 _1(ãý ô?•ÊÏÍYPû|æ$"'Õ3 7¨·Ìè6$1g3ÁÇ󯶤é¥6÷#`ò8V¸%�oÊ–9›[3ÃàÀÜ.æcwøÊݧû˜Ã“p±ù� (™~ÃäÉ$?s{œ6âo�ü%ÿ|©Ñ, QŒI!•¾}û2>ó ?—Çãfý‹çF…¾ñÆÉ•éÿ÷ÍùeHŽSc`† M*" � ҈g’GCm„_D¶Åk¹î©Cµ0§ò=lRaqÉÏ“ÃXi�=öðÇ¢:˜¶¡S¢ÍñQ×~i ÄL¢àÃ24²åmxŒœñ�• ü-3üö v%¤•SqÐÒÉ+WBEºÙ³–Ÿ°Ë4œ¦†‘>ë˜ÐU©zî¦E=0O—LXÌ ��ÙkbÕÈJŽv•�ÁÅôÁfƒC‡5‡t¸Ž­¶ÚʶÇq3æì¼óÎFž²Ã/”dñƒ±øCÅÒ/ÐâXwùç´ß e}x ƒgpÓÅXoÛ‡Þ#½ÌWÚ�®ÎÝ Æ)Éò5 J¬””õ…=)kQz%Ÿé�óB^ŒûÚM˜²¬¿þú¾6+ñ•¨/¿ü²ecƒ 6 ')ó�–GÇ!ÿ�žô|rĈ"’/µœ_¸vJ™VJOænìgY,ƒõef|ΦY†³öДq6yOÔ: QÍþ€µ}h [/eg‹B™-� ˆeÌx»Ê÷†ë’íX‚°°H™öxý$dÄÜÙ ÷éã6QSFR$O.Âdõ™õg_O,RŠ-ê+sg†$|Ÿß²Ú)—gg@aßÌ}ÌÁÈâ»åø˜’Œ'óS(iqú“þʲ„rÊ£�@0ÀÅÌÁV-uÏ”ùä­íè’ˌɣLzë2£‡¡ÿíóæ-’æ.ŒRZ‚XêœùÏÏU†Y M~Øa‡ùÆ) ³bƒ$Š Ê Àö”Ïš‰AÁßg^yX/,>qKŒx9ŽêfuO�œðå]òï D//›™™ÛªKÖÑAaacã‘P:¶ìسѳgOöëüÔ’‡ÂˆšÃ±…ºÁaL‘݇ÂR­ /†¿£í8´B:”–µöÐ’Ëk3I—i8M�vh…M‰Ó‡[ å72¤ëì GÕø‰ÎÂ8€øÛµ ÈÄ›où„ ¾Ë[E�=¦-Ó”¼j¬¯$"lñ·Hîµ×^¾ÆgAlhòKã°Fö,‡ñDÍ?R®tƒ0bĉÊ#G‡XÖ³Ü��ÃÐ| zž“”iYB¨¯.†#¥'þÖêèªaÕ$é;aäÅsƒ�åЇåti¥¬ N>RÄê‚-N�G:y¬’Ô`â8Ó|óK Û�‡8€NifàÔSCØ®xË#¡Ðqû�µ.­�¡Ã}p 9Â`Ö[èL‘áÈ�ö€><ÆóCTžŸ0~ŠÀâ!²*@ÔT—lDõ˜ÓÜ�pùš¥VŠÕ5‰†Í†nB3k6Bx±ugòÈ„±Wb‘p Fð&yH— ">—Ù¹­œcÀºÖN{0ƒ'Ÿ|²•:åš!lóà €a«ö­ë„=ÔÓm>>‘˾?õ~2õ“%4 )� HX5ƃ˜°«±¡@®îr,á ã[ ¹†Gž}K3±‹‡Eå,þp„¢›³þ´]á>`@Ì}ÏYjó)ÆßÐV%yü˜Ä'N(i7cÙÕ} ƒ”^Œ…/`±GĸCƒCc±Š+FNX‚pì“©‚ui1˜Ö1,¬Æ�OlÄÉ*ÄsÎf Ö¡xBÒá_÷„ê˜O@f³š¨d‰ü°eªÙaü�¸ô&fDBQ´PmÅrr'€ Œá 攦�aÝS§-QRª€IŽZfQNi9e;?a’Æ@ƒ†AI'MšDÂ¥mªÓ€1ÜÀŸÙ“aß×q„YÛ0ƒ I´$y‹±Ñ2ˆÅãOécë72OEÐÅÒ-uK=æ:w'\¾fE©°•¯)›hq°Æ[j›.A“ŠlìÅãi8>¹"ÆÈf$ô‡ Cf¾|ì�ÍÍQ„9€KÎ0š µEàÃT‰oJ›çgœ�ÍaÈ€˜ȃ`ågÌ"QêK9?}”0N”®-H(œ\¬”�>y®$)„€B@! „@}!•ÂÙLh4)»ª¯¾2£t‹Š@)õA‘ aUf:1ÊepÃ.cH’Õ–„oÄ`|è6 ¡Y˜=gõñ/*Â×@ìÆcÏ@V‡@$«¤„€B@! „€y#€uƒÝmWâ+Qóΰ6 °EàŒg•Gw7CGH�„¨Av`Rzy@^AyÂ_Ü~A·Ëʱ馛’>,ê÷•dˆ3B�øÕ‚è•B@! „€B ?üã%¾5¿Ü*TcA€›PÉjx1jcÉy1òY:B!CÌúÃxŽëg�¬ã+Fr??¿:Æ£àB@! „€B@�"Àf0ß↠®ºðë½ ¿¢j¶pbøåÍf‹ƒ¼t$HV áAèö0 |¹*«°„€B@! „€M ,Öí³M©P*‹hh4 hŠw ¦¡á®ü! „€B@! „€%F ¢Äé)9! „€B@! „€B@Ô  ˤ^ ¨¯DûôéS_I+]! „€B@! „€¨G¤Öø²©/ä•®B@! „€B@!PRD‚”n%&„€B@! „€B@Ô"Aê y¥+„€B@! „€B@”‘ %…[‰ ! „€B@! „€õ…€H�úB^é ! „€B@! „€%E@$HIáVbB@! „€B@! „@}! OäÖòJ·‰ 0øu¢ú©ÊÇ�˜]? +U! „€B@! -ëo_|ñE£-‚2.ê�¥ê7ùf›ºF­f[õ*¸B@! „€È‡É:B@! „€B@! [‚¬°Â �)×Ê«h0¼¤®Sou!èë z%,„€B@! )²i¤§l ! „€B@! „€¹! $7¼$-„€B@! „€B@4RD‚4ÒŠS¶…€B@! „€B@�Ü ’^’B@! „€B@! )"AiÅ)ÛB@! „€B@! „@nˆÉ /I ! „€B@! „€�‘ �´â”m! „€B@! „€B 7D‚䆗¤…€B@! „€B@�FŠ€H�FZqʶB@! „€B@!�"ArÃKÒB@! „€B@! „@#E@$H#­8e[! „€B@! „€È ‘ ¹á%i! „€B@! „€B ‘" ¤‘Vœ²-„€B@! „€B@ä†@‹ÜÄs‘þå—_Þ~ûí�>úhܸqþù'AÛµk×±cÇþýû¯´ÒJݺuË%2É ! „€B@! „€B N…™4iÒÍ7ß ÉÚØ9¿O?ýô¾ûîƒÙk¯½æ›o¾ˆŒ…€(555UUU3gΜ>}úŒ3fÍšU]]�!ÝŠŠŠ–-[Î5×\sÏ=w«V­*++ËËË3Èë•B@! „€B "Pxä­·Þ‚™r4R^{í5g@:uêôÇP꽑§ g›S0¿ÍùA$¿�¢dÙe—Åä½÷ÞƒÖ„¸LG‚üôÓO'žxbä-–A}úôÙ`ƒ ø+’ ­  x‹¡M½B@! „€B ? F‚p &b²ãŽ;nºé¦ž-Öô‹Ïù¡¡-ßvÛmS¦L±·äPL ÎÅ\xá…(瞥\œò8á„r ÕLäÙÁ~ôÑG),ä×­·ÞºôÒKsÓ´× /ÜLhDÅÄ,ë×_Å$9â¥# ¾À ¤3à²KF"ü'nÞ˜óÊäôÓO§�xœrĈ ��B@! „€y PÄnB�$÷ÝwÏ?ÿük¬±FÄŸG<—Zj©‹/¾ø›o¾±·X‘,¹ä’Ilòã±eõá.0Ä.¹äLÍÙÄÎ$.@ nþ\ (½¼ÃC=Ķ<ûêl¼Ûré³a)rÂâË/¿ÄM=öíÛ—h.±Äõ•Ÿž.,À»ï¾›0“+¬°í6¡p1Hìtˆ6‰p\f±Å{ê©§ˆ$þ*âß±Ùf›Á‰|÷ÝwÏ>û¬Ý½ÊY�çž{nà 7ŒëQ! „€B@!Pl sà<åM¨¨è×\s F)ËÀ…t�³ ÜB$)%ëîyÄGض3Vú\:˜kœhqX‘p�a9ä�\c(ˆòÈ#çœsN÷îݹ|œa=8’0nÜ8 …û‹/¾Oø�EY$¼M€€Ë±Ä(2fË,³Lä¶E ÈF=ùöä\÷¶`)€|ÿþý]qÍ€3A8+#ƒ Ÿ@6¦†+!È ‘ð½~ä™Ìc0‚WÃðÝl,'äŸ cÆŒ¡8¸Éš39 S¤ pXøp›2Ì)*òL<ó—W<¾óÎ;Ÿ|ò ä>èÞ)Ïküøã�`b† ­pÏE¤1 °Ã;�½ý÷ßߘ�0'qsJh“M6yì±Ç²Æ†XÁ�A@€3pñËš�¸p< ‹Ž„Õ�?þ˜©MKš6Ì…ÊØjÑñaB©ÚDTЧKÃÀÜÉ‚pŸÈ€"õe’_ý5UOƨtOÏž=¹�È#1‰Ò>pÉŠ+®ˆX(ƒ?M‘¢Y_ É}øá‡'N\e•U,Ãä“܆ApÓY°óooÿüóÏ7ß|Ú<5È Ðt�HÀ\(„€ä¿W¯^tç”h @AÞÿ}¡;Ћ9ŒHqˆš’±"פ%/„€B@! š AÐ[ Èîa£ÆÁtþû�’AÏ|æ™gà>,¢2dˆÇV@Çšk®‰¢þÀ'Æ)Ü ²ýöÛ'ŒšÅÄÌ�& D ¥Åè�Hl°¨”î Ëcîk¯½…ÍÜЇ~8Z�‹á@…ãÎŽÞ½{»'Zèn»íÆ'?à†ÐŽN;í4…è°‚álK躩âã�?ÞwÏ6Ûlƒª×“O> A:”Çë®»îè£�¶ S!D É_|S�0BsóiŒAƒ¹?�•÷ÆoäÜÍùçŸï¯pÜqÇüç?ÿ1"Æ^‘"„Q¨ £Ü^uÕU›£tľ†_ñ¨��wÞù¥—^Êü1inF,,i¡ÜÔšÿrŠÓTnÂæÊ„�0…H8‡fNÑf.¿ürã6e#A¸á†@)L Zêä“O$žyæ™Æ‘¹$gëà.=Eüãbœ&£Gï´ÓNÎ#ÐhÿÜÇA½ÓS~øa‹� cr…hPO™<å”S Jho¬FAÒæée¡í /ôÌÉ ¥B‰ :HO:餰;ó î‰Q— X\lذaàÆA$|âȸ˜B@! „€B É#Pä£�>r˜Ø{Çm|G݃­]'AˆªH$¹Új«­P¿Q¹q£Û`‘d“ÿ«¯¾òB. /¼4¿8ýU±ë®»š^jwa~ü4 VèŠöj¹å–cǘ‹°qà¬lDžö–¨°­€¼0º*Œ ÷«¯¾ sÁ1¢t)"ÃF·“ �о‚O¸˜=÷ÜÓߢޛ›¯”˜ƒüP#ðäT;.žp1Oýßÿþ·GâŽ=ö؃]qÌaÜ)^qÅð/®·£ßÚí­d‰ª>|8iQ@”XÄÜ@†;/.¸à®íàí&¤(TÈ<óÌCP›ÃÊ-”ª)d êeÊ“GD †qãfŠ]vÙ�UõC´>ÔN,} A8øÀ++&4�1 ä“$ðäÃÌ\ï‚jmôP�=,«¼Zýõ±G e• AmF¹�kì– …ßW a,ˆÛˆ þ›ýÍ-�˜ýÍ,éoÃFr5žjñxà `¸à¬aм­«R¡ØøàÉ[*ŽÊ…L�Ä´ú¢³ù…yÖC–"•Î9‹Ç2CË7„†±Å[à¹ÝvÛaÁDp Ähð!¯áù‡.¤ ˆ�.ÆY®2¡Qq ªÅeh<¸¡iÖ^{mœ‚Áì\dDÇŽí¾ûî£íÑæéJ¤åa:èΜ14á}öÙ‡–‰›hañ0fÁ}Ùe—a2ceçD˜1 d‰Ö }ƒ“~ggúÈ>ú ! „€B@�æ‰@E݋͢ß"Amö}{|àABÖ€%;» ñ{Rm�n1xTuÏUÊPŠ 8ˆÁ[òƒö›!E?éÃ×@�:ꨔjRÊ„òöD%»ÿþû¹äËy‹ë6¥á,BŽÃã÷;/"yƒ¿@[CìÀ47j'—° Þãf{<æ@ÓC[Ûzë­á#æ6 .ŰWqáHX°å‡§›¢DxD«çÓȰHú·l8�b)š<š·'Äú�erÝu×E’ö¶ñÆÛ+ò ¡€ÂÌ#Ul_\æÊ ;o‚ÉÃ-·ÜÂ+‚¦©‹ü…»Á-7oA`¿ýö³¦…?<ž¼…û³°xÆoxEÞ®‰1‘—_~7D ˜yÂÄa†›ž±!2Ì‹0L#~²DwXk­µÌ?l*ÄÌ)ü!s»t邃®gÅ$«0 øvË-·´ó;þ‰‹*á_x‹Å‹–3DXÒá¦p8@†.lÑró´�® ¡ž!2ýB@! „€Í �BªXl´Fö“𠶸/î  ÷rë!)¢úBÊ`'O�s¯¿þºël车Ç% å§? ,2ÐÒE2Å U0¢mbaíŠÊ06™#— À5˜Ûà k Ž0Nw“§8÷áþ¡¸Îæ"ôŒ¸±dÁ Æ=í’"ÇÊ T†�¢ÈÓ8± ±PÜÃͬü°)°£7ø‡Wxzä8Ð�‹J…ð�Ú”ŸªMçæ­ŽnŠŒò 怓ð‡0AÒaϦÇs ¶H¦¢# �}õ ÃL¡±[M™?­È›¦`�¨/¬?°ý1:¯9<*Ì% ü .ã •¨lh‚àðÝœÊ Aã¤@¼DØzPïa&9oe 'O)—Å ·BþézÞ­€”$H‹ÌSÊHl#F›Õ�¼Ù£¿š ¾@lnãqÀ c7|H.Þ®B„³¦+! „€B@!Ð$hQ÷Rñ!N¼j ZJ¨ â™õ\Œ«:G>R÷¼¥ŒÅŒ}i”:x�ø]§xšnƒ.�)¾íñ¦Œ­ žØ¤`5ãQq¢„cl˜»O®£È|h›c‘øy+„‰½—�¿äª¼EòL<žtäm`äÈ‘#FŒHw0$”O ‘‡ H(on kÚ2e± Vã2|Œ Aõ#BðSüÐ3¹«23³“!Z{Åp9œåZ=ždµàŸÅÍš�b 02`yÿébåä\†eƒú2�Fƒ®š!oˆaqõÕW#Er饗âCøÎOõY ˜¥Ð÷3Äæ¯¸æÆƒ›'Y‚RÄ΂šÂ¶~�A»å-ÍϯäðÆ�ò†„#ÑzŠ'ˆS±>fZ´Ž[Ò ñë•B@! „€h>ÀÄL¾ 2¶=ãØe¶ ƒ„QÅã) ç2¸%Ñ"´ã‘È}Ùk#"´ND² �\‘À9�Š#ýŠá¿ûäçõj�!'.%%éà±%w�™ø=Á¹¬�s7‰À€  sè€ÚÉmÊü§,i†Hâ¯\OŽ¿2ÒåHÅ]wÝåäá�”[¸®ômC㳸aü%ssvƒP\þÊß3Î8ƒ»oSRF8攫�4a„ ÏzPS4*¬· 8sŠ3ŽÛ†ðvõÕW‡eÀÁÁ+3_h²K�±‰œG £ Ý Å îNÙòý­B@! „€B@$A – ýû÷ç¦@KŒ Ò¸U¯ÒÙƒ°‘ÎM�žQ¢rw±K/½t’$â&åIBå*×À—S¶Ýv[îhä3¨ôØðã÷ŠIg@‘5EÓÙBÉ”Zh(º1á”>\.�SÀ0’ nŽíœwÞy°—Îf>J2æVT> “!T¯PY�(Ế›ªÐYc3ú{§¥ ?¸Q5rt(k<ÂÏåÒŠôYÜ (Ò+"Ø¥¬S¢IÚe¥è¨áe®×åaA�.K¨¦ØÔð–;AØ¢‹™2HÉèO�*ã?¯;Up­Å°¥©àæ‡#ëÏ%ÉÁy,xƲ!¾5wDý#ÿ(º÷Üso¹&¼ÆäÙ»æí£�>êŸÀˆÇé>‘ÈÝvÀýi`lΛ=Í�OŠxX|�âÃ|Pòýð :daO¾„‰FÜ¥¹€†D±à¢hš �´G)’%¤²üG@‚‰¿ÍÛ¯&�ŠúâºSû4 ü]äšìDÜT„ OÍùyXs@Žx#‡›Øu×]1ŒâÔž±{.òN"d…‚vâô߈‰àJÇ<7æBOÐ#.ºè"O…"™{Sº3#*}–W|˜_'o9®EºæÙµk×O<‘ïÛ£ƒà†¤+Á!—[! „€B@4+ c dØ`¯¶ÚjŽ�Ù&}ôÑè±ì²ë32jÔ(tZ´ÊBÀbœ¶ðÌ4v‡[…®íP.Œó1� Èn¹=rUßs…eßâæ²U¬R~ˆ"€ï‡òìr£8ñù’Ð3¥mÓŽ įq5•�¿æƒ÷éÓ‡‹`C2 ròÉ'›' )¢”F ,Nþ†°ÖvÎapBy’{þùç·Þzë0EÜ\`‰µ‹{Rp.ÆÝžDý:ÐÛQ•ÇŒ¹@ÅÙ ÿçŒþ?|E<¢ü‡%rÌݾ ÝÖf¨¬Hõ™ ô\^ÄÔ‚W$Í¥&CÇÍ”8üÂå Îk˜$çVøB 9·GÿK퇞–¢u�ˆ£W¯^vã)’vEHD€Ë=>ñ®‡<0àFä#�)1¡;s ý="Ì�AÜÄg¿Cÿ~ýúaÞÍÇÐʆzÈ�!&ÃÍ)YóÆ&·B@! „€hJ”ßqÇ”‡Íɺ—Š7ß|3LGNQ±FÇ ¤M›69…*ˆ0&»Äè-üØhÅBC¿ÔÐ�f$Å"EÂA.�ä„Ê*DDŸÄx»ÞRA)uW6‡7ß|sŒçù”–óYEÕìÒ¥K‘òF Óa‡tÐåür|ðgç<‰H[7˜€*:eDç—$T“‘átÅç$9‘„‚ Ȳ)RXwýÀfrj©sçÎpFü5u="YŒGê‹öIóNW_v¶–)9>ÏÆtsˆ: ¬x¥ s´ `ii´1ÒŠôMÏRrPPà@?¥{âH–kbͬf£�6Úm·Ý†’˜B@! „€hbæ8Œ�‘qðÁcÓÂJ=+R�Ð Áä£�>ÊšÛ†,€.ÇÕ�ér8‡ÞùûÆ–t2¡æØBÉB¹Ùu�çßî4)T‘xrÅ$¼±?BÀz`Ñ@]óµ×�?þ�ÚmˆR–5aÈjj¡…"x)OUd­/£ÿRæ<î ׯ/î_p¶ÝzSÀ˜³BAZ˜êÐ}B3ê›ËFÜœ¤€ÙSTB@! „€B �#PHÄŠ ©±ä’KƒD®G€àrÁz¿„£y`g;’7{ìÙ³§�§�§h¤`�¦—a"„ÍBæ+]`Pé‘Çœ£‚ëHEì} »¸=„ å:Ulܨ¯ï¿ÿž[�ìª*1~z¨aD¹B@! „€Å@ ð$¹dÙÍE}Ü‚‘Ÿqã죹쳓̺¼�| —»¸¢õÍ7ßäÓ°ì�þôÓOhzÜ&°à‚ BåØ�‘ޡʼnv„âD®ìoCËžòS hêXv Ó[¡?8²Á/CBœãàG(û‰É€U½¿¢*éÔÜÞê¸Z–8kÆg˜B ‘zϪ2 „€B@! JŒ@!ï)qÖ•\¡àÅ|Ì‚od,¿üò…ŠVñ4|L[6ú#+ BqàA ?øÛð‹ÖlsH=~øá‡ï¿ÿ>ñ�€ÎÂ@ìr/쪫®ªºk¶ CB@! „€0D‚¨%! „€B@! „€Í�,kl¨�B@! „€B@! „@3@@$H3¨dQ! „€B@! „€(+ ¢V „€B@! „€B@4 D‚4‹jV!…€B@! „€B@‘ jB@! „€B@! „@³@@$H³¨fR! „€B@! „€ ¢6 „€B@! „€B@4 D‚4‹jV!…€B@! „€B@‘ jB@! „€B@! „@³@@$H³¨fR! „€B@! „€ha|õÕWÂB! „€B@! „€MY‚4áÊUÑ„€B@! „€B@�øÛd‰%–øÇO.! „€B@! „€B@49d ÒäªTB@! „€B@! R! $*òB@! „€B@! š"Aš\•ª@B@! „€B@! „@*D‚¤BE~B@! „€B@! „@“C@$H“«RH! „€B@! „€H…€H�T¨ÈO! „€B@! „€hrˆirUª ! „€B@! „€© ’ ù ! „€B@! „€M‘ M®JU ! „€B@! „€B "AR¡"?! „€B@! „€B É!ТɕHjÊŒýí÷?Æ�ëÜ©S—Î�2”sêÔi}úÙèo¿¯©©Yºß’–î—AX¯„€Í�„£hóD%ÍkH�:vìÚ¥s~1x¨/¾üzÔ[ï´jÙrÑž=ú/Ýwž¶mýUÜñí÷?0Å/Ú£{›6­ãoå#„€B "A’ T ™É“ÿB¿ŸwÞ¶hø™ÓóÓ/'MjÙ¢¶îf͞ݱCûºvɤi¼�>}ú®{øÇ¸ñ'sø¶[nž®P|ôÉûêowÙa›:’ ÔËìÙ³Û·›î¹çöh38~ùuì´éÓ»uíÚºu"ù Qé•hPÌœ9kÌÏ?·hÑb‘…,//Ï�·F4LåÚÁ3”º~_ý9qÒ„?ÿ¬¬¨5ðœo¾ùÚÍ?_Éå³F˜Yà½7¦þøÝ dV_wÞÎ]nwÎ\ŠFýö¹_ùáÇ1ñµ8ýe••–¯#×Ð�ùîûvØ}ßV­Z>ùнíÛ·K—½ÒS–Ƈ�ެ©)ÛfËÁ’éí¹vðtE®_ÿêêê«®¿ùæÛïñl¤›2Œ¢c‡Ý7úÄãÊçšk¥·ßƒ©ž6õ½µ×€)˜{±ÅVxñÕ²ÊJ�ܳÇ�ûõÎ;Ê¡ãË+ÜgßZÇÿÿýþȈoO=ÙýÒÅã8~{ð�¯ÿsdÉ0Tþzw�U«&O^ø�ÃzwBmÒ÷ßGÒ8ú?ðÐ|«­žGœI‚$yò;oÿùÊËsÍåq–·jÕ¶o¿ùVZ‡{&uÔÔ|yÈA“Þå…M0aö,øfoÀlûëØß}â™í¶J»-‘.­Ð�ÕViß¡ýç_|uûÝÃð¿ñ¶;WXn@Å:/ÃÍH{ÄÁûC‚<õì »ï²Cß>KDô(„€B ÑUK’0¥‘™1cÆåW߀2™2¹þK÷k $È£O<}ʙ筼ârW_r~ò"e)BÏVsÕ®l’jí5WCl®¹æñØ™{îÖIa„…rÿúëogžw±ÅÖ¥Kç5W[ÙܘÂsÒæfÁ]l]å†[jÙ�#Ù¿eúm:H™Ï¾ü ±ƒöÝóß{ìjÙ«Ëßêêš–­Z–M)3Ó›$QQ#´ÛäòIâŒË¼öü_'2æ«O§Û«¯/!$ŽR±}Ðöïö`HJ†)2ˆ5ä›Ñßm»ëÞ˜&=9âÞùæ�7ÌdNîÊÿiÂå©ô“0ªS–ôøñ®ºþÜú÷[eÅDÆ yt𰘡»P ‡q&t?þԳ΀ôZlÑÆŒéرC¤¸êJ+Œþîû†süxì/³·^óËFÏ ‹Ó¢e¦³ ¡¤Ü…E`àÚkÔr—ååãÆ�ë�ÿùZk¬Š‰øôé3úõíSØ´êƒUÕìÚñªØ¿ÒSV"¬’S�ïà%Ù+‘¹À&‚5W_åÂsNsc=pGÂQÔåÍQ•r+¢¦æ÷‡G¸ä„^ˆ“ íÖ^‡ÈÌ¿êª_zpêx<Š9޹ºwoۯ߼˯ðÿ½›þSœò9›"XßtÝn‡²93ÚÄ×_�þÝwpIï¸Ý ¯Œš»G�R‚Éž'½Îš«Óƒ ýß|û]FB÷ÏÛÁñ^ÂN›ÎRhz:„áeûm¶ Í?÷âËcÛ·Û]óNN…€B Ù"P0䫯¾êÕ«—©ÇA“cç'[k›Êïñ'Ÿ9éŒsQkÏ:õø†ÆúÛj»mÛ6¾�dy.Á_L K�J˜Ä3Ï¿tÔ¡°“LÒÃGoç_mõ^\d$¥þãá_¸_YUÕï#\ä°#Ü;3p­5à#îyࡵÖX­.ưVœ>Kô2Ç?æH©Ê¹Ô’½±a_ä±'žÙgϘ|¦JD~B@!Д( òÖœ<ÈFmä{q„�ë?‰ k‹¸bûÊko°K¿Ð‚ݘ†¹“Uà¡üû‘‘O {ð‚wä!ìÊâÀPù•×ßàs.!â™ç{öXäÄcŽøú›oo¼õÎ NÜvËÍöü×NF¯ðøØO³¦Ü|Ó�\½çΞL™:móM6°£æ¤û㘟Z´l9ò©g‰ÿý?¾çþ‡Œš5kÖ&®ç[¸Æü½>zë�÷>ûâ«I“&!ÜwÉÞ¬¼ÂrqΈcöߌþö®aÃ9;iò_×Z}ß=ÿ•îì}V>"àå×Þ¸÷�‡¾ûþG„[´Ç»î¸Â²ÈC®?7;tàÛ,~ü'b~þeìÇŸ~n‘pWbÛ÷?ŒaSè�·ßûéçŸñŸwžyØ â³Î�:ºx>øðãÓfÌØpÐ:¯Žzë¡GŸ8iò‚ÝàXͪ+§ØüqÌÏT.Á·²i4�¶€VW\wbqr¿Ã:k®FãIüôó/×ßr[¬,—_vÀVC§ÓChZ´LX3ZȃÖI[<þ¸O›¶Ð§]²ðò«¶™5«¦ó-JC‚|òÙço¿û~ÏÝ,Ý÷žûG¼üêë\ÄØ§w¯ÃÚw±žÿo[2kÞá?Ú·»ë¾á¬ewÞ~ëM7ZÿÊkoâ²=6Ï=ã$îÇ Ëþù—_ÑÅ g™�·ß†N_sÓËî>‚|ÎÓ¶M×®]ëÑ�Óæ)�—s—ÇØ±¿aÁ1ïáèÃì» ô â1Dlºá ¿J™þþÂ˯1.­¼âòvTžá‹­V­Zñ¥$òÆæê-wÞ æH2¨.7`i?­ÃLŸ~öÃÔ;ï}Àåš³¿J·]oàÚ> z©[µlõëØßo»ë¾W_“6°Tß>ì³GºqY�-à0å9ÌêHÞÁ ¨ù­t¡n 0°/·ìFfÐ’ƒœ5W¡ç o¹ãÞ—^}½Ï‹ñÕ7LR;n·UÛ6m\ÆFQ*Ž!ñí÷ÞÇŸûàtèVTnÿ~K2¹0ŽÂŽ¢S>û”ëB*Ú´Yìô3¿>ú¨)Ÿ~2ã§Ÿò6O˜úå_}ů#m1ß|�6ß•ÿ°¸§}ýÕ/·Ü4þ¹çZÌ;2›tÙzÛˆJõôé¿Ýwï¯÷ÜU3k| 2\‡1wÏž‘¨ø#§u°ùôLvÜdÓ–]ºpݬû˜ƒÂþzû­?ß|S›>}¦~ñE»µÖ^ø CR¶¢e«‰¯¼<æê+gýñ{MuM×v\pï}â·½DâÏðHÛcèfõňåMºµJ†ò{…‘‹�n¹“éc�]wÈpB6¿øJ! š< A~øá8�=zô£�>:xðà’MH¬ž‡=ô q¯'¨ »)Ã|=úÄGDîG™ßbûÝ<Ô•×݌ƅ^ŠÏï¿ÿÁ‘TÖýƒÖY³U«¿oþCÏ¿ìªÚ J–ìÝ‹£æ¤{åu7}ùõh�� /»ÚÑ ��RáÆS…ƒ€?ö$z×é'Ñâ(KXœ{ñà#�»ýFŽË†1$qC¾qÜÉfŸoò?ÿò+‘sSÆÿÞ=«fI¢õÜ­Ñs8ý‹2 ‚¦Š&©hM0,.L¢|À%r“ 7&\zÕu·^w_«5IàºâÚ›»ôÊë<,Ù{ç½÷IeŸ=v�0!•²ø¢=]¾¨>ïrö—„üRœ¶¿DC£¢f©²t£iyy�"[º€ÿiùÈ¨Þæ9ç0Vä}±?ùô‹ðK†RCÞç�ÜD`>IÚðFnü¡ÓñÏãÜmŸCøâ€�$t·«o¸¾Òßâ8ùÌsï¼ï�[¯»|îÀ´á¶»‡9ÂÈPä�-Êø-žÄÉ@a}�¾¿éFXäùßÃL8þØàæáÀ#ŽõGîNnQYyúIÇÐ;h™_~­�HN‚ ùУ#)ÔÞ»ïb$é^zÕõ‡wøá¤Ñ£¿Û}ßCBIÐãöÁyÚ^öØð;¹�8|Eº;ì¶�ûÐ _8ˆ±ÞÀµÜ3¡£°ÃTÂDKØÁùpŒÝ‹l1s$htè3¿Ž:9ÈɳuuÀaÇ„‰2IA¶†sÁŒ™3/ºâšpŒ"{ç\p©…¢r#$HòQ´fŽ-JrYUZcÃñϼQ-ƒð¿ßØ{ïæß’7Þ�ð?¿²héºá™¢¹’€\Éõ=�‰é´oG—áùâ³/l¼aí—nÊÊfüøÇÞ}'ÿ–¼á掛v1s|wöß×xÙã·§ŸÊu-~ŒOäD$“dÏ‚`‘�ƒvøõèïÒ}Ò%yÖÇ${iƺrp†Ý©vóÝ5kž% „€� �� Ý»w_vÙeß¿v'j̘1#FŒØ|óÍÓæ,8:fÌ7bÏ:å8öX‹“—fí´ÝV‡uË>î�±kGaÎ:åxVŠ¦Ë±§zåÅCÏ»ø v�Q–Ö_wm´ Ÿ}CMÛïð¶KÄN>î(vê°ùÔsÜRŽ~>ôô“ЬH�3á}z-)é�Á Zg-¶'Lœxí�·¡óüµ7ÝÆÚ*gøÝ7£ÿÄ%Óù°Ïyô‰§¹ƒÅ>Û†—_s#颱µHaÓ…Mç¿Ü€þ,w0¨™0áOì_sãõ×}ùÕQ¡|MY-TÇ¿vÜ– ZÏ=7[”]~MUUõÁGïj­ãiÂgŸz<ÁÈ01_sí+.·LdùþÉg_X*vßG˜bÄ�E ¶Ï<É9M…Ûgþš2õüK®$†ø-S¦N=â¸S,rŽnñ‰œ;¡@æÜV›2EoZ¼�°<)åš§u"ËJØXц�ô¹ý®a¦œó6I ­CÉž»îÈ »Vk‡¼_—NO8휿¦ü5æç_íÑ�éצºÓ®0àB`8Ìàð‡Ù�¿è²kø^²e‰o²sÐ~{±Q§0ê­wÒÕˆ „ÅÄb(Þß„ã�·®õ¥ÖºèhŸ{=—›/1ìÂÌ„ÑÕ{P¤YZ¡æ¶ ÊÊÖYkõÚc–òÕףѢ) µ}ûù¹ ”aj‰^‹EŠŒ™û«=º/Bû|ðáÇ|d$C( {å†òÜ@�ÙÝ·ßýpìÉgâÂig?öÀ]nJ¦sc˜J—VÄ?I¯eß®¿¨‚½vÛZkD¬œ®¼¾Iÿå ²Lç /vô‰ööØ#Y~™þX-Á€0@Tù(J]ŸÖ© ìLCW\sÓ×£¿…|?pŸ=Ì"‰Ë##ñgEË[Ôj’­ZÙÜWѲe«n  ]·Œ}µ�ÇüñÈÃwØhc>¹:ߪ«Ž{ü±?F>Öe»íÓ™oD2yl¿îzŒ-Ûµÿù–› SÒ]ŒúË­·Âý K\pQÛ¥ûÏ3æç›oœ8êu��Ïú:²ÈáGvÚ|Èôï¾ýòðCáD>ßïßámöíû>.Á[þïsB à±Ü‘d’žþý÷_ûû»<“ß{÷û¡g·êÖmæ/¿´_wÝ¿3V]ýÉŽÛ²à¾ûwÙfÛ©_|Îõ+¼ý|ÿ}ÂÂþS�ÊÊ>W\…áÌwgŸ9áÙg �¾?ïÜEO=ÝrÊžÁpÏN¦|ðÑÇu'A—ˆ–[Qù2`Êo<{AlGù?Æ�Ë,éAäB@!à€!®5×\“uùo¼�{ìØ±>øà[lѶmÑU /ÆŽÛn‰­xûví Aà#þsØ�¬ÅwÚ~+¬%¹QÕÅ��a~½ýžûÑ·‡žqŠëaí»ÿ¡Gs¦Å ²²Ü…3;ØÉ7»†É“ÿ‚YvÀÒH§4¯à+ ƒ®e»%'aXËrœõlÃõÖe…¦…¸ûœ«O¹wí…íqîàtŒ›Q„ÂéÜŸ}ñ¥ksÄÁðA&vó5—¢®ð][¬ë9Ü‘“ÁNUuU§NàS8’péÕ×ÿB .ˆÅ<Ì7ÜtÍ¥½ëéP°.G „'NšôÝ?Flæá¡î¹õ:[ÁÜÇ�[î°;*G™–[¦Hصó tí:/öÏéÔ)”–½çðNzÁìoÈ¿YaZ~óíw§$V°‚!Eâºôü³ÀÇ)ÇÅš ãùì 4f ,˜ õ(ç ØQǬ Ì»ONm«ŸþKõ…³ÀÈ‹ ¶¯+ÊËïö ½l!A&Mž|ÝM·“=÷œÓN´ÎrüQ‡.Ö³û¹]ñУ�ï¶Ëö°œ'}ü¯¸èè’ZŸ¾}8ŠEäv„Ädü/¸»KãÈ:þX6(_wžgž¶ö„=vÝií5Vë·d(¶Ì÷ÆKÁ9Aþáß³û"� ô£�79ªc¡8ü2âÞÛB‹3*c%B=ûâËGz@DÍ€¹ô¼³¨z4Ç ÷ØïPTtî Â6>ž�t>¦Ò%÷OÒÁ ÅpÄ_X¡÷ÙÓ"¡á‰h–gr�=Hfô7`"sÕ%çrÀGï%ïС žQZÙ<!mØ�¬yüÉgéƒ|\ƒ¦’.ò¬£h—m·ãŸçS¬Ë>õœ?†Ži£¿ÅŸvk®¡Ûaƒ� Aø¤ë¬ ãù¶n(™ÐÝzñÅù‡põŒé� )CÁn|Þ9¼â Ç2�=ÙbgѦϒí­7áùç*ÿ·Þømؽµ6 ••ý‡�àƒ²È·Y²ïJo®ñîÀ51£øéº«?û\ò\Ѻ͊o¿&ÔaãM×øilèS wr�IË®A ³2à‘ÇýìÏäwß�öÍ×@÷t?ºÖj b¨õb‹°Ù&ìÆ`üÒãØãÃà¸k?¼ríåâýn¹ý“íüç‹/üzçíÝ?²rþÚ˶rÊžÅ\˨n,åz5¢e×dè…—ŸzÂXÈY*ñ¿F#9iÒ?�1.&! „€)øêwJ‰„ž+®¸â:ë¬cŠëøñã‡>qâÄ„aë.†¦J$fˆ�ÃÔ{;n€Nåñû­"fPЦõܼêÜ1í,ë382ÜWb¡ÐÇŒÁð{ü„ ¬baa`Lxÿ¦ úÏ�M6ôä6ÛdC|x|ã­wÜ3«ù b¨(k¯±*é’(ÿf̘i†'¨RœäÏO(`û3f?òÈãO±Fßz‹Áœ‘‰¬~0WéÝk1 –&(±$жÐ}á…L …0 ãĽ÷î;»rņ:0ž¯�z믿juûQ Îqsˆµëÿ¼ÿù?ö›lµÓr«¯7hð6°`~ɹg„êÜ?¢¹»¬àñpäêÉ9øqR‹ ýsëJ\Ø|`¸ŒfÅå—EiO©ˆ¦ Ø ü©JiËå5} zkò_WnNmÀz®ÅV[¿µ&2åáA!ªÞQîè™]5ÛZ2�Šk/E3ã•çš%>¾ãmþÜãKƒ4wøwÑžÝ1| :z-¾hè_óã„çŸE€Ãmz-�Ã>æÂ‡KÐÉ3Ìú6ê}ø��péuþEÆ€ü[yyûõÖ·ÜòËm·àÏ­"mû-o2{Âþ•·jÙiðføO~ï½²ÂiìY‹Sw>—Ã?�ê›ãަDö8õë/q`³Àn{¸À<Ë.×nàº<þùÒ‹ô^÷Ç1Ï2ËηŠûTT,rÈa¸«§N�òùg¡XNnȵ¾½k›AA~PŠW_rMýµ7ÞÚpÈöLëkm0$¾r -VáÞRARW$B@!Ð|(Œ%ˆáÕ¿Ô¼gŸ}–-V”_x�!C†tŠYÒ\l@’DËüP"‡`u˜$lÞ2Ä�ñÅ×ÜÚ¤¤‹�mUŒ‹ýíüóÍÛ·Oo[»g_ëD …d³mw�Ë£+"�a�%–øýæ\ÉñÁ½2kÖÌøùNÝrÇ=v1m$.í‹øø½Œæ¿øb=q Í†J *úæ‘°á#š›?Î7ï< ÎÙývŸ¢:ÖY‹+ñÿ9©´`·®fOtá…º=tÏ­qÿÆå³dŸ%Âò.¾hOò_Y�FüÑ�¼ „¦=)¿ mhørTtKÓü1‡_e!âÇ[þsÂi\à²õ�Á½{-딲�Ó¨|oßâ)Áß„ã׎ò_ òIíšÃhfA¾¢º+[üÓÂy3k'•L Ž £‚·žó�’0lfw1†©Ì)æô–FÂM¨áV£ÕÖÝ”+�VZ~Y(ÝÅ[Ô  œ"L"Ì|a¬§oÂThޤΠ”f$’$ªP&É(ÊgrWWÿvÿ0:ÞÌÌZ/ºhÛþ¦|ôḑ�uØ`C˜ÌLÁó}7ýÛo ŠÂ2‘ȪgάšCµC¼Ñ{±È[9S5ují]�ág±Ì£#íâÒšÙ³ÿxôá/>pʧŸ~sâq}®ºœ¹ó•r´]²o«p¡U^Î! L‰;uêTÎÅp?H·nÝòˆ*§ v¸}¡@ÿd—8]XtxÖë05œ^�˜H'V@– §½ÐxµvLƒ«“¤ÂÊSó$’Ûúöäþ�½ó€¯ªXþxBH轇Þ�.(Š(bQPT E{oÏgyêß÷ì½£ Ø±¡¢X‘Ò›€Ò{ -�þÿž;ɰ9çÞ›››K°ç“ÏÍž=³åÌÙ2ûÛ™Y×SY{¸"C¹ÅèI,bØM¬]+ݳ«Ì)ý ѬÄ;lÒîÝ"¸›Ð†Ò˜�º9‚¸¶»iT�aÄ^¿(u›©¨Õ÷_|«9îÿ)8t¼b舯>�ma’†0n)ùL‡!ã"š¥_¨ÂÄ­Bo|JiÞ­Z4ô¶ÅrŒÅ¤-¹ÈÌ~Äç~þÿ¹ùΠá0uT|Åeß’€«‡JðÛ6\ ÍÛÃ4L™E0<üšÁK—¯çJ¸¡á� Á€Æ¼ù2&*ÌÜorìË8 Æï#‰œ:}æõC¯ £=Eƒ”èztpÝ:1ÁØ¿h!+m0Nu\€lÇ„ï>~€#c\I"ríótS²IÓØ²OI�æäf߈Á)*ø÷r•›æÛ8º4Aô8~¸Ê…ýpá±áµWðJ›ž´+¶|…$<†¾’W¬Hß�Ä@)ºx `£À„úÄÜ„5M:p�˯¹��ñœ3Â0§elñ{àZžâD€l´å€å€å€å€å€Ã�ƒ GŠ©!N‡ª-,ÂwèµE Âï^Dž9à5P°ƒ[o¸Ã{I‚7œ x“çw+•¼êš-æë¯<ûß0ÄeÍÁvõýûö.W®,V.ï}$¡D<öu=©£œÜ�¹Ê¹ýêÆŽ™§«ò{}ø&�„Åd†•6–�F„$tò_|ê±ACF"BqdဠÞÚŸ1²*ÎWð»ºöË=>:Ј=ˆ_‰Ä!¤¾Â‚fÑÒ¿~üéWѽâ¬YœŒŠ“ i áQˆã�×J.ôº™vd¡§¢‡>ÿÊÐÓež~âaÎÀ’,©ßÀk¼ù ‚gV3&æ­7ìêé&Áá¦Ìü Ælíõžâxæy svJÉ�áeȈ[qP üZ�Ìý¦-'£Y ŸM Ïá�®yŽ¢~ëã�Ü=mŠD² _<0—õ:û-—Þ„ê¶Ãû(ôG•cß>Ñ@ ’ªÖµ×׺nD‚£ôQBcÇð·Æb¡WÅÙ#ñ26:ÆíððZ¬x óMÍceœøèèØÒeÒ S/“8İZعܙ‡˜ÜE¶sç.Ù2yü¡ûÄÏE ·b¡æÒJÓ§6`9`9`9`9`9œ‡4؃Ӆøtùòåß}÷�@%K–¼è¢‹ A $ĺ…H&ºKÊgGÔï^ó ^,X¼Ü(úµ¤ÕÌ5@}p¿Ú³÷Ž.С[Ï 6ç$©P¾¶øïÐäÐÚÞqóHt¹õìRÔVqÏÜÉ'”$7—‚:µk�l´Þps+”®ßzuëˆå|d¡W)r+LfcÖä?§ÉÒEâsà9’uÛûÛ¶‡¤ ä·ÜüF²·6iÊ4þ8)PÝò›g ú0Ú@ ¬$žÆI¸�6Á)å)ö58C½áÚk8{Ì[/KcÀU­ù�„+3¾ÓfÌ–RBÉ¿¨Ñ˜àÌGm!ŒnظYË9†FÔU$ÿ~sC!kÇÎl¯À=xH ˆ¯ÙB¦üV;ìÈfMã{›3€§ü4þšÁ—‘+œ)^†¿MšÂ0Ë`Û¹ûÙø™veÂ#AC³Y^¾ÒÑÁ60¿ ¾ú(êªR®Û¬¬íß|íÄÄÄT8³gųzÉ_¹n§ Ù®_ÉEoÜì�7üˆÈ_Pö(ž¤%eJøOïóJ“i—dàï“§Í”�”‚ü]±9’€:GG—íรڿtIfjŠYx²ÏÇGéV­crkå$/_FwUÊ”õëäd� #°mÛ™ßͱ(Œ|$ ¢Ú¨W7x&Ò wi¥OeŸZXXXX" ‚,\¸pâĉ"ãØ¢_¿~‘r"Ç@â6<¼°|}lÐ8p�p5!6ávDNݲe«œ êz*{Dšäüý�?»(å¿�¦l�e‡,Nx2W^¤ƒGâx•¬8Á[PzngilÚ¼…‚€$X+²Âñ& %F½Ä³™iÒ�ûú[óÖ úÅ׺p"ðÍw?ð´aýzeÊæ²ÙF9_V³lƚɽav¨Mç^‚HÅÀäŽíÛ’Ûß«VoÝv¨©Ì˜õ§~tWY0™³`ñXÁ=ÿ¬^ëzÞ­j|ÇÅåÚ™7sûå·?0á[!³u™4‘ ‡Ñ‚Ý®Mk`)ø‘—ÒÛ’MÎ7á�N[4ã ÓmqÓ÷àïÿžyÑkîá¢åÖ/~JÂ0h”Ϙ€iòµë6BÕý'JJ¯}j°ôGóV3À(ñûS5Ÿ¸S§Ïâ©. ‘#5LR£Ð:‡@1ä¼³{JÚôô\.'‰T6úe²–È)é0�Á–Vím™�‰²Û?ÿ*ƒ¿$\¶|åê5ëcΩYå+ú($Û´�;ä<Ú:·ßÙâ½÷›�-'|ø ÞII¸yÌ{x'uåPºUbÐ_ÈLw?rQÊ­Wµ�øl“ŒŒ�o¼êJ…OVYÛãµBOçmõv†_Ä€\™¿]³fn‰d •y*8}Dž:|ÈÝ'c’}‚„zõ)({g;(¤\ Mâ´Å±K2“GEmÿvPªR¾�ïß{ÿ#NCÅ`³]ø@’†õ�Ý ¶ ßó! áUkÖ^1Ô±×ð›!Ký‘·ÝÙ¸<å}o¹û_/ïp%©XÁq˲öÕ·ÞÅ%klU¬À.@d2âê/@{Y -¹ñŽû8óÕ•Ux[‹®LâãKˆÁ§^xEzž²F}oì'£Ç:^ôü^ÛS8ÇÞ|÷}QB¹°ÏyØÚ˜ôlïô½ùîû‡húÄêËÌ!¿axÅé43xúp1þù"‰—ï+£ð)o½çAÔ Úç�r¬à*Tö¸$Rp=Aè·;·§Ï›™¼hî~“÷9íjþ¬äe .œs`õJ§¶æUÜgK/1,×ÌÖo8Œ6à7�¬“XKøü¿ç^ưt’G´+úÑs/¿1xèHéVD²sÞçâ+fÌž#~%‰™=g>Ç@OÛ«T©REq•ÉË”CÈý²4å»Ótç.X ¢S&�(yxñŒQxM&í“Ͼ¸ÜçB‚j\wË]�rcXãmõÙ—^g   3RiWªR¹’ zO=÷Šè 1ôñåüü+oþ>yyÒGõ„ç}{ŸëíwGd˜Â½+“…ùÇ<"#!Õ¥ƒÓÍ|ôÉ·Þ}Ÿ¡Xº<ˆó[ï~@rØ•X»&ó Îd¥ô²HàéÅö&ÀÇb¬–�…�{ƒÏ10åÊ]f’ÃaŒ¢Þœ÷Ξå r8®ù8:ºÒ¹çÁ‚\<†˜c}S — zpõjÎyMÙ°ÞôÍÁº�?Г4 œ¾gwÆ�™y0{®�¯SGp–MïŽZõÈC>d“${fLŸ~B3ЧÄè胯â?†9s{�‰Q'’ÛÝ»wþ8afë–{fÎ�˜üþš£7£\~“‡G�ûÌ‹öÍ›»ñâ�?|¿ ooŽ"&+Ç1J9göç¬\qòºøÊAÐÛ.v�èwÔ¼zH”ᯚ§³tè5šC˜³c`#�r]ºÆ'&ãâ‹qt7 /¿¤Ÿéå:Œ¬$I’ÏÕ+a—6¨+C1qá|ÍàË#"½¸ò··––––Ç<b#ò†“'Ož7/{‹¾Zµj8C-¸±tò�×ß|—®g¨'gab‰-~í…ÿ . B­ù"Á§O“ÒÆSc÷n'c°€öG®z \1]:un ž/½þòôíWžûX6¢å¬$éQcÆâUq W>r+°Ë®4ŸÞsÛM~Å‹“»tâ°U*o¿÷$©“X{ÜØQ¬÷ ÿßcÿ¾þ–»�¤Ùÿ7s#Ü´q#WŒ_6ºh¼\Õíh¡DÁ %+"Vª¸tHŠ+Û—ßÅŸFârµ÷9ÎVžëêufØËÊmɲå®3eLJ­Òßæ£ÐÃ,xXNžšK\¾á¶{5ù¾8âvõ 7G½ÿ×ò•gœ×_ŸBà÷öÞ4È�™ôºk˜³KÌÕ©[©O~å¹s~Mñ]!ƒC�#’æbÐnÕU @IDATÏä·p³5²&|ðÞÛûBÃh‹?3 ^oÙ‡§/\wÓ�Ĉƒd¿<íÛû%Ó€YŠFæ7@SùϓϘšbpXœ³’Õ�Á—ßpÝ�üæˆ^Ü ŸÑ:|ù%�<ñ4ï8àÊá�’hhõ‘¦þ|…ò0%õA‡Å«Æ‚0á‹�šCìàd…Ö¶T2@ÁC½™#¸Õw—@p&»ˆƒÜ¶hÖ´÷9gQ®w`1ü+oÚsˆ£¨7ÿ올¬?þ@XÇ5)Ëvì,·xëä`WóQ‰5k\}ͦQïì™>íÏ“2yé8kŽøìdõ>ï¬&=ÞF¦7m(1‡NH‰Žnô¿gæõìÁ ãë¯ò§IÈMÃÐ×½ûÞ5O>‘²ní¼ž§k¼²ÂÕst\®æ\á9ËI��ÿ¼ÂüsÎr%àe›½þ~R‰�-_¾îÝ÷ýóÀ½L.•ϱQ‚5ɇO0£eS3Ï?êÂJ̧ÁÃìÁ°ù‚ÈA‹ NâSÙÊÓÈå×ISÈi¡]›V!ælÉ,,,,,LD@díÚµŠ€Ô®]»oß¾G@¨"F Aœí‰þdØÈðkî­q¼¤è¥‹Q†„åøL ëû‹·|‰”|$«ý‰Ž¾\`o¾ô4p·^ßÀ ã>5 _ßrç¿äLVà˜@ü{±:‡ÿ¾ïžŠ‰‡“ g¥ åÀ¹�—'¾?�OGT¾?zï ŒÕ%~M¹ü¤Ní?{ÿm/^С݉ݺfK«šP_Ÿ“™Ü ü %qq±¥}Š0zD1þ_ÿu÷m’­èrãjñ­—ŸÁÇ»f%Oå÷’‹ú˜L€í_:Úoûq`•Eª±ŸŒ“]Y3 S%q+8fì'l¢7—ÐTÞ@… zLÂÅ1 ·Üp­™|èUƒä�\l„Æ£½OÍLò —*°ç¶h“`nþÁ«ÅKþ’ Q)’s”òÌß/�€)ý¹ƒÑNGÂPÚF|&�!¡æìêÔà’ߎûà¢>çºjEkvÕ µ¿`^[;mO�&�|ðΫ8Fu¥å6!Ç«¥·S{‰ƒÄÔöh(±¾Qˆã�´+W}p®$ ÇÔ¾ïùç²hY¬CpZ�Óbb4‰>œzæÉGnº~¨(ˆI¼†i�÷Þq³Ž$‚€ðñ pÀgò‘{Ý�\@-èçãÝïwK¶p†)}Ó óìáP:8Y�ÁÉS€-¿/œÉZ1i r+_\I€ÏñÐýw^74‡ù¾O>ú¯+/¿ÄE,·Ò˜K—ÎÃ. ÄQÔoD:jÓ§¨pzï)³hjÄ׫ÇS´EL-b˜T<úxƒGS´‚£[´%Gç>€Ù¡7®8ãð×âÕªµŸ6³Öˆ‘Æs'Xýò�1¥½{í›niþîo «ô½(¡QcWÚo׬ÍF™¡gç#ÄT‘%+×õäÆO?wÒ¢eñuëjΠKM_yM+ñ‰·ÜÖbÔhðo%ç U\*Ú4OªøÙ…Xi’<L.|ü9dgt?Õ«•gr/Á¶í;&Lt|ÊÔ«“X&pcÆÜì½>†ìÆë†&Ã7oÝlŒå€å€å€åÀ1Æ�è1cÆðJƒ *È‹Íô] 4èÕ«—kaS�l�lZv•�QØ^Æ¡i—¬¼Ú›H ì áXT×�^}<ŸóÇ2Oáž@ÄyÆ£ÂÍ~fzZ:J¼¬ÊÔ_iž Ã&@ÇŸH'¬ x/÷bz_|+U¨øù[¿qö/ð§f�êA ÅÞAÎßýdÌ›�6DÉðëïŒÖ§ÊÞ¹ÞŽÀ®¤ÝŽ O´BåùqG‚䉺rŸK³YÍ�·Œ¼ÜgU„>R�òla„ &´äظXŒ,ü²Ú1sØ¿ hްOè׃oEÙ$|Y´XªW­RðõÍXNh*]ªdÅ ~œ›|àïJJgdŒ*8Ÿ ˜2ß%x!9²d Á/r<‡ðžjƒgl©S»VDÊ q ¯Â…– ³ jbJ—É>¾àe¹rývåÊ•iiiuêÔ)UªT詎eŽ´P¾nÙbq…·'—~0c÷Úݱñ±åËFsB 599¹J•*•+W.È—=xðàúõë‘ É©Øo«–þU¡B…5j¤¬°ÓF°ƒ‡]‡Ã‘pË‚m){²Gò�)S³CõèbÇHcݳ~oZrZÉÊ%*Æîyóܲ)=5ÅiÉ\5j�ÍÏÚ÷@ræâybr–3Yõ—¨T%?YHÁùüeEFó&Q¥J•èbùLí&_·=cýŽŒÝÉ™éîGæ}lLT¹’Å+ÇÔ®cÆ«áÃþ‹ãfÍšõñÇ/Y²$)) ñeäÈ‘'Ÿ|²Y7Æú=zóÑGuêÔÉ|$¼nÝ:Iõù矷mÛ6eQ~´|ùò�²˜‘JŽ1âŽ;î»ÂÛ—ï|ûä÷I~ͤ�UZT ;Ÿ#’ðŸå)S~Ù»dþ�u«R“vf´l›0àêJíN*yD*c üüóÏ+V¬ˆŽŽnÞ¼ù©§žz±å›o¾Ù°a5?á„̇q㫯¾B¬d½D׋ÍׄÂûÓ£øáieË–0`@±bÙ«‹mÛ¶1 ’Á¥—^Z@ùXjÁhùÔSO1COŸ>=&渘2C`Q!Y:nùîu{h~® e¤eÔ;­"5ñÉÛ̳¨XLv ֯ܬRb—Z%ʺWø®LŽ–Ûüñï¿ÿ¦ Üwß}a7Ñ3f��¬åÅÏ:ë¬.]º¸˜0a„ ÀðÛn»­téÒ®§…p (9vìX>âé§Ÿ~T •{6î}£Óh8sùWýO®U,’"Vý²fÜàñ1%bFÌ¿¦då„B+· ¢•~øá‡ u5kÖ6lXØ%~ùå—óçÏ×ä´êë®»Ž2�‘À|ÀR�‰ææ›oÖ‰ÆEsXo#ÒÁk ÃÈ<-9ý“K¾dpÖ´ñâo\2ôØA²2³>øÍÖÅÛ;^ß¶Ç£ÝôS`áœ7_±fÅ’ƒšÿøYMÚtȇT?iâÞ¡}Wirc&4ìÞ«[Åf^�ì+}ôQyÎJó¥—^Bb LðIZFÔì•©;öfc@é|€H äФC£âqǺXa„ÙwË–-Õ«;ÒU¹˜î¼óÎ/¾øBë³yófDö{î¹gøðá¹qãFÂ,6l¨‘yÖ®]+©ØxÉ“¸à°÷¦›núöÛoqn¿ýö‚gHl^]qÅ‚€4mÚ´D‰={ö,HÎÛ—:` âE™šG@ ,Hͼiý¨·›9ÌŸ•<ö�·³¤óvµÂÔ¬!¹Ì C† ©X±¢fî ÐÒhól¤¡êèzT8·éà…SÕ|•‚iØit% J2&;Š{n•¾CY)ñìP òÚ·y¿(¹TlTP�<‹ýi¼3�Uªû唯õ…‰\œÐ6�?òiÛ¹äÅÝWbS¹j$×Î�Þ‚,®Ý»wŸyæ™,]e. D(…Ž0ÉMôA0� ”ù1±™‘‘Á¸)B?Ú§åÊ•óÂÆ¡óëµ×^[ºtiˆôˆàèéù%F7uôèÑFäš6mù0‡µk×."Ö9¥6ɪ03ÉȈêÙ§ì›ãê7lªe™NÝJ÷lµŒjÌ�±ÿ8Aönt¢¸RqUOˆÀú9Ä/Ëxòâ‹/*1V %hd‘  §“:Ãȋȗwß}·Ô™Y�Ñ#âë% Ò¹sç*[€w›5kÆ-¬ûóÏ? ´jÕ …/%;€«ÁO%ÿ°ó± £Ï~¦9#Fož¿uçŠ]M{7êýZ¯\’4«ÁÙ›¡)_¿\ïW{‘äŒÇNÝøçæ±}>ÏHɘüÓ[]Ú¼D¹4•Ãñ‚¡äID2�2lUM:¬è{â!8B)—\rI(µ:|4¢ÐÊÚµ@^½_ý\9gE­�êl3ToS5È.·+QÁoÓ¤o^àXÚWmY9Ww(xÖE ÂÂnó ìܼJ·nÝ‚  -c=}_ºàüV>”¢÷nÚ'¨tµVÁä®#"ž…R¿4;–;Úâ“åêDXÖUZqß|œDä­ÿ®6bæùç´ýܶ;©TBÉ€Z9&}DÂìµËÎ�02\·#˜ �r%£Û6(ž‘5kEÊAgÇÄ}‘Ü‚ n¦xïE쯒GuëÖ-B&¨ˆ#» ží-ÎŒ¡q@lÆh¡_tÂi:V©á=«}ªÇ bB¬Ë†&Mš|÷Ýwl>óúo¼´[ó$ÀJì·ß~Óæ˜rî¹çúõ È á³Ï>ûþûï™T@…ØG|Ñ„fžÈ.¨«`¤C¹¼QëÖ­ÁÿN:é$Y ±uÌŽ+ëü È®ø»ï¾ /ˆåçi§�ö"Ïœ9“š�I Å.Ä–�_¹ð£¥ˆÑñãË%–©Ù¾z³ —¯WN_!u_Ú‚÷Gå ™©™Íû5)S£´HU‚ÅŸ.+V<‡Îx\²bB‹~MM‰â….YöÍÊä­ÉñåK´º¼E»kZ£7k$ʲÀ'ã{ñÛ·ošS¦l±{Ÿp«�¢W§Añµÿ¤úTŒ½%vŒ0°xé¸6Wœ°nÚ†¹£î\¹‹JÔ>©fçÛ—­}ÈFqËü­ Æ.Y?sS|¹¬‚Ú iÍȫ܎¶üâO–ý5þoÔvîN9áâfm¯iŸÃ䬨¥_.ß¿59&.æï‰ŽIdÚþ´Ù¯Ï-îÓñá+Ÿ0 yÉ*¹vðh“ãÆ�cÁ/{D}úôquŸ|±LÔ@èŸ~úiŒ×Àh±Þ† šIßaµ¬¯¿þCJzýU/zœªZбsæ7€žï¿ÿ>ŠîÔ$ÛiÙ7KOOGÙŠ½_` ?ìq¡÷ÎÚ†œe‚…F jE>®ÊP *ƒÝ&N7P‹ƒ˜-hz.úqdòÓO?I¡Â‡–-[JŽÑÍ©å2p{Ê)§à.ÀBäWÞ=»Æ��5 zœÑy1ŽSóÞ�KS‘í\À-r­è‘éÀ"4ì]�?÷%tÊ5¹¡™`¨ùôÓOá-%â pyw4—´ÍÐ�c©�Œ½LAš�Y�B éh)Ï{oŠ'^uBñÒ~ä’;.ë(Ý8Ã`õÒt¢=ëö&v­UºF©/ü¹~úƃI)Í/jrÒÍÙ\o´méŽyï.„†LÀ&ÚmCÏ5F‡Þ×1É]�òuËÍyk>ãdVz&vãm¯jÕ´O®ž~p×Áý›Ñ�¥¦+^�aD©k†÷sž;süõ?¤ìM¥2Œ-N‰9W¤:8xܲe˘é¤9yGñÿú믴+Æ ±(¡MÒä2°ƒc–²—å�ý¢‹.rõ>º¶¢ìÁЋi–lȤOÛC&ÑR`Æ…É-Jº'½ìì³Ï6 ˜jÿýwò‡€‹GÄ0›SnÉY�DÒ�©•JPÒݼ–ÛŒ»víBÀ@Gƒ0E“†ÃH/ÞufžÕ“ª²í4eÊUu�“l“ðñÆÅ¡/j¿ø¦ž£VuO©½eÁÖ©ÏÎrÖ{Å¢Û jI3Ö AÊî” ³6­›¾qÓœ-v ûÔëžØöêÖÕO¬ê})í¢�–®þm-�*%àrµQ¯ {ÖÓ eÛœÛJM*.ÿ÷œw`Æz¬ëmëžšèÍ0"ÙJ`ô6½Éx;‚ö†MZ)Û�Œ½´çÎ�;{­Aé¸ À/ì™>COç2ß…¬˜ h!ta&Af —¤„(ˆï-Z2³4¤Lg”°vIâiu8Ö6�¦!U5Ë"œßžË̈hM¦·2—ј½š,¡wpWeŠÎ-C.m~ÍëiÉ»×ìNMN«Ü´bëË[¢=íϨöîÕ{øEî5åíì×ɯx–µæ�uÌ\›ænÉLˬ޶j×[;ñëb�èüb�ÃÜ1÷Ý…Ò•ÊÕ-{ÒMÄ“”$ QDGïIõïŸV3Ca€vêý]’|/…ˆK[ß=ñ›Ý[7¥AvÁe.X¡xñ\‹MÉ�^×'žŽbæžä`®@ªWˆ)Í«Åâö5Íéõ®+xrñÑxëçKç÷5 Ç™'$!k•ò›•Ò#(°¥q�ô€,�æ'ö±’k5{‘Ld=£r¹.þïÿþÏ,åÚk¯ÅÃÙ 7Ü`F2—¸ÈXÉxA¼9š^©pDòØc�½ð (¬…4Cºý˜1czè!�!€Ö:‰Ç™"ÿýïªP.¹Eâ ¡wÉ’,PïÚ¾lÇ»g|Ä® ”ÅÂ`ëÂm+¾û‰ä¢Ñçë¨�´*éç&iõÔh_Ý ‚°�þõ¡É&™†«µ©ÚüÂ&*¦¬üaž“ô)pø/ÿúcÊg\ûçU^oÒÌÓ�?þ¸ó±\S»fF`ö”} $L¬çg©F†L²ú÷µÂÀ?ßœ¿ý¯lS òÄÅÓÉ©>ýIH?ÿkÒìײ "¤ÄuS74<«^¿1½•ÃÄ/ýbù×òmÝ…ì—…Û¦üoÆus®b5E ;fßÞ0Q¿¾ÐüñÄt ðÛ°W}Â8€šÈ匈2a‹ãªÂ7eÍOq¬C�Ï\+8ìt4­ýˆå�z$�XÂß™OœÖ~Ø¡a ʉ÷ü6çí&嚨¨ùc›nÚw¯u–YYœÿ™R¹vòz¿¯""`ðõÁh–4$a Eþ‰ÓŽ€H&_–¡X«GB&R÷îÝ5’V:qâD½%gQ|&dM3 =hÑyÊ4 êMk4u—@ýè š†}.‰¡\é’ hÌ5”¥”´vükqzÏ¥ƒ#î’­fȬñÖ[o1ãtèÐA#Cïàš¤€ç¾¿åg³b+'¬òòB#(!û[^¸<_âû”x^3i�MC’w÷ ¼D­ÙóóýŽ0?óÕ9L1J��É,6lê2…(¢¯›²a쟛™,ùܱÍäJìRӜԈ‰Ôäòû{ïvèMÉ™þœR£¢¾˜ÒX@�ƒ³.è²\$|yÄï¯ßï}ü®�?ÎoÖ¼u¼FJ`ßÞÌe nÞ:×Ο’Ñ„Ÿ}x3#�—ŸØò۲憎yÔÔ_÷ 葽/4LÜûÂ6;»iù 9{�9¹¨Dç…sH‚ý~L‰Xv9�šµïà¡hf<¹Iy”† ‚0h‚.ÐòþLÿ˜¸GjfJ@ýÁ5(»¸ òíE •†1]Â}ûöÕHÔVv“4R™Üb8ƒ#FÄ}Ô@˜·�éÙ«1*‚¯¼ò R ³k ²BÓÜàÃFž²î‚-ñæ›o2=÷Üs?ü°“»ÜÜByÿý÷£ÈÀÚ� pôGȇ«¬ÊD^‘xî s&ER±Ž2ç Í6Äó Ubö’Ř+î‹>ð56CÕéÿ>¥n·Úé)fnBò®Ò¬’)4³‹rÁ[çp ÀŒ—æ0β<ÞvåÆmÝn‰hhã“O±‰úÅUßJ¸y߯: þýãjA@ÈçœgϨҼÒâÏÿšùÒDùÉONÇcŸ$Ñ_SV0Å %/À±XOÿÛΰ'<¡]Éð2‰l*æ!–7˜S2Á®n÷v©Ô¨Ëž™/Ï©Ó-[ð�öÜ,A@Ðõe†C.œpÇ/hñÀU0õiÊä$L>ÿ•³Ê×)7ó•9¬ý`òÌWæ‚ÖSó¸„X ®ôƒélJO¸Õ™¹Ñ(!v ä½Ê{´YfÓ¢ä);¢.ÁHâCüE0¢Ò/ØòE¢ ”ŠŽ  <wbGßÁ—!ÞÝ̾I;0DL*îÀ¦‚)å’#‡@4d£ŒÝc2|ùå—¡a�±}ñ¤VÔ ,ÀAXƒÉ»“˜•eY1\ {¿(\ÀŸ¡C‡Cr†/�-ŽP!O´]èÎDr JBnŒ€›"ë›R´ÛPcE¶ä"p­"U_~ùå0ðt†G�…ú�PwÅ©ÌÅ_LZâd”�hÿ÷¿ÿq øË£ìõ±§Ž,•GÞEËCÈ Ä„PÈàè0Ì$X–Ñ ¡Y\¸Gc( Çe²-œ+Ï®Q²JÉRÕJ²mŽ�Z7zâ#·'^yÂkê¾ÔäÎüÈU¶VºdLñbßÝüò%ûÏì‰UlTÞy–nBG&HÏÅg~lBìï�NYöÕ ´äŸÛÀ!ó]û·%S:ArL ΨÛòâf¸ÿ˜ùê\öî\¾·ú¼~ÐÍË7(—�>ç_ |ݱ÷ÿˆtpZ²ôTŠÌ!B6´iº tª§Oê�îs+Ft¬hl4lVbóˆ6 J¶„èôqTB¤öìTÓ¹$Ì⊄„IˆBë7YûÑ=™µµ‰2Ó=Ù0g�Iûg¦�“„ra¸¹gæNÅx%O x5;Ø~—ùšré,¼¿Ð“™³èEBÈWõäÀ,Í�·`¿‡Ü$“#uX©”ú/ˆâwhjpTHÄ�wÿF$ûÕ§ÜÕYD{ì]Ó€;ßоv祪–ÚL¯„"24##Œæ¹0 ú@¼d‹ ¨¹bAp°1„2¿ˆ#âíE% ¡DÒ LJ#ã‹äxÑaI#®C¦M„×႘¹�ÃÔì ƒõ–Lˆ\âÄ”Y Q ¼ƒ½\œHµ™Ûá)ÀU%«c:9±%ËÅl„÷VVhæ³-”ü•Íg*Ã4æÍj÷ÚÝŒbŒ_WN¼´Zëì½AÔáîACLzìÆÙó$™�7¿',¢P×fð šPGC€$e×o®uÔÐï?¶·h›WmU³N1Àv£ûƒ'cL¨™ð¡e&&†ùRxJ^ˆéºKVs: ɱ'ô«^Îa§be"¥òz¿~¶l49¿¡ í\™$g=°<à³¾²Éø èƒöD:&‚ JÈæˆ�8È…¨Ê˪/a S2aÐ`p@ äÁNäQD=A:p5'ûu(͉©`šö`+*ÓÓdúõëG"†Ff%@;V g¼Õ`âû3v! ÏN5ƒïsÁ`{ÝÄÓÙ©<:§ÛÊ{a$n†(Wâ:�­à”"C¤†ZɨŰ߈d.,æ–[n‘Q”ýjÞ‚Q‹¡Ò4)‚¾h^¡t oÍÙg+ lÁ#öîÄŠ»íU­¹Ý³~¯ôY±Aß^WÒ¡¹ä“¾£N „±wã^AÊä:ù§ÐûŠ9,½ìˋƜý ŠÓKÆýeêKs¦†®û}лQ¯úsa%·qÎæ\ÐLVÔzŸHü'Tpï_ÂGRö¤J†(0K@#ÒÁÙñ“í s¹N‹’îinbKãtÚ3C�TƒÕ>]›†ÊJLF¬`e e²� ‹=T)EÏQ F"ÑÚ„# VÒDI¢‰ M”Î%ý‹ Ðéè5d+ôRýõ‰Ž<@•�y¨�öb¥a(�^Ì8ÃæŠôzj…å 4l¶‹ˆbõàžÈ6,Méh’cx(<¡3ú�͵2E'°uqö¸ÝíÞ“ºÞÖI ‡Œ´ÌïüD�F( Mt™+¾¿„�Y€QVSÈt ‡»¬¨E/%ÆÑy|¿·ô6c@c(m”An¨FBL’Ú�jb�ƒ²ÉÆ?·�¡ää!<Ýûuh0¢Raî²ãE¹\È�4H4fù3V ’" IÒGåH­2Õ2IK&^EVDhA@ЈT¹‘qž±šú {¥r&�„4T´´èTI1A)HeÏ€9Ž�z³òJJÏ%­ 4Z HE®fÚ¢‰Ú s–„†ØÁµô"ˆŽ:ó±ÓÎ~æ �™juªñZÛQˆgÞ:«óššíüyE Yå|BJvAò¯fbñi«[Ô®›��Ù¬U|ñÑ÷]ïHn†f’�GýµÈÙÌÀ+jÅÊÎ$î½°‚!òÒ!ÿûf)G$§œQ榪—+Ÿ½õ›´+ãŽ! yþ%åŸ~§Ð áÆÍãK—-Æ9 Ÿ�Ù9âîjñ Î쯗Ì;tS5¾ �fµbëV�•Í [¼.mCP×!)«ˆ§Í�tå§² ÇhjÂGboÄD@È …K �üä�MÄÔ 1™ ”-ƒ¸œ\À¤hñ)¥L ܲ·Ã¯ÌtؽTAG% ¯L#©Ø8"ÀÀEœÁtÅB… aój=sž(ÎP.Ä@ùÎ;ï躋.ÞÝLK ‘® kK_ÞÎ¥#HažC˜å¢‹EB†ëŒ,�Աȕùep<$R˜²¢ÄsDÍöÕ¼¸µIHµ@ÑD`¹~јóU'|ÞèEŒËlûô}ç\ÓÞÞñ•žšÁÄàÊŠ….‹U&f„ å¢ ñ–á�ãrùÖQšísiy‹ 1áa%C.ܺȑñ€�gªG‚.•®^ŠGóÇ,â—„b޲4¡b¾ˆ�ŽÉîï릮˜ÿâ�.P«%¤F,’ sj³ëŸ$]|”rµËrä¢1#Ðó-X´p¡ þÙˆNDÏS€’€tLYo›iÓD7ÞTh‡†žB}„˜E—`�Àdo¼ñ† òN–Rܲ2¡'ÒIY�Ñã¾I4¡G L†Y‰IoBå�”bM‘WVtd.ºñHuÄ ëA¬v AID‡jE˜å Ý”knC)±ä‰Ö†¬Ðˆ‡!H´d¸P½X*#�_¨!¢-dð„�޹áãƒÈ‘ „¹Tð†#§¾úê«ÄóMey飊ÒÍpº1�ýç?ÿ!@¹¸ ÑQ”ÀUW]E< u Pįüv ^wHÏÖ{õ�îc±÷f‰ÅF$ÚhÃm_¶“[ALZá–�ß1"²îsB�ßSîÎF@œTÅ¢; ?‘‚#9ë%gjpË8 ˆó4:ÊÁ( žƒœò¤VÇê‡|ý8¤´ZðGõâ#’¿Óß=ª^4ª‚wpD EëR�0Ó¢‘]q¹©·/ý‘_Õ�陆mºöP@ȃü)QAð³‰Ê”J\M”$¢œ†¨ôd彬XoÂ:J&Ø%·(¥ fAƒ_^MúrèÕå¥VÈšȦˆÈüêiPZ�¢Œ˜é¬ö™nPñÐF+}ŒÃœà˜òèA@�ÉÛ ë„v•Ó×�Ù}Ñ<˜4 7èQ×D@äiD TGƒÌ! Ò&5m‰Ú¶ Ri-¤•)\[”>@ÒU ¤‰Jæ4*iüt±¬©_¿¾" dH+•í)KŠ�_& Áe¤×˜�\aZµôb¿ H(=T„aŽ�DН‘×5J ¥ƒ»ªW4oQ!ÁÑÈ8-…>4miýÖU)‘ÓAðKCdpñ —ènCÔhNÔ¤áYŽ„†6Ê¡œstO¨¦š&NAµé•P†(¢ïÙ¸³PèO»¿«ÖŸnH#’ü½^N"2¹è» nLû}·­Ú'xâ€Ù»'3igÆžÝf•,åÿ[@?¶³'ÚõôÒ%â�)–¨œ«D¼3­Snjª1[³V­«øú£]h| òÄkŽrJNÒ(`Âû÷e<˜kì"RVÙ¬geK“$P&¡X\LT‰Xç¯xlTà× RÈÑ‘Ö7gÕª2¦#4Ȇ°·Ž< "—0»Èþ0˦39�ÜÒßêÕ«G€eƒ,Ð7—FŠ•˜i5ÌSQMŸ3«Á˜Ž×RÈh¸ !2IpKq¢Ž®9p‹¾·Ø¶èLŸz²ØÓj{ BŒÁZlˆ¤k1û²h ”Vðé/‡FÛŒèƒxÅbM«¸uÕ–UT¦Ñ§f`ÑÇËp6A Bÿ€O³¸eVEwbG/ÊÂg±ïB-VìxåÖüå㲊ã2# f{ôŽ c^uV€µÏ¼[×'¬$ËȤݷ9Y¶”»Ý}ç8x3«’­0N¦S7eVÔì7K g¢c.µŽb>ûÀÔýîM =ÈÐ?øeÀZWÑFtþ‚ªrõÕW‹€¥`¸ƒ*_H¦¢« �À%�Jb4�½SÓßEO§fC= W<·‚ É±5ÇÞ㣹�2pË#\xˆ¢Šˆž$ò€@"† ¢ �Š¥ˆ*JËäíy±¤ÑÚJžŒ.@dd €÷Èɘz‚¥¢'O=Ñva׎x[„™â1�ÜÌå%®Ñ»qßùú “Zép„†ŽäÏÖ"^KDx…ŒúË®5á£àÊ×ÈHÍ@O˜î†Æ‡˜¨ˆÍsçÚÉj M~^œ3•*6(¯Àw#a`JY¶íX±Kfèj±k—²7tŽ-»fòzM•È9SÇ=õ{Ôq?Í}ÏvzÒ?ÎöTÍ5t($´:ö½ »ñ‘9˜êy�†ñõïž¹ É÷�´(Z𠂍º„F2C�B’»"‰Rø–…2ó2ˆÀœÙDe�ådš$¤ÿÉJOòAZ�œ]¿4c!ó»Ì3‰Öqm �,é ¦)„"#²zõDðàí\Þ¯ä}‘%L&˜•,RaP ´Ÿ¨V‡�YQÒPü<4eEá€`ÊÓ36ÏÝêz…Øâ1‚':ñÑQ"œ ÐñLÝW°­wj"Ë6E%í�]öow3­.k®R Nv6ÎrÚ€‰¼=Õˆˆ€!m€ÁÜp‹-ŠP �¦(– R~é‚VЄ$’aVêñJn¥ ð+x™àzH�(å©L �þ�è\$¡JŠËH¼÷W{± ëYˆ=Wo’`àÆŸT•¢éÎ*9ó4Äî­aŒÁcýôþÄøÅ[·â>%A3~Çrg*ž+›XÖŒw…ƒ‹gÿü´ZÔWýº– %í@¶íB5jƒ®¬T†gÓÑ´‘Q²ÐEt<ì�ŠIàšœ@Œ©$sU‡Ñ§™\47ìÙW.ufÒ–':»>Þëà�¬ïÇ%=õà&P ×S,Y\¶0è†Ïšì E “{Ay(iÍDHýø��ã?Mºÿ¿5;t-]¿q S­�åÝ—œ•ÅŽ­é_}¸Ë·à$/^ ‹úœ˜Ã0`1(»Ìa@vÕ&lޱN`3SÍU4"u ¡‘f@‡{ÜÈ›ñTU\ŠÊú„G,D¨2‘râÕÂV!f>g’JwDå)s˜¬µ¸EƒÑL"a¦1™E C^Áå�—Ì#‡M�¼€†aL‡t'ÍO�¬ÓôÖ ”­éX°ÿtïïDþóóþpX@Ÿ7ÏVõ“>y[²àÖÎÉs�/¬`¾ù#ÏY„_òñæzä[Öù<ýãñiÞ<z°„ôÆG*†‘A@®»³ê=O`©©¼ š�œ+†¼ˆ‰¦ß¼v¯ËV¼WÇB¦žh§îOCõ—Gœ:¡Ú"eŽ*©ýæ,ºp¬èÝ%;D¹�¨��‹6oi®ˆG"™MâeíÍ€àuNlÖHSëÁ$ +ì;ðÑ£‘¬gÐ Ñ„º6ƒ@¶­P­gôàÇÆ ‰bÀ�ôV1xa$aµ ƒ`VFE"êׯ%ã0„:û FÖQ²0ËÐÍ^Ù`ÔHJó¢J” $Ò­Œ{¢K rôÉô2^ñ²â2 -zWn¢n¥0\¤mÀ´”Íâ„LwUÝ�$*!&1a¤[WdQ» ±kÐ�Ð�£òð& ƒ¢*ˆÆ²/—#qOÈ1ˆ"†k‡Y¼Tj’í»!CÒŠJˆ‹3¥«•2lâ-¯Ãð6ê_ÉE¯·@3d×𜣕#cØ'÷Ê©šsA¢^A£2wÄP…F¢™Î%èýH‹£YÏ­îŠK¿ ¡K$�Ä +ö_ :Ðøýn©QWU\Ư~‡V‰€.½ûçTX ­°$”ê1¡ B¬Êb’kT*¬uðka¤O‹`§¼rh¾Æ´z| Q¤’¹†“˜Þ?ÿ3–ŽJ#²n‰ÁŸº©.Ú~x›ÅŸ-£?Ò='ýgê$_šó^îyÂ%‡ð1%cu¶jr.œ^ 2R»ƒÃpipATÒUy‡Vh‡¦7C·ˆ£2ePAñì‹hjÎJÄËÌ‚ˆ(R« /Ä‘ËDæz9Eö5^Ç¿pž’ð ëA(=—«@Œº_5ó',ê�!vpWÚ"w›5鱩Ӟ›­£%3ÀŠÏl¤éÍ_NQÔTî@pñ,GߊTœ8ÆŸ;yTT©Ê )'qËA�iBÑ.'¬"!ꢤœ�IV”ôe¿^NÌ‚ ÆåÇ ßÑ0‚M¸2\»*µÏIË#$O›Ö§ILÛÎn¤cOR:Ǿ@Üô„CìråyñU•¾üpײ÷ïÍ›Þü¢þÙ}-.­áF: ‘ë*UºX¼O�ÄŒGí˼••£v¸‚O%%- WÔ°s>Šh=É �]YqŒÊÀ�ô {&, Ä�`Ùá=.Y?б¸Þ²DÒxÄå9¾Ad– î„]p‰¨Î/ #šƒ4•Jl/à ©XP!ÜÀWBÝ �ÕEˆ ùˆB K ’¸òÌ×-°âÔ©SÙ‚`Kœ)“Ðÿ{GÑQ¸^ÇmFƒ+¾ÿ‡Ãä(ˆaôÛ‘ñ7áÚWä7¿Œæ^=7­áòoÿ+\±�+z}šéóDLç¿| Y´ëSÅKÅ¡¼mÆD0ŒRÜÈKWáš<}©öU#ƒA9,7Ĭd²dk+�–‡èqÀ=sÏ™Ìq£ˆQ4qñˇù²vÇfÑlÍá „˜ÊMry½U ¥fÇêÞ�næ‘°ª��h—™-à¥ìO¿$`ÎI," HA Ÿ‚€à+”­?¤UYášóiªœJ–Òë7èA@ RT9dH¡†Ò[éY\8QF •±QNˆ``eEýqB$H †iªá�.4++UÜ O)Å4¢¡&(á‹3WŠT˜M3"©†Ç”H˜å%]^ð#¯DüõòMvçx*Â?ÂæëSmѧ£‘½G$Za 좪’Êüe¨_ÍŒ/Rá»{Ëhvà=gÛ’íÓ_˜M�ã¬h”°’·'Ïðy6=õ¾.Ù>sLØLO: k²Ò«ß=[÷ð>°�}Îsgdúà[ÊÔ(¥]�35äH—Ä“j¹È¼·Ô�Hú{…ú‡ôP„Lñ‘Zr-üÖLZ/H4h¡ÞœÃŽ¡ñˆ’&è]CóQ�æª=T„&²Àúʯv�ße )ª—¬£dA(©h®ô ê åjQÁÕDÚÈsWÜ/¬#9ƒäŠ––ŠFÄÓGDcKWÅ¡WOÆ%Õ�RxYéwy®]õ}�l%|±{­`hH̉ó‚lÌÎç-XVM8DÇZSTéAot�ç\ ˜¸’ {_²Ó÷b�Ú"ù›¿¸v¡Í[„¡� â5[v¢«Âx%{Úl&ˆ_z�™›¾/±©¶Í»©Çú�ó)HHõÌáEÐÍlý†ù"âF�qó¢SùÍ*R‘!v <£6��ÇÑ›œ–Õå–ˆŒóG/šöì,–pt4à©’ì›A‰×­$ᢊ¥Þ¦´p›Þ@IDATåر£ä•—º yÊêÑ{Ú‹‘ÈrÏ&\¯¨ÆvŸØVkÞ"zΡ†<ÆŒ H[<"“‹ù^ÿå(nœÐ6Át½!ëW§ÎžâlÛ¼ýeýö]ozrq: @еsÉED®^é䆶HÅʹ¤kIhþ¶éP’¿á·UýùÛ=W�ÿ�pÀ>½âŠGŸtZé„’~LÚ•FÒG˜žÎñgÈo_ð®@âãœo³'9çk<Ó£0‡‚‚ ¼2Ó68'tˆÌÁ>'Ú&‚[p¶`¯ÇåÒ\&ñ~óW‘�儎°Hâ ”åŠXçê²�5¹"8�Ù[zS„’²4øº)xñT&!ä¶‚a‹ßºI¤ìwA‰¤åÂY˜]0<2“,öØ’g¾É.“Yˆ©ÐjÃÎ$+W�ÎI�#^àh=—‘EÎs6N?»ükî@@®úå2¿HfºÓÓö;@±»ÉIð?s6«;Ùä§a°Ý\Z ”ÑŠ¥/î¾R€Þ'6òžîJÈR7œ‰—üéº"~‹­¦,œª·ˆDTkå,ð³ÅF®Îaè€üòàÄsš³ùÀxZ³4ó"4{ÆY?RU\|3ÂmqSW;÷3”²KV©q!ô À�#ò£3—E Tf¼ª�ÐC9ÜA—CÐ|òÉ'÷Üs ~>ºÆÓwhÆÜªØgæ¦a:” ŠJè# �±žÇ}ç¿jæ<‘n"v%šŠî‰N>}Ä·1Ihš�‘¤r)—‘œÊ‹ã�c[dx1…ThЧ�²t÷XÞ”H—ä)b¨œ· îŒú4Ÿ€ Ù0 ²ì¨¬ÐX™Õú‹ZŠäư†2‹ÔüüóÏ—Hùe4cdÓij¬HÀʹE»�QÔ5š™ùh˜�ý )‹ŠMŸ>]3WšÂä«k°ÃÆ* ÉõÄ«Zô¹Ž^ðÁêÌQMº”Ú¹r1˜É”­YZ_G�nË×ÍFZé_Üâ„|´ç*½+ Gºx½™ºÈ¸åƒŠÛ…Ú]j¢C—‹ Ë)ŽðµmDì?âR{<ÒÍë¤àܬÛz ÄIëåt^#7ù|0°›³¡ºQp-iQä ­ˆÓˆx}²‘tjf�Qe-Ë º”5¼4Ã$Né„ÍÕ¬‹B #Œ©N¢«b}ßЫ'ï%º'R ‡êѸzĘå Ò sèh¦Š�V²°9¦—ÕÛV‹5 û- ¶QÅìT3«^÷:ZCvÈ9Wnƒèœ²ôB\a:}¡÷¿mžc2Àç]h0¤tÚ€ ]‰g})ŽÀ(*ˆ¶KoNÆ|Pk¥ `!™“ö·ß~#L)Òæ¡”™äæè-ô~©Yy‰µ»°H¡ ¥çÂ[y 6 TD÷¤1yvp¥,|ñL‹ˆŽ°CA Åjìµ»êsÅÔ½©2/0+ÌÖwr_pñL‹ äËÔfÑ~òtvÚ6ïÈð9Nô]d¡‹è¢�¢gÍ�'õ~wËOØ'ðöÜÈN.Œý‹ç9c2Ç庼{ë[øv4lvHãcçöôsœda“â=ÿ…§<‘j¬Ïqá<¯NÝJ×iPÜt8â›â¢6¯O[±4¥uûCào ¬è#b¶<`À€È" ”X¾T1QÄLJö»¢ T©c->$,*Ï—fhfq®‚{˜"Ýæ™0Dø ¥50¯ˆÌÁ†�x„&¾T¥D]±0 ˲�Iâ‘GAŸ…›œâh“masq¢µÕTØËF!aÈN nÉYFy¦"fGÍÞtò*7�ðºë®€ƒ¢‘ð8]¯Q½Á¹h,±@.˜®Ôz€ŠÉɲ¢±ïMøÛÃS¾ò=[.Œ\^8v v¶„9üEÕ¤qؘí¸mß~@\‹átà ‰Ôlñvöqÿ/¹eø»ä£ ˜§Ïؾ?Œ~•ŒÅ9Ü~Ôï ¶XEߟ»ûþ¹ŸÎxÁ9Þ¼˜EN%’o\õÆLh†Í=УÅ21¼ë?5€iÎ9 óf%c%hKXvé%,^‹¼4‘�Ñ…S$¢X¬Ã:æž ·ý,>ñ¿øÞ1G2ùu»§‹@òxfÀ?”nÿE”wøvŸ^úµè!÷zº‡_|ŠL0eæNæìX;9ÓCý‘åÉUá I]ÏH*éJl«Š`'‘йVD®‚A𢚹 $X¾Hg¤ð#\ iÀ&I6ÕߤVŒ*Ýj}h±&Ã$ÇÅSF�#iZxh ب 'ir /`CbŠè —D>FO’�Ch14PlBëÉZ‹1Ù4¥0Žæe¸ƒ·Œ�ñ+gÜâ¥HQlÙ�d´Áß3U,†FÈxA]aÊçf5xíµ×Ê–>£#«/°0QÃQ&àh÷ 3¤»FQ“²0Ãat�–ý›¡„Ïù¸RO:šy ¸èÞãûÃô\�´Úqi�ª…ª`Thà !€¿ã�ß³ÎÙŒ¢£y‡wýçê¿–Ë�;ç€O·7S)Þ÷ËX±nÊÆO†Mñ‚éÁæy[‰ÙîÛèsòÏq¾Ày[¸e…~êÓ3ŸkøšØ<âФ͠–F–N0"œ|hEÒ—Ùc§Ð#Æ�/ ž§Úe “5 Bs(�Å?]C·Áå)ô4f~É-Ni„´…GÅF€¢ß~ûmÙ©¦‰BƆS?è€ó’Æ…0@{&Â/´AZ†.hèïÜBÉDé©9É‚�Í /Hõx)2Ç ™Mh–ñ¾ÂRÆ“W<¥_‹VaÖ«Ê4n�àEm]¾?œÊä(.�Œ€ƒ89Îwf¼0‰‚@>ì;Ž ÂŽÃÈZÙëC:Ë3u_]üÉ26ÆyÄåP^8NôJ°&“H¿Ûæˆ+²öKìRK›lúHdÅWà—·ž8q"hB jP�!Z’6ZRA¯AÇIiø ‘5 ±å”R±Q§"!4²«GK¦8É¡àpŸ6/“”z1÷ICÒ*é#Ò¶iÞTIæ8Š``$'RÅÑ{.�EÚ*Y1M�§�\ŠorÎúVbת¾x¦E à Ãçˆm拊�ÄZÜíÉ!²¤ªÔ¸¢+­X7 }X/’M=™ÜÏ¢£ªù¶Í˜ ~}x2æfÐÓà9PfÖ«sŸªõ²öâ"tT õ ³ÄÐEt\~¸Dz+BãWþ.¯¶8­Nb”¶ôhÖå‹ù³œÑ»IK?Xƒ€Èüßž$6)ذôî¼\4Áq}ÊA¹fn„}ƒnÔÄovûYÒæ iümÛrè[ìØ–Þ1qñ_íæ\Iˆù Æõ x©R-{¢B¥�Ÿû7ë¡Ä ÿÏiû‡÷_5öMG ǼèY¢ÄçwjR†®Pº/‰‚Í9u#“c ‰‹Ä{0N�æb±�àË‚!â» 4‘“Bl ÍœF ÂØêÚÕä0KÝfbЙ' ºx€%tE¤%S)Qù¤‹ /€ ÒÏʇ ” ê¡I$ ~¹eš�€MZ†l—‚.gL¸² ÀSô\òôÙgŸ•cw]Ä¡ÜêÞ¸b1f*ÇqÆF„fQFe«Pü�AÃÖ G^Éɸæ=á|ús³ù“܆M\±‘3ÿõÍJ‰a°ÆšWÂò[¡aùaS¯�e““ïè4é±i��z˜d„[]Ú܃O$2šãJâ½�øµs�\w_—Ìþ×c5n¼ïÐŽ¥Ä"€*™¹úÕȈdáBäõž¥eUlX_§°m�ç½®ñú¾}®|ÂXÁœ|g§ïoù™E×Û'¿o’±W §äš‘ñ²#¸ýþä‘~Y¥¤E©wO±õÐG! %„¥^-*µÛRÙˆlE«úàø—HE~Q ©Â\—.]èÚtF p­6 M©Tâu a :t¨QmRÌGÚbU¡_І)UW¹âWU’ƒä�Ö~å•WšyR:†`ÄPgêOÀ„l@rå¿ê9’÷åäZI\žÆÁ5a!€ž ³>^ŸÑ ß%\)¿¼¸ªÎaØÐŒZ>P‹IFØ»ôbý&R/OÑaÑâ\ ù6¿]ƒêuº¡ƒ¡à�ÜrŠÝPªÍ(ºa¶ÓŠÔ÷‡ÄoY´�îîK%СF»j ÅôÜWÛŽ’Hý-Qö�f2ò«(wxO{Qz s¦<5So l]¸môYÐÁV�/0ÒŽê>Ö$ÆjßQçÉ€lƼƒKnÀ¬åX)�€ˆb¦–B3PX�©YÜd¨2d¤ÔÛ\í£T… b4«;|knÈPEš%HolÁF&aïÂ~2ÅñH•5Ì$”vcÆF•Œ‹/x×]wñ¦ä ‰ LxB°Kz–*n„X=ê ‹�ŒyßÑ£sͤ”k*HÝ`£ ºÜ2,ø•g„²0µù™þzy£ì¶Ý>Û48�!`ôøòl½×L9„ښآ³>ÜŸ6~Ä�ij ƒdBÖ7:ë¿§ë¶³_߸h';Õsü†(+t¸&&lƒ´‚J±R`]J1Ñ1ZL ÑšÓ _ЋŒ ‡žBhpIVüÒðÀÚhWƒÑ7€y’óóÏ?¯d(…ÙÇŒ!,à �ün*°§°%!9ÊK˜Ž†Q'á{.Uer‘·@Ñ›Kò‘_Þ‚jH8Ä®É _<Ó¢¢£0u¤ƒÊ½Öî]WKö«�S¼RÕKA>ê´ì!úâ�ú`*n–’§x†ÿì/ýIw˜õÊ\þÌ´L@¦ÎãÄ=0¯L23ªˆíhDʹ²ý©™£ÔêPÃ¥r©ÉEKÙ²1˜WÔÊÕbEGã®aë¾mž8dT’w8¹”Wy¤yk§³àñôúKV Yãñ?Îo&J%ì•¢ß1´ï*5k¿msºføä‰ê™µR•ØÛª~ÿˆõ<=§Ý_’�þž±[Õšn‹DÇÄaN‚Jb€½QŸ¯Ålòn-J”, ô#º><=£u<] Ï “§xóôm­z£��˜b|5äxp9÷>‚9“™£ÇÁE ÄœÑÅà0!“i¹¡ÿþÉn*�Œ9J�9x nÄ®þ¥”^Á›&jÞà,®$´c–.æé¡ ñL‡hø»(™k{õêåŠä­©9¶9f%Í™ÒEŸç­î�ûýXìC"ˆRY)rê]G,¢jÒ“šº¦®BÙ¨ÉV ÏŠJÞ‘�zºh¸mÖ§±)pw¹¥ã¹/žé"ƒ­�ÏmèŠgèÔ]”jLˆ�äýޤèjÕÞm†G›QO橇�2)xü�]ÎðT¥…Û{V®œ££Îå¬Ö[˜‘œÐ>軋›œŸ‹u­¶äÜ“Œo}ÞËg¡ïÝ`£{ðĬ/ËL¦·`#HÖ ÜŠ­‡‹ Ï[–(²†¿ï¾û¼ÂºxËGdí$Y!�!oöz÷t•%d¸n17c]4Ø7©‰“ ˆt ¨�gèZESɶ·Ð˜O©•¨¦ûe‚ˆ³À2«Ñ¯RU©„r(Ø»ì²ËÈ8FNä)û$Œ"hj5(�1DäEhâÉ`E [uhŽ Ÿ|ð�9ž�w„ ¦õú}ü±I†Sj9Ð (�çEÐâwÖr%À�‹Ú�«�ÐNž{î9!Á¬+Õ¼ÍW×ÀÛ\å¦ÎË,½t¾±ƒn&;n«œö™Ë÷GV»pDšÎ}Hrù×ý;ßè6uDVîñh7)‚$\i™é¾Í@—WcyêüfEíÙбÍÀ–2Ø2t£r(•ÏXý”»:™<°ÿ‡}bãcÌG.x—|h3LÁºÂ!u'Ñ<â‘Âjtsš=d¦üÇ^´l8ƒ{j Yù³Ø33¤ÁK›2ÐÆLEËÒ»ÅM£tÅ5[éàdkö}ªà»Æ˜–—2‚‘‰LR.u±¦’ÒÁIzõ.½ôR37jÈ$.¯¯z4Z€NEo½õVJÑGG0 ’“ŽémSñˈG©ýâ¢Ñç×êTCn‘Ch½ç½ÔóÄ+`·A�z¦ä ®O±ç„Sꮘp‰Kû|gÊÐ[Õ`�xæVħ29ð¥óƒ|hBLš-°i/MtLMÂÄ ˜¼¤#(>Hr@g×¹„A«ch5¥V2ìöbÐÌÔG÷´bÒæyêM êJé ¨&xè=—·8ûì³½m’i¿àb—*ñÌË oL‡ëNäOâE¢îz[GÜýãxEõøà ñß�]åpZ{™še\9ç)ž%TJ>s0ж+!öæˆ|ÈrŸ~ ƒŽCq.ÏúJ �EôÄ®µèªfÚ.·vÄþL³Z·¦I¤&-Nt=ðŠêõîMù 1oÙ„0¸�D›Ž%?ý­Ñéç8ìÅ�ˆæ£�]K}6©ñ™½ùö:õ¬2ê×L¡ÇyÙ�8F�Óz•™0·é—æ‚6__ù�ÏM^’?Ú"·?RýÔžî�+‡ Òe:ÓÊä+PÖp>ð…C5x"LŒÞº27“»·Ñ‚ã"[ïã} ÆDt=˜˜ZP¬5E%1ûN¢‚䤢˜‹Fnßÿ}\Š2O°ló¢éBÃtÂþ3OA˜lhÄ�Šfc T*ÀDâwúñ[�‚D‚è3ý�H¼¹oœ+Ϭ(„L]Xã3Gæq¶¹(#}ã[?ìf#ˆAMòRUJzç‘.3ÔüäëCÍØ„aBð¦j¦¥C äœK°ö¸„¸’Uü èR_–ɘ#‡™nYnG”ùË 1”…iÀ5‚ôD¤RÀ|‚°ÅÇ  X@þ 3¨Ùrd€"AàSÃo}N•Ø4ctA›ŒJ"�2ž°æñkªP S@6 S >Ar“ÑŒõ$û–¦€î-‚ÑŒw�u¬`——ý|õK ÂâÕúñ&)ä˜#Õ5ØÍÞ½~/ç&b$˜P!žÍÀB~ñB+ŽŶ3ýˆ)¯ žV1cRi¢&F ÀîŒ6ÏB‹nÅè¼=kªB „X=z™ tÛ@ãY�~úé²´f›Ç¥óUhoTð‚°`˜•žÅFt!„n‹Õ �Š@Bùø s_Á«F|$=ÆmP?¯æQ‚�0)·Ñ‰L Þ›ø8Í€a™nBw ²àM[1ˆÊL@4c‘Òý¶ç;xÏ€Ò’ kÆvÕ,SEØy x™âX¸ššaT D�/MC-ü÷Íó¥0aÜ´>µ„ïHÚ*Õbó¤Ï“à@ræþ}˜ðE±±Z¶\ Æ/�’Pôú5©øFMMÉ,UÚ?%€&&lµâ…M1Á@yŠ_·=cþj?Fý�è]ñmêÅ%æå Ö•äèº=öA�ˆÔq1bgî9®2âùN†ºa“–aVFZ »›N�‹B)º¥2l¤cC^­�ÒV|÷7 óÁ“³ñ „�äœÌ>-d –%J"¨? ºu¸KgÍB)á¹›=ÜÕËWþ,QP]K\/¹[ò‘UVÔ_ãW‚ä™$3#˜/­É‘Ò�UßB�Ê8Ú9Àpqûí·óèf…Þa‹úRž=ˆÙ ¿r8t°‚¢£›÷m¬ûÛÁ(í3Ë�üp °Å³ÔL拘¸¼µ«PÈUM¥ü¼�¥=î8؇›*~1·ãJ¼ï‡rHNMý+uçÞ` ï�ÒV,S¬kÓlÛº@4G{|Я£�¡ÔŸEàÓHð8”ÔÂCI[4ip7 6üø/À ›lhͪ©ZáÑ]Ô…FŽ6Â%­Jæ<ßîÒqZ$O.ÁŒ3è&xn“É «�ÂÑb�&¼Êü…óâ,…ýA@°hÀ¡lØ9£ëôýM?1ÇËÎ9+ªLíÒ¢f¼,”áž™KÁ>8½}j9P”9€*–8ñaÜÀæ.l+¼tá­&Ï—ÅF’Ýæ<É€?0®,Y" Šbž9XË¿(tñ, e[Nîó[3’cÔ-b2ĆqwiØ-êÓsÏ=—# õ6¼@ÇFÅg­Ì7BÂðJ<ŠRY$¤�Å œÒl’¸l2ͧE?Œý¸qã8¨g–HKØ]‡/$ý·�\ Qœ¹ûî»QºÆ0» ¹b¨‰©IÌ|‚^p_þ˜U‰úêEî!(®ˆqü)5CÄt zX«‹ÃQòGï=¸Îóa­C¤2çðù‚ªgŸ>}¼ž_B/…ŽêtKÄ^-� ©PÇÅ}BÅ„ør‡Ü‹ú¥¯P?ûÀZ¿Om¤åÀÑÅ:j 8hÀ‰¦2Þ+pB-hcž=W2û6íÏÓ†Kp„W›Êr  [<[¿—yÌA{SÕ5o�ÊÛG–p7j¬.½1^ÃþªòTÁË“o¸ü@¡»˜u;2ö$gš~R½iñ„Š�ÄJ1ǶŒ¾¸5‡QV p4§<Šù=Î;ð)…é~°ö™å€åÀ1Ç\À †Õ^Eq]hæcxEÅE³#.“ >#sŸÅ¾�å€å€å€å€å€å€å€å€å@>8`A�|0Ë’ZXXXXXXXXXXXXX½ÈÛ£ÏÑûn¶æ–––––––––––––––Ê ‚(+lÀrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀràXæ€AŽå¯kßÍrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀrÀr@9`Ae… XXXXXXXXXXXXXX˰Gä鯛´z÷Á])Åâ¬*3-³dÕNä*Ò5¹r{ÖïMKNãuâJÅ…œ¨@„;¶¥'ïÏ$‹Į̀j5ââ‚�¬é-)%%kÕŠ”ØØìTééY�šÅÇÚäå”�±°°°°°°°°°°(ª°k¸¢úe¨WVÔw7ý´nê­b—[:œú@W½=ziÉéïtû eoê¥ã.¬{jâá~‘½{2ï¶vü'IZЗS·ïRJoC ¬ý'¥g«eJYªL±ékZ–¯£16`9`9`9`9`9`9`9`9`9`9`9`9PÄ9`ÍaŠôjÔ«~‹~M[l!µŒ-LibÑÇKŸ¬üÂG}‘•‘U¤ßÊW¹Ø’W,®0@„ÿ=°Q�‹Óz•á·d©|—[¶|ì×Wyoµ.ÝKSóøÛwŠ~+³5´°°°°°°°°°°ÈÅ« ’‹Eë&:ªÓÈvN•²¢R÷§-ûrEðêe¦;ØGÊÞ”àdÇÛÓÉ™“ÞÇ[ÿ÷­ÄK¯©�?#˜CܪV#öñWjs¿nuj×úK=°!ËËËËËËËËËËËË�£„v7ûèøP¡(wÄø\‡”(S"*Üu~aò"”7ŠH}bã¢c|Xö/a# fM2|`“cÖ–––––––––––G¬&ÈøL™é™›çm]=iÝÚÉëì8@ Ê&–iÞ·IÓÞ�bJø7ÓˆŽ lüýãê]«’bâbæx¬X?cãŸoÌ�ò¡[)-ú7-SÃ1ßÐkË‚m¾9õok*ÆGÇë0üÄ–ý›zó_ùêíÄaGåf•æ½»pѧ˲Ò3 78³^‹~M¢‹åø=˜±pì’ù,ÎLÍHÙ“Z¯{b—[:–¯_N‹“Àî5{¦<5S MìR«õ-cKøo{;wîüüóÏãââRSSÏ=÷ÜÚµå‹0®�ÛÓør7HZjÖ²Éá½—·wêV*5%+=-ëôsÊV¯•m[”´3cæä}³&ï_¾ä G±bQ]º—éÕ·\ƒ&%Â(W’�Õg£wNÿ}_Ùr15jÇÕoÒi¥Ûv.éBap¶úÝçI_ŽÝE%÷$eœ|FéÁ×W©U'˜ÑSØU² -,,,,,,,,,,,¢ÇŒ dyQhغhû¨îc½Å•(Süº9WÅWˆw?ÊŠújØ÷˜Ãt»¯K×Û:æzšEV[oÏiÜ øüÂz§åxÍŠúã‰iSŸ™e•À…ï�×伆¹aæ¦÷ÏýToÍÀåßôOìRÓŒYºtéyç�'1~øaçÎ�ͧ¡‡W,=Ø£Å!?¦®„_LiÜ¡k¶cÔë¬6}¦*åËÕë3 ¼Þj`õÊ”n�—VªûÛ²æ~£~øÖŽ»†­Sz xé×®J½ìÌ•kÿqsÚó9ÈÅ{k9`9`9`9`9`9`9`9`9`9`9pd9`¬{�lEŽ¿Ò»Öj3¨eÅF¢££ç�^8ÌbЄŸøã¼—zæÃž%:êìgÏØ»qÇè.ù쯥_,¤èóÆÙ¸áBå¤jËÊÊÚY¯Í„ƒi{=}zéê¥ç�Y4çí[nûù_ôzêt¥$ '×.ÿ7aò<ëÉîÄüóÓÑ7!ò`RŠ" ]oïÔ¬oã¤UIߎœÈ[|yÍwÃg ._ÏÑIÝ—:nðx\g?Ó£V§³^�»àƒ€>5bbéÂÀIÆoõZÅßû¶š ‹{ϵëvlM¿åÁêø4MKËB݃ÓmÍ7;lçÞ\nHOžóÉ'ì³ÏÚkïý=ñ�ó¸ÖÚ·ýo g„ÇÚg7B é1«³q ìÛŒ�¸ã“aÖ:C‚ Ú}ÿÞþÂ%Ztó‡Än”•Þâ·%E¥ð`8Æ”ƒ„mDÞJ»Im`‰I ?é¨ú�Q(Sš‘�i¼D {s�P@ÄS× ¥E¥û¾>„½‹Þ§­7ü‡8ò6òŽ0ô_Ü›dØH™Õ±Å§p‹Ÿ�!A”‘íRÑ6úÇÎÎ.$$¤gÏžAAAŽŽ+FVUè()©0†brÔ¡€ :##½$3£Çßvíc˜:íêµÁ&Gšê,,,ƒà’“Uzâ°Aú‘D×R\lµà««xäão¥Ç¼˜?66š‘ã ÒØ¡½¹rÙÒ$@$@$@$@$@$@Õ$ÀH�j¼Åá—ö%m~}ÇÙõçUã!7(ÕÓêÜŠp xX4é7“~ÒÎfADù4lX°�«‰ú Å%…å¥@ }¼ÓúåÑN?“^˜[¤wªÈ% ¢Ü—kKG_e©é¡U«Vüñ‡¼­ƒF~^Ù/óRßü÷%ˆªéôvUÎÇqp¬§Þ~º÷`§ñÓ<�zjëé}ý¿µ¢ÂÒŒ4ƒ¼röTA„£AKR]qÇóKâèD�R†·$@$@$@$@$@$P-×?̪冃«BàÈO'–ÏZ#GˆÓ[².e£§:‘ ҡɆF[ñE­:,F‹Ù�ú¶÷6Y é6"¡Z†5ÎS¹ñÊM-‚P„´8ù9šôsã¸z¸ËË-½{`ÜÁÝ•_£ÚÛétáãÈ>Ãp”LU×äã§ûi}Ø=ƒã0pÛúlüϾê?óY_� ôÄ©½r:å,—.ᶬÊ3+}°M$@$@$@$@$@$`‚EPjµ«(·xã·` T'Å)*PDýŽ”“©_õùÞüÔÚòÂæmÌ?Ez˃›ïµs3Üar H±1ùHtvŸÙ¹û¬Î•4ø/ùõ+2…òÊÇ�ã¦zȲ/üõÂ7ÜPÊ´Ò==è=Èéxfû»rŽÌ[¹8cÏÖ˜üB#íP—Diþà_½'ÏðTö°M$@$@$@$@$@$P{Ôÿ¿öf¢gA #>C¤�Œûn”_GYÁ4éPòM�Ý�âæÍl+9ͤ<´‘&Åùê¤ó+{*V‚j •ˆ~avfýyåÊ‘JSÙÀÌÌÌ+V¬ZµjùòåIIIæ�Wÿé™S†õOšá1íQ/©€äç—mÿ³"‚£²)�;s1^}º­4†«¾Cœ™ãóë–ð5£Â£ •n—-J+5”m1\%å/!+£Ê5GÄpþ&     ¸AnZµ†à`”Šñ²N&rJ˶¼±£R¿«ÖååKó3Ì*å2GfbV™©TŠÀž-࿤ äÄo±ÆA1î4Ócc¯  ƒ}_Ä©4&,Å.5VAýZâiʉ«ÊŒ›sÆc%&FYY%&&Ξ={æÌ™�?þx\œ!©¤V/QÂÃ�Ý£¨þq`gŽh©l^ß!j •¦2e›öv�{: ';«T¼;;ÍÐц“k¾ý(�Jc¶I€H€H€H€H€H€j�E�ÚckÚ3ªchõZ<[÷¯M"%K}`yúÙ ÓÊ{¼ _ÑI¯ œ*dŽÌ YJMA ´-¯B ?;?Ø›—Zqø‹<)Æ#Ô-xp,×ýsÓî�÷å O@û¸›¶ñ?[¿»}¡2RC84÷[cÕyz{àÄ™oýxåhEæ‘Ø•g>ˆú"aÇE1¹öÙ�î¡no›¦Ñj*µ«ÙeV¿=²*a[b¯'»öÿWïšõ]ïÞV®\yìØ1›gŸ}V«ÕÞÚzJKKçÎ� 1E‡ÊðàƒÊ[ÙÀt‡ªætÒ[U999ß~ûmYYÙàÁƒûõëWÕá´'     �fK€é0õðêuví©ŽÃ@0££�~ëlêaϵ<¥Ng@ U¢:ó,[¶L* ¶¶¶�¦²8 ˜è–Õ–ê,RŒ�*b×Õ÷F$@$@$@$@$@$ÐL0¤Þ^taNa½ÍÝD'F(Guv‡áÎÎÎ�=öR]̸BŽŒ^¯wss3cÃG$@$@$@$@$@$@ �E�†öF¸žz# +Z´ha^Áúú—_õ¶P++ŠR� àÔ$@$@$@$@$@$Ð P©··æèå�—–¿ï˃±+Ï䥿û´óôb_Ïå‚RãÒÏýîÏ„Œóè×»êÃG„´áäç¨4C»(§èÈO'/8–“”ëä‚\›Àž06¶´u²I;“¾ý�=I‡®`ÞˆQ¡}Ÿëiç¦W;,*Z¸paQùݧO•�…·p€4“¼¼¼@_�£V¯^�’’Ï�:u�¢§]»vHEY·n]VVVqq±··÷Ýwß�¥r h,]ºôøñãР\tèЩ+*q‹y—/_ŽX"NÄÝÝ}ذaaaaÒË[²d‰!ÉÈ0@†ñÏ?ÿ\R~¡Ìj¯^½¤1ÊŽ>|XfÁ@+1b„ÈL‘6{÷î=qâ„��OûöíW¬X‘””„]888À²M›6ÒL4nº§N�ÚvÛ@öxè‡c+ŸøÃäbÜ|¯wOñ¨0»èãv_d©³fPKuÚʉþ�}¥ûòe¯yÆ–7Ô@-³ZúðÊKbå(Ù°s·›yðA‡1TßÄÇ6”˜Íž={Μ9Ò¾J xxç�w A¨ªx¾ýöÛxÔªU«éÓ§ ‡¢ÇØ9>ø1»£c…îƒ�ÿ÷ß_*cœóÌ3ÏH‘âäÉ“?ýô“qÐDÏž=o¿ýv1633óÝwß5¶Oýýýyä9Ë‚ àSÞš,ŒºhÑ"h%ÒFÙ˜0aBÛ¶me�%˃ñÎ�;W­Z%G)t”�òÛ$@$@$@$@$@$@ÆXÕ˜I�öôy¦û}kîéòP1ë®÷YjnŠËÐriá<ä•þ÷.Ÿ0}ÃäÁ/Ž)+)[xÏÒ’ÂiµùµíP@ Žô~ºûë'OY:~øÛƒ¼*­j¡ÕkG}tÛÔw·èî'ùiù±+NWx»ö¤h â¡׺«ü/üàÂ0UOq«ì”m„u m½Œû²2e¼£+bF 2 Ñ"žaîýþÑS,¬eŸ¦Åä§ç¯Îï[5®ð螟Ç"„$31+ådªÊÒ.UgÝÜÞu×]ÈpÁ\øìG˜ÒI’““ÅÔ………"QO<ñ„�-�eƒø ÕÚ�\#â; ¦@¶ÀSDatíÚõã�?F¦ËÚµkCCCÑ YdèСb,"8àÇâÊ•ÏÈò �H¢Ù·oŸê©ê[3f :»téòÑG!÷';;S éÄÂåA¯oºŒXˆ>üðëW¯ª¦ã- � � � � � �ÀM 0䦈jË@ïl=.²Â»Æ*dpÚ©qiù¢ÓZg É B?rSò |䧸‡¸a ¤Y…++{Oûâ¼byk¥±BžËõÛk­¶¢|b*¢ lìuAZâÉŽ—1Ë5ÿøVïÞ½;”†¢|T«mOOO¡€`¤ÀˆXðÍù=(ØM�Î�;Ëøè¨”¡\´ ÔÑ@‚Pðað€ Q"’"==]8TŽmK¤±ã±²Ú Äy‹Ú"hcUX‰hX¸<”�=v�J¬Ò‹d›       Ë 0ÄrV5léÛÁ2‡têe¨ýim­±Ö^¯ñ‰�ïíÙÿõai&Z›kc5V¨„Šþ„m‰oµü¸óŒö­úº»BH®ä@ÃDr�U`�D èì´Ò@4� 3þ|Ugܪ䌀€ÄPˆ„åìBV�=ß@ÝPy[PP ´ üF©Ù/Ð#P‘¤öθE"bUät­[·Þ½{7nE²LU—‡º°Rñ�dÙ@¢ªLÄ‘“²A$@$@$@$@$@$ "@D¤în sÔO1wqaIIQEJʉ«_õýA.¾ �›šWR`ˆ‰�fh÷y¦GÒ¡äó›ÐÞ÷Õ!ü �Â÷­¾Ç'FÄ¡3qå$ç^kÖó¿&1�~¢\â,ÌëMDù“e;Ä•CUNtËm“»€7±‘ª.O” ¹åÅp � � � � � �€ @¤Áý%TT)³Úú»°8DsŒùz$’etö†—U”[üiço�£\7N½�´x,t� ».Æo¹pj™¡ê'´’ù£žuô!Õ±/Ê�õÕ†¡Ò5ªº’›&¤‡!!!S¦L©ªóÚ³ÒŒôßЖ'Æ � � � � � 4IAèk-Ê+NØžˆÅáh˜ˆQ†žâʺ˜­R@®=±òmï�4ƒ³u·¿»{Ç»{pdLÒ¡+�=¤�å èëׯR’M”g»ZîDi©<6%·üR>µ°-´¬->>õPå(Ôø�mÑ�H×Å—kí¶·w§ŸË°*?ॠ£·0CY·Wµ½e÷¨¦�Ú¨ÂV6,zƒd…9Ž=zè�¡X θ]ºté Fßøøøàø˜#8bÙ²ehäåå}ýõׯUB{õê…§ p&îáÕeq8 Ç}饗¶oßnñœ× ‚� ’dôbR4D'B[®ÛYвpy�:u‚3ìbÁ‚—/_F{çÎ�7=�ׂùiB$@$@$@$@$@Í‘ÓaÜ[G Ö„Ê Ýgv^úÐÊ¢œ¢¯ú|ïèë�“Tégv^jÞ‘ŸŽo~Õða�ú©Y—²Å®ÂG„ˆrªâVu®è4óûÖ‚5Tq¬I›6m àKþ×òKe o-Œn=zôܹsa¼·ü’ÃU œ¡ Ù'Ñ"ƒfqù¥40YRÄü°,_é¹6ï¼óŽè�NôÌ3Ϙ¬Ãª"§°py¡¡¡­ZµB æúì³Ï”®Ø&     ¨*F‚T•X Ø[ë GÔ:z;ûBò‹<û6ê®ðáo6Bqiáº"=(Êš&Ê~Ñ–+4^°ÒXš¡ÓÂåMŸ>=<<\éÄ«1ÞšÒŒm      ͼyóÐ5uêTÕÞ6ˆɾœ�r†!¬Ã Ÿ˜¾òÓ ³ Çîç—¸¹XÛ4,… á ÈÁA¤2¡ÁôÆ*é�‹‹Cf “Іrrg�ƒ'''TQ*J³új[²¼+W®¤¤¤@õpu½Å§úÚ ç%     �B€"ˆ¹�cVbWœù)fìJ K¡M(C3*3önãéÛÁÁ‹H€H€H€H€H€H€H Ž °&ˆ9àégÓ—Í\c΢âY™�½ µ½©e¯'»R¹)%� � � � � � �@m bŽª½§½W¤‡ƒ©âÊa™²P­5/•8”¢]�UèÖš‰ Æ`ØC$@$@$@$@$@$@uA€"ˆ9ÊÎN3¶²ZŠ9D|F$@$@$@$@$@$@�…@ê�ÙX¨q�$@$@$@$@$@$@$@�ŽE�F÷ʸ`       �[!@äV¨q � � � � � � �@£#@¤Ñ½2.˜H€H€H€H€H€H€HàVP¹jC$@$@$@$@$@$@$Ðèðt˜F÷ʸàDàÊ•+)))~~~Õ\VbbbNNœ”––¶lÙÒÑÑÑØajjjFF†‹‹‹§§§ñÓÚîÉÎÎNHH°³³ ®í¹èŸH€H€H€H€H€jƒE�Ú Ú,|æ]Í;ðÝk­‰`"�½®ã}1Z½ N¯9—|2ÔÆÁð'tzõÙ‚¬Bg§–}ZàÖZ«±q¨Ð w ²Hçéí­4VG‡eQNÑ÷#�ü`h»ÉÑM™‘{Cd2\`>iÒ$kk‘5Ò�¿¿aa¡“““ì©û²uê~RÎH$@$@$@$@$@5B€"H�`lŽN\Z8�ûn”açeVK^ybIl—G:ôx¼‹I­úyµ?R`†¾:à䲸%ÓWÀlõ3‚ú·„“CšI'B?D®Ptt´y@&OžÜL°p›$@$@$@$@$@$P(‚ÔU‹|^Ú—´ãý=i§Ó¼P_£ûì.Ñã"1�Á™‰YÇ9…ʦÅèìL_€ýá�òÃý16v:Ôæ(Î+n;1êÊÑ”]íËMÎÍO/èñ×.�h'*”t(yïÏmŒ·÷°Ó謻>Ò±í„Hc³¸Õg¯žL…Háåy`îá#‹N”—¢2´uôø“=JŠ*�(È*€Vb¸4V‘£Ã&-»`ܯ%%G~:Ñ{N7åòP ã—BX¹@IDAT_~AÆBFލ|jy%K×­[gkk;jÔ(Ôò‹ŠŠ–.] Ï(º!J™¢gÉ’%ø�ž“'Oîٳ풒’ˆˆˆqãÆ©*_ jkCSôC¼0`@e™)/^D�Ë—/ò¬¬ ð†‚¦rý—.]Ú°ažc:ôÿùçŸqqqh£§wïÞÊâ£7nDùU1�­ZµêÙ³§t%«W¯†M»ví°elK…ooï»ï¾u[UÆغukZZšÈp�þJªÍbX?~ë‡Y‡da•7Þ’ � � � � �@c!@¤>ÞT™ÕÎ÷nüÏÖŠ¹�_EcÙc«w}¼oÊoãõζùiÿ»ÂDøˆ—@�)'S7¼¸•GÛÞ…OÓM/oCŽ z”›YûìFè,H9¹.X”Ym~mû¶·w ³¬KÙh,Ÿµf÷§û§­¸šËõáeV>PË#âŽÐÄÝ—r’*jvBdAGð V^æŠV\÷SI+°g@ õÄ®<Ý뉮J &))éµ×^ãðá}Ë"ˆS§N*ŒJ$??¥=ñU�R¦BA�øÎ���U.fXÉÌ™3etT•Ï?ÿ\ÐP¹ã÷ßW‘mh[¶T¼ X¢ÿüùóï¾û.²] ­3xS͘^~‰§XžA°Ú;v`:é‡È‹ G�…ðEš¡}ôÑœ9säY3ð†êªñññÂLlgÿþýØï_ÿúWÑ©åý÷ßy:è�l´}»éú/ž¿I€H€H€H€H€H Q0W€ Ql 1.òüæ¡€@Ř0ÿÎû×N Ö¹r8Yô»µv�ÊPVRvõTªÉ ^>xýˆË€4]yaô@Y@�ń‚Û£?ŸH;c¨7!.ˆB�ÙÝ îœ¾qJçíñó®û÷ækVÿŠZ§–�†‚uŽxwÈ�_ �¹§Miq¥á*fnµ6Zÿξ0H‹K/Ì.TZ*ãªz bàYéІ5äSÙKt4¢‰rõêU©S@;@ùR!@=�œ©\¶lïÝ»W* íÛ·Ÿ0a‚°„‡Ÿ~úIj�9ºuë-£S§Nb:__ß¾}û¢ýJçxŠ~èA]ºt–rñrR±xq ø>|¸¨® 9!'ÒrÁ‚B�ìtìØ±˜O±°o¿ýVš-^¼X( �Eî¼óND¦ˆ©¥$@$@$@$@$@$Ð (þçc\~#\sYiÙÎ÷aáPþ²û~çC‘Ëñß�^òà (‡<Öë©®¨0êÛÞçìúó÷^ƒâü’Òâ�^gmc�¼’ó›Ð28HCáìúÀúÉBþ˜¶zâ—½¿‡Œ’u1Ë#Ì ÆH�ÙúÆN4¢Æ„ßùÙp1ð¶ÿ ôŒð@ÌÈÁyGzÌê 0P]8çåŽO†Yë zÚ}ÿÞÃÞ½"»DeY…[�•o{ï“¿Ç–˜I¢©‚Ãj›B˜5k–››�²W.\ˆâ5„qæÌÄY ' àá‡Fý¿ýöb(Ж¤®à’Á#�<"‚MÚ¶m»oß>„�=ò �¢‚d4dqèÐ!È+]Ë/ô_AD'–�ceÏ]wÝÅ=111?A(Jrr²0@ª‘�uÜÝݱY¡7A©Y´h"A°Y’„……aIÈ Â$û<ñÄȯA»E‹0~ø›H€H€H€H€H€)F‚Ôõ‹ƒœ‘tÈÇÑ}fg¡€ �hŽ^OJc LFF|nƒ¶ÂmüÖDP=N\òNëO·”«EyÅ—Ë=ö¸áˆÙ>Ow ºµvG÷\Æ-®„m�2ƒF»Im ;ä§å~Ò Põ�˜%#!Ó`wã…x�ao ˆxâä¢T^n4¯Â�£�£°¾ž­S~�Ô•��DÉ$Ž*ø½USHB�ƒÐÐPmqîÜ9á:…h 2D4ðmeÜ z`Ÿ�mH2‚ü™±$âÂ^„C”‘ÃE%HT •A•n===…‚Q 'v„5ˆTµN¬¡Û£�T"HbbâìÙ³ªðøã�£B§ñR-ì‡ÑâKþâÅ‹rÎ@‘í*5P©öð&+¤â'­È#o…7@šËîÝ»…n¢œÅ¸Gù´Ú(nŠY° yˆ¯rR™5ƒª®"qæàÁƒÒ ''¯FÞ²A$@$@$@$@$@�‘@¥_­�q3�bÍ:{]×G;b©I¯lxqKI¡¡HjÜê³8§ ÷P7ï¶^hàRÖ=  ± rt˜xdë`#·–üF‘QŠuÝ?7íþx?ª�`´�«±iÿ³õ»Û*K☔/�@ƒê­9W )'®"=øQUú¸¼?)ùØU¤óìùôÀ»¡Ÿ‰#~Q‡Õ¿“¯j.eàŽhU=µüõ,Ä—üÊ•+EDɺuëŽ=j¹¥eÇŽE½�mÛ¶ iQÆGÆ¢Tª8Rçé~ôÑGR5@cñâů¼òŠªò¨rŠÊÚ�N‡�!D€ "5“‚N\R¹¨l¸²?""ÂÉÉPæÄ‰?þø£¨“ ¸ýꫯÞzë-!Óøøøà”˜�Û²eËÐ@äÈ×_]ï"Žr/l“ � � � � �À-`M�[€VÝ!¦Åìüp/NxÙýÉ~ü(Ý�|o¨¬ôáèíàìš~6Y0~ qÁZmzy›¡1$Hgg'—IýBÝ©±ñî�¯ú|�êªë_ØŒŸk£ ÿB|QÞ¢­®zle•—6ôÏÊî#?�Àz¨2ûèC8ÎFúÁ¤ß œ¯4îô`»¡¯¨‘Óv•ne±ÐA�½‚Œ•O?ýTö7qÓNœÓ«W/œ©ã%å—ñÑ3fÌè#Ð0õ—_~©4¢Œ²G´M.@šýúë¯*íþåÑ38Àå¾ûy'Â0qâÄo¾ùƧN�‚ê!gAC)9�=zîܹ0Û[~)ÍØ&     �ÆK€‘ õðîPuÆæ©aÕs#²cúÆ)�=¯ÔŠcnCÊ‚ö€ ‚†G¸»¨'Ô¯¥2‹DH :ýuYÆ6†0 Y‡m(óèþ馵E[yἘÞsº+â©­³-~«|*Géì*UШ"˾:úV./,µý½Ñ¬Ÿ<ì�ARî‘OÑ�ç¹¢]™j ´7Óž6mšƒÃõÙámèС" CyÈ‹˜E)À§H�ö!ý<¸oß¾ò —++”k†Ÿ§žz*,¬"fGÚcè28yWöȆX€rIòÊ5(ûE[u�ÊXìB¹5s‹l#ooo•+XÆÄÄÈ0,õÞ{ï•·0¶··Ç+;UNxK$@$@$@$@$@ œ€fÞ¼yXâÔ©SøB›äòP#7%¯¤¸ÔÆNçÚÊEVͨíÍ"“%ëbN~�Táàí /×;j{Òúò�Â"z½)$š¨þ�rîÜ9øA˜‰¿¿¿‡HA BB S¸¸¸ Ð†ãº„�`yH«�DM¤²ÓpA6P@j„^Ýo“3’ � � � � �€’E% u»0»(vÅiUy µª�–B¿�±Æ²Ç»�gU šÊ±l� � � � � � � T‡@¥ ÕqÚdƦŸM_6s�Û)³±·)Ê+¾©e¯'»R¹)%� � � � � � �@m bŽª½§½W¤FÌYYe^ÈBET‘T•ÕP�BqP·Ö®ªNÞ’ � � � � � � Ô Š æ8£’茭¬–bŸ‘ � � � � � �@c!ÀÓaË›â:I€H€H€H€H€H€H€ªE€"Hµðq0 � � � � � � �@c!@¤±¼)®“H€H€H€H€H€H€H Z(‚T “ � � � � � � 4AË›â:I€H€H€H€H€H€H€ªE€§ÃT “@C&põêÕÔÔTwww//¯†¼N®�H€H€H€H€H€ê†E�ºáÜ”gÁgö�?þ¨Ó鬭­§OŸŽFcÙíæÍ›/\¸ ÑhBCC»uë&—���€Gz½=cÆŒÑjµòQõ™™™+W®¥ÂÂÂÛn»M)O”••ýöÛo999���ýû÷¯æ\ðö÷¿ÿ}Æ 3gÎ|æ™gªé�ÃI€H€H€H€H€H  h4ß«Õaýé§ŸŽ;Ö××·:NþØ#?_>kmPÿ–÷,£ÑjêlÁ{öìyë­·Ätýúõ‹ŠŠª³©«34‚¯¾újÓ¦Mp¼zõj)ß|ýõ×ß~û-úmmmèééY�‰Tcÿñ�ˆÎÓ§Oÿë_ÿ’�?^xá…¬¬,¬gÍš5Õ_àÜÎÎNNÁ � � � � � 4gÍ¢&ÈñãÇ_ýõ_~ù%77· ¿ìÒâ2ì® « .÷)á÷ß—3 MAÞ6ð†³³³Xa||<¢?DJÄŠ+äÊÞ"Û5ÒPJßÿý•+W¤[<‚E“ìä–Ù      �º$PÃxu¹ô*ÍUZZŠïó—^z ¿Ñ®ÒØÆb¬µ1¼M½³Þªî¢@¬¶°cljhÙ²eÅÅÅò¶±4JJJþøã±Ú£G�&''×ÍÊ‘3oÞ<㹚¶Zg¼_ö� � � � � �@Ýhé0%¾-²eËzˆŽŽ–ý5Ø(-.=8ïhavaÌ=mÐÞóÙ�sã­¬5þ}ÚÞÕ²w 9×¥}I;Þß“v:ÝÁÛ!ïj^÷Ù]¢ÇE§±d]ÌÞñÞž¸Ug}Úy]9œÒñ�˜.w°u²•~N¯9—v6]k£=úó t^Øyqïç­ÊÕ­’‚’è ‘ÎþNÒ ”ð|��9å'”O«Ú>qâªo"íâßÿþ7²<tsñâÅV­Z©üˆI‘]2uêÔ#GŽ|ñÅÐïжm[”‘k€€òÓO?!cܸqEEEsçÎEmÄb´k× MÝ»w‡[Ø>|xëÖ­;wîÄÔèiÑ¢ÅwÜ1bÄøófdd,Z´j—ñ1dñâÅ0Ãaìççwùòå `%ˆÅP†�ñ«Ú½{÷¶mÛ°þôôttbUwÞygïÞ½QUDZû¬M›6µQ(¤8¿øÏÿn-È*ÌHÈ<ôÃ1ÈbÒ+‡“ã·%>¼mšAæ(³ÚùáÞ�ÿÙZñ÷tÜð%¿ì±Õ»>Þ7å·ñzçëǹ?~ÿ«0ËLÌBcÓ+Û·þß®ÿ¼×#ÌÍÐ_†žmWަüÆŒëþµIÞú¶÷Q‰ Øþk¯½& :tè 9¤J�uëÖÁ>,, ÄÿýßÿAbصk—±"&Å—?DûpþüyÛÛÛ˲�ùùùo¼ñ¢KP¯táÂ…� ÄbŽ;KQBvüøñÊEBˆÁ2PMãÏ?ÿts3`Á@,¿áêé§ŸV£(©Ø>Š’ŠþI“&:thýúõXO@@ÀòåË¡éLž<C”!�ü¿ÿ÷ÿ”=˜R þаf™ä�æÿûŸÒ m(?üðÖÿâÖeqIh@“zä‘GTCä-D¥»îºKÈ=À‚~èD¸>þøãáÇK3@ñ‘1,XÛÚµkåSe¬~øaeÏÉ“'Q7dP‹DÙÏ6 � � � � � 41Í%ÆøµÕR¡�µµÎÁ -íÿú0ôˆÀžc¾9êÃÛºúdTTë8¿9A( Z½vÂü;ï_;)tXk �Pr]±²ÊIÊýyÊobåC_0}ã”>ÏB!àvÞˆ…%…åòŠÆjø;CÆÎ5þ‡ÑmÆFà)|Žývzðs×—#|ÚªÏF•Ÿë0V†0ˆ‰ªô;//’† :õ5D¤ÆªU«ŒŽÄ¤øà âA  <ÿüó²*‡˜f¢(`Œ[Lñæ›ovêÔ ñʵa.TcEÔÃ’%Kî¹ç<‚ÞñòË/#®m¹i�ï¾û‹”±0D—àvðàÁR©qqq�|€N„Am�š€8”˜˜9JÙ˜0aVެxîÒ¥ a ¸•62=sæÌ�âðøã�£�($ƒ ïFZvîÜyöìÙ¸}ÿý÷U»“6Xð}÷Ý'�3f üЬA ·(e",±k#Ø#µGYoUzC�*BjˆAxYáA?hCZÂo¥1Û$@$@$@$@$@$ÐÄ4ÇHù ñ…‰ÿ�ÃMÅзoß/�yû[ƒ;Þ_ñ-�ì$­h¬5e¥e;?܇5@­øËîû�œÐÿýè%®8µìôá�õzª«K CÁÎc‹OŠ@’‰ ï lÈ}ð‰ñBîÌÚg7æ§åÇo¹ :ý;ûâO!²ÿõT`�€ð!˜=µ}�;wq ˜ ÐS† ‚hH iii•åwàÛ{þüùòé!¬¸»»c1'N„Nedß¾}Xžðƒ�„¢  ¥@ @È»X˜¨HŠô‘ð¢\v‡È oooÙ‰D�‚ä!ôȧˆLAž nŸzê)(#XâM@L ¯‹D?ôhIr³Ò�ýû÷‹C.�¤‚$…„„ üz æq.¨êŠ£pñY-ÿüç?Ñ€ 8¨¢`ðÿÎ;ïà)´'0§ó"Åjİetâ¿ð"     �&I ùF‚È×) …àøDÈÎê7Zõ ì0µíu?+÷7”,-Î/I:d8¤ûÌÎBAšE¯'»¡Õ##Þ�ö‚<—Ä]—ð¯oŸÖ®—؈¹'ÊÁËý÷%ÌWI‘¡à«átC0D¥B-ð…ܳgO•ptt¬Ô΂âÃ_Ô¡¡¡0G¼~#šàÀ�•�Fæ‹T@`£×ëQ;ÃØ˃@ û!X´nÝZÈÜ *e¤¤¤àÓ=;;[e@VÀw¾…“z±M´QìCv.]º=X°r ði™AH´�‚ƒ\˜Ž;â¯BÎ.Èd Joˆy1!0xЍŒá:…ìDXŠˆA‰Ù‰á¨Ùqÿý÷£~ʈi‡6ÆB-’�}ú÷ï�[x¡%¢6-T˜iÓ¦I3•dƒ~œÎ Õ ˆJ˜èp¡~ ‚bD…‘šýO@®„      h šu$H­¾ƒv“ÚW9ÅŒÅyE"¾CÄqÈ5xFx8ú: èD‚ ‹ 1*TéÇÖÑòʉ%±Â‰ny_¼ò$ËG[BYFñ± aø�F ê†"ù&2ÔB9vàÀ�ÊÛÊÚˆ°PV(-|�ˆñ=¯ìו_¢a#(´ñÜsÏ¡44 ˆ¨¾�§È+A!‘8#�ˆ·¸ÅÊ¡ )Ÿ ô`_ÈÍALŠè1ó:…²Î(d„] jÆX.™AˆXÁ:ARê5Â9úÑ€ £Œ¬Xäï`û}”ë³ÈUAíBÒ�ÈW�rvÔXÅ%-eãìÙ³X@�‡DIÿl� � � � � �@ý b…ÿi_é0aî&_mÖ¥¡n˜|ŠÎ„í¡�å]9bî Ö3ëÏ÷{®§R©Ìa-õ£H§ÈÔÀ9/ø GèNœ¾ç×°ª©Ñc2îCe†[ÄaÜ�ÔàPfy‡8Þ�”‘ ¸E b(™‚,hH-Aq h+£G�6öŒ|(щ( ã§Ð § ýD<‚"æ5¶W’€ "MDê�ʉ}¡€®WÿíŠäc?¶N6¢Skc:É%ÐPDk«Õé o§23÷`W$×Ôã%R0°äPˆâr1ˆ_€2¢L9�T"…´7n N‡q'z ­ s $§|òÉ'(�!¾Û‘É‚Bª!8Wú—_~‰äœ¨¬J–DUÚûûûã€è&�Ë�Ü „`à$`Ô%cq„ Ä¥ÑVýEÁ-N¥56CÂ:P©Α™ñr‰ÒL”íPyƒB^ðÉDJÕÃd‹Ò›lôÑG"wIö°A$@$@$@$@$@Í�@óAjéˆÜ›þÑ8ú8Š´—ôs82FÚç¥åå§Ž�ñŠôÀo­�6 ›ŽÅM9‘j¨ñqMï0|N—ˆë×ÞÇdõSäËHŸ&8ˆ•/  œD×®]E)P“–f:±Œ+VÀÁ �™/8ãvëÖ­èGlˆ±bÆ¡…�PTœ�‚#]•¸@s1ö€UAû€¾€ST�"ÒgP5CD(‡ÀeG”=Ê6¢Hp‹|+ ©ÂÞ½{•f²�j�WN„ÀQC¤�l ¢ ”8äÚ<ûì³² , 'È`ýð†x¤ðȧ¨ðŠ64 ¡�ˆS]N�:¥ Á\•eî¨U¤[6H€H€H€H€H€H i0ŒÐ´÷ŒÏþ¿üå/�>úè­}ÿWŽFc¥Õiád×'ûËJ®Ç­:+Ê|ØØW(S6† €ãKNe'åÈI“%§ÆŽSÑ]3“�PGmè&&¿´¥ªcâ¨׊3VEÝMùÈòFjjªˆyâ‰'g�ScÅ…Y ??üðCeÑ–Ïbl)ꀢ_Ê.h£ŒÅ{ï½glŒÔæ@¥ŒzòÉ'ŸÉ@žcÒ¾²N¡2à©rÞK—.‰J«Æ£Ö¡ÔeÄÉ»0ƒ¨al Ÿâ¬\ñHÜ!txÃ7r J{ˆj,ØŽX=<Å"•%i¡€ >‹…FË–-EÏ×_-IJãùˆ      hš—‚�FTÜDþBttt}½?ˆ]íˆÙ“^Ùð▒´ãVŸÅÁ·h¸‡ºy·õB¡�¦·Ã¿PFMþ-79mÈ‹&-EÇëFŽCCyÙ:b@ÒÏfìü`o^j>ŽÑ5„–\—Y*lexîUÉJoæÛø&º€JSÀ7¹HKÁw»¨bÞOUŸ¢¾©Ð^zé%D=`8Ê|<öØc•…<`ƒ3fÌ�³àí‹®²ÇÂFxx8,!£ Eˆ§OŸÆù/R1öƒ!Ä­ �ð‚I*KB‰ŒŒ¾`wJŸ(‰ŠQ‹]?~ ò@ÀÂ®ÑÆA¿"¨]»vÈBϬY³Ä /¨?‚#iУ¼KôàX¨B2C')) gè ®D¸Ua›H€H€H€H€H€š�æ’S«å?TÊøÕ#qÛaZÌÎ÷⠘ݟìÇ�Òfä{C­uÊ”Gߘ{Úùéø•ÃÉ´ùBiÖÿ½œüÔ§Ûj¥w¶EÕÕM¯lÇ�°Ÿòû„–½ ŸÇ5x!ÒDœ/ƒïsq8®Ò¹Ì‚AQO|Û+¡­:ýDõô¦²ÌÇ®]» (@›@5¥cÿÆ {ùå—…²€¤æ�åSM#"¢1ÈÄùðÃQ‹íÊJ¢JPL�($oÑøïÿ+²W”�¢�¿Oæ aG©€à²EXÔLEÿ¨Q£”q#(H'Øãƒ>³;î¸Ci¦j£@,Þò¡�„KùT�¢ìg›H€H€H€H€H€š �f ‚dD  ²OК}�æ šb.ÔF�±yjØð`å¼.-œ§oœØS!Xh¬F~0´ï³=”f8æ®/GtŸm"«Bïªhû´Î3Ú+íuzCê�ò±¢G™Ü¡´1ßFž 4Ø xAy¬…¢È@Aõ2¤$!BN”GØV6Š}âQe!*X0¤D@ˆáBA±Òï¿ÿßð&ý£¶(¤ØcU*QF,^̨Z�ˆ¿À#±ÄPàTš.]ºÀ ‘ B�øàTi…�Üšj4yB ÊWƒÍ"ÙG¥P }æóÏ?Wõàìaä%É �ÃwEt‰œQÌ>wî\ãb®ð�1ã·©tÈ6 � � � � � 4všyóæaø^jì;iŒë/È(ÈMÉ+).µ±Ó¹¶r‘ÕOU{)Î/ɺ˜…ãfPOÄ=ØÍº’ceT£šö-7j�=â»]¡RÙ~¾Ñ¯_?„H¼ð ªSl*b¦U$1)B(Q‹óbz÷î�ò(iiiŒrrrpôL58¡¼  )8›ÆäÔXIAA�ÈÁqss3�~�ƒµA9‚7(2RvQ툷$@$@$@$@$@$Ðd4—t˜[{a…ÙE±+N—•ÕÕ¸Ñä‰ÐÛZç§Üheâ±ø1ñàÆ.��Ö=ÄíÆ¾æ~‡�v\7¥ÁP@逼˜›ÚßÔ@ŽkÞµK1µ%+4ïG>EЇ%S#t%,L],F:Q6àP”Qv²M$@$@$@$@$@M›Esï7ýlú²™kÌY\{6iñØ[A®�æ¿5OõAQóG´ˆ“qQ)£.¿ù«÷Qó8è‘H€H€H€H€H€H­‚öžö^‘Þflð§ÒÚ¹Ù™·áÓ:&°sçNT0“"Ýãù矯› !!Ó¤n¦ã,$@$@$@$@$@$@– bŽ•s€ÓŒ­¬–bQƒ}†B¡(‹š ¾¾¾¨ ¢*,Z{Ëîܹ3Š�´lÙRY€¶ö¦£g      Ë P±œ-�àò«îWܶüªûy9# � � � � � �ÀM 4‹#roJ�$@$@$@$@$@$@$@MžE�&ÿйA       Š ü;       h(‚4‹×Ü 6yæÌ™C‡åää4œUa1Œ‹‹k8KâJH€H€H€H€H€H€jœ £Z„´ ³0?£ÀÚZ#¬­uG_G‹F6$#l¡$¿ØÖEoc_oïBðaÃ@eÅŠQQQ ObbâØ±c±˜•+WFFF6�Uq$@$@$@$@$@$@5K Þ>†kvµííò�¤ãKbå,ŽÞöýžëeU!‰Èî†Þ8ôýÑÔÓé!C‚"F…ÖËZËÊÊ^{í5L}÷Ýw7ë Ç’-Zôæ›o~þùç<ݶ^þ<8) � � � � � Ô6¦ÃXDØÉÏÑ'Æ«eÏk��˜ÞUoѰº5º¸çÒª9ëw²ßªÌôĶζx Ó×›ò»aìaúô馗XO½�fÆŒ˜|ýúõ§N�ª§UpZ      �Ú%@Ä"¾ž�lßvbTÌDCGIa‰EÃêÖ¨¬Ô0_qAqÝN[…Ù~üñGX·oß‘UV'¦aaa:tÀTb‘u2''!     ¨SAª†»¬´’(‹ª¹©kMyÉz”U R+ÓZê455uñâŰž:uªV«µtX]Ù!fòäɘí—_~ÉÌ̬«i9 � � � � � �@ݨ·ÌˆºÛb�Ï”y!ëüæ WO¥Ú8ê4ZëÖýZtñSÉHÈJ�Msôupkå¿åBÒÑ䢜b—N‘£ÃŒë­¦�I�[s.÷J®�“�_Ÿ€.¾)'RQ\£E7äæª’$KÉMÉÃD—ö]ÆmÚÙŒøMÊÊë•”—úwñ³»1yÇÚÖö§×žËLÌļ¾í½Ãn±qPÿ%-\¸¿qEGG÷éÓ§š 7mÚ”••ekkÛ¿ÿjºª¥áC‡uvvÆ"Oœ8ѽ{÷Zš…nI€H€H€H€H€H€ê‹€úÓ·¾ÖÑdæ�[y&ní9±œÆ‚Æ¡ùÇÎmJèùxk›Š¸›ŒøÌ“ËÔ§±ÂøÊ±«}þÖÃÙÿú¹3�HŽ-®(Q‘—žyåÔòÓð‰Ò$¾í|l�lÐ>µâtÖÅëÇÍ–—_z½†«KK•rbI,~Ä ñzÍ¥}IþÝ[k{CtFaaáo¼E6³gÏ®¾‚H¸Šˆˆðôô”³7¨ly×®]AÔ«ábH€H€H€H€H€H FP©ŒNÎÿ™ {7»¶#õÎú„‰ñ[!^œX=¡âìUí55ƵöŽöº¸÷2ÄÜžÛp¾Ý”há.+1[( �<:=cë¤?±ô=ÄS͵³ib&¶ÉO/@TÈŽI—ö'Á¸Ã´¶"!É;ÎþNÂ^ù61#¼Nþ‡…9EI‡“ á*Š é!vvvBAø†âÉ­4º²wïÞ[Y‡ct:]LLÌùóçÿøã�Ç{¬æìÔ! NE$@$@$@$@$@M�E�{©E¹Åq«ÏÀ�_GŸŽÓbDþKôøH'_Ghv\l=°•ƒ—½r¾v“Û´èæ�×V.Å%‰».e%åô‹r�#ag"A°èû·Þ†�Ýí´åÍ�HfQ:ÁX×V†,"ˆ{°+²Áq'JeÛÚZÓ뉮Î- âH׿tÜòúNĘä$å*mÐ.-¿T�Õ¹çÎöìÙ³!‹ ¹¹ÕÙ)Ç’ � � � � � 4L,ŒZcï%õtZQ¾áÔ˜Àîþ¥%eŹŸ�0áîŽÎÒÒ²¼´Ä ;­'_9½w”!IbDQn8€&éP2�=ü…‚6j†£aòE[q:ŒFY€ÄÈÔ¿³¯P@ð)0†å¥ŸÏPUS…T�3\�‚à///#7UëÈÏÏß¿?Ƹ¸¸TmdZC90`&RHÎÌ©H€H€H€H€H€H€ê‚#AjŒrQŽA¼Àµç󃢡ú�OÅɰÎ�ÎÖÚë"”“Ÿ¡ˆµµ•8äEŽukí*Ûh¸Ýp«|da[L$�=BÜ�¢ÌÐ�� 3þ|iV͆^¯Ç´/^´±1Ô1i˜rvΜ1Äòð"     h’®„7ÉíÕ妤x�B¤Æ?Æ+A¬‡‰Îâ2D‘(û½nHÍÈK¿!œDiia»¬Ô„aAv¡‰ÞšëB�…££AåÙ¼ysI‰‰�×ÜTÕò”œlˆ¾a:Lµ r0 � � � � � 4TŒ¹•7£:HEé�p‹ñ‰³JómU5•õööÆÚPi¤Á®P.¬wïÞ ¹p‰\'$@$@$@$@$@$@U"ÀH�*áª0ΈÏ*Î/V�D2zP˜£¤¨"àLÔøH;�®œ('ù&‘ f¥Ÿ›¶±�uëÖ­*¿Ž=zS{óˆiÓ¦ lઠÀpr°É “¾úê«=zô€ �Š$šN,ÂØµk×ÂfQQQß~û­IoèŒ��ïСÌp=üðÃæƒP233·lÙ‚QÕ? §²õ°ŸH€H€H€H€H€H  0¤jð]Z8cä UÒ :=BÊ  —^>x¥uÿ–*¿"óeT�LÞêôZ�0÷Ë®ÄoK ÚZ„–@#ˆßzÁ¤=:… ƒãrÑ0s:LeÃUý999sæÌGäΜ9³mÛ¶*ƒªÞ ccc!LT6<11Qä¤ÀÀŒ\’šš EãòåË0‹4éYñTøøø˜´‘�'Ož–PLd'$@$@$@$@$@$@M†#Aªö*m ²Qiqé�o£Ði~FA^Z¾Pp†‹W¤žžX{nc‚(ùí#;)ç䲸íïíQ¿rÓ‰ƒúÂ~v}¼s᠙ؕgRN¦V6P§7¬ –gןG•Vq6MeÆ7íG>j£ 3Ù¸é(38eFh‹/6c&NÒ5c U_åQM�—¸bÅ tb�B¯Qð–H€H€H€H€H€H ±`$HÕÞ �›]«¾-â·$¦žNßôêv ¶ÖY|¡�­“áГv“Úlùß”{â·Xü(];zÛ+oʹ˳j ÏÝCÝZõi¿51ëbŽ˜ËÌ(<‚ƒcw1û©gð#Œ{Ìîârí@™*®šwfxZ³õ; n !eöìÙ¿üò bL\]¯­êÆ…Ôì¤7ú6w‡\˜_ý3fÌ`As¤øŒH€H€H€H€H€-F‚TùÕE�‹l36Ú‡‰$YÊTïªïÿ¯>-{¨œâ°˜ÐÛ‚­4Ýšò¡z'[•nµ:�µöš�•UôøÈ˜»#¥™'ßÎ3ÚË[UCg¯ëólOh4Ê~kÝuoâ\kÛ^º™ÅÈ Œš:×vРA(�š››‹ŠÊE*ÛNNNòö:YÙu­!Κwf–§|dþÌ@A.Œ³³óm·ÝvmþK$@$@$@$@$@$ФhæÍ›‡ M�:µIm«¾7SZ\–Ÿž�¬h%ÑÙU/â¦Ì�€ceme­µN?Ÿ±ã½½Êð“úÞkÕæ_¸pásÏ=­%Hñ»jƒkÍPŒZ$(Ë:iÒ¤Z›‡ŽI€H€H€H€H€H€ê“@õ>Îëså znÄ_8xYšÿbf'PRllpà‹µ�!|u+ÎnˆGÃÎM¯³×šØ`�;vûöí¨�š��Ý@Ö‰Åxzz¢êøñãÈ’¸       �'@¤Æ‘Ö¤ÃC?K?›4 ¥{ˆònN-‹Ëº”ƒ ÂnFTHMÎTW¾�ŸòÎ;ïÔÕl–΃svEUTKÐŽH€H€H€H€H€H  ÒÐ_Zi©!úC€ˆµ† kíßÙ·¡¯›ë#      �F€"H{!7.§ãýí2/df_Ê)È*,Î/FáU¿Ž>N¾Ž7ZñŽH€H€H€H€H€H€Hàæ(‚ÜœQ=Z ¨ªW”'~êq œšH€H€H€H€H€H€š�FYW¢i ç.H€H€H€H€H€H€H€ê’E�º¤Í¹H€H€H€H€H€H€H€ê�E�zCωI€H€H€H€H€H€H€ê’E�º¤Í¹H€H€H€H€H€H€H€ê�E�ÚB_RP’Ÿ™›œW[Ð/ � � � � � � �@Uðt˜ªÐªŠíÑE'V>¹Î=ÔíámÓ4ZMU†Ö³maaÙ‘}yÛ6díÞšSR\–žZÒgˆÓøiÑvõ¼2NO$@$@$@$@$@$@Õ @¤ðÌ-+-Ãs½‹­Y«÷0?¿lt�“'å+Wvpwîǯ_™ó¢ßÿö³fð� Û$@$@$@$@$@$@�‡¿hkë]¹¹ú´õjÑÅ¿¶&¨¿ÐnJŠ ®=}tÿy¯Å÷«C_þ(PLõö‹—_˜V;ÓÒ+ � � � � � � Ô:F‚ÔâÖZNÿsJmy¯5¿6¶Öý‡9¿ýM«ŽÝÄ$†9ãgLŸØ«WŠ—ÌO=Ñ�Á µ†ŸŽI€H€H€H€H€H€j‘EKáåùéÄáÇr’r]ƒ\œý�{„�qòsTºH9™z~S‚Ö¦"ÄFï¢�®±¾¡&HÞռ֚߱Ãqð¶�¹§�Ò¾8¿äðüc8ZZXR�YØz`Ë^Ovs vUN*ÚÇŽÛ²e‹­­mQQÑ´iÓììn¥„‡Ngõâ;-TÎ[‡éï¼Çí›RNÍÏÍ)ur6±rÕÞ’ � � � � � �@C#@Ä¢7’}9çË^ó ² …ufbÇ~9™•˜Õÿ_½•.ÎmŒ_÷ü&ك¨Qw…Ë[ÑȈÏÚôÊvU§¸…}ÌÄ6òQj\úw·-�ó¢ÿÐÇð3öÛQ£B¥™hìÝ»÷õ×_G:ȸqãnMQùTÝju�îAGeÀ[      h°(‚Xðjʬ6¿¶JyAԇ¬ÂÔÓi›^5!d„ i­³ÓÙ»Ûíýò`¶D“…Q=ÂÝïøx˜<2F§×]�KÛôò6,EiŸŸ^ �ÞOwGDIúÙôå³Öb%K\ñÈÎûÜZߢ×ëåf¬k4eÕR÷íÈ…óÐH½­ž"ˆÄÌ � � � � � �@c"@Ä¢·…<Øy†¹÷ûGO1 eŸ¦Åä§ßpŠ y„¹á�âübˆ ÂXõÛÖɦíĨë�eVËg¯·C^î/Å‘Ã?ÊË”ßÆö€�wÏÇ~Ñ{Rrv}¼oØÿY)‰²2Ãy4â*--½Ö¬�¿ÿ4ÄÀÑCOúÔ¨ºRk£       °�E AÌì=í‹óŠuö× i¬ìÜ+­»QRd© ±ýÝÝG~:ÿ#ß*Ä´K‹J÷}} Tñië�¨«r�C«×EÞ¶ï«C÷&á$©˜ÀÒÃÃ#22ÒÝÝ=;;ÛÆÆ=5ríÞšóŸ§ jΤ½:ÕˆO:!      �º'pí{¾îgnD3j¬P ëEdÇ[-?î<£}«¾�îÁnˆËPj·¶¡ÓkΉú �l×nr´tR\P‚¤Üæ§å¿ÓúÙ/égÒ s‹ôζ²ç¶òKÞÖH#öxþ¸¾±pÕ*ÄöÅwR#Té„H€H€H€H€H€H ^P±{Ÿgz$JƱ/°F~ÐÐêµ÷­¾Ç'ÆË"¦ŒP÷ôç)¿á‰O; Pæ¶à€¡°8ú:øÈMÍ3ø+½žÿbÊ}uûÎÞ=0^<}t¿n�ptâ¡0ÕEÊñ$@$@$@$@$@$@õH€"ˆEðQÅcÒâ±ÐA.캿å©e§1¬¤ dþèŸg}ÈÆáV0fÍ¿ëgø�˜2qÁ]Ö×NÕU-¨ûÌÎÝguVuÖÁíÕäâICâ®^)†òÛŽ¿[Ùc¬“S� � � � � � �€…øek!(ƒ™o{oüty¨ô òØñî.M:t%°§¡ji•.”óX>{ ê›bÔ½¿O@¸‡ñð²C ‡¡ˆe×ùóç:$ª� <åZ6΄UzZ b@âÏòqüÖ*øÖ]™ðÎ.      ¨Lp¸ê ‰¹v¼ *˜šqaëhZ>ØñÞN2êÃÛü;û{°±×… Fÿ¾/d˜ÒAŒRa6mÚôÄOÌœ9óÉ'ŸÌÊÊ2öiaO^néÔÛOÇËwt¶^s0*ª]¥Å_-tH3      h(‚Xðp„í¬µÛÞÞ�~.ê\z€*�[ŒD&‹[ˆ«ÒEav!~ Œä$¢<ò3 ŠòŠD'N––¨-"Š¡º‡º…�ÉMΓ?(ƒZáMcÕyz{´lòÍ ¯Mý˜:v噢¾HØq±ÂòÚ?z½þZÓʸŒˆ|d¾�£ugO9/Ľû~[Íá}yòçÈþ¼={×üZø”H€H€H€H€H€H€j’Óa,¢™—š‡Sl7¿ºÖÎþNY—²Å0H¸•.®Iùfà|y‹Æ•ÃÉï´þTôøuò¹oÕ=(wŠz¨¢'ítú»¡Ÿ)í!‹<¼mš(‰ ûþÏ÷‚\’ŸùÍ€ÜbHiQ‰r`Mµ òKÏÆVžÌý0?Jψ Ùq¾­›»VÙÉ6 � � � � � � 4 Œ±è5BЇ0• Hÿõ¾ó³á8ÆEº°Ö]oËNÙpôª(üaïQi‚‰K gi�F¯§º�ÿa´ò\ñ4z|¤G¸»ÒmQ  �îÖµ-lÇÁ±Ò¿ gW­Vkn�ª%ñ–H€H€H€H€H€H€ͼyó°š©S§6œ55Ø• F)[°¼âü· —ÊÎs©�õ#_&/Íp,®­³-Ä”ºœº6¶CŸ$@$@$@$@$@$@$P÷n=d î×Zï3Ú¹éñS/Ëpð¶ÇO½LÍII€H€H€H€H€H€H i¨4ñ¡il�»        A€"ÿH€H€H€H€H€H€H€šŠ Íâ5s“$@$@$@$@$@$@$@Aø7@$@$@$@$@$@$@$Ð,Pi¯™›$       ¿       �fA€"H³xÍÜ$ � � � � � � �Eþ � � � � � � � 4 AšÅkæ&I€H€H€H€H€H€H€tD@$P—Š‹‹—-[†ß………ýû÷ ”³ïܹóÌ™3�& �dl4�]4@°\ � � � � �@­ÐÌ›7L�:µV§©_çŸ~ú騱c}}}ëw döìË9[ÞØ©µÕ|¡��U°º~-ÙÙÙ}úôÉÊÊÂÄ3fÌxþùçÅ JKK‡ rþüyܯY³F«ÕÖõâ,ž¯iìÂâíÒ�H€H€H€H€H ‰hé0Ç�ýõ×ùå—ÜÜÜ&òÞª½�²Ò2üTÛ T™¤ ;;;1 “ˆí¸¸8¡€à¶á vMcU~y@$@$@$@$@$ÐÈ 4 ïÿ›}Ó¦M/½ô~£ÝÈßZµ–o­Õ`¼ÆZcmÓ\Þ~µxÕæàôôô£G�ŠÖ®]+žžž�K­k»¨Í÷Lß$@$@$@$@$@ …@óʆÀ·%þßû–-[ÆŒ]_/!#!+56Í9ÀQï¢?óǹì+9Ź%¾�¼C‡ç§d%f§œLuð´óíà“t(9~ë…ÂìB{w;÷÷V}Zhõ¥Åe [/œÛœàìç˜u9Ç+Â#xp�ƒ—½Üc¹Ÿ«Ö6Úœ¤t––œ[ÞÆÉ¶¬¬Ìª¤Ì=ÄÍ5ÈE£‘ŸyfýùÜä\['ÛœÂàA­:ûZô“Ú½RSSñŽlll"1räHeÉŒ[˜øâÅ‹ ,øã�?°Mˆ -[¶ìׯßÀ�”ÞĤ¶¶¶È ;räÈ_|mámÛ¶�>}ºj Û·oGÙ�ÜÜÜ\\\† vÇwøøø(ZÒöóó»|ùòÊ•+;uê„Íþøã�bÔÕ«W[´h!=àvóæÍø£=uê*qX[[÷íÛÀQQQÒ»[µjUBB*‰\¹råË/¿LIIAç”ò«VÓjšÆ.$I6H€H€H€H€H€š6�fQä‰'ž0~‹mÚ´©¯B!ñ[�ýrÒxI¨ÓÑï¹vn¹Â@Û»Ù9:]9’¢Õí±ŽžáèÉOÏßööîÂì"åS´;=Ðη½·è<¿)áø’X•�¼m= STÚãIDATeÔ]áòöìúó'—�–·¢áèÜ}f'�]í gÈ]5j”˜º@�=T˰üuF'OžlloìVL äž{îUr䨙3g>óÌ3â6''gΜ92dCÚT©„G^^TÈ.HÑÂùc÷îݧOŸÆ® u²Hûöí¡A¼€��-ìÚµKÎ%¯¾úê¤I“Ä-Ìzè¡ 6ȧ²Ñ³gÏo¿ý¢’ì©‘FÓØE�       �FD ù&DÔc¡­"%bdhÿô Ö4ˆÎØ?÷°Õ�•:„q^z>kkMĨPH!C‚ä>€wz@( Á[õžÓ­ý”Š —ƒßɽš',}b¼;N‹éòPûˆ‘!¢'fbT§éíà­ã}1�=¤Ã«±©B±ÖYþדÝ|¢=ñ4óBÖ)#eDŽª©†2lç¤Ü²[ˆ O?ý4†CÚxíµ×p Ëwß} =ˆ§P¹“bˆ¬Œ`”,uvv––È¢š5k–P@…Ë+V¼õÖ[0‘6–7JJJBBBŒ ©'Ožúâ;LzÃòfÏžýÃ? Üãƒ>«úç?ÿyöìY9£Œm�1l–/_çxºcÇŽÏ>ûLšÕl£iì¢f™Ð � � � � �@C&P»ÿW¿!ïk…BöìÙ3bĤ Ñ Ž5&¼uÿ–˜4lx‡S+ÎdÄg!;ÆÉ×Ñx%öv½žèjël‹Gˆï@ì†FkXpÆùÌœ+†‚¯¡·µa8²áèã°ýÝ=¥¥e‰;/…—«Žm¬gÀó½ô®z´;ÍhàÛ#Hƹ°ëRÈÐ U¬JÅȆ÷�øÛßþ†ø±:¼eÈbf¥PæÏŸß­[7aƒì˜´´4ÑFš Ê =a¨*B7�‚\˜?ÿüóô�N‡?¼E‹½ûî»8b ¢6¶mÛ¦\Üþ÷¿ÿmݺ5žŠþˆˆˆîÝ»:ê ¡(íÑþùçŸ;tè€ÆçŸþÀ �‚vmo=7J5¤:·McÕ!À±$@$@$@$@$@�ˆ€á+º™_¢PŽ;V—( C´èê/g ìÙºnQDv*ˆï ˆèD©{ƒ†•]^ãc[ö¾^Hµ•‹W¤!S&åÔUUhIi‰!ÔÄp:L±‰±¥E¥™‰†Ó[T"´ñ):¤5¥Å¥y©hÔÞ…“S"9 (èÿ·w¯1R•wÇwvgwöʲ°+° ÈEAÄJѦPê%4˜HZÅhEÀFÛ%链j¥M€˜6Öø‚ÄÒ`CûÂÒ‚ÒDI°b‹­¢bYºèÊe—½ÍÎìN³ÏæxöÌewfÎìΙó�lȹ>çy>gÞÌŸÿófÕÔ$ �òÑJR0åEÛÛÛí¥p HÐÌ+¢…B!Õ¼0OTam(ñì³Ïšˆ9®P‹BYDД�¢j JëPˆÖ…Y¶lYSSSbITE=LDQ R}ÔæPáÓë_¹-Z´ÈìªKJ]ѶÂ%šnc]ãîFqŒÂ]ZC@@�‚ðu&Èø¾•ú™u&Šaº¬* ÕVhÚË@_’ØDye™ò;’v8ÚÓ¯ã*³Z9!žµa}¦Ý6Eñ”Ø@‰’;FŸ§ )9&8Ò¸`Ø,�š)Õ¡ ᎾþHüqùûÌœ9Ó„r|„âŠ/´µµíÙ³G9[·n]¼x±Â+ʪH£¡jIŸ+ÃÓ§Oë”R?T5é5™ŒD"ª«ªR¦šº¢{5F³ÇkLƒ ‹h"�²E4[Çñk©]ë¸ªŠØ4Ó¦ EÙc+Ö-9nÇ(rDàv@@ðŠA�S—é0 7Ø¿%¥e¥ZŸEAûAk»nF]YùÐB0ÖA³¡Ž#öÝ΋]‘îhEíhëb†Ûû"½Ã:foMÛW>¾jrLÇ mWyš¢È‚ò >صk—顿’¨FF}}}b‡õM°ò>gžP†ˆ¦Ã(éÃep\–鮚}à�Q›+W®Ô펌•b½ï¾û´Æ�iY©"æéZVFGÂagVŽBö>èzE‚$`?èúvqŒÂuD@@�ðuD?8U$B«¨äX¾!M‡±?N¹áçoZëGÄÄ:® 3GÆÑšŽ§:•¥Á Ê‹–Uõª´,ù]• ÃòMì=)´mÕË8yò¤ÖˆÑz·Š_˜rZiEs^q„ÔyÍìHLÄ0ƒÒÛ1³¥´2®®I¼7ë±+äСCÊé°²6ìM)>b" *òºiÓ&SU�yúé§Mþˆýbm[¥CÌq­á⸠O»Å1Š<áÐ, € €Ž€ƒ ã¸D®yý�­]ñŸÓƒÅMuD³`ºÚâõMSýOõ¥i˜]áx«ZÓD{(äZk—nQ I0”Á[ÕU˜i/]_v+3Åzh¤;¢Œí&-Új]–ûFGG‡jy*Ê ¢*“1eÊ”\ÚTÙλ?O<ñÄ矮Œ9vì˜êk444dÔ²©$rêÔ)ÅJ±†ŒÚq\¬i;óæÍ3ݰŸÕîGÅW5Ö:/Û¶m³"/½½½IÍÕ•---ºK©¦ 9ßi æAÅ1 3þE@@�"Ì(âñ%š~WoÙ²EE"rü��¬í ŽõuE®µtZ7´·\3ËÜ*¨aÍFMcµ.SkW?k·®ï÷_x§U»ÁвØðʨ±Á¨:•´º‡~?›ÛçþvÞ~ŸèUUTÝe_ß×zœ‹.\Ðr°O>ùäSO=uöìY[Öë^·n�L“ñ‘êqb1+Ϊ.é‘#G—%NKq\�õ®ÉQÒÓõ±Qn‹j�X»ö�Ø£¦« Ù¨Šý²1Þ.ŽQŒ1�C@@�|ø+¢cëׯî¹ç.\˜ÍLÛ<ñ›w{.Ç‹€h�Ûw_~O*€:qVfA�ÚiµºK÷ž|éôµ ñ¨J´'zê•÷MHeæ7®·ÿ~Ž?¢&ž¢ˆÆ¿ží¹Ò«pI´;:Ð?T�µ´¼T‹ïꂎó×þódzæxÛ™/ÏøPkšªê¦'¯Ïª³®|ì7Ì·Ù5«™ šëôÚk¯YK¨hSDOT‘4Óf5ãcòäx±XhkP¢Š¶Uptß¾}k×®5»™¶™þz½8“røðaÎЮ6{ì±T7ª?Ï<óLggük »vîÜ© 9466¦º%ßÇ‹cùV¢}@@� &JŒM‡òôe7Œcù�TƒR Ò£?{Û~öæõóíSZì§Rm—Wo\;WA Å5ÞÚyÜ~YÓÍ“oŠ/”kÿhá[U6ÕÂ1ÿñ…þÌ©y÷Ïžwïl³=}Eó'o|¦…`>}ó¿ú³ß»è»7J¿JI°Ÿ*´mÍ*R‚†Ji¨c ¬¨D¨)&ª]-›*¼’f.Rmm­šÙ¸q£ZPU}¬![«ÒZGÒo¤yŠãÔƒ>¨‡ªµÍ›7kšÅ“¸FŒãYZpwÉ’%ÖA�}ûöíÖTëxÚtœ*äQØ»Í6 € €½€/2ATþCÙÊ—¨©¾CU+g¬h¶Ÿ]ºiQóíSíG´,RQSá8nß�y÷Œ¥/* {›sï¹áöÇo-IYèæ¿öƒ[oúÎ\“?bÚ V~ †ÊîÞ¾üº[†å¨·wý䎆9î¬kï¼cÛþsÝ‘Ãâ¸2ý®æ€h%s�Ò4LDwïÞ­o‚ã^Q}§ì»Ë—/?zôèêÕ«íeذaƒ½Ûö³I·UACÇ“béÐ)%n˜±«¶ëþýûM=TM�QD�{ñÅM2ˆiÇþ¥«ècÑþàÁƒóçÏ·Ž¸¸Q£p„¦@@@ ð{÷îU/zè¡ÂïkÑôPuLßÿÝ“olX¶ui¤+>%Ú­j¨Ì4Ä +Ñ »šÞˆU6T–W¥û=ï¼7Ù¾¦Õôuö ôÇÔ±ªI•É.)ôc ¨Š‡*‰jíX8š››3ŠV¤Þ¥K—®\¹¢Ü•Q©‘¤áŒT÷fq\OQÅS”Û2}úôÄÇišŒY/fÇŽÊÑ‚2Š¡hyÝ9sæ¸2Þ,úœxKqŒ"q\A@@ äú;ÙCCÍ®«ÿ;qÑÔeHsû@4¦„‹TkÊÚo¬›Z3áú¡jÑp4P¨¨-�_PïÆº³�ERì�Ëq;XÔ_b#ªcréÃË�kèZ׋%n’�Šb]`6d¹na£–¤qweWy¦�‡+­Y�¨ÍÄfOœ8qîܹ³W&Nœ¨«#^f=K ߌ²²©)ѪX�ývmë;üú믫bˆãxâ®ÂFŠ›ŒØ½qEbo9‚ € €d$�ä'nF÷ýŧ_=3Š1Æ‚Áh_¼RfúÏœ5³¬ H®y韔ϳ_ü³íƒ?Ä—nMÿQDŽôט³ÕÛ–†&8k—ŒæÆÂ¹FQ†^x!Õʵö~j†ËªU«�±Ì÷¶²B4#̾pLÒ'j  ´¶Æ×Jÿ—Q¤ïg@@@�‚Œ@T;µf(Y#õ…½WÃ*™OI›õ ÷W7V©™þH|)–p{8u“}FëÑÔ5×”Wæ°¤îi¤;먨!ÅCzåU#4•ú!tF•wµ,ˈëÎÌš5+�6Yšø“´qM¥¹óÎ;53(ýìEIihh(ÌQ$@@@�Ñ PdôV®]ÙÑríò'Wk«š+>êÚhÈg ÀiéÜóçϯX±bÁ‚}qŒÂ£øt@@Ÿ� 2/zÂŒ:ý�Ãyd‘ ¨„Çš5k¼>¸â…×ßýG@@ ¸†-ªZÜCet € € € àg‚ ~~ûŒ@@@ M‡ioo÷Ñ * € € €øO€Lÿ½sFŒ € € €€/†2Aêëë}9|� € € €~ Ä/ošq"€ € € às‚ >ÿ0|@@@ü"@Ä/ošq"€ € € às‚ >ÿ0|@@@ü"@Ä/ošq"€ € € às� ‚ܶr�þ|þn> € € €¸(P AGHS € € € €€‚ð5@@@@_ñÅkf� € € € @„ï € € €øB€ ˆ/^3ƒD@@@ׂ y?20€' € € € P îA^:þéþžûºû¢:Nº… € € €>p!ò÷³Ñß¾–ã›g¢?ÞÛÝÓó¹)ÃG@@@�p!rÇÜà÷îª0c{ç“è_énï&R€ïš.!€ € € àk‚ �@É�î¯Üúí��üWKÿ–—»Ú:ˆƒøú‹Åà@@@(4‚ fH�~3´}]ei ¾÷é›_êj¹L¡ÔB{Ýô@@@ÿ ¸á†;*žßP,‹k¶^�ÇA>ºØï_ZFŽ € € €…$àfDãºwIùÏ7V‡ÊãC¼ÜÛúr÷{Ÿ)¤N_@@@ð«€ËA¿22n@@@(t� »'ø‹ïWUUÉïk£u@@@ÈTÀ…šËç_ÒƒW- þòáj" ™¾®G@@@�1p!D½Üü­Ð M¥kn)/u!¨2£æ € € € à;w‚ b»gq¹ïð0 € € €xG€Ì ï¼+zŠ € € €9É�[@@@@À;A¼ó®è) € € €ä àZM�ú�äÖwß>œä(‡@@@@�lÈÉVŽû@@@@ÀSA<õºè, € € €d+@$[9îC@@@O ñÔ뢳 € € € �­A�lå¸@@@<%@ÄS¯‹Î"€ € € €@¶A²•ã>@@@ð”AO½.:‹ € € €Ù ÉVŽû@@@@ÀSA<õºè, € € €d+@$[9îC@@@O ñÔ뢳 € € € �­A�lå¸@@@<%@ÄS¯‹Î"€ € € €@¶A²•ã>@@@ð”AO½.:‹ € € €Ù ÉVŽû@@@@ÀSÿØÄó·âÜ%IEND®B`‚immutable-js-immutable-js-6a01d72/website/public/favicon.png000066400000000000000000000030351522056416100240760ustar00rootroot00000000000000‰PNG  IHDR szzôtEXtSoftwareAdobe ImageReadyqÉe<(iTXtXML:com.adobe.xmp ’{DK‹IDATxÚìWMhA~óv£¢ �"zhA´ˆxAÐ&¦=$ˆàMñªµ-b¥bhð’ƒmµˆEDimmutable-js-immutable-js-6a01d72/website/public/store-logo-firefox.svg000066400000000000000000000406071522056416100262240ustar00rootroot00000000000000 Firefox_Logo,_2017_2 immutable-js-immutable-js-6a01d72/website/src/000077500000000000000000000000001522056416100212535ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/ArrowDown.tsx000066400000000000000000000016561522056416100237450ustar00rootroot00000000000000import type { JSX } from 'react'; export function ArrowDown({ isActive }: { isActive: boolean }): JSX.Element { return ( ); } immutable-js-immutable-js-6a01d72/website/src/BurgerNav.tsx000066400000000000000000000022231522056416100237050ustar00rootroot00000000000000'use client'; import React, { JSX } from 'react'; function BurgerNav(props: React.SVGProps): JSX.Element { return (
); } export default BurgerNav; immutable-js-immutable-js-6a01d72/website/src/DocHeader.tsx000066400000000000000000000010001522056416100236200ustar00rootroot00000000000000import BurgerNav from './BurgerNav'; import { HeaderLinks, HeaderLogoLink } from './Header'; export function DocHeader({ versions, currentVersion, }: { versions: Array; currentVersion?: string; }) { return (
); } immutable-js-immutable-js-6a01d72/website/src/DocSearch.tsx000066400000000000000000000005261522056416100236510ustar00rootroot00000000000000'use client'; import { DocSearch as AlgoliaDocSearch } from '@docsearch/react'; import '@docsearch/css'; export function DocSearch() { return ( ); } immutable-js-immutable-js-6a01d72/website/src/Header.tsx000066400000000000000000000114671522056416100232140ustar00rootroot00000000000000'use client'; import Link from 'next/link'; import { useEffect, useState } from 'react'; import { Logo } from './Logo'; import { SVGSet } from './SVGSet'; import { StarBtn } from './StarBtn'; import { isMobile } from './isMobile'; export function Header({ versions, currentVersion, }: { versions: Array; currentVersion?: string; }) { const [scroll, setScroll] = useState(0); useEffect(() => { let _pending = false; function handleScroll() { if (!_pending) { const headerHeight = Math.min( 800, Math.max(260, document.documentElement.clientHeight * 0.7) ); if (window.scrollY < headerHeight) { _pending = true; window.requestAnimationFrame(() => { _pending = false; setScroll(window.scrollY); }); } } } window.addEventListener('scroll', handleScroll); return () => { window.removeEventListener('scroll', handleScroll); }; }, []); const neg = scroll < 0; const s = neg ? 0 : scroll; const sp = isMobile() ? 35 : 70; return (
{[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0].map((_, i) => ( ))}
); } export function HeaderLogoLink() { return ( ); } export function HeaderLinks({ versions, currentVersion, }: { versions: Array; currentVersion?: string; }) { return (
Playground Browser extension Questions GitHub
); } function DocsDropdown({ versions, currentVersion, }: { versions: Array; currentVersion?: string; }) { return (
Docs{currentVersion && ` (${currentVersion})`}
    {versions.map((v) => (
  • {v}
  • ))}
); } function ty(s: number, p: number) { return (p < s ? p : s) * -0.55; } function o(s: number, p: number) { return Math.max(0, s > p ? 1 - (s - p) / 350 : 1); } function tz(s: number, p: number) { return Math.max(0, s > p ? 1 - (s - p) / 20000 : 1); } function t(y: number, z: number) { return { transform: 'translate3d(0, ' + y + 'px, 0) scale(' + z + ')' }; } immutable-js-immutable-js-6a01d72/website/src/ImmutableConsole.tsx000066400000000000000000000046511522056416100252630ustar00rootroot00000000000000'use client'; import { useEffect } from 'react'; type InstallSpace = { Immutable?: unknown; module?: unknown; exports?: unknown; }; let installingVersion: string | undefined; export function ImmutableConsole({ version }: { version: string }) { useEffect(() => { const installSpace = global as unknown as InstallSpace; if (installingVersion === version) { return; } installingVersion = version; installUMD(installSpace, getSourceURL(version)).then((Immutable) => { installSpace.Immutable = Immutable; console.log( '\n' + ' ▄▟████▙▄ _ __ __ __ __ _ _ _______ ____ _ _____ \n' + ' ▟██████████▙ | | | \\ / | \\ / | | | |__ __|/\\ | _ \\| | | ___|\n' + '██████████████ | | | \\/ | \\/ | | | | | | / \\ | |_) | | | |__ \n' + '██████████████ | | | |\\ /| | |\\ /| | | | | | | / /\\ \\ | _ <| | | __| \n' + ' ▜██████████▛ | | | | \\/ | | | \\/ | | |__| | | |/ ____ \\| |_) | |___| |___ \n' + ' ▀▜████▛▀ |_| |_| |_|_| |_|\\____/ |_/_/ \\_\\____/|_____|_____|\n' + '\n' + `Version: ${version}\n` + '> console.log(Immutable);' ); console.log(Immutable); }); }, [version]); return null; } function getSourceURL(version: string) { if (version === 'latest@main') { return `https://cdn.jsdelivr.net/gh/immutable-js/immutable-js@npm/dist/immutable.js`; } const semver = version[0] === 'v' ? version.slice(1) : version; return `https://cdn.jsdelivr.net/npm/immutable@${semver}/dist/immutable.js`; } function installUMD(installSpace: InstallSpace, src: string): Promise { return new Promise((resolve) => { const installedModule = (installSpace.module = { exports: (installSpace.exports = {}), }); const script = document.createElement('script'); const firstScript = document.getElementsByTagName('script')[0]; script.src = src; script.addEventListener( 'load', () => { installSpace.module = undefined; installSpace.exports = undefined; script.remove(); resolve(installedModule.exports); }, false ); firstScript?.parentNode?.insertBefore(script, firstScript); }); } immutable-js-immutable-js-6a01d72/website/src/Logo.tsx000066400000000000000000000110701522056416100227120ustar00rootroot00000000000000type Props = { opacity?: number; inline?: boolean; color: string; }; export function Logo({ opacity = 1, inline, color }: Props) { return !inline ? ( ) : ( ); } immutable-js-immutable-js-6a01d72/website/src/MarkdownContent.tsx000066400000000000000000000013471522056416100251350ustar00rootroot00000000000000'use client'; import { useRouter } from 'next/navigation'; import { MouseEvent, memo } from 'react'; type Props = { contents: string; className?: string; }; // eslint-disable-next-line prefer-arrow-callback export const MarkdownContent = memo(function MarkdownContent({ contents, className, }) { const router = useRouter(); const handleClick = (event: MouseEvent) => { const link = event.target as HTMLAnchorElement; if (link.tagName === 'A' && link.target !== '_blank') { event.preventDefault(); router.push(link.href); } }; return (
); }); immutable-js-immutable-js-6a01d72/website/src/SVGSet.tsx000066400000000000000000000004151522056416100231260ustar00rootroot00000000000000import type { CSSProperties, ReactNode } from 'react'; export function SVGSet({ style, children, }: { style?: CSSProperties; children: ReactNode; }) { return ( {children} ); } immutable-js-immutable-js-6a01d72/website/src/StarBtn.tsx000066400000000000000000000162611522056416100233760ustar00rootroot00000000000000import { useEffect, useState } from 'react'; // API endpoints // https://registry.npmjs.org/immutable/latest // https://api.github.com/repos/immutable-js/immutable-js export function StarBtn() { const [stars, setStars] = useState(null); useEffect(() => { loadJSON( 'https://api.github.com/repos/immutable-js/immutable-js', (value) => { if ( typeof value === 'object' && value !== null && 'stargazers_count' in value && typeof value.stargazers_count === 'number' ) { setStars(value.stargazers_count); } } ); }, []); return ( Star {stars && } {stars && ( {stars} )} ); } function loadJSON(url: string, then: (value: unknown) => void) { const oReq = new XMLHttpRequest(); oReq.onload = (event) => { if ( !event.target || !('responseText' in event.target) || typeof event.target.responseText !== 'string' ) { return null; } let json; try { json = JSON.parse(event.target.responseText); // eslint-disable-next-line @typescript-eslint/no-unused-vars -- TODO enable eslint here } catch (e) { // ignore error } then(json); }; oReq.open('get', url, true); oReq.send(); } immutable-js-immutable-js-6a01d72/website/src/app/000077500000000000000000000000001522056416100220335ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/WorkerContext.tsx000066400000000000000000000052051522056416100254130ustar00rootroot00000000000000'use client'; import React, { JSX, createContext, useCallback, useEffect, useMemo, useRef, useState, } from 'react'; import { Element, JsonMLElementList } from '../worker/jsonml-types'; type Props = { children: React.ReactNode; }; type OnSuccessType = (result: JsonMLElementList | Element) => void; type WorkerContextType = { runCode: (code: string, onSuccess: OnSuccessType) => void; }; const WorkerContext = createContext(null); export function useWorkerContext() { const context = React.useContext(WorkerContext); if (!context) { throw new Error('useWorkerContext must be used within a WorkerProvider'); } return context; } export function WorkerContextProvider({ children }: Props): JSX.Element { const workerRef = useRef(null); const [successMap, setSuccessMap] = useState>( new Map() ); useEffect(() => { // Create a worker from the external worker.js file workerRef.current = new Worker( new URL('../worker/index.ts', import.meta.url), { type: 'module' } ); workerRef.current.onmessage = (event: { data: { key: string; output: JsonMLElementList | Element; error?: string; }; }) => { const onSuccess = successMap.get(event.data.key); if (!onSuccess) { console.warn( `No success handler found for key: ${event.data.key}. This is an issue with the single REPL worker.` ); return; } if (event.data.error) { onSuccess(['div', 'Error: ' + event.data.error]); } else { const { output } = event.data; if (typeof output === 'object' && !Array.isArray(output)) { onSuccess(['div', { object: output }]); } else { onSuccess(output); } } }; return () => { workerRef.current?.terminate(); }; }, []); const runCode = useCallback( (code: string, onSuccess: OnSuccessType): void => { const key = Math.random().toString(36).substring(2, 15); setSuccessMap((successMap) => successMap.set(key, onSuccess)); // ignore import statements as we do unpack all immutable data in the worker // but it might be useful in the documentation const cleanedCode = code; // .replace(/^import.*/m, ''); // send message to worker if (workerRef.current) { workerRef.current.postMessage({ code: cleanedCode, key }); } }, [] ); const value = useMemo( () => ({ runCode, }), [runCode] ); return ( {children} ); } immutable-js-immutable-js-6a01d72/website/src/app/browser-extension/000077500000000000000000000000001522056416100255305ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/browser-extension/layout.tsx000066400000000000000000000010351522056416100276040ustar00rootroot00000000000000import { DocHeader } from '../../DocHeader'; import { ImmutableConsole } from '../../ImmutableConsole'; import { getVersions } from '../../static/getVersions'; export default function VersionLayout({ children, }: { children: React.ReactNode; }) { const versions = getVersions(); return (
{children}
); } immutable-js-immutable-js-6a01d72/website/src/app/browser-extension/page.tsx000066400000000000000000000010311522056416100271770ustar00rootroot00000000000000import { Metadata } from 'next'; import { DocSearch } from '../../DocSearch'; import { Sidebar } from '../../sidebar'; export async function generateMetadata(): Promise { return { title: `Devtools — Immutable.js`, }; } export default async function BrowserExtensionPage() { const { default: MdxContent } = await import(`@/docs/BrowserExtension.mdx`); return ( <>
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/000077500000000000000000000000001522056416100227635ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/000077500000000000000000000000001522056416100247405ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/Defs.tsx000066400000000000000000000234511522056416100263660ustar00rootroot00000000000000import Link from 'next/link'; import type { FocusEvent, JSX, MouseEvent, ReactNode } from 'react'; import { Fragment, useCallback, useState } from 'react'; import { CallParam, CallSignature, InterfaceDefinition, ObjectMember, Type, TypeKind, } from './TypeDefs'; export function InterfaceDef({ name, def, }: { name: string; def: InterfaceDefinition; }) { return ( type {name} {def.typeParams && ( <> {'<'} {interpose( ', ', def.typeParams.map((t, i) => ( {t} )) )} {'>'} )} {def.extends && ( <> extends {interpose( ', ', def.extends.map((e, i) => ) )} )} {def.implements && ( <> implements {interpose( ', ', def.implements.map((e, i) => ) )} )} ); } export function CallSigDef({ name, callSig, }: { name: string; callSig?: CallSignature; }) { const shouldWrap = callSigLength(name, callSig) > 80; return ( {name} {callSig?.typeParams && ( <> {'<'} {interpose( ', ', callSig.typeParams.map((t, i) => ( {t} )) )} {'>'} )} {'('} {callSig && functionParams(callSig.params, shouldWrap)} {')'} {callSig?.type && ( <> {': '} )} ); } function TypeDef({ type, prefix }: { type: Type; prefix?: number }) { switch (type.k) { case TypeKind.Never: return wrap('primitive', 'never'); case TypeKind.Any: return wrap('primitive', 'any'); case TypeKind.Unknown: return wrap('primitive', 'unknown'); case TypeKind.This: return wrap('primitive', 'this'); case TypeKind.Undefined: return wrap('primitive', 'undefined'); case TypeKind.Boolean: return wrap('primitive', 'boolean'); case TypeKind.Number: return wrap('primitive', 'number'); case TypeKind.String: return wrap('primitive', 'string'); case TypeKind.Union: return wrap( 'union', interpose( ' | ', type.types.map((t, i) => ) ) ); case TypeKind.Intersection: return wrap( 'intersection', interpose( ' & ', type.types.map((t, i) => ) ) ); case TypeKind.Tuple: return wrap( 'tuple', <> {'['} {interpose( ', ', type.types.map((t, i) => ) )} {']'} ); case TypeKind.Object: if (!type.members) { return wrap('primitive', 'object'); } return wrap( 'object', <> {'{'} {interpose( ', ', type.members.map((t, i) => ) )} {'}'} ); case TypeKind.Indexed: return wrap( 'indexed', <> ,{'['} {']'} ); case TypeKind.Operator: return wrap( 'operator', <> {wrap('primitive', type.operator)} ); case TypeKind.Array: return wrap( 'array', <> {'[]'} ); case TypeKind.Function: { const shouldWrap = (prefix || 0) + funcLength(type) > 78; return wrap( 'function', <> {type.typeParams && ( <> {'<'} {interpose( ', ', type.typeParams.map((t, i) => ( {t} )) )} {'>'} )} {'('} {functionParams(type.params, shouldWrap)} {') => '} ); } case TypeKind.Param: return wrap('typeParam', type.param); case TypeKind.Type: { return wrap( 'type', <> {type.url ? ( {type.name} ) : ( {type.name} )} {type.args && ( <> {'<'} {interpose( ', ', type.args.map((a, i) => ) )} {'>'} )} ); } } throw new Error('Type with unknown kind ' + JSON.stringify(type)); } function wrap(className: string, child: ReactNode) { return {child}; } function Hover({ className, children, }: { className?: string; children: ReactNode; }) { const [isOver, setIsOver] = useState(false); const mouseOver = useCallback( (event: MouseEvent | FocusEvent) => { event.stopPropagation(); setIsOver(true); }, [setIsOver] ); const mouseOut = useCallback(() => { setIsOver(false); }, [setIsOver]); return ( {children} ); } export function MemberDef({ member }: { member: ObjectMember }) { return ( {member.index ? ( <>[{functionParams(member.params, false)}] ) : ( {member.name} )} {member.type && ( <> : )} ); } function functionParams( params: Array | undefined, shouldWrap: boolean ) { const elements = interpose( shouldWrap ? ( <> {','}
) : ( ', ' ), (params ?? []).map((t, i) => ( {t.varArgs ? '...' : null} {t.name} {t.optional ? '?: ' : ': '} )) ); return shouldWrap ? (
{elements}
) : ( elements ); } function callSigLength(name: string, sig?: CallSignature): number { return name.length + (sig ? funcLength(sig) : 2); } function funcLength(sig: CallSignature): number { return ( (sig.typeParams ? 2 + sig.typeParams.join(', ').length : 0) + 2 + (sig.params ? paramLength(sig.params) : 0) + (sig.type ? 2 + typeLength(sig.type) : 0) ); } function paramLength(params: Array): number { return params.reduce( (s, p) => s + (p.varArgs ? 3 : 0) + p.name.length + (p.optional ? 3 : 2) + typeLength(p.type), (params.length - 1) * 2 ); } function memberLength(members: Array): number { return members.reduce( (s, m) => s + (m.index ? paramLength(m.params || []) + 2 : m.name!.length) + (m.type ? typeLength(m.type) + 2 : 0), (members.length - 1) * 2 ); } function typeLength(type: Type): number { if (!type) { throw new Error('Expected type'); } switch (type.k) { case TypeKind.Never: return 5; case TypeKind.Any: return 3; case TypeKind.Unknown: return 7; case TypeKind.This: return 4; case TypeKind.Undefined: return 9; case TypeKind.Boolean: return 7; case TypeKind.Number: return 6; case TypeKind.String: return 6; case TypeKind.Union: case TypeKind.Intersection: return ( type.types.reduce((s, t) => s + typeLength(t), 0) + (type.types.length - 1) * 3 ); case TypeKind.Tuple: return ( 2 + type.types.reduce((s, t) => s + typeLength(t), 0) + (type.types.length - 1) * 2 ); case TypeKind.Object: return type.members ? 2 + memberLength(type.members) : 6; case TypeKind.Indexed: return 2 + typeLength(type.type) + typeLength(type.index); case TypeKind.Operator: return 1 + type.operator.length + typeLength(type.type); case TypeKind.Array: return typeLength(type.type) + 2; case TypeKind.Function: return 2 + funcLength(type); case TypeKind.Param: return type.param.length; case TypeKind.Type: return ( type.name.length + (!type.args ? 0 : type.args.reduce((s, a) => s + typeLength(a), type.args.length * 2)) ); } throw new Error('Type with unknown kind ' + JSON.stringify(type)); } function interpose( between: ReactNode, array: Array ): Array { const result: Array = []; let i = 0; for (const value of array) { result.push(value, {between}); } result.pop(); return result; } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/DocOverview.tsx000066400000000000000000000026371522056416100277440ustar00rootroot00000000000000import Link from 'next/link'; import { MarkdownContent } from '../../../MarkdownContent'; import type { TypeDefs, TypeDoc } from './TypeDefs'; type OverviewData = { doc: TypeDoc | null; api: Array; }; type APIMember = { label: string; url: string; synopsis?: string; }; // Static use only export function getOverviewData(defs: TypeDefs): OverviewData { return { doc: defs.doc || null, api: Object.values(defs.types).map((def) => { const member: APIMember = { label: def.label, url: def.url }; const doc = def.doc || def.call?.doc; if (doc?.synopsis) { member.synopsis = doc?.synopsis; } return member; }), }; } export function DocOverview({ data }: { data: OverviewData }) { return (
{data.doc && (
{data.doc.description && ( )}
)}

API

{data.api.map((member) => (

{member.label}

{member.synopsis && ( )}
))}
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/MemberDoc.tsx000066400000000000000000000063711522056416100273440ustar00rootroot00000000000000import Link from 'next/link'; import { Fragment } from 'react'; import { MarkdownContent } from '../../../MarkdownContent'; import { CallSigDef, MemberDef } from './Defs'; import type { MemberDefinition } from './TypeDefs'; export function MemberDoc({ member }: { member: MemberDefinition }) { return (

{member.label}

{member.doc && ( )} {!member.signatures ? ( ) : ( {member.signatures.map((callSig, i) => ( {'\n'} ))} )} {member.inherited && (

Inherited from

{member.inherited.interface}#{member.inherited.label}
)} {member.overrides && (

Overrides

{member.overrides.interface}#{member.overrides.label}
)} {member.doc?.notes.map((note, i) => (

{note.name}

{note.name === 'alias' ? ( ) : ( )}
))} {member.doc?.description && (

{member.doc.description.slice(0, 5) === '

)}
); } // export type ParamTypeMap = { [param: string]: Type }; // function getParamTypeMap( // interfaceDef: InterfaceDefinition | undefined, // member: MemberDefinition // ): ParamTypeMap | undefined { // if (!member.inherited || !interfaceDef?.typeParamsMap) return; // const defining = member.inherited.split('#')[0] + '>'; // const paramTypeMap: ParamTypeMap = {}; // // Filter typeParamsMap down to only those relevant to the defining interface. // for (const [path, type] of Object.entries(interfaceDef.typeParamsMap)) { // if (path.startsWith(defining)) { // paramTypeMap[path.slice(defining.length)] = type; // } // } // return paramTypeMap; // } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/SidebarV4.tsx000066400000000000000000000112631522056416100272660ustar00rootroot00000000000000'use client'; import Link from 'next/link'; import { Fragment, useEffect, useState } from 'react'; import { ArrowDown } from '../../../ArrowDown'; import { SidebarLinks } from '../../../sidebar'; import { SIDEBAR_LINKS } from '../currentVersion'; import type { TypeDefinition } from './TypeDefs'; import { collectMemberGroups } from './collectMemberGroups'; function Links({ links, focus, showInGroups, showInherited, }: { links: SidebarLinks; focus?: TypeDefinition; showInGroups?: boolean; showInherited?: boolean; }) { const [isForcedClosed, setIsForcedClosed] = useState(false); useEffect(() => { setIsForcedClosed(false); }, [focus?.label]); return (

Immutable.js

{links.map((link) => { const isCurrent = focus?.label === link.label; const isActive = isCurrent && !isForcedClosed; return (
{ if (isCurrent) { e.preventDefault(); setIsForcedClosed(!isForcedClosed); } }} > {link.label} {isActive && (focus?.interface || focus?.functions) && ( <> {' '} )}
{isActive && ( )}
); })}
); } function Focus({ focus, showInGroups, showInherited, }: { focus?: TypeDefinition; showInGroups?: boolean; showInherited?: boolean; }) { if (!focus || (!focus.interface && !focus.functions)) { return null; } return (
{focus.call && (

Construction

{focus.call.label}
)} {focus.functions && (

Static Methods

{Object.values(focus.functions).map((fn) => (
{fn.label}
))}
)}
{collectMemberGroups( focus.interface, showInGroups, showInherited ).flatMap(([title, groupMembers]) => groupMembers.length === 0 ? null : [

{title || 'Members'}

, groupMembers.map((member) => (
{member.label}
)), ] )}
); } export function SideBarV4({ links = SIDEBAR_LINKS, focus, toggleShowInherited, toggleShowInGroups, showInherited, showInGroups, }: { links?: SidebarLinks; focus?: TypeDefinition; toggleShowInherited?: () => void; toggleShowInGroups?: () => void; showInherited?: boolean; showInGroups?: boolean; }) { return (
{toggleShowInherited && toggleShowInGroups && (
Grouped {' • '} Alphabetized
Inherited {' • '} Defined
)}
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/TypeDefs.ts000066400000000000000000000063611522056416100270410ustar00rootroot00000000000000export type TypeDefs = { version: string; doc?: TypeDoc; types: { [name: string]: TypeDefinition }; }; export type TypeDefinition = { qualifiedName: string; label: string; // Like a name, but with () for callables. url: string; doc?: TypeDoc; call?: MemberDefinition; functions?: { [name: string]: MemberDefinition }; interface?: InterfaceDefinition; }; export type MemberDefinition = { line: number; name: string; label: string; // Like a name, but with () for callables. url: string; id: string; // Local reference on a page group?: string; doc?: TypeDoc; isStatic?: boolean; inherited?: { interface: string; label: string; url: string }; overrides?: { interface: string; label: string; url: string }; signatures?: Array; type?: Type; }; export type CallSignature = { line?: number; typeParams?: Array; params?: Array; type?: Type; }; export type CallParam = { name: string; type: Type; varArgs?: boolean; optional?: boolean; }; export type InterfaceDefinition = { doc?: TypeDoc; line?: number; typeParams?: Array; extends?: Array; implements?: Array; members: { [name: string]: MemberDefinition }; }; export type MemberGroup = { title?: string; members: { [name: string]: MemberDefinition }; }; export type TypeDoc = { synopsis: string; notes: Array; description: string; }; type TypeDocNote = { name: string; body: string }; export enum TypeKind { Never, Any, Unknown, This, Undefined, Boolean, Number, String, Object, Array, Function, Param, Type, Union, Intersection, Tuple, Indexed, Operator, } export type Type = | NeverType | AnyType | UnknownType | ThisType | UndefinedType | BooleanType | NumberType | StringType | UnionType | IntersectionType | TupleType | ObjectType | ArrayType | FunctionType | ParamType | NamedType | IndexedType | OperatorType; type NeverType = { k: TypeKind.Never }; type AnyType = { k: TypeKind.Any }; type UnknownType = { k: TypeKind.Unknown }; type ThisType = { k: TypeKind.This }; type UndefinedType = { k: TypeKind.Undefined }; type BooleanType = { k: TypeKind.Boolean }; type NumberType = { k: TypeKind.Number }; type StringType = { k: TypeKind.String }; type ObjectType = { k: TypeKind.Object; members?: Array; }; export type ObjectMember = { index?: boolean; name?: string; params?: Array; type?: Type; }; type ArrayType = { k: TypeKind.Array; type: Type }; export type FunctionType = { k: TypeKind.Function; // Note: does not yet show constraints or defaults typeParams?: Array; params: Array; type: Type; }; export type ParamType = { k: TypeKind.Param; param: string }; export type NamedType = { k: TypeKind.Type; name: string; // May be dotted path or other expression args?: Array; url?: string; }; type UnionType = { k: TypeKind.Union; types: Array }; type IntersectionType = { k: TypeKind.Intersection; types: Array }; type TupleType = { k: TypeKind.Tuple; types: Array }; type IndexedType = { k: TypeKind.Indexed; type: Type; index: Type }; type OperatorType = { k: TypeKind.Operator; operator: string; type: Type }; immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/[type]/000077500000000000000000000000001522056416100262115ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/[type]/TypeDocumentation.tsx000066400000000000000000000121051522056416100324230ustar00rootroot00000000000000'use client'; import { Fragment, useReducer } from 'react'; import { DocSearch } from '../../../../DocSearch'; import { MarkdownContent } from '../../../../MarkdownContent'; import { SidebarLinks } from '../../../../sidebar'; import { CallSigDef, InterfaceDef } from '../Defs'; import { MemberDoc } from '../MemberDoc'; import { SideBarV4 } from '../SidebarV4'; import type { MemberDefinition, TypeDefinition } from '../TypeDefs'; import { collectMemberGroups } from '../collectMemberGroups'; const typeDefURL = 'https://github.com/immutable-js/immutable-js/blob/main/type-definitions/immutable.d.ts'; const issuesURL = 'https://github.com/immutable-js/immutable-js/issues'; function Disclaimer() { return (
This documentation is generated from{' '} immutable.d.ts . Pull requests and{' '} Issues {' '} welcome.
); } function toggle(value: boolean) { return !value; } export function TypeDocumentation({ def, sidebarLinks, }: { def: TypeDefinition; sidebarLinks: SidebarLinks; }) { const [showInherited, toggleShowInherited] = useReducer(toggle, true); const [showInGroups, toggleShowInGroups] = useReducer(toggle, true); return ( <>
{!def.interface && !def.functions && def.call ? ( ) : ( )}
); } function FunctionDoc({ def }: { def: MemberDefinition }) { return (

{def.label}

{def.doc && ( )} {def.signatures!.map((callSig, i) => ( {'\n'} ))} {def.doc?.notes.map((note, i) => (

{note.name}

{note.name === 'alias' ? : note.body}
))} {def.doc?.description && (

{def.doc.description.slice(0, 5) === '

)}
); } function TypeDoc({ def, showInGroups, showInherited, }: { def: TypeDefinition; showInGroups: boolean; showInherited: boolean; }) { const memberGroups = collectMemberGroups( def?.interface, showInGroups, showInherited ); return (

{def.qualifiedName}

{def.doc && ( )} {def.interface && ( )} {def.doc?.notes.map((note, i) => (

{note.name}

{note.name === 'alias' ? : note.body}
))} {def.doc?.description && (

{def.doc.description.slice(0, 5) === '

)} {def.call && (

Construction

)} {def.functions && (

Static methods

{Object.values(def.functions).map((t) => ( ))}
)}
{memberGroups.flatMap(([title, members]) => members.length === 0 ? null : [

{title || 'Members'}

, members.map((member) => ( )), ] )}
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/[type]/page.tsx000066400000000000000000000031231522056416100276640ustar00rootroot00000000000000import { getVersionFromGitTag } from '../../../../static/getVersions'; import { VERSION } from '../../currentVersion'; import { getSidebarLinks } from '../getSidebarLinks'; import { getTypeDefs } from '../getTypeDefs'; import { getVersionFromParams } from '../getVersionFromParams'; import { TypeDocumentation } from './TypeDocumentation'; export async function generateStaticParams() { return getVersionFromGitTag() .map((version) => Object.values(getTypeDefs(version).types).map((def) => ({ version, type: def.label, })) ) .flat(); } type Params = { version: string; type: string; }; type Props = { params: Promise; }; export async function generateMetadata(props: Props) { const params = await props.params; const version = getVersionFromParams(params); const defs = getTypeDefs(version); const def = Object.values(defs.types).find((d) => d.label === params.type); if (!def) { throw new Error('404'); } return { title: `${def.qualifiedName} — Immutable.js`, robots: { index: false, follow: true, }, alternates: { canonical: `/docs/${VERSION}/${params.type}/`, }, }; } export default async function TypeDocPage(props: Props) { const params = await props.params; const version = getVersionFromParams(params); const defs = getTypeDefs(version); const def = Object.values(defs.types).find((d) => d.label === params.type); if (!def) { throw new Error('404'); } const sidebarLinks = getSidebarLinks(defs); return ; } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/collectMemberGroups.ts000066400000000000000000000014161522056416100312670ustar00rootroot00000000000000import type { InterfaceDefinition, MemberDefinition } from './TypeDefs'; export function collectMemberGroups( interfaceDef: InterfaceDefinition | undefined, showInGroups?: boolean, showInherited?: boolean ): Array<[groupTitle: string, members: Array]> { const groups: { [groupTitle: string]: Array } = {}; const members = interfaceDef?.members ? Object.values(interfaceDef.members) : []; if (!showInGroups) { members.sort((a, b) => (a.id > b.id ? 1 : -1)); } for (const member of members) { const groupTitle = (showInGroups && member.group) || ''; if (showInherited || !member.inherited) { (groups[groupTitle] || (groups[groupTitle] = [])).push(member); } } return Object.entries(groups); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/getSidebarLinks.tsx000066400000000000000000000003561522056416100305560ustar00rootroot00000000000000import { SidebarLinks } from '../../../sidebar'; import type { TypeDefs } from './TypeDefs'; export function getSidebarLinks(defs: TypeDefs): SidebarLinks { return Object.values(defs.types).map(({ label, url }) => ({ label, url })); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/getTypeDefs.ts000066400000000000000000000633161522056416100275440ustar00rootroot00000000000000import { execSync } from 'child_process'; import { readFileSync } from 'fs'; import ts from 'typescript'; import { MarkdownContext, markdown } from '../../../static/markdown'; import { stripUndefineds } from '../../../static/stripUndefineds'; import { CallParam, CallSignature, InterfaceDefinition, MemberDefinition, NamedType, Type, TypeDefinition, TypeDefs, TypeDoc, TypeKind, } from './TypeDefs'; const generatedTypeDefs = new Map(); export function getTypeDefs(version: string) { let typeDefs = generatedTypeDefs.get(version); if (typeDefs === undefined) { typeDefs = genTypeDefData(version); addData(version, typeDefs); markdownDocs(typeDefs); stripUndefineds(typeDefs); generatedTypeDefs.set(version, typeDefs); } return typeDefs; } function addData(version: string, defs: TypeDefs) { // Add module labels and links const baseUrl = `/docs/${version}/`; for (const typeDef of Object.values(defs.types)) { const isFn = isFunction(typeDef); const label = typeDef.qualifiedName + (isFn ? '()' : ''); const url = baseUrl + typeDef.qualifiedName + (isFn ? '()' : ''); typeDef.label = label; typeDef.url = url; if (typeDef.call) { typeDef.call.url = isFn ? url : url + '#' + typeDef.call.id; } if (typeDef.functions) { for (const fn of Object.values(typeDef.functions)) { fn.url = url + '#' + fn.id; } } if (typeDef.interface) { for (const member of Object.values(typeDef.interface.members)) { member.url = url + '#' + member.id; } } } // Add links to named types for (const typeDef of Object.values(defs.types)) { typeDef.call?.signatures?.forEach(addSignatureLink); if (typeDef.functions) { for (const fn of Object.values(typeDef.functions)) { fn.signatures?.forEach(addSignatureLink); } } if (typeDef.interface) { typeDef.interface.extends?.forEach(addTypeLink); typeDef.interface.implements?.forEach(addTypeLink); for (const member of Object.values(typeDef.interface.members)) { addTypeLink(member.type); member.signatures?.forEach(addSignatureLink); } } } function addSignatureLink(sig: CallSignature) { sig.params?.forEach((p) => addTypeLink(p.type)); addTypeLink(sig.type); } function addTypeLink(type: Type | undefined) { if (type?.k === TypeKind.Type) { const def = defs.types[type.name]; if (def?.url) { type.url = def.url; } } } // Add heritage info const hasVisitedHeritage = new Set(); Object.values(defs.types).forEach(addInherited); function addInherited(def: TypeDefinition) { if (!def.interface) { return; } if (hasVisitedHeritage.has(def)) { return; } hasVisitedHeritage.add(def); const interfaceDef = def.interface; for (const extended of interfaceDef.extends || []) { const extendedDef = defs.types[extended.name]; if (extendedDef?.interface) { addInherited(extendedDef); for (const extendedMember of Object.values( extendedDef.interface.members )) { const inherited = extendedMember.inherited || { interface: extendedDef.qualifiedName, label: extendedMember.label, url: extendedMember.url, }; const member = interfaceDef.members[extendedMember.name]; if (!member) { const url = def.url + '#' + extendedMember.id; // Build inherited member const inheritedMember = updateInheritedTypeParams( { ...extendedMember, url, inherited, overrides: undefined }, extendedDef.interface.typeParams, extended.args ); setIn( interfaceDef, ['members', inheritedMember.name], inheritedMember ); } else if (!member.inherited) { if (!member.overrides) { member.overrides = inherited; } if (!member.group && extendedMember.group) { member.group = extendedMember.group; } } } } } } } function isFunction(typeDef: TypeDefinition) { // eslint-disable-next-line eqeqeq return !typeDef.interface && !typeDef.functions && typeDef.call != null; } /** * An inherited member may reference the type parameters of the parent type. * This updates all type parameters to the correct types. * * eg: * * interface A { * member(arg: T) * } * * interface B extends A {} * * when building the member `B.member`, it will produce `member(arg: number)` */ function updateInheritedTypeParams( member: MemberDefinition, params: Array = [], args: Array = [] ): MemberDefinition { if (params.length !== args.length) { throw new Error( 'Unexpected difference between number of type params and type args' ); } // If there are no params to replace, no copy is necessary if (params.length === 0) return member; return { ...member, type: updateType(member.type), signatures: member.signatures?.map(updateSignature), }; function updateType(type: Type): Type; function updateType(type: Type | undefined): Type | undefined; function updateType(type: Type | undefined): Type | undefined { switch (type?.k) { case TypeKind.Param: { // A parameter reference is replaced with the implementing type argument const paramIndex = params.indexOf(type.param); return paramIndex >= 0 ? args[paramIndex] : type; } case TypeKind.Array: case TypeKind.Indexed: case TypeKind.Operator: return { ...type, type: updateType(type.type) }; case TypeKind.Union: case TypeKind.Intersection: case TypeKind.Tuple: return { ...type, types: type.types.map(updateType) }; case TypeKind.Type: return { ...type, args: type.args?.map(updateType) }; case TypeKind.Function: return updateSignature(type); case TypeKind.Object: return { ...type, members: type.members?.map(updateSignature) }; } return type; } function updateSignature(signature: S): S { return { ...signature, params: signature.params?.map((p) => ({ ...p, type: updateType(p.type), })), type: updateType(signature.type), }; } } function markdownDocs(defs: TypeDefs) { markdownDoc(defs.doc, { defs }); for (const typeDef of Object.values(defs.types)) { markdownDoc(typeDef.doc, { defs, typeDef }); if (typeDef.call) { markdownDoc(typeDef.call.doc, { defs, typeDef, signatures: typeDef.call.signatures, }); } if (typeDef.functions) { for (const fn of Object.values(typeDef.functions)) { markdownDoc(fn.doc, { defs, typeDef, signatures: fn.signatures, }); } } if (typeDef.interface) { markdownDoc(typeDef.interface.doc, { defs, typeDef }); for (const member of Object.values(typeDef.interface.members)) { markdownDoc(member.doc, { defs, typeDef, signatures: member.signatures, }); } } } } function markdownDoc(doc: TypeDoc | undefined, context: MarkdownContext) { if (!doc) { return; } if (doc.synopsis) { doc.synopsis = markdown(doc.synopsis, context); } if (doc.description) { doc.description = markdown(doc.description, context); } if (doc.notes) { for (const note of doc.notes) { if (note.name !== 'alias') { note.body = markdown(note.body, context); } } } } const typeDefPath = '../type-definitions/immutable.d.ts'; const typeDefPathOld = '../type-definitions/Immutable.d.ts'; function genTypeDefData(version: string): TypeDefs { const typeDefSource = getTypeDefSource(version); const sourceFile = ts.createSourceFile( typeDefPath, typeDefSource, ts.ScriptTarget.ES2015, /* parentReferences */ true ); const types = typesVisitor(sourceFile); const doc = types.Immutable.doc; delete types.Immutable; delete types.immutable; return { version, doc, types }; } function getTypeDefSource(version: string): string { if (version === 'latest@main') { return readFileSync(typeDefPath, { encoding: 'utf8' }); } // Previous versions used a different name for the type definitions file. // If the expected file isn't found for this version, try the older name. try { return execSync(`git show ${version}:${typeDefPath} 2>/dev/null`, { encoding: 'utf8', }); } catch { return execSync(`git show ${version}:${typeDefPathOld}`, { encoding: 'utf8', }); } } function typesVisitor(source: ts.SourceFile) { const types: { [qualifiedName: string]: TypeDefinition } = {}; const interfaces: Array = []; const typeParamsScope: Array | undefined> = []; const aliases: Array<{ [alias: string]: string }> = []; const qualifiers: Array = []; let currentGroup: string | undefined; visit(source); return types; function visit(node: ts.Node) { switch (node.kind) { case ts.SyntaxKind.ModuleDeclaration: visitModuleDeclaration(node as ts.ModuleDeclaration); return; case ts.SyntaxKind.FunctionDeclaration: visitFunctionDeclaration(node as ts.FunctionDeclaration); return; case ts.SyntaxKind.InterfaceDeclaration: visitInterfaceDeclaration(node as ts.InterfaceDeclaration); return; case ts.SyntaxKind.PropertySignature: visitPropertySignature(node as ts.PropertySignature); return; case ts.SyntaxKind.MethodSignature: visitMethodSignature(node as ts.MethodSignature); return; default: ts.forEachChild(node, visit); } } function isTypeParam(name: string) { return typeParamsScope.some((set) => set && set.indexOf(name) !== -1); } function isAliased(name: string) { return !!last(aliases)[name]; } function addAliases(comment: TypeDoc | undefined, name: string) { if (comment?.notes) { comment.notes .filter((note) => note.name === 'alias') .map((node) => node.body) .forEach((alias) => { last(aliases)[alias] = name; }); } } function visitModuleDeclaration(node: ts.ModuleDeclaration) { const comment = getDoc(node); if (shouldIgnore(comment)) { return; } const name = node.name.text; const qualifiedName = qualifiers.concat([name]).join('.'); setIn(types, [qualifiedName, 'qualifiedName'], qualifiedName); setIn(types, [qualifiedName, 'doc'], comment); if (name !== 'Immutable') { qualifiers.push(name); } aliases.push({}); ts.forEachChild(node, visit); if (name !== 'Immutable') { qualifiers.pop(); } aliases.pop(); } function visitFunctionDeclaration(node: ts.FunctionDeclaration) { const comment = getDoc(node); const name = node.name!.text; if (shouldIgnore(comment) || isAliased(name)) { return; } addAliases(comment, name); const callSignature = parseCallSignature(node); const parent = qualifiers.join('.'); const qualifiedName = qualifiers.concat([name]).join('.'); if (!parent || types[qualifiedName]) { // Top level function setIn(types, [qualifiedName, 'qualifiedName'], qualifiedName); setIn(types, [qualifiedName, 'call', 'name'], qualifiedName); setIn(types, [qualifiedName, 'call', 'label'], qualifiedName + '()'); setIn(types, [qualifiedName, 'call', 'id'], qualifiedName + '()'); setIn(types, [qualifiedName, 'call', 'doc'], comment); pushIn(types, [qualifiedName, 'call', 'signatures'], callSignature); } else { // Static method setIn(types, [parent, 'functions', name, 'name'], qualifiedName); setIn(types, [parent, 'functions', name, 'label'], qualifiedName + '()'); setIn(types, [parent, 'functions', name, 'id'], name + '()'); setIn(types, [parent, 'functions', name, 'isStatic'], true); const functions = types[parent].functions; pushIn(functions!, [name, 'signatures'], callSignature); } } function visitInterfaceDeclaration(node: ts.InterfaceDeclaration) { const interfaceObj: InterfaceDefinition = { members: {} }; const name = node.name.text; const comment = getDoc(node); const ignore = shouldIgnore(comment); if (!ignore) { const qualifiedName = qualifiers.concat([name]).join('.'); setIn(types, [qualifiedName, 'qualifiedName'], qualifiedName); interfaceObj.line = getLineNum(node); interfaceObj.doc = comment; interfaceObj.typeParams = node.typeParameters?.map((tp) => tp.name.text); typeParamsScope.push(interfaceObj.typeParams); if (node.heritageClauses) { for (const hc of node.heritageClauses) { const heritageTypes = hc.types.map(parseType) as Array; if (hc.token === ts.SyntaxKind.ExtendsKeyword) { interfaceObj.extends = heritageTypes; } else if (hc.token === ts.SyntaxKind.ImplementsKeyword) { interfaceObj.implements = heritageTypes; } else { throw new Error('Unknown heritageClause'); } } } setIn(types, [qualifiedName, 'interface'], interfaceObj); } interfaces.push(interfaceObj); qualifiers.push(name); aliases.push({}); currentGroup = undefined; ts.forEachChild(node, visit); if (!ignore) { typeParamsScope.pop(); } interfaces.pop(); qualifiers.pop(); aliases.pop(); } function ensureGroup(node: ts.Node) { for (const trivia of getTrivia(node)) { if (trivia.kind === ts.SyntaxKind.SingleLineCommentTrivia) { currentGroup = source.text.substring(trivia.pos + 3, trivia.end); } } } function visitPropertySignature(node: ts.PropertySignature) { if (node.questionToken) { throw new Error('NYI: questionToken'); } const comment = getDoc(node); const name = node.name.getText(); if (!shouldIgnore(comment) && !isAliased(name)) { addAliases(comment, name); ensureGroup(node); const interfaceData = last(interfaces); setIn(interfaceData, ['members', name, 'name'], name); setIn(interfaceData, ['members', name, 'label'], name); setIn(interfaceData, ['members', name, 'id'], name); setIn(interfaceData, ['members', name, 'line'], getLineNum(node)); setIn(interfaceData, ['members', name, 'group'], currentGroup); setIn(interfaceData, ['members', name, 'doc'], comment); setIn( interfaceData, ['members', name, 'type'], node.type && parseType(node.type) ); } ts.forEachChild(node, visit); } function visitMethodSignature(node: ts.MethodSignature) { if (node.questionToken) { throw new Error('NYI: questionToken'); } const interfaceData = last(interfaces); const comment = getDoc(node); const name = node.name.getText(); if (!shouldIgnore(comment) && !isAliased(name)) { addAliases(comment, name); ensureGroup(node); setIn(interfaceData, ['members', name, 'name'], name); setIn(interfaceData, ['members', name, 'label'], name + '()'); setIn(interfaceData, ['members', name, 'id'], name + '()'); setIn(interfaceData, ['members', name, 'group'], currentGroup); setIn(interfaceData, ['members', name, 'doc'], comment); const callSignature = parseCallSignature(node); pushIn(interfaceData, ['members', name, 'signatures'], callSignature); } ts.forEachChild(node, visit); } function parseCallSignature( node: ts.SignatureDeclarationBase ): CallSignature { const typeParams = node.typeParameters?.map((tp) => tp.name.text); typeParamsScope.push(typeParams); const callSignature: CallSignature = { line: getLineNum(node), typeParams, params: node.parameters.length > 0 ? node.parameters.map(parseParam) : undefined, type: node.type && parseType(node.type), }; typeParamsScope.pop(); return callSignature; } function parseType(node: ts.TypeNode): Type { switch (node.kind) { case ts.SyntaxKind.NeverKeyword: return { k: TypeKind.Never, }; case ts.SyntaxKind.AnyKeyword: return { k: TypeKind.Any, }; case ts.SyntaxKind.UnknownKeyword: return { k: TypeKind.Unknown, }; case ts.SyntaxKind.ThisType: return { k: TypeKind.This, }; case ts.SyntaxKind.UndefinedKeyword: return { k: TypeKind.Undefined, }; case ts.SyntaxKind.BooleanKeyword: return { k: TypeKind.Boolean, }; case ts.SyntaxKind.NumberKeyword: return { k: TypeKind.Number, }; case ts.SyntaxKind.StringKeyword: return { k: TypeKind.String, }; case ts.SyntaxKind.ObjectKeyword: return { k: TypeKind.Object, }; case ts.SyntaxKind.UnionType: return { k: TypeKind.Union, types: (node as ts.UnionTypeNode).types.map(parseType), }; case ts.SyntaxKind.IntersectionType: return { k: TypeKind.Intersection, types: (node as ts.IntersectionTypeNode).types.map(parseType), }; case ts.SyntaxKind.TupleType: return { k: TypeKind.Tuple, types: (node as ts.TupleTypeNode).elements.map(parseType), }; case ts.SyntaxKind.IndexedAccessType: return { k: TypeKind.Indexed, type: parseType((node as ts.IndexedAccessTypeNode).objectType), index: parseType((node as ts.IndexedAccessTypeNode).indexType), }; case ts.SyntaxKind.TypeOperator: { const operatorNode = node as ts.TypeOperatorNode; const operator = operatorNode.operator === ts.SyntaxKind.KeyOfKeyword ? 'keyof' : operatorNode.operator === ts.SyntaxKind.ReadonlyKeyword ? 'readonly' : undefined; if (!operator) { throw new Error( 'Unknown operator kind: ' + ts.SyntaxKind[operatorNode.operator] ); } return { k: TypeKind.Operator, operator, type: parseType(operatorNode.type), }; } case ts.SyntaxKind.TypeLiteral: return { k: TypeKind.Object, members: (node as ts.TypeLiteralNode).members.map((m) => { switch (m.kind) { case ts.SyntaxKind.IndexSignature: { const indexNode = m as ts.IndexSignatureDeclaration; return { index: true, params: indexNode.parameters.map(parseParam), type: parseType(indexNode.type), }; } case ts.SyntaxKind.PropertySignature: { const propNode = m as ts.PropertySignature; return { // Note: this will break on computed or other complex props. name: (propNode.name as ts.Identifier).text, type: propNode.type && parseType(propNode.type), }; } } throw new Error('Unknown member kind: ' + ts.SyntaxKind[m.kind]); }), }; case ts.SyntaxKind.ArrayType: return { k: TypeKind.Array, type: parseType((node as ts.ArrayTypeNode).elementType), }; case ts.SyntaxKind.FunctionType: { const functionNode = node as ts.FunctionTypeNode; return { k: TypeKind.Function, params: functionNode.parameters.map(parseParam), type: parseType(functionNode.type), typeParams: functionNode.typeParameters?.map((p) => p.name.text), }; } case ts.SyntaxKind.TypeReference: { const refNode = node as ts.TypeReferenceNode; const name = getNameText(refNode.typeName); if (isTypeParam(name)) { return { k: TypeKind.Param, param: name, }; } return { k: TypeKind.Type, name: getNameText(refNode.typeName), args: refNode.typeArguments?.map(parseType), }; } case ts.SyntaxKind.ExpressionWithTypeArguments: { const expressionNode = node as ts.ExpressionWithTypeArguments; return { k: TypeKind.Type, name: getNameText(expressionNode.expression), args: expressionNode.typeArguments?.map(parseType), }; } case ts.SyntaxKind.TypePredicate: return { k: TypeKind.Boolean, }; case ts.SyntaxKind.MappedType: { const mappedNode = node as ts.MappedTypeNode; // Simplification of MappedType to typical Object type. return { k: TypeKind.Object, members: [ { index: true, params: [ { name: 'key', type: { k: TypeKind.String }, }, ], type: parseType(mappedNode.type!), }, ], }; } case ts.SyntaxKind.ConditionalType: case ts.SyntaxKind.RestType: { return { k: TypeKind.Never }; } } throw new Error('Unknown type kind: ' + ts.SyntaxKind[node.kind]); } function parseParam(node: ts.ParameterDeclaration) { if (node.name.kind !== ts.SyntaxKind.Identifier) { throw new Error('NYI: Binding patterns'); } if (!node.type) { throw new Error(`Expected parameter ${node.name.text} to have a type`); } const p: CallParam = { name: node.name.text, type: parseType(node.type), }; if (node.dotDotDotToken) { p.varArgs = true; } if (node.questionToken) { p.optional = true; } if (node.initializer) { throw new Error('NYI: equalsValueClause'); } return p; } } function getLineNum(node: ts.Node) { const source = node.getSourceFile(); return source.getLineAndCharacterOfPosition(node.getStart(source)).line; } const COMMENT_NOTE_RX = /^@(\w+)\s*(.*)$/; const NOTE_BLACKLIST: { [key: string]: boolean } = { override: true, }; function getDoc(node: ts.Node): TypeDoc | undefined { const trivia = last(getTrivia(node)); if (!trivia || trivia.kind !== ts.SyntaxKind.MultiLineCommentTrivia) { return; } const lines = node .getSourceFile() .text.substring(trivia.pos, trivia.end) .split('\n') .slice(1, -1) .map((l) => l.trim().slice(2)); const paragraphs = lines .filter((l) => l[0] !== '@') .join('\n') .split('\n\n'); const synopsis = paragraphs.shift()!; const description = paragraphs.join('\n\n'); const notes = lines .filter((l) => l[0] === '@') .map((l) => l.match(COMMENT_NOTE_RX)) // eslint-disable-next-line eqeqeq .filter((n: T): n is NonNullable => n != null) .map((n) => ({ name: n[1], body: n[2] })) .filter((note) => !NOTE_BLACKLIST[note.name]); return { synopsis, description, notes, }; } function getNameText(node: ts.Node): string { // @ts-expect-error Not included in typed API for some reason. return ts.entityNameToString(node); } function getTrivia(node: ts.Node): Array { const sourceFile = node.getSourceFile(); return ts.getLeadingCommentRanges(sourceFile.text, node.pos) || []; } function last(list: Array): T { return list && list[list.length - 1]; } function pushIn< T, K1 extends keyof T, A extends NonNullable & Array, V extends A[number], >(obj: T, path: readonly [K1], value: V): V; function pushIn< T, K1 extends keyof T, K2 extends keyof NonNullable, A extends NonNullable[K2]> & Array, V extends A[number], >(obj: T, path: readonly [K1, K2], value: V): V; function pushIn< T, K1 extends keyof T, K2 extends keyof NonNullable, K3 extends keyof NonNullable[K2]>, A extends NonNullable[K2]>[K3]> & Array, V extends A[number], >(obj: T, path: readonly [K1, K2, K3], value: V): V; // eslint-disable-next-line @typescript-eslint/no-explicit-any function pushIn(obj: any, path: ReadonlyArray, value: any) { for (let ii = 0; ii < path.length; ii++) { obj = obj[path[ii]] || (obj[path[ii]] = ii === path.length - 1 ? [] : {}); } obj.push(value); return value; } function setIn( obj: T, path: readonly [K1], value: T[K1] ): void; function setIn>( obj: T, path: readonly [K1, K2], value: NonNullable[K2] ): void; function setIn< T, K1 extends keyof T, K2 extends keyof NonNullable, K3 extends keyof NonNullable[K2]>, >( obj: T, path: readonly [K1, K2, K3], value: NonNullable[K2]>[K3] ): void; function setIn< T, K1 extends keyof T, K2 extends keyof NonNullable, K3 extends keyof NonNullable[K2]>, K4 extends keyof NonNullable[K2]>[K3]>, >( obj: T, path: readonly [K1, K2, K3, K4], value: NonNullable[K2]>[K3]>[K4] ): void; // eslint-disable-next-line @typescript-eslint/no-explicit-any function setIn(obj: any, path: ReadonlyArray, value: any) { for (let ii = 0; ii < path.length - 1; ii++) { obj = obj[path[ii]] || (obj[path[ii]] = {}); } obj[path[path.length - 1]] = value; } function shouldIgnore(comment: TypeDoc | undefined) { return Boolean( comment && comment.notes && comment.notes.find( (note) => note.name === 'ignore' || note.name === 'deprecated' ) ); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/getVersionFromParams.ts000066400000000000000000000002251522056416100314240ustar00rootroot00000000000000type Params = { version: string; }; export function getVersionFromParams(params: Params): string { return params.version.replace('%40', '@'); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/layout.tsx000066400000000000000000000013671522056416100270240ustar00rootroot00000000000000import { DocHeader } from '../../../DocHeader'; import { ImmutableConsole } from '../../../ImmutableConsole'; import { getVersions } from '../../../static/getVersions'; import { getVersionFromParams } from './getVersionFromParams'; export default async function VersionLayout(props: { children: React.ReactNode; params: Promise<{ version: string }>; }) { const params = await props.params; const { children } = props; const versions = getVersions(); const version = getVersionFromParams(params); return (
{children}
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/[version]/page.tsx000066400000000000000000000030401522056416100264110ustar00rootroot00000000000000import { Metadata } from 'next'; import { DocSearch } from '../../../DocSearch'; import { getVersionFromGitTag } from '../../../static/getVersions'; import { VERSION } from '../currentVersion'; import { DocOverview, getOverviewData } from './DocOverview'; import { SideBarV4 } from './SidebarV4'; import { getSidebarLinks } from './getSidebarLinks'; import { getTypeDefs } from './getTypeDefs'; import { getVersionFromParams } from './getVersionFromParams'; export async function generateStaticParams() { return [...getVersionFromGitTag().map((version) => ({ version }))]; } type Params = { version: string; }; type Props = { params: Promise; }; export async function generateMetadata(props: Props): Promise { const params = await props.params; const version = getVersionFromParams(params); return { title: `Documentation ${version} — Immutable.js`, robots: { index: false, follow: true, }, alternates: { canonical: `/docs/${VERSION}/`, }, }; } export default async function OverviewDocPage(props: Props) { const params = await props.params; const version = getVersionFromParams(params); const defs = getTypeDefs(version); const overviewData = getOverviewData(defs); const sidebarLinks = getSidebarLinks(defs); return ( <>

Immutable.js ({version})

); } immutable-js-immutable-js-6a01d72/website/src/app/docs/currentVersion.tsx000066400000000000000000000226261522056416100265630ustar00rootroot00000000000000export const VERSION = 'v5'; export const SIDEBAR_LINKS = [ { label: 'List', description: 'Lists are ordered indexed dense collections, much like a JavaScript Array.', url: `/docs/${VERSION}/List/`, }, { label: 'Map', description: 'Immutable Map is an unordered Collection.Keyed of (key, value) pairs with O(log32 N) gets and O(log32 N) persistent sets.', url: `/docs/${VERSION}/Map/`, }, { label: 'OrderedMap', description: 'A type of Map that has the additional guarantee that the iteration order of entries will be the order in which they were set().', url: `/docs/${VERSION}/OrderedMap/`, }, { label: 'Set', description: 'A Collection of unique values with O(log32 N) adds and has.', url: `/docs/${VERSION}/Set/`, }, { label: 'OrderedSet', description: 'A type of Set that has the additional guarantee that the iteration order of values will be the order in which they were added.', url: `/docs/${VERSION}/OrderedSet/`, }, { label: 'Stack', description: 'Stacks are indexed collections which support very efficient O(1) addition and removal from the front using unshift(v) and shift().', url: `/docs/${VERSION}/Stack/`, }, { label: 'Range()', description: 'Returns a Seq.Indexed of numbers from start (inclusive) to end (exclusive), by step, where start defaults to 0, step to 1, and end to infinity. When start is equal to end, returns empty range.', url: `/docs/${VERSION}/Range()/`, }, { label: 'Repeat()', description: 'Returns a Seq.Indexed of value repeated times times. When times is not defined, returns an infinite Seq of value.', url: `/docs/${VERSION}/Repeat()/`, }, { label: 'Record', description: 'A record is similar to a JS object, but enforces a specific set of allowed string keys, and has default values.', url: `/docs/${VERSION}/Record/`, }, { label: 'Record.Factory', description: 'A Record.Factory is created by the Record() function. Record instances are created by passing it some of the accepted values for that Record type:', url: `/docs/${VERSION}/Record.Factory/`, }, { label: 'Seq', description: 'Seq describes a lazy operation, allowing them to efficiently chain use of all the higher-order collection methods (such as map and filter) by not creating intermediate collections.', url: `/docs/${VERSION}/Seq/`, }, { label: 'Seq.Keyed', description: 'Seq which represents key-value pairs.', url: `/docs/${VERSION}/Seq.Keyed/`, }, { label: 'Seq.Indexed', description: 'Seq which represents an ordered indexed list of values.', url: `/docs/${VERSION}/Seq.Indexed/`, }, { label: 'Seq.Set', description: 'Seq which represents a set of values.', url: `/docs/${VERSION}/Seq.Set/`, }, { label: 'Collection', description: 'The Collection is a set of (key, value) entries which can be iterated, and is the base class for all collections in immutable, allowing them to make use of all the Collection methods (such as map and filter).', url: `/docs/${VERSION}/Collection/`, }, { label: 'Collection.Keyed', description: 'Keyed Collections have discrete keys tied to each value.', url: `/docs/${VERSION}/Collection.Keyed/`, }, { label: 'Collection.Indexed', description: "Indexed Collections have incrementing numeric keys. They exhibit slightly different behavior than Collection.Keyed for some methods in order to better mirror the behavior of JavaScript's Array, and add methods which do not make sense on non-indexed Collections such as indexOf.", url: `/docs/${VERSION}/Collection.Indexed/`, }, { label: 'Collection.Set', description: 'Set Collections only represent values. They have no associated keys or indices. Duplicate values are possible in the lazy Seq.Sets, however the concrete Set Collection does not allow duplicate values.', url: `/docs/${VERSION}/Collection.Set/`, }, { label: 'ValueObject', description: '', url: `/docs/${VERSION}/ValueObject/`, }, { label: 'OrderedCollection', description: '', url: `/docs/${VERSION}/OrderedCollection/`, }, // functions { label: 'fromJS()', description: '', url: `/docs/${VERSION}/fromJS()/` }, { label: 'is()', description: 'Value equality check with semantics similar to Object.is, but treats Immutable Collections as values, equal if the second Collection includes equivalent values.', url: `/docs/${VERSION}/is()/`, }, { label: 'hash()', description: 'The hash() function is an important part of how Immutable determines if two values are equivalent and is used to determine how to store those values. Provided with any value, hash() will return a 31-bit integer.', url: `/docs/${VERSION}/hash()/`, }, { label: 'isImmutable()', description: 'True if maybeImmutable is an Immutable Collection or Record.', url: `/docs/${VERSION}/isImmutable()/`, }, { label: 'isCollection()', description: 'True if maybeCollection is a Collection, or any of its subclasses.', url: `/docs/${VERSION}/isCollection()/`, }, { label: 'isKeyed()', description: 'True if maybeKeyed is a Collection.Keyed, or any of its subclasses.', url: `/docs/${VERSION}/isKeyed()/`, }, { label: 'isIndexed()', description: 'True if maybeIndexed is a Collection.Indexed, or any of its subclasses.', url: `/docs/${VERSION}/isIndexed()/`, }, { label: 'isAssociative()', description: 'True if maybeAssociative is either a Keyed or Indexed Collection.', url: `/docs/${VERSION}/isAssociative()/`, }, { label: 'isOrdered()', description: '', url: `/docs/${VERSION}/isOrdered()/`, }, { label: 'isValueObject()', description: 'True if maybeValue is a JavaScript Object which has both equals() and hashCode() methods.', url: `/docs/${VERSION}/isValueObject()/`, }, { label: 'isSeq()', description: 'True if maybeSeq is a Seq.', url: `/docs/${VERSION}/isSeq()/`, }, { label: 'isList()', description: 'True if maybeList is a List.', url: `/docs/${VERSION}/isList()/`, }, { label: 'isMap()', description: 'True if maybeMap is a Map.', url: `/docs/${VERSION}/isMap()/`, }, { label: 'isOrderedMap()', description: 'True if maybeOrderedMap is an OrderedMap.', url: `/docs/${VERSION}/isOrderedMap()/`, }, { label: 'isStack()', description: 'True if maybeStack is a Stack.', url: `/docs/${VERSION}/isStack()/`, }, { label: 'isSet()', description: 'True if maybeSet is a Set.', url: `/docs/${VERSION}/isSet()/`, }, { label: 'isOrderedSet()', description: 'True if maybeOrderedSet is an OrderedSet.', url: `/docs/${VERSION}/isOrderedSet()/`, }, { label: 'isRecord()', description: 'True if maybeRecord is a Record.', url: `/docs/${VERSION}/isRecord()/`, }, { label: 'get()', description: 'Returns true if the key is defined in the provided collection.', url: `/docs/${VERSION}/get()/`, }, { label: 'has()', description: '', url: `/docs/${VERSION}/has()/` }, { label: 'remove()', description: '', url: `/docs/${VERSION}/remove()/` }, { label: 'set()', description: '', url: `/docs/${VERSION}/set()/` }, { label: 'update()', description: '', url: `/docs/${VERSION}/update()/` }, { label: 'getIn()', description: '', url: `/docs/${VERSION}/getIn()/` }, { label: 'hasIn()', description: '', url: `/docs/${VERSION}/hasIn()/` }, { label: 'removeIn()', description: 'Returns a copy of the collection with the value at the key path removed.', url: `/docs/${VERSION}/removeIn()/`, }, { label: 'setIn()', description: 'Returns a copy of the collection with the value at the key path set to the provided value.', url: `/docs/${VERSION}/setIn()/`, }, { label: 'updateIn()', description: '', url: `/docs/${VERSION}/updateIn()/` }, { label: 'merge()', description: 'Returns a copy of the collection with the remaining collections merged in.', url: `/docs/${VERSION}/merge()/`, }, { label: 'mergeWith()', description: 'Returns a copy of the collection with the remaining collections merged in, calling the merger function whenever an existing value is encountered.', url: `/docs/${VERSION}/mergeWith()/`, }, { label: 'mergeDeep()', description: 'Like merge(), but when two compatible collections are encountered with the same key, it merges them as well, recursing deeply through the nested data. Two collections are considered to be compatible (and thus will be merged together) if they both fall into one of three categories: keyed (e.g., Maps, Records, and objects), indexed (e.g., Lists and arrays), or set-like (e.g., Sets). If they fall into separate categories, mergeDeep will replace the existing collection with the collection being merged in. This behavior can be customized by using mergeDeepWith().', url: `/docs/${VERSION}/mergeDeep()/`, }, { label: 'mergeDeepWith()', description: 'Like mergeDeep(), but when two non-collections or incompatible collections are encountered at the same key, it uses the merger function to determine the resulting value. Collections are considered incompatible if they fall into separate categories between keyed, indexed, and set-like.', url: `/docs/${VERSION}/mergeDeepWith()/`, }, ]; immutable-js-immutable-js-6a01d72/website/src/app/docs/page.tsx000066400000000000000000000014621522056416100244420ustar00rootroot00000000000000import { Metadata } from 'next'; import { DocHeader } from '../../DocHeader'; import { ImmutableConsole } from '../../ImmutableConsole'; import { getVersions } from '../../static/getVersions'; import RedirectExistingDocs from './redirect-client'; export const metadata: Metadata = { title: 'Documentation — Immutable.js', }; export default function Page() { const versions = getVersions(); const latestVersion = versions[0]; if (!latestVersion) { throw new Error('No versions'); } return (
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/redirect-client.tsx000066400000000000000000000010731522056416100266010ustar00rootroot00000000000000'use client'; import { useRouter } from 'next/navigation'; import { useEffect } from 'react'; type Props = { version: string; }; export default function RedirectExistingDocs({ version }: Props) { const router = useRouter(); useEffect(() => { const [, type, member] = window.location.hash?.split('/') || []; let route = `/docs/${version}`; if (type) { route += `/${type}`; } if (member) { route += `#${member}`; } router.replace(route); }, [version, router]); return
Redirecting...
; } immutable-js-immutable-js-6a01d72/website/src/app/docs/v5/000077500000000000000000000000001522056416100233155ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/docs/v5/[type]/000077500000000000000000000000001522056416100245665ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/docs/v5/[type]/page.tsx000066400000000000000000000027571522056416100262550ustar00rootroot00000000000000import { DocSearch } from '../../../../DocSearch'; import { FocusType, Sidebar } from '../../../../sidebar'; import { getDocDetail, getDocFiles } from '../../../../utils/doc'; export async function generateStaticParams() { const docFiles = getDocFiles(); return docFiles.map((file) => ({ type: file.slug, })); } type Params = { version: string; type: string; }; type Props = { params: Promise; }; export async function generateMetadata(props: Props) { const params = await props.params; return { title: `${params.type} — Immutable.js`, }; } export default async function TypeDocPage(props: Props) { const params = await props.params; const { type } = params; const detail = getDocDetail(type); const focus = detail.reduce((carry, item) => { if (item.type === 'title') { const focus = { qualifiedName: item.name, label: item.name, // Like a name, but with () for callables. functions: {}, }; return [...carry, focus]; } const lastItem = carry[carry.length - 1]; if (lastItem) { lastItem.functions[item.name] = { label: item.name, url: `#${item.name}`, }; } return carry; }, []); const { default: MdxContent } = await import(`@/docs/${type}.mdx`); return (
;
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/v5/layout.tsx000066400000000000000000000013031522056416100253670ustar00rootroot00000000000000import { DocHeader } from '../../../DocHeader'; import { ImmutableConsole } from '../../../ImmutableConsole'; import { getVersions } from '../../../static/getVersions'; import { VERSION } from '../currentVersion'; export default async function VersionLayout(props: { children: React.ReactNode; // eslint-disable-next-line @typescript-eslint/no-empty-object-type params: Promise<{}>; }) { const { children } = props; const versions = getVersions(); return (
{children}
); } immutable-js-immutable-js-6a01d72/website/src/app/docs/v5/page.tsx000066400000000000000000000021421522056416100247700ustar00rootroot00000000000000import { Metadata } from 'next'; import Link from 'next/link'; import { DocSearch } from '../../../DocSearch'; import { Sidebar } from '../../../sidebar'; import { SIDEBAR_LINKS, VERSION } from '../currentVersion'; export async function generateMetadata(): Promise { return { title: `Documentation v5 — Immutable.js`, }; } export default async function OverviewDocPage() { const { default: MdxContent } = await import(`@/docs/Intro.mdx`); return ( <>

Immutable.js ({VERSION})

{SIDEBAR_LINKS.map((link) => (

{link.label}

{link.description}

))}
); } immutable-js-immutable-js-6a01d72/website/src/app/layout.tsx000066400000000000000000000011661522056416100241140ustar00rootroot00000000000000import { Metadata } from 'next'; import React from 'react'; import { WorkerContextProvider } from './WorkerContext'; import '../../styles/globals.css'; import '../../styles/prism-theme.css'; export const metadata: Metadata = { title: 'Immutable.js', icons: { icon: '/favicon.png', }, }; export default function RootLayout({ // Layouts must accept a children prop. // This will be populated with nested layouts or pages children, }: { children: React.ReactNode; }) { return ( {children} ); } immutable-js-immutable-js-6a01d72/website/src/app/not-found.tsx000066400000000000000000000004111522056416100245000ustar00rootroot00000000000000import Link from 'next/link'; export default function NotFound() { return ( <>

Not Found

Could not find requested resource

Return Home
); } immutable-js-immutable-js-6a01d72/website/src/app/page.tsx000066400000000000000000000016351522056416100235140ustar00rootroot00000000000000import fs from 'fs'; import { Metadata } from 'next'; import { Header } from '../Header'; import { ImmutableConsole } from '../ImmutableConsole'; import { MarkdownContent } from '../MarkdownContent'; import { genMarkdownDoc } from '../static/genMarkdownDoc'; import { getVersions } from '../static/getVersions'; export async function generateMetadata(): Promise { return { verification: { google: 'PdYYQG_2wv0zUJjqBIeuYliPcrOiAuTES4Q21OLy5uQ', }, }; } export default async function Page() { const versions = await getVersions(); const readme = genMarkdownDoc( versions[0], fs.readFileSync(`../README.md`, 'utf8') ); return ( <>
); } immutable-js-immutable-js-6a01d72/website/src/app/play/000077500000000000000000000000001522056416100230005ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/app/play/Playground.tsx000066400000000000000000000017771522056416100257000ustar00rootroot00000000000000'use client'; import Repl from '../../repl/Repl'; import { bytesToString, stringToBytes } from './encoder'; export default function Playground() { { /* Debug with: List([ 'apple', 'banana', 'coconut', 123, null, undefined, new Date() ]) .push('dragonfruit') .map((fruit) => upperFirst(fruit)) */ } let decodedHash: string | null = null; try { decodedHash = window.location.hash ? bytesToString(window.location.hash.slice(1)) : null; } catch (e) { console.warn('Error decoding hash', e); } const defaultValue = decodedHash ?? `const upperFirst = (str) => typeof str === 'string' ? str.charAt(0).toUpperCase() + str.slice(1) : str; List([ 'apple', 'banana', 'coconut', ]) .push('dragonfruit') .map((fruit) => upperFirst(fruit)) `; return ( { const bytes = stringToBytes(code); // adds bytes as url hash window.location.hash = bytes; }} /> ); } immutable-js-immutable-js-6a01d72/website/src/app/play/encoder.ts000066400000000000000000000012171522056416100247700ustar00rootroot00000000000000// taken from https://developer.mozilla.org/en-US/docs/Web/API/Window/btoa#unicode_strings function base64ToBytes(base64: string): Uint8Array { const binString = atob(base64); return Uint8Array.from(binString, (m: string) => m.codePointAt(0) ?? 0); } function bytesToBase64(bytes: Uint8Array): string { const binString = Array.from(bytes, (byte) => String.fromCodePoint(byte) ).join(''); return btoa(binString); } export function stringToBytes(str: string): string { return bytesToBase64(new TextEncoder().encode(str)); } export function bytesToString(bytes: string): string { return new TextDecoder().decode(base64ToBytes(bytes)); } immutable-js-immutable-js-6a01d72/website/src/app/play/layout.tsx000066400000000000000000000010351522056416100250540ustar00rootroot00000000000000import { DocHeader } from '../../DocHeader'; import { ImmutableConsole } from '../../ImmutableConsole'; import { getVersions } from '../../static/getVersions'; export default function VersionLayout({ children, }: { children: React.ReactNode; }) { const versions = getVersions(); return (
{children}
); } immutable-js-immutable-js-6a01d72/website/src/app/play/page.tsx000066400000000000000000000012131522056416100244510ustar00rootroot00000000000000import { Metadata } from 'next'; import { DocSearch } from '../../DocSearch'; import { Sidebar } from '../../sidebar'; import { VERSION } from '../docs/currentVersion'; import Playground from './Playground'; export async function generateMetadata(): Promise { return { title: `Playground — Immutable.js`, }; } export default function OverviewDocPage() { return ( <>

Playgroud ({VERSION})

You can share or bookmark the url to get access to this playground.
); } immutable-js-immutable-js-6a01d72/website/src/isMobile.ts000066400000000000000000000004721522056416100233710ustar00rootroot00000000000000let _isMobile: boolean; export function isMobile() { if (_isMobile === undefined) { const isMobileMatch = typeof window !== 'undefined' && window.matchMedia && window.matchMedia('(max-device-width: 680px)'); _isMobile = isMobileMatch && isMobileMatch.matches; } return _isMobile; } immutable-js-immutable-js-6a01d72/website/src/mdx-components.tsx000066400000000000000000000036671522056416100250020ustar00rootroot00000000000000import type { MDXComponents } from 'mdx/types'; import Prism from 'prismjs'; import loadLanguages from 'prismjs/components/'; loadLanguages(['ts']); export function useMDXComponents(components: MDXComponents): MDXComponents { return { code: ({ className, children, ...rest }) => { if (!className) { // no classname : no need to handle syntax highlighting return {children}; } const language = className.replace('language-', ''); const html = Prism.highlight( String(children).trim(), Prism.languages[language] || Prism.languages.plaintext, language ); return ( ); }, MemberLabel: ({ label, alias }: { label: string; alias?: string }) => { return (

{label} §

{alias && ( <>

Alias:

{alias} )}
); }, See: ({ code }: { code: string }) => { return ( <>

See

{code} ); }, Signature: ({ code }) => { const language = 'ts'; const html = Prism.highlight( String(code).trim(), Prism.languages[language], language ); return (

Method signature

            
          
); }, ...components, }; } immutable-js-immutable-js-6a01d72/website/src/mdx-components/000077500000000000000000000000001522056416100242265ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/mdx-components/CodeLink.tsx000066400000000000000000000005561522056416100264640ustar00rootroot00000000000000import { JSX } from 'react'; type Props = { to: string; children?: React.ReactNode; }; export default function CodeLink({ to, children }: Props): JSX.Element { const href = to.includes('#') || to.startsWith('.') ? to : `#${to}`; const text = children || to.replace(/^[./]*/g, ''); return ( {text} ); } immutable-js-immutable-js-6a01d72/website/src/repl/000077500000000000000000000000001522056416100222155ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/repl/Editor.tsx000066400000000000000000000031561522056416100242100ustar00rootroot00000000000000import { defaultKeymap, indentWithTab } from '@codemirror/commands'; import { javascript } from '@codemirror/lang-javascript'; import { EditorState, Extension } from '@codemirror/state'; import { oneDark } from '@codemirror/theme-one-dark'; import { EditorView, gutter, keymap } from '@codemirror/view'; import { basicSetup, minimalSetup } from 'codemirror'; import { type JSX, useEffect, useRef } from 'react'; import useDarkMode from '../useDarkMode'; type Props = { value: string; onChange?: (value: string) => void; }; export function Editor({ value, onChange }: Props): JSX.Element { const editor = useRef(null); const darkMode = useDarkMode(); const onUpdate = EditorView.updateListener.of((v) => { if (onChange) { onChange(v.state.doc.toString()); } }); useEffect(() => { if (!editor.current) { return; } const readOnly = !onChange; const startState = EditorState.create({ doc: value, // readOnly: !onChange, extensions: [ readOnly ? minimalSetup : basicSetup, keymap.of([...defaultKeymap, indentWithTab]), javascript(), darkMode ? oneDark : undefined, readOnly ? undefined : onUpdate, EditorState.readOnly.of(readOnly), readOnly ? gutter({}) : undefined, ].filter( (value: Extension | undefined): value is Extension => typeof value !== 'undefined' ), }); const view = new EditorView({ state: startState, parent: editor.current, }); return () => { view.destroy(); }; }, [darkMode]); return
; } immutable-js-immutable-js-6a01d72/website/src/repl/FormatterOutput.tsx000066400000000000000000000015661522056416100261510ustar00rootroot00000000000000import { toHTML } from 'jsonml-html'; import { type JSX, useEffect, useRef } from 'react'; import { Element, JsonMLElementList } from '../worker/jsonml-types'; /** * immutable-devtools is a console custom formatter. * Console formatters does use jsonml format. * {@see https://firefox-source-docs.mozilla.org/devtools-user/custom_formatters/index.html} for a documentation from the Firefox team. * The `jsonml-html` package can convert jsonml to HTML. */ type Props = { output: undefined | JsonMLElementList | Element; }; export default function FormatterOutput({ output }: Props): JSX.Element { const header = useRef(null); const htmlHeader = output ? toHTML(output) : undefined; useEffect(() => { if (header.current && htmlHeader) { header.current.replaceChildren(htmlHeader); } }, [htmlHeader]); return
; } immutable-js-immutable-js-6a01d72/website/src/repl/Repl.tsx000066400000000000000000000032431522056416100236610ustar00rootroot00000000000000'use client'; import dynamic from 'next/dynamic'; import React, { type JSX, useCallback, useEffect, useState } from 'react'; import { useWorkerContext } from '../app/WorkerContext'; import { Element, JsonMLElementList } from '../worker/jsonml-types'; import { Editor } from './Editor'; import FormatterOutput from './FormatterOutput'; import './repl.css'; type Props = { defaultValue: string; onRun?: (code: string) => void; imports?: Array; }; function Repl({ defaultValue, onRun, imports }: Props): JSX.Element { const [code, setCode] = useState(defaultValue); const [output, setOutput] = useState( undefined ); const { runCode: workerRunCode } = useWorkerContext(); const onSuccess = (result: JsonMLElementList | Element): void => { if (onRun) { onRun(code); } setOutput(result); }; const runCode = useCallback(() => { workerRunCode(code, onSuccess); }, [code, onSuccess, workerRunCode]); useEffect(() => { runCode(); }, []); return (

Live example

{imports && ( )}
        
      
); } export default dynamic(() => Promise.resolve(Repl), { ssr: false, }); immutable-js-immutable-js-6a01d72/website/src/repl/repl.css000066400000000000000000000016111522056416100236700ustar00rootroot00000000000000.repl-editor-container { display: flex; align-items: flex-start; gap: 8px; } .repl-editor { flex: 1; width: 0; /* See https://stackoverflow.com/a/75423682/2111353, but does only work on "row" mode */ border: 1px solid var(--code-block-bg-color); } .js-repl textarea { width: 100%; height: 100px; margin-bottom: 10px; padding: 10px; font-family: monospace; font-size: 14px; border: 1px solid #ccc; border-radius: 4px; resize: none; } .js-repl button { padding: 10px 15px; font-size: 14px; background-color: var(--link-color); color: white; border: none; border-radius: 4px; cursor: pointer; } .js-repl button:hover { background-color: var(--link-hover-color); } .js-repl pre.repl-output { background-color: var(--code-block-bg-color); padding: 10px; border: 1px solid #ccc; border-radius: 4px; white-space: pre-wrap; word-wrap: break-word; } immutable-js-immutable-js-6a01d72/website/src/sidebar/000077500000000000000000000000001522056416100226645ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/sidebar/Focus.tsx000066400000000000000000000011161522056416100245020ustar00rootroot00000000000000import { JSX } from 'react'; import FocusGroup from './FocusGroup'; type FocusItem = { label: string; functions: Record; }; export type FocusType = Array; export default function Focus({ focus, }: { focus?: FocusType; }): JSX.Element | null { if (focus?.length === 0) { return null; } return (
{focus?.map((def) => ( ))}
); } immutable-js-immutable-js-6a01d72/website/src/sidebar/FocusGroup.tsx000066400000000000000000000011021522056416100255120ustar00rootroot00000000000000import { JSX } from 'react'; import FunctionLink from './FunctionLink'; type FunctionDefinition = { label: string; url: string; }; type Props = { title: string; functions: Array; }; export default function FocusGroup({ title, functions }: Props): JSX.Element { return (

{title}

{functions.map((member) => ( ))}
); } immutable-js-immutable-js-6a01d72/website/src/sidebar/FunctionLink.tsx000066400000000000000000000004231522056416100260260ustar00rootroot00000000000000import Link from 'next/link'; import { JSX } from 'react'; type Props = { label: string; url: string; }; export default function FunctionLink({ label, url }: Props): JSX.Element { return (
{label}
); } immutable-js-immutable-js-6a01d72/website/src/sidebar/Sidebar.tsx000066400000000000000000000023571522056416100250040ustar00rootroot00000000000000'use client'; import { Fragment, useState } from 'react'; import { SIDEBAR_LINKS } from '../app/docs/currentVersion'; import Focus, { FocusType } from './Focus'; import SidebarMainLink from './SidebarMainLink'; export type SidebarLinks = Array<{ label: string; url: string }>; export default function SideBar({ links = SIDEBAR_LINKS, focus, activeType, }: { links?: SidebarLinks; focus?: FocusType; activeType?: string; }) { const [isForcedClosed, setIsForcedClosed] = useState(false); return (

Immutable.js

{links.map((link) => { const isCurrent = activeType === link.label; const isActive = isCurrent && !isForcedClosed; return ( setIsForcedClosed((prev) => !prev)} /> {isActive && } ); })}
); } immutable-js-immutable-js-6a01d72/website/src/sidebar/SidebarMainLink.tsx000066400000000000000000000016251522056416100264240ustar00rootroot00000000000000import Link from 'next/link'; import { usePathname } from 'next/navigation'; import { JSX } from 'react'; import { ArrowDown } from '../ArrowDown'; type Props = { label: string; url: string; canBeFocused: boolean; isActive: boolean; onClick: () => void; }; export default function SidebarMainLink({ label, url, canBeFocused, isActive, onClick, }: Props): JSX.Element { const pathname = usePathname(); const isCurrent = pathname === url; return (
{ if (isCurrent) { e.preventDefault(); onClick(); } }} > {label} {isActive && canBeFocused && ( <> {' '} )}
); } immutable-js-immutable-js-6a01d72/website/src/sidebar/index.ts000066400000000000000000000002111522056416100243350ustar00rootroot00000000000000export { default as Sidebar } from './Sidebar'; export type { SidebarLinks } from './Sidebar'; export type { FocusType } from './Focus'; immutable-js-immutable-js-6a01d72/website/src/static/000077500000000000000000000000001522056416100225425ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/static/genMarkdownDoc.ts000066400000000000000000000013341522056416100260150ustar00rootroot00000000000000import { SIDEBAR_LINKS } from '../app/docs/currentVersion'; import { markdown } from './markdown'; export function genMarkdownDoc(version: string, typeDefSource: string): string { return markdown( typeDefSource .replace(/\n[^\n]+?Build Status[^\n]+?\n/, '\n') .replace('website/public', ''), { defs: { version, types: Object.fromEntries( SIDEBAR_LINKS.map((link) => { const qualifiedName = link.label.replace(/\(\)$/g, ''); return [ qualifiedName, { qualifiedName, label: link.label, url: link.url, }, ]; }) ), }, } ); } immutable-js-immutable-js-6a01d72/website/src/static/getVersions.js000066400000000000000000000021511522056416100254070ustar00rootroot00000000000000// eslint-disable-next-line @typescript-eslint/no-require-imports, no-undef const { execSync } = require('child_process'); let versions; let versionsFromGitTag; /** @returns {Array} */ function getVersions() { if (!versions) { // VERSION does not work in sitemap generation versions = ['v5'].concat(getVersionFromGitTag()); } return versions; } /** @returns {Array} */ function getVersionFromGitTag() { if (versionsFromGitTag) { return versionsFromGitTag; } let versions = []; const tags = execSync('git tag -l --sort=-creatordate', { encoding: 'utf8', }).split('\n'); // const latestV5Tag = tags.find((t) => t.match(/^v?5/)); const latestV4Tag = tags.find((t) => t.match(/^v?4/)); const latestV3Tag = tags.find((t) => t.match(/^v?3/)); if (latestV4Tag) { versions.push(latestV4Tag); } if (latestV3Tag) { versions.push(latestV3Tag); } versionsFromGitTag = versions; return versions; } // eslint-disable-next-line no-undef exports.getVersions = getVersions; // eslint-disable-next-line no-undef exports.getVersionFromGitTag = getVersionFromGitTag; immutable-js-immutable-js-6a01d72/website/src/static/markdown.ts000066400000000000000000000110151522056416100247320ustar00rootroot00000000000000import { Marked } from 'marked'; import { markedHighlight } from 'marked-highlight'; import prism from 'prismjs'; import type { CallSignature, TypeDefinition, TypeDefs, } from '../app/docs/[version]/TypeDefs'; export type MarkdownContext = { defs: TypeDefs; typeDef?: TypeDefinition; signatures?: Array; }; function highlight(code: string): string { return prism.highlight(code, prism.languages.javascript, 'javascript'); } export function markdown(content: string, context: MarkdownContext): string { if (!content) return content; const defs = context.defs; // functions comsidee before keywords // the two following `insertBefore` do change the classes of the tokens, but is this still used? (visual output is the same) prism.languages.insertBefore('javascript', 'keyword', { var: /\b(this)\b/g, 'block-keyword': /\b(if|else|while|for|function)\b/g, primitive: /\b(true|false|null|undefined)\b/g, function: prism.languages.javascript.function, }); prism.languages.insertBefore('javascript', 'keyword', { qualifier: /\b[A-Z][a-z0-9_]+/g, }); const marked = new Marked( markedHighlight({ langPrefix: 'hljs language-', highlight, }) ); const renderer = new marked.Renderer(); renderer.code = function (code: string, lang: string, escaped: boolean) { return ( '' + (escaped ? code : escapeCode(code)) + '' ); }; const TYPE_REF_RX = /^(Immutable\.)?([#.\w]+)(?:<\w*>)?(?:\(\w*\))?$/; const PARAM_RX = /^\w+$/; const MDN_TYPES: { [name: string]: string } = { Array: 'Global_Objects/Array', Object: 'Global_Objects/Object', JSON: 'Global_Objects/JSON', Iterable: 'Iteration_protocols#the_iterable_protocol', Iterator: 'Iteration_protocols#the_iterator_protocol', }; const MDN_BASE_URL = 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/'; renderer.codespan = function (text: string) { return '' + decorateCodeSpan(text) + ''; }; function decorateCodeSpan(text: string) { if ( context.signatures && PARAM_RX.test(text) && context.signatures.some( (sig) => sig.params && sig.params.some((param) => param.name === text) ) ) { return '' + text + ''; } const typeRefResult = TYPE_REF_RX.exec(text); if (typeRefResult) { const [, immutableNS, elementsStr] = typeRefResult; const elements = elementsStr.split(/[#.]/g); const docLink = findTypeRefLink(immutableNS, elements); if (docLink) { const target = docLink.startsWith('http') ? ' target="_blank" rel="noopener"' : ''; return `${text}`; } } return highlight(unescapeCode(text)); } function findTypeRefLink(immutableNS: string, elements: Array) { // Non namespaced links may resolve to an MDN url. if (!immutableNS && MDN_TYPES[elements[0]]) { return ( MDN_BASE_URL + MDN_TYPES[elements[0]] + (elements[1] ? `/${elements[1]}` : '') ); } // Try to resolve a member relative to the contextual type def if it's not // a direct namespace reference. if (!immutableNS && context.typeDef) { const ctxElements = [context.typeDef.qualifiedName].concat(elements); const url = findDocsUrl(defs, ctxElements); if (url) { return url; } } return findDocsUrl(defs, elements); } // @ts-expect-error -- issue with "context", probably because we are on a really old version of marked return marked.parse(content, { renderer, context }); } function findDocsUrl( defs: TypeDefs, elements: Array ): string | undefined { // Try to resolve an interface member if (elements.length > 1) { const typeName = elements.slice(0, -1).join('.'); const memberName = elements[elements.length - 1]; const memberUrl = defs.types[typeName]?.interface?.members[memberName]?.url; if (memberUrl) { return memberUrl; } } // Otherwise try to resolve a type return defs.types[elements.join('.')]?.url; } function escapeCode(code: string): string { return code .replace(/&/g, '&') .replace(//g, '>') .replace(/"/g, '"') .replace(/'/g, '''); } function unescapeCode(code: string): string { return code .replace(/</g, '<') .replace(/>/g, '>') .replace(/"/g, '"') .replace(/'/g, "'") .replace(/&/g, '&'); } immutable-js-immutable-js-6a01d72/website/src/static/stripUndefineds.ts000066400000000000000000000010371522056416100262610ustar00rootroot00000000000000export function stripUndefineds(obj: unknown) { if (Array.isArray(obj)) { for (const value of obj) { stripUndefineds(value); } } else if (isObj(obj)) { for (const prop in obj) { if (obj.hasOwnProperty(prop)) { const value = obj[prop]; if (value === undefined) { delete obj[prop]; } else { stripUndefineds(value); } } } } } function isObj(value: unknown): value is { [prop: string]: unknown } { return typeof value === 'object' && value !== null; } immutable-js-immutable-js-6a01d72/website/src/useDarkMode.ts000066400000000000000000000010731522056416100240270ustar00rootroot00000000000000import { useEffect, useState } from 'react'; export default function useDarkMode(): boolean { const darkModeMediaQuery = window.matchMedia('(prefers-color-scheme: dark)'); const [darkMode, setDarkMode] = useState(darkModeMediaQuery.matches); useEffect(() => { const handleChange = (e: MediaQueryListEvent) => { setDarkMode(e.matches); }; darkModeMediaQuery.addEventListener('change', handleChange); return () => { darkModeMediaQuery.removeEventListener('change', handleChange); }; }, [darkModeMediaQuery]); return darkMode; } immutable-js-immutable-js-6a01d72/website/src/utils/000077500000000000000000000000001522056416100224135ustar00rootroot00000000000000immutable-js-immutable-js-6a01d72/website/src/utils/doc.tsx000066400000000000000000000025661522056416100237310ustar00rootroot00000000000000import fs from 'node:fs'; import path from 'node:path'; function getMDXFiles(dir: string): Array { return fs.readdirSync(dir).filter((file) => path.extname(file) === '.mdx'); } type MDXFile = { slug: string; }; function getMDXData(dir: string): Array { const files = getMDXFiles(dir); return files.map((file) => { const slug = path.basename(file, path.extname(file)); return { slug, }; }); } export function getDocFiles(): Array { const docsDir = path.join(process.cwd(), 'docs'); return getMDXData(docsDir); } export function getDocDetail( slug: string ): Array<{ type: 'title' | 'functionName'; name: string }> { const docsDir = path.join(process.cwd(), 'docs'); const file = path.join(docsDir, `${slug}.mdx`); if (!fs.existsSync(file)) { return []; } const content = fs.readFileSync(file, 'utf-8'); const regex = new RegExp( '^(## (?.*)|<MemberLabel.*label="(?<functionName>[^"]*)")', 'gm' ); const titleMatch = content.matchAll(regex); return Array.from(titleMatch).map((match) => { if (match.groups?.title) { return { type: 'title', name: match.groups.title }; } if (match.groups?.functionName) { return { type: 'functionName', name: match.groups.functionName }; } throw new Error(`Unexpected match groups: ${JSON.stringify(match.groups)}`); }); } ������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/src/worker/�����������������������������������������������0000775�0000000�0000000�00000000000�15220564161�0022564�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/src/worker/index.ts���������������������������������������0000664�0000000�0000000�00000007353�15220564161�0024253�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/// <reference lib="webworker" /> import type * as ImmutableModule from '../../../type-definitions/immutable.js'; import normalizeResult, { DevToolsFormatter } from './normalizeResult'; // Declare Immutable as they come from external scripts declare const Immutable: typeof ImmutableModule; // Declare globalThis.devtoolsFormatters declare global { // eslint-disable-next-line no-var var devtoolsFormatters: DevToolsFormatter[]; } importScripts('https://cdn.jsdelivr.net/npm/immutable'); (async () => { const immutableDevTools = (await import('@immutable/devtools')).default; immutableDevTools(Immutable); // hack to get the formatters from immutable-devtools as they are not exported, but they modify the "global" variable const immutableFormaters: Array<DevToolsFormatter> = globalThis.devtoolsFormatters; self.onmessage = function (event: { data: { code: string; key: string }; }): void { const { code, key } = event.data; const timeoutId = setTimeout(() => { self.postMessage({ key, error: 'Execution timed out' }); self.close(); }, 2000); try { // extract all Immutable exports to have them available in the worker automatically /* eslint-disable @typescript-eslint/no-unused-vars */ const { // @ts-expect-error type is not exported but runtime is OK version, Collection, // @ts-expect-error type is not exported but runtime is OK // Note: Iterable is deprecated, alias for Collection Iterable, Seq, Map, OrderedMap, List, Stack, Set, OrderedSet, PairSorting, Record, Range, Repeat, is, fromJS, hash, isImmutable, isCollection, isKeyed, isIndexed, isAssociative, isOrdered, // @ts-expect-error type is not exported but runtime is OK isPlainObject, isValueObject, isSeq, isList, isMap, isOrderedMap, isStack, isSet, isOrderedSet, isRecord, get, getIn, has, hasIn, merge, mergeDeep, mergeWith, mergeDeepWith, remove, removeIn, set, setIn, update, updateIn, } = Immutable; /* eslint-enable @typescript-eslint/no-unused-vars */ // track globalThis variables to remove them later // if (!globalThis.globalThisKeysBefore) { // globalThis.globalThisKeysBefore = [...Object.keys(globalThis)]; // } // track const and let variables into global scope to record them // it might make a userland code fail with a conflict. // We might want to indicate the user in the REPL that they should not use let/const if they want to have the result returned // code = code.replace(/^(const|let|var) /gm, ''); const result = eval(code); // const globalThisKeys = Object.keys(globalThis).filter((key) => { // return !globalThisKeysBefore.includes(key) && key !== 'globalThisKeysBefore'; // }); // console.log(globalThisKeys) clearTimeout(timeoutId); // TODO handle more than one result // if (!result) { // // result = globalThis[globalThisKeys[0]]; // result = globalThisKeys.map((key) => { // globalThis[key]; // }); // } self.postMessage({ key, output: normalizeResult(immutableFormaters, result), }); } catch (error) { console.log(error); clearTimeout(timeoutId); self.postMessage({ key, error: String(error) }); } }; })().catch((error) => { console.error('Worker initialization failed:', error); self.close(); }); �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/src/worker/jsonml-types.test.ts���������������������������0000664�0000000�0000000�00000005452�15220564161�0026564�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { describe, expect, it } from '@jest/globals'; import { Element, explodeElement } from './jsonml-types'; describe('explodeElement', () => { it('should explode an element', () => { expect(explodeElement(['div'])).toEqual({ tagName: 'div', attributes: undefined, children: [], }); }); it('should explode an element with attributes', () => { expect(explodeElement(['div', { id: 'test' }])).toEqual({ tagName: 'div', attributes: { id: 'test' }, children: [], }); }); it('should explode an element with children', () => { expect(explodeElement(['div', { id: 'test' }, 'Hello'])).toEqual({ tagName: 'div', attributes: { id: 'test' }, children: ['Hello'], }); }); it('should explode an element with multiple children', () => { expect(explodeElement(['div', { id: 'test' }, 'Hello', 'World'])).toEqual({ tagName: 'div', attributes: { id: 'test' }, children: ['Hello', 'World'], }); }); it('should explode an element without attributes with multiple children', () => { expect(explodeElement(['div', 'Hello', 'World'])).toEqual({ tagName: 'div', attributes: undefined, children: ['Hello', 'World'], }); }); it('should explode an element with a nested element', () => { expect(explodeElement(['div', { id: 'test' }, ['span', 'Hello']])).toEqual({ tagName: 'div', attributes: { id: 'test' }, children: [['span', 'Hello']], }); }); it('should explode an element with a nested element with attributes', () => { expect( explodeElement([ 'div', { id: 'test' }, ['span', { class: 'test' }, 'Hello'], ]) ).toEqual({ tagName: 'div', attributes: { id: 'test' }, children: [['span', { class: 'test' }, 'Hello']], }); }); it('should explode an element with a nested element with multiple children', () => { expect( explodeElement([ 'div', { id: 'test' }, ['span', 'Hello'], ['span', { id: 'world' }, 'World'], ]) ).toEqual({ tagName: 'div', attributes: { id: 'test' }, children: [ ['span', 'Hello'], ['span', { id: 'world' }, 'World'], ], }); }); it('should handle immutable list jsonml', () => { const spanElement: Element = [ 'span', { style: 'color: light-dark( #881391, #D48CE6)' }, '0: ', ]; const objectElement: Element = ['object', { object: ['a'] }]; const element: Element = ['li', spanElement, objectElement]; expect(explodeElement(element)).toEqual({ tagName: 'li', attributes: undefined, children: [ ['span', { style: 'color: light-dark( #881391, #D48CE6)' }, '0: '], ['object', { object: ['a'] }], ], }); }); }); ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/src/worker/jsonml-types.ts��������������������������������0000664�0000000�0000000�00000004072�15220564161�0025603�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * TypeScript types representing a JsonML grammar * * This represents a JSON-based markup language where elements are represented as arrays: * - First element is the tag name * - Second element (optional) is an attributes object * - Remaining elements are children */ // Basic types type TagName = string; type AttributeName = string; type AttributeValue = string | number | boolean | null | object; // Attributes // type Attribute = [AttributeName, AttributeValue]; // type AttributeList = Attribute[]; export type Attributes = Record<AttributeName, AttributeValue>; type ElementWithAttributes = | [TagName, Attributes, ...Element[]] // [tag-name, attributes, element-list] | [TagName, Attributes]; // [tag-name, attributes] // Elements export type Element = | ElementWithAttributes | [TagName, ...Element[]] // [tag-name, element-list] | [TagName] // [tag-name] | string; // string // Element list is just a list of elements export type JsonMLElementList = Array<Element | JsonMLElementList>; export function isElement(maybeElement: unknown): maybeElement is Element { return ( typeof maybeElement === 'string' || (Array.isArray(maybeElement) && maybeElement.length >= 1 && typeof maybeElement[0] === 'string') ); } function hasAttributes( maybeElementWithAttributes: Element ): maybeElementWithAttributes is ElementWithAttributes { return ( Array.isArray(maybeElementWithAttributes) && typeof maybeElementWithAttributes[1] === 'object' && !Array.isArray(maybeElementWithAttributes[1]) ); } type ExplodedElement = { tagName: TagName; attributes?: Attributes; children: Element[]; }; export function explodeElement(element: Element): ExplodedElement { if (typeof element === 'string') { return { tagName: element, children: [] }; } if (hasAttributes(element)) { const [tagName, attributes, ...children] = element; return { tagName, attributes, children }; } const [tagName, attributes, ...children] = element; return { tagName, children: [attributes, ...children].filter(isElement), }; } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/src/worker/normalizeResult.test.ts������������������������0000664�0000000�0000000�00000007120�15220564161�0027311�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { describe, expect, it } from '@jest/globals'; // @ts-expect-error immutable is loaded automatically import * as Immutable from 'immutable'; import normalizeResult from './normalizeResult'; // eslint-disable-next-line @typescript-eslint/no-require-imports -- import does not work const installDevTools = require('@immutable/devtools'); installDevTools(Immutable); // hack to get the formatters from immutable-devtools as they are not exported, but they modify the "global" variable const immutableFormaters = globalThis.devtoolsFormatters; describe('normalizeResult', () => { it('should return the correct object', () => { const result = normalizeResult(immutableFormaters, { a: 1, b: 2 }); expect(result).toEqual(JSON.stringify({ a: 1, b: 2 })); }); it('should return the correct object for a list', () => { const result = normalizeResult(immutableFormaters, Immutable.List(['a'])); expect(result).toEqual([ 'span', [ 'span', [ 'span', { style: 'color: light-dark(rgb(232,98,0), rgb(255, 150, 50)); position: relative', }, 'List', ], ['span', '[1]'], ], [ 'ol', { style: 'list-style-type: none; padding: 0; margin: 0 0 0 12px; font-style: normal; position: relative', }, [ 'li', ['span', { style: 'color: light-dark( #881391, #D48CE6)' }, '0: '], ['object', { object: 'a', config: undefined }], ], ], ]); }); it('should return the correct object for an empty list', () => { const result = normalizeResult(immutableFormaters, Immutable.List()); expect(result).toEqual([ 'span', [ 'span', [ 'span', { style: 'color: light-dark(rgb(232,98,0), rgb(255, 150, 50)); position: relative', }, 'List', ], ['span', '[0]'], ], ]); }); it('should return the correct object for a deep list', () => { const result = normalizeResult( immutableFormaters, Immutable.List([Immutable.List(['a'])]) ); expect(result).toEqual([ 'span', [ 'span', [ 'span', { style: 'color: light-dark(rgb(232,98,0), rgb(255, 150, 50)); position: relative', }, 'List', ], ['span', '[1]'], ], [ 'ol', { style: 'list-style-type: none; padding: 0; margin: 0 0 0 12px; font-style: normal; position: relative', }, [ 'li', ['span', { style: 'color: light-dark( #881391, #D48CE6)' }, '0: '], [ 'span', [ 'span', [ 'span', { style: 'color: light-dark(rgb(232,98,0), rgb(255, 150, 50)); position: relative', }, 'List', ], ['span', '[1]'], ], [ 'ol', { style: 'list-style-type: none; padding: 0; margin: 0 0 0 12px; font-style: normal; position: relative', }, [ 'li', [ 'span', { style: 'color: light-dark( #881391, #D48CE6)' }, '0: ', ], ['object', { object: 'a', config: undefined }], ], ], ], ], ], ]); }); }); ������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/src/worker/normalizeResult.ts�����������������������������0000664�0000000�0000000�00000004307�15220564161�0026337�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������import { Element, JsonMLElementList, explodeElement, isElement, } from './jsonml-types'; export interface DevToolsFormatter { header: (obj: unknown) => JsonMLElementList | null; hasBody: (obj: unknown) => boolean; body: (obj: unknown) => JsonMLElementList | null; } function getFormatter( immutableFormaters: Array<DevToolsFormatter>, result: unknown ) { return immutableFormaters.find((formatter) => formatter.header(result)); } export default function normalizeResult( immutableFormaters: Array<DevToolsFormatter>, result: unknown ): JsonMLElementList | Element { const formatter = getFormatter(immutableFormaters, result); if (!formatter) { if (Array.isArray(result) && result[0] === 'object' && result[1]?.object) { // handle special case for deep objects const objectFormatter = getFormatter( immutableFormaters, result[1].object ); if (objectFormatter) { return normalizeResult(immutableFormaters, result[1].object); } } if (typeof result !== 'string' && isElement(result)) { return normalizeElement(immutableFormaters, result); } if (typeof result === 'string') { return result; } return JSON.stringify(result); } const header = formatter.header(result) ?? []; let body: JsonMLElementList | null = formatter.hasBody(result) ? formatter.body(result) : null; if (body) { body = body.map((item) => normalizeElement(immutableFormaters, item)); } if (!body) { return ['span', header]; } return ['span', header, body]; } function normalizeElement( immutableFormaters: Array<DevToolsFormatter>, item: Element | JsonMLElementList ): Element | JsonMLElementList { if (!Array.isArray(item)) { return item; } if (!isElement(item)) { return item; } const explodedItem = explodeElement(item); const { tagName, attributes, children } = explodedItem; const normalizedChildren = children.map((child) => normalizeResult(immutableFormaters, child) ); if (attributes) { // @ts-expect-error type is not perfect here because of self-reference return [tagName, attributes, ...normalizedChildren]; } return [tagName, ...normalizedChildren]; } �������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/styles/���������������������������������������������������0000775�0000000�0000000�00000000000�15220564161�0022007�5����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/styles/globals.css����������������������������������������0000664�0000000�0000000�00000024430�15220564161�0024147�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������@import url('https://code.cdn.mozilla.net/fonts/fira.css'); :root { color-scheme: light dark; } html, body { --line-height: 1.625; --font-size: 16px; --font-size-small-screen: 14px; --header-content-padding: 12px; --link-color: #4078c0; --link-hover-color: #2b6db0; --header-color: #212325; --header-bg-color: #6dbcdb; --body-color: #626466; --code-block-bg-color: #f4f4f4; --code-block-color: #484a4c; --anchor-link-color: #9ca0a3; background-color: #ffffff; color: var(--body-color); -webkit-tap-highlight-color: rgba(0, 0, 0, 0); -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; margin: 0; padding: 0; -webkit-font-smoothing: antialiased; } @media (prefers-color-scheme: dark) { html, body { --link-color: #79a6f6; --link-hover-color: #5683d4; --header-color: #e0e0e0; --header-bg-color: #2b3a42; --body-color: #c0c0c0; --code-block-bg-color: #2e2e2e; --code-block-color: #d1d5da; --anchor-link-color: #616161; background-color: #121212; } } html { scroll-behavior: smooth; } body, input { color: var(--body-color); font-family: 'Fira Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; font-size: var(--font-size); line-height: var(--line-height); } @media only screen and (max-width: 680px) { body, input { font-size: var(--font-size-small-screen); } } h1, h2, h3, h4, h5, h6 { color: var(--header-color); } h1 { color: light-dark(#555, #fff); font-size: 1.5em; margin: 1rem 0; font-weight: bold; } h1.mainTitle { font-size: 2em; margin: 1.34rem 0; } h2 { margin: 4rem 0 1 rem; color: #545759; font-size: 1.5em; font-weight: 300; margin: 3rem 0 2rem; } h3 { margin: 2rem 0 1rem; } h4 { margin: 1rem 0 0; color: var(--body-color); } a, a > code { color: var(--link-color); text-decoration: none; } a:hover { color: var(--link-hover-color); } pre, code { font-family: 'Fira Mono', Menlo, monospace; background: var(--code-block-bg-color); color: var(--code-block-color); font-size: 0.9375em; letter-spacing: -0.015em; } code { margin: -0.05rem -0.15em; padding: 0.05rem 0.35em; } blockquote { margin: 1rem 0; padding: 0 1rem; color: #727476; border-left: solid 3px #dcdad9; } blockquote > :first-child { margin-top: 0; } blockquote > :last-child { margin-bottom: 0; } /* Markdown */ pre > code, .codeBlock { -webkit-overflow-scrolling: touch; background: var(--code-block-bg-color); border-left: solid 3px #eceae9; box-sizing: border-box; display: block; font-size: 0.875em; margin: 0.5rem 0; overflow-y: scroll; padding: 0.5rem 8px 0.5rem 12px; white-space: pre-wrap; position: relative; word-break: break-all; } .t.blockParams { padding-left: 2ch; } a.try-it { position: absolute; cursor: pointer; right: 1em; border: 0; background: transparent; border-bottom: 2px solid rgba(49, 50, 137, 0.2); color: rgba(49, 50, 137, 1); } /* Home */ .header { -webkit-touch-callout: none; user-select: none; } .pageBody { padding: 0 36px; position: relative; } @media only screen and (max-width: 1024px) { .pageBody { padding: 0; } } .contents { margin: 0 auto; max-width: 1024px; padding: 64px 0; position: relative; display: flex; flex-direction: row-reverse; } .contents > .docContents { flex-grow: 1; max-width: calc(min(100%, 1024px) - 360px); /* contents width minus sidebar */ } @media only screen and (max-width: 680px) { .contents > .docContents { max-width: 100%; } } img { max-width: min(100%, 1024px); } .markdown h1 { font-size: 2em; margin: 0 0 1rem; } .markdown h2 { font-size: 1.5em; padding-top: 100px; margin: calc(4rem - 100px) 0 1rem; } .markdown h3 { font-size: 1.25em; padding-top: 100px; margin: calc(2rem - 100px) 0 1rem; } .markdown h4, .markdown h5, .markdown h6 { font-size: 1em; padding-top: 100px; margin: calc(1rem - 100px) 0 0; } .miniHeader { background: var(--header-bg-color); position: fixed; width: 100%; z-index: 1; } .miniHeaderContents { margin: 0 auto; max-width: 1024px; padding: var(--header-content-padding) 36px; position: relative; text-align: right; } .miniLogo { float: left; left: -140px; top: var(--header-content-padding); } /* Anchor links: margin-top of 60px, like the header height */ [id] { scroll-margin-top: 60px; } .MenuButton__Toggle { display: none; } .MenuButton__Toggle > button { background: transparent; border: none; color: #fff; cursor: pointer; font-size: 1.5em; padding: 0; } @media only screen and (max-width: 680px) { .sideBar .MenuButton__Toggle { display: block; text-align: right; margin-top: 8px; margin-right: -15px; } .miniHeader .MenuButton__Toggle { display: grid; place-items: center; padding: 0 5px; } .miniHeader { display: flex; flex-direction: row; justify-content: flex-end; } .miniHeaderContents { margin: 0; padding: var(--header-content-padding); } .miniLogo { display: none; } } .miniLogo > .svg { height: 24px; } .miniHeaderContents .links a { color: #fff; font-weight: bold; text-decoration: none; text-shadow: 1px 1px 2px black; } .miniHeaderContents .links > * { margin-right: 1em; } .miniHeaderContents .links > *:last-child { margin-right: 0; } .coverContainer { background-color: #c1c6c8; height: 70vh; max-height: 800px; min-height: 260px; outline: solid 1px rgba(0, 0, 0, 0.28); overflow: hidden; position: relative; width: 100%; z-index: 1; } .cover { height: 70vh; max-height: 800px; min-height: 260px; position: absolute; width: 100%; clip: rect(0, auto, auto, 0); } .coverFixed { align-items: center; display: flex; flex-direction: column; height: 100%; justify-content: center; position: fixed; width: 100%; top: 0; height: 70vh; max-height: 800px; } .filler { flex: 10; width: 100%; } .synopsis { box-sizing: border-box; flex: 10; max-width: 700px; padding: 0 30px; pointer-events: none; position: relative; width: 100%; } .logo { bottom: 0; left: 60px; position: absolute; right: 60px; top: 0; } .logo > .svg { height: 100%; position: absolute; width: 100%; } .buttons { align-items: center; display: flex; flex: 10; } @media only screen and (max-width: 680px) { .filler { visibility: hidden; } .coverContainer, .cover { max-height: 260px; } .coverFixed { max-height: 260px; } .miniHeader { position: relative; } .synopsis { max-width: 540px; } .logo { left: 30px; right: 30px; } .contents { padding-top: 24px; } .pageBody { padding: 0 12px; } } /* Docs */ .disclaimer { margin: 60px 0 0 0; border: solid 1px #eecccc; background: #fefafa; padding: 1em; text-align: center; font-size: 0.8em; position: relative; } @media only screen and (max-width: 680px) { .disclaimer { margin: 60px 0 0; } } .toolBar { cursor: default; user-select: none; color: #888; cursor: pointer; } .toolBar .selected { color: #141420; } @media (prefers-color-scheme: dark) { .toolBar { color: #bbb; } .toolBar .selected { color: #fff; } } @media only screen and (max-width: 680px) { .toolBar { display: none; } } .sideBar { position: sticky; top: 64px; height: calc(100vh - 64px - 20px); margin-left: 40px; cursor: default; user-select: none; z-index: 0; } .sideBar__background { position: fixed; height: 100%; background: var(--code-block-bg-color); width: 100%; z-index: -1; margin-left: -20px; top: 0; } .sideBar__Link { padding: 5px 0; } .sideBar__Link--active { font-weight: bold; padding-bottom: 0; } .sideBar__Arrow--active { transform: rotate(180deg); } .sideBar .scrollContent { box-sizing: border-box; height: 100%; width: 300px; overflow: hidden auto; } @media only screen and (max-width: 680px) { .sideBar { display: none; position: absolute; z-index: 1; top: 0; height: 100vh; } .sideBar--visible { display: block; } .sideBar__background { position: absolute; margin-left: 0; padding-left: 12px; right: -12px; } .sideBar .scrollContent { width: auto; padding: 0 20px; } } .sideBar h2 { font-size: 1em; margin: 1em 0; position: relative; } .sideBar h2 a { font-weight: normal; } .sideBar .members { margin: 0 0 1em 0em; border-bottom: 1px solid #dddddd; padding-bottom: 0.5em; } .sideBar .groupTitle { color: var(--body-color); font-size: 1em; margin: 0.3em 0 0; } .t a { transition: background-color 0.15s; background-color: rgba(0, 0, 0, 0.01); border-radius: 4px; box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.08); margin: -2px -4px; padding: 2px 4px; } .t a:hover { background-color: rgba(112, 170, 220, 0.2); } .interfaceMember { padding-top: 4rem; margin-top: -5rem; } .infoHeader { color: light-dark(#555, #fff); font-size: 10px; letter-spacing: 0.25ch; line-height: 16px; margin: 1rem 0 0.125rem; text-transform: uppercase; } .docSynopsis { margin: -0.5em 0 1em; } .discussion p:first-child { margin-top: 0.5em; } .memberSignature { border-left-color: #9cdae9; background: var(--code-block-bg-color); } .t.over { border-bottom: solid 2px rgba(0, 0, 0, 0.05); padding-bottom: 3px; } .memberLabel { font-size: 1em; } @media only screen and (max-width: 680px) { .memberLabel { cursor: default; user-select: none; cursor: pointer; } } .detail { box-sizing: border-box; margin-bottom: 2.6rem; overflow: hidden; } .groupTitle { color: #9a9c9e; font-size: 1.5em; font-weight: 300; margin: 3rem 0 2rem; } @media only screen and (max-width: 680px) { .groupTitle { margin: 2em 0 1em; } } .doc { margin: 2em 0 3em; } p:last-child { margin-bottom: 0; } .memberLabel .anchorLink { display: none; margin-left: 0.25em; color: var(--anchor-link-color); } .memberLabel:hover .anchorLink { display: inline; } .devtoolsLinks { display: flex; flex-direction: row; justify-content: space-evenly; align-items: center; margin-top: 0.5rem; list-style-type: none; padding: 0; } @media only screen and (max-width: 680px) { .devtoolsLinks { flex-direction: column; } } .devtoolsLinks > li { flex: 1; text-align: center; } .devtoolsLinks img { max-width: min(150px, 100%); } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/styles/prism-theme.css������������������������������������0000664�0000000�0000000�00000010611�15220564161�0024752�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������/** * prism.js default theme for JavaScript, CSS and HTML * Based on dabblet (http://dabblet.com) * @author Lea Verou */ code[class*='language-'], pre[class*='language-'] { color: black; background: none; text-shadow: 0 1px white; font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } pre[class*='language-']::-moz-selection, pre[class*='language-'] ::-moz-selection, code[class*='language-']::-moz-selection, code[class*='language-'] ::-moz-selection { text-shadow: none; background: #b3d4fc; } pre[class*='language-']::selection, pre[class*='language-'] ::selection, code[class*='language-']::selection, code[class*='language-'] ::selection { text-shadow: none; background: #b3d4fc; } @media print { code[class*='language-'], pre[class*='language-'] { text-shadow: none; } } /* Code blocks */ pre[class*='language-'] { padding: 1em; margin: 0.5em 0; overflow: auto; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #f5f2f0; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: slategray; } .token.punctuation { color: #999; } .token.namespace { opacity: 0.7; } .token.property, .token.tag, .token.boolean, .token.number, .token.constant, .token.symbol, .token.deleted { color: #905; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #3B5C00; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string { color: #9a6e3a; /* This background color was intended by the author of this theme. */ background: hsla(0, 0%, 100%, 0.5); } .token.atrule, .token.attr-value, .token.keyword { color: #07a; } .token.function, .token.class-name { color: #9C1C39; } .token.regex, .token.important, .token.variable { color: #e90; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } @media (prefers-color-scheme: dark) { /** * okaidia theme for JavaScript, CSS and HTML * Loosely based on Monokai textmate theme by http://www.monokai.nl/ * @author ocodia */ code[class*='language-'], pre[class*='language-'] { color: #f8f8f2; background: none; text-shadow: 0 1px rgba(0, 0, 0, 0.3); font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace; font-size: 1em; text-align: left; white-space: pre; word-spacing: normal; word-break: normal; word-wrap: normal; line-height: 1.5; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; -webkit-hyphens: none; -moz-hyphens: none; -ms-hyphens: none; hyphens: none; } /* Code blocks */ pre[class*='language-'] { padding: 1em; margin: 0.5em 0; overflow: auto; border-radius: 0.3em; } :not(pre) > code[class*='language-'], pre[class*='language-'] { background: #272822; } /* Inline code */ :not(pre) > code[class*='language-'] { padding: 0.1em; border-radius: 0.3em; white-space: normal; } .token.comment, .token.prolog, .token.doctype, .token.cdata { color: #8292a2; } .token.punctuation { color: #f8f8f2; } .token.namespace { opacity: 0.7; } .token.property, .token.tag, .token.constant, .token.symbol, .token.deleted { color: #f92672; } .token.boolean, .token.number { color: #ae81ff; } .token.selector, .token.attr-name, .token.string, .token.char, .token.builtin, .token.inserted { color: #a6e22e; } .token.operator, .token.entity, .token.url, .language-css .token.string, .style .token.string, .token.variable { color: #f8f8f2; } .token.atrule, .token.attr-value, .token.function, .token.class-name { color: #e6db74; } .token.keyword { color: #66d9ef; } .token.regex, .token.important { color: #fd971f; } .token.important, .token.bold { font-weight: bold; } .token.italic { font-style: italic; } .token.entity { cursor: help; } } �����������������������������������������������������������������������������������������������������������������������immutable-js-immutable-js-6a01d72/website/tsconfig.json���������������������������������������������0000664�0000000�0000000�00000001340�15220564161�0023171�0����������������������������������������������������������������������������������������������������ustar�00root����������������������������root����������������������������0000000�0000000������������������������������������������������������������������������������������������������������������������������������������������������������������������������{ "compilerOptions": { "target": "es5", "lib": ["dom", "dom.iterable", "esnext"], "allowJs": true, "skipLibCheck": true, "strict": true, "forceConsistentCasingInFileNames": true, "noEmit": true, "esModuleInterop": true, "module": "esnext", "moduleResolution": "bundler", "resolveJsonModule": true, "isolatedModules": true, "jsx": "preserve", "incremental": true, "baseUrl": "src/", "paths": { "@/docs/*": ["../docs/*"], "@/*": ["./*"] }, "plugins": [ { "name": "next" } ] }, "include": [ "next-env.d.ts", "**/*.ts", "**/*.tsx", "src/**/*.js", ".next/types/**/*.ts" ], "exclude": ["node_modules"] } ����������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������