From 83f6ba8a3586939e4dce0a76fec4f4bf017e6246 Mon Sep 17 00:00:00 2001 From: Mark Phelps <209477+markphelps@users.noreply.github.com> Date: Tue, 9 May 2023 11:54:58 -0400 Subject: [PATCH] chore: merge main (#1600) * chore: update changelog for 1.20 release * chore(deps-dev): bump @typescript-eslint/parser in /ui (#1506) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.58.0 to 5.59.0. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.0/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump postcss from 8.4.22 to 8.4.23 in /ui (#1512) Bumps [postcss](https://github.com/postcss/postcss) from 8.4.22 to 8.4.23. - [Release notes](https://github.com/postcss/postcss/releases) - [Changelog](https://github.com/postcss/postcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/postcss/postcss/compare/8.4.22...8.4.23) --- updated-dependencies: - dependency-name: postcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/jest from 29.5.0 to 29.5.1 in /ui (#1513) Bumps [@types/jest](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/jest) from 29.5.0 to 29.5.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/jest) --- updated-dependencies: - dependency-name: "@types/jest" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/node from 18.15.11 to 18.15.12 in /ui (#1514) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.15.11 to 18.15.12. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump github.com/hashicorp/cap from 0.2.0 to 0.3.0 (#1519) Bumps [github.com/hashicorp/cap](https://github.com/hashicorp/cap) from 0.2.0 to 0.3.0. - [Release notes](https://github.com/hashicorp/cap/releases) - [Changelog](https://github.com/hashicorp/cap/blob/main/CHANGELOG.md) - [Commits](https://github.com/hashicorp/cap/compare/v0.2.0...v0.3.0) --- updated-dependencies: - dependency-name: github.com/hashicorp/cap dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: show info about configuring login providers (#1525) * chore: audit author -> actor (#1498) * chore: (wip) audit author -> actor * chore: make actor a map with the metadata in it * chore: only check certain folder when assessing diff for mage proto * chore: add test for getting metadata from auth in interceptor --------- Co-authored-by: Yoofi Quansah * chore(deps-dev): bump vite from 4.2.2 to 4.3.1 in /ui (#1516) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.2.2 to 4.3.1. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.3.1/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump eslint from 8.38.0 to 8.39.0 in /ui (#1520) Bumps [eslint](https://github.com/eslint/eslint) from 8.38.0 to 8.39.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.38.0...v8.39.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(build): mage test:ui and github action step (#1526) * chore: go work sync * feat(build): add mage test:ui step * feat(build/ui): export playright report directory on mage test:ui * feat(github): run mage test:ui during integration tests * chore: go mod tidy * fix(build): no quotes in test name --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * chore(deps): bump codecov/codecov-action from 3.1.2 to 3.1.3 (#1518) Bumps [codecov/codecov-action](https://github.com/codecov/codecov-action) from 3.1.2 to 3.1.3. - [Release notes](https://github.com/codecov/codecov-action/releases) - [Changelog](https://github.com/codecov/codecov-action/blob/main/CHANGELOG.md) - [Commits](https://github.com/codecov/codecov-action/compare/v3.1.2...v3.1.3) --- updated-dependencies: - dependency-name: codecov/codecov-action dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/react from 18.0.37 to 18.0.38 in /ui (#1522) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.0.37 to 18.0.38. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump prettier from 2.8.7 to 2.8.8 in /ui (#1521) Bumps [prettier](https://github.com/prettier/prettier) from 2.8.7 to 2.8.8. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.8.7...2.8.8) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/node from 18.15.12 to 18.16.0 in /ui (#1524) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.15.12 to 18.16.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps): bump swr from 2.1.3 to 2.1.4 in /ui (#1523) Bumps [swr](https://github.com/vercel/swr) from 2.1.3 to 2.1.4. - [Release notes](https://github.com/vercel/swr/releases) - [Commits](https://github.com/vercel/swr/compare/v2.1.3...v2.1.4) --- updated-dependencies: - dependency-name: swr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump @typescript-eslint/parser in /ui (#1532) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.0 to 5.59.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.1/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @typescript-eslint/eslint-plugin in /ui (#1531) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.0 to 5.59.1. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.1/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: add error highlighting in console (#1528) * chore: Telemetry updates (#1527) * feat: (wip) telemetry updates * chore: add more tests * chore: support DNT * chore: only disable telemetry if enabled already * chore(deps): bump swr from 2.1.4 to 2.1.5 in /ui (#1534) Bumps [swr](https://github.com/vercel/swr) from 2.1.4 to 2.1.5. - [Release notes](https://github.com/vercel/swr/releases) - [Commits](https://github.com/vercel/swr/compare/v2.1.4...v2.1.5) --- updated-dependencies: - dependency-name: swr dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/node from 18.16.0 to 18.16.1 in /ui (#1535) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.16.0 to 18.16.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump vite from 4.3.1 to 4.3.2 in /ui (#1536) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.3.1 to 4.3.2. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.3.2/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/react-dom from 18.0.11 to 18.2.1 in /ui (#1539) Bumps [@types/react-dom](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react-dom) from 18.0.11 to 18.2.1. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react-dom) --- updated-dependencies: - dependency-name: "@types/react-dom" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump tailwindcss from 3.3.1 to 3.3.2 in /ui (#1538) Bumps [tailwindcss](https://github.com/tailwindlabs/tailwindcss) from 3.3.1 to 3.3.2. - [Release notes](https://github.com/tailwindlabs/tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/tailwindcss/blob/v3.3.2/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/tailwindcss/compare/v3.3.1...v3.3.2) --- updated-dependencies: - dependency-name: tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/react from 18.0.38 to 18.2.0 in /ui (#1537) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.0.38 to 18.2.0. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: add MoJ logo, some README cleanup (#1540) * chore: update node versions in workflows; try to fix buf ratelimit (#1541) * feat: add token creation and delete authentications for audit events (#1529) * feat: add token creation and delete authentications for audit events * chore: use authgetter for getting auth to track token deletions * chore: get authentication before delete actually happens to preserve for audit logging * feat: address comments about adding event to span in lower layer * chore: add tests for actor * chore: address suggestions from PR around simplification --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * chore(deps-dev): bump @playwright/test from 1.32.3 to 1.33.0 in /ui (#1543) Bumps [@playwright/test](https://github.com/Microsoft/playwright) from 1.32.3 to 1.33.0. - [Release notes](https://github.com/Microsoft/playwright/releases) - [Commits](https://github.com/Microsoft/playwright/compare/v1.32.3...v1.33.0) --- updated-dependencies: - dependency-name: "@playwright/test" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump vite from 4.3.2 to 4.3.3 in /ui (#1542) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.3.2 to 4.3.3. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.3.3/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * fix(grpc/middleware): set timestamp on each batch evaluate response (#1545) * test(grpc/middleware): add check for non-nil timestamp in response * fix(middleware/grpc): set timestamp on each batch evaluate response * fix(grpc/middleware): set timestamp on each batch evaluate response (#1545) * test(grpc/middleware): add check for non-nil timestamp in response * fix(middleware/grpc): set timestamp on each batch evaluate response * chore: update CHANGELOG for v1.20.1 * chore: remove unnecessary newline from CHANGELOG * fix(github): install mage in release and prepend tag with v * fix(release): install mage run with multiline string * Release/1.19 (#1547) * fix(grpc/middleware): set timestamp on each batch evaluate response (#1545) * test(grpc/middleware): add check for non-nil timestamp in response * fix(middleware/grpc): set timestamp on each batch evaluate response * chore: change version text to actual latest v1.20.1 * chore: update changelog entry to reflect timestamp fixes * chore: remove versions.txt file --------- Co-authored-by: George * chore(deps-dev): bump @types/node from 18.16.1 to 18.16.2 in /ui (#1548) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.16.1 to 18.16.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: cleanup and remove print statements (#1549) * chore: add audit configuration to json schema and cue file (#1551) * feat: make changes to audit event structure (#1552) * feat: make changes to audit event structure * chore: timestamp added to Valid method * fix(cmd/flipt): restore console logger defaults on fatal (#1550) * fix(cmd/flipt): restore console logger defaults on fatal * test(cli): ensure fatal error formatted correctly * refactor(cmd/flipt): reuse common zap logger config components * test(cli): remove assertion for level * fix(cmd/flipt): use function scoped encoding var not defaultEncoding --------- Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps): bump DavidAnson/markdownlint-cli2-action from 9 to 10 (#1554) Bumps [DavidAnson/markdownlint-cli2-action](https://github.com/DavidAnson/markdownlint-cli2-action) from 9 to 10. - [Release notes](https://github.com/DavidAnson/markdownlint-cli2-action/releases) - [Commits](https://github.com/DavidAnson/markdownlint-cli2-action/compare/v9...v10) --- updated-dependencies: - dependency-name: DavidAnson/markdownlint-cli2-action dependency-type: direct:production update-type: version-update:semver-major ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @babel/preset-typescript in /ui (#1560) Bumps [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) from 7.21.4 to 7.21.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.21.5/packages/babel-preset-typescript) --- updated-dependencies: - dependency-name: "@babel/preset-typescript" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump highlight.js from 11.7.0 to 11.8.0 in /ui (#1563) Bumps [highlight.js](https://github.com/highlightjs/highlight.js) from 11.7.0 to 11.8.0. - [Release notes](https://github.com/highlightjs/highlight.js/releases) - [Changelog](https://github.com/highlightjs/highlight.js/blob/main/CHANGES.md) - [Commits](https://github.com/highlightjs/highlight.js/compare/11.7.0...11.8.0) --- updated-dependencies: - dependency-name: highlight.js dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump prettier-plugin-tailwindcss in /ui (#1561) Bumps [prettier-plugin-tailwindcss](https://github.com/tailwindlabs/prettier-plugin-tailwindcss) from 0.2.7 to 0.2.8. - [Release notes](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/releases) - [Changelog](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/blob/main/CHANGELOG.md) - [Commits](https://github.com/tailwindlabs/prettier-plugin-tailwindcss/compare/v0.2.7...v0.2.8) --- updated-dependencies: - dependency-name: prettier-plugin-tailwindcss dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump date-fns from 2.29.3 to 2.30.0 in /ui (#1564) Bumps [date-fns](https://github.com/date-fns/date-fns) from 2.29.3 to 2.30.0. - [Release notes](https://github.com/date-fns/date-fns/releases) - [Changelog](https://github.com/date-fns/date-fns/blob/v2.30.0/CHANGELOG.md) - [Commits](https://github.com/date-fns/date-fns/compare/v2.29.3...v2.30.0) --- updated-dependencies: - dependency-name: date-fns dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/node from 18.16.2 to 18.16.3 in /ui (#1562) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.16.2 to 18.16.3. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps): bump react-router-dom from 6.10.0 to 6.11.0 in /ui (#1565) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.10.0 to 6.11.0. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.11.0/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: add audit config keys to toplevel schema defs (#1566) * chore(deps-dev): bump @typescript-eslint/eslint-plugin in /ui (#1569) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.1 to 5.59.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.2/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat: modify events to return more information about entity during auditing (#1568) * feat: modify events to return more information about entity during auditing * chore: changes to Dockerfile and dagger pipelines for chowing a directory * chore: add basic tests for audit entity types * chore: use t.Helper() method in helper methods --------- Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * chore(deps-dev): bump @typescript-eslint/parser in /ui (#1571) Bumps [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) from 5.59.1 to 5.59.2. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.2/packages/parser) --- updated-dependencies: - dependency-name: "@typescript-eslint/parser" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore: update changelog for 1.21 release (#1567) * chore: update changelog for 1.21 release * chore: try to fix bareurl warning in md lint * chore: update changelog date * chore: add Loki to audit logs example (#1573) * chore: (wip) audit logs loki * chore: fix loki / promtail config * chore: update audit example readme * chore: update word * chore: Update .goreleaser.nightly.yml (#1574) * chore(deps): bump @tanstack/react-table from 8.8.5 to 8.9.0 in /ui (#1570) Bumps [@tanstack/react-table](https://github.com/tanstack/table) from 8.8.5 to 8.9.0. - [Release notes](https://github.com/tanstack/table/releases) - [Commits](https://github.com/tanstack/table/compare/v8.8.5...v8.9.0) --- updated-dependencies: - dependency-name: "@tanstack/react-table" dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump vite from 4.3.3 to 4.3.4 in /ui (#1575) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.3.3 to 4.3.4. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.3.4/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps): bump @tanstack/react-table from 8.9.0 to 8.9.1 in /ui (#1576) * chore: try again to fix the nightly build (those v's) (#1577) * chore(deps-dev): bump @types/react from 18.2.0 to 18.2.2 in /ui (#1579) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.0 to 18.2.2. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump @types/react from 18.2.2 to 18.2.5 in /ui (#1583) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.2 to 18.2.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: make sdk integrations nicer to view on README (#1582) * chore: make sdk integrations nicer to view on README * chore: update a couple lables * fix(storage/sql): paginated walk for resources using joins (#1584) * test(storage/sql): rewrite paginated walk to ensure odd total walk length * test(storage/sql): demonstrate how variants break paginated walk * fix(storage/sql): preload flags during list * fix(storage/sql): list flags escape keyword key * chore(storage/sql): use crypto/rand * chore(storage/sql): restore old limit offset pagination test * test(storage/sql): demonstrate segments full walk failure * fix(storage/sql): preload segments during list * fix(storage/sql): order variants and constraints in list flags and segments * fix(storage/sql): sleep between variant and constraint creation * test(storage/sql): demonstrate rules full walk bug * fix(storage/sql): preload rules during list * test(build/integration): extend import-export tests to cover pagination bug scenario * fix(build/integration): assert 100 flags are stored * fix(sql/mysql): reduce sleeps and quote rank * fix(build/integration): ensure rank > 0 * fix(build/integration): reduce flag list length expection to 50 * Release/1.21.1 (#1587) * chore: update changelog for 1.21 release * chore: try to fix bareurl warning in md lint * chore: update changelog date * fix(storage/sql): paginated walk for resources using joins (#1584) * test(storage/sql): rewrite paginated walk to ensure odd total walk length * test(storage/sql): demonstrate how variants break paginated walk * fix(storage/sql): preload flags during list * fix(storage/sql): list flags escape keyword key * chore(storage/sql): use crypto/rand * chore(storage/sql): restore old limit offset pagination test * test(storage/sql): demonstrate segments full walk failure * fix(storage/sql): preload segments during list * fix(storage/sql): order variants and constraints in list flags and segments * fix(storage/sql): sleep between variant and constraint creation * test(storage/sql): demonstrate rules full walk bug * fix(storage/sql): preload rules during list * test(build/integration): extend import-export tests to cover pagination bug scenario * fix(build/integration): assert 100 flags are stored * fix(sql/mysql): reduce sleeps and quote rank * fix(build/integration): ensure rank > 0 * fix(build/integration): reduce flag list length expection to 50 * chore: add changelog entry * chore: update changlog for backports --------- Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> Co-authored-by: George * chore(deps): bump react-router-dom from 6.11.0 to 6.11.1 in /ui (#1578) Bumps [react-router-dom](https://github.com/remix-run/react-router/tree/HEAD/packages/react-router-dom) from 6.11.0 to 6.11.1. - [Release notes](https://github.com/remix-run/react-router/releases) - [Changelog](https://github.com/remix-run/react-router/blob/main/packages/react-router-dom/CHANGELOG.md) - [Commits](https://github.com/remix-run/react-router/commits/react-router-dom@6.11.1/packages/react-router-dom) --- updated-dependencies: - dependency-name: react-router-dom dependency-type: direct:production update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump @types/node from 18.16.3 to 18.16.5 in /ui (#1592) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.16.3 to 18.16.5. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump eslint from 8.39.0 to 8.40.0 in /ui (#1593) Bumps [eslint](https://github.com/eslint/eslint) from 8.39.0 to 8.40.0. - [Release notes](https://github.com/eslint/eslint/releases) - [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md) - [Commits](https://github.com/eslint/eslint/compare/v8.39.0...v8.40.0) --- updated-dependencies: - dependency-name: eslint dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump vite from 4.3.4 to 4.3.5 in /ui (#1595) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.3.4 to 4.3.5. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.3.5/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * feat(constraints): Add description to constraints backend (#1581) * feat: add migrations for constraints to add description * feat: add descriptions to constraints backend * chore: add alter table commands for other databases * chore: add description to GET requests for segments/constraints * chore: change migrations to accept default value * chore: fix integration test * chore: update tests for constraint description * chore: try paranthesis around default value * chore: make description nullable * feat(ui): add optional constraint description (#1588) --------- Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/react from 18.2.5 to 18.2.6 in /ui (#1594) Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 18.2.5 to 18.2.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react) --- updated-dependencies: - dependency-name: "@types/react" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Mark Phelps <209477+markphelps@users.noreply.github.com> * chore(deps-dev): bump @typescript-eslint/eslint-plugin in /ui (#1596) Bumps [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin) from 5.59.2 to 5.59.5. - [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases) - [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md) - [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v5.59.5/packages/eslint-plugin) --- updated-dependencies: - dependency-name: "@typescript-eslint/eslint-plugin" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore(deps-dev): bump @types/node from 18.16.5 to 18.16.6 in /ui (#1597) Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 18.16.5 to 18.16.6. - [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases) - [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node) --- updated-dependencies: - dependency-name: "@types/node" dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> * chore: go mod tidy * chore: fix build/magefile --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Yoofi Quansah Co-authored-by: George Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com> --- .github/workflows/integration-test.yml | 28 + .github/workflows/lint.yml | 8 +- .github/workflows/release.yml | 2 +- .github/workflows/test.yml | 4 +- .gitignore | 1 + .goreleaser.nightly.yml | 12 +- .goreleaser.yml | 26 +- CHANGELOG.md | 47 + CODE_OF_CONDUCT.md | 2 +- Dockerfile | 5 +- README.md | 96 +- _tools/go.mod | 12 +- _tools/go.sum | 23 +- build/go.mod | 10 +- build/go.sum | 71 +- build/internal/flipt.go | 3 +- build/internal/ui.go | 2 +- build/magefile.go | 50 +- build/testing/integration.go | 34 +- build/testing/integration/api/api.go | 2 + .../integration/readonly/readonly_test.go | 17 +- .../integration/readonly/testdata/seed.yaml | 18656 +++++++++++++++- build/testing/ui.go | 31 + cmd/flipt/main.go | 68 +- config/flipt.schema.cue | 18 +- config/flipt.schema.json | 45 + .../5_constraints_with_description.up.sql | 2 + .../6_constraints_with_description.up.sql | 2 + .../8_constraints_with_description.up.sql | 2 + .../8_constraints_with_description.up.sql | 2 + examples/audit/.gitignore | 1 + examples/audit/README.md | 33 +- examples/audit/docker-compose.yml | 82 +- examples/audit/promtail.yml | 28 + examples/images/logos/loki.svg | 1 + examples/images/loki.png | Bin 0 -> 237373 bytes go.mod | 9 +- go.sum | 29 +- go.work | 2 +- go.work.sum | 345 +- internal/cmd/auth.go | 3 +- internal/cmd/grpc.go | 8 + internal/cmd/protoc-gen-go-flipt-sdk/go.mod | 3 +- internal/cmd/protoc-gen-go-flipt-sdk/go.sum | 7 +- internal/config/authentication.go | 12 + internal/server/audit/audit.go | 130 +- internal/server/audit/audit_test.go | 31 +- internal/server/audit/types.go | 152 + internal/server/audit/types_test.go | 152 + internal/server/auth/middleware.go | 7 +- internal/server/auth/server.go | 68 +- internal/server/auth/server_test.go | 15 + internal/server/middleware/grpc/middleware.go | 124 +- .../server/middleware/grpc/middleware_test.go | 187 +- .../server/middleware/grpc/support_test.go | 43 +- internal/server/segment_test.go | 26 +- internal/storage/sql/common/flag.go | 138 +- internal/storage/sql/common/rule.go | 118 +- internal/storage/sql/common/segment.go | 149 +- internal/storage/sql/flag_test.go | 78 + internal/storage/sql/migrator.go | 8 +- internal/storage/sql/rule_test.go | 102 + internal/storage/sql/segment_test.go | 117 +- internal/storage/sql/testing/testing.go | 1 + internal/telemetry/telemetry.go | 52 +- internal/telemetry/telemetry_test.go | 184 +- .../{telemetry.json => telemetry_v1.json} | 0 logos/users/uk-moj.png | Bin 0 -> 12690 bytes rpc/flipt/flipt.pb.go | 634 +- rpc/flipt/flipt.proto | 3 + rpc/flipt/go.mod | 9 +- rpc/flipt/go.sum | 16 +- sdk/go/go.mod | 6 +- sdk/go/go.sum | 9 +- test/cli.bats | 2 +- ui/index.dev.html | 40 +- ui/index.html | 24 +- ui/package-lock.json | 1154 +- ui/package.json | 38 +- ui/src/app/auth/Login.tsx | 77 +- ui/src/app/console/Console.tsx | 14 +- ui/src/app/flags/EditFlag.tsx | 2 +- ui/src/app/segments/Segment.tsx | 9 + ui/src/components/segments/ConstraintForm.tsx | 22 +- ui/src/types/Constraint.ts | 1 + ui/vite.config.ts | 8 +- 86 files changed, 22090 insertions(+), 1704 deletions(-) create mode 100644 build/testing/ui.go create mode 100644 config/migrations/cockroachdb/5_constraints_with_description.up.sql create mode 100644 config/migrations/mysql/6_constraints_with_description.up.sql create mode 100644 config/migrations/postgres/8_constraints_with_description.up.sql create mode 100644 config/migrations/sqlite3/8_constraints_with_description.up.sql create mode 100644 examples/audit/.gitignore create mode 100644 examples/audit/promtail.yml create mode 100644 examples/images/logos/loki.svg create mode 100644 examples/images/loki.png create mode 100644 internal/server/audit/types.go create mode 100644 internal/server/audit/types_test.go rename internal/telemetry/testdata/{telemetry.json => telemetry_v1.json} (100%) create mode 100644 logos/users/uk-moj.png diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 7dc2579595..0b41dcd0b4 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -109,3 +109,31 @@ jobs: name: Flipt Service Logs path: build/logs retention-days: 5 + + ui: + name: UI Integration Tests + runs-on: ubuntu-latest + timeout-minutes: 20 + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-go@v4 + with: + go-version: "1.20" + check-latest: true + cache: true + + - uses: magefile/mage-action@v2 + with: + version: latest + args: test:ui + workdir: build + + - name: Upload Playwright Report + uses: actions/upload-artifact@v3 + if: ${{ always() }} + with: + name: playwright-report + path: playwright-report/ + retention-days: 5 diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 2dad7deab9..6accf22ba2 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -33,7 +33,7 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - - uses: DavidAnson/markdownlint-cli2-action@v9 + - uses: DavidAnson/markdownlint-cli2-action@v10 with: command: config globs: | @@ -50,6 +50,7 @@ jobs: - uses: bufbuild/buf-setup-action@v1.7.0 with: version: "latest" + github_token: ${{ secrets.GITHUB_TOKEN }} - uses: bufbuild/buf-lint-action@v1 with: @@ -68,7 +69,7 @@ jobs: - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: "18" cache: "npm" cache-dependency-path: ui/package-lock.json @@ -111,6 +112,7 @@ jobs: - uses: bufbuild/buf-setup-action@v1.7.0 with: version: "latest" + github_token: ${{ secrets.GITHUB_TOKEN }} - uses: magefile/mage-action@v2 with: @@ -118,4 +120,4 @@ jobs: args: proto - name: Ensure clean git state. - run: git diff --quiet --exit-code || (echo "Please run 'mage proto' and commit changes." && exit 1) + run: git diff --quiet --exit-code sdk/ rpc/ || (echo "Please run 'mage proto' and commit changes." && exit 1) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 04953ec052..88d327e5f0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -83,7 +83,7 @@ jobs: DISCORD_WEBHOOK_TOKEN: ${{ secrets.DISCORD_WEBHOOK_TOKEN }} - name: Install Mage - run: + run: | git clone https://github.com/magefile/mage cd mage go run bootstrap.go diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 67c25fdc1d..bf34404690 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -34,7 +34,7 @@ jobs: run: go test -race -covermode=atomic -coverprofile=coverage.txt -count=1 ./... - name: Upload Coverage - uses: codecov/codecov-action@v3.1.2 + uses: codecov/codecov-action@v3.1.3 ui: name: "Tests (UI)" @@ -44,7 +44,7 @@ jobs: - uses: actions/setup-node@v3 with: - node-version: 16 + node-version: "18" cache: "npm" cache-dependency-path: ui/package-lock.json diff --git a/.gitignore b/.gitignore index 5937c34eb8..754c393158 100644 --- a/.gitignore +++ b/.gitignore @@ -42,3 +42,4 @@ Brewfile.lock.json .task/ .build/ examples/cockroachdb/data +playwright-report/ diff --git a/.goreleaser.nightly.yml b/.goreleaser.nightly.yml index bb199dc7cf..2f44170910 100644 --- a/.goreleaser.nightly.yml +++ b/.goreleaser.nightly.yml @@ -10,15 +10,15 @@ changelog: docker_manifests: - name_template: "flipt/flipt:nightly" image_templates: - - "flipt/flipt:{{ incpatch .Version }}-nightly-amd64" - - "flipt/flipt:{{ incpatch .Version }}-nightly-arm64" + - "flipt/flipt:v{{ incpatch .Version }}-nightly-amd64" + - "flipt/flipt:v{{ incpatch .Version }}-nightly-arm64" - name_template: "markphelps/flipt:nightly" image_templates: - - "flipt/flipt:{{ incpatch .Version }}-nightly-amd64" - - "flipt/flipt:{{ incpatch .Version }}-nightly-arm64" + - "flipt/flipt:v{{ incpatch .Version }}-nightly-amd64" + - "flipt/flipt:v{{ incpatch .Version }}-nightly-arm64" - name_template: "ghcr.io/flipt-io/flipt:nightly" image_templates: - - "ghcr.io/flipt-io/flipt:{{ incpatch .Version }}-nightly-amd64" - - "ghcr.io/flipt-io/flipt:{{ incpatch .Version }}-nightly-arm64" + - "ghcr.io/flipt-io/flipt:v{{ incpatch .Version }}-nightly-amd64" + - "ghcr.io/flipt-io/flipt:v{{ incpatch .Version }}-nightly-arm64" diff --git a/.goreleaser.yml b/.goreleaser.yml index 015ee2bfce..54568e9798 100644 --- a/.goreleaser.yml +++ b/.goreleaser.yml @@ -64,8 +64,8 @@ dockers: use: buildx goarch: amd64 image_templates: - - "{{ if .IsNightly }}flipt/flipt:{{ incpatch .Version }}-nightly-amd64{{ else }}flipt/flipt:v{{ .Tag }}-amd64{{ end }}" - - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:{{ incpatch .Version }}-nightly-amd64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-amd64{{ end }}" + - "{{ if .IsNightly }}flipt/flipt:v{{ incpatch .Version }}-nightly-amd64{{ else }}flipt/flipt:v{{ .Tag }}-amd64{{ end }}" + - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:v{{ incpatch .Version }}-nightly-amd64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-amd64{{ end }}" build_flag_templates: - "--platform=linux/amd64" - "--label=org.opencontainers.image.created={{.Date}}" @@ -78,8 +78,8 @@ dockers: use: buildx goarch: arm64 image_templates: - - "{{ if .IsNightly }}flipt/flipt:{{ incpatch .Version }}-nightly-arm64{{ else }}flipt/flipt:v{{ .Tag }}-arm64{{ end }}" - - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:{{ incpatch .Version }}-nightly-arm64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-arm64{{ end }}" + - "{{ if .IsNightly }}flipt/flipt:v{{ incpatch .Version }}-nightly-arm64{{ else }}flipt/flipt:v{{ .Tag }}-arm64{{ end }}" + - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:v{{ incpatch .Version }}-nightly-arm64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-arm64{{ end }}" build_flag_templates: - "--platform=linux/arm64" - "--label=org.opencontainers.image.created={{.Date}}" @@ -89,20 +89,20 @@ dockers: - config/default.yml docker_manifests: - - name_template: "{{ if .IsNightly }}flipt/flipt:{{ incpatch .Version }}-nightly{{ else }}flipt/flipt:v{{ .Tag }}{{ end }}" + - name_template: "{{ if .IsNightly }}flipt/flipt:v{{ incpatch .Version }}-nightly{{ else }}flipt/flipt:v{{ .Tag }}{{ end }}" image_templates: - - "{{ if .IsNightly }}flipt/flipt:{{ incpatch .Version }}-nightly-amd64{{ else }}flipt/flipt:v{{ .Tag }}-amd64{{ end }}" - - "{{ if .IsNightly }}flipt/flipt:{{ incpatch .Version }}-nightly-arm64{{ else }}flipt/flipt:v{{ .Tag }}-arm64{{ end }}" + - "{{ if .IsNightly }}flipt/flipt:v{{ incpatch .Version }}-nightly-amd64{{ else }}flipt/flipt:v{{ .Tag }}-amd64{{ end }}" + - "{{ if .IsNightly }}flipt/flipt:v{{ incpatch .Version }}-nightly-arm64{{ else }}flipt/flipt:v{{ .Tag }}-arm64{{ end }}" - - name_template: "{{ if .IsNightly }}markphelps/flipt:{{ incpatch .Version }}-nightly{{ else }}markphelps/flipt:v{{ .Tag }}{{ end }}" # TODO: deprecate + - name_template: "{{ if .IsNightly }}markphelps/flipt:v{{ incpatch .Version }}-nightly{{ else }}markphelps/flipt:v{{ .Tag }}{{ end }}" # TODO: deprecate image_templates: - - "{{ if .IsNightly }}flipt/flipt:{{ incpatch .Version }}-nightly-amd64{{ else }}flipt/flipt:v{{ .Tag }}-amd64{{ end }}" - - "{{ if .IsNightly }}flipt/flipt:{{ incpatch .Version }}-nightly-arm64{{ else }}flipt/flipt:v{{ .Tag }}-arm64{{ end }}" + - "{{ if .IsNightly }}flipt/flipt:v{{ incpatch .Version }}-nightly-amd64{{ else }}flipt/flipt:v{{ .Tag }}-amd64{{ end }}" + - "{{ if .IsNightly }}flipt/flipt:v{{ incpatch .Version }}-nightly-arm64{{ else }}flipt/flipt:v{{ .Tag }}-arm64{{ end }}" - - name_template: "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:{{ incpatch .Version }}-nightly{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}{{ end }}" + - name_template: "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:v{{ incpatch .Version }}-nightly{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}{{ end }}" image_templates: - - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:{{ incpatch .Version }}-nightly-amd64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-amd64{{ end }}" - - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:{{ incpatch .Version }}-nightly-arm64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-arm64{{ end }}" + - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:v{{ incpatch .Version }}-nightly-amd64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-amd64{{ end }}" + - "{{ if .IsNightly }}ghcr.io/flipt-io/flipt:v{{ incpatch .Version }}-nightly-arm64{{ else }}ghcr.io/flipt-io/flipt:v{{ .Tag }}-arm64{{ end }}" announce: discord: diff --git a/CHANGELOG.md b/CHANGELOG.md index 442d18f5cf..3315db8ec7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,41 @@ This 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). +## [v1.21.1](https://github.com/flipt-io/flipt/releases/tag/v1.21.1) - 2023-05-05 + +### Fixed + +- `storage/sql`: paginated walk for resources using joins (#1584) + +## [v1.21.0](https://github.com/flipt-io/flipt/releases/tag/v1.21.0) - 2023-05-02 + +### Added + +- OTEL implementation for audit sinks (#1458) +- Error highlighting in console (#1528) +- Additional telemetry data captured re: database, cache and authentication (#1527) + +### Fixed + +- `cmd/flipt`: restore console logger defaults on fatal (#1550) +- `grpc/middleware`: set timestamp on each batch evaluate response (#1545) + +### Changed + +- Dependency updates + +## [v1.20.2](https://github.com/flipt-io/flipt/releases/tag/v1.20.2) - 2023-05-05 + +### Fixed + +- `storage/sql`: paginated walk for resources using joins (#1584) + +## [v1.20.1](https://github.com/flipt-io/flipt/releases/tag/v1.20.1) - 2023-04-27 + +### Fixed + +- `grpc/middleware`: set timestamp on each batch evaluate response (#1545) + ## [v1.20.0](https://github.com/flipt-io/flipt/releases/tag/v1.20.0) - 2023-04-11 ### Added @@ -22,6 +57,18 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - protojson to use DiscardUnknown option for backwards compatibility (#1453) - `rpc/flipt`: move all openapi annotations into yaml file (#1437) +## [v1.19.5](https://github.com/flipt-io/flipt/releases/tag/v1.19.5) - 2023-05-05 + +### Fixed + +- `storage/sql`: paginated walk for resources using joins (#1584) + +## [v1.19.4](https://github.com/flipt-io/flipt/releases/tag/v1.19.4) - 2023-04-27 + +### Fixed + +- `grpc/middleware`: set timestamp on each batch evaluate response (#1545) + ## [v1.19.3](https://github.com/flipt-io/flipt/releases/tag/v1.19.3) - 2023-03-22 ### Changed diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index a0d610c7ca..9a87d05e96 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -55,7 +55,7 @@ further defined and clarified by project maintainers. ## Enforcement Instances of abusive, harassing, or otherwise unacceptable behavior may be -reported by contacting the project team at support@flipt.io. All +reported by contacting the project team at . All complaints will be reviewed and investigated and will result in a response that is deemed necessary and appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. diff --git a/Dockerfile b/Dockerfile index 653c757aff..178c529ffc 100644 --- a/Dockerfile +++ b/Dockerfile @@ -34,14 +34,15 @@ RUN apk add --no-cache postgresql-client \ ca-certificates RUN mkdir -p /etc/flipt && \ - mkdir -p /var/opt/flipt + mkdir -p /var/opt/flipt && \ + mkdir -p /var/log/flipt COPY --from=build /home/flipt/bin/flipt / COPY config/*.yml /etc/flipt/config/ RUN addgroup flipt && \ adduser -S -D -g '' -G flipt -s /bin/sh flipt && \ - chown -R flipt:flipt /etc/flipt /var/opt/flipt + chown -R flipt:flipt /etc/flipt /var/opt/flipt /var/log/flipt EXPOSE 8080 EXPOSE 9000 diff --git a/README.md b/README.md index d68a1dc306..c8f8caff09 100644 --- a/README.md +++ b/README.md @@ -40,8 +40,8 @@ Discord - - Public Roadmap + + Public Roadmap @@ -116,6 +116,43 @@ Flipt supports use cases such as: OpenTelemetry

+
+ +## Integration + +Check out the [integration documentation](https://flipt.io/docs/integration/) for more info on how to integrate Flipt into your existing applications. + +### REST API + +Flipt is equipped with a fully functional REST API. In fact, the Flipt UI is completely backed by this same API. This means that anything that can be done in the Flipt UI can also be done via the REST API. + +The [Flipt REST API](https://www.flipt.io/docs/reference/overview) can also be used with any language that can make HTTP requests. + +### REST Client Libraries + +| Language | Version | Status | +| -------- | ------- | ------ | +| [Go](./sdk/go) | ![Go mod](https://img.shields.io/github/go-mod/go-version/flipt-io/flipt?filename=sdk%2Fgo%2Fgo.mod&label=go) | ![stable](https://img.shields.io/badge/status-stable-green) | +| [Node/TypeScript](https://github.com/flipt-io/flipt-node) | [![npm](https://img.shields.io/npm/v/@flipt-io/flipt)](https://www.npmjs.com/package/@flipt-io/flipt) | ![status](https://img.shields.io/badge/status-hardening-orange) | +| [Java](https://github.com/flipt-io/flipt-java) | ![Maven Central](https://img.shields.io/maven-central/v/io.flipt/flipt-java) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | +| [Python](https://github.com/flipt-io/flipt-python) | [![pypi](https://img.shields.io/pypi/v/flipt.svg)](https://pypi.org/project/flipt) | ![beta](https://img.shields.io/badge/status-beta-yellow) | +| [Rust](https://github.com/flipt-io/flipt-rust) | [![crates.io](https://img.shields.io/crates/v/flipt.svg)](https://crates.io/crates/flipt) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | + +### GRPC Client Libraries + +| Language | Version | Status | +| -------- | ------- | ------ | +| [Go](./sdk/go) | ![Go mod](https://img.shields.io/github/go-mod/go-version/flipt-io/flipt?filename=sdk%2Fgo%2Fgo.mod&label=go) | ![stable](https://img.shields.io/badge/status-stable-green) | +| [Ruby](https://github.com/flipt-io/flipt-grpc-ruby) | ![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/flipt-io/flipt-grpc-ruby?color=red&label=gem&sort=semver) | ![hardening](https://img.shields.io/badge/status-hardening-orange) | + +### Generate Your Own + +If a client in your language is not available for download, you can easily generate one yourself using the existing [protobuf definition](https://github.com/flipt-io/flipt/blob/main/rpc/flipt/flipt.proto). + +Our [integration documentation](https://www.flipt.io/docs/integration) has more information on how to generate your own Flipt clients in your language of choice. + +
+ ## Try It Try the latest version of Flipt for yourself. @@ -152,52 +189,6 @@ Check out the [examples](/examples) to see how Flipt works in different use case
-## Integration - -Check out the [integration docs](https://flipt.io/docs/integration/) for more info on how to integrate Flipt into your existing applications. - -### REST API - -Flipt is equipped with a fully functional REST API. In fact, the Flipt UI is completely backed by this same API. This means that anything that can be done in the Flipt UI can also be done via the REST API. - -The [Flipt REST API](https://www.flipt.io/docs/reference/overview) can also be used with any language that can make HTTP requests. - -### REST Client Libraries - -- [Go](./sdk/go) - supports both HTTP and GRPC (configurable based on your needs) -- [Node/TypeScript](https://github.com/flipt-io/flipt-node) -- [Java](https://github.com/flipt-io/flipt-java) -- [Rust](https://github.com/flipt-io/flipt-rust) -- [Python](https://github.com/flipt-io/flipt-python) (beta) - -:exclamation: Offical REST clients in more languages coming soon. - -### GRPC Client Libraries - -- [Go](./sdk/go) - supports both HTTP and GRPC (configurable based on your needs) -- [Ruby](https://github.com/flipt-io/flipt-grpc-ruby) - -:exclamation: Offical GRPC clients in more languages coming soon. - -### Third-Party Client Libraries - -Client libraries built by awesome people from the Open Source community. - -Note: These libraries are not maintained by the Flipt team and may not be up to date with the latest version of Flipt. Please open an issue or pull request on the library’s repository if you find any issues. - -| Library | Language | Author | Desc | -| ------------------------------------------------------------------- | ---------- | -------------------------------------------------------- | ----------------------------------------------------------------------------------------------- | -| [flipt-grpc-python](https://github.com/getsentry/flipt-grpc-python) | Python | [@getsentry](https://github.com/getsentry) | Python GRPC bindings for Flipt | -| [rflipt](https://github.com/christopherdiehl/rflipt) | React | [@christopherdiehl](https://github.com/christopherdiehl) | Components/example project to control React features backed by Flipt | -| [flipt-php](https://github.com/fetzi/flipt-php) | PHP | [@fetzi](https://github.com/fetzi) | Package for evaluating feature flags via the Flipt REST API using [HTTPlug](http://httplug.io/) | -| [flipt-js](https://github.com/betrybe/flipt-js) | Javascript | [@betrybe](https://github.com/betrybe) | Flipt library for JS that allows rendering components based on Feature Flags 🎉 | - -### Generate Your Own - -If a client in your language is not available for download, you can easily generate one yourself using the existing [protobuf definition](https://github.com/flipt-io/flipt/blob/main/rpc/flipt/flipt.proto). The [GRPC documentation](https://grpc.io/docs/) has extensive examples of how to generate GRPC clients in each supported language. - -
- ## Licensing There are currently two types of licenses in place for Flipt: @@ -223,7 +214,7 @@ See [LICENSE](LICENSE). ## Logos -Some of the companies depending on Flipt in production. +Some of the organizations depending on Flipt in production.

@@ -237,10 +228,15 @@ Some of the companies depending on Flipt in production.    Prose +    + + UK Ministry of Justice

-Using Flipt at your company? Open a PR and add your logo here! +

+Using Flipt at your company? Open a [PR](https://github.com/flipt-io/flipt/pulls) and add your logo here! +


diff --git a/_tools/go.mod b/_tools/go.mod index 30151e7718..9951574ff1 100644 --- a/_tools/go.mod +++ b/_tools/go.mod @@ -41,7 +41,7 @@ require ( github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/charithe/durationcheck v0.0.9 // indirect github.com/chavacava/garif v0.0.0-20221024190013-b3ef35877348 // indirect - github.com/containerd/containerd v1.6.18 // indirect + github.com/containerd/containerd v1.6.19 // indirect github.com/containerd/typeurl v1.0.2 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect github.com/curioswitch/go-reassign v0.2.0 // indirect @@ -94,13 +94,13 @@ require ( github.com/gostaticanalysis/comment v1.4.2 // indirect github.com/gostaticanalysis/forcetypeassert v0.1.0 // indirect github.com/gostaticanalysis/nilerr v0.1.1 // indirect - github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 // indirect + github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect github.com/hashicorp/go-version v1.6.0 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/hexops/gotextdiff v1.0.3 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a // indirect github.com/jgautheron/goconst v1.5.1 // indirect github.com/jingyugao/rowserrcheck v1.1.1 // indirect @@ -149,9 +149,9 @@ require ( github.com/pkg/profile v1.6.0 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect github.com/polyfloyd/go-errorlint v1.1.0 // indirect - github.com/prometheus/client_golang v1.14.0 // indirect + github.com/prometheus/client_golang v1.15.0 // indirect github.com/prometheus/client_model v0.3.0 // indirect - github.com/prometheus/common v0.39.0 // indirect + github.com/prometheus/common v0.42.0 // indirect github.com/prometheus/procfs v0.9.0 // indirect github.com/quasilyte/go-ruleguard v0.3.19 // indirect github.com/quasilyte/gogrep v0.5.0 // indirect @@ -174,7 +174,7 @@ require ( github.com/sourcegraph/go-diff v0.7.0 // indirect github.com/spf13/afero v1.9.3 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/spf13/viper v1.15.0 // indirect diff --git a/_tools/go.sum b/_tools/go.sum index 3a5098179d..cc7ce9bb79 100644 --- a/_tools/go.sum +++ b/_tools/go.sum @@ -117,8 +117,7 @@ github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDk github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= -github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= -github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= +github.com/containerd/containerd v1.6.19 h1:F0qgQPrG0P2JPgwpxWxYavrVeXAG0ezUIB9Z/4FTUAU= github.com/containerd/typeurl v1.0.2 h1:Chlt8zIieDbzQFzXzAeBEF92KhExuE4p9p92/QmY7aY= github.com/containerd/typeurl v1.0.2/go.mod h1:9trJWW2sRlGub4wZJRTW83VtbOLS6hwcDZXTn6oPz9s= github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w= @@ -316,8 +315,7 @@ github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3 github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= github.com/gostaticanalysis/testutil v0.3.1-0.20210208050101-bfb5c8eec0e4/go.mod h1:D+FIZ+7OahH3ePw/izIEeH5I06eKs1IKI4Xr64/Am3M= github.com/gostaticanalysis/testutil v0.4.0 h1:nhdCmubdmDF6VEatUNjgUZBJKWRqugoISdUv3PPQgHY= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= -github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -336,8 +334,7 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a h1:d4+I1YEKVmWZrgkt6jpXBnLgV2ZjO0YxEtLDdfIZfH4= github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= @@ -376,7 +373,7 @@ github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxv github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= @@ -483,8 +480,7 @@ github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5Fsn github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.11.0/go.mod h1:Z6t4BnS23TR94PD6BsDNk8yVqroYurpAkEiz0P2BEV0= github.com/prometheus/client_golang v1.12.1/go.mod h1:3Z9XVyYiZYEO+YQWt3RD2R3jrbd179Rt297l4aS6nDY= -github.com/prometheus/client_golang v1.14.0 h1:nJdhIvne2eSX/XRAFV9PcvFFRbrjbcTUj0VP62TMhnw= -github.com/prometheus/client_golang v1.14.0/go.mod h1:8vpkKitgIVNcqrRBWh1C4TIUQgYNtG/XQE4E/Zae36Y= +github.com/prometheus/client_golang v1.15.0 h1:5fCgGYogn0hFdhyhLbw7hEsWxufKtY9klyvdNfFlFhM= github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= @@ -495,8 +491,7 @@ github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y8 github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB80sz/V91rCo= github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.32.1/go.mod h1:vu+V0TpY+O6vW9J44gczi3Ap/oXXR10b+M/gUGO4Hls= -github.com/prometheus/common v0.39.0 h1:oOyhkDq05hPZKItWVBkJ6g6AtGxi+fy7F4JvUV8uhsI= -github.com/prometheus/common v0.39.0/go.mod h1:6XBZ7lYdLCbkAVhwRsWTZn+IN5AB9F/NXd5w0BbEX0Y= +github.com/prometheus/common v0.42.0 h1:EKsfXEYo4JpWMHH5cg+KOUWeuJSov1Id8zGR8eeI1YM= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/procfs v0.1.3/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4OA4YeYWdaU= @@ -553,8 +548,7 @@ github.com/spf13/afero v1.9.3 h1:41FoI0fD7OR7mGcKE/aOiLkGreyf8ifIOQmJANWogMk= github.com/spf13/afero v1.9.3/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= @@ -637,15 +631,12 @@ go.opentelemetry.io/otel/metric v0.37.0 h1:pHDQuLQOZwYD+Km0eb657A25NaRzy0a+eLyKf go.opentelemetry.io/otel/metric v0.37.0/go.mod h1:DmdaHfGt54iV6UKxsV9slj2bBRJcKC1B1uvDLIioc1s= go.opentelemetry.io/otel/trace v1.14.0 h1:wp2Mmvj41tDsyAJXiWDWpfNsOiIyd38fy85pyKcFq/M= go.opentelemetry.io/otel/trace v1.14.0/go.mod h1:8avnQLK+CG77yNLUae4ea2JDQ6iT+gozhnZjy/rw9G8= -go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.10.0 h1:9qC72Qh0+3MqyJbAn8YU5xVq1frD8bn3JtD2oXtafVQ= go.uber.org/atomic v1.10.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0= go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A= go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4= -go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.10.0 h1:S0h4aNzvfcFsC3dRF1jLoaov7oRaKqRGC/pUEJ2yvPQ= go.uber.org/multierr v1.10.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y= -go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.24.0 h1:FiJd5l1UOLj0wCgbSE0rwwXHzEdAZS6hiiSnxJN/D60= go.uber.org/zap v1.24.0/go.mod h1:2kMP+WWQ8aoFoedH3T2sq6iJ2yDWpHbP0f6MQbS9Gkg= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= diff --git a/build/go.mod b/build/go.mod index f539e61671..de7dd4e519 100644 --- a/build/go.mod +++ b/build/go.mod @@ -4,7 +4,7 @@ go 1.20 require ( dagger.io/dagger v0.6.1 - github.com/containerd/containerd v1.6.18 + github.com/containerd/containerd v1.6.19 github.com/docker/docker v23.0.3+incompatible github.com/go-git/go-git/v5 v5.6.1 github.com/gofrs/uuid v4.4.0+incompatible @@ -45,10 +45,11 @@ require ( github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 // indirect github.com/iancoleman/strcase v0.2.0 // indirect github.com/imdario/mergo v0.3.13 // indirect - github.com/inconshreveable/mousetrap v1.0.1 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect github.com/kevinburke/ssh_config v1.2.0 // indirect - github.com/kr/pretty v0.3.0 // indirect + github.com/kr/pretty v0.3.1 // indirect + github.com/matryer/is v1.4.0 // indirect github.com/mattn/go-isatty v0.0.17 // indirect github.com/moby/term v0.0.0-20221205130635-1aeaba878587 // indirect github.com/opencontainers/go-digest v1.0.0 // indirect @@ -56,11 +57,10 @@ require ( github.com/pjbgf/sha1cd v0.3.0 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.0 // indirect - github.com/rogpeppe/go-internal v1.9.0 // indirect github.com/sergi/go-diff v1.1.0 // indirect github.com/sirupsen/logrus v1.9.0 // indirect github.com/skeema/knownhosts v1.1.0 // indirect - github.com/spf13/cobra v1.6.1 // indirect + github.com/spf13/cobra v1.7.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/vektah/gqlparser/v2 v2.5.1 // indirect github.com/xanzy/ssh-agent v0.3.3 // indirect diff --git a/build/go.sum b/build/go.sum index 0148a091da..ba773c7592 100644 --- a/build/go.sum +++ b/build/go.sum @@ -1,17 +1,12 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= -dagger.io/dagger v0.6.0 h1:3cN0QxS/re2RKyHW3BGyk/Hz7Ux46EfvB4zbZLA/X6o= -dagger.io/dagger v0.6.0/go.mod h1:/sSGPh+1LInVuHzTkkr1pZ5N0BAEDoqJ94eM2Xoh/iE= dagger.io/dagger v0.6.1 h1:Jup0mVQ6Fp8p47JNlFoRWvrC8jIxjPVmF5RiFRhiC34= dagger.io/dagger v0.6.1/go.mod h1:/sSGPh+1LInVuHzTkkr1pZ5N0BAEDoqJ94eM2Xoh/iE= -github.com/99designs/gqlgen v0.17.2/go.mod h1:K5fzLKwtph+FFgh9j7nFbRUdBKvTcGnsta51fsMTn3o= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v1.0.0/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= github.com/BurntSushi/toml v1.2.1 h1:9F2/+DoOYIOksmaJFPw1tGFy1eDnIJXg+UHjuD8lTak= github.com/BurntSushi/toml v1.2.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= -github.com/Khan/genqlient v0.5.0 h1:TMZJ+tl/BpbmGyIBiXzKzUftDhw4ZWxQZ+1ydn0gyII= -github.com/Khan/genqlient v0.5.0/go.mod h1:EpIvDVXYm01GP6AXzjA7dKriPTH6GmtpmvTAwUUqIX8= github.com/Khan/genqlient v0.6.0 h1:Bwb1170ekuNIVIwTJEqvO8y7RxBxXu639VJOkKSrwAk= github.com/Khan/genqlient v0.6.0/go.mod h1:rvChwWVTqXhiapdhLDV4bp9tz/Xvtewwkon4DpWWCRM= github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY= @@ -24,38 +19,30 @@ github.com/acomagu/bufpipe v1.0.4/go.mod h1:mxdxdup/WdsKVreO5GpW4+M/1CE2sMG4jeGJ github.com/adrg/xdg v0.4.0 h1:RzRqFcjH4nE5C6oTAxhBtoE2IRyjBSa62SCbyPidvls= github.com/adrg/xdg v0.4.0/go.mod h1:N6ag73EX4wyxeaoeHctc1mas01KZgsj5tYiAIwqJE/E= github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4RqaHDIsdSBg7lM= -github.com/agnivade/levenshtein v1.1.0/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= -github.com/agnivade/levenshtein v1.1.1/go.mod h1:veldBMzWxcCG2ZvUTKD2kJNRdCk5hVbJomOvKkmgYbo= github.com/alessio/shellescape v1.4.1 h1:V7yhSDDn8LP4lc4jS8pFkt0zCnzVJlG5JXy9BVKJUX0= github.com/alessio/shellescape v1.4.1/go.mod h1:PZAiSCk0LJaZkiCSkPv8qIobYglO3FPpyFjDCtHLS30= -github.com/alexflint/go-arg v1.4.2/go.mod h1:9iRbDxne7LcR/GSvEr7ma++GLpdIU1zrghf2y2768kM= -github.com/alexflint/go-scalar v1.0.0/go.mod h1:GpHzbCOZXEKMEcygYQ5n/aa4Aq84zbxjy3MxYW0gjYw= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8= github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= -github.com/arbovm/levenshtein v0.0.0-20160628152529-48b4e1c0c4d0/go.mod h1:t2tdKJDJF9BV14lnkjHmOQgcvEKgtqs5a1N3LNdJhGE= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio= github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs= -github.com/bradleyjkemp/cupaloy/v2 v2.6.0/go.mod h1:bm7JXdkRd4BHJk9HpwqAI8BoAY1lps46Enkdqw6aRX0= github.com/bwesterb/go-ristretto v1.2.0/go.mod h1:fUIoIZaG73pV5biE2Blr2xEzDoMj7NFEuV9ekS419A0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= github.com/cloudflare/circl v1.1.0 h1:bZgT/A+cikZnKIwn7xL2OBj012Bmvho/o6RpRvv3GKY= github.com/cloudflare/circl v1.1.0/go.mod h1:prBCrKB9DV4poKZY1l9zBXg2QJY7mvgRvtMxxK7fi4I= github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc= -github.com/containerd/containerd v1.6.18 h1:qZbsLvmyu+Vlty0/Ex5xc0z2YtKpIsb5n45mAMI+2Ns= -github.com/containerd/containerd v1.6.18/go.mod h1:1RdCUu95+gc2v9t3IL+zIlpClSmew7/0YS8O5eQZrOw= -github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/containerd/containerd v1.6.19 h1:F0qgQPrG0P2JPgwpxWxYavrVeXAG0ezUIB9Z/4FTUAU= +github.com/containerd/containerd v1.6.19/go.mod h1:HZCDMn4v/Xl2579/MvtOC2M206i+JJ6VxFWU/NetrGY= github.com/cpuguy83/go-md2man/v2 v2.0.1/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/dgryski/trifles v0.0.0-20200323201526-dd97f9abfb48/go.mod h1:if7Fbed8SFyPtHLHbg49SI7NAdJiC5WIA09pe59rfAA= github.com/docker/distribution v2.8.1+incompatible h1:Q50tZOPR6T/hjNsyc9g8/syEs6bk8XXApsHjKukMl68= github.com/docker/distribution v2.8.1+incompatible/go.mod h1:J2gT2udsDAN96Uj4KfcMRqY0/ypR+oyYUYmja8H+y+w= github.com/docker/docker v23.0.3+incompatible h1:9GhVsShNWz1hO//9BNg/dpMnZW25KydO4wtVxWAIbho= @@ -107,49 +94,41 @@ github.com/google/safetext v0.0.0-20220905092116-b49f7bc46da2/go.mod h1:Tv1PlzqC github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 h1:gDLXvp5S9izjldquuoAhDzccbskOL6tDC5jMSyx3zxE= github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2/go.mod h1:7pdNwVWBBHGiCxa9lAszqCJMbfTISJ7oMftp8+UGV08= -github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= github.com/iancoleman/strcase v0.2.0 h1:05I4QRnGpI0m37iZQRuskXh+w77mr6Z41lwQzuHLwW0= github.com/iancoleman/strcase v0.2.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/imdario/mergo v0.3.13 h1:lFzP57bqS/wsqKssCGmtLAb8A0wKjLGrve2q3PPVcBk= github.com/imdario/mergo v0.3.13/go.mod h1:4lJ1jqUDcsbIECGy0RUJAXNIhg+6ocWgb1ALK2O4oXg= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/inconshreveable/mousetrap v1.0.1 h1:U3uMjPSQEBMNp1lFxmllqCPM6P5u/Xq7Pgzkat/bFNc= -github.com/inconshreveable/mousetrap v1.0.1/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 h1:BQSFePA1RWJOlocH6Fxy8MmwDt+yVQYULKfN0RoTN8A= github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99/go.mod h1:1lJo3i6rXxKeerYnT8Nvf0QmHCRC1n8sfWVwXF2Frvo= github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/jessevdk/go-flags v1.5.0/go.mod h1:Fw0T6WPc1dYxT4mKEZRfG5kJhaTDP9pj1c2EWnYs/m4= github.com/kevinburke/ssh_config v1.2.0 h1:x584FjTGwHzMwvHx18PXxbBVzfnxogHaAReU4gf13a4= github.com/kevinburke/ssh_config v1.2.0/go.mod h1:CT57kijsi8u/K/BOFA39wgDQJ9CxiF4nAY/ojJ6r6mM= -github.com/kevinmbeaulieu/eq-go v1.0.0/go.mod h1:G3S8ajA56gKBZm4UB9AOyoOS37JO3roToPzKNM8dtdM= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= -github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/logrusorgru/aurora/v3 v3.0.0/go.mod h1:vsR12bk5grlLvLXAYrBsb5Oc/N+LxAlxggSjiwMnCUc= github.com/magefile/mage v1.14.0 h1:6QDX3g6z1YvJ4olPhT1wksUcSa/V0a1B+pJb73fBjyo= github.com/magefile/mage v1.14.0/go.mod h1:z5UZb/iS3GoOSn0JgWuiw7dxlurVYTu+/jHXqQg881A= -github.com/matryer/is v1.2.0 h1:92UTHpy8CDwaJ08GqLDzhhuixiBUUD1p3AU6PHddz4A= github.com/matryer/is v1.2.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA= -github.com/matryer/moq v0.2.3/go.mod h1:9RtPYjTnH1bSBIkpvtHkFN7nbWAnO7oRpdJkEIn6UtE= -github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= -github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= +github.com/matryer/is v1.4.0 h1:sosSmIWwkYITGrxZ25ULNDeKiMNzFSr4V/eqBQP0PeE= +github.com/matryer/is v1.4.0/go.mod h1:8I/i5uYgLzgsgEloJE1U6xx5HkBQpAZvepWuujKwMRU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mitchellh/mapstructure v1.2.3/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mmcloughlin/avo v0.5.0/go.mod h1:ChHFdoV7ql95Wi7vuq2YT1bwCJqiWdZrQ1im3VujLYM= github.com/moby/term v0.0.0-20221205130635-1aeaba878587 h1:HfkjXDfhgVaN5rmueG8cL8KKeFNecRCXFhaJ2qZ5SKA= github.com/moby/term v0.0.0-20221205130635-1aeaba878587/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= @@ -164,6 +143,7 @@ github.com/pelletier/go-toml v1.9.5 h1:4yBQzkHv+7BHq2PQUZF3Mx0IYxG7LsP222s7Agd3v github.com/pelletier/go-toml v1.9.5/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pjbgf/sha1cd v0.3.0 h1:4D5XXmUUBUl/xQ6IjCkEAbqXskkq/4O7LmGn0AqMDs4= github.com/pjbgf/sha1cd v0.3.0/go.mod h1:nZ1rrWOcGJ5uZgEEVL1VUM9iRQiZvWdbZjkKyFzPPsI= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -171,48 +151,38 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= -github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8= github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= -github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/sergi/go-diff v1.1.0 h1:we8PVUC3FE2uYfodKH/nBHMSetSfHDR6scGdBi+erh0= github.com/sergi/go-diff v1.1.0/go.mod h1:STckp+ISIX8hZLjrqAeVduY0gWCT9IjLuqbuNXdaHfM= -github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= github.com/sirupsen/logrus v1.7.0/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= github.com/sirupsen/logrus v1.9.0 h1:trlNQbNUG3OdDrDil03MCb1H2o9nJ1x4/5LYw7byDE0= github.com/sirupsen/logrus v1.9.0/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= github.com/skeema/knownhosts v1.1.0 h1:Wvr9V0MxhjRbl3f9nMnKnFfiWTJmtECJ9Njkea3ysW0= github.com/skeema/knownhosts v1.1.0/go.mod h1:sKFq3RD6/TKZkSWn8boUbDC7Qkgcv+8XXijpFO6roag= github.com/spf13/cobra v1.4.0/go.mod h1:Wo4iy3BUC+X2Fybo0PDqwJIv3dNRiZLHQymsfxlB84g= -github.com/spf13/cobra v1.6.1 h1:o94oiPyS4KD1mPy2fmcYYHHfCxLqYjJOhGsCHFZtEzA= -github.com/spf13/cobra v1.6.1/go.mod h1:IOw/AERYS7UzyrGinqmz6HLUo219MORXGxhbaJUqzrY= +github.com/spf13/cobra v1.7.0 h1:hyqWnYt1ZQShIddO5kBpj3vu05/++x6tJ6dg8EC572I= +github.com/spf13/cobra v1.7.0/go.mod h1:uLxZILRyS/50WlhOIKD7W6V5bgeIt+4sICxh6uRMrb0= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4= -github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= -github.com/vektah/gqlparser/v2 v2.4.0/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= -github.com/vektah/gqlparser/v2 v2.4.5/go.mod h1:flJWIR04IMQPGz+BXLrORkrARBxv/rtyIAFvd/MceW0= github.com/vektah/gqlparser/v2 v2.5.1 h1:ZGu+bquAY23jsxDRcYpWjttRZrUz07LbiY77gUOHcr4= github.com/vektah/gqlparser/v2 v2.5.1/go.mod h1:mPgqFBu/woKTVYWyNk8cO3kh4S/f4aRFZrvOnp3hmCs= github.com/xanzy/ssh-agent v0.3.3 h1:+/15pJfg/RsTxqYcX6fHqOXZwwMP+2VyYWJeWM2qQFM= github.com/xanzy/ssh-agent v0.3.3/go.mod h1:6dzNDKs0J9rVPHPhaGCukekBHKqfl+L3KghI1Bc68Uw= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= -github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= go.flipt.io/flipt v1.19.1 h1:zGxJW5yVMPiO4RxvZMuP2VxVlvUmSPjuMZJ32+tvKDU= go.flipt.io/flipt v1.19.1/go.mod h1:80CfzFVq+/KW/g834hAWubFlTzeARxR+sJgNSXI3+z4= @@ -234,8 +204,6 @@ golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvx golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro= -golang.org/x/mod v0.6.0-dev.0.20220106191415-9b9b3d81d5e3/go.mod h1:3p9vT2HGsQu2K1YbXdKPJLVgG5VJdoTa1poYQBtP1AY= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.6.0/go.mod h1:4mET923SAdbXp2ki8ey+zGs1SLqsuM2Y0uvdZR/fUNI= golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= @@ -248,11 +216,9 @@ golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= -golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= -golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= @@ -268,20 +234,14 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.1.0 h1:wsuoTGHzEhffawBOhz5CYhcrV4IdKZbEyZjBMuTp12o= -golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.2.0 h1:PUR+T4wwASmuSTYdKjYHI5TD22Wy5ogLU5qZCOLxBrI= golang.org/x/sync v0.2.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -293,9 +253,7 @@ golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211007075335-d3039528d8ac/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= @@ -305,8 +263,6 @@ golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.3.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.7.0 h1:3jlCCIQZPdOYu1h8BkNvLz8Kgwtae2cagcG/VamtZRU= -golang.org/x/sys v0.7.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0 h1:EBmGv8NaZBZTWvrbjNoL6HVt+IVy3QDQpJs7VRIw3tU= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= @@ -332,11 +288,8 @@ golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE= -golang.org/x/tools v0.0.0-20200815165600-90abf76919f3/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.9/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU= -golang.org/x/tools v0.1.10/go.mod h1:Uh6Zz+xoGYZom868N8YTex3t7RhtHDBrE8Gzo9bV56E= golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= golang.org/x/tools v0.2.0/go.mod h1:y4OqIKeOV/fWJetJ8bXPU1sEVniLMIyDAZWeHdV+NTA= golang.org/x/tools v0.8.0 h1:vSDcovVPld282ceKgDimkRSC8kpaH1dgyc9UMzlt84Y= @@ -364,13 +317,11 @@ google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQ google.golang.org/protobuf v1.30.0 h1:kPPoIgf3TsEvrm0PFe15JQ+570QVxYzEvvHqChK+cng= google.golang.org/protobuf v1.30.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20200902074654-038fdea0a05b/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= -gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/build/internal/flipt.go b/build/internal/flipt.go index 21990ed25f..cea3ab8d86 100644 --- a/build/internal/flipt.go +++ b/build/internal/flipt.go @@ -174,13 +174,14 @@ func Package(ctx context.Context, client *dagger.Client, flipt *dagger.Container return client.Container().From("alpine:3.16"). WithExec([]string{"apk", "add", "--no-cache", "postgresql-client", "openssl", "ca-certificates"}). WithExec([]string{"mkdir", "-p", "/var/opt/flipt"}). + WithExec([]string{"mkdir", "-p", "/var/log/flipt"}). WithFile("/bin/flipt", flipt.Directory(req.binary()).File("flipt")). WithFile("/etc/flipt/config/default.yml", flipt.Directory("/src/config").File("default.yml")). WithExec([]string{"addgroup", "flipt"}). WithExec([]string{"adduser", "-S", "-D", "-g", "''", "-G", "flipt", "-s", "/bin/sh", "flipt"}). - WithExec([]string{"chown", "-R", "flipt:flipt", "/etc/flipt", "/var/opt/flipt"}). + WithExec([]string{"chown", "-R", "flipt:flipt", "/etc/flipt", "/var/opt/flipt", "/var/log/flipt"}). WithUser("flipt"). WithDefaultArgs(dagger.ContainerWithDefaultArgsOpts{ Args: []string{"/bin/flipt"}, diff --git a/build/internal/ui.go b/build/internal/ui.go index d3a5dcc037..39f6f8fde8 100644 --- a/build/internal/ui.go +++ b/build/internal/ui.go @@ -23,7 +23,7 @@ func UI(ctx context.Context, client *dagger.Client) (*dagger.Container, error) { cache := client.CacheVolume(fmt.Sprintf("node-modules-%x", sha256.Sum256([]byte(contents)))) - return client.Container().From("node:18-alpine3.16"). + return client.Container().From("node:18"). WithMountedDirectory("/src", src).WithWorkdir("/src"). WithMountedCache("./ui/node_modules", cache). WithExec([]string{"npm", "ci"}). diff --git a/build/magefile.go b/build/magefile.go index c787660a2a..0560f7faf0 100644 --- a/build/magefile.go +++ b/build/magefile.go @@ -37,7 +37,7 @@ func (b Build) Flipt(ctx context.Context) error { return err } - req, err := newRequest(ctx, client, platform) + req, _, err := newRequest(ctx, client, platform) if err != nil { return err } @@ -88,7 +88,7 @@ func (b Build) Base(ctx context.Context) error { return err } - req, err := newRequest(ctx, client, platform) + req, _, err := newRequest(ctx, client, platform) if err != nil { return err } @@ -134,7 +134,7 @@ func (t Test) Unit(ctx context.Context) error { return err } - req, err := newRequest(ctx, client, platform) + req, _, err := newRequest(ctx, client, platform) if err != nil { return err } @@ -161,7 +161,7 @@ func (t Test) Database(ctx context.Context, db string) error { return err } - req, err := newRequest(ctx, client, platform) + req, _, err := newRequest(ctx, client, platform) if err != nil { return err } @@ -190,7 +190,7 @@ func (t Test) Integration(ctx context.Context) error { return err } - req, err := newRequest(ctx, client, platform) + req, _, err := newRequest(ctx, client, platform) if err != nil { return err } @@ -208,6 +208,38 @@ func (t Test) Integration(ctx context.Context) error { return testing.Integration(ctx, client, base, flipt) } +// UI runs the entire integration test suite for the UI. +func (t Test) UI(ctx context.Context) error { + client, err := daggerClient(ctx) + if err != nil { + return err + } + + defer client.Close() + + platform, err := client.DefaultPlatform(ctx) + if err != nil { + return err + } + + req, ui, err := newRequest(ctx, client, platform) + if err != nil { + return err + } + + base, err := internal.Base(ctx, client, req) + if err != nil { + return err + } + + flipt, err := internal.Package(ctx, client, base, req) + if err != nil { + return err + } + + return testing.UI(ctx, client, ui, flipt) +} + type Release mg.Namespace func (r Release) Next(ctx context.Context, module, versionParts string) error { @@ -245,7 +277,7 @@ func (p Publish) Flipt(ctx context.Context, target string) error { return err } - req, err := newRequest(ctx, client, platform) + req, _, err := newRequest(ctx, client, platform) if err != nil { return err } @@ -280,16 +312,16 @@ func daggerClient(ctx context.Context) (*dagger.Client, error) { ) } -func newRequest(ctx context.Context, client *dagger.Client, platform dagger.Platform) (internal.FliptRequest, error) { +func newRequest(ctx context.Context, client *dagger.Client, platform dagger.Platform) (internal.FliptRequest, *dagger.Container, error) { ui, err := internal.UI(ctx, client) if err != nil { - return internal.FliptRequest{}, err + return internal.FliptRequest{}, nil, err } // write contents of container dist/ directory to the host dist := ui.Directory("./dist") - return internal.NewFliptRequest(dist, platform, internal.WithWorkDir(workDir())), nil + return internal.NewFliptRequest(dist, platform, internal.WithWorkDir(workDir())), ui, nil } func workDir() string { diff --git a/build/testing/integration.go b/build/testing/integration.go index c408b8d796..80d412e544 100644 --- a/build/testing/integration.go +++ b/build/testing/integration.go @@ -40,25 +40,23 @@ func Integration(ctx context.Context, client *dagger.Client, base, flipt *dagger var cases []testConfig - for _, namespace := range []string{ - "", - fmt.Sprintf("%x", rand.Int()), - } { + for _, namespace := range []string{"", fmt.Sprintf("%x", rand.Int())} { for protocol, port := range protocolPorts { - address := fmt.Sprintf("%s://flipt:%s", protocol, port) - cases = append(cases, - testConfig{ - name: fmt.Sprintf("%s namespace %s no authentication", strings.ToUpper(protocol), namespace), - namespace: namespace, - address: address, - }, - testConfig{ - name: fmt.Sprintf("%s namespace %s with authentication", strings.ToUpper(protocol), namespace), - namespace: namespace, - address: address, - token: "some-token", - }, - ) + for _, token := range []string{"", "some-token"} { + name := fmt.Sprintf("%s namespace %s", strings.ToUpper(protocol), namespace) + if token != "" { + name = fmt.Sprintf("%s with token %s", name, token) + } + + cases = append(cases, + testConfig{ + name: name, + namespace: namespace, + address: fmt.Sprintf("%s://flipt:%s", protocol, port), + token: token, + }, + ) + } } } diff --git a/build/testing/integration/api/api.go b/build/testing/integration/api/api.go index a11c6abdcd..361704c85b 100644 --- a/build/testing/integration/api/api.go +++ b/build/testing/integration/api/api.go @@ -266,6 +266,7 @@ func API(t *testing.T, client sdk.SDK, namespace string) { Property: retrievedSegment.Constraints[0].Property, Operator: retrievedSegment.Constraints[0].Operator, Value: "baz", + Description: "newdesc", }) require.NoError(t, err) @@ -273,6 +274,7 @@ func API(t *testing.T, client sdk.SDK, namespace string) { assert.Equal(t, "foo", updatedConstraint.Property) assert.Equal(t, "eq", updatedConstraint.Operator) assert.Equal(t, "baz", updatedConstraint.Value) + assert.Equal(t, "newdesc", updatedConstraint.Description) }) t.Run("Rules and Distributions", func(t *testing.T) { diff --git a/build/testing/integration/readonly/readonly_test.go b/build/testing/integration/readonly/readonly_test.go index ce82dcd30a..4d8c4170e6 100644 --- a/build/testing/integration/readonly/readonly_test.go +++ b/build/testing/integration/readonly/readonly_test.go @@ -36,27 +36,24 @@ func TestReadOnly(t *testing.T) { }) require.NoError(t, err) - require.Len(t, flags.Flags, 1) + require.Len(t, flags.Flags, 50) flag := flags.Flags[0] assert.Equal(t, namespace, flag.NamespaceKey) - assert.Equal(t, "color", flag.Key) - assert.Equal(t, "Color", flag.Name) - assert.Equal(t, "This flag represents two colors.", flag.Description) + assert.Equal(t, "flag_001", flag.Key) + assert.Equal(t, "FLAG_001", flag.Name) + assert.Equal(t, "Some Description", flag.Description) assert.True(t, flag.Enabled) require.Len(t, flag.Variants, 2) - assert.Equal(t, "blue", flag.Variants[0].Key) - assert.Equal(t, "Blue", flag.Variants[0].Name) - - assert.Equal(t, "red", flag.Variants[1].Key) - assert.Equal(t, "Red", flag.Variants[1].Name) + assert.Equal(t, "variant_1", flag.Variants[0].Key) + assert.Equal(t, "variant_2", flag.Variants[1].Key) segments, err := sdk.Flipt().ListSegments(ctx, &flipt.ListSegmentRequest{ NamespaceKey: namespace, }) - require.Len(t, segments.Segments, 2) + require.Len(t, segments.Segments, 50) }) } diff --git a/build/testing/integration/readonly/testdata/seed.yaml b/build/testing/integration/readonly/testdata/seed.yaml index 0aacd817e1..accec60cef 100644 --- a/build/testing/integration/readonly/testdata/seed.yaml +++ b/build/testing/integration/readonly/testdata/seed.yaml @@ -1,46 +1,18652 @@ flags: -- key: color - name: Color - description: This flag represents two colors. +- key: flag_001 + name: FLAG_001 + description: Some Description enabled: true variants: - - key: blue - name: Blue - - key: red - name: Red + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 rules: - - segment: team-red + - segment: segment_001 rank: 1 distributions: - - variant: red + - variant: variant_1 rollout: 100 - - segment: team-blue + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_002 + name: FLAG_002 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_003 + name: FLAG_003 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_004 + name: FLAG_004 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_005 + name: FLAG_005 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_006 + name: FLAG_006 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_007 + name: FLAG_007 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_008 + name: FLAG_008 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_009 + name: FLAG_009 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_010 + name: FLAG_010 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_011 + name: FLAG_011 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_012 + name: FLAG_012 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_013 + name: FLAG_013 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_014 + name: FLAG_014 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_015 + name: FLAG_015 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_016 + name: FLAG_016 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_017 + name: FLAG_017 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_018 + name: FLAG_018 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_019 + name: FLAG_019 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_020 + name: FLAG_020 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_021 + name: FLAG_021 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_022 + name: FLAG_022 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_023 + name: FLAG_023 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_024 + name: FLAG_024 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_025 + name: FLAG_025 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_026 + name: FLAG_026 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_027 + name: FLAG_027 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_028 + name: FLAG_028 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_029 + name: FLAG_029 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_030 + name: FLAG_030 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_031 + name: FLAG_031 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_032 + name: FLAG_032 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_033 + name: FLAG_033 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_034 + name: FLAG_034 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_035 + name: FLAG_035 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_036 + name: FLAG_036 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_037 + name: FLAG_037 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_038 + name: FLAG_038 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_039 + name: FLAG_039 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_040 + name: FLAG_040 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_041 + name: FLAG_041 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_042 + name: FLAG_042 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_043 + name: FLAG_043 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_044 + name: FLAG_044 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_045 + name: FLAG_045 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_046 + name: FLAG_046 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_047 + name: FLAG_047 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_048 + name: FLAG_048 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_049 + name: FLAG_049 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 2 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 +- key: flag_050 + name: FLAG_050 + description: Some Description + enabled: true + variants: + - key: variant_1 + name: VARIANT_1 + - key: variant_2 + name: VARIANT_2 + rules: + - segment: segment_001 + rank: 1 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 rank: 2 distributions: - - variant: blue + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 3 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 4 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 5 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 6 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 7 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 8 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 9 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 10 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 11 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 12 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 13 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 14 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 15 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 16 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 17 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 18 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 19 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 20 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 21 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 22 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 23 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 24 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 25 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 26 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 27 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 28 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 29 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 30 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 31 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 32 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 33 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 34 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 35 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 36 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 37 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 38 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 39 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 40 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 41 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 42 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 43 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 44 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 45 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 46 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 47 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 48 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 49 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 + rollout: 100 + - segment: segment_001 + rank: 50 + distributions: + - variant: variant_1 + rollout: 100 + - variant: variant_1 rollout: 100 segments: -- key: team-red - name: Red Team +- key: segment_001 + name: SEGMENT_001 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_002 + name: SEGMENT_002 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_003 + name: SEGMENT_003 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_004 + name: SEGMENT_004 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_005 + name: SEGMENT_005 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_006 + name: SEGMENT_006 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_007 + name: SEGMENT_007 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_008 + name: SEGMENT_008 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_009 + name: SEGMENT_009 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_010 + name: SEGMENT_010 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_011 + name: SEGMENT_011 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_012 + name: SEGMENT_012 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_013 + name: SEGMENT_013 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_014 + name: SEGMENT_014 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_015 + name: SEGMENT_015 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_016 + name: SEGMENT_016 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_017 + name: SEGMENT_017 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_018 + name: SEGMENT_018 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_019 + name: SEGMENT_019 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_020 + name: SEGMENT_020 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_021 + name: SEGMENT_021 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_022 + name: SEGMENT_022 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_023 + name: SEGMENT_023 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_024 + name: SEGMENT_024 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_025 + name: SEGMENT_025 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_026 + name: SEGMENT_026 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_027 + name: SEGMENT_027 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_028 + name: SEGMENT_028 + description: Some Segment Description constraints: - type: STRING_COMPARISON_TYPE - property: favourite_color + property: foo operator: eq - value: red + value: bar - type: STRING_COMPARISON_TYPE - property: favourite_color - operator: neq - value: blue + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_029 + name: SEGMENT_029 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_030 + name: SEGMENT_030 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_031 + name: SEGMENT_031 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_032 + name: SEGMENT_032 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_033 + name: SEGMENT_033 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_034 + name: SEGMENT_034 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_035 + name: SEGMENT_035 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_036 + name: SEGMENT_036 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_037 + name: SEGMENT_037 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_038 + name: SEGMENT_038 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_039 + name: SEGMENT_039 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_040 + name: SEGMENT_040 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_041 + name: SEGMENT_041 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_042 + name: SEGMENT_042 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_043 + name: SEGMENT_043 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_044 + name: SEGMENT_044 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_045 + name: SEGMENT_045 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_046 + name: SEGMENT_046 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_047 + name: SEGMENT_047 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_048 + name: SEGMENT_048 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + match_type: ALL_MATCH_TYPE +- key: segment_049 + name: SEGMENT_049 + description: Some Segment Description + constraints: + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar + - type: STRING_COMPARISON_TYPE + property: foo + operator: eq + value: bar match_type: ALL_MATCH_TYPE -- key: team-blue - name: Blue Team +- key: segment_050 + name: SEGMENT_050 + description: Some Segment Description constraints: - type: STRING_COMPARISON_TYPE - property: favourite_color + property: foo operator: eq - value: blue + value: bar - type: STRING_COMPARISON_TYPE - property: favourite_color - operator: neq - value: red + property: foo + operator: eq + value: bar match_type: ALL_MATCH_TYPE diff --git a/build/testing/ui.go b/build/testing/ui.go new file mode 100644 index 0000000000..6ce3122649 --- /dev/null +++ b/build/testing/ui.go @@ -0,0 +1,31 @@ +package testing + +import ( + "context" + "time" + + "dagger.io/dagger" +) + +func UI(ctx context.Context, client *dagger.Client, ui, flipt *dagger.Container) error { + test := ui. + WithExec([]string{"npx", "playwright", "install", "chromium", "--with-deps"}). + WithServiceBinding("flipt", flipt. + WithEnvVariable("FLIPT_AUTHENTICATION_METHODS_TOKEN_ENABLED", "true"). + WithEnvVariable("UNIQUE", time.Now().String()). + WithExec(nil)). + WithEnvVariable("FLIPT_ADDRESS", "http://flipt:8080"). + WithExec([]string{"npx", "playwright", "test"}) + _, err := test.ExitCode(ctx) + if err != nil { + return err + } + + if _, err := test. + Directory("playwright-report"). + Export(ctx, "playwright-report"); err != nil { + return err + } + + return nil +} diff --git a/cmd/flipt/main.go b/cmd/flipt/main.go index b2e9a66d35..64d715d785 100644 --- a/cmd/flipt/main.go +++ b/cmd/flipt/main.go @@ -43,7 +43,35 @@ var ( banner string ) -var fatal = zap.Must(zap.NewProduction()).Fatal +var ( + defaultEncoding = zapcore.EncoderConfig{ + // Keys can be anything except the empty string. + TimeKey: "T", + LevelKey: "L", + NameKey: "N", + CallerKey: zapcore.OmitKey, + FunctionKey: zapcore.OmitKey, + MessageKey: "M", + StacktraceKey: zapcore.OmitKey, + LineEnding: zapcore.DefaultLineEnding, + EncodeLevel: zapcore.CapitalColorLevelEncoder, + EncodeTime: zapcore.RFC3339TimeEncoder, + EncodeDuration: zapcore.StringDurationEncoder, + EncodeCaller: zapcore.ShortCallerEncoder, + } + fatal = zap.Must(defaultConfig(defaultEncoding).Build()).Fatal +) + +func defaultConfig(encoding zapcore.EncoderConfig) zap.Config { + return zap.Config{ + Level: zap.NewAtomicLevelAt(zap.InfoLevel), + Development: false, + Encoding: "console", + EncoderConfig: encoding, + OutputPaths: []string{"stdout"}, + ErrorOutputPaths: []string{"stderr"}, + } +} func main() { var ( @@ -140,28 +168,12 @@ func buildConfig() (*zap.Logger, *config.Config) { cfg := res.Config - loggerConfig := zap.Config{ - Level: zap.NewAtomicLevelAt(zap.InfoLevel), - Development: false, - Encoding: "console", - EncoderConfig: zapcore.EncoderConfig{ - // Keys can be anything except the empty string. - TimeKey: cfg.Log.Keys.Time, - LevelKey: cfg.Log.Keys.Level, - NameKey: "N", - CallerKey: zapcore.OmitKey, - FunctionKey: zapcore.OmitKey, - MessageKey: cfg.Log.Keys.Message, - StacktraceKey: zapcore.OmitKey, - LineEnding: zapcore.DefaultLineEnding, - EncodeLevel: zapcore.CapitalColorLevelEncoder, - EncodeTime: zapcore.RFC3339TimeEncoder, - EncodeDuration: zapcore.StringDurationEncoder, - EncodeCaller: zapcore.ShortCallerEncoder, - }, - OutputPaths: []string{"stdout"}, - ErrorOutputPaths: []string{"stderr"}, - } + encoding := defaultEncoding + encoding.TimeKey = cfg.Log.Keys.Time + encoding.LevelKey = cfg.Log.Keys.Level + encoding.MessageKey = cfg.Log.Keys.Message + + loggerConfig := defaultConfig(encoding) // log to file if enabled if cfg.Log.File != "" { @@ -231,12 +243,18 @@ func run(ctx context.Context, logger *zap.Logger, cfg *config.Config) error { } } - if os.Getenv("CI") == "true" || os.Getenv("CI") == "1" { + // see: https://consoledonottrack.com/ + if (os.Getenv("DO_NOT_TRACK") == "true" || os.Getenv("DO_NOT_TRACK") == "1") && cfg.Meta.TelemetryEnabled { + logger.Debug("DO_NOT_TRACK environment variable set, disabling telemetry") + cfg.Meta.TelemetryEnabled = false + } + + if (os.Getenv("CI") == "true" || os.Getenv("CI") == "1") && cfg.Meta.TelemetryEnabled { logger.Debug("CI detected, disabling telemetry") cfg.Meta.TelemetryEnabled = false } - if !isRelease { + if !isRelease && cfg.Meta.TelemetryEnabled { logger.Debug("not a release version, disabling telemetry") cfg.Meta.TelemetryEnabled = false } diff --git a/config/flipt.schema.cue b/config/flipt.schema.cue index d3408ffa5a..8e5be8dea6 100644 --- a/config/flipt.schema.cue +++ b/config/flipt.schema.cue @@ -9,6 +9,7 @@ import "strings" // Flipt application. @jsonschema(schema="http://json-schema.org/draft/2019-09/schema#") version?: "1.0" | *"1.0" + audit?: #audit authentication?: #authentication cache?: #cache cors?: #cors @@ -33,8 +34,8 @@ import "strings" enabled?: bool | *false cleanup?: #authentication.#authentication_cleanup bootstrap?: { - token?: string - expiration: =~"^([0-9]+(ns|us|µs|ms|s|m|h))+$" | int + token?: string + expiration: =~"^([0-9]+(ns|us|µs|ms|s|m|h))+$" | int } } @@ -157,4 +158,17 @@ import "strings" } #ui: enabled?: bool | *true + + #audit: { + sinks?: { + log?: { + enabled?: bool | *false + file?: string | *"" + } + } + buffer?: { + capacity?: int | *2 + flush_period?: string | *"2m" + } + } } diff --git a/config/flipt.schema.json b/config/flipt.schema.json index f509e5aa9b..b23c33e189 100644 --- a/config/flipt.schema.json +++ b/config/flipt.schema.json @@ -11,6 +11,9 @@ "enum": ["1.0"], "default": "1.0" }, + "audit": { + "$ref": "#/definitions/audit" + }, "authentication": { "$ref": "#/definitions/authentication" }, @@ -519,6 +522,48 @@ } }, "title": "UI" + }, + "audit": { + "type": "object", + "additionalProperties": false, + "properties": { + "sinks": { + "type": "object", + "additionalProperties": false, + "properties": { + "log": { + "type": "object", + "additionalProperties": false, + "properties": { + "enabled": { + "type": "boolean", + "default": false + }, + "file": { + "type": "string", + "default": "" + } + }, + "title": "Log File" + } + } + }, + "buffer": { + "type": "object", + "additionalProperties": false, + "properties": { + "capacity": { + "type": "integer", + "default": 2 + }, + "flush_period": { + "type": "string", + "default": "2m" + } + } + } + }, + "title": "Audit" } } } diff --git a/config/migrations/cockroachdb/5_constraints_with_description.up.sql b/config/migrations/cockroachdb/5_constraints_with_description.up.sql new file mode 100644 index 0000000000..4b77d4c5f9 --- /dev/null +++ b/config/migrations/cockroachdb/5_constraints_with_description.up.sql @@ -0,0 +1,2 @@ +-- Add description column to constraints +ALTER TABLE constraints ADD COLUMN description TEXT; \ No newline at end of file diff --git a/config/migrations/mysql/6_constraints_with_description.up.sql b/config/migrations/mysql/6_constraints_with_description.up.sql new file mode 100644 index 0000000000..4b77d4c5f9 --- /dev/null +++ b/config/migrations/mysql/6_constraints_with_description.up.sql @@ -0,0 +1,2 @@ +-- Add description column to constraints +ALTER TABLE constraints ADD COLUMN description TEXT; \ No newline at end of file diff --git a/config/migrations/postgres/8_constraints_with_description.up.sql b/config/migrations/postgres/8_constraints_with_description.up.sql new file mode 100644 index 0000000000..4b77d4c5f9 --- /dev/null +++ b/config/migrations/postgres/8_constraints_with_description.up.sql @@ -0,0 +1,2 @@ +-- Add description column to constraints +ALTER TABLE constraints ADD COLUMN description TEXT; \ No newline at end of file diff --git a/config/migrations/sqlite3/8_constraints_with_description.up.sql b/config/migrations/sqlite3/8_constraints_with_description.up.sql new file mode 100644 index 0000000000..4b77d4c5f9 --- /dev/null +++ b/config/migrations/sqlite3/8_constraints_with_description.up.sql @@ -0,0 +1,2 @@ +-- Add description column to constraints +ALTER TABLE constraints ADD COLUMN description TEXT; \ No newline at end of file diff --git a/examples/audit/.gitignore b/examples/audit/.gitignore new file mode 100644 index 0000000000..2dd281a811 --- /dev/null +++ b/examples/audit/.gitignore @@ -0,0 +1 @@ +loki/ \ No newline at end of file diff --git a/examples/audit/README.md b/examples/audit/README.md index e307fe4610..85cbe41e6e 100644 --- a/examples/audit/README.md +++ b/examples/audit/README.md @@ -1,29 +1,23 @@ -# Audit Event Logging Example +

+ Grafana Loki +

-**This feature is still under development, and this example is subject to change.** +# Audit Event Logging / Grafana Loki Example -This example shows how you can run Flipt with Audit Event logging enabled to a file on disk. +This example shows how you can run Flipt with audit event logging enabled to a file using the `log` audit sink. This works by setting the two environment variables `FLIPT_AUDIT_SINKS_LOG_ENABLED` and `FLIPT_AUDIT_SINKS_LOG_FILE`: -```bash -FLIPT_AUDIT_SINKS_LOG_ENABLED=true -FLIPT_AUDIT_SINKS_LOG_FILE=/var/log/audit.log -``` - -The auditable events currently are CRUD (except for read) operations on `flags`, `variants`, `segments`, `constraints`, `rules`, `distributions`, and `namespaces`. If you do any of these operations through the API, it should emit an audit event log to the specified location. - -Since docker containers are ephemeral and data within the container is lost when the container exits, we mount a local file on the host to the audit event log location in the container as a volume. You would have to create the file [first](https://github.com/moby/moby/issues/21612#issuecomment-202984678) before starting the container: +**Note**: Support for audit events were added in [v1.21.0](https://github.com/flipt-io/flipt/releases/tag/v1.21.0) of Flipt. ```bash -mkdir -p /tmp/flipt && touch /tmp/flipt/audit.log +FLIPT_AUDIT_SINKS_LOG_ENABLED=true +FLIPT_AUDIT_SINKS_LOG_FILE=/var/log/flipt/audit.log ``` -and `tail` the logs as you are making API requests to the Flipt server when the container is running. +The auditable events currently are `create`, `update`, and `delete` operations on `flags`, `variants`, `segments`, `constraints`, `rules`, `distributions`, `namespaces`, and `tokens`. If you do any of these operations through the API, Flipt will emit an audit event log to the specified location. -```bash -tail -f /tmp/flipt/audit.log -``` +In this example, we are using Grafana's [Loki](https://grafana.com/docs/loki/latest/) to scrape, aggregate, and label the audit logs on the container and index them for searching via the Grafana/Loki integration. ## Requirements @@ -36,3 +30,10 @@ To run this example application you'll need: 1. Run `docker-compose up` from this directory 1. Open the Flipt UI (default: [http://localhost:8080](http://localhost:8080)) +1. Create some sample data: Flags/Segments/etc. +1. Open the Grafana Explore UI (default: [http://localhost:3000/explore](http://localhost:3000/explore)) +1. Enter a sample query in the 'code' input, ex: `{type="flag"} |= `` | json` and click 'Run Query'. +1. You should see a table of audit events for flags. You can change the `type` label to `segment`, `variant`, etc. to see other types of audit events and also change the `action` label as well to filter on event actions such as `created`, `updated`, and `deleted`. +1. The Loki docs have more information on how to query and filter the logs: [https://grafana.com/docs/loki/latest/logql/](https://grafana.com/docs/loki/latest/logql/) + +!['Audit Events/Loki Example'](../images/loki.png) diff --git a/examples/audit/docker-compose.yml b/examples/audit/docker-compose.yml index 6cfd696cb5..ca3440a1d0 100644 --- a/examples/audit/docker-compose.yml +++ b/examples/audit/docker-compose.yml @@ -2,13 +2,89 @@ version: "3" services: flipt: - build: ../../ + image: flipt/flipt:latest command: ["./flipt", "--force-migrate"] volumes: - - /tmp/flipt/audit.log:/var/log/audit.log + - ./loki/:/var/log/ ports: - "8080:8080" environment: - FLIPT_LOG_LEVEL=debug - FLIPT_AUDIT_SINKS_LOG_ENABLED=true - - FLIPT_AUDIT_SINKS_LOG_FILE=/var/log/audit.log + - FLIPT_AUDIT_SINKS_LOG_FILE=/var/log/flipt/audit.log + - FLIPT_META_TELMETRY_ENABLED=false + networks: + - flipt_network + + # Since the Loki containers are running as user 10001 and the mounted data volume is owned by root, + # Loki would not have permissions to create the directories. + # Therefore the init container changes permissions of the mounted directory. + init: + image: grafana/loki:2.7.3 + user: root + entrypoint: + - "chown" + - "10001:10001" + - "/loki" + volumes: + - ./loki:/loki + networks: + - flipt_network + + promtail: + image: grafana/promtail:2.7.4 + volumes: + - ./loki/:/var/log/ + - ./promtail.yml:/etc/promtail/promtail.yml + ports: + - "9080:9080" + command: -config.file=/etc/promtail/promtail.yml + networks: + - flipt_network + + loki: + image: grafana/loki:2.7.3 + volumes: + - ./loki/:/loki + ports: + - "3100:3100" + command: -config.file=/etc/loki/local-config.yaml + depends_on: + - init + - promtail + networks: + - flipt_network + + grafana: + environment: + - GF_PATHS_PROVISIONING=/etc/grafana/provisioning + - GF_AUTH_ANONYMOUS_ENABLED=true + - GF_AUTH_ANONYMOUS_ORG_ROLE=Admin + entrypoint: + - sh + - -euc + - | + mkdir -p /etc/grafana/provisioning/datasources + cat < /etc/grafana/provisioning/datasources/ds.yaml + apiVersion: 1 + datasources: + - name: Loki + type: loki + access: proxy + orgId: 1 + url: http://loki:3100 + uid: loki + basicAuth: false + isDefault: true + version: 1 + editable: false + EOF + /run.sh + image: grafana/grafana:latest + ports: + - "3000:3000" + networks: + - flipt_network + +networks: + flipt_network: diff --git a/examples/audit/promtail.yml b/examples/audit/promtail.yml new file mode 100644 index 0000000000..a6ae4c3d96 --- /dev/null +++ b/examples/audit/promtail.yml @@ -0,0 +1,28 @@ +server: + http_listen_port: 9080 + grpc_listen_port: 0 + log_level: "info" + +positions: + filename: /tmp/positions.yaml + +clients: + - url: http://loki:3100/loki/api/v1/push + tenant_id: docker + +scrape_configs: + - job_name: flipt-audit-logs + static_configs: + - targets: + - localhost + labels: + job: flipt-audit-logs + __path__: /var/log/flipt/*.log + pipeline_stages: + - json: + expressions: + type: "type" + action: "action" + - labels: + type: + action: diff --git a/examples/images/logos/loki.svg b/examples/images/logos/loki.svg new file mode 100644 index 0000000000..f86bd9cabd --- /dev/null +++ b/examples/images/logos/loki.svg @@ -0,0 +1 @@ +Grafana Loki logo \ No newline at end of file diff --git a/examples/images/loki.png b/examples/images/loki.png new file mode 100644 index 0000000000000000000000000000000000000000..62905b163a660790aaf3727079a98b0f9ae08815 GIT binary patch literal 237373 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 eEkuLJ0V4l-NCVATQ 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

M7?yb9~6PZ=?U*d8?s6|`P?MrO+%-wYXx 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 o0QQY?PkBK2--tnhfA|^Qz9$Ot22KLH0{kdFQ 0 { + actor["ip"] = md[ipKey][0] + } + + auth := GetAuthenticationFrom(ctx) + if auth != nil { + authentication = strings.ToLower(strings.TrimPrefix(auth.Method.String(), "METHOD_")) + for k, v := range auth.Metadata { + actor[k] = v + } + } + + actor["authentication"] = authentication + return actor +} + // Server is the core AuthenticationServiceServer implementations. // // It is the service which presents all Authentications created in the backing auth store. @@ -22,14 +53,31 @@ type Server struct { logger *zap.Logger store storageauth.Store + enableAuditLogging bool + auth.UnimplementedAuthenticationServiceServer } -func NewServer(logger *zap.Logger, store storageauth.Store) *Server { - return &Server{ +type Option func(*Server) + +// WithAuditLoggingEnabled sets the option for enabling audit logging for the auth server. +func WithAuditLoggingEnabled(enabled bool) Option { + return func(s *Server) { + s.enableAuditLogging = enabled + } +} + +func NewServer(logger *zap.Logger, store storageauth.Store, opts ...Option) *Server { + s := &Server{ logger: logger, store: store, } + + for _, opt := range opts { + opt(s) + } + + return s } // RegisterGRPC registers the server as an Server on the provided grpc server. @@ -83,6 +131,22 @@ func (s *Server) ListAuthentications(ctx context.Context, r *auth.ListAuthentica func (s *Server) DeleteAuthentication(ctx context.Context, req *auth.DeleteAuthenticationRequest) (*emptypb.Empty, error) { s.logger.Debug("DeleteAuthentication", zap.String("id", req.Id)) + if s.enableAuditLogging { + actor := ActorFromContext(ctx) + + a, err := s.GetAuthentication(ctx, &auth.GetAuthenticationRequest{ + Id: req.Id, + }) + if err != nil { + s.logger.Error("failed to get authentication for audit events", zap.Error(err)) + return nil, err + } + if a.Method == auth.Method_METHOD_TOKEN { + event := audit.NewEvent(audit.TokenType, audit.Delete, actor, a.Metadata) + event.AddToSpan(ctx) + } + } + return &emptypb.Empty{}, s.store.DeleteAuthentications(ctx, storageauth.Delete(storageauth.WithID(req.Id))) } diff --git a/internal/server/auth/server_test.go b/internal/server/auth/server_test.go index 3d916a48ef..6070be711d 100644 --- a/internal/server/auth/server_test.go +++ b/internal/server/auth/server_test.go @@ -26,6 +26,21 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" ) +func TestActorFromContext(t *testing.T) { + const ( + ipAddress = "127.0.0.1" + authentication = "token" + ) + + ctx := metadata.NewIncomingContext(context.Background(), map[string][]string{"x-forwarded-for": {"127.0.0.1"}}) + ctx = fauth.ContextWithAuthentication(ctx, &auth.Authentication{Method: auth.Method_METHOD_TOKEN}) + + actor := fauth.ActorFromContext(ctx) + + require.Equal(t, actor["ip"], ipAddress) + require.Equal(t, actor["authentication"], authentication) +} + func TestServer(t *testing.T) { var ( logger = zaptest.NewLogger(t) diff --git a/internal/server/middleware/grpc/middleware.go b/internal/server/middleware/grpc/middleware.go index 578ba48648..2b182c1aea 100644 --- a/internal/server/middleware/grpc/middleware.go +++ b/internal/server/middleware/grpc/middleware.go @@ -14,21 +14,16 @@ import ( "go.flipt.io/flipt/internal/server/cache" "go.flipt.io/flipt/internal/server/metrics" flipt "go.flipt.io/flipt/rpc/flipt" + fauth "go.flipt.io/flipt/rpc/flipt/auth" "go.opentelemetry.io/otel/trace" "go.uber.org/zap" "google.golang.org/grpc" "google.golang.org/grpc/codes" - "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/proto" timestamp "google.golang.org/protobuf/types/known/timestamppb" ) -const ( - ipKey = "x-forwarded-for" - oidcEmailKey = "io.flipt.auth.oidc.email" -) - // ValidationUnaryInterceptor validates incoming requests func ValidationUnaryInterceptor(ctx context.Context, req interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp interface{}, err error) { if v, ok := req.(flipt.Validator); ok { @@ -114,11 +109,15 @@ func EvaluationUnaryInterceptor(ctx context.Context, req interface{}, _ *grpc.Un return resp, err } + now := timestamp.New(time.Now().UTC()) // set response fields if resp != nil { if rr, ok := resp.(*flipt.BatchEvaluationResponse); ok { rr.RequestId = r.RequestId rr.RequestDurationMillis = float64(time.Since(startTime)) / float64(time.Millisecond) + for _, response := range rr.Responses { + response.Timestamp = now + } return resp, nil } } @@ -245,78 +244,81 @@ func CacheUnaryInterceptor(cache cache.Cacher, logger *zap.Logger) grpc.UnarySer // AuditUnaryInterceptor sends audit logs to configured sinks upon successful RPC requests for auditable events. func AuditUnaryInterceptor(logger *zap.Logger) grpc.UnaryServerInterceptor { - return func(ctx context.Context, req interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { + return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { resp, err := handler(ctx, req) if err != nil { return resp, err } - // Identity metadata for audit events. We will always include the IP address in the - // metadata configuration, and only include the email when it exists from the user logging - // into the UI via OIDC. - var author string - var ipAddress string - - md, _ := metadata.FromIncomingContext(ctx) - if len(md[ipKey]) > 0 { - ipAddress = md[ipKey][0] - } - - auth := auth.GetAuthenticationFrom(ctx) - if auth != nil { - author = auth.Metadata[oidcEmailKey] - } + actor := auth.ActorFromContext(ctx) var event *audit.Event + defer func() { + if event != nil { + span := trace.SpanFromContext(ctx) + span.AddEvent("event", trace.WithAttributes(event.DecodeToAttributes()...)) + } + }() + + // Delete request(s) have to be handled separately because they do not + // return the concrete type but rather an *empty.Empty response. switch r := req.(type) { - case *flipt.CreateFlagRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Flag, Action: audit.Create, IP: ipAddress, Author: author}, r) - case *flipt.UpdateFlagRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Flag, Action: audit.Update, IP: ipAddress, Author: author}, r) case *flipt.DeleteFlagRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Flag, Action: audit.Delete, IP: ipAddress, Author: author}, r) - case *flipt.CreateVariantRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Variant, Action: audit.Create, IP: ipAddress, Author: author}, r) - case *flipt.UpdateVariantRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Variant, Action: audit.Update, IP: ipAddress, Author: author}, r) + event = audit.NewEvent(audit.FlagType, audit.Delete, actor, r) case *flipt.DeleteVariantRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Variant, Action: audit.Delete, IP: ipAddress, Author: author}, r) - case *flipt.CreateSegmentRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Segment, Action: audit.Create, IP: ipAddress, Author: author}, r) - case *flipt.UpdateSegmentRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Segment, Action: audit.Update, IP: ipAddress, Author: author}, r) + event = audit.NewEvent(audit.VariantType, audit.Delete, actor, r) case *flipt.DeleteSegmentRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Segment, Action: audit.Delete, IP: ipAddress, Author: author}, r) - case *flipt.CreateConstraintRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Constraint, Action: audit.Create, IP: ipAddress, Author: author}, r) - case *flipt.UpdateConstraintRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Constraint, Action: audit.Update, IP: ipAddress, Author: author}, r) - case *flipt.DeleteConstraintRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Constraint, Action: audit.Delete, IP: ipAddress, Author: author}, r) - case *flipt.CreateDistributionRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Distribution, Action: audit.Create, IP: ipAddress, Author: author}, r) - case *flipt.UpdateDistributionRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Distribution, Action: audit.Update, IP: ipAddress, Author: author}, r) + event = audit.NewEvent(audit.SegmentType, audit.Delete, actor, r) case *flipt.DeleteDistributionRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Distribution, Action: audit.Delete, IP: ipAddress, Author: author}, r) - case *flipt.CreateRuleRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Rule, Action: audit.Create, IP: ipAddress, Author: author}, r) - case *flipt.UpdateRuleRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Rule, Action: audit.Update, IP: ipAddress, Author: author}, r) - case *flipt.DeleteRuleRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Rule, Action: audit.Delete, IP: ipAddress, Author: author}, r) - case *flipt.CreateNamespaceRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Namespace, Action: audit.Create, IP: ipAddress, Author: author}, r) - case *flipt.UpdateNamespaceRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Namespace, Action: audit.Update, IP: ipAddress, Author: author}, r) + event = audit.NewEvent(audit.DistributionType, audit.Delete, actor, r) + case *flipt.DeleteConstraintRequest: + event = audit.NewEvent(audit.ConstraintType, audit.Delete, actor, r) case *flipt.DeleteNamespaceRequest: - event = audit.NewEvent(audit.Metadata{Type: audit.Namespace, Action: audit.Delete, IP: ipAddress, Author: author}, r) + event = audit.NewEvent(audit.NamespaceType, audit.Delete, actor, r) + case *flipt.DeleteRuleRequest: + event = audit.NewEvent(audit.RuleType, audit.Delete, actor, r) } + // Short circuiting the middleware here since we have a non-nil event from + // detecting a delete. if event != nil { - span := trace.SpanFromContext(ctx) - span.AddEvent("event", trace.WithAttributes(event.DecodeToAttributes()...)) + return resp, err + } + + action := audit.GRPCMethodToAction(info.FullMethod) + + switch r := resp.(type) { + case *flipt.Flag: + if action != "" { + event = audit.NewEvent(audit.FlagType, action, actor, audit.NewFlag(r)) + } + case *flipt.Variant: + if action != "" { + event = audit.NewEvent(audit.VariantType, action, actor, audit.NewVariant(r)) + } + case *flipt.Segment: + if action != "" { + event = audit.NewEvent(audit.SegmentType, action, actor, audit.NewSegment(r)) + } + case *flipt.Distribution: + if action != "" { + event = audit.NewEvent(audit.DistributionType, action, actor, audit.NewDistribution(r)) + } + case *flipt.Constraint: + if action != "" { + event = audit.NewEvent(audit.ConstraintType, action, actor, audit.NewConstraint(r)) + } + case *flipt.Namespace: + if action != "" { + event = audit.NewEvent(audit.NamespaceType, action, actor, audit.NewNamespace(r)) + } + case *flipt.Rule: + if action != "" { + event = audit.NewEvent(audit.RuleType, action, actor, audit.NewRule(r)) + } + case *fauth.CreateTokenResponse: + event = audit.NewEvent(audit.TokenType, audit.Create, actor, r.Authentication.Metadata) } return resp, err diff --git a/internal/server/middleware/grpc/middleware_test.go b/internal/server/middleware/grpc/middleware_test.go index 5b50b8f4de..b5afe5c74d 100644 --- a/internal/server/middleware/grpc/middleware_test.go +++ b/internal/server/middleware/grpc/middleware_test.go @@ -8,6 +8,8 @@ import ( "go.flipt.io/flipt/errors" "go.flipt.io/flipt/internal/config" "go.flipt.io/flipt/internal/server" + "go.flipt.io/flipt/internal/server/auth" + "go.flipt.io/flipt/internal/server/auth/method/token" "go.flipt.io/flipt/internal/server/cache/memory" "go.flipt.io/flipt/internal/storage" flipt "go.flipt.io/flipt/rpc/flipt" @@ -17,6 +19,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/mock" "github.com/stretchr/testify/require" + storageauth "go.flipt.io/flipt/internal/storage/auth" + authrpc "go.flipt.io/flipt/rpc/flipt/auth" "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" @@ -280,6 +284,7 @@ func TestEvaluationUnaryInterceptor_BatchEvaluation(t *testing.T) { assert.NotNil(t, resp) assert.NotEmpty(t, resp.Responses) assert.Equal(t, "foo", resp.Responses[0].FlagKey) + assert.NotNil(t, resp.Responses[0].Timestamp) // check that the requestID was propagated assert.NotEmpty(t, resp.RequestId) assert.Equal(t, "bar", resp.RequestId) @@ -722,7 +727,7 @@ func TestAuditUnaryInterceptor_CreateFlag(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "CreateFlag", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -737,7 +742,7 @@ func TestAuditUnaryInterceptor_CreateFlag(t *testing.T) { span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_UpdateFlag(t *testing.T) { @@ -768,7 +773,7 @@ func TestAuditUnaryInterceptor_UpdateFlag(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "UpdateFlag", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -783,7 +788,7 @@ func TestAuditUnaryInterceptor_UpdateFlag(t *testing.T) { span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_DeleteFlag(t *testing.T) { @@ -806,7 +811,7 @@ func TestAuditUnaryInterceptor_DeleteFlag(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "DeleteFlag", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -820,7 +825,7 @@ func TestAuditUnaryInterceptor_DeleteFlag(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_CreateVariant(t *testing.T) { @@ -853,7 +858,7 @@ func TestAuditUnaryInterceptor_CreateVariant(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "CreateVariant", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -867,7 +872,7 @@ func TestAuditUnaryInterceptor_CreateVariant(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_UpdateVariant(t *testing.T) { @@ -901,7 +906,7 @@ func TestAuditUnaryInterceptor_UpdateVariant(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "UpdateVariant", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -915,7 +920,7 @@ func TestAuditUnaryInterceptor_UpdateVariant(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_DeleteVariant(t *testing.T) { @@ -938,7 +943,7 @@ func TestAuditUnaryInterceptor_DeleteVariant(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "DeleteVariant", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -952,7 +957,7 @@ func TestAuditUnaryInterceptor_DeleteVariant(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_CreateDistribution(t *testing.T) { @@ -983,7 +988,7 @@ func TestAuditUnaryInterceptor_CreateDistribution(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "CreateDistribution", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -997,7 +1002,7 @@ func TestAuditUnaryInterceptor_CreateDistribution(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_UpdateDistribution(t *testing.T) { @@ -1029,7 +1034,7 @@ func TestAuditUnaryInterceptor_UpdateDistribution(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "UpdateDistribution", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1043,7 +1048,7 @@ func TestAuditUnaryInterceptor_UpdateDistribution(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_DeleteDistribution(t *testing.T) { @@ -1069,7 +1074,7 @@ func TestAuditUnaryInterceptor_DeleteDistribution(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "DeleteDistribution", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1083,7 +1088,7 @@ func TestAuditUnaryInterceptor_DeleteDistribution(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_CreateSegment(t *testing.T) { @@ -1114,7 +1119,7 @@ func TestAuditUnaryInterceptor_CreateSegment(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "CreateSegment", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1128,7 +1133,7 @@ func TestAuditUnaryInterceptor_CreateSegment(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_UpdateSegment(t *testing.T) { @@ -1159,7 +1164,7 @@ func TestAuditUnaryInterceptor_UpdateSegment(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "UpdateSegment", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1173,7 +1178,7 @@ func TestAuditUnaryInterceptor_UpdateSegment(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_DeleteSegment(t *testing.T) { @@ -1196,7 +1201,7 @@ func TestAuditUnaryInterceptor_DeleteSegment(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "DeleteSegment", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1210,7 +1215,7 @@ func TestAuditUnaryInterceptor_DeleteSegment(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_CreateConstraint(t *testing.T) { @@ -1244,7 +1249,7 @@ func TestAuditUnaryInterceptor_CreateConstraint(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "CreateConstraint", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1258,7 +1263,7 @@ func TestAuditUnaryInterceptor_CreateConstraint(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_UpdateConstraint(t *testing.T) { @@ -1293,7 +1298,7 @@ func TestAuditUnaryInterceptor_UpdateConstraint(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "UpdateConstraint", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1307,7 +1312,7 @@ func TestAuditUnaryInterceptor_UpdateConstraint(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_DeleteConstraint(t *testing.T) { @@ -1331,7 +1336,7 @@ func TestAuditUnaryInterceptor_DeleteConstraint(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "DeleteConstraint", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1345,7 +1350,7 @@ func TestAuditUnaryInterceptor_DeleteConstraint(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_CreateRule(t *testing.T) { @@ -1374,7 +1379,7 @@ func TestAuditUnaryInterceptor_CreateRule(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "CreateRule", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1388,7 +1393,7 @@ func TestAuditUnaryInterceptor_CreateRule(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_UpdateRule(t *testing.T) { @@ -1417,7 +1422,7 @@ func TestAuditUnaryInterceptor_UpdateRule(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "UpdateRule", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1431,7 +1436,7 @@ func TestAuditUnaryInterceptor_UpdateRule(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_DeleteRule(t *testing.T) { @@ -1455,7 +1460,7 @@ func TestAuditUnaryInterceptor_DeleteRule(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "DeleteRule", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1469,7 +1474,7 @@ func TestAuditUnaryInterceptor_DeleteRule(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_CreateNamespace(t *testing.T) { @@ -1496,7 +1501,7 @@ func TestAuditUnaryInterceptor_CreateNamespace(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "CreateNamespace", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1510,7 +1515,7 @@ func TestAuditUnaryInterceptor_CreateNamespace(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_UpdateNamespace(t *testing.T) { @@ -1539,7 +1544,7 @@ func TestAuditUnaryInterceptor_UpdateNamespace(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "UpdateNamespace", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1553,7 +1558,7 @@ func TestAuditUnaryInterceptor_UpdateNamespace(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } func TestAuditUnaryInterceptor_DeleteNamespace(t *testing.T) { @@ -1582,7 +1587,105 @@ func TestAuditUnaryInterceptor_DeleteNamespace(t *testing.T) { } info := &grpc.UnaryServerInfo{ - FullMethod: "FakeMethod", + FullMethod: "DeleteNamespace", + } + + tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) + tp.RegisterSpanProcessor(sdktrace.NewSimpleSpanProcessor(exporterSpy)) + + tr := tp.Tracer("SpanProcessor") + ctx, span := tr.Start(context.Background(), "OnStart") + + got, err := unaryInterceptor(ctx, req, info, handler) + require.NoError(t, err) + assert.NotNil(t, got) + + span.End() + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) +} + +func TestAuthMetadataAuditUnaryInterceptor(t *testing.T) { + var ( + store = &storeMock{} + logger = zaptest.NewLogger(t) + exporterSpy = newAuditExporterSpy(logger) + s = server.New(logger, store) + req = &flipt.CreateFlagRequest{ + Key: "key", + Name: "name", + Description: "desc", + } + ) + + store.On("CreateFlag", mock.Anything, req).Return(&flipt.Flag{ + Key: req.Key, + Name: req.Name, + Description: req.Description, + }, nil) + + unaryInterceptor := AuditUnaryInterceptor(logger) + + handler := func(ctx context.Context, r interface{}) (interface{}, error) { + return s.CreateFlag(ctx, r.(*flipt.CreateFlagRequest)) + } + + info := &grpc.UnaryServerInfo{ + FullMethod: "CreateFlag", + } + + tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) + tp.RegisterSpanProcessor(sdktrace.NewSimpleSpanProcessor(exporterSpy)) + + tr := tp.Tracer("SpanProcessor") + ctx, span := tr.Start(context.Background(), "OnStart") + + ctx = auth.ContextWithAuthentication(ctx, &authrpc.Authentication{ + Method: authrpc.Method_METHOD_OIDC, + Metadata: map[string]string{ + "email": "example@flipt.com", + }, + }) + + got, err := unaryInterceptor(ctx, req, info, handler) + require.NoError(t, err) + assert.NotNil(t, got) + + span.End() + + event := exporterSpy.GetEvents()[0] + assert.Equal(t, event.Metadata.Actor["email"], "example@flipt.com") + assert.Equal(t, event.Metadata.Actor["authentication"], "oidc") +} + +func TestAuditUnaryInterceptor_CreateToken(t *testing.T) { + var ( + store = &authStoreMock{} + logger = zaptest.NewLogger(t) + exporterSpy = newAuditExporterSpy(logger) + s = token.NewServer(logger, store) + req = &authrpc.CreateTokenRequest{ + Name: "token", + } + ) + + store.On("CreateAuthentication", mock.Anything, &storageauth.CreateAuthenticationRequest{ + Method: authrpc.Method_METHOD_TOKEN, + Metadata: map[string]string{ + "io.flipt.auth.token.description": "", + "io.flipt.auth.token.name": "token", + }, + }).Return("", &authrpc.Authentication{Metadata: map[string]string{ + "email": "example@flipt.io", + }}, nil) + + unaryInterceptor := AuditUnaryInterceptor(logger) + + handler := func(ctx context.Context, r interface{}) (interface{}, error) { + return s.CreateToken(ctx, r.(*authrpc.CreateTokenRequest)) + } + + info := &grpc.UnaryServerInfo{ + FullMethod: "CreateToken", } tp := sdktrace.NewTracerProvider(sdktrace.WithSampler(sdktrace.AlwaysSample())) @@ -1596,5 +1699,5 @@ func TestAuditUnaryInterceptor_DeleteNamespace(t *testing.T) { assert.NotNil(t, got) span.End() - assert.Equal(t, exporterSpy.GetSendAuditsCalled(), 1) + assert.Equal(t, 1, exporterSpy.GetSendAuditsCalled()) } diff --git a/internal/server/middleware/grpc/support_test.go b/internal/server/middleware/grpc/support_test.go index d0cc6fd698..2e38bb478a 100644 --- a/internal/server/middleware/grpc/support_test.go +++ b/internal/server/middleware/grpc/support_test.go @@ -8,8 +8,11 @@ import ( "go.flipt.io/flipt/internal/server/audit" "go.flipt.io/flipt/internal/server/cache" "go.flipt.io/flipt/internal/storage" + storageauth "go.flipt.io/flipt/internal/storage/auth" flipt "go.flipt.io/flipt/rpc/flipt" + "go.flipt.io/flipt/rpc/flipt/auth" "go.uber.org/zap" + "google.golang.org/protobuf/types/known/timestamppb" ) var _ storage.Store = &storeMock{} @@ -202,6 +205,38 @@ func (m *storeMock) GetEvaluationDistributions(ctx context.Context, ruleID strin return args.Get(0).([]*storage.EvaluationDistribution), args.Error(1) } +var _ storageauth.Store = &authStoreMock{} + +type authStoreMock struct { + mock.Mock +} + +func (a *authStoreMock) CreateAuthentication(ctx context.Context, r *storageauth.CreateAuthenticationRequest) (string, *auth.Authentication, error) { + args := a.Called(ctx, r) + return args.String(0), args.Get(1).(*auth.Authentication), args.Error(2) +} + +func (a *authStoreMock) GetAuthenticationByClientToken(ctx context.Context, clientToken string) (*auth.Authentication, error) { + return nil, nil +} + +func (a *authStoreMock) GetAuthenticationByID(ctx context.Context, id string) (*auth.Authentication, error) { + return nil, nil +} + +func (a *authStoreMock) ListAuthentications(ctx context.Context, r *storage.ListRequest[storageauth.ListAuthenticationsPredicate]) (set storage.ResultSet[*auth.Authentication], err error) { + return set, err +} + +func (a *authStoreMock) DeleteAuthentications(ctx context.Context, r *storageauth.DeleteAuthenticationsRequest) error { + args := a.Called(ctx, r) + return args.Error(0) +} + +func (a *authStoreMock) ExpireAuthenticationByID(ctx context.Context, id string, expireAt *timestamppb.Timestamp) error { + return nil +} + type cacheSpy struct { cache.Cacher @@ -244,11 +279,13 @@ func (c *cacheSpy) Delete(ctx context.Context, key string) error { type auditSinkSpy struct { sendAuditsCalled int + events []audit.Event fmt.Stringer } func (a *auditSinkSpy) SendAudits(es []audit.Event) error { a.sendAuditsCalled++ + a.events = append(a.events, es...) return nil } @@ -264,7 +301,7 @@ type auditExporterSpy struct { } func newAuditExporterSpy(logger *zap.Logger) *auditExporterSpy { - aspy := &auditSinkSpy{} + aspy := &auditSinkSpy{events: make([]audit.Event, 0)} as := []audit.Sink{aspy} return &auditExporterSpy{ @@ -276,3 +313,7 @@ func newAuditExporterSpy(logger *zap.Logger) *auditExporterSpy { func (a *auditExporterSpy) GetSendAuditsCalled() int { return a.sinkSpy.sendAuditsCalled } + +func (a *auditExporterSpy) GetEvents() []audit.Event { + return a.sinkSpy.events +} diff --git a/internal/server/segment_test.go b/internal/server/segment_test.go index 5ba773a2d5..e7e1ea8f1e 100644 --- a/internal/server/segment_test.go +++ b/internal/server/segment_test.go @@ -259,22 +259,24 @@ func TestUpdateConstraint(t *testing.T) { store: store, } req = &flipt.UpdateConstraintRequest{ - Id: "1", - SegmentKey: "segmentKey", - Type: flipt.ComparisonType_STRING_COMPARISON_TYPE, - Property: "property", - Operator: flipt.OpEQ, - Value: "value", + Id: "1", + SegmentKey: "segmentKey", + Type: flipt.ComparisonType_STRING_COMPARISON_TYPE, + Property: "property", + Operator: flipt.OpEQ, + Value: "value", + Description: "desc", } ) store.On("UpdateConstraint", mock.Anything, req).Return(&flipt.Constraint{ - Id: req.Id, - SegmentKey: req.SegmentKey, - Type: req.Type, - Property: req.Property, - Operator: req.Operator, - Value: req.Value, + Id: req.Id, + SegmentKey: req.SegmentKey, + Type: req.Type, + Property: req.Property, + Operator: req.Operator, + Value: req.Value, + Description: req.Description, }, nil) got, err := s.UpdateConstraint(context.TODO(), req) diff --git a/internal/storage/sql/common/flag.go b/internal/storage/sql/common/flag.go index 13151c208b..99dc3fb0ce 100644 --- a/internal/storage/sql/common/flag.go +++ b/internal/storage/sql/common/flag.go @@ -150,11 +150,10 @@ func (s *Store) ListFlags(ctx context.Context, namespaceKey string, opts ...stor flags []*flipt.Flag results = storage.ResultSet[*flipt.Flag]{} - query = s.builder.Select("f.namespace_key, f.key, f.name, f.description, f.enabled, f.created_at, f.updated_at, v.id, v.namespace_key, v.key, v.flag_key, v.name, v.description, v.attachment, v.created_at, v.updated_at"). - From("flags f"). - Where(sq.Eq{"f.namespace_key": namespaceKey}). - LeftJoin("variants v ON v.flag_key = f.key AND v.namespace_key = f.namespace_key"). - OrderBy(fmt.Sprintf("f.created_at %s", params.Order)) + query = s.builder.Select("namespace_key, \"key\", name, description, enabled, created_at, updated_at"). + From("flags"). + Where(sq.Eq{"namespace_key": namespaceKey}). + OrderBy(fmt.Sprintf("created_at %s", params.Order)) ) if params.Limit > 0 { @@ -188,13 +187,11 @@ func (s *Store) ListFlags(ctx context.Context, namespaceKey string, opts ...stor } }() - // keep track of flags we've seen so we don't append duplicates because of the join - uniqueFlags := make(map[string][]*flipt.Variant) - + // keep track of flags so we can associated variants in second query. + flagsByKey := make(map[string]*flipt.Flag) for rows.Next() { var ( flag = &flipt.Flag{} - v = &optionalVariant{} fCreatedAt fliptsql.Timestamp fUpdatedAt fliptsql.Timestamp @@ -207,63 +204,15 @@ func (s *Store) ListFlags(ctx context.Context, namespaceKey string, opts ...stor &flag.Description, &flag.Enabled, &fCreatedAt, - &fUpdatedAt, - &v.Id, - &v.NamespaceKey, - &v.Key, - &v.FlagKey, - &v.Name, - &v.Description, - &v.Attachment, - &v.CreatedAt, - &v.UpdatedAt); err != nil { + &fUpdatedAt); err != nil { return results, err } flag.CreatedAt = fCreatedAt.Timestamp flag.UpdatedAt = fUpdatedAt.Timestamp - // append flag to output results if we haven't seen it yet, to maintain order - if _, ok := uniqueFlags[flag.Key]; !ok { - flags = append(flags, flag) - } - - // append variant to flag if it exists (not null) - if v.Id.Valid { - variant := &flipt.Variant{ - Id: v.Id.String, - } - if v.NamespaceKey.Valid { - variant.NamespaceKey = v.NamespaceKey.String - } - if v.Key.Valid { - variant.Key = v.Key.String - } - if v.FlagKey.Valid { - variant.FlagKey = v.FlagKey.String - } - if v.Name.Valid { - variant.Name = v.Name.String - } - if v.Description.Valid { - variant.Description = v.Description.String - } - if v.Attachment.Valid { - compactedAttachment, err := compactJSONString(v.Attachment.String) - if err != nil { - return results, err - } - variant.Attachment = compactedAttachment - } - if v.CreatedAt.IsValid() { - variant.CreatedAt = v.CreatedAt.Timestamp - } - if v.UpdatedAt.IsValid() { - variant.UpdatedAt = v.UpdatedAt.Timestamp - } - - uniqueFlags[flag.Key] = append(uniqueFlags[flag.Key], variant) - } + flags = append(flags, flag) + flagsByKey[flag.Key] = flag } if err := rows.Err(); err != nil { @@ -274,9 +223,8 @@ func (s *Store) ListFlags(ctx context.Context, namespaceKey string, opts ...stor return results, err } - // set variants on flags before returning results - for _, f := range flags { - f.Variants = uniqueFlags[f.Key] + if err := s.setVariants(ctx, namespaceKey, flagsByKey); err != nil { + return results, err } var next *flipt.Flag @@ -299,6 +247,70 @@ func (s *Store) ListFlags(ctx context.Context, namespaceKey string, opts ...stor return results, nil } +func (s *Store) setVariants(ctx context.Context, namespaceKey string, flagsByKey map[string]*flipt.Flag) error { + allFlagKeys := make([]string, 0, len(flagsByKey)) + for k := range flagsByKey { + allFlagKeys = append(allFlagKeys, k) + } + + query := s.builder.Select("id, namespace_key, \"key\", flag_key, name, description, attachment, created_at, updated_at"). + From("variants"). + Where(sq.Eq{"namespace_key": namespaceKey, "flag_key": allFlagKeys}). + OrderBy("created_at") + + rows, err := query.QueryContext(ctx) + if err != nil { + return err + } + + defer func() { + if cerr := rows.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + for rows.Next() { + var ( + variant optionalVariant + vCreatedAt fliptsql.NullableTimestamp + vUpdatedAt fliptsql.NullableTimestamp + ) + + if err := rows.Scan( + &variant.Id, + &variant.NamespaceKey, + &variant.Key, + &variant.FlagKey, + &variant.Name, + &variant.Description, + &variant.Attachment, + &vCreatedAt, + &vUpdatedAt); err != nil { + return err + } + + if flag, ok := flagsByKey[variant.FlagKey.String]; ok { + flag.Variants = append(flag.Variants, &flipt.Variant{ + Id: variant.Id.String, + NamespaceKey: variant.NamespaceKey.String, + Key: variant.Key.String, + FlagKey: variant.FlagKey.String, + Name: variant.Name.String, + Description: variant.Description.String, + Attachment: variant.Attachment.String, + CreatedAt: vCreatedAt.Timestamp, + UpdatedAt: vUpdatedAt.Timestamp, + }) + } + } + + if err := rows.Err(); err != nil { + return err + } + + return rows.Close() +} + // CountFlags counts all flags func (s *Store) CountFlags(ctx context.Context, namespaceKey string) (uint64, error) { var count uint64 diff --git a/internal/storage/sql/common/rule.go b/internal/storage/sql/common/rule.go index 2b0e1ddf0e..f95e325e59 100644 --- a/internal/storage/sql/common/rule.go +++ b/internal/storage/sql/common/rule.go @@ -113,11 +113,10 @@ func (s *Store) ListRules(ctx context.Context, namespaceKey, flagKey string, opt rules []*flipt.Rule results = storage.ResultSet[*flipt.Rule]{} - query = s.builder.Select("r.id, r.namespace_key, r.flag_key, r.segment_key, r.rank, r.created_at, r.updated_at, d.id, d.rule_id, d.variant_id, d.rollout, d.created_at, d.updated_at"). - From("rules r"). - LeftJoin("distributions d ON d.rule_id = r.id"). - Where(sq.And{sq.Eq{"r.flag_key": flagKey}, sq.Eq{"r.namespace_key": namespaceKey}}). - OrderBy(fmt.Sprintf("r.rank %s", params.Order)) + query = s.builder.Select("id, namespace_key, flag_key, segment_key, \"rank\", created_at, updated_at"). + From("rules"). + Where(sq.Eq{"flag_key": flagKey, "namespace_key": namespaceKey}). + OrderBy(fmt.Sprintf("\"rank\" %s", params.Order)) ) if params.Limit > 0 { @@ -151,14 +150,10 @@ func (s *Store) ListRules(ctx context.Context, namespaceKey, flagKey string, opt } }() - // keep track of rules we've seen so we don't append duplicates because of the join - uniqueRules := make(map[string][]*flipt.Distribution) - + rulesById := map[string]*flipt.Rule{} for rows.Next() { var ( - rule = &flipt.Rule{} - d = &optionalDistribution{} - + rule = &flipt.Rule{} rCreatedAt fliptsql.Timestamp rUpdatedAt fliptsql.Timestamp ) @@ -170,47 +165,15 @@ func (s *Store) ListRules(ctx context.Context, namespaceKey, flagKey string, opt &rule.SegmentKey, &rule.Rank, &rCreatedAt, - &rUpdatedAt, - &d.Id, - &d.RuleId, - &d.VariantId, - &d.Rollout, - &d.CreatedAt, - &d.UpdatedAt); err != nil { + &rUpdatedAt); err != nil { return results, err } rule.CreatedAt = rCreatedAt.Timestamp rule.UpdatedAt = rUpdatedAt.Timestamp - // append rule to output results if we haven't seen it yet, to maintain order - if _, ok := uniqueRules[rule.Id]; !ok { - rules = append(rules, rule) - } - - // append distribution to rule if it exists - if d.Id.Valid { - distribution := &flipt.Distribution{ - Id: d.Id.String, - } - if d.RuleId.Valid { - distribution.RuleId = d.RuleId.String - } - if d.VariantId.Valid { - distribution.VariantId = d.VariantId.String - } - if d.Rollout.Valid { - distribution.Rollout = float32(d.Rollout.Float64) - } - if d.CreatedAt.IsValid() { - distribution.CreatedAt = d.CreatedAt.Timestamp - } - if d.UpdatedAt.IsValid() { - distribution.UpdatedAt = d.UpdatedAt.Timestamp - } - - uniqueRules[rule.Id] = append(uniqueRules[rule.Id], distribution) - } + rules = append(rules, rule) + rulesById[rule.Id] = rule } if err := rows.Err(); err != nil { @@ -221,9 +184,8 @@ func (s *Store) ListRules(ctx context.Context, namespaceKey, flagKey string, opt return results, err } - // set distributions on rules before returning results - for _, r := range rules { - r.Distributions = uniqueRules[r.Id] + if err := s.setDistributions(ctx, rulesById); err != nil { + return results, err } var next *flipt.Rule @@ -246,6 +208,64 @@ func (s *Store) ListRules(ctx context.Context, namespaceKey, flagKey string, opt return results, nil } +func (s *Store) setDistributions(ctx context.Context, rulesById map[string]*flipt.Rule) error { + allRuleIds := make([]string, 0, len(rulesById)) + for k := range rulesById { + allRuleIds = append(allRuleIds, k) + } + + query := s.builder.Select("id, rule_id, variant_id, rollout, created_at, updated_at"). + From("distributions"). + Where(sq.Eq{"rule_id": allRuleIds}). + OrderBy("created_at") + + rows, err := query.QueryContext(ctx) + if err != nil { + return err + } + + defer func() { + if cerr := rows.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + for rows.Next() { + var ( + distribution optionalDistribution + dCreatedAt fliptsql.NullableTimestamp + dUpdatedAt fliptsql.NullableTimestamp + ) + + if err := rows.Scan( + &distribution.Id, + &distribution.RuleId, + &distribution.VariantId, + &distribution.Rollout, + &dCreatedAt, + &dUpdatedAt); err != nil { + return err + } + + if rule, ok := rulesById[distribution.RuleId.String]; ok { + rule.Distributions = append(rule.Distributions, &flipt.Distribution{ + Id: distribution.Id.String, + RuleId: distribution.RuleId.String, + VariantId: distribution.VariantId.String, + Rollout: float32(distribution.Rollout.Float64), + CreatedAt: dCreatedAt.Timestamp, + UpdatedAt: dUpdatedAt.Timestamp, + }) + } + } + + if err := rows.Err(); err != nil { + return err + } + + return rows.Close() +} + // CountRules counts all rules func (s *Store) CountRules(ctx context.Context, namespaceKey string) (uint64, error) { var count uint64 diff --git a/internal/storage/sql/common/segment.go b/internal/storage/sql/common/segment.go index a06708401a..deebf8682f 100644 --- a/internal/storage/sql/common/segment.go +++ b/internal/storage/sql/common/segment.go @@ -55,7 +55,7 @@ func (s *Store) GetSegment(ctx context.Context, namespaceKey, key string) (*flip segment.CreatedAt = createdAt.Timestamp segment.UpdatedAt = updatedAt.Timestamp - query := s.builder.Select("id, namespace_key, segment_key, type, property, operator, value, created_at, updated_at"). + query := s.builder.Select("id, namespace_key, segment_key, type, property, operator, value, description, created_at, updated_at"). From("constraints"). Where(sq.Eq{"segment_key": segment.Key}). OrderBy("created_at ASC") @@ -85,6 +85,7 @@ func (s *Store) GetSegment(ctx context.Context, namespaceKey, key string) (*flip &constraint.Property, &constraint.Operator, &constraint.Value, + &constraint.Description, &createdAt, &updatedAt); err != nil { return segment, err @@ -106,6 +107,7 @@ type optionalConstraint struct { Property sql.NullString Operator sql.NullString Value sql.NullString + Description sql.NullString CreatedAt fliptsql.NullableTimestamp UpdatedAt fliptsql.NullableTimestamp } @@ -126,11 +128,10 @@ func (s *Store) ListSegments(ctx context.Context, namespaceKey string, opts ...s segments []*flipt.Segment results = storage.ResultSet[*flipt.Segment]{} - query = s.builder.Select("s.namespace_key, s.key, s.name, s.description, s.match_type, s.created_at, s.updated_at, c.id, c.namespace_key, c.segment_key, c.type, c.property, c.operator, c.value, c.created_at, c.updated_at"). - From("segments s"). - Where(sq.Eq{"s.namespace_key": namespaceKey}). - LeftJoin("constraints c ON s.key = c.segment_key AND c.namespace_key = s.namespace_key"). - OrderBy(fmt.Sprintf("s.created_at %s", params.Order)) + query = s.builder.Select("namespace_key, \"key\", name, description, match_type, created_at, updated_at"). + From("segments"). + Where(sq.Eq{"namespace_key": namespaceKey}). + OrderBy(fmt.Sprintf("created_at %s", params.Order)) ) if params.Limit > 0 { @@ -165,13 +166,11 @@ func (s *Store) ListSegments(ctx context.Context, namespaceKey string, opts ...s }() // keep track of segments we've seen so we don't append duplicates because of the join - uniqueSegments := make(map[string][]*flipt.Constraint) + segmentsByKey := make(map[string]*flipt.Segment) for rows.Next() { var ( - segment = &flipt.Segment{} - c = &optionalConstraint{} - + segment = &flipt.Segment{} sCreatedAt fliptsql.Timestamp sUpdatedAt fliptsql.Timestamp ) @@ -183,59 +182,15 @@ func (s *Store) ListSegments(ctx context.Context, namespaceKey string, opts ...s &segment.Description, &segment.MatchType, &sCreatedAt, - &sUpdatedAt, - &c.Id, - &c.NamespaceKey, - &c.SegmentKey, - &c.Type, - &c.Property, - &c.Operator, - &c.Value, - &c.CreatedAt, - &c.UpdatedAt); err != nil { + &sUpdatedAt); err != nil { return results, err } segment.CreatedAt = sCreatedAt.Timestamp segment.UpdatedAt = sUpdatedAt.Timestamp - // append segment to output results if we haven't seen it yet, to maintain order - if _, ok := uniqueSegments[segment.Key]; !ok { - segments = append(segments, segment) - } - - // append constraint to segment if it exists (not null) - if c.Id.Valid { - constraint := &flipt.Constraint{ - Id: c.Id.String, - } - if c.NamespaceKey.Valid { - constraint.NamespaceKey = c.NamespaceKey.String - } - if c.SegmentKey.Valid { - constraint.SegmentKey = c.SegmentKey.String - } - if c.Type.Valid { - constraint.Type = flipt.ComparisonType(c.Type.Int32) - } - if c.Property.Valid { - constraint.Property = c.Property.String - } - if c.Operator.Valid { - constraint.Operator = c.Operator.String - } - if c.Value.Valid { - constraint.Value = c.Value.String - } - if c.CreatedAt.IsValid() { - constraint.CreatedAt = c.CreatedAt.Timestamp - } - if c.UpdatedAt.IsValid() { - constraint.UpdatedAt = c.UpdatedAt.Timestamp - } - - uniqueSegments[segment.Key] = append(uniqueSegments[segment.Key], constraint) - } + segments = append(segments, segment) + segmentsByKey[segment.Key] = segment } if err := rows.Err(); err != nil { @@ -246,9 +201,8 @@ func (s *Store) ListSegments(ctx context.Context, namespaceKey string, opts ...s return results, err } - // set constraints on segments before returning results - for _, s := range segments { - s.Constraints = uniqueSegments[s.Key] + if err := s.setConstraints(ctx, namespaceKey, segmentsByKey); err != nil { + return results, err } var next *flipt.Segment @@ -271,6 +225,72 @@ func (s *Store) ListSegments(ctx context.Context, namespaceKey string, opts ...s return results, nil } +func (s *Store) setConstraints(ctx context.Context, namespaceKey string, segmentsByKey map[string]*flipt.Segment) error { + allSegmentKeys := make([]string, 0, len(segmentsByKey)) + for k := range segmentsByKey { + allSegmentKeys = append(allSegmentKeys, k) + } + + query := s.builder.Select("id, namespace_key, segment_key, type, property, operator, value, description, created_at, updated_at"). + From("constraints"). + Where(sq.Eq{"namespace_key": namespaceKey, "segment_key": allSegmentKeys}). + OrderBy("created_at") + + rows, err := query.QueryContext(ctx) + if err != nil { + return err + } + + defer func() { + if cerr := rows.Close(); cerr != nil && err == nil { + err = cerr + } + }() + + for rows.Next() { + var ( + constraint optionalConstraint + cCreatedAt fliptsql.NullableTimestamp + cUpdatedAt fliptsql.NullableTimestamp + ) + + if err := rows.Scan( + &constraint.Id, + &constraint.NamespaceKey, + &constraint.SegmentKey, + &constraint.Type, + &constraint.Property, + &constraint.Operator, + &constraint.Value, + &constraint.Description, + &cCreatedAt, + &cUpdatedAt); err != nil { + return err + } + + if segment, ok := segmentsByKey[constraint.SegmentKey.String]; ok { + segment.Constraints = append(segment.Constraints, &flipt.Constraint{ + Id: constraint.Id.String, + NamespaceKey: constraint.NamespaceKey.String, + SegmentKey: constraint.SegmentKey.String, + Type: flipt.ComparisonType(constraint.Type.Int32), + Property: constraint.Property.String, + Operator: constraint.Operator.String, + Value: constraint.Value.String, + Description: constraint.Description.String, + CreatedAt: cCreatedAt.Timestamp, + UpdatedAt: cUpdatedAt.Timestamp, + }) + } + } + + if err := rows.Err(); err != nil { + return err + } + + return rows.Close() +} + // CountSegments counts all segments func (s *Store) CountSegments(ctx context.Context, namespaceKey string) (uint64, error) { var count uint64 @@ -388,6 +408,7 @@ func (s *Store) CreateConstraint(ctx context.Context, r *flipt.CreateConstraintR Value: r.Value, CreatedAt: now, UpdatedAt: now, + Description: r.Description, } ) @@ -397,7 +418,7 @@ func (s *Store) CreateConstraint(ctx context.Context, r *flipt.CreateConstraintR } if _, err := s.builder.Insert("constraints"). - Columns("id", "namespace_key", "segment_key", "type", "property", "operator", "value", "created_at", "updated_at"). + Columns("id", "namespace_key", "segment_key", "type", "property", "operator", "value", "description", "created_at", "updated_at"). Values( c.Id, c.NamespaceKey, @@ -406,6 +427,7 @@ func (s *Store) CreateConstraint(ctx context.Context, r *flipt.CreateConstraintR c.Property, c.Operator, c.Value, + c.Description, &fliptsql.Timestamp{Timestamp: c.CreatedAt}, &fliptsql.Timestamp{Timestamp: c.UpdatedAt}). ExecContext(ctx); err != nil { @@ -436,6 +458,7 @@ func (s *Store) UpdateConstraint(ctx context.Context, r *flipt.UpdateConstraintR Set("property", r.Property). Set("operator", operator). Set("value", r.Value). + Set("description", r.Description). Set("updated_at", &fliptsql.Timestamp{Timestamp: timestamppb.Now()}). Where(whereClause). ExecContext(ctx) @@ -459,11 +482,11 @@ func (s *Store) UpdateConstraint(ctx context.Context, r *flipt.UpdateConstraintR c = &flipt.Constraint{} ) - if err := s.builder.Select("id, namespace_key, segment_key, type, property, operator, value, created_at, updated_at"). + if err := s.builder.Select("id, namespace_key, segment_key, type, property, operator, value, description, created_at, updated_at"). From("constraints"). Where(whereClause). QueryRowContext(ctx). - Scan(&c.Id, &c.NamespaceKey, &c.SegmentKey, &c.Type, &c.Property, &c.Operator, &c.Value, &createdAt, &updatedAt); err != nil { + Scan(&c.Id, &c.NamespaceKey, &c.SegmentKey, &c.Type, &c.Property, &c.Operator, &c.Value, &c.Description, &createdAt, &updatedAt); err != nil { return nil, err } diff --git a/internal/storage/sql/flag_test.go b/internal/storage/sql/flag_test.go index 37c228160a..cf0bd12bb6 100644 --- a/internal/storage/sql/flag_test.go +++ b/internal/storage/sql/flag_test.go @@ -322,6 +322,84 @@ func (s *DBTestSuite) TestListFlagsPagination_LimitWithNextPage() { assert.Equal(t, oldest.Key, got[2].Key) } +func (s *DBTestSuite) TestListFlagsPagination_FullWalk() { + t := s.T() + + namespace := uuid.Must(uuid.NewV4()).String() + + ctx := context.Background() + _, err := s.store.CreateNamespace(ctx, &flipt.CreateNamespaceRequest{ + Key: namespace, + }) + require.NoError(t, err) + + var ( + totalFlags = 9 + pageSize = uint64(3) + ) + + for i := 0; i < totalFlags; i++ { + req := flipt.CreateFlagRequest{ + NamespaceKey: namespace, + Key: fmt.Sprintf("flag_%03d", i), + Name: "foo", + Description: "bar", + } + + _, err := s.store.CreateFlag(ctx, &req) + require.NoError(t, err) + + for i := 0; i < 2; i++ { + if i > 0 && s.db.Driver == fliptsql.MySQL { + // required for MySQL since it only s.stores timestamps to the second and not millisecond granularity + time.Sleep(time.Second) + } + + _, err := s.store.CreateVariant(ctx, &flipt.CreateVariantRequest{ + NamespaceKey: namespace, + FlagKey: req.Key, + Key: fmt.Sprintf("variant_%d", i), + }) + require.NoError(t, err) + } + } + + resp, err := s.store.ListFlags(ctx, namespace, + storage.WithLimit(pageSize)) + require.NoError(t, err) + + found := resp.Results + for token := resp.NextPageToken; token != ""; token = resp.NextPageToken { + resp, err = s.store.ListFlags(ctx, namespace, + storage.WithLimit(pageSize), + storage.WithPageToken(token), + ) + require.NoError(t, err) + + found = append(found, resp.Results...) + } + + require.Len(t, found, totalFlags) + + for i := 0; i < totalFlags; i++ { + assert.Equal(t, namespace, found[i].NamespaceKey) + + expectedFlag := fmt.Sprintf("flag_%03d", i) + assert.Equal(t, expectedFlag, found[i].Key) + assert.Equal(t, "foo", found[i].Name) + assert.Equal(t, "bar", found[i].Description) + + require.Len(t, found[i].Variants, 2) + assert.Equal(t, namespace, found[i].Variants[0].NamespaceKey) + assert.Equal(t, expectedFlag, found[i].Variants[0].FlagKey) + assert.Equal(t, "variant_0", found[i].Variants[0].Key) + + assert.Equal(t, namespace, found[i].Variants[1].NamespaceKey) + assert.Equal(t, expectedFlag, found[i].Variants[1].FlagKey) + assert.Equal(t, "variant_1", found[i].Variants[1].Key) + } +} + func (s *DBTestSuite) TestCreateFlag() { t := s.T() diff --git a/internal/storage/sql/migrator.go b/internal/storage/sql/migrator.go index 40ec64d423..6b42ddf18f 100644 --- a/internal/storage/sql/migrator.go +++ b/internal/storage/sql/migrator.go @@ -18,10 +18,10 @@ import ( ) var expectedVersions = map[Driver]uint{ - SQLite: 7, - Postgres: 7, - MySQL: 5, - CockroachDB: 4, + SQLite: 8, + Postgres: 8, + MySQL: 6, + CockroachDB: 5, } // Migrator is responsible for migrating the database schema diff --git a/internal/storage/sql/rule_test.go b/internal/storage/sql/rule_test.go index ef4b0b70c0..cc1eb648dd 100644 --- a/internal/storage/sql/rule_test.go +++ b/internal/storage/sql/rule_test.go @@ -5,10 +5,13 @@ import ( "encoding/json" "fmt" "sort" + "time" + "github.com/gofrs/uuid" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "go.flipt.io/flipt/internal/storage" + fliptsql "go.flipt.io/flipt/internal/storage/sql" "go.flipt.io/flipt/internal/storage/sql/common" flipt "go.flipt.io/flipt/rpc/flipt" ) @@ -406,6 +409,105 @@ func (s *DBTestSuite) TestListRulesPagination_LimitWithNextPage() { assert.Equal(t, reqs[0].Rank, got[0].Rank) } +func (s *DBTestSuite) TestListRulesPagination_FullWalk() { + t := s.T() + + namespace := uuid.Must(uuid.NewV4()).String() + + ctx := context.Background() + _, err := s.store.CreateNamespace(ctx, &flipt.CreateNamespaceRequest{ + Key: namespace, + }) + require.NoError(t, err) + + flag, err := s.store.CreateFlag(ctx, &flipt.CreateFlagRequest{ + NamespaceKey: namespace, + Key: "flag-list-rules-full-walk", + Name: "flag-list-rules-full-walk", + }) + require.NoError(t, err) + + variant, err := s.store.CreateVariant(ctx, &flipt.CreateVariantRequest{ + NamespaceKey: namespace, + FlagKey: flag.Key, + Key: "variant-list-rules-full-walk", + }) + require.NoError(t, err) + + segment, err := s.store.CreateSegment(ctx, &flipt.CreateSegmentRequest{ + NamespaceKey: namespace, + Key: "segment-list-rules-full-walk", + Name: "segment-list-rules-full-walk", + }) + require.NoError(t, err) + + var ( + totalRules = 9 + pageSize = uint64(3) + ) + + for i := 0; i < totalRules; i++ { + req := flipt.CreateRuleRequest{ + NamespaceKey: namespace, + FlagKey: flag.Key, + SegmentKey: segment.Key, + Rank: int32(i + 1), + } + + rule, err := s.store.CreateRule(ctx, &req) + require.NoError(t, err) + + for i := 0; i < 2; i++ { + if i > 0 && s.db.Driver == fliptsql.MySQL { + // required for MySQL since it only s.stores timestamps to the second and not millisecond granularity + time.Sleep(time.Second) + } + + _, err := s.store.CreateDistribution(ctx, &flipt.CreateDistributionRequest{ + NamespaceKey: namespace, + FlagKey: flag.Key, + VariantId: variant.Id, + RuleId: rule.Id, + Rollout: 100.0, + }) + require.NoError(t, err) + } + } + + resp, err := s.store.ListRules(ctx, namespace, flag.Key, + storage.WithLimit(pageSize)) + require.NoError(t, err) + + found := resp.Results + for token := resp.NextPageToken; token != ""; token = resp.NextPageToken { + resp, err = s.store.ListRules(ctx, namespace, flag.Key, + storage.WithLimit(pageSize), + storage.WithPageToken(token), + ) + require.NoError(t, err) + + found = append(found, resp.Results...) + } + + require.Len(t, found, totalRules) + + for i := 0; i < totalRules; i++ { + assert.Equal(t, namespace, found[i].NamespaceKey) + assert.Equal(t, flag.Key, found[i].FlagKey) + assert.Equal(t, segment.Key, found[i].SegmentKey) + assert.Equal(t, int32(i+1), found[i].Rank) + + require.Len(t, found[i].Distributions, 2) + assert.Equal(t, found[i].Id, found[i].Distributions[0].RuleId) + assert.Equal(t, variant.Id, found[i].Distributions[0].VariantId) + assert.Equal(t, float32(100.0), found[i].Distributions[0].Rollout) + + assert.Equal(t, found[i].Id, found[i].Distributions[1].RuleId) + assert.Equal(t, variant.Id, found[i].Distributions[1].VariantId) + assert.Equal(t, float32(100.0), found[i].Distributions[1].Rollout) + } +} + func (s *DBTestSuite) TestCreateRuleAndDistribution() { t := s.T() diff --git a/internal/storage/sql/segment_test.go b/internal/storage/sql/segment_test.go index 82a15bd0ce..541e5e989d 100644 --- a/internal/storage/sql/segment_test.go +++ b/internal/storage/sql/segment_test.go @@ -314,6 +314,93 @@ func (s *DBTestSuite) TestListSegmentsPagination_LimitWithNextPage() { assert.Equal(t, oldest.Key, got[2].Key) } +func (s *DBTestSuite) TestListSegmentsPagination_FullWalk() { + t := s.T() + + namespace := uuid.Must(uuid.NewV4()).String() + + ctx := context.Background() + _, err := s.store.CreateNamespace(ctx, &flipt.CreateNamespaceRequest{ + Key: namespace, + }) + require.NoError(t, err) + + var ( + totalSegments = 9 + pageSize = uint64(3) + ) + + for i := 0; i < totalSegments; i++ { + req := flipt.CreateSegmentRequest{ + NamespaceKey: namespace, + Key: fmt.Sprintf("segment_%03d", i), + Name: "foo", + Description: "bar", + } + + _, err := s.store.CreateSegment(ctx, &req) + require.NoError(t, err) + + for i := 0; i < 2; i++ { + if i > 0 && s.db.Driver == fliptsql.MySQL { + // required for MySQL since it only s.stores timestamps to the second and not millisecond granularity + time.Sleep(time.Second) + } + + _, err := s.store.CreateConstraint(ctx, &flipt.CreateConstraintRequest{ + NamespaceKey: namespace, + SegmentKey: req.Key, + Type: flipt.ComparisonType_STRING_COMPARISON_TYPE, + Property: "foo", + Operator: flipt.OpEQ, + Value: "bar", + }) + require.NoError(t, err) + } + } + + resp, err := s.store.ListSegments(ctx, namespace, + storage.WithLimit(pageSize)) + require.NoError(t, err) + + found := resp.Results + for token := resp.NextPageToken; token != ""; token = resp.NextPageToken { + resp, err = s.store.ListSegments(ctx, namespace, + storage.WithLimit(pageSize), + storage.WithPageToken(token), + ) + require.NoError(t, err) + + found = append(found, resp.Results...) + } + + require.Len(t, found, totalSegments) + + for i := 0; i < totalSegments; i++ { + assert.Equal(t, namespace, found[i].NamespaceKey) + + expectedSegment := fmt.Sprintf("segment_%03d", i) + assert.Equal(t, expectedSegment, found[i].Key) + assert.Equal(t, "foo", found[i].Name) + assert.Equal(t, "bar", found[i].Description) + + require.Len(t, found[i].Constraints, 2) + assert.Equal(t, namespace, found[i].Constraints[0].NamespaceKey) + assert.Equal(t, expectedSegment, found[i].Constraints[0].SegmentKey) + assert.Equal(t, flipt.ComparisonType_STRING_COMPARISON_TYPE, found[i].Constraints[0].Type) + assert.Equal(t, "foo", found[i].Constraints[0].Property) + assert.Equal(t, flipt.OpEQ, found[i].Constraints[0].Operator) + assert.Equal(t, "bar", found[i].Constraints[0].Value) + + assert.Equal(t, namespace, found[i].Constraints[1].NamespaceKey) + assert.Equal(t, expectedSegment, found[i].Constraints[1].SegmentKey) + assert.Equal(t, flipt.ComparisonType_STRING_COMPARISON_TYPE, found[i].Constraints[1].Type) + assert.Equal(t, "foo", found[i].Constraints[1].Property) + assert.Equal(t, flipt.OpEQ, found[i].Constraints[1].Operator) + assert.Equal(t, "bar", found[i].Constraints[1].Value) + } +} + func (s *DBTestSuite) TestCreateSegment() { t := s.T() @@ -631,11 +718,12 @@ func (s *DBTestSuite) TestCreateConstraint() { assert.NotNil(t, segment) constraint, err := s.store.CreateConstraint(context.TODO(), &flipt.CreateConstraintRequest{ - SegmentKey: segment.Key, - Type: flipt.ComparisonType_STRING_COMPARISON_TYPE, - Property: "foo", - Operator: "EQ", - Value: "bar", + SegmentKey: segment.Key, + Type: flipt.ComparisonType_STRING_COMPARISON_TYPE, + Property: "foo", + Operator: "EQ", + Value: "bar", + Description: "desc", }) require.NoError(t, err) @@ -650,6 +738,7 @@ func (s *DBTestSuite) TestCreateConstraint() { assert.Equal(t, "bar", constraint.Value) assert.NotZero(t, constraint.CreatedAt) assert.Equal(t, constraint.CreatedAt.Seconds, constraint.UpdatedAt.Seconds) + assert.Equal(t, "desc", constraint.Description) // get the segment again segment, err = s.store.GetSegment(context.TODO(), storage.DefaultNamespace, segment.Key) @@ -680,6 +769,7 @@ func (s *DBTestSuite) TestCreateConstraintNamespace() { Property: "foo", Operator: "EQ", Value: "bar", + Description: "desc", }) require.NoError(t, err) @@ -694,6 +784,7 @@ func (s *DBTestSuite) TestCreateConstraintNamespace() { assert.Equal(t, "bar", constraint.Value) assert.NotZero(t, constraint.CreatedAt) assert.Equal(t, constraint.CreatedAt.Seconds, constraint.UpdatedAt.Seconds) + assert.Equal(t, "desc", constraint.Description) // get the segment again segment, err = s.store.GetSegment(context.TODO(), s.namespace, segment.Key) @@ -767,12 +858,13 @@ func (s *DBTestSuite) TestUpdateConstraint() { assert.Equal(t, constraint.CreatedAt.Seconds, constraint.UpdatedAt.Seconds) updated, err := s.store.UpdateConstraint(context.TODO(), &flipt.UpdateConstraintRequest{ - Id: constraint.Id, - SegmentKey: constraint.SegmentKey, - Type: flipt.ComparisonType_STRING_COMPARISON_TYPE, - Property: "foo", - Operator: "EMPTY", - Value: "bar", + Id: constraint.Id, + SegmentKey: constraint.SegmentKey, + Type: flipt.ComparisonType_STRING_COMPARISON_TYPE, + Property: "foo", + Operator: "EMPTY", + Value: "bar", + Description: "desc", }) require.NoError(t, err) @@ -786,6 +878,7 @@ func (s *DBTestSuite) TestUpdateConstraint() { assert.Empty(t, updated.Value) assert.NotZero(t, updated.CreatedAt) assert.NotZero(t, updated.UpdatedAt) + assert.Equal(t, "desc", updated.Description) // get the segment again segment, err = s.store.GetSegment(context.TODO(), storage.DefaultNamespace, segment.Key) @@ -839,6 +932,7 @@ func (s *DBTestSuite) TestUpdateConstraintNamespace() { Property: "foo", Operator: "EMPTY", Value: "bar", + Description: "desc", }) require.NoError(t, err) @@ -852,6 +946,7 @@ func (s *DBTestSuite) TestUpdateConstraintNamespace() { assert.Empty(t, updated.Value) assert.NotZero(t, updated.CreatedAt) assert.NotZero(t, updated.UpdatedAt) + assert.Equal(t, "desc", updated.Description) // get the segment again segment, err = s.store.GetSegment(context.TODO(), s.namespace, segment.Key) diff --git a/internal/storage/sql/testing/testing.go b/internal/storage/sql/testing/testing.go index 25f3d61a48..b6beea9e19 100644 --- a/internal/storage/sql/testing/testing.go +++ b/internal/storage/sql/testing/testing.go @@ -124,6 +124,7 @@ func Open() (*Database, error) { cfg.Database.Name = dbName cfg.Database.User = username cfg.Database.Password = password + cfg.Database.ConnMaxLifetime = 1 * time.Minute } db, driver, err := fliptsql.Open(cfg, fliptsql.WithMigrate, fliptsql.WithSSLDisabled) diff --git a/internal/telemetry/telemetry.go b/internal/telemetry/telemetry.go index 8c09db28ff..2f7cd803a7 100644 --- a/internal/telemetry/telemetry.go +++ b/internal/telemetry/telemetry.go @@ -21,7 +21,7 @@ import ( const ( filename = "telemetry.json" - version = "1.0" + version = "1.1" event = "flipt.ping" ) @@ -31,8 +31,19 @@ type ping struct { Flipt flipt `json:"flipt"` } +type storage struct { + Database string `json:"database,omitempty"` + Cache string `json:"cache,omitempty"` +} + +type authentication struct { + Methods []string `json:"methods,omitempty"` +} + type flipt struct { - Version string `json:"version"` + Version string `json:"version"` + Storage *storage `json:"storage,omitempty"` + Authentication *authentication `json:"authentication,omitempty"` } type state struct { @@ -161,15 +172,40 @@ func (r *Reporter) ping(_ context.Context, f file) error { var ( props = analytics.NewProperties() - p = ping{ - Version: s.Version, - UUID: s.UUID, - Flipt: flipt{ - Version: info.Version, - }, + flipt = flipt{ + Version: info.Version, } ) + flipt.Storage = &storage{ + Database: r.cfg.Database.Protocol.String(), + } + + // only report cache if enabled + if r.cfg.Cache.Enabled { + flipt.Storage.Cache = r.cfg.Cache.Backend.String() + } + + // authentication + methods := make([]string, 0, len(r.cfg.Authentication.Methods.EnabledMethods())) + + for _, m := range r.cfg.Authentication.Methods.EnabledMethods() { + methods = append(methods, m.Name()) + } + + // only report authentications if enabled + if len(methods) > 0 { + flipt.Authentication = &authentication{ + Methods: methods, + } + } + + p := ping{ + Version: version, + UUID: s.UUID, + Flipt: flipt, + } + // marshal as json first so we can get the correct case field names in the analytics service out, err := json.Marshal(p) if err != nil { diff --git a/internal/telemetry/telemetry_test.go b/internal/telemetry/telemetry_test.go index f60d752fa9..562d02e3a0 100644 --- a/internal/telemetry/telemetry_test.go +++ b/internal/telemetry/telemetry_test.go @@ -88,43 +88,155 @@ func TestShutdown(t *testing.T) { } func TestPing(t *testing.T) { - var ( - logger = zaptest.NewLogger(t) - mockAnalytics = &mockAnalytics{} - - reporter = &Reporter{ + test := []struct { + name string + cfg config.Config + want map[string]interface{} + }{ + { + name: "basic", cfg: config.Config{ - Meta: config.MetaConfig{ - TelemetryEnabled: true, + Database: config.DatabaseConfig{ + Protocol: config.DatabaseSQLite, }, }, - logger: logger, - client: mockAnalytics, - info: info.Flipt{ - Version: "1.0.0", + want: map[string]interface{}{ + "version": "1.0.0", + "storage": map[string]interface{}{ + "database": "file", + }, }, - } - - in = bytes.NewBuffer(nil) - out = bytes.NewBuffer(nil) - mockFile = &mockFile{ - Reader: in, - Writer: out, - } - ) - - err := reporter.ping(context.Background(), mockFile) - assert.NoError(t, err) - - msg, ok := mockAnalytics.msg.(analytics.Track) - require.True(t, ok) - assert.Equal(t, "flipt.ping", msg.Event) - assert.NotEmpty(t, msg.AnonymousId) - assert.Equal(t, msg.AnonymousId, msg.Properties["uuid"]) - assert.Equal(t, "1.0", msg.Properties["version"]) - assert.Equal(t, "1.0.0", msg.Properties["flipt"].(map[string]interface{})["version"]) - - assert.NotEmpty(t, out.String()) + }, + { + name: "with cache not enabled", + cfg: config.Config{ + Database: config.DatabaseConfig{ + Protocol: config.DatabaseSQLite, + }, + Cache: config.CacheConfig{ + Enabled: false, + Backend: config.CacheRedis, + }, + }, + want: map[string]interface{}{ + "version": "1.0.0", + "storage": map[string]interface{}{ + "database": "file", + }, + }, + }, + { + name: "with cache", + cfg: config.Config{ + Database: config.DatabaseConfig{ + Protocol: config.DatabaseSQLite, + }, + Cache: config.CacheConfig{ + Enabled: true, + Backend: config.CacheRedis, + }, + }, + want: map[string]interface{}{ + "version": "1.0.0", + "storage": map[string]interface{}{ + "database": "file", + "cache": "redis", + }, + }, + }, + { + name: "with auth not enabled", + cfg: config.Config{ + Database: config.DatabaseConfig{ + Protocol: config.DatabaseSQLite, + }, + Authentication: config.AuthenticationConfig{ + Required: false, + Methods: config.AuthenticationMethods{ + Token: config.AuthenticationMethod[config.AuthenticationMethodTokenConfig]{ + Enabled: false, + }, + }, + }, + }, + want: map[string]interface{}{ + "version": "1.0.0", + "storage": map[string]interface{}{ + "database": "file", + }, + }, + }, + { + name: "with auth", + cfg: config.Config{ + Database: config.DatabaseConfig{ + Protocol: config.DatabaseSQLite, + }, + Authentication: config.AuthenticationConfig{ + Required: false, + Methods: config.AuthenticationMethods{ + Token: config.AuthenticationMethod[config.AuthenticationMethodTokenConfig]{ + Enabled: true, + }, + }, + }, + }, + want: map[string]interface{}{ + "version": "1.0.0", + "storage": map[string]interface{}{ + "database": "file", + }, + "authentication": map[string]interface{}{ + "methods": []interface{}{ + "token", + }, + }, + }, + }, + } + + for _, tt := range test { + t.Run(tt.name, func(t *testing.T) { + var ( + logger = zaptest.NewLogger(t) + mockAnalytics = &mockAnalytics{} + ) + + cfg := tt.cfg + cfg.Meta.TelemetryEnabled = true + + var ( + reporter = &Reporter{ + cfg: cfg, + logger: logger, + client: mockAnalytics, + info: info.Flipt{ + Version: "1.0.0", + }, + } + + in = bytes.NewBuffer(nil) + out = bytes.NewBuffer(nil) + mockFile = &mockFile{ + Reader: in, + Writer: out, + } + ) + + err := reporter.ping(context.Background(), mockFile) + assert.NoError(t, err) + + msg, ok := mockAnalytics.msg.(analytics.Track) + require.True(t, ok) + assert.Equal(t, "flipt.ping", msg.Event) + assert.NotEmpty(t, msg.AnonymousId) + assert.Equal(t, msg.AnonymousId, msg.Properties["uuid"]) + assert.Equal(t, "1.1", msg.Properties["version"]) + assert.Equal(t, tt.want, msg.Properties["flipt"]) + + assert.NotEmpty(t, out.String()) + }) + } } func TestPing_Existing(t *testing.T) { @@ -145,7 +257,7 @@ func TestPing_Existing(t *testing.T) { }, } - b, _ = ioutil.ReadFile("./testdata/telemetry.json") + b, _ = ioutil.ReadFile("./testdata/telemetry_v1.json") in = bytes.NewReader(b) out = bytes.NewBuffer(nil) mockFile = &mockFile{ @@ -162,7 +274,7 @@ func TestPing_Existing(t *testing.T) { assert.Equal(t, "flipt.ping", msg.Event) assert.Equal(t, "1545d8a8-7a66-4d8d-a158-0a1c576c68a6", msg.AnonymousId) assert.Equal(t, "1545d8a8-7a66-4d8d-a158-0a1c576c68a6", msg.Properties["uuid"]) - assert.Equal(t, "1.0", msg.Properties["version"]) + assert.Equal(t, "1.1", msg.Properties["version"]) assert.Equal(t, "1.0.0", msg.Properties["flipt"].(map[string]interface{})["version"]) assert.NotEmpty(t, out.String()) @@ -226,7 +338,7 @@ func TestPing_SpecifyStateDir(t *testing.T) { assert.Equal(t, "flipt.ping", msg.Event) assert.NotEmpty(t, msg.AnonymousId) assert.Equal(t, msg.AnonymousId, msg.Properties["uuid"]) - assert.Equal(t, "1.0", msg.Properties["version"]) + assert.Equal(t, "1.1", msg.Properties["version"]) assert.Equal(t, "1.0.0", msg.Properties["flipt"].(map[string]interface{})["version"]) b, _ := ioutil.ReadFile(path) diff --git a/internal/telemetry/testdata/telemetry.json b/internal/telemetry/testdata/telemetry_v1.json similarity index 100% rename from internal/telemetry/testdata/telemetry.json rename to internal/telemetry/testdata/telemetry_v1.json diff --git a/logos/users/uk-moj.png b/logos/users/uk-moj.png new file mode 100644 index 0000000000000000000000000000000000000000..03a26ff0d0828768ee409c013fa12ba0e0a8e26c GIT binary patch literal 12690 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 + + + + + Flipt - - - - - Flipt - - - - - + + + - -

- - - - + +
+ + diff --git a/ui/index.html b/ui/index.html index 3c75753546..13716d021e 100644 --- a/ui/index.html +++ b/ui/index.html @@ -1,19 +1,15 @@ + + + + + Flipt + - - - - - Flipt - - - - -
- - - - + +
+ + diff --git a/ui/package-lock.json b/ui/package-lock.json index 550537e35d..ff44b87a6f 100644 --- a/ui/package-lock.json +++ b/ui/package-lock.json @@ -16,37 +16,37 @@ "@headlessui/react": "^1.7.14", "@heroicons/react": "^2.0.17", "@loadable/component": "^5.15.3", - "@tanstack/react-table": "^8.8.5", + "@tanstack/react-table": "^8.9.1", "buffer": "^6.0.3", - "date-fns": "^2.29.3", + "date-fns": "^2.30.0", "dotenv": "^16.0.3", "formik": "^2.2.9", - "highlight.js": "^11.7.0", + "highlight.js": "^11.8.0", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.10.0", - "swr": "^2.1.3", + "react-router-dom": "^6.11.1", + "swr": "^2.1.5", "uuid": "^9.0.0", "yup": "^0.32.11" }, "devDependencies": { - "@babel/preset-typescript": "^7.21.4", - "@playwright/test": "^1.32.3", + "@babel/preset-typescript": "^7.21.5", + "@playwright/test": "^1.33.0", "@tailwindcss/forms": "^0.5.3", - "@types/jest": "^29.5.0", + "@types/jest": "^29.5.1", "@types/loadable__component": "^5.13.4", "@types/lodash": "^4.14.194", - "@types/node": "^18.15.11", - "@types/react": "^18.0.37", - "@types/react-dom": "^18.0.11", + "@types/node": "^18.16.6", + "@types/react": "^18.2.6", + "@types/react-dom": "^18.2.1", "@types/react-router-dom": "^5.3.3", "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.59.0", - "@typescript-eslint/parser": "^5.58.0", + "@typescript-eslint/eslint-plugin": "^5.59.5", + "@typescript-eslint/parser": "^5.59.2", "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.14", - "eslint": "^8.38.0", + "eslint": "^8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.0.0", @@ -64,15 +64,27 @@ "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.5.0", - "postcss": "^8.4.22", - "prettier": "^2.8.7", + "postcss": "^8.4.23", + "prettier": "^2.8.8", "prettier-plugin-organize-imports": "^3.2.2", - "prettier-plugin-tailwindcss": "^0.2.7", - "tailwindcss": "^3.3.1", + "prettier-plugin-tailwindcss": "^0.2.8", + "tailwindcss": "^3.3.2", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "typescript": "^4.9.5", - "vite": "^4.2.2" + "vite": "^4.3.5" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@ampproject/remapping": { @@ -167,12 +179,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -295,9 +307,9 @@ } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -365,19 +377,19 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -396,9 +408,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true, "engines": { "node": ">=6.9.0" @@ -440,12 +452,12 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "dependencies": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -476,9 +488,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "dev": true, "engines": { "node": ">=6.9.0" @@ -546,9 +558,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.5.tgz", + "integrity": "sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1391,14 +1403,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" }, "engines": { "node": ">=6.9.0" @@ -1915,15 +1927,15 @@ } }, "node_modules/@babel/preset-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", - "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", + "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", "@babel/plugin-transform-typescript": "^7.21.3" }, "engines": { @@ -1965,19 +1977,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, "dependencies": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -1986,12 +1998,12 @@ } }, "node_modules/@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -2453,14 +2465,14 @@ } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -2503,9 +2515,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3486,13 +3498,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.32.3", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.32.3.tgz", - "integrity": "sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.33.0.tgz", + "integrity": "sha512-YunBa2mE7Hq4CfPkGzQRK916a4tuZoVx/EpLjeWlTVOnD4S2+fdaQZE0LJkbfhN5FTSKNLdcl7MoT5XB37bTkg==", "dev": true, "dependencies": { "@types/node": "*", - "playwright-core": "1.32.3" + "playwright-core": "1.33.0" }, "bin": { "playwright": "cli.js" @@ -3505,9 +3517,9 @@ } }, "node_modules/@remix-run/router": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", - "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==", + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.1.tgz", + "integrity": "sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA==", "engines": { "node": ">=14" } @@ -3555,11 +3567,11 @@ } }, "node_modules/@tanstack/react-table": { - "version": "8.8.5", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.8.5.tgz", - "integrity": "sha512-g/t21E/ICHvaCOJOhsDNr5QaB/6aDQEHFbx/YliwwU/CJThMqG+dS28vnToIBV/5MBgpeXoGRi2waDJVJlZrtg==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.9.1.tgz", + "integrity": "sha512-yHs2m6lk5J5RNcu2dNtsDGux66wNXZjEgzxos6MRCX8gL+nqxeW3ZglqP6eANN0bGElPnjvqiUHGQvdACOr3Cw==", "dependencies": { - "@tanstack/table-core": "8.8.5" + "@tanstack/table-core": "8.9.1" }, "engines": { "node": ">=12" @@ -3574,9 +3586,9 @@ } }, "node_modules/@tanstack/table-core": { - "version": "8.8.5", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.8.5.tgz", - "integrity": "sha512-Xnwa1qxpgvSW7ozLiexmKp2PIYcLBiY/IizbdGriYCL6OOHuZ9baRhrrH51zjyz+61ly6K59rmt6AI/3RR+97Q==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.9.1.tgz", + "integrity": "sha512-2+R83n8vMZND0q3W1lSiF7co9nFbeWbjAErFf27xwbeA9E0wtUu5ZDfgj+TZ6JzdAEQAgfxkk/QNFAKiS8E4MA==", "engines": { "node": ">=12" }, @@ -3690,9 +3702,9 @@ } }, "node_modules/@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "version": "29.5.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", + "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", "dev": true, "dependencies": { "expect": "^29.0.0", @@ -3726,9 +3738,9 @@ "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" }, "node_modules/@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "version": "18.16.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.6.tgz", + "integrity": "sha512-N7KINmeB8IN3vRR8dhgHEp+YpWvGFcpDoh5XZ8jB5a00AdFKCKEyyGTOPTddUf4JqU1ZKTVxkOxakDvchNVI2Q==", "dev": true }, "node_modules/@types/parse-json": { @@ -3750,9 +3762,9 @@ "dev": true }, "node_modules/@types/react": { - "version": "18.0.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz", - "integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", + "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", "dev": true, "dependencies": { "@types/prop-types": "*", @@ -3761,9 +3773,9 @@ } }, "node_modules/@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.1.tgz", + "integrity": "sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w==", "dev": true, "dependencies": { "@types/react": "*" @@ -3830,15 +3842,15 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", + "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/type-utils": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -3864,13 +3876,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3881,9 +3893,9 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -3894,13 +3906,13 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -3921,17 +3933,17 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", + "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.5", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -3947,12 +3959,12 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.5", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4016,14 +4028,14 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", + "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "debug": "^4.3.4" }, "engines": { @@ -4043,13 +4055,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", + "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4060,9 +4072,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", + "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4073,13 +4085,13 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", + "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4100,12 +4112,12 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", + "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/types": "5.59.2", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -4129,9 +4141,9 @@ } }, "node_modules/@typescript-eslint/parser/node_modules/semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -4167,13 +4179,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", + "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -4194,13 +4206,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4211,9 +4223,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4224,13 +4236,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -4251,17 +4263,17 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", + "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.5", "eslint-scope": "^5.1.1", "semver": "^7.3.7" }, @@ -4277,12 +4289,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.5", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -5490,9 +5502,12 @@ "dev": true }, "node_modules/date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==", + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, "engines": { "node": ">=0.11" }, @@ -5872,15 +5887,15 @@ } }, "node_modules/eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -5890,9 +5905,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -6583,9 +6598,9 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6656,9 +6671,9 @@ } }, "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -6666,6 +6681,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/globals": { @@ -6717,14 +6735,14 @@ } }, "node_modules/espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "dependencies": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -7340,9 +7358,9 @@ } }, "node_modules/highlight.js": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", - "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==", + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", + "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==", "engines": { "node": ">=12.0.0" } @@ -10345,9 +10363,9 @@ } }, "node_modules/playwright-core": { - "version": "1.32.3", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.3.tgz", - "integrity": "sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.33.0.tgz", + "integrity": "sha512-aizyPE1Cj62vAECdph1iaMILpT0WUDCq3E6rW6I+dleSbBoGbktvJtzS6VHkZ4DKNEOG9qJpiom/ZxO+S15LAw==", "dev": true, "bin": { "playwright": "cli.js" @@ -10357,9 +10375,9 @@ } }, "node_modules/postcss": { - "version": "8.4.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz", - "integrity": "sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "funding": [ { @@ -10385,9 +10403,9 @@ } }, "node_modules/postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "dependencies": { "postcss-value-parser": "^4.0.0", @@ -10395,7 +10413,7 @@ "resolve": "^1.1.7" }, "engines": { - "node": ">=10.0.0" + "node": ">=14.0.0" }, "peerDependencies": { "postcss": "^8.0.0" @@ -10421,16 +10439,16 @@ } }, "node_modules/postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "dependencies": { "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "yaml": "^2.1.1" }, "engines": { - "node": ">= 10" + "node": ">= 14" }, "funding": { "type": "opencollective", @@ -10449,13 +10467,22 @@ } } }, + "node_modules/postcss-load-config/node_modules/yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true, + "engines": { + "node": ">= 14" + } + }, "node_modules/postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" }, "engines": { "node": ">=12.0" @@ -10497,9 +10524,9 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -10544,16 +10571,15 @@ } }, "node_modules/prettier-plugin-tailwindcss": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.7.tgz", - "integrity": "sha512-jQopIOgjLpX+y8HeD56XZw7onupRTC0cw7eKKUimI7vhjkPF5/1ltW5LyqaPtSyc8HvEpvNZsvvsGFa2qpa59w==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.8.tgz", + "integrity": "sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==", "dev": true, "engines": { "node": ">=12.17.0" }, "peerDependencies": { "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-php": "*", "@prettier/plugin-pug": "*", "@shopify/prettier-plugin-liquid": "*", "@shufo/prettier-plugin-blade": "*", @@ -10573,9 +10599,6 @@ "@ianvs/prettier-plugin-sort-imports": { "optional": true }, - "@prettier/plugin-php": { - "optional": true - }, "@prettier/plugin-pug": { "optional": true }, @@ -10722,18 +10745,6 @@ } ] }, - "node_modules/quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -10777,11 +10788,11 @@ } }, "node_modules/react-router": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", - "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", + "integrity": "sha512-OZINSdjJ2WgvAi7hgNLazrEV8SGn6xrKA+MkJe9wVDMZ3zQ6fdJocUjpCUCI0cNrelWjcvon0S/QK/j0NzL3KA==", "dependencies": { - "@remix-run/router": "1.5.0" + "@remix-run/router": "1.6.1" }, "engines": { "node": ">=14" @@ -10791,12 +10802,12 @@ } }, "node_modules/react-router-dom": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", - "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.1.tgz", + "integrity": "sha512-dPC2MhoPeTQ1YUOt5uIK376SMNWbwUxYRWk2ZmTT4fZfwlOvabF8uduRKKJIyfkCZvMgiF0GSCQckmkGGijIrg==", "dependencies": { - "@remix-run/router": "1.5.0", - "react-router": "6.10.0" + "@remix-run/router": "1.6.1", + "react-router": "6.11.1" }, "engines": { "node": ">=14" @@ -11017,9 +11028,9 @@ } }, "node_modules/rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz", + "integrity": "sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -11355,11 +11366,12 @@ } }, "node_modules/sucrase": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.31.0.tgz", - "integrity": "sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", "dev": true, "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "7.1.6", "lines-and-columns": "^1.1.6", @@ -11375,6 +11387,20 @@ "node": ">=8" } }, + "node_modules/sucrase/node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/sucrase/node_modules/glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -11420,9 +11446,9 @@ } }, "node_modules/swr": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.1.3.tgz", - "integrity": "sha512-g3ApxIM4Fjbd6vvEAlW60hJlKcYxHb+wtehogTygrh6Jsw7wNagv9m4Oj5Gq6zvvZw0tcyhVGL9L0oISvl3sUw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.1.5.tgz", + "integrity": "sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw==", "dependencies": { "use-sync-external-store": "^1.2.0" }, @@ -11447,53 +11473,43 @@ } }, "node_modules/tailwindcss": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", - "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "dev": true, "dependencies": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.17.2", - "lilconfig": "^2.0.6", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1", - "sucrase": "^3.29.0" + "resolve": "^1.22.2", + "sucrase": "^3.32.0" }, "bin": { "tailwind": "lib/cli.js", "tailwindcss": "lib/cli.js" }, "engines": { - "node": ">=12.13.0" - }, - "peerDependencies": { - "postcss": "^8.0.9" + "node": ">=14.0.0" } }, - "node_modules/tailwindcss/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/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -11974,15 +11990,14 @@ } }, "node_modules/vite": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.2.tgz", - "integrity": "sha512-PcNtT5HeDxb3QaSqFYkEum8f5sCVe0R3WK20qxgIvNBZPXU/Obxs/+ubBMeE7nLWeCo2LDzv+8hRYSlcaSehig==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.5.tgz", + "integrity": "sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==", "dev": true, "dependencies": { "esbuild": "^0.17.5", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" + "postcss": "^8.4.23", + "rollup": "^3.21.0" }, "bin": { "vite": "bin/vite.js" @@ -12266,6 +12281,12 @@ } }, "dependencies": { + "@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "dev": true + }, "@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", @@ -12334,12 +12355,12 @@ } }, "@babel/generator": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.4.tgz", - "integrity": "sha512-NieM3pVIYW2SwGzKoqfPrQsf4xGs9M9AIG3ThppsSRmO+m7eQhmI6amajKMUeIO37wFfsvnvcxQFx6x6iqxDnA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", + "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", "dev": true, "requires": { - "@babel/types": "^7.21.4", + "@babel/types": "^7.21.5", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -12431,9 +12452,9 @@ } }, "@babel/helper-environment-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz", - "integrity": "sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", + "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", "dev": true }, "@babel/helper-explode-assignable-expression": { @@ -12483,19 +12504,19 @@ } }, "@babel/helper-module-transforms": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz", - "integrity": "sha512-79yj2AR4U/Oqq/WOV7Lx6hUjau1Zfo4cI+JLAVYeMV5XIlbOhmjEk5ulbTc9fMpmlojzZHkUUxAiK+UKn+hNQQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", + "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.20.2", + "@babel/helper-environment-visitor": "^7.21.5", + "@babel/helper-module-imports": "^7.21.4", + "@babel/helper-simple-access": "^7.21.5", "@babel/helper-split-export-declaration": "^7.18.6", "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.2", - "@babel/types": "^7.21.2" + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5" } }, "@babel/helper-optimise-call-expression": { @@ -12508,9 +12529,9 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz", - "integrity": "sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", + "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", "dev": true }, "@babel/helper-remap-async-to-generator": { @@ -12540,12 +12561,12 @@ } }, "@babel/helper-simple-access": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz", - "integrity": "sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", + "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", "dev": true, "requires": { - "@babel/types": "^7.20.2" + "@babel/types": "^7.21.5" } }, "@babel/helper-skip-transparent-expression-wrappers": { @@ -12567,9 +12588,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.19.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", - "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "dev": true }, "@babel/helper-validator-identifier": { @@ -12619,9 +12640,9 @@ } }, "@babel/parser": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.4.tgz", - "integrity": "sha512-alVJj7k7zIxqBZ7BTRhz0IqJFxW1VJbm6N8JbcYhQ186df9ZBPbZBmWSqAMXwHGsCJdYks7z/voa3ibiS5bCIw==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.5.tgz", + "integrity": "sha512-J+IxH2IsxV4HbnTrSWgMAQj0UEo61hDA4Ny8h8PCX0MLXiibqHbqIOVneqdocemSBc22VpBKxt4J6FQzy9HarQ==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { @@ -13167,14 +13188,14 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.21.2", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.2.tgz", - "integrity": "sha512-Cln+Yy04Gxua7iPdj6nOV96smLGjpElir5YwzF0LBPKoPlLDNJePNlrGGaybAJkd0zKRnOVXOgizSqPYMNYkzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", + "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.21.2", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-simple-access": "^7.20.2" + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helper-plugin-utils": "^7.21.5", + "@babel/helper-simple-access": "^7.21.5" } }, "@babel/plugin-transform-modules-systemjs": { @@ -13526,15 +13547,15 @@ } }, "@babel/preset-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.4.tgz", - "integrity": "sha512-sMLNWY37TCdRH/bJ6ZeeOH1nPuanED7Ai9Y/vH31IPqalioJ6ZNFUWONsakhv4r4n+I6gm5lmoE0olkgib/j/A==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.21.5.tgz", + "integrity": "sha512-iqe3sETat5EOrORXiQ6rWfoOg2y68Cs75B9wNxdPW4kixJxh7aXQE1KPdWLDniC24T/6dSnguF33W9j/ZZQcmA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.20.2", + "@babel/helper-plugin-utils": "^7.21.5", "@babel/helper-validator-option": "^7.21.0", "@babel/plugin-syntax-jsx": "^7.21.4", - "@babel/plugin-transform-modules-commonjs": "^7.21.2", + "@babel/plugin-transform-modules-commonjs": "^7.21.5", "@babel/plugin-transform-typescript": "^7.21.3" } }, @@ -13564,30 +13585,30 @@ } }, "@babel/traverse": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.4.tgz", - "integrity": "sha512-eyKrRHKdyZxqDm+fV1iqL9UAHMoIg0nDaGqfIOd8rKH17m5snv7Gn4qgjBoFfLz9APvjFU/ICT00NVCv1Epp8Q==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", + "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", "dev": true, "requires": { "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.4", - "@babel/helper-environment-visitor": "^7.18.9", + "@babel/generator": "^7.21.5", + "@babel/helper-environment-visitor": "^7.21.5", "@babel/helper-function-name": "^7.21.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.4", - "@babel/types": "^7.21.4", + "@babel/parser": "^7.21.5", + "@babel/types": "^7.21.5", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.4.tgz", - "integrity": "sha512-rU2oY501qDxE8Pyo7i/Orqma4ziCOrby0/9mvbDUGEfvZjb279Nk9k19e2fiCxHbRRpY2ZyrgW1eq22mvmOIzA==", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", + "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.19.4", + "@babel/helper-string-parser": "^7.21.5", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } @@ -13824,14 +13845,14 @@ "dev": true }, "@eslint/eslintrc": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.2.tgz", - "integrity": "sha512-3W4f5tDUra+pA+FzgugqL2pRimUTDJWKr7BINqOpkZrC0uYI0NIc0/JFgBROCU07HR6GieA5m3/rsPIhDmCXTQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", + "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", "dev": true, "requires": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.1", + "espree": "^9.5.2", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -13858,9 +13879,9 @@ } }, "@eslint/js": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.38.0.tgz", - "integrity": "sha512-IoD2MfUnOV58ghIHCiil01PcohxjbYR/qCxsoC+xNgUwh1EY8jOOrYmu3d3a71+tJJ23uscEV4X2HJWMsPJu4g==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.40.0.tgz", + "integrity": "sha512-ElyB54bJIhXQYVKjDSvCkPO1iU1tSAeVQJbllWJq1XQSmmA4dgFk8CbiBGpiOPxleE48vDogxCtmMYku4HSVLA==", "dev": true }, "@fortawesome/fontawesome-common-types": { @@ -14591,20 +14612,20 @@ } }, "@playwright/test": { - "version": "1.32.3", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.32.3.tgz", - "integrity": "sha512-BvWNvK0RfBriindxhLVabi8BRe3X0J9EVjKlcmhxjg4giWBD/xleLcg2dz7Tx0agu28rczjNIPQWznwzDwVsZQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.33.0.tgz", + "integrity": "sha512-YunBa2mE7Hq4CfPkGzQRK916a4tuZoVx/EpLjeWlTVOnD4S2+fdaQZE0LJkbfhN5FTSKNLdcl7MoT5XB37bTkg==", "dev": true, "requires": { "@types/node": "*", "fsevents": "2.3.2", - "playwright-core": "1.32.3" + "playwright-core": "1.33.0" } }, "@remix-run/router": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.5.0.tgz", - "integrity": "sha512-bkUDCp8o1MvFO+qxkODcbhSqRa6P2GXgrGZVpt0dCXNW2HCSCqYI0ZoAqEOSAjRWmmlKcYgFvN4B4S+zo/f8kg==" + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.1.tgz", + "integrity": "sha512-YUkWj+xs0oOzBe74OgErsuR3wVn+efrFhXBWrit50kOiED+pvQe2r6MWY0iJMQU/mSVKxvNzL4ZaYvjdX+G7ZA==" }, "@rushstack/eslint-patch": { "version": "1.2.0", @@ -14646,17 +14667,17 @@ } }, "@tanstack/react-table": { - "version": "8.8.5", - "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.8.5.tgz", - "integrity": "sha512-g/t21E/ICHvaCOJOhsDNr5QaB/6aDQEHFbx/YliwwU/CJThMqG+dS28vnToIBV/5MBgpeXoGRi2waDJVJlZrtg==", + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.9.1.tgz", + "integrity": "sha512-yHs2m6lk5J5RNcu2dNtsDGux66wNXZjEgzxos6MRCX8gL+nqxeW3ZglqP6eANN0bGElPnjvqiUHGQvdACOr3Cw==", "requires": { - "@tanstack/table-core": "8.8.5" + "@tanstack/table-core": "8.9.1" } }, "@tanstack/table-core": { - "version": "8.8.5", - "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.8.5.tgz", - "integrity": "sha512-Xnwa1qxpgvSW7ozLiexmKp2PIYcLBiY/IizbdGriYCL6OOHuZ9baRhrrH51zjyz+61ly6K59rmt6AI/3RR+97Q==" + "version": "8.9.1", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.9.1.tgz", + "integrity": "sha512-2+R83n8vMZND0q3W1lSiF7co9nFbeWbjAErFf27xwbeA9E0wtUu5ZDfgj+TZ6JzdAEQAgfxkk/QNFAKiS8E4MA==" }, "@tsconfig/node10": { "version": "1.0.9", @@ -14763,9 +14784,9 @@ } }, "@types/jest": { - "version": "29.5.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.0.tgz", - "integrity": "sha512-3Emr5VOl/aoBwnWcH/EFQvlSAmjV+XtV9GGu5mwdYew5vhQh0IUZx/60x0TzHDu09Bi7HMx10t/namdJw5QIcg==", + "version": "29.5.1", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-29.5.1.tgz", + "integrity": "sha512-tEuVcHrpaixS36w7hpsfLBLpjtMRJUE09/MHXn923LOVojDwyC14cWcfc0rDs0VEfUyYmt/+iX1kxxp+gZMcaQ==", "dev": true, "requires": { "expect": "^29.0.0", @@ -14799,9 +14820,9 @@ "integrity": "sha512-r22s9tAS7imvBt2lyHC9B8AGwWnXaYb1tY09oyLkXDs4vArpYJzw09nj8MLx5VfciBPGIb+ZwG0ssYnEPJxn/g==" }, "@types/node": { - "version": "18.15.11", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.11.tgz", - "integrity": "sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==", + "version": "18.16.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.16.6.tgz", + "integrity": "sha512-N7KINmeB8IN3vRR8dhgHEp+YpWvGFcpDoh5XZ8jB5a00AdFKCKEyyGTOPTddUf4JqU1ZKTVxkOxakDvchNVI2Q==", "dev": true }, "@types/parse-json": { @@ -14823,9 +14844,9 @@ "dev": true }, "@types/react": { - "version": "18.0.37", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.37.tgz", - "integrity": "sha512-4yaZZtkRN3ZIQD3KSEwkfcik8s0SWV+82dlJot1AbGYHCzJkWP3ENBY6wYeDRmKZ6HkrgoGAmR2HqdwYGp6OEw==", + "version": "18.2.6", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.6.tgz", + "integrity": "sha512-wRZClXn//zxCFW+ye/D2qY65UsYP1Fpex2YXorHc8awoNamkMZSvBxwxdYVInsHOZZd2Ppq8isnSzJL5Mpf8OA==", "dev": true, "requires": { "@types/prop-types": "*", @@ -14834,9 +14855,9 @@ } }, "@types/react-dom": { - "version": "18.0.11", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.11.tgz", - "integrity": "sha512-O38bPbI2CWtgw/OoQoY+BRelw7uysmXbWvw3nLWO21H1HSh+GOlqPuXshJfjmpNlKiiSDG9cc1JZAaMmVdcTlw==", + "version": "18.2.1", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.1.tgz", + "integrity": "sha512-8QZEV9+Kwy7tXFmjJrp3XUKQSs9LTnE0KnoUb0YCguWBiNW0Yfb2iBMYZ08WPg35IR6P3Z0s00B15SwZnO26+w==", "dev": true, "requires": { "@types/react": "*" @@ -14903,15 +14924,15 @@ "dev": true }, "@typescript-eslint/eslint-plugin": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.0.tgz", - "integrity": "sha512-p0QgrEyrxAWBecR56gyn3wkG15TJdI//eetInP3zYRewDh0XS+DhB3VUAd3QqvziFsfaQIoIuZMxZRB7vXYaYw==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.5.tgz", + "integrity": "sha512-feA9xbVRWJZor+AnLNAr7A8JRWeZqHUf4T9tlP+TN04b05pFVhO5eN7/O93Y/1OUlLMHKbnJisgDURs/qvtqdg==", "dev": true, "requires": { "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/type-utils": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/type-utils": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "grapheme-splitter": "^1.0.4", "ignore": "^5.2.0", @@ -14921,29 +14942,29 @@ }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" } }, "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -14952,28 +14973,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", + "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.5", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.5", "eslint-visitor-keys": "^3.3.0" } }, @@ -15013,41 +15034,41 @@ } }, "@typescript-eslint/parser": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.58.0.tgz", - "integrity": "sha512-ixaM3gRtlfrKzP8N6lRhBbjTow1t6ztfBvQNGuRM8qH1bjFFXIJ35XY+FC0RRBKn3C6cT+7VW1y8tNm7DwPHDQ==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.2.tgz", + "integrity": "sha512-uq0sKyw6ao1iFOZZGk9F8Nro/8+gfB5ezl1cA06SrqbgJAt0SRoFhb9pXaHvkrxUpZaoLxt8KlovHNk8Gp6/HQ==", "dev": true, "requires": { - "@typescript-eslint/scope-manager": "5.58.0", - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/typescript-estree": "5.58.0", + "@typescript-eslint/scope-manager": "5.59.2", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/typescript-estree": "5.59.2", "debug": "^4.3.4" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.58.0.tgz", - "integrity": "sha512-b+w8ypN5CFvrXWQb9Ow9T4/6LC2MikNf1viLkYTiTbkQl46CnR69w7lajz1icW0TBsYmlpg+mRzFJ4LEJ8X9NA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.2.tgz", + "integrity": "sha512-dB1v7ROySwQWKqQ8rEWcdbTsFjh2G0vn8KUyvTXdPoyzSL6lLGkiXEV5CvpJsEe9xIdKV+8Zqb7wif2issoOFA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0" + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2" } }, "@typescript-eslint/types": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.58.0.tgz", - "integrity": "sha512-JYV4eITHPzVQMnHZcYJXl2ZloC7thuUHrcUmxtzvItyKPvQ50kb9QXBkgNAt90OYMqwaodQh2kHutWZl1fc+1g==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.2.tgz", + "integrity": "sha512-LbJ/HqoVs2XTGq5shkiKaNTuVv5tTejdHgfdjqRUGdYhjW1crm/M7og2jhVskMt8/4wS3T1+PfFvL1K3wqYj4w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.58.0.tgz", - "integrity": "sha512-cRACvGTodA+UxnYM2uwA2KCwRL7VAzo45syNysqlMyNyjw0Z35Icc9ihPJZjIYuA5bXJYiJ2YGUB59BqlOZT1Q==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.2.tgz", + "integrity": "sha512-+j4SmbwVmZsQ9jEyBMgpuBD0rKwi9RxRpjX71Brr73RsYnEr3Lt5QZ624Bxphp8HUkSKfqGnPJp1kA5nl0Sh7Q==", "dev": true, "requires": { - "@typescript-eslint/types": "5.58.0", - "@typescript-eslint/visitor-keys": "5.58.0", + "@typescript-eslint/types": "5.59.2", + "@typescript-eslint/visitor-keys": "5.59.2", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15056,12 +15077,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.58.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.58.0.tgz", - "integrity": "sha512-/fBraTlPj0jwdyTwLyrRTxv/3lnU2H96pNTVM6z3esTWLtA5MZ9ghSMJ7Rb+TtUAdtEw9EyJzJ0EydIMKxQ9gA==", + "version": "5.59.2", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.2.tgz", + "integrity": "sha512-EEpsO8m3RASrKAHI9jpavNv9NlEUebV4qmF1OWxSTtKSFBpC1NCmWazDQHFivRf0O1DV11BA645yrLEVQ0/Lig==", "dev": true, "requires": { - "@typescript-eslint/types": "5.58.0", + "@typescript-eslint/types": "5.59.2", "eslint-visitor-keys": "^3.3.0" } }, @@ -15075,9 +15096,9 @@ } }, "semver": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.4.0.tgz", - "integrity": "sha512-RgOxM8Mw+7Zus0+zcLEUn8+JfoLpj/huFTItQy2hsM4khuC1HYRDp0cU482Ewn/Fcy6bCjufD8vAj7voC66KQw==", + "version": "7.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.0.tgz", + "integrity": "sha512-+XC0AD/R7Q2mPSRuy2Id0+CGTZ98+8f+KvwirxOKIEyid+XSx6HbC63p+O4IndTHuX5Z+JxQ0TghCkO5Cg/2HA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -15102,41 +15123,41 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.0.tgz", - "integrity": "sha512-d/B6VSWnZwu70kcKQSCqjcXpVH+7ABKH8P1KNn4K7j5PXXuycZTPXF44Nui0TEm6rbWGi8kc78xRgOC4n7xFgA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.5.tgz", + "integrity": "sha512-4eyhS7oGym67/pSxA2mmNq7X164oqDYNnZCUayBwJZIRVvKpBCMBzFnFxjeoDeShjtO6RQBHBuwybuX3POnDqg==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.59.0", - "@typescript-eslint/utils": "5.59.0", + "@typescript-eslint/typescript-estree": "5.59.5", + "@typescript-eslint/utils": "5.59.5", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.0.tgz", - "integrity": "sha512-tsoldKaMh7izN6BvkK6zRMINj4Z2d6gGhO2UsI8zGZY3XhLq1DndP3Ycjhi1JwdwPRwtLMW4EFPgpuKhbCGOvQ==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.5.tgz", + "integrity": "sha512-jVecWwnkX6ZgutF+DovbBJirZcAxgxC0EOHYt/niMROf8p4PwxxG32Qdhj/iIQQIuOflLjNkxoXyArkcIP7C3A==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0" + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5" } }, "@typescript-eslint/types": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.0.tgz", - "integrity": "sha512-yR2h1NotF23xFFYKHZs17QJnB51J/s+ud4PYU4MqdZbzeNxpgUr05+dNeCN/bb6raslHvGdd6BFCkVhpPk/ZeA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.5.tgz", + "integrity": "sha512-xkfRPHbqSH4Ggx4eHRIO/eGL8XL4Ysb4woL8c87YuAo8Md7AUjyWKa9YMwTL519SyDPrfEgKdewjkxNCVeJW7w==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.0.tgz", - "integrity": "sha512-sUNnktjmI8DyGzPdZ8dRwW741zopGxltGs/SAPgGL/AAgDpiLsCFLcMNSpbfXfmnNeHmK9h3wGmCkGRGAoUZAg==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.5.tgz", + "integrity": "sha512-+XXdLN2CZLZcD/mO7mQtJMvCkzRfmODbeSKuMY/yXbGkzvA9rJyDY5qDYNoiz2kP/dmyAxXquL2BvLQLJFPQIg==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/visitor-keys": "5.59.0", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/visitor-keys": "5.59.5", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -15145,28 +15166,28 @@ } }, "@typescript-eslint/utils": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.0.tgz", - "integrity": "sha512-GGLFd+86drlHSvPgN/el6dRQNYYGOvRSDVydsUaQluwIW3HvbXuxyuD5JETvBt/9qGYe+lOrDk6gRrWOHb/FvA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.5.tgz", + "integrity": "sha512-sCEHOiw+RbyTii9c3/qN74hYDPNORb8yWCoPLmB7BIflhplJ65u2PBpdRla12e3SSTJ2erRkPjz7ngLHhUegxA==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.0", - "@typescript-eslint/types": "5.59.0", - "@typescript-eslint/typescript-estree": "5.59.0", + "@typescript-eslint/scope-manager": "5.59.5", + "@typescript-eslint/types": "5.59.5", + "@typescript-eslint/typescript-estree": "5.59.5", "eslint-scope": "^5.1.1", "semver": "^7.3.7" } }, "@typescript-eslint/visitor-keys": { - "version": "5.59.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.0.tgz", - "integrity": "sha512-qZ3iXxQhanchCeaExlKPV3gDQFxMUmU35xfd5eCXB6+kUw1TUAbIy2n7QIrwz9s98DQLzNWyHp61fY0da4ZcbA==", + "version": "5.59.5", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.5.tgz", + "integrity": "sha512-qL+Oz+dbeBRTeyJTIy0eniD3uvqU7x+y1QceBismZ41hd4aBSRh8UAw4pZP0+XzLuPZmx4raNMq/I+59W2lXKA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.59.0", + "@typescript-eslint/types": "5.59.5", "eslint-visitor-keys": "^3.3.0" } }, @@ -16030,9 +16051,12 @@ "dev": true }, "date-fns": { - "version": "2.29.3", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.29.3.tgz", - "integrity": "sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA==" + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "requires": { + "@babel/runtime": "^7.21.0" + } }, "debug": { "version": "4.3.4", @@ -16324,15 +16348,15 @@ "dev": true }, "eslint": { - "version": "8.38.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.38.0.tgz", - "integrity": "sha512-pIdsD2jwlUGf/U38Jv97t8lq6HpaU/G9NKbYmpWpZGw3LdTNhZLbJePqxOXGB5+JEKfOPU/XLxYxFh03nr1KTg==", + "version": "8.40.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.40.0.tgz", + "integrity": "sha512-bvR+TsP9EHL3TqNtj9sCNJVAFK3fBN8Q7g5waghxyRsPLIMwL73XSKnZFK0hk/O2ANC+iAoq6PWMQ+IfBAJIiQ==", "dev": true, "requires": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.2", - "@eslint/js": "8.38.0", + "@eslint/eslintrc": "^2.0.3", + "@eslint/js": "8.40.0", "@humanwhocodes/config-array": "^0.11.8", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", @@ -16342,9 +16366,9 @@ "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.4.0", - "espree": "^9.5.1", + "eslint-scope": "^7.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.5.2", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -16412,9 +16436,9 @@ "dev": true }, "eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", "dev": true, "requires": { "esrecurse": "^4.3.0", @@ -16891,20 +16915,20 @@ } }, "eslint-visitor-keys": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.0.tgz", - "integrity": "sha512-HPpKPUBQcAsZOsHAFwTtIKcYlCje62XB7SEAcxjtmW6TD1WVpkS6i6/hOVtTZIl4zGj/mBqpFVGvaDneik+VoQ==", + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", "dev": true }, "espree": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.1.tgz", - "integrity": "sha512-5yxtHSZXRSW5pvv3hAlXM5+/Oswi1AUFqBmbibKb5s6bp3rGIDkyXU6xCoyuuLhijr4SFwPrXRoZjz0AZDN9tg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", + "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", "dev": true, "requires": { "acorn": "^8.8.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.0" + "eslint-visitor-keys": "^3.4.1" } }, "esprima": { @@ -17350,9 +17374,9 @@ } }, "highlight.js": { - "version": "11.7.0", - "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.7.0.tgz", - "integrity": "sha512-1rRqesRFhMO/PRF+G86evnyJkCgaZFOI+Z6kdj15TA18funfoqJXvgPCLSf0SWq3SRfg1j3HlDs8o4s3EGq1oQ==" + "version": "11.8.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.8.0.tgz", + "integrity": "sha512-MedQhoqVdr0U6SSnWPzfiadUcDHfN/Wzq25AkXiQv9oiOO/sG0S7XkvpFIqWBl9Yq1UYyYOOVORs5UW2XlPyzg==" }, "hoist-non-react-statics": { "version": "3.3.2", @@ -19539,15 +19563,15 @@ } }, "playwright-core": { - "version": "1.32.3", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.32.3.tgz", - "integrity": "sha512-SB+cdrnu74ZIn5Ogh/8278ngEh9NEEV0vR4sJFmK04h2iZpybfbqBY0bX6+BLYWVdV12JLLI+JEFtSnYgR+mWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.33.0.tgz", + "integrity": "sha512-aizyPE1Cj62vAECdph1iaMILpT0WUDCq3E6rW6I+dleSbBoGbktvJtzS6VHkZ4DKNEOG9qJpiom/ZxO+S15LAw==", "dev": true }, "postcss": { - "version": "8.4.22", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.22.tgz", - "integrity": "sha512-XseknLAfRHzVWjCEtdviapiBtfLdgyzExD50Rg2ePaucEesyh8Wv4VPdW0nbyDa1ydbrAxV19jvMT4+LFmcNUA==", + "version": "8.4.23", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", + "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", "dev": true, "requires": { "nanoid": "^3.3.6", @@ -19556,9 +19580,9 @@ } }, "postcss-import": { - "version": "14.1.0", - "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.1.0.tgz", - "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", "dev": true, "requires": { "postcss-value-parser": "^4.0.0", @@ -19576,22 +19600,30 @@ } }, "postcss-load-config": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", - "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.1.tgz", + "integrity": "sha512-vEJIc8RdiBRu3oRAI0ymerOn+7rPuMvRXslTvZUKZonDHFIczxztIyJ1urxM1x9JXEikvpWWTUUqal5j/8QgvA==", "dev": true, "requires": { "lilconfig": "^2.0.5", - "yaml": "^1.10.2" + "yaml": "^2.1.1" + }, + "dependencies": { + "yaml": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.2.2.tgz", + "integrity": "sha512-CBKFWExMn46Foo4cldiChEzn7S7SRV+wqiluAb6xmueD/fGyRHIhX8m14vVGgeFWjN540nKCNVj6P21eQjgTuA==", + "dev": true + } } }, "postcss-nested": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.0.tgz", - "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^6.0.11" } }, "postcss-selector-parser": { @@ -19617,9 +19649,9 @@ "dev": true }, "prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, "prettier-linter-helpers": { @@ -19639,9 +19671,9 @@ "requires": {} }, "prettier-plugin-tailwindcss": { - "version": "0.2.7", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.7.tgz", - "integrity": "sha512-jQopIOgjLpX+y8HeD56XZw7onupRTC0cw7eKKUimI7vhjkPF5/1ltW5LyqaPtSyc8HvEpvNZsvvsGFa2qpa59w==", + "version": "0.2.8", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.2.8.tgz", + "integrity": "sha512-KgPcEnJeIijlMjsA6WwYgRs5rh3/q76oInqtMXBA/EMcamrcYJpyhtRhyX1ayT9hnHlHTuO8sIifHF10WuSDKg==", "dev": true, "requires": {} }, @@ -19713,12 +19745,6 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "quick-lru": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz", - "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", - "dev": true - }, "react": { "version": "18.2.0", "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", @@ -19753,20 +19779,20 @@ "dev": true }, "react-router": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.10.0.tgz", - "integrity": "sha512-Nrg0BWpQqrC3ZFFkyewrflCud9dio9ME3ojHCF/WLsprJVzkq3q3UeEhMCAW1dobjeGbWgjNn/PVF6m46ANxXQ==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.1.tgz", + "integrity": "sha512-OZINSdjJ2WgvAi7hgNLazrEV8SGn6xrKA+MkJe9wVDMZ3zQ6fdJocUjpCUCI0cNrelWjcvon0S/QK/j0NzL3KA==", "requires": { - "@remix-run/router": "1.5.0" + "@remix-run/router": "1.6.1" } }, "react-router-dom": { - "version": "6.10.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.10.0.tgz", - "integrity": "sha512-E5dfxRPuXKJqzwSe/qGcqdwa18QiWC6f3H3cWXM24qj4N0/beCIf/CWTipop2xm7mR0RCS99NnaqPNjHtrAzCg==", + "version": "6.11.1", + "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.1.tgz", + "integrity": "sha512-dPC2MhoPeTQ1YUOt5uIK376SMNWbwUxYRWk2ZmTT4fZfwlOvabF8uduRKKJIyfkCZvMgiF0GSCQckmkGGijIrg==", "requires": { - "@remix-run/router": "1.5.0", - "react-router": "6.10.0" + "@remix-run/router": "1.6.1", + "react-router": "6.11.1" } }, "read-cache": { @@ -19926,9 +19952,9 @@ } }, "rollup": { - "version": "3.20.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.20.2.tgz", - "integrity": "sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==", + "version": "3.21.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.21.0.tgz", + "integrity": "sha512-ANPhVcyeHvYdQMUyCbczy33nbLzI7RzrBje4uvNiTDJGIMtlKoOStmympwr9OtS1LZxiDmE2wvxHyVhoLtf1KQ==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -20178,11 +20204,12 @@ "dev": true }, "sucrase": { - "version": "3.31.0", - "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.31.0.tgz", - "integrity": "sha512-6QsHnkqyVEzYcaiHsOKkzOtOgdJcb8i54x6AV2hDwyZcY9ZyykGZVw6L/YN98xC0evwTP6utsWWrKRaa8QlfEQ==", + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.32.0.tgz", + "integrity": "sha512-ydQOU34rpSyj2TGyz4D2p8rbktIOZ8QY9s+DGLvFU1i5pWJE8vkpruCjGCMHsdXwnD7JDcS+noSwM/a7zyNFDQ==", "dev": true, "requires": { + "@jridgewell/gen-mapping": "^0.3.2", "commander": "^4.0.0", "glob": "7.1.6", "lines-and-columns": "^1.1.6", @@ -20191,6 +20218,17 @@ "ts-interface-checker": "^0.1.9" }, "dependencies": { + "@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, "glob": { "version": "7.1.6", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", @@ -20223,9 +20261,9 @@ "dev": true }, "swr": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/swr/-/swr-2.1.3.tgz", - "integrity": "sha512-g3ApxIM4Fjbd6vvEAlW60hJlKcYxHb+wtehogTygrh6Jsw7wNagv9m4Oj5Gq6zvvZw0tcyhVGL9L0oISvl3sUw==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/swr/-/swr-2.1.5.tgz", + "integrity": "sha512-/OhfZMcEpuz77KavXST5q6XE9nrOBOVcBLWjMT+oAE/kQHyE3PASrevXCtQDZ8aamntOfFkbVJp7Il9tNBQWrw==", "requires": { "use-sync-external-store": "^1.2.0" } @@ -20241,43 +20279,34 @@ } }, "tailwindcss": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.1.tgz", - "integrity": "sha512-Vkiouc41d4CEq0ujXl6oiGFQ7bA3WEhUZdTgXAhtKxSy49OmKs8rEfQmupsfF0IGW8fv2iQkp1EVUuapCFrZ9g==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.3.2.tgz", + "integrity": "sha512-9jPkMiIBXvPc2KywkraqsUfbfj+dHDb+JPWtSJa9MLFdrPyazI7q6WX2sUrm7R9eVR7qqv3Pas7EvQFzxKnI6w==", "dev": true, "requires": { + "@alloc/quick-lru": "^5.2.0", "arg": "^5.0.2", "chokidar": "^3.5.3", - "color-name": "^1.1.4", "didyoumean": "^1.2.2", "dlv": "^1.1.3", "fast-glob": "^3.2.12", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.17.2", - "lilconfig": "^2.0.6", + "jiti": "^1.18.2", + "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", "object-hash": "^3.0.0", "picocolors": "^1.0.0", - "postcss": "^8.0.9", - "postcss-import": "^14.1.0", - "postcss-js": "^4.0.0", - "postcss-load-config": "^3.1.4", - "postcss-nested": "6.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", "postcss-selector-parser": "^6.0.11", "postcss-value-parser": "^4.2.0", - "quick-lru": "^5.1.1", - "resolve": "^1.22.1", - "sucrase": "^3.29.0" - }, - "dependencies": { - "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 - } + "resolve": "^1.22.2", + "sucrase": "^3.32.0" } }, "tapable": { @@ -20622,16 +20651,15 @@ } }, "vite": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.2.2.tgz", - "integrity": "sha512-PcNtT5HeDxb3QaSqFYkEum8f5sCVe0R3WK20qxgIvNBZPXU/Obxs/+ubBMeE7nLWeCo2LDzv+8hRYSlcaSehig==", + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.3.5.tgz", + "integrity": "sha512-0gEnL9wiRFxgz40o/i/eTBwm+NEbpUeTWhzKrZDSdKm6nplj+z4lKz8ANDgildxHm47Vg8EUia0aicKbawUVVA==", "dev": true, "requires": { "esbuild": "^0.17.5", "fsevents": "~2.3.2", - "postcss": "^8.4.21", - "resolve": "^1.22.1", - "rollup": "^3.18.0" + "postcss": "^8.4.23", + "rollup": "^3.21.0" } }, "walker": { diff --git a/ui/package.json b/ui/package.json index 3472c07fb1..0b8419d557 100644 --- a/ui/package.json +++ b/ui/package.json @@ -20,37 +20,37 @@ "@headlessui/react": "^1.7.14", "@heroicons/react": "^2.0.17", "@loadable/component": "^5.15.3", - "@tanstack/react-table": "^8.8.5", + "@tanstack/react-table": "^8.9.1", "buffer": "^6.0.3", - "date-fns": "^2.29.3", + "date-fns": "^2.30.0", "dotenv": "^16.0.3", "formik": "^2.2.9", - "highlight.js": "^11.7.0", + "highlight.js": "^11.8.0", "lodash": "^4.17.21", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-router-dom": "^6.10.0", - "swr": "^2.1.3", + "react-router-dom": "^6.11.1", + "swr": "^2.1.5", "uuid": "^9.0.0", "yup": "^0.32.11" }, "devDependencies": { - "@babel/preset-typescript": "^7.21.4", - "@playwright/test": "^1.32.3", + "@babel/preset-typescript": "^7.21.5", + "@playwright/test": "^1.33.0", "@tailwindcss/forms": "^0.5.3", - "@types/jest": "^29.5.0", + "@types/jest": "^29.5.1", "@types/loadable__component": "^5.13.4", "@types/lodash": "^4.14.194", - "@types/node": "^18.15.11", - "@types/react": "^18.0.37", - "@types/react-dom": "^18.0.11", + "@types/node": "^18.16.6", + "@types/react": "^18.2.6", + "@types/react-dom": "^18.2.1", "@types/react-router-dom": "^5.3.3", "@types/uuid": "^9.0.1", - "@typescript-eslint/eslint-plugin": "^5.59.0", - "@typescript-eslint/parser": "^5.58.0", + "@typescript-eslint/eslint-plugin": "^5.59.5", + "@typescript-eslint/parser": "^5.59.2", "@vitejs/plugin-react": "^3.1.0", "autoprefixer": "^10.4.14", - "eslint": "^8.38.0", + "eslint": "^8.40.0", "eslint-config-airbnb": "^19.0.4", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-airbnb-typescript": "^17.0.0", @@ -68,14 +68,14 @@ "eslint-plugin-react": "^7.32.2", "eslint-plugin-react-hooks": "^4.6.0", "jest": "^29.5.0", - "postcss": "^8.4.22", - "prettier": "^2.8.7", + "postcss": "^8.4.23", + "prettier": "^2.8.8", "prettier-plugin-organize-imports": "^3.2.2", - "prettier-plugin-tailwindcss": "^0.2.7", - "tailwindcss": "^3.3.1", + "prettier-plugin-tailwindcss": "^0.2.8", + "tailwindcss": "^3.3.2", "ts-jest": "^29.1.0", "ts-node": "^10.9.1", "typescript": "^4.9.5", - "vite": "^4.2.2" + "vite": "^4.3.5" } } diff --git a/ui/src/app/auth/Login.tsx b/ui/src/app/auth/Login.tsx index edf9e58401..7d8b480738 100644 --- a/ui/src/app/auth/Login.tsx +++ b/ui/src/app/auth/Login.tsx @@ -119,33 +119,60 @@ export default function Login() { Login to Flipt - -
+
-
- {providers.map((provider) => ( -
- { - e.preventDefault(); - authorize(provider.authorize_url); - }} - > - - Sign in with {provider.name} - - - With {provider.name} - + {providers && providers.length > 0 && ( + + )} + {(!providers || providers.length === 0) && ( +
+
+

+ No Providers +

+
+

+ Authentication is set to{' '} + required, + however, there are no login providers configured. + Please see the documentation for more information. +

+
+
- ))} -
+
+ )}
diff --git a/ui/src/app/console/Console.tsx b/ui/src/app/console/Console.tsx index e10fa9f5a7..c849ed5e38 100644 --- a/ui/src/app/console/Console.tsx +++ b/ui/src/app/console/Console.tsx @@ -22,6 +22,7 @@ import { import { IConsole } from '~/types/Console'; import { IFlag, IFlagList } from '~/types/Flag'; import { INamespace } from '~/types/Namespace'; +import { classNames } from '~/utils/helpers'; hljs.registerLanguage('json', javascript); @@ -41,6 +42,7 @@ export default function Console() { const [flags, setFlags] = useState([]); const [selectedFlag, setSelectedFlag] = useState(null); const [response, setResponse] = useState(null); + const [hasEvaluationError, setHasEvaluationError] = useState(false); const { setError, clearError } = useError(); const navigate = useNavigate(); @@ -79,10 +81,12 @@ export default function Console() { evaluate(currentNamespace.key, flagKey, rest) .then((resp) => { + setHasEvaluationError(false); setResponse(JSON.stringify(resp, null, 2)); }) .catch((err) => { - setResponse(err.message); + setHasEvaluationError(true); + setResponse('error: ' + err.message); }); }; @@ -130,6 +134,7 @@ export default function Console() { }} onReset={() => { setResponse(null); + setHasEvaluationError(false); setSelectedFlag(null); }} > @@ -214,7 +219,12 @@ export default function Console() {
{response && (
-                  
+                  
                     {response as React.ReactNode}
                   
                 
diff --git a/ui/src/app/flags/EditFlag.tsx b/ui/src/app/flags/EditFlag.tsx index 35ed4e9fd7..bac35e4dcb 100644 --- a/ui/src/app/flags/EditFlag.tsx +++ b/ui/src/app/flags/EditFlag.tsx @@ -167,7 +167,7 @@ export default function EditFlag() { {variant.name} - + {variant.description} diff --git a/ui/src/app/segments/Segment.tsx b/ui/src/app/segments/Segment.tsx index 4fb54375b5..dd1eb5d95d 100644 --- a/ui/src/app/segments/Segment.tsx +++ b/ui/src/app/segments/Segment.tsx @@ -253,6 +253,12 @@ export default function Segment() { > Value + + Description + {constraint.value} + + {constraint.description} + { property: constraint?.property || '', type: constraint?.type || ('STRING_COMPARISON_TYPE' as ComparisonType), operator: constraint?.operator || 'eq', - value: constraint?.value || '' + value: constraint?.value || '', + description: constraint?.description || '' }; const handleSubmit = async (values: IConstraintBase) => { @@ -271,6 +272,25 @@ const ConstraintForm = forwardRef((props: ConstraintFormProps, ref: any) => {
+
+
+ + + Optional + +
+
+ +
+
diff --git a/ui/src/types/Constraint.ts b/ui/src/types/Constraint.ts index f419b1a107..a9f5b32dc3 100644 --- a/ui/src/types/Constraint.ts +++ b/ui/src/types/Constraint.ts @@ -3,6 +3,7 @@ export interface IConstraintBase { type: ComparisonType; operator: string; value?: string; + description?: string; } export interface IConstraint extends IConstraintBase { diff --git a/ui/vite.config.ts b/ui/vite.config.ts index 79e71a7b58..1f8e0c30dd 100644 --- a/ui/vite.config.ts +++ b/ui/vite.config.ts @@ -2,6 +2,8 @@ import react from '@vitejs/plugin-react'; import { defineConfig } from 'vite'; const path = require('path'); +const fliptAddr = process.env.FLIPT_ADDRESS ?? 'http://localhost:8080'; + // https://vitejs.dev/config/ export default defineConfig({ plugins: [react()], @@ -16,9 +18,9 @@ export default defineConfig({ envPrefix: 'FLIPT_', server: { proxy: { - '/api/v1': 'http://localhost:8080', - '/auth/v1': 'http://localhost:8080', - '/meta': 'http://localhost:8080' + '/api/v1': fliptAddr, + '/auth/v1': fliptAddr, + '/meta': fliptAddr }, origin: 'http://localhost:5173' }